Vendor OpenClaw source as Adolf fork baseline
Some checks failed
ClawSweeper Dispatch / dispatch (push) Has been cancelled
CodeQL / Security High (actions) (push) Has been cancelled
CodeQL / Security High (channel-runtime-boundary) (push) Has been cancelled
CodeQL / Security High (core-auth-secrets) (push) Has been cancelled
CodeQL / Security High (mcp-process-tool-boundary) (push) Has been cancelled
CodeQL / Security High (network-ssrf-boundary) (push) Has been cancelled
CodeQL / Security High (plugin-trust-boundary) (push) Has been cancelled
CodeQL / Security High (process-exec-boundary) (push) Has been cancelled
Docs Sync Publish Repo / sync-publish-repo (push) Has been cancelled
Docs / docs (push) Has been cancelled
OpenClaw Stable Main Closeout / Resolve stable release closeout inputs (push) Has been cancelled
OpenClaw Stable Main Closeout / Verify stable main closeout (push) Has been cancelled
Workflow Sanity / no-tabs (push) Has been cancelled
Workflow Sanity / actionlint (push) Has been cancelled
Workflow Sanity / generated-doc-baselines (push) Has been cancelled
CI / runner-admission (push) Has been cancelled
CI / preflight (push) Has been cancelled
CI / security-fast (push) Has been cancelled
CI / pnpm-store-warmup (push) Has been cancelled
CI / build-artifacts (push) Has been cancelled
CI / native-i18n (push) Has been cancelled
CI / ${{ matrix.check_name }} (push) Has been cancelled
CI / ${{ matrix.checkName }} (push) Has been cancelled
CI / checks-node-compat-node22 (push) Has been cancelled
CI / check-bundled-channel-config-metadata (push) Has been cancelled
CI / check-dependencies (push) Has been cancelled
CI / check-guards (push) Has been cancelled
CI / check-lint (push) Has been cancelled
CI / check-prod-types (push) Has been cancelled
CI / check-shrinkwrap (push) Has been cancelled
CI / check-test-types (push) Has been cancelled
CI / check-additional-boundaries-a (push) Has been cancelled
CI / check-additional-boundaries-bcd (push) Has been cancelled
CI / check-additional-extension-bundled (push) Has been cancelled
CI / check-additional-extension-channels (push) Has been cancelled
CI / check-additional-extension-package-boundary (push) Has been cancelled
CI / check-additional-runtime-topology-architecture (push) Has been cancelled
CI / check-session-accessor-boundary (push) Has been cancelled
CI / check-session-transcript-reader-boundary (push) Has been cancelled
CI / check-docs (push) Has been cancelled
CI / skills-python (push) Has been cancelled
CI / macos-swift (push) Has been cancelled
CI / ios-build (push) Has been cancelled
CI / ci-timings-summary (push) Has been cancelled
Native App Locale Refresh / Refresh native fa (push) Has been cancelled
Native App Locale Refresh / Refresh native fr (push) Has been cancelled
Native App Locale Refresh / Refresh native hi (push) Has been cancelled
Native App Locale Refresh / Refresh native id (push) Has been cancelled
Native App Locale Refresh / Refresh native it (push) Has been cancelled
Native App Locale Refresh / Refresh native ja-JP (push) Has been cancelled
Control UI Locale Refresh / plan (push) Has been cancelled
Control UI Locale Refresh / Refresh ${{ matrix.locale }} (push) Has been cancelled
Control UI Locale Refresh / Commit control UI locale refresh (push) Has been cancelled
Live Media Runner Image / Build live media runner image (push) Has been cancelled
Native App Locale Refresh / Refresh native ar (push) Has been cancelled
Native App Locale Refresh / Refresh native de (push) Has been cancelled
Native App Locale Refresh / Refresh native es (push) Has been cancelled
Native App Locale Refresh / Refresh native ko (push) Has been cancelled
Native App Locale Refresh / Refresh native nl (push) Has been cancelled
Native App Locale Refresh / Refresh native pl (push) Has been cancelled
Native App Locale Refresh / Refresh native pt-BR (push) Has been cancelled
Native App Locale Refresh / Refresh native ru (push) Has been cancelled
Native App Locale Refresh / Refresh native sv (push) Has been cancelled
Native App Locale Refresh / Refresh native th (push) Has been cancelled
Native App Locale Refresh / Refresh native tr (push) Has been cancelled
Native App Locale Refresh / Refresh native uk (push) Has been cancelled
Native App Locale Refresh / Refresh native vi (push) Has been cancelled
Native App Locale Refresh / Refresh native zh-CN (push) Has been cancelled
Native App Locale Refresh / Refresh native zh-TW (push) Has been cancelled
Native App Locale Refresh / Commit native locale refresh (push) Has been cancelled
Plugin Init Scaffold Validation / Validate provider scaffold (push) Has been cancelled
Plugin NPM Release / preview_plugins_npm (push) Has been cancelled
Plugin NPM Release / Validate release publish approval (push) Has been cancelled
Plugin NPM Release / preview_plugin_pack (push) Has been cancelled
Plugin NPM Release / publish_plugins_npm (push) Has been cancelled
Sandbox Common Smoke / sandbox-common-smoke (push) Has been cancelled
Website Installer Sync / static (push) Has been cancelled
Website Installer Sync / linux-docker (push) Has been cancelled
Website Installer Sync / macos-installer (push) Has been cancelled
Website Installer Sync / windows-installer (push) Has been cancelled
Website Installer Sync / sync-website (push) Has been cancelled
Some checks failed
ClawSweeper Dispatch / dispatch (push) Has been cancelled
CodeQL / Security High (actions) (push) Has been cancelled
CodeQL / Security High (channel-runtime-boundary) (push) Has been cancelled
CodeQL / Security High (core-auth-secrets) (push) Has been cancelled
CodeQL / Security High (mcp-process-tool-boundary) (push) Has been cancelled
CodeQL / Security High (network-ssrf-boundary) (push) Has been cancelled
CodeQL / Security High (plugin-trust-boundary) (push) Has been cancelled
CodeQL / Security High (process-exec-boundary) (push) Has been cancelled
Docs Sync Publish Repo / sync-publish-repo (push) Has been cancelled
Docs / docs (push) Has been cancelled
OpenClaw Stable Main Closeout / Resolve stable release closeout inputs (push) Has been cancelled
OpenClaw Stable Main Closeout / Verify stable main closeout (push) Has been cancelled
Workflow Sanity / no-tabs (push) Has been cancelled
Workflow Sanity / actionlint (push) Has been cancelled
Workflow Sanity / generated-doc-baselines (push) Has been cancelled
CI / runner-admission (push) Has been cancelled
CI / preflight (push) Has been cancelled
CI / security-fast (push) Has been cancelled
CI / pnpm-store-warmup (push) Has been cancelled
CI / build-artifacts (push) Has been cancelled
CI / native-i18n (push) Has been cancelled
CI / ${{ matrix.check_name }} (push) Has been cancelled
CI / ${{ matrix.checkName }} (push) Has been cancelled
CI / checks-node-compat-node22 (push) Has been cancelled
CI / check-bundled-channel-config-metadata (push) Has been cancelled
CI / check-dependencies (push) Has been cancelled
CI / check-guards (push) Has been cancelled
CI / check-lint (push) Has been cancelled
CI / check-prod-types (push) Has been cancelled
CI / check-shrinkwrap (push) Has been cancelled
CI / check-test-types (push) Has been cancelled
CI / check-additional-boundaries-a (push) Has been cancelled
CI / check-additional-boundaries-bcd (push) Has been cancelled
CI / check-additional-extension-bundled (push) Has been cancelled
CI / check-additional-extension-channels (push) Has been cancelled
CI / check-additional-extension-package-boundary (push) Has been cancelled
CI / check-additional-runtime-topology-architecture (push) Has been cancelled
CI / check-session-accessor-boundary (push) Has been cancelled
CI / check-session-transcript-reader-boundary (push) Has been cancelled
CI / check-docs (push) Has been cancelled
CI / skills-python (push) Has been cancelled
CI / macos-swift (push) Has been cancelled
CI / ios-build (push) Has been cancelled
CI / ci-timings-summary (push) Has been cancelled
Native App Locale Refresh / Refresh native fa (push) Has been cancelled
Native App Locale Refresh / Refresh native fr (push) Has been cancelled
Native App Locale Refresh / Refresh native hi (push) Has been cancelled
Native App Locale Refresh / Refresh native id (push) Has been cancelled
Native App Locale Refresh / Refresh native it (push) Has been cancelled
Native App Locale Refresh / Refresh native ja-JP (push) Has been cancelled
Control UI Locale Refresh / plan (push) Has been cancelled
Control UI Locale Refresh / Refresh ${{ matrix.locale }} (push) Has been cancelled
Control UI Locale Refresh / Commit control UI locale refresh (push) Has been cancelled
Live Media Runner Image / Build live media runner image (push) Has been cancelled
Native App Locale Refresh / Refresh native ar (push) Has been cancelled
Native App Locale Refresh / Refresh native de (push) Has been cancelled
Native App Locale Refresh / Refresh native es (push) Has been cancelled
Native App Locale Refresh / Refresh native ko (push) Has been cancelled
Native App Locale Refresh / Refresh native nl (push) Has been cancelled
Native App Locale Refresh / Refresh native pl (push) Has been cancelled
Native App Locale Refresh / Refresh native pt-BR (push) Has been cancelled
Native App Locale Refresh / Refresh native ru (push) Has been cancelled
Native App Locale Refresh / Refresh native sv (push) Has been cancelled
Native App Locale Refresh / Refresh native th (push) Has been cancelled
Native App Locale Refresh / Refresh native tr (push) Has been cancelled
Native App Locale Refresh / Refresh native uk (push) Has been cancelled
Native App Locale Refresh / Refresh native vi (push) Has been cancelled
Native App Locale Refresh / Refresh native zh-CN (push) Has been cancelled
Native App Locale Refresh / Refresh native zh-TW (push) Has been cancelled
Native App Locale Refresh / Commit native locale refresh (push) Has been cancelled
Plugin Init Scaffold Validation / Validate provider scaffold (push) Has been cancelled
Plugin NPM Release / preview_plugins_npm (push) Has been cancelled
Plugin NPM Release / Validate release publish approval (push) Has been cancelled
Plugin NPM Release / preview_plugin_pack (push) Has been cancelled
Plugin NPM Release / publish_plugins_npm (push) Has been cancelled
Sandbox Common Smoke / sandbox-common-smoke (push) Has been cancelled
Website Installer Sync / static (push) Has been cancelled
Website Installer Sync / linux-docker (push) Has been cancelled
Website Installer Sync / macos-installer (push) Has been cancelled
Website Installer Sync / windows-installer (push) Has been cancelled
Website Installer Sync / sync-website (push) Has been cancelled
Adolf is a fork/vendored clone of github.com/openclaw/openclaw (v2026.6.11), free to diverge. Tree copied sans upstream .git; upstream remote added for future syncs. Node pinned to 24 (.nvmrc); engines already require >=22.19. Preserves docs/ARCHITECTURE.md. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LeqyaxJF2nbRXJtae2kNB2
This commit is contained in:
214
extensions/copilot/src/attempt.live.test.ts
Normal file
214
extensions/copilot/src/attempt.live.test.ts
Normal file
@@ -0,0 +1,214 @@
|
||||
// Copilot tests cover attempt plugin behavior.
|
||||
import { mkdtemp, rm } from "node:fs/promises";
|
||||
import { tmpdir } from "node:os";
|
||||
import { join } from "node:path";
|
||||
import { CopilotClient, approveAll } from "@github/copilot-sdk";
|
||||
import type { AgentHarnessAttemptParams } from "openclaw/plugin-sdk/agent-harness-runtime";
|
||||
import { isLiveTestEnabled } from "openclaw/plugin-sdk/test-env";
|
||||
import { describe, expect, it, vi } from "vitest";
|
||||
import { createCopilotAgentHarness, type CopilotClientPool } from "../harness.js";
|
||||
|
||||
const liveToolState = vi.hoisted(() => ({
|
||||
calls: [] as string[],
|
||||
expectedText: "phase-1-green",
|
||||
sentinelPrefix: "copilot-live-smoke:",
|
||||
toolName: "live_echo",
|
||||
}));
|
||||
|
||||
vi.mock("openclaw/plugin-sdk/agent-harness", async (importOriginal) => {
|
||||
const actual = await importOriginal<typeof import("openclaw/plugin-sdk/agent-harness")>();
|
||||
|
||||
return {
|
||||
...actual,
|
||||
createOpenClawCodingTools: vi.fn(() => [
|
||||
{
|
||||
name: liveToolState.toolName,
|
||||
label: liveToolState.toolName,
|
||||
description: "Echo the requested text for the copilot live smoke test.",
|
||||
parameters: {
|
||||
type: "object",
|
||||
additionalProperties: false,
|
||||
properties: {
|
||||
text: {
|
||||
type: "string",
|
||||
description: "Text to echo back to the model.",
|
||||
},
|
||||
},
|
||||
required: ["text"],
|
||||
},
|
||||
async execute(_toolCallId: string, params: unknown) {
|
||||
const textInput =
|
||||
params && typeof params === "object" && !Array.isArray(params)
|
||||
? (params as { text?: unknown }).text
|
||||
: undefined;
|
||||
const text = typeof textInput === "string" ? textInput : "";
|
||||
const echoed = `${liveToolState.sentinelPrefix}${text}`;
|
||||
liveToolState.calls.push(text);
|
||||
console.info(
|
||||
`[copilot-live-smoke] ${liveToolState.toolName} ${JSON.stringify({ echoed, text })}`,
|
||||
);
|
||||
return {
|
||||
content: [{ type: "text", text: echoed }],
|
||||
details: { echoed },
|
||||
};
|
||||
},
|
||||
},
|
||||
]),
|
||||
};
|
||||
});
|
||||
|
||||
const LIVE = isLiveTestEnabled(["OPENCLAW_COPILOT_AGENT_LIVE_TEST"]);
|
||||
const TOKEN =
|
||||
process.env.OPENCLAW_COPILOT_AGENT_LIVE_TOKEN ||
|
||||
process.env.GITHUB_TOKEN ||
|
||||
process.env.GH_TOKEN ||
|
||||
"";
|
||||
const describeLive = LIVE && TOKEN ? describe : describe.skip;
|
||||
|
||||
function createApproveAllPool(): CopilotClientPool {
|
||||
const activeClients = new Set<CopilotClient>();
|
||||
|
||||
return {
|
||||
async acquire(key, options) {
|
||||
const client = new CopilotClient(options);
|
||||
activeClients.add(client);
|
||||
return {
|
||||
key,
|
||||
client: {
|
||||
createSession: (config: Parameters<CopilotClient["createSession"]>[0]) =>
|
||||
client.createSession({ ...config, onPermissionRequest: approveAll }),
|
||||
resumeSession: (
|
||||
sessionId: Parameters<CopilotClient["resumeSession"]>[0],
|
||||
config: Parameters<CopilotClient["resumeSession"]>[1],
|
||||
) => client.resumeSession(sessionId, { ...config, onPermissionRequest: approveAll }),
|
||||
stop: () => client.stop(),
|
||||
} as unknown as CopilotClient,
|
||||
};
|
||||
},
|
||||
async dispose() {
|
||||
const errors: Error[] = [];
|
||||
for (const client of activeClients) {
|
||||
try {
|
||||
errors.push(...(await client.stop()));
|
||||
} catch (error) {
|
||||
errors.push(error instanceof Error ? error : new Error(String(error)));
|
||||
}
|
||||
}
|
||||
activeClients.clear();
|
||||
return errors;
|
||||
},
|
||||
async release() {},
|
||||
size() {
|
||||
return activeClients.size;
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
function createAttemptParams(params: {
|
||||
copilotHome: string;
|
||||
onAssistantDelta: (payload: { text: string }) => void | Promise<void>;
|
||||
prompt: string;
|
||||
}): AgentHarnessAttemptParams {
|
||||
const profileId = "live-smoke-profile";
|
||||
const profileVersion = "v1";
|
||||
const now = Date.now();
|
||||
|
||||
return {
|
||||
agentDir: params.copilotHome,
|
||||
agentId: "copilot-live-smoke",
|
||||
auth: {
|
||||
gitHubToken: TOKEN,
|
||||
profileId,
|
||||
profileVersion,
|
||||
},
|
||||
authProfileId: profileId,
|
||||
copilotHome: params.copilotHome,
|
||||
cwd: process.cwd(),
|
||||
messages: [{ content: params.prompt, role: "user", timestamp: now }],
|
||||
model: {
|
||||
api: "openai-responses",
|
||||
id: "gpt-4.1",
|
||||
provider: "github-copilot",
|
||||
},
|
||||
modelId: "gpt-4.1",
|
||||
onAssistantDelta: params.onAssistantDelta,
|
||||
profileVersion,
|
||||
prompt: params.prompt,
|
||||
provider: "github-copilot",
|
||||
runId: `copilot-live-smoke-${now}`,
|
||||
sessionFile: join(params.copilotHome, "copilot-live-smoke.session.json"),
|
||||
sessionId: `copilot-live-smoke-session-${now}`,
|
||||
timeoutMs: 90_000,
|
||||
workspaceDir: process.cwd(),
|
||||
} as unknown as AgentHarnessAttemptParams;
|
||||
}
|
||||
|
||||
describeLive("copilot agent runtime live smoke", () => {
|
||||
it("runs one turn on gpt-4.1 with one custom tool", async () => {
|
||||
liveToolState.calls.length = 0;
|
||||
const streamedTexts: string[] = [];
|
||||
const prompt = `Use the ${liveToolState.toolName} tool exactly once with text '${liveToolState.expectedText}', then reply with exactly two short sentences totaling at least twelve words.`;
|
||||
const copilotHome = await mkdtemp(join(tmpdir(), "openclaw-copilot-live-"));
|
||||
const harness = createCopilotAgentHarness({ pool: createApproveAllPool() });
|
||||
|
||||
expect(
|
||||
harness.supports({
|
||||
provider: "github-copilot",
|
||||
modelId: "gpt-4.1",
|
||||
requestedRuntime: "copilot",
|
||||
}),
|
||||
).toEqual({ supported: true, priority: 100 });
|
||||
|
||||
try {
|
||||
const result = await harness.runAttempt(
|
||||
createAttemptParams({
|
||||
copilotHome,
|
||||
onAssistantDelta: ({ text }) => {
|
||||
if (text.trim()) {
|
||||
streamedTexts.push(text);
|
||||
}
|
||||
},
|
||||
prompt,
|
||||
}),
|
||||
);
|
||||
const assistantText = result.assistantTexts.join("\n").trim();
|
||||
const hasAssistantText = result.assistantTexts.some((text) => text.trim().length > 0);
|
||||
const matchingCalls = liveToolState.calls.filter(
|
||||
(text) => text === liveToolState.expectedText,
|
||||
);
|
||||
const usage = result.attemptUsage;
|
||||
|
||||
console.info(
|
||||
"[copilot-live-smoke] summary",
|
||||
JSON.stringify(
|
||||
{
|
||||
assistantText,
|
||||
toolCalls: liveToolState.calls,
|
||||
streamedTexts,
|
||||
toolMetas: result.toolMetas,
|
||||
usage,
|
||||
},
|
||||
null,
|
||||
2,
|
||||
),
|
||||
);
|
||||
|
||||
expect(result.promptError).toBeUndefined();
|
||||
expect(result.timedOut).toBe(false);
|
||||
expect(matchingCalls.length).toBeGreaterThanOrEqual(1);
|
||||
expect(hasAssistantText).toBe(true);
|
||||
expect(assistantText.length).toBeGreaterThan(0);
|
||||
expect((usage?.input ?? 0) + (usage?.output ?? 0)).toBeGreaterThan(0);
|
||||
expect(
|
||||
result.toolMetas.some(
|
||||
(toolMeta) =>
|
||||
toolMeta.toolName === liveToolState.toolName &&
|
||||
toolMeta.meta?.includes(liveToolState.sentinelPrefix),
|
||||
),
|
||||
).toBe(true);
|
||||
} finally {
|
||||
await harness.dispose?.();
|
||||
await rm(copilotHome, { recursive: true, force: true });
|
||||
}
|
||||
}, 90_000);
|
||||
});
|
||||
Reference in New Issue
Block a user