@agent-native/core 0.63.1 → 0.63.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/harness/ai-sdk-adapter.d.ts +44 -0
- package/dist/agent/harness/ai-sdk-adapter.d.ts.map +1 -1
- package/dist/agent/harness/ai-sdk-adapter.js +120 -1
- package/dist/agent/harness/ai-sdk-adapter.js.map +1 -1
- package/dist/agent/harness/index.d.ts +1 -1
- package/dist/agent/harness/index.d.ts.map +1 -1
- package/dist/agent/harness/index.js.map +1 -1
- package/dist/client/blocks/library/AnnotatedCodeBlock.d.ts.map +1 -1
- package/dist/client/blocks/library/AnnotatedCodeBlock.js +29 -10
- package/dist/client/blocks/library/AnnotatedCodeBlock.js.map +1 -1
- package/dist/client/blocks/library/DiffBlock.d.ts.map +1 -1
- package/dist/client/blocks/library/DiffBlock.js +48 -20
- package/dist/client/blocks/library/DiffBlock.js.map +1 -1
- package/dist/client/blocks/library/diagram.d.ts.map +1 -1
- package/dist/client/blocks/library/diagram.js +14 -3
- package/dist/client/blocks/library/diagram.js.map +1 -1
- package/dist/client/blocks/library/wireframe.d.ts.map +1 -1
- package/dist/client/blocks/library/wireframe.js +14 -3
- package/dist/client/blocks/library/wireframe.js.map +1 -1
- package/dist/client/blocks/types.d.ts +5 -0
- package/dist/client/blocks/types.d.ts.map +1 -1
- package/dist/client/blocks/types.js.map +1 -1
- package/dist/server/action-discovery.d.ts.map +1 -1
- package/dist/server/action-discovery.js +24 -2
- package/dist/server/action-discovery.js.map +1 -1
- package/dist/server/deep-link.d.ts +2 -2
- package/dist/server/deep-link.d.ts.map +1 -1
- package/dist/server/deep-link.js +2 -2
- package/dist/server/deep-link.js.map +1 -1
- package/dist/tailwind.preset.d.ts.map +1 -1
- package/dist/tailwind.preset.js +8 -1
- package/dist/tailwind.preset.js.map +1 -1
- package/dist/templates/default/package.json +1 -0
- package/dist/templates/headless/AGENTS.md +3 -0
- package/dist/templates/headless/DEVELOPING.md +4 -0
- package/dist/templates/headless/actions/run.ts +6 -0
- package/docs/content/code-agents-ui.md +3 -2
- package/docs/content/external-agents.md +1 -1
- package/docs/content/harness-agents.md +35 -8
- package/docs/content/template-plan.md +6 -5
- package/package.json +6 -2
- package/src/templates/default/package.json +1 -0
- package/src/templates/headless/AGENTS.md +3 -0
- package/src/templates/headless/DEVELOPING.md +4 -0
- package/src/templates/headless/actions/run.ts +6 -0
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
import type { AgentHarnessAdapter, AgentHarnessCreateSessionOptions, AgentHarnessEvent } from "./types.js";
|
|
2
2
|
export type AiSdkHarnessRuntime = "claude-code" | "codex" | "pi";
|
|
3
|
+
export type CodexCliAuthConfig = boolean | {
|
|
4
|
+
/**
|
|
5
|
+
* Local Codex home to read auth from. Defaults to CODEX_HOME, then
|
|
6
|
+
* ~/.codex.
|
|
7
|
+
*/
|
|
8
|
+
codexHome?: string;
|
|
9
|
+
/**
|
|
10
|
+
* Explicit local auth file path. Defaults to <codexHome>/auth.json.
|
|
11
|
+
*/
|
|
12
|
+
authJsonPath?: string;
|
|
13
|
+
};
|
|
3
14
|
export interface AiSdkHarnessAdapterOptions {
|
|
4
15
|
runtime: AiSdkHarnessRuntime;
|
|
5
16
|
label?: string;
|
|
@@ -7,7 +18,40 @@ export interface AiSdkHarnessAdapterOptions {
|
|
|
7
18
|
permissionMode?: AgentHarnessCreateSessionOptions["permissionMode"];
|
|
8
19
|
harnessOptions?: Record<string, unknown>;
|
|
9
20
|
agentOptions?: Record<string, unknown>;
|
|
21
|
+
/**
|
|
22
|
+
* Opt in to copying the local Codex CLI auth file into the harness sandbox
|
|
23
|
+
* before @ai-sdk/harness-codex starts. Use only with trusted/private
|
|
24
|
+
* sandboxes: ChatGPT login tokens from ~/.codex/auth.json are copied into
|
|
25
|
+
* the sandbox so the in-sandbox codex CLI can reuse `codex login`.
|
|
26
|
+
*/
|
|
27
|
+
codexCliAuth?: CodexCliAuthConfig;
|
|
10
28
|
}
|
|
29
|
+
type SandboxRunResult = {
|
|
30
|
+
stdout?: string;
|
|
31
|
+
stderr?: string;
|
|
32
|
+
exitCode?: number;
|
|
33
|
+
};
|
|
34
|
+
export type CodexCliAuthSandboxSession = {
|
|
35
|
+
run(options: {
|
|
36
|
+
command: string;
|
|
37
|
+
abortSignal?: AbortSignal;
|
|
38
|
+
}): PromiseLike<SandboxRunResult>;
|
|
39
|
+
writeTextFile(options: {
|
|
40
|
+
path: string;
|
|
41
|
+
content: string;
|
|
42
|
+
abortSignal?: AbortSignal;
|
|
43
|
+
}): PromiseLike<void>;
|
|
44
|
+
};
|
|
45
|
+
export type CodexCliAuthSandboxHook = (opts: {
|
|
46
|
+
session: CodexCliAuthSandboxSession;
|
|
47
|
+
sessionWorkDir: string;
|
|
48
|
+
abortSignal?: AbortSignal;
|
|
49
|
+
}) => Promise<void> | void;
|
|
11
50
|
export declare function createAiSdkHarnessAdapter(options: AiSdkHarnessAdapterOptions): AgentHarnessAdapter;
|
|
51
|
+
/** @internal */
|
|
52
|
+
export declare function createCodexCliAuthSandboxHook(config: CodexCliAuthConfig, existingHook?: CodexCliAuthSandboxHook): CodexCliAuthSandboxHook;
|
|
53
|
+
/** @internal */
|
|
54
|
+
export declare function normalizeCodexCliAuthConfig(config: CodexCliAuthConfig): Required<Exclude<CodexCliAuthConfig, boolean>>;
|
|
12
55
|
export declare function aiSdkHarnessPartToEvents(part: any): AgentHarnessEvent[];
|
|
56
|
+
export {};
|
|
13
57
|
//# sourceMappingURL=ai-sdk-adapter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-sdk-adapter.d.ts","sourceRoot":"","sources":["../../../src/agent/harness/ai-sdk-adapter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ai-sdk-adapter.d.ts","sourceRoot":"","sources":["../../../src/agent/harness/ai-sdk-adapter.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,mBAAmB,EAEnB,gCAAgC,EAChC,iBAAiB,EAGlB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,mBAAmB,GAAG,aAAa,GAAG,OAAO,GAAG,IAAI,CAAC;AAEjE,MAAM,MAAM,kBAAkB,GAC1B,OAAO,GACP;IACE;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEN,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,mBAAmB,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,gCAAgC,CAAC,gBAAgB,CAAC,CAAC;IACpE,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC;;;;;OAKG;IACH,YAAY,CAAC,EAAE,kBAAkB,CAAC;CACnC;AAED,KAAK,gBAAgB,GAAG;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,GAAG,CAAC,OAAO,EAAE;QACX,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,WAAW,CAAC;KAC3B,GAAG,WAAW,CAAC,gBAAgB,CAAC,CAAC;IAClC,aAAa,CAAC,OAAO,EAAE;QACrB,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,WAAW,CAAC;KAC3B,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG,CAAC,IAAI,EAAE;IAC3C,OAAO,EAAE,0BAA0B,CAAC;IACpC,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAmC3B,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,0BAA0B,GAClC,mBAAmB,CA8DrB;AAyBD,gBAAgB;AAChB,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,kBAAkB,EAC1B,YAAY,CAAC,EAAE,uBAAuB,GACrC,uBAAuB,CAMzB;AAED,gBAAgB;AAChB,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,kBAAkB,GACzB,QAAQ,CAAC,OAAO,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC,CAWhD;AAuMD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,GAAG,GAAG,iBAAiB,EAAE,CAyEvE"}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
1
4
|
const RUNTIME_IMPORTS = {
|
|
2
5
|
"claude-code": {
|
|
3
6
|
packageName: "@ai-sdk/harness-claude-code",
|
|
@@ -54,8 +57,9 @@ export function createAiSdkHarnessAdapter(options) {
|
|
|
54
57
|
(hasHarnessOptions || exportName?.startsWith("create"))
|
|
55
58
|
? harnessFactory(options.harnessOptions)
|
|
56
59
|
: harnessFactory;
|
|
60
|
+
const agentOptions = agentOptionsWithCodexCliAuth(options);
|
|
57
61
|
const agent = new HarnessAgent({
|
|
58
|
-
...
|
|
62
|
+
...agentOptions,
|
|
59
63
|
harness,
|
|
60
64
|
...(sessionOptions.sandbox ? { sandbox: sessionOptions.sandbox } : {}),
|
|
61
65
|
...(sessionOptions.instructions
|
|
@@ -72,6 +76,121 @@ export function createAiSdkHarnessAdapter(options) {
|
|
|
72
76
|
},
|
|
73
77
|
};
|
|
74
78
|
}
|
|
79
|
+
function agentOptionsWithCodexCliAuth(options) {
|
|
80
|
+
const agentOptions = { ...(options.agentOptions ?? {}) };
|
|
81
|
+
if (!options.codexCliAuth)
|
|
82
|
+
return agentOptions;
|
|
83
|
+
if (options.runtime !== "codex") {
|
|
84
|
+
throw new Error("[agent-harness] codexCliAuth is only supported for the codex AI SDK harness runtime.");
|
|
85
|
+
}
|
|
86
|
+
const existingHook = agentOptions.onSandboxSession;
|
|
87
|
+
if (existingHook !== undefined && typeof existingHook !== "function") {
|
|
88
|
+
throw new Error("[agent-harness] agentOptions.onSandboxSession must be a function when codexCliAuth is enabled.");
|
|
89
|
+
}
|
|
90
|
+
agentOptions.onSandboxSession = createCodexCliAuthSandboxHook(options.codexCliAuth, existingHook);
|
|
91
|
+
return agentOptions;
|
|
92
|
+
}
|
|
93
|
+
/** @internal */
|
|
94
|
+
export function createCodexCliAuthSandboxHook(config, existingHook) {
|
|
95
|
+
const codexCliAuth = normalizeCodexCliAuthConfig(config);
|
|
96
|
+
return async (hookOptions) => {
|
|
97
|
+
await installCodexCliAuthIntoSandbox(codexCliAuth, hookOptions);
|
|
98
|
+
await existingHook?.(hookOptions);
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
/** @internal */
|
|
102
|
+
export function normalizeCodexCliAuthConfig(config) {
|
|
103
|
+
const input = typeof config === "object" ? config : {};
|
|
104
|
+
const codexHome = input.codexHome ??
|
|
105
|
+
// guard:allow-env-credential -- CODEX_HOME is a local auth-directory path override, not a credential value.
|
|
106
|
+
process.env.CODEX_HOME ??
|
|
107
|
+
path.join(os.homedir(), ".codex");
|
|
108
|
+
return {
|
|
109
|
+
codexHome,
|
|
110
|
+
authJsonPath: input.authJsonPath ?? path.join(codexHome, "auth.json"),
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
async function installCodexCliAuthIntoSandbox(config, opts) {
|
|
114
|
+
const authJson = readCodexCliAuthJson(config.authJsonPath);
|
|
115
|
+
const home = await resolveSandboxHome(opts.session, opts.abortSignal);
|
|
116
|
+
const codexHome = path.posix.join(home, ".codex");
|
|
117
|
+
const sandboxAuthPath = path.posix.join(codexHome, "auth.json");
|
|
118
|
+
const mkdirResult = await opts.session.run({
|
|
119
|
+
command: `mkdir -p ${shellQuote(codexHome)} && chmod 700 ${shellQuote(codexHome)}`,
|
|
120
|
+
abortSignal: opts.abortSignal,
|
|
121
|
+
});
|
|
122
|
+
if (mkdirResult.exitCode !== undefined && mkdirResult.exitCode !== 0) {
|
|
123
|
+
throw new Error(`[agent-harness] Unable to create sandbox Codex home: ${mkdirResult.stderr || mkdirResult.stdout || `exit ${mkdirResult.exitCode}`}`);
|
|
124
|
+
}
|
|
125
|
+
await opts.session.writeTextFile({
|
|
126
|
+
path: sandboxAuthPath,
|
|
127
|
+
content: authJson,
|
|
128
|
+
abortSignal: opts.abortSignal,
|
|
129
|
+
});
|
|
130
|
+
const chmodResult = await opts.session.run({
|
|
131
|
+
command: `chmod 600 ${shellQuote(sandboxAuthPath)}`,
|
|
132
|
+
abortSignal: opts.abortSignal,
|
|
133
|
+
});
|
|
134
|
+
if (chmodResult.exitCode !== undefined && chmodResult.exitCode !== 0) {
|
|
135
|
+
throw new Error(`[agent-harness] Unable to secure sandbox Codex auth file: ${chmodResult.stderr || chmodResult.stdout || `exit ${chmodResult.exitCode}`}`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
function readCodexCliAuthJson(authJsonPath) {
|
|
139
|
+
let authJson;
|
|
140
|
+
try {
|
|
141
|
+
authJson = fs.readFileSync(authJsonPath, "utf8");
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
const code = error && typeof error === "object" && "code" in error
|
|
145
|
+
? String(error.code)
|
|
146
|
+
: undefined;
|
|
147
|
+
const hint = code === "ENOENT"
|
|
148
|
+
? " Run `codex login`, or pass harnessOptions.auth for API-key/gateway auth."
|
|
149
|
+
: "";
|
|
150
|
+
throw new Error(`[agent-harness] Codex CLI auth file was not readable at ${authJsonPath}.${hint}`);
|
|
151
|
+
}
|
|
152
|
+
assertCodexCliAuthJson(authJson, authJsonPath);
|
|
153
|
+
return authJson;
|
|
154
|
+
}
|
|
155
|
+
function assertCodexCliAuthJson(authJson, authJsonPath) {
|
|
156
|
+
let parsed;
|
|
157
|
+
try {
|
|
158
|
+
parsed = JSON.parse(authJson);
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
throw new Error(`[agent-harness] Codex CLI auth file at ${authJsonPath} is not valid JSON.`);
|
|
162
|
+
}
|
|
163
|
+
if (!parsed || typeof parsed !== "object") {
|
|
164
|
+
throw new Error(`[agent-harness] Codex CLI auth file at ${authJsonPath} has an invalid shape.`);
|
|
165
|
+
}
|
|
166
|
+
const record = parsed;
|
|
167
|
+
const tokens = record.tokens;
|
|
168
|
+
const hasChatGptTokens = tokens !== null &&
|
|
169
|
+
typeof tokens === "object" &&
|
|
170
|
+
(typeof tokens.access_token === "string" ||
|
|
171
|
+
typeof tokens.refresh_token === "string");
|
|
172
|
+
const hasApiKey = typeof record.OPENAI_API_KEY === "string";
|
|
173
|
+
if (!hasChatGptTokens && !hasApiKey) {
|
|
174
|
+
throw new Error(`[agent-harness] Codex CLI auth file at ${authJsonPath} does not contain usable ChatGPT tokens or an API key.`);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
async function resolveSandboxHome(session, abortSignal) {
|
|
178
|
+
const result = await session.run({
|
|
179
|
+
command: 'printf "%s" "$HOME"',
|
|
180
|
+
abortSignal,
|
|
181
|
+
});
|
|
182
|
+
const home = result.stdout?.trim();
|
|
183
|
+
if (result.exitCode !== undefined && result.exitCode !== 0) {
|
|
184
|
+
throw new Error(`[agent-harness] Unable to resolve sandbox HOME: ${result.stderr || result.stdout || `exit ${result.exitCode}`}`);
|
|
185
|
+
}
|
|
186
|
+
if (!home || !path.posix.isAbsolute(home)) {
|
|
187
|
+
throw new Error("[agent-harness] Sandbox HOME was not an absolute path.");
|
|
188
|
+
}
|
|
189
|
+
return home;
|
|
190
|
+
}
|
|
191
|
+
function shellQuote(value) {
|
|
192
|
+
return `'${value.replace(/'/g, "'\\''")}'`;
|
|
193
|
+
}
|
|
75
194
|
async function createNativeSession(agent, options) {
|
|
76
195
|
if (options.resumeState && typeof agent.resumeSession === "function") {
|
|
77
196
|
return agent.resumeSession(options.resumeState);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-sdk-adapter.js","sourceRoot":"","sources":["../../../src/agent/harness/ai-sdk-adapter.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AgentHarnessAdapter,\n AgentHarnessCapabilities,\n AgentHarnessCreateSessionOptions,\n AgentHarnessEvent,\n AgentHarnessSession,\n AgentHarnessTurnInput,\n} from \"./types.js\";\n\nexport type AiSdkHarnessRuntime = \"claude-code\" | \"codex\" | \"pi\";\n\nexport interface AiSdkHarnessAdapterOptions {\n runtime: AiSdkHarnessRuntime;\n label?: string;\n description?: string;\n permissionMode?: AgentHarnessCreateSessionOptions[\"permissionMode\"];\n harnessOptions?: Record<string, unknown>;\n agentOptions?: Record<string, unknown>;\n}\n\nconst RUNTIME_IMPORTS: Record<\n AiSdkHarnessRuntime,\n {\n packageName: string;\n exportNames: string[];\n label: string;\n sandbox: boolean;\n }\n> = {\n \"claude-code\": {\n packageName: \"@ai-sdk/harness-claude-code\",\n exportNames: [\"claudeCode\", \"createClaudeCode\"],\n label: \"Claude Code\",\n sandbox: true,\n },\n codex: {\n packageName: \"@ai-sdk/harness-codex\",\n exportNames: [\"createCodex\", \"codex\"],\n label: \"Codex\",\n sandbox: true,\n },\n pi: {\n packageName: \"@ai-sdk/harness-pi\",\n exportNames: [\"pi\", \"createPi\"],\n label: \"Pi\",\n sandbox: false,\n },\n};\n\nconst dynamicImport = new Function(\"specifier\", \"return import(specifier)\") as (\n specifier: string,\n) => Promise<any>;\n\nexport function createAiSdkHarnessAdapter(\n options: AiSdkHarnessAdapterOptions,\n): AgentHarnessAdapter {\n const runtime = RUNTIME_IMPORTS[options.runtime];\n if (!runtime) {\n throw new Error(`[agent-harness] Unsupported AI SDK harness runtime`);\n }\n const capabilities: AgentHarnessCapabilities = {\n sandbox: runtime.sandbox,\n resumable: true,\n approvals: options.runtime !== \"codex\",\n hostTools: true,\n fileEvents: true,\n };\n return {\n name: `ai-sdk-harness:${options.runtime}`,\n label: options.label ?? runtime.label,\n description:\n options.description ??\n `Runs ${runtime.label} through the AI SDK HarnessAgent adapter.`,\n installPackage: `@ai-sdk/harness@canary ${runtime.packageName}@canary`,\n capabilities,\n async createSession(sessionOptions) {\n const [{ HarnessAgent }, runtimeModule] = await Promise.all([\n dynamicImport(\"@ai-sdk/harness/agent\"),\n dynamicImport(runtime.packageName),\n ]);\n const exportName = runtime.exportNames.find(\n (name) => runtimeModule[name],\n );\n const harnessFactory = exportName ? runtimeModule[exportName] : undefined;\n if (!HarnessAgent || !harnessFactory) {\n throw new Error(\n `[agent-harness] AI SDK harness package \"${runtime.packageName}\" did not expose one of: ${runtime.exportNames.join(\", \")}`,\n );\n }\n const hasHarnessOptions =\n options.harnessOptions &&\n Object.keys(options.harnessOptions).length > 0;\n const harness =\n typeof harnessFactory === \"function\" &&\n (hasHarnessOptions || exportName?.startsWith(\"create\"))\n ? harnessFactory(options.harnessOptions)\n : harnessFactory;\n const agent = new HarnessAgent({\n ...(options.agentOptions ?? {}),\n harness,\n ...(sessionOptions.sandbox ? { sandbox: sessionOptions.sandbox } : {}),\n ...(sessionOptions.instructions\n ? { instructions: sessionOptions.instructions }\n : {}),\n ...(sessionOptions.skills ? { skills: sessionOptions.skills } : {}),\n ...(sessionOptions.tools ? { tools: sessionOptions.tools } : {}),\n permissionMode:\n sessionOptions.permissionMode ??\n options.permissionMode ??\n \"allow-reads\",\n });\n\n const nativeSession = await createNativeSession(agent, sessionOptions);\n return new AiSdkHarnessSession(agent, nativeSession);\n },\n };\n}\n\nasync function createNativeSession(\n agent: any,\n options: AgentHarnessCreateSessionOptions,\n): Promise<any> {\n if (options.resumeState && typeof agent.resumeSession === \"function\") {\n return agent.resumeSession(options.resumeState);\n }\n if (options.resumeState && typeof agent.createSession === \"function\") {\n try {\n return await agent.createSession({ resumeState: options.resumeState });\n } catch {\n return agent.createSession();\n }\n }\n if (typeof agent.createSession !== \"function\") {\n throw new Error(\n \"[agent-harness] HarnessAgent does not expose createSession()\",\n );\n }\n return agent.createSession();\n}\n\nclass AiSdkHarnessSession implements AgentHarnessSession {\n readonly id: string;\n\n constructor(\n private readonly agent: any,\n private readonly nativeSession: any,\n ) {\n this.id =\n typeof nativeSession?.id === \"string\"\n ? nativeSession.id\n : typeof nativeSession?.sessionId === \"string\"\n ? nativeSession.sessionId\n : `ai-sdk-harness-${Math.random().toString(36).slice(2)}`;\n }\n\n async *streamTurn(\n input: AgentHarnessTurnInput,\n ): AsyncIterable<AgentHarnessEvent> {\n const result = await this.agent.stream({\n session: this.nativeSession,\n ...(input.prompt ? { prompt: input.prompt } : {}),\n ...(input.messages ? { messages: input.messages } : {}),\n ...(input.abortSignal ? { abortSignal: input.abortSignal } : {}),\n });\n for await (const part of result.fullStream ?? []) {\n for (const event of aiSdkHarnessPartToEvents(part)) {\n yield event;\n }\n }\n }\n\n async *continueTurn(): AsyncIterable<AgentHarnessEvent> {\n if (typeof this.agent.continueStream !== \"function\") {\n return;\n }\n const result = await this.agent.continueStream({\n session: this.nativeSession,\n });\n for await (const part of result.fullStream ?? []) {\n for (const event of aiSdkHarnessPartToEvents(part)) {\n yield event;\n }\n }\n }\n\n async detach(): Promise<unknown> {\n if (typeof this.nativeSession.detach === \"function\") {\n return this.nativeSession.detach();\n }\n return undefined;\n }\n\n async stop(): Promise<unknown> {\n if (typeof this.nativeSession.stop === \"function\") {\n return this.nativeSession.stop();\n }\n return this.destroy();\n }\n\n async destroy(): Promise<void> {\n await this.nativeSession.destroy?.();\n }\n}\n\nexport function aiSdkHarnessPartToEvents(part: any): AgentHarnessEvent[] {\n const type = part?.type;\n const events: AgentHarnessEvent[] = [];\n switch (type) {\n case \"text-delta\":\n if (part.text) events.push({ type: \"text-delta\", text: part.text });\n break;\n case \"reasoning-delta\":\n case \"thinking-delta\":\n if (part.text) events.push({ type: \"thinking-delta\", text: part.text });\n break;\n case \"tool-input-start\":\n events.push({\n type: \"tool-start\",\n id: part.id ?? part.toolCallId,\n name: part.toolName ?? part.name ?? \"tool\",\n input: {},\n });\n break;\n case \"tool-call\":\n case \"dynamic-tool-call\":\n events.push({\n type: \"tool-start\",\n id: part.toolCallId ?? part.id,\n name: part.toolName ?? part.name ?? \"tool\",\n input: part.input ?? part.args ?? {},\n });\n break;\n case \"tool-result\":\n case \"dynamic-tool-result\":\n events.push({\n type: \"tool-done\",\n id: part.toolCallId ?? part.id,\n name: part.toolName ?? part.name ?? \"tool\",\n result: part.output ?? part.result,\n });\n break;\n case \"tool-approval-request\":\n events.push({\n type: \"approval-request\",\n id: part.id ?? part.toolCallId ?? \"approval\",\n tool: part.toolName ?? part.name,\n message: part.message ?? \"Harness is waiting for approval\",\n input: part.input ?? part.args,\n });\n break;\n case \"file-change\":\n if (part.path) {\n events.push({\n type: \"file-change\",\n path: String(part.path),\n operation: normalizeFileOperation(part.operation),\n summary: typeof part.summary === \"string\" ? part.summary : undefined,\n });\n }\n break;\n case \"compaction\":\n events.push({\n type: \"compaction\",\n summary: typeof part.summary === \"string\" ? part.summary : undefined,\n });\n break;\n case \"finish\":\n events.push({ type: \"done\", reason: part.finishReason });\n break;\n case \"error\":\n events.push({\n type: \"error\",\n error: part.error?.message ?? part.message ?? \"Harness stream error\",\n });\n break;\n }\n return events;\n}\n\nfunction normalizeFileOperation(\n value: unknown,\n): Extract<AgentHarnessEvent, { type: \"file-change\" }>[\"operation\"] {\n return value === \"create\" ||\n value === \"update\" ||\n value === \"delete\" ||\n value === \"rename\"\n ? value\n : \"unknown\";\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ai-sdk-adapter.js","sourceRoot":"","sources":["../../../src/agent/harness/ai-sdk-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAmE7B,MAAM,eAAe,GAQjB;IACF,aAAa,EAAE;QACb,WAAW,EAAE,6BAA6B;QAC1C,WAAW,EAAE,CAAC,YAAY,EAAE,kBAAkB,CAAC;QAC/C,KAAK,EAAE,aAAa;QACpB,OAAO,EAAE,IAAI;KACd;IACD,KAAK,EAAE;QACL,WAAW,EAAE,uBAAuB;QACpC,WAAW,EAAE,CAAC,aAAa,EAAE,OAAO,CAAC;QACrC,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,IAAI;KACd;IACD,EAAE,EAAE;QACF,WAAW,EAAE,oBAAoB;QACjC,WAAW,EAAE,CAAC,IAAI,EAAE,UAAU,CAAC;QAC/B,KAAK,EAAE,IAAI;QACX,OAAO,EAAE,KAAK;KACf;CACF,CAAC;AAEF,MAAM,aAAa,GAAG,IAAI,QAAQ,CAAC,WAAW,EAAE,0BAA0B,CAEzD,CAAC;AAElB,MAAM,UAAU,yBAAyB,CACvC,OAAmC;IAEnC,MAAM,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACjD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IACD,MAAM,YAAY,GAA6B;QAC7C,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,SAAS,EAAE,IAAI;QACf,SAAS,EAAE,OAAO,CAAC,OAAO,KAAK,OAAO;QACtC,SAAS,EAAE,IAAI;QACf,UAAU,EAAE,IAAI;KACjB,CAAC;IACF,OAAO;QACL,IAAI,EAAE,kBAAkB,OAAO,CAAC,OAAO,EAAE;QACzC,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK;QACrC,WAAW,EACT,OAAO,CAAC,WAAW;YACnB,QAAQ,OAAO,CAAC,KAAK,2CAA2C;QAClE,cAAc,EAAE,0BAA0B,OAAO,CAAC,WAAW,SAAS;QACtE,YAAY;QACZ,KAAK,CAAC,aAAa,CAAC,cAAc;YAChC,MAAM,CAAC,EAAE,YAAY,EAAE,EAAE,aAAa,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBAC1D,aAAa,CAAC,uBAAuB,CAAC;gBACtC,aAAa,CAAC,OAAO,CAAC,WAAW,CAAC;aACnC,CAAC,CAAC;YACH,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CACzC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAC9B,CAAC;YACF,MAAM,cAAc,GAAG,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC1E,IAAI,CAAC,YAAY,IAAI,CAAC,cAAc,EAAE,CAAC;gBACrC,MAAM,IAAI,KAAK,CACb,2CAA2C,OAAO,CAAC,WAAW,4BAA4B,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC3H,CAAC;YACJ,CAAC;YACD,MAAM,iBAAiB,GACrB,OAAO,CAAC,cAAc;gBACtB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;YACjD,MAAM,OAAO,GACX,OAAO,cAAc,KAAK,UAAU;gBACpC,CAAC,iBAAiB,IAAI,UAAU,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;gBACrD,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,cAAc,CAAC;gBACxC,CAAC,CAAC,cAAc,CAAC;YACrB,MAAM,YAAY,GAAG,4BAA4B,CAAC,OAAO,CAAC,CAAC;YAC3D,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC;gBAC7B,GAAG,YAAY;gBACf,OAAO;gBACP,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtE,GAAG,CAAC,cAAc,CAAC,YAAY;oBAC7B,CAAC,CAAC,EAAE,YAAY,EAAE,cAAc,CAAC,YAAY,EAAE;oBAC/C,CAAC,CAAC,EAAE,CAAC;gBACP,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnE,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChE,cAAc,EACZ,cAAc,CAAC,cAAc;oBAC7B,OAAO,CAAC,cAAc;oBACtB,aAAa;aAChB,CAAC,CAAC;YAEH,MAAM,aAAa,GAAG,MAAM,mBAAmB,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;YACvE,OAAO,IAAI,mBAAmB,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;QACvD,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,4BAA4B,CACnC,OAAmC;IAEnC,MAAM,YAAY,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC,EAAE,CAAC;IACzD,IAAI,CAAC,OAAO,CAAC,YAAY;QAAE,OAAO,YAAY,CAAC;IAC/C,IAAI,OAAO,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CACb,sFAAsF,CACvF,CAAC;IACJ,CAAC;IACD,MAAM,YAAY,GAAG,YAAY,CAAC,gBAAgB,CAAC;IACnD,IAAI,YAAY,KAAK,SAAS,IAAI,OAAO,YAAY,KAAK,UAAU,EAAE,CAAC;QACrE,MAAM,IAAI,KAAK,CACb,gGAAgG,CACjG,CAAC;IACJ,CAAC;IACD,YAAY,CAAC,gBAAgB,GAAG,6BAA6B,CAC3D,OAAO,CAAC,YAAY,EACpB,YAAmD,CACpD,CAAC;IACF,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,gBAAgB;AAChB,MAAM,UAAU,6BAA6B,CAC3C,MAA0B,EAC1B,YAAsC;IAEtC,MAAM,YAAY,GAAG,2BAA2B,CAAC,MAAM,CAAC,CAAC;IACzD,OAAO,KAAK,EAAE,WAAW,EAAE,EAAE;QAC3B,MAAM,8BAA8B,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;QAChE,MAAM,YAAY,EAAE,CAAC,WAAW,CAAC,CAAC;IACpC,CAAC,CAAC;AACJ,CAAC;AAED,gBAAgB;AAChB,MAAM,UAAU,2BAA2B,CACzC,MAA0B;IAE1B,MAAM,KAAK,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACvD,MAAM,SAAS,GACb,KAAK,CAAC,SAAS;QACf,4GAA4G;QAC5G,OAAO,CAAC,GAAG,CAAC,UAAU;QACtB,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;IACpC,OAAO;QACL,SAAS;QACT,YAAY,EAAE,KAAK,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC;KACtE,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,8BAA8B,CAC3C,MAAsD,EACtD,IAGC;IAED,MAAM,QAAQ,GAAG,oBAAoB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACtE,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAClD,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAEhE,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;QACzC,OAAO,EAAE,YAAY,UAAU,CAAC,SAAS,CAAC,iBAAiB,UAAU,CAAC,SAAS,CAAC,EAAE;QAClF,WAAW,EAAE,IAAI,CAAC,WAAW;KAC9B,CAAC,CAAC;IACH,IAAI,WAAW,CAAC,QAAQ,KAAK,SAAS,IAAI,WAAW,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QACrE,MAAM,IAAI,KAAK,CACb,wDAAwD,WAAW,CAAC,MAAM,IAAI,WAAW,CAAC,MAAM,IAAI,QAAQ,WAAW,CAAC,QAAQ,EAAE,EAAE,CACrI,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;QAC/B,IAAI,EAAE,eAAe;QACrB,OAAO,EAAE,QAAQ;QACjB,WAAW,EAAE,IAAI,CAAC,WAAW;KAC9B,CAAC,CAAC;IACH,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;QACzC,OAAO,EAAE,aAAa,UAAU,CAAC,eAAe,CAAC,EAAE;QACnD,WAAW,EAAE,IAAI,CAAC,WAAW;KAC9B,CAAC,CAAC;IACH,IAAI,WAAW,CAAC,QAAQ,KAAK,SAAS,IAAI,WAAW,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QACrE,MAAM,IAAI,KAAK,CACb,6DAA6D,WAAW,CAAC,MAAM,IAAI,WAAW,CAAC,MAAM,IAAI,QAAQ,WAAW,CAAC,QAAQ,EAAE,EAAE,CAC1I,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,YAAoB;IAChD,IAAI,QAAgB,CAAC;IACrB,IAAI,CAAC;QACH,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,GACR,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK;YACnD,CAAC,CAAC,MAAM,CAAE,KAA4B,CAAC,IAAI,CAAC;YAC5C,CAAC,CAAC,SAAS,CAAC;QAChB,MAAM,IAAI,GACR,IAAI,KAAK,QAAQ;YACf,CAAC,CAAC,2EAA2E;YAC7E,CAAC,CAAC,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACb,2DAA2D,YAAY,IAAI,IAAI,EAAE,CAClF,CAAC;IACJ,CAAC;IACD,sBAAsB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IAC/C,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,sBAAsB,CAAC,QAAgB,EAAE,YAAoB;IACpE,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,0CAA0C,YAAY,qBAAqB,CAC5E,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CACb,0CAA0C,YAAY,wBAAwB,CAC/E,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,MAAiC,CAAC;IACjD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC7B,MAAM,gBAAgB,GACpB,MAAM,KAAK,IAAI;QACf,OAAO,MAAM,KAAK,QAAQ;QAC1B,CAAC,OAAQ,MAAkC,CAAC,YAAY,KAAK,QAAQ;YACnE,OAAQ,MAAkC,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC;IAC3E,MAAM,SAAS,GAAG,OAAO,MAAM,CAAC,cAAc,KAAK,QAAQ,CAAC;IAC5D,IAAI,CAAC,gBAAgB,IAAI,CAAC,SAAS,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CACb,0CAA0C,YAAY,wDAAwD,CAC/G,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,OAAmC,EACnC,WAAyB;IAEzB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC/B,OAAO,EAAE,qBAAqB;QAC9B,WAAW;KACZ,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;IACnC,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CACb,mDAAmD,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,QAAQ,MAAM,CAAC,QAAQ,EAAE,EAAE,CACjH,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC;AAC7C,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,KAAU,EACV,OAAyC;IAEzC,IAAI,OAAO,CAAC,WAAW,IAAI,OAAO,KAAK,CAAC,aAAa,KAAK,UAAU,EAAE,CAAC;QACrE,OAAO,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAClD,CAAC;IACD,IAAI,OAAO,CAAC,WAAW,IAAI,OAAO,KAAK,CAAC,aAAa,KAAK,UAAU,EAAE,CAAC;QACrE,IAAI,CAAC;YACH,OAAO,MAAM,KAAK,CAAC,aAAa,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QACzE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC,aAAa,EAAE,CAAC;QAC/B,CAAC;IACH,CAAC;IACD,IAAI,OAAO,KAAK,CAAC,aAAa,KAAK,UAAU,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CACb,8DAA8D,CAC/D,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC,aAAa,EAAE,CAAC;AAC/B,CAAC;AAED,MAAM,mBAAmB;IAIJ;IACA;IAJV,EAAE,CAAS;IAEpB,YACmB,KAAU,EACV,aAAkB;QADlB,UAAK,GAAL,KAAK,CAAK;QACV,kBAAa,GAAb,aAAa,CAAK;QAEnC,IAAI,CAAC,EAAE;YACL,OAAO,aAAa,EAAE,EAAE,KAAK,QAAQ;gBACnC,CAAC,CAAC,aAAa,CAAC,EAAE;gBAClB,CAAC,CAAC,OAAO,aAAa,EAAE,SAAS,KAAK,QAAQ;oBAC5C,CAAC,CAAC,aAAa,CAAC,SAAS;oBACzB,CAAC,CAAC,kBAAkB,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,CAAC,UAAU,CACf,KAA4B;QAE5B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;YACrC,OAAO,EAAE,IAAI,CAAC,aAAa;YAC3B,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjD,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvD,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACjE,CAAC,CAAC;QACH,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,MAAM,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC;YACjD,KAAK,MAAM,KAAK,IAAI,wBAAwB,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnD,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,CAAC,YAAY;QACjB,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,KAAK,UAAU,EAAE,CAAC;YACpD,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC;YAC7C,OAAO,EAAE,IAAI,CAAC,aAAa;SAC5B,CAAC,CAAC;QACH,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,MAAM,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC;YACjD,KAAK,MAAM,KAAK,IAAI,wBAAwB,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnD,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM;QACV,IAAI,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YACpD,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;QACrC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAClD,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;QACnC,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE,CAAC;IACvC,CAAC;CACF;AAED,MAAM,UAAU,wBAAwB,CAAC,IAAS;IAChD,MAAM,IAAI,GAAG,IAAI,EAAE,IAAI,CAAC;IACxB,MAAM,MAAM,GAAwB,EAAE,CAAC;IACvC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,YAAY;YACf,IAAI,IAAI,CAAC,IAAI;gBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YACpE,MAAM;QACR,KAAK,iBAAiB,CAAC;QACvB,KAAK,gBAAgB;YACnB,IAAI,IAAI,CAAC,IAAI;gBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YACxE,MAAM;QACR,KAAK,kBAAkB;YACrB,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,YAAY;gBAClB,EAAE,EAAE,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,UAAU;gBAC9B,IAAI,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,IAAI,MAAM;gBAC1C,KAAK,EAAE,EAAE;aACV,CAAC,CAAC;YACH,MAAM;QACR,KAAK,WAAW,CAAC;QACjB,KAAK,mBAAmB;YACtB,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,YAAY;gBAClB,EAAE,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,EAAE;gBAC9B,IAAI,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,IAAI,MAAM;gBAC1C,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE;aACrC,CAAC,CAAC;YACH,MAAM;QACR,KAAK,aAAa,CAAC;QACnB,KAAK,qBAAqB;YACxB,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,WAAW;gBACjB,EAAE,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,EAAE;gBAC9B,IAAI,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,IAAI,MAAM;gBAC1C,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM;aACnC,CAAC,CAAC;YACH,MAAM;QACR,KAAK,uBAAuB;YAC1B,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,kBAAkB;gBACxB,EAAE,EAAE,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,UAAU,IAAI,UAAU;gBAC5C,IAAI,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI;gBAChC,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,iCAAiC;gBAC1D,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI;aAC/B,CAAC,CAAC;YACH,MAAM;QACR,KAAK,aAAa;YAChB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,aAAa;oBACnB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;oBACvB,SAAS,EAAE,sBAAsB,CAAC,IAAI,CAAC,SAAS,CAAC;oBACjD,OAAO,EAAE,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;iBACrE,CAAC,CAAC;YACL,CAAC;YACD,MAAM;QACR,KAAK,YAAY;YACf,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;aACrE,CAAC,CAAC;YACH,MAAM;QACR,KAAK,QAAQ;YACX,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;YACzD,MAAM;QACR,KAAK,OAAO;YACV,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,IAAI,IAAI,CAAC,OAAO,IAAI,sBAAsB;aACrE,CAAC,CAAC;YACH,MAAM;IACV,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,sBAAsB,CAC7B,KAAc;IAEd,OAAO,KAAK,KAAK,QAAQ;QACvB,KAAK,KAAK,QAAQ;QAClB,KAAK,KAAK,QAAQ;QAClB,KAAK,KAAK,QAAQ;QAClB,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC","sourcesContent":["import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nimport type {\n AgentHarnessAdapter,\n AgentHarnessCapabilities,\n AgentHarnessCreateSessionOptions,\n AgentHarnessEvent,\n AgentHarnessSession,\n AgentHarnessTurnInput,\n} from \"./types.js\";\n\nexport type AiSdkHarnessRuntime = \"claude-code\" | \"codex\" | \"pi\";\n\nexport type CodexCliAuthConfig =\n | boolean\n | {\n /**\n * Local Codex home to read auth from. Defaults to CODEX_HOME, then\n * ~/.codex.\n */\n codexHome?: string;\n /**\n * Explicit local auth file path. Defaults to <codexHome>/auth.json.\n */\n authJsonPath?: string;\n };\n\nexport interface AiSdkHarnessAdapterOptions {\n runtime: AiSdkHarnessRuntime;\n label?: string;\n description?: string;\n permissionMode?: AgentHarnessCreateSessionOptions[\"permissionMode\"];\n harnessOptions?: Record<string, unknown>;\n agentOptions?: Record<string, unknown>;\n /**\n * Opt in to copying the local Codex CLI auth file into the harness sandbox\n * before @ai-sdk/harness-codex starts. Use only with trusted/private\n * sandboxes: ChatGPT login tokens from ~/.codex/auth.json are copied into\n * the sandbox so the in-sandbox codex CLI can reuse `codex login`.\n */\n codexCliAuth?: CodexCliAuthConfig;\n}\n\ntype SandboxRunResult = {\n stdout?: string;\n stderr?: string;\n exitCode?: number;\n};\n\nexport type CodexCliAuthSandboxSession = {\n run(options: {\n command: string;\n abortSignal?: AbortSignal;\n }): PromiseLike<SandboxRunResult>;\n writeTextFile(options: {\n path: string;\n content: string;\n abortSignal?: AbortSignal;\n }): PromiseLike<void>;\n};\n\nexport type CodexCliAuthSandboxHook = (opts: {\n session: CodexCliAuthSandboxSession;\n sessionWorkDir: string;\n abortSignal?: AbortSignal;\n}) => Promise<void> | void;\n\nconst RUNTIME_IMPORTS: Record<\n AiSdkHarnessRuntime,\n {\n packageName: string;\n exportNames: string[];\n label: string;\n sandbox: boolean;\n }\n> = {\n \"claude-code\": {\n packageName: \"@ai-sdk/harness-claude-code\",\n exportNames: [\"claudeCode\", \"createClaudeCode\"],\n label: \"Claude Code\",\n sandbox: true,\n },\n codex: {\n packageName: \"@ai-sdk/harness-codex\",\n exportNames: [\"createCodex\", \"codex\"],\n label: \"Codex\",\n sandbox: true,\n },\n pi: {\n packageName: \"@ai-sdk/harness-pi\",\n exportNames: [\"pi\", \"createPi\"],\n label: \"Pi\",\n sandbox: false,\n },\n};\n\nconst dynamicImport = new Function(\"specifier\", \"return import(specifier)\") as (\n specifier: string,\n) => Promise<any>;\n\nexport function createAiSdkHarnessAdapter(\n options: AiSdkHarnessAdapterOptions,\n): AgentHarnessAdapter {\n const runtime = RUNTIME_IMPORTS[options.runtime];\n if (!runtime) {\n throw new Error(`[agent-harness] Unsupported AI SDK harness runtime`);\n }\n const capabilities: AgentHarnessCapabilities = {\n sandbox: runtime.sandbox,\n resumable: true,\n approvals: options.runtime !== \"codex\",\n hostTools: true,\n fileEvents: true,\n };\n return {\n name: `ai-sdk-harness:${options.runtime}`,\n label: options.label ?? runtime.label,\n description:\n options.description ??\n `Runs ${runtime.label} through the AI SDK HarnessAgent adapter.`,\n installPackage: `@ai-sdk/harness@canary ${runtime.packageName}@canary`,\n capabilities,\n async createSession(sessionOptions) {\n const [{ HarnessAgent }, runtimeModule] = await Promise.all([\n dynamicImport(\"@ai-sdk/harness/agent\"),\n dynamicImport(runtime.packageName),\n ]);\n const exportName = runtime.exportNames.find(\n (name) => runtimeModule[name],\n );\n const harnessFactory = exportName ? runtimeModule[exportName] : undefined;\n if (!HarnessAgent || !harnessFactory) {\n throw new Error(\n `[agent-harness] AI SDK harness package \"${runtime.packageName}\" did not expose one of: ${runtime.exportNames.join(\", \")}`,\n );\n }\n const hasHarnessOptions =\n options.harnessOptions &&\n Object.keys(options.harnessOptions).length > 0;\n const harness =\n typeof harnessFactory === \"function\" &&\n (hasHarnessOptions || exportName?.startsWith(\"create\"))\n ? harnessFactory(options.harnessOptions)\n : harnessFactory;\n const agentOptions = agentOptionsWithCodexCliAuth(options);\n const agent = new HarnessAgent({\n ...agentOptions,\n harness,\n ...(sessionOptions.sandbox ? { sandbox: sessionOptions.sandbox } : {}),\n ...(sessionOptions.instructions\n ? { instructions: sessionOptions.instructions }\n : {}),\n ...(sessionOptions.skills ? { skills: sessionOptions.skills } : {}),\n ...(sessionOptions.tools ? { tools: sessionOptions.tools } : {}),\n permissionMode:\n sessionOptions.permissionMode ??\n options.permissionMode ??\n \"allow-reads\",\n });\n\n const nativeSession = await createNativeSession(agent, sessionOptions);\n return new AiSdkHarnessSession(agent, nativeSession);\n },\n };\n}\n\nfunction agentOptionsWithCodexCliAuth(\n options: AiSdkHarnessAdapterOptions,\n): Record<string, unknown> {\n const agentOptions = { ...(options.agentOptions ?? {}) };\n if (!options.codexCliAuth) return agentOptions;\n if (options.runtime !== \"codex\") {\n throw new Error(\n \"[agent-harness] codexCliAuth is only supported for the codex AI SDK harness runtime.\",\n );\n }\n const existingHook = agentOptions.onSandboxSession;\n if (existingHook !== undefined && typeof existingHook !== \"function\") {\n throw new Error(\n \"[agent-harness] agentOptions.onSandboxSession must be a function when codexCliAuth is enabled.\",\n );\n }\n agentOptions.onSandboxSession = createCodexCliAuthSandboxHook(\n options.codexCliAuth,\n existingHook as CodexCliAuthSandboxHook | undefined,\n );\n return agentOptions;\n}\n\n/** @internal */\nexport function createCodexCliAuthSandboxHook(\n config: CodexCliAuthConfig,\n existingHook?: CodexCliAuthSandboxHook,\n): CodexCliAuthSandboxHook {\n const codexCliAuth = normalizeCodexCliAuthConfig(config);\n return async (hookOptions) => {\n await installCodexCliAuthIntoSandbox(codexCliAuth, hookOptions);\n await existingHook?.(hookOptions);\n };\n}\n\n/** @internal */\nexport function normalizeCodexCliAuthConfig(\n config: CodexCliAuthConfig,\n): Required<Exclude<CodexCliAuthConfig, boolean>> {\n const input = typeof config === \"object\" ? config : {};\n const codexHome =\n input.codexHome ??\n // guard:allow-env-credential -- CODEX_HOME is a local auth-directory path override, not a credential value.\n process.env.CODEX_HOME ??\n path.join(os.homedir(), \".codex\");\n return {\n codexHome,\n authJsonPath: input.authJsonPath ?? path.join(codexHome, \"auth.json\"),\n };\n}\n\nasync function installCodexCliAuthIntoSandbox(\n config: Required<Exclude<CodexCliAuthConfig, boolean>>,\n opts: {\n session: CodexCliAuthSandboxSession;\n abortSignal?: AbortSignal;\n },\n): Promise<void> {\n const authJson = readCodexCliAuthJson(config.authJsonPath);\n const home = await resolveSandboxHome(opts.session, opts.abortSignal);\n const codexHome = path.posix.join(home, \".codex\");\n const sandboxAuthPath = path.posix.join(codexHome, \"auth.json\");\n\n const mkdirResult = await opts.session.run({\n command: `mkdir -p ${shellQuote(codexHome)} && chmod 700 ${shellQuote(codexHome)}`,\n abortSignal: opts.abortSignal,\n });\n if (mkdirResult.exitCode !== undefined && mkdirResult.exitCode !== 0) {\n throw new Error(\n `[agent-harness] Unable to create sandbox Codex home: ${mkdirResult.stderr || mkdirResult.stdout || `exit ${mkdirResult.exitCode}`}`,\n );\n }\n await opts.session.writeTextFile({\n path: sandboxAuthPath,\n content: authJson,\n abortSignal: opts.abortSignal,\n });\n const chmodResult = await opts.session.run({\n command: `chmod 600 ${shellQuote(sandboxAuthPath)}`,\n abortSignal: opts.abortSignal,\n });\n if (chmodResult.exitCode !== undefined && chmodResult.exitCode !== 0) {\n throw new Error(\n `[agent-harness] Unable to secure sandbox Codex auth file: ${chmodResult.stderr || chmodResult.stdout || `exit ${chmodResult.exitCode}`}`,\n );\n }\n}\n\nfunction readCodexCliAuthJson(authJsonPath: string): string {\n let authJson: string;\n try {\n authJson = fs.readFileSync(authJsonPath, \"utf8\");\n } catch (error) {\n const code =\n error && typeof error === \"object\" && \"code\" in error\n ? String((error as { code?: unknown }).code)\n : undefined;\n const hint =\n code === \"ENOENT\"\n ? \" Run `codex login`, or pass harnessOptions.auth for API-key/gateway auth.\"\n : \"\";\n throw new Error(\n `[agent-harness] Codex CLI auth file was not readable at ${authJsonPath}.${hint}`,\n );\n }\n assertCodexCliAuthJson(authJson, authJsonPath);\n return authJson;\n}\n\nfunction assertCodexCliAuthJson(authJson: string, authJsonPath: string): void {\n let parsed: unknown;\n try {\n parsed = JSON.parse(authJson);\n } catch {\n throw new Error(\n `[agent-harness] Codex CLI auth file at ${authJsonPath} is not valid JSON.`,\n );\n }\n if (!parsed || typeof parsed !== \"object\") {\n throw new Error(\n `[agent-harness] Codex CLI auth file at ${authJsonPath} has an invalid shape.`,\n );\n }\n const record = parsed as Record<string, unknown>;\n const tokens = record.tokens;\n const hasChatGptTokens =\n tokens !== null &&\n typeof tokens === \"object\" &&\n (typeof (tokens as Record<string, unknown>).access_token === \"string\" ||\n typeof (tokens as Record<string, unknown>).refresh_token === \"string\");\n const hasApiKey = typeof record.OPENAI_API_KEY === \"string\";\n if (!hasChatGptTokens && !hasApiKey) {\n throw new Error(\n `[agent-harness] Codex CLI auth file at ${authJsonPath} does not contain usable ChatGPT tokens or an API key.`,\n );\n }\n}\n\nasync function resolveSandboxHome(\n session: CodexCliAuthSandboxSession,\n abortSignal?: AbortSignal,\n): Promise<string> {\n const result = await session.run({\n command: 'printf \"%s\" \"$HOME\"',\n abortSignal,\n });\n const home = result.stdout?.trim();\n if (result.exitCode !== undefined && result.exitCode !== 0) {\n throw new Error(\n `[agent-harness] Unable to resolve sandbox HOME: ${result.stderr || result.stdout || `exit ${result.exitCode}`}`,\n );\n }\n if (!home || !path.posix.isAbsolute(home)) {\n throw new Error(\"[agent-harness] Sandbox HOME was not an absolute path.\");\n }\n return home;\n}\n\nfunction shellQuote(value: string): string {\n return `'${value.replace(/'/g, \"'\\\\''\")}'`;\n}\n\nasync function createNativeSession(\n agent: any,\n options: AgentHarnessCreateSessionOptions,\n): Promise<any> {\n if (options.resumeState && typeof agent.resumeSession === \"function\") {\n return agent.resumeSession(options.resumeState);\n }\n if (options.resumeState && typeof agent.createSession === \"function\") {\n try {\n return await agent.createSession({ resumeState: options.resumeState });\n } catch {\n return agent.createSession();\n }\n }\n if (typeof agent.createSession !== \"function\") {\n throw new Error(\n \"[agent-harness] HarnessAgent does not expose createSession()\",\n );\n }\n return agent.createSession();\n}\n\nclass AiSdkHarnessSession implements AgentHarnessSession {\n readonly id: string;\n\n constructor(\n private readonly agent: any,\n private readonly nativeSession: any,\n ) {\n this.id =\n typeof nativeSession?.id === \"string\"\n ? nativeSession.id\n : typeof nativeSession?.sessionId === \"string\"\n ? nativeSession.sessionId\n : `ai-sdk-harness-${Math.random().toString(36).slice(2)}`;\n }\n\n async *streamTurn(\n input: AgentHarnessTurnInput,\n ): AsyncIterable<AgentHarnessEvent> {\n const result = await this.agent.stream({\n session: this.nativeSession,\n ...(input.prompt ? { prompt: input.prompt } : {}),\n ...(input.messages ? { messages: input.messages } : {}),\n ...(input.abortSignal ? { abortSignal: input.abortSignal } : {}),\n });\n for await (const part of result.fullStream ?? []) {\n for (const event of aiSdkHarnessPartToEvents(part)) {\n yield event;\n }\n }\n }\n\n async *continueTurn(): AsyncIterable<AgentHarnessEvent> {\n if (typeof this.agent.continueStream !== \"function\") {\n return;\n }\n const result = await this.agent.continueStream({\n session: this.nativeSession,\n });\n for await (const part of result.fullStream ?? []) {\n for (const event of aiSdkHarnessPartToEvents(part)) {\n yield event;\n }\n }\n }\n\n async detach(): Promise<unknown> {\n if (typeof this.nativeSession.detach === \"function\") {\n return this.nativeSession.detach();\n }\n return undefined;\n }\n\n async stop(): Promise<unknown> {\n if (typeof this.nativeSession.stop === \"function\") {\n return this.nativeSession.stop();\n }\n return this.destroy();\n }\n\n async destroy(): Promise<void> {\n await this.nativeSession.destroy?.();\n }\n}\n\nexport function aiSdkHarnessPartToEvents(part: any): AgentHarnessEvent[] {\n const type = part?.type;\n const events: AgentHarnessEvent[] = [];\n switch (type) {\n case \"text-delta\":\n if (part.text) events.push({ type: \"text-delta\", text: part.text });\n break;\n case \"reasoning-delta\":\n case \"thinking-delta\":\n if (part.text) events.push({ type: \"thinking-delta\", text: part.text });\n break;\n case \"tool-input-start\":\n events.push({\n type: \"tool-start\",\n id: part.id ?? part.toolCallId,\n name: part.toolName ?? part.name ?? \"tool\",\n input: {},\n });\n break;\n case \"tool-call\":\n case \"dynamic-tool-call\":\n events.push({\n type: \"tool-start\",\n id: part.toolCallId ?? part.id,\n name: part.toolName ?? part.name ?? \"tool\",\n input: part.input ?? part.args ?? {},\n });\n break;\n case \"tool-result\":\n case \"dynamic-tool-result\":\n events.push({\n type: \"tool-done\",\n id: part.toolCallId ?? part.id,\n name: part.toolName ?? part.name ?? \"tool\",\n result: part.output ?? part.result,\n });\n break;\n case \"tool-approval-request\":\n events.push({\n type: \"approval-request\",\n id: part.id ?? part.toolCallId ?? \"approval\",\n tool: part.toolName ?? part.name,\n message: part.message ?? \"Harness is waiting for approval\",\n input: part.input ?? part.args,\n });\n break;\n case \"file-change\":\n if (part.path) {\n events.push({\n type: \"file-change\",\n path: String(part.path),\n operation: normalizeFileOperation(part.operation),\n summary: typeof part.summary === \"string\" ? part.summary : undefined,\n });\n }\n break;\n case \"compaction\":\n events.push({\n type: \"compaction\",\n summary: typeof part.summary === \"string\" ? part.summary : undefined,\n });\n break;\n case \"finish\":\n events.push({ type: \"done\", reason: part.finishReason });\n break;\n case \"error\":\n events.push({\n type: \"error\",\n error: part.error?.message ?? part.message ?? \"Harness stream error\",\n });\n break;\n }\n return events;\n}\n\nfunction normalizeFileOperation(\n value: unknown,\n): Extract<AgentHarnessEvent, { type: \"file-change\" }>[\"operation\"] {\n return value === \"create\" ||\n value === \"update\" ||\n value === \"delete\" ||\n value === \"rename\"\n ? value\n : \"unknown\";\n}\n"]}
|
|
@@ -3,7 +3,7 @@ export { agentHarnessEventToAgentChatEvents, stringifyResult as stringifyAgentHa
|
|
|
3
3
|
export { getAgentHarnessEntry, isAgentHarnessPackageInstalled, listAgentHarnesses, registerAgentHarness, resolveAgentHarness, type AgentHarnessEntry, } from "./registry.js";
|
|
4
4
|
export { ensureAgentHarnessSessionTables, getAgentHarnessSession, getAgentHarnessSessionByRunId, getLatestAgentHarnessSessionForThread, listAgentHarnessSessions, markAgentHarnessSessionStopped, saveAgentHarnessSession, updateAgentHarnessSession, type AgentHarnessSessionStatus, type SaveAgentHarnessSessionInput, type StoredAgentHarnessSession, } from "./store.js";
|
|
5
5
|
export { sendAgentHarnessEvent, startAgentHarnessRun, type StartAgentHarnessRunOptions, } from "./runner.js";
|
|
6
|
-
export { aiSdkHarnessPartToEvents, createAiSdkHarnessAdapter, type AiSdkHarnessAdapterOptions, type AiSdkHarnessRuntime, } from "./ai-sdk-adapter.js";
|
|
6
|
+
export { aiSdkHarnessPartToEvents, createAiSdkHarnessAdapter, type AiSdkHarnessAdapterOptions, type AiSdkHarnessRuntime, type CodexCliAuthConfig, } from "./ai-sdk-adapter.js";
|
|
7
7
|
export { registerBuiltinAgentHarnesses } from "./builtin.js";
|
|
8
8
|
export { agentHarnessBackgroundAgentController, createAgentHarnessBackgroundAgentController, getAgentHarnessBackgroundRun, listAgentHarnessBackgroundRuns, listAgentHarnessBackgroundTranscriptEvents, stopAgentHarnessBackgroundRun, } from "./background.js";
|
|
9
9
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/agent/harness/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,mBAAmB,EACnB,oBAAoB,EACpB,wBAAwB,EACxB,yBAAyB,EACzB,gCAAgC,EAChC,iBAAiB,EACjB,mBAAmB,EACnB,0BAA0B,EAC1B,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,kCAAkC,EAClC,eAAe,IAAI,2BAA2B,GAC/C,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,oBAAoB,EACpB,8BAA8B,EAC9B,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,KAAK,iBAAiB,GACvB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,+BAA+B,EAC/B,sBAAsB,EACtB,6BAA6B,EAC7B,qCAAqC,EACrC,wBAAwB,EACxB,8BAA8B,EAC9B,uBAAuB,EACvB,yBAAyB,EACzB,KAAK,yBAAyB,EAC9B,KAAK,4BAA4B,EACjC,KAAK,yBAAyB,GAC/B,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,KAAK,2BAA2B,GACjC,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,wBAAwB,EACxB,yBAAyB,EACzB,KAAK,0BAA0B,EAC/B,KAAK,mBAAmB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/agent/harness/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,mBAAmB,EACnB,oBAAoB,EACpB,wBAAwB,EACxB,yBAAyB,EACzB,gCAAgC,EAChC,iBAAiB,EACjB,mBAAmB,EACnB,0BAA0B,EAC1B,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,kCAAkC,EAClC,eAAe,IAAI,2BAA2B,GAC/C,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,oBAAoB,EACpB,8BAA8B,EAC9B,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,KAAK,iBAAiB,GACvB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,+BAA+B,EAC/B,sBAAsB,EACtB,6BAA6B,EAC7B,qCAAqC,EACrC,wBAAwB,EACxB,8BAA8B,EAC9B,uBAAuB,EACvB,yBAAyB,EACzB,KAAK,yBAAyB,EAC9B,KAAK,4BAA4B,EACjC,KAAK,yBAAyB,GAC/B,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,KAAK,2BAA2B,GACjC,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,wBAAwB,EACxB,yBAAyB,EACzB,KAAK,0BAA0B,EAC/B,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,GACxB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,6BAA6B,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EACL,qCAAqC,EACrC,2CAA2C,EAC3C,4BAA4B,EAC5B,8BAA8B,EAC9B,0CAA0C,EAC1C,6BAA6B,GAC9B,MAAM,iBAAiB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/agent/harness/index.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,kCAAkC,EAClC,eAAe,IAAI,2BAA2B,GAC/C,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,oBAAoB,EACpB,8BAA8B,EAC9B,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,GAEpB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,+BAA+B,EAC/B,sBAAsB,EACtB,6BAA6B,EAC7B,qCAAqC,EACrC,wBAAwB,EACxB,8BAA8B,EAC9B,uBAAuB,EACvB,yBAAyB,GAI1B,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,qBAAqB,EACrB,oBAAoB,GAErB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,wBAAwB,EACxB,yBAAyB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/agent/harness/index.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,kCAAkC,EAClC,eAAe,IAAI,2BAA2B,GAC/C,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,oBAAoB,EACpB,8BAA8B,EAC9B,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,GAEpB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,+BAA+B,EAC/B,sBAAsB,EACtB,6BAA6B,EAC7B,qCAAqC,EACrC,wBAAwB,EACxB,8BAA8B,EAC9B,uBAAuB,EACvB,yBAAyB,GAI1B,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,qBAAqB,EACrB,oBAAoB,GAErB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,wBAAwB,EACxB,yBAAyB,GAI1B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,6BAA6B,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EACL,qCAAqC,EACrC,2CAA2C,EAC3C,4BAA4B,EAC5B,8BAA8B,EAC9B,0CAA0C,EAC1C,6BAA6B,GAC9B,MAAM,iBAAiB,CAAC","sourcesContent":["export type {\n AgentHarnessAdapter,\n AgentHarnessApproval,\n AgentHarnessCapabilities,\n AgentHarnessContinueInput,\n AgentHarnessCreateSessionOptions,\n AgentHarnessEvent,\n AgentHarnessMessage,\n AgentHarnessPermissionMode,\n AgentHarnessSession,\n AgentHarnessTurnInput,\n} from \"./types.js\";\nexport {\n agentHarnessEventToAgentChatEvents,\n stringifyResult as stringifyAgentHarnessResult,\n} from \"./translate.js\";\nexport {\n getAgentHarnessEntry,\n isAgentHarnessPackageInstalled,\n listAgentHarnesses,\n registerAgentHarness,\n resolveAgentHarness,\n type AgentHarnessEntry,\n} from \"./registry.js\";\nexport {\n ensureAgentHarnessSessionTables,\n getAgentHarnessSession,\n getAgentHarnessSessionByRunId,\n getLatestAgentHarnessSessionForThread,\n listAgentHarnessSessions,\n markAgentHarnessSessionStopped,\n saveAgentHarnessSession,\n updateAgentHarnessSession,\n type AgentHarnessSessionStatus,\n type SaveAgentHarnessSessionInput,\n type StoredAgentHarnessSession,\n} from \"./store.js\";\nexport {\n sendAgentHarnessEvent,\n startAgentHarnessRun,\n type StartAgentHarnessRunOptions,\n} from \"./runner.js\";\nexport {\n aiSdkHarnessPartToEvents,\n createAiSdkHarnessAdapter,\n type AiSdkHarnessAdapterOptions,\n type AiSdkHarnessRuntime,\n type CodexCliAuthConfig,\n} from \"./ai-sdk-adapter.js\";\nexport { registerBuiltinAgentHarnesses } from \"./builtin.js\";\nexport {\n agentHarnessBackgroundAgentController,\n createAgentHarnessBackgroundAgentController,\n getAgentHarnessBackgroundRun,\n listAgentHarnessBackgroundRuns,\n listAgentHarnessBackgroundTranscriptEvents,\n stopAgentHarnessBackgroundRun,\n} from \"./background.js\";\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnnotatedCodeBlock.d.ts","sourceRoot":"","sources":["../../../../src/client/blocks/library/AnnotatedCodeBlock.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,KAAK,EAEV,iBAAiB,EAClB,MAAM,4BAA4B,CAAC;AA6IpC,iBAAS,iBAAiB,CAAC,EACzB,IAAI,EACJ,OAAO,EACP,KAAK,EACL,OAAO,EACP,GAAG,GACJ,EAAE,cAAc,CAAC,iBAAiB,CAAC,
|
|
1
|
+
{"version":3,"file":"AnnotatedCodeBlock.d.ts","sourceRoot":"","sources":["../../../../src/client/blocks/library/AnnotatedCodeBlock.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,KAAK,EAEV,iBAAiB,EAClB,MAAM,4BAA4B,CAAC;AA6IpC,iBAAS,iBAAiB,CAAC,EACzB,IAAI,EACJ,OAAO,EACP,KAAK,EACL,OAAO,EACP,GAAG,GACJ,EAAE,cAAc,CAAC,iBAAiB,CAAC,2CAwUnC;AAOD,iBAAS,iBAAiB,CAAC,EACzB,IAAI,EACJ,QAAQ,EACR,QAAQ,GACT,EAAE,cAAc,CAAC,iBAAiB,CAAC,2CAiJnC;AAED,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,CAAC"}
|
|
@@ -125,15 +125,26 @@ function AnnotatedCodeRead({ data, blockId, title, summary, ctx, }) {
|
|
|
125
125
|
const annotationHoverSide = annotationLayout?.hoverSide ?? "right";
|
|
126
126
|
const annotationHoverFallbackSide = annotationLayout?.hoverFallbackSide ?? "right";
|
|
127
127
|
const annotationMarginSide = annotationLayout?.marginSide ?? "auto";
|
|
128
|
+
const defaultVisibleAnnotations = annotationLayout?.defaultVisibleAnnotations ??
|
|
129
|
+
(annotationLayout?.showByDefaultWhenRoom ? "all" : undefined);
|
|
128
130
|
const showMarginAnnotations = useAnnotationMarginNotesAvailable({
|
|
129
131
|
containerRef: codeRef,
|
|
130
|
-
enabled: Boolean(hasAnnotations &&
|
|
131
|
-
!showAnnotationOverlays &&
|
|
132
|
-
annotationLayout?.showByDefaultWhenRoom),
|
|
132
|
+
enabled: Boolean(hasAnnotations && !showAnnotationOverlays && defaultVisibleAnnotations),
|
|
133
133
|
side: annotationMarginSide,
|
|
134
134
|
preferredSide: annotationHoverSide,
|
|
135
135
|
});
|
|
136
136
|
const showPersistentAnnotations = showAnnotationOverlays || showMarginAnnotations;
|
|
137
|
+
const persistentAnnotationIndexes = useMemo(() => {
|
|
138
|
+
if (!showMarginAnnotations || !defaultVisibleAnnotations) {
|
|
139
|
+
return new Set();
|
|
140
|
+
}
|
|
141
|
+
const visible = resolved.filter((item) => item.range);
|
|
142
|
+
if (defaultVisibleAnnotations === "first") {
|
|
143
|
+
const first = visible[0];
|
|
144
|
+
return first ? new Set([first.index]) : new Set();
|
|
145
|
+
}
|
|
146
|
+
return new Set(visible.map((item) => item.index));
|
|
147
|
+
}, [defaultVisibleAnnotations, resolved, showMarginAnnotations]);
|
|
137
148
|
const captureOverlayAnnotationIndex = useMemo(() => resolved.find((item) => item.range)?.index ?? null, [resolved]);
|
|
138
149
|
const langChip = data.language?.trim();
|
|
139
150
|
const hasFilename = Boolean(data.filename?.trim());
|
|
@@ -142,6 +153,9 @@ function AnnotatedCodeRead({ data, blockId, title, summary, ctx, }) {
|
|
|
142
153
|
const activeItem = useMemo(() => activeIndex == null
|
|
143
154
|
? null
|
|
144
155
|
: (resolved.find((item) => item.index === activeIndex) ?? null), [activeIndex, resolved]);
|
|
156
|
+
const activeItemIsPersistentlyVisible = Boolean(activeItem &&
|
|
157
|
+
!showAnnotationOverlays &&
|
|
158
|
+
persistentAnnotationIndexes.has(activeItem.index));
|
|
145
159
|
// Line-collapse state: a set of collapsed segment start lines that have been
|
|
146
160
|
// expanded by the reader. Starts empty (all segments in their default state).
|
|
147
161
|
const [expandedCollapsed, setExpandedCollapsed] = useState(() => new Set());
|
|
@@ -152,9 +166,11 @@ function AnnotatedCodeRead({ data, blockId, title, summary, ctx, }) {
|
|
|
152
166
|
const isActive = activeIndex != null && !!markers?.some((m) => m.index === activeIndex);
|
|
153
167
|
const overlayItems = showPersistentAnnotations && markers
|
|
154
168
|
? markers.filter((item) => item.range?.start === lineNo &&
|
|
155
|
-
(
|
|
156
|
-
item.index === captureOverlayAnnotationIndex
|
|
169
|
+
(showAnnotationOverlays
|
|
170
|
+
? item.index === captureOverlayAnnotationIndex
|
|
171
|
+
: persistentAnnotationIndexes.has(item.index)))
|
|
157
172
|
: [];
|
|
173
|
+
const rowHasPersistentAnnotation = Boolean(markers?.some((item) => persistentAnnotationIndexes.has(item.index)));
|
|
158
174
|
const buildAnchorForRow = (el) => {
|
|
159
175
|
if (!markers)
|
|
160
176
|
return null;
|
|
@@ -165,11 +181,13 @@ function AnnotatedCodeRead({ data, blockId, title, summary, ctx, }) {
|
|
|
165
181
|
};
|
|
166
182
|
return (_jsxs("div", { ref: (node) => setLineRef(lineNo, node), "data-code-line": lineNo, "data-annot-row": isAnnotated ? markers?.[0].index : undefined, tabIndex: isAnnotated ? 0 : undefined, role: isAnnotated ? "button" : undefined, "aria-expanded": isAnnotated ? isActive : undefined, "aria-label": isAnnotated ? `Line ${lineNo} annotation` : undefined, className: cn("relative flex w-full", isAnnotated && "cursor-pointer", isActive
|
|
167
183
|
? "bg-amber-400/[0.12] dark:bg-amber-300/[0.10]"
|
|
168
|
-
:
|
|
184
|
+
: rowHasPersistentAnnotation
|
|
169
185
|
? "bg-amber-300/[0.14] dark:bg-amber-300/[0.10]"
|
|
170
|
-
: isAnnotated
|
|
171
|
-
? "bg-amber-
|
|
172
|
-
:
|
|
186
|
+
: isAnnotated && showAnnotationOverlays
|
|
187
|
+
? "bg-amber-300/[0.14] dark:bg-amber-300/[0.10]"
|
|
188
|
+
: isAnnotated
|
|
189
|
+
? "bg-amber-400/[0.045] dark:bg-amber-300/[0.045]"
|
|
190
|
+
: null), onMouseEnter: isAnnotated && markers
|
|
173
191
|
? (event) => {
|
|
174
192
|
const anchor = buildAnchorForRow(event.currentTarget);
|
|
175
193
|
if (anchor)
|
|
@@ -223,7 +241,8 @@ function AnnotatedCodeRead({ data, blockId, title, summary, ctx, }) {
|
|
|
223
241
|
}), className: "flex w-full cursor-pointer items-center gap-2 border-y border-plan-line/50 bg-plan-block/20 px-3 py-0.5 text-left hover:bg-plan-block/40", children: [_jsx("span", { "aria-hidden": true, className: "w-[3px] shrink-0 self-stretch" }), _jsx("span", { className: "w-8 shrink-0 select-none text-right text-[11px] tabular-nums text-plan-muted/40", children: "\u00B7\u00B7\u00B7" }), _jsxs("span", { className: "flex-1 text-[11px] text-plan-muted/70", children: [hiddenCount, " lines \u2014 click to expand"] })] }, `collapse-${seg.startLine}`));
|
|
224
242
|
}) }) })] }));
|
|
225
243
|
return (_jsxs("section", { ...ltrCodeBlockProps, className: "plan-block relative", "data-block-id": blockId, children: [title && _jsx("div", { className: "plan-block-label", children: title }), codeSurface, hasAnnotations && _jsx(AnnotationHiddenStack, { items: resolved, ctx: ctx }), hasAnnotations &&
|
|
226
|
-
!
|
|
244
|
+
!showAnnotationOverlays &&
|
|
245
|
+
!activeItemIsPersistentlyVisible &&
|
|
227
246
|
activeItem &&
|
|
228
247
|
hover.anchor && (_jsx(AnnotationHoverCard, { item: activeItem, anchor: hover.anchor, ctx: ctx, preferredSide: annotationHoverSide, hoverFallbackSide: annotationHoverFallbackSide, onMouseEnter: hover.cancelClose, onMouseLeave: hover.scheduleClose, onClose: hover.closeForScroll })), summary && _jsx("p", { className: "mt-5 text-plan-muted", children: summary })] }));
|
|
229
248
|
}
|