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

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:
2026-07-05 09:36:54 +00:00
parent 3216769225
commit bedb527145
21108 changed files with 6010766 additions and 0 deletions

View 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);
});