subharness 0.0.3 → 0.0.4

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.
Files changed (110) hide show
  1. package/README.md +3 -3
  2. package/dist/adapters/approval-context.d.ts +2 -0
  3. package/dist/adapters/approval-context.js +9 -0
  4. package/dist/adapters/approval-context.js.map +1 -0
  5. package/dist/adapters/approval-lifetime.d.ts +8 -0
  6. package/dist/adapters/approval-lifetime.js +50 -0
  7. package/dist/adapters/approval-lifetime.js.map +1 -0
  8. package/dist/adapters/claude-approvals.d.ts +4 -0
  9. package/dist/adapters/claude-approvals.js +32 -0
  10. package/dist/adapters/claude-approvals.js.map +1 -0
  11. package/dist/adapters/claude-permissions.js +1 -1
  12. package/dist/adapters/claude-permissions.js.map +1 -1
  13. package/dist/adapters/claude.js +30 -1
  14. package/dist/adapters/claude.js.map +1 -1
  15. package/dist/adapters/codex-approvals.d.ts +6 -0
  16. package/dist/adapters/codex-approvals.js +111 -0
  17. package/dist/adapters/codex-approvals.js.map +1 -0
  18. package/dist/adapters/codex.js +32 -2
  19. package/dist/adapters/codex.js.map +1 -1
  20. package/dist/adapters/fx-approvals.d.ts +2 -0
  21. package/dist/adapters/fx-approvals.js +14 -0
  22. package/dist/adapters/fx-approvals.js.map +1 -0
  23. package/dist/adapters/fx.js +49 -18
  24. package/dist/adapters/fx.js.map +1 -1
  25. package/dist/adapters/types.d.ts +2 -0
  26. package/dist/adapters/types.js.map +1 -1
  27. package/dist/approvals/schema.d.ts +4 -0
  28. package/dist/approvals/schema.js +70 -0
  29. package/dist/approvals/schema.js.map +1 -0
  30. package/dist/approvals/types.d.ts +47 -0
  31. package/dist/approvals/types.js +2 -0
  32. package/dist/approvals/types.js.map +1 -0
  33. package/dist/cli/args.d.ts +2 -1
  34. package/dist/cli/args.js +20 -2
  35. package/dist/cli/args.js.map +1 -1
  36. package/dist/cli/dashboard-client.d.ts +5 -1
  37. package/dist/cli/dashboard-client.js +161 -14
  38. package/dist/cli/dashboard-client.js.map +1 -1
  39. package/dist/cli/dashboard-detail-view.d.ts +16 -0
  40. package/dist/cli/dashboard-detail-view.js +163 -0
  41. package/dist/cli/dashboard-detail-view.js.map +1 -0
  42. package/dist/cli/dashboard-history-view.d.ts +29 -0
  43. package/dist/cli/dashboard-history-view.js +211 -0
  44. package/dist/cli/dashboard-history-view.js.map +1 -0
  45. package/dist/cli/dashboard-input.d.ts +14 -0
  46. package/dist/cli/dashboard-input.js +118 -0
  47. package/dist/cli/dashboard-input.js.map +1 -0
  48. package/dist/cli/dashboard-layout.d.ts +12 -1
  49. package/dist/cli/dashboard-layout.js +29 -27
  50. package/dist/cli/dashboard-layout.js.map +1 -1
  51. package/dist/cli/dashboard-renderer.d.ts +30 -2
  52. package/dist/cli/dashboard-renderer.js +125 -7
  53. package/dist/cli/dashboard-renderer.js.map +1 -1
  54. package/dist/cli/dashboard-style.d.ts +9 -0
  55. package/dist/cli/dashboard-style.js +36 -0
  56. package/dist/cli/dashboard-style.js.map +1 -0
  57. package/dist/cli/dashboard.d.ts +3 -1
  58. package/dist/cli/dashboard.js +127 -12
  59. package/dist/cli/dashboard.js.map +1 -1
  60. package/dist/cli/help.js +7 -0
  61. package/dist/cli/help.js.map +1 -1
  62. package/dist/cli/input.d.ts +1 -0
  63. package/dist/cli/input.js +23 -17
  64. package/dist/cli/input.js.map +1 -1
  65. package/dist/cli/main.js +1 -1
  66. package/dist/cli/main.js.map +1 -1
  67. package/dist/cli/output.js +17 -1
  68. package/dist/cli/output.js.map +1 -1
  69. package/dist/runtime/approval-registry.d.ts +27 -0
  70. package/dist/runtime/approval-registry.js +126 -0
  71. package/dist/runtime/approval-registry.js.map +1 -0
  72. package/dist/runtime/coordinator.d.ts +17 -1
  73. package/dist/runtime/coordinator.js +124 -6
  74. package/dist/runtime/coordinator.js.map +1 -1
  75. package/dist/runtime/dashboard.d.ts +42 -0
  76. package/dist/runtime/dashboard.js.map +1 -1
  77. package/dist/runtime/select-native.d.ts +2 -1
  78. package/dist/runtime/select-native.js +2 -2
  79. package/dist/runtime/select-native.js.map +1 -1
  80. package/dist/runtime/service.js +24 -1
  81. package/dist/runtime/service.js.map +1 -1
  82. package/dist/runtime/types.d.ts +9 -1
  83. package/dist/runtime/types.js.map +1 -1
  84. package/dist/runtime/worker-approvals.d.ts +21 -0
  85. package/dist/runtime/worker-approvals.js +51 -0
  86. package/dist/runtime/worker-approvals.js.map +1 -0
  87. package/dist/runtime/worker-client.js +35 -7
  88. package/dist/runtime/worker-client.js.map +1 -1
  89. package/dist/runtime/worker-server.d.ts +2 -0
  90. package/dist/runtime/worker-server.js +39 -10
  91. package/dist/runtime/worker-server.js.map +1 -1
  92. package/package.json +1 -1
  93. package/sdk/access-config.md +28 -0
  94. package/sdk/adapter-contract.md +2 -10
  95. package/sdk/agent-skill.md +6 -3
  96. package/sdk/approvals.md +118 -0
  97. package/sdk/cli/dashboard-design.md +38 -4
  98. package/sdk/cli/dashboard-inspection.md +25 -0
  99. package/sdk/cli/index.md +11 -5
  100. package/sdk/cli/output.md +7 -3
  101. package/sdk/completion-notifications.md +2 -0
  102. package/sdk/distribution.md +52 -0
  103. package/sdk/evals.md +9 -3
  104. package/sdk/fx.md +1 -1
  105. package/sdk/index.md +1 -0
  106. package/sdk/message-delivery.md +1 -1
  107. package/sdk/permissions.md +4 -4
  108. package/sdk/pr-integration.md +1 -1
  109. package/sdk/sessions.md +4 -1
  110. package/sdk/v1-runtime.md +3 -3
@@ -2,6 +2,8 @@ import { AgentError } from "../errors.js";
2
2
  import { executeTool, toolJsonSchema } from "../sdk/tools.js";
3
3
  import { NativeRpc } from "./rpc.js";
4
4
  import { codexEnvironment, codexConfiguration, validateCodexModel } from "./codex-config.js";
5
+ import { NativeApprovals } from "./approval-lifetime.js";
6
+ import { codexApproval } from "./codex-approvals.js";
5
7
  import { codexInputRequired } from "./codex-input.js";
6
8
  import { codexPermissionSettings, verifyCodexPermissionSettings } from "./codex-permissions.js";
7
9
  export async function openCodex(options) {
@@ -79,6 +81,13 @@ class CodexSession {
79
81
  const turnId = p.turnId ?? p.turn?.id;
80
82
  if (turnId && turnId !== current.id)
81
83
  return;
84
+ if (message.method === "serverRequest/resolved") {
85
+ current.withdrawnApprovals.add(p.requestId);
86
+ current.approvals.withdraw(p.requestId);
87
+ return;
88
+ }
89
+ if (message.method === "item/started" && p.item?.type === "fileChange")
90
+ current.items.set(p.item.id, p.item);
82
91
  if (message.method === "item/tool/call" && message.id !== undefined) {
83
92
  if (!current.acceptingTools) {
84
93
  this.rpc.send({ id: message.id, result: { success: false, contentItems: [{ type: "inputText", text: "The task is not accepting tool calls." }] } });
@@ -90,6 +99,22 @@ class CodexSession {
90
99
  return;
91
100
  }
92
101
  if (message.id !== undefined) {
102
+ if (this.options.onApproval && current.acceptingTools) {
103
+ try {
104
+ const approval = codexApproval(message.method, p, current.items.get(p.itemId));
105
+ if (approval) {
106
+ void current.approvals.request(message.id, approval.request, this.options.onApproval).then(content => {
107
+ if (this.active === current && !current.terminal && current.acceptingTools && !current.withdrawnApprovals.has(message.id))
108
+ this.rpc.send({ id: message.id, result: approval.response(content) });
109
+ }).catch(error => {
110
+ if (!(error instanceof AgentError && error.code === "REQUEST_EXPIRED"))
111
+ this.stopForInput(message.method);
112
+ });
113
+ return;
114
+ }
115
+ }
116
+ catch { /* Unsupported native requests use the explicit input failure path. */ }
117
+ }
93
118
  this.stopForInput(message.method);
94
119
  return;
95
120
  }
@@ -112,6 +137,7 @@ class CodexSession {
112
137
  if (active.terminal)
113
138
  return;
114
139
  active.terminal = true;
140
+ active.approvals.clear();
115
141
  active.acceptingTools = false;
116
142
  await Promise.allSettled([...active.tools]);
117
143
  if (this.active === active)
@@ -145,6 +171,7 @@ class CodexSession {
145
171
  if (!active || active.failure)
146
172
  return;
147
173
  active.acceptingTools = false;
174
+ active.approvals.clear();
148
175
  active.failure = codexInputRequired(method);
149
176
  void (async () => {
150
177
  try {
@@ -181,7 +208,7 @@ class CodexSession {
181
208
  throw new AgentError("SESSION_BUSY", "Codex already has an active turn.");
182
209
  let resolve, reject;
183
210
  const completion = new Promise((a, b) => { resolve = a; reject = b; });
184
- const active = { messages: new Map(), tools: new Set(), acceptingTools: true, resolve, reject, completion };
211
+ const active = { messages: new Map(), tools: new Set(), approvals: new NativeApprovals(), items: new Map(), withdrawnApprovals: new Set(), acceptingTools: true, resolve, reject, completion };
185
212
  this.active = active;
186
213
  void completion.catch(() => { });
187
214
  try {
@@ -211,6 +238,7 @@ class CodexSession {
211
238
  if (!active)
212
239
  return;
213
240
  active.acceptingTools = false;
241
+ active.approvals.clear();
214
242
  await active.started;
215
243
  if (this.active !== active)
216
244
  return;
@@ -227,8 +255,10 @@ class CodexSession {
227
255
  async resume() { throw new AgentError("RECOVERY_UNSUPPORTED", "Codex does not expose retry of a failed turn without replay."); }
228
256
  async close() {
229
257
  const active = this.active;
230
- if (active)
258
+ if (active) {
231
259
  active.acceptingTools = false;
260
+ active.approvals.clear();
261
+ }
232
262
  await this.rpc.close();
233
263
  if (active)
234
264
  await Promise.allSettled([...active.tools]);
@@ -1 +1 @@
1
- {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/adapters/codex.ts"],"names":[],"mappings":"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","sourcesContent":["import { AgentError } from \"../errors.js\";\nimport { executeTool, toolJsonSchema } from \"../sdk/tools.js\";\nimport type { ExecutedToolResult } from \"../sdk/tool-result.js\";\nimport { NativeRpc } from \"./rpc.js\";\nimport { codexEnvironment, codexConfiguration, validateCodexModel } from \"./codex-config.js\";\nimport { codexInputRequired } from \"./codex-input.js\";\nimport { codexPermissionSettings, verifyCodexPermissionSettings } from \"./codex-permissions.js\";\nimport type { AdapterOptions, NativeSession } from \"./types.js\";\n\ntype ActiveTurn = {\n id?: string;\n messages: Map<string, { text: string; final: boolean }>;\n resolve(text: string): void;\n reject(error: Error): void;\n completion: Promise<string>;\n started?: Promise<void>;\n failure?: AgentError;\n tools: Set<Promise<void>>;\n terminal?: boolean;\n acceptingTools: boolean;\n};\n\nexport async function openCodex(options: AdapterOptions): Promise<NativeSession> {\n const env = codexEnvironment(options);\n const rpc = new NativeRpc(\"codex\", [\"app-server\", \"--stdio\"], options.cwd, env);\n rpc.onMessage = message => {\n if (message.id !== undefined) rpc.abort(codexInputRequired(message.method));\n };\n try {\n await rpc.request(\"initialize\", { clientInfo: { name: \"subharness\", version: \"0.1.0\" }, capabilities: { experimentalApi: true } });\n rpc.send({ method: \"initialized\", params: {} });\n const configuration = await codexConfiguration(rpc, options);\n if (options.harness.kind !== \"codex\") throw new AgentError(\"INVALID_CONFIG\", \"Codex received a configuration for another harness.\");\n const permissions = codexPermissionSettings(options.harness);\n const result = await rpc.request(\"thread/start\", {\n ...(options.harness.model ? { model: options.harness.model } : {}), ...configuration, ...permissions.thread, allowProviderModelFallback: false,\n config: { ...configuration.config, ...permissions.config, ...(options.harness.effort ? { model_reasoning_effort: options.harness.effort } : {}), \"features.fast_mode\": options.harness.fast },\n dynamicTools: Object.keys(options.agent.tools ?? {}).length ? [{\n type: \"namespace\", name: \"subharness\", description: \"Tools declared by this agent.\",\n tools: Object.entries(options.agent.tools ?? {}).map(([name, definition]) => ({ type: \"function\", name, description: definition.description, inputSchema: toolJsonSchema(definition) })),\n }] : [],\n cwd: options.cwd, serviceTier: options.harness.fast ? \"fast\" : null,\n });\n if (typeof result.thread?.id !== \"string\") throw new AgentError(\"PROTOCOL_ERROR\", \"Codex did not return a native thread identifier.\");\n if (typeof result.model !== \"string\" || result.model.length === 0) {\n throw new AgentError(\"INVALID_CONFIG\", \"Codex could not select a native default for this connection. Supply --model <model>.\");\n }\n if ((options.harness.model && result.model !== options.harness.model) || result.modelProvider !== configuration.modelProvider) {\n throw new AgentError(\"INVALID_CONFIG\", options.harness.model\n ? \"Codex changed the explicitly selected model or provider.\"\n : \"Codex could not select a verifiable native default for this connection. Supply --model <model>.\");\n }\n if (options.harness.effort && result.reasoningEffort !== options.harness.effort) {\n throw new AgentError(\"INVALID_CONFIG\", \"Codex did not apply the explicitly selected effort.\");\n }\n verifyCodexPermissionSettings(options.harness, result);\n await validateCodexModel(rpc, options, result.model);\n const requestedTier = options.harness.fast ? \"fast\" : \"default\";\n if ((options.harness.fast && result.serviceTier !== \"fast\") || (result.serviceTier != null && result.serviceTier !== requestedTier)) throw new AgentError(\"INVALID_CONFIG\", \"Codex did not accept the requested speed setting.\");\n return new CodexSession(rpc, result.thread.id, result.model, options);\n } catch (error) { await rpc.close(); throw error; }\n}\n\nclass CodexSession implements NativeSession {\n private active?: ActiveTurn;\n\n constructor(private rpc: NativeRpc, private threadId: string, private model: string, private options: AdapterOptions) {\n rpc.onFailure = error => {\n const active = this.active;\n if (active) void this.finish(active, undefined, error);\n };\n rpc.onMessage = message => {\n const p = message.params;\n const current = this.active;\n if (p?.threadId !== this.threadId || !current) return;\n void Promise.resolve(current.started).then(() => {\n if (this.active !== current || current.terminal) return;\n const turnId = p.turnId ?? p.turn?.id;\n if (turnId && turnId !== current.id) return;\n if (message.method === \"item/tool/call\" && message.id !== undefined) {\n if (!current.acceptingTools) {\n this.rpc.send({ id: message.id, result: { success: false, contentItems: [{ type: \"inputText\", text: \"The task is not accepting tool calls.\" }] } });\n return;\n }\n const call = this.toolCall(message.id, p);\n current.tools.add(call);\n void call.finally(() => current.tools.delete(call));\n return;\n }\n if (message.id !== undefined) {\n this.stopForInput(message.method);\n return;\n }\n if (message.method === \"item/completed\" && p.item?.type === \"agentMessage\") {\n if (typeof p.item.id !== \"string\" || typeof p.item.text !== \"string\") {\n current.failure = new AgentError(\"PROTOCOL_ERROR\", \"Codex sent an invalid turn event.\");\n void this.finish(current, undefined, current.failure);\n return;\n }\n current.messages.set(p.item.id, { text: p.item.text, final: p.item.phase === \"final_answer\" });\n }\n if (message.method === \"turn/completed\") void this.finish(current, p.turn);\n }).catch(() => {\n void this.finish(current, undefined, new AgentError(\"PROTOCOL_ERROR\", \"Codex sent an invalid turn event.\"));\n });\n };\n }\n\n private async finish(active: ActiveTurn, turn?: any, failure?: AgentError): Promise<void> {\n if (active.terminal) return;\n active.terminal = true;\n active.acceptingTools = false;\n await Promise.allSettled([...active.tools]);\n if (this.active === active) this.active = undefined;\n if (failure) return active.reject(failure);\n if (active.failure) return active.reject(active.failure);\n if (typeof turn !== \"object\" || turn === null || !Array.isArray(turn.items)) {\n return active.reject(new AgentError(\"PROTOCOL_ERROR\", \"Codex sent an invalid turn event.\"));\n }\n for (const item of turn.items) {\n if (item?.type !== \"agentMessage\") continue;\n if (typeof item.id !== \"string\" || typeof item.text !== \"string\") {\n return active.reject(new AgentError(\"PROTOCOL_ERROR\", \"Codex sent an invalid turn event.\"));\n }\n active.messages.set(item.id, { text: item.text, final: item.phase === \"final_answer\" });\n }\n const messages = [...active.messages.values()].reverse();\n const text = messages.find(m => m.final)?.text ?? messages[0]?.text ?? \"\";\n if (Buffer.byteLength(text, \"utf8\") > 1024 * 1024) active.reject(new AgentError(\"RESPONSE_TOO_LARGE\", \"Codex response exceeds 1 MiB.\"));\n else if (turn?.status === \"completed\") active.resolve(text);\n else active.reject(new AgentError(turn?.status === \"interrupted\" ? \"INTERRUPTED\" : \"HARNESS_FAILED\", \"Codex did not complete the turn successfully.\"));\n }\n\n private stopForInput(method: unknown): void {\n const active = this.active;\n if (!active || active.failure) return;\n active.acceptingTools = false;\n active.failure = codexInputRequired(method);\n void (async () => {\n try {\n await active.started;\n if (this.active === active) await this.rpc.request(\"turn/interrupt\", { threadId: this.threadId, turnId: active.id });\n } catch {\n const stopping = this.finish(active, undefined, new AgentError(\"CANCELLATION_FAILED\", \"Codex could not confirm interruption after requesting input.\"));\n await this.rpc.close();\n await stopping;\n }\n })();\n }\n\n private async toolCall(id: string | number, params: any): Promise<void> {\n let result: ExecutedToolResult, success = false;\n try {\n const tools = this.options.agent.tools ?? {};\n if (params.namespace !== \"subharness\" || !Object.hasOwn(tools, params.tool)) throw new AgentError(\"TOOL_UNKNOWN\", \"Unknown tool.\");\n result = await executeTool(tools[params.tool]!, params.arguments);\n success = true;\n } catch (error) {\n result = error instanceof AgentError ? `Tool failed (${error.code}).` : \"Tool execution failed.\";\n }\n try { this.rpc.send({ id, result: { contentItems: codexContent(result), success } }); } catch { /* A cancelled native turn no longer accepts its tool result. */ }\n }\n\n async turn(prompt: string): Promise<string> {\n if (this.active) throw new AgentError(\"SESSION_BUSY\", \"Codex already has an active turn.\");\n let resolve!: (text: string) => void, reject!: (error: Error) => void;\n const completion = new Promise<string>((a, b) => { resolve = a; reject = b; });\n const active: ActiveTurn = { messages: new Map(), tools: new Set(), acceptingTools: true, resolve, reject, completion };\n this.active = active;\n void completion.catch(() => {});\n try {\n active.started = this.rpc.request(\"turn/start\", {\n threadId: this.threadId, input: [{ type: \"text\", text: prompt }], effort: this.options.harness.effort,\n model: this.model,\n serviceTierForTurn: this.options.harness.fast ? \"fast\" : \"default\",\n }).then(result => { active.id = result.turn.id; });\n await active.started;\n return await completion;\n } catch (error) { if (this.active === active) this.active = undefined; throw error; }\n }\n\n async steer(prompt: string): Promise<void> {\n const active = this.active;\n await active?.started;\n if (!active?.id || this.active !== active) throw new AgentError(\"UNSUPPORTED_DELIVERY\", \"Codex has no active turn to steer.\");\n await this.rpc.request(\"turn/steer\", { threadId: this.threadId, expectedTurnId: active.id, input: [{ type: \"text\", text: prompt }] });\n }\n\n async interrupt(): Promise<void> {\n const active = this.active;\n if (!active) return;\n active.acceptingTools = false;\n await active.started;\n if (this.active !== active) return;\n if (!active.terminal) await this.rpc.request(\"turn/interrupt\", { threadId: this.threadId, turnId: active.id });\n try { await active.completion; } catch (error) {\n if (!(error instanceof AgentError) || error.code !== \"INTERRUPTED\") throw error;\n }\n }\n\n async resume(): Promise<string> { throw new AgentError(\"RECOVERY_UNSUPPORTED\", \"Codex does not expose retry of a failed turn without replay.\"); }\n async close(): Promise<void> {\n const active = this.active;\n if (active) active.acceptingTools = false;\n await this.rpc.close();\n if (active) await Promise.allSettled([...active.tools]);\n }\n}\n\nfunction codexContent(result: ExecutedToolResult) {\n if (typeof result === \"string\") return [{ type: \"inputText\" as const, text: result }];\n return result.content.map(block => block.type === \"text\"\n ? { type: \"inputText\" as const, text: block.text }\n : { type: \"inputImage\" as const, imageUrl: `data:${block.mimeType};base64,${block.data}` });\n}\n"]}
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/adapters/codex.ts"],"names":[],"mappings":"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","sourcesContent":["import { AgentError } from \"../errors.js\";\nimport { executeTool, toolJsonSchema } from \"../sdk/tools.js\";\nimport type { ExecutedToolResult } from \"../sdk/tool-result.js\";\nimport { NativeRpc } from \"./rpc.js\";\nimport { codexEnvironment, codexConfiguration, validateCodexModel } from \"./codex-config.js\";\nimport { NativeApprovals } from \"./approval-lifetime.js\";\nimport { codexApproval } from \"./codex-approvals.js\";\nimport { codexInputRequired } from \"./codex-input.js\";\nimport { codexPermissionSettings, verifyCodexPermissionSettings } from \"./codex-permissions.js\";\nimport type { AdapterOptions, NativeSession } from \"./types.js\";\n\ntype ActiveTurn = {\n id?: string;\n messages: Map<string, { text: string; final: boolean }>;\n resolve(text: string): void;\n reject(error: Error): void;\n completion: Promise<string>;\n started?: Promise<void>;\n failure?: AgentError;\n tools: Set<Promise<void>>;\n terminal?: boolean;\n acceptingTools: boolean;\n approvals: NativeApprovals;\n items: Map<string, unknown>;\n withdrawnApprovals: Set<string | number>;\n};\n\nexport async function openCodex(options: AdapterOptions): Promise<NativeSession> {\n const env = codexEnvironment(options);\n const rpc = new NativeRpc(\"codex\", [\"app-server\", \"--stdio\"], options.cwd, env);\n rpc.onMessage = message => {\n if (message.id !== undefined) rpc.abort(codexInputRequired(message.method));\n };\n try {\n await rpc.request(\"initialize\", { clientInfo: { name: \"subharness\", version: \"0.1.0\" }, capabilities: { experimentalApi: true } });\n rpc.send({ method: \"initialized\", params: {} });\n const configuration = await codexConfiguration(rpc, options);\n if (options.harness.kind !== \"codex\") throw new AgentError(\"INVALID_CONFIG\", \"Codex received a configuration for another harness.\");\n const permissions = codexPermissionSettings(options.harness);\n const result = await rpc.request(\"thread/start\", {\n ...(options.harness.model ? { model: options.harness.model } : {}), ...configuration, ...permissions.thread, allowProviderModelFallback: false,\n config: { ...configuration.config, ...permissions.config, ...(options.harness.effort ? { model_reasoning_effort: options.harness.effort } : {}), \"features.fast_mode\": options.harness.fast },\n dynamicTools: Object.keys(options.agent.tools ?? {}).length ? [{\n type: \"namespace\", name: \"subharness\", description: \"Tools declared by this agent.\",\n tools: Object.entries(options.agent.tools ?? {}).map(([name, definition]) => ({ type: \"function\", name, description: definition.description, inputSchema: toolJsonSchema(definition) })),\n }] : [],\n cwd: options.cwd, serviceTier: options.harness.fast ? \"fast\" : null,\n });\n if (typeof result.thread?.id !== \"string\") throw new AgentError(\"PROTOCOL_ERROR\", \"Codex did not return a native thread identifier.\");\n if (typeof result.model !== \"string\" || result.model.length === 0) {\n throw new AgentError(\"INVALID_CONFIG\", \"Codex could not select a native default for this connection. Supply --model <model>.\");\n }\n if ((options.harness.model && result.model !== options.harness.model) || result.modelProvider !== configuration.modelProvider) {\n throw new AgentError(\"INVALID_CONFIG\", options.harness.model\n ? \"Codex changed the explicitly selected model or provider.\"\n : \"Codex could not select a verifiable native default for this connection. Supply --model <model>.\");\n }\n if (options.harness.effort && result.reasoningEffort !== options.harness.effort) {\n throw new AgentError(\"INVALID_CONFIG\", \"Codex did not apply the explicitly selected effort.\");\n }\n verifyCodexPermissionSettings(options.harness, result);\n await validateCodexModel(rpc, options, result.model);\n const requestedTier = options.harness.fast ? \"fast\" : \"default\";\n if ((options.harness.fast && result.serviceTier !== \"fast\") || (result.serviceTier != null && result.serviceTier !== requestedTier)) throw new AgentError(\"INVALID_CONFIG\", \"Codex did not accept the requested speed setting.\");\n return new CodexSession(rpc, result.thread.id, result.model, options);\n } catch (error) { await rpc.close(); throw error; }\n}\n\nclass CodexSession implements NativeSession {\n private active?: ActiveTurn;\n\n constructor(private rpc: NativeRpc, private threadId: string, private model: string, private options: AdapterOptions) {\n rpc.onFailure = error => {\n const active = this.active;\n if (active) void this.finish(active, undefined, error);\n };\n rpc.onMessage = message => {\n const p = message.params;\n const current = this.active;\n if (p?.threadId !== this.threadId || !current) return;\n void Promise.resolve(current.started).then(() => {\n if (this.active !== current || current.terminal) return;\n const turnId = p.turnId ?? p.turn?.id;\n if (turnId && turnId !== current.id) return;\n if (message.method === \"serverRequest/resolved\") {\n current.withdrawnApprovals.add(p.requestId);\n current.approvals.withdraw(p.requestId);\n return;\n }\n if (message.method === \"item/started\" && p.item?.type === \"fileChange\") current.items.set(p.item.id, p.item);\n if (message.method === \"item/tool/call\" && message.id !== undefined) {\n if (!current.acceptingTools) {\n this.rpc.send({ id: message.id, result: { success: false, contentItems: [{ type: \"inputText\", text: \"The task is not accepting tool calls.\" }] } });\n return;\n }\n const call = this.toolCall(message.id, p);\n current.tools.add(call);\n void call.finally(() => current.tools.delete(call));\n return;\n }\n if (message.id !== undefined) {\n if (this.options.onApproval && current.acceptingTools) {\n try {\n const approval = codexApproval(message.method, p, current.items.get(p.itemId));\n if (approval) {\n void current.approvals.request(message.id, approval.request, this.options.onApproval).then(content => {\n if (this.active === current && !current.terminal && current.acceptingTools && !current.withdrawnApprovals.has(message.id!)) this.rpc.send({id:message.id,result:approval.response(content)});\n }).catch(error => {\n if (!(error instanceof AgentError && error.code === \"REQUEST_EXPIRED\")) this.stopForInput(message.method);\n });\n return;\n }\n } catch { /* Unsupported native requests use the explicit input failure path. */ }\n }\n this.stopForInput(message.method);\n return;\n }\n if (message.method === \"item/completed\" && p.item?.type === \"agentMessage\") {\n if (typeof p.item.id !== \"string\" || typeof p.item.text !== \"string\") {\n current.failure = new AgentError(\"PROTOCOL_ERROR\", \"Codex sent an invalid turn event.\");\n void this.finish(current, undefined, current.failure);\n return;\n }\n current.messages.set(p.item.id, { text: p.item.text, final: p.item.phase === \"final_answer\" });\n }\n if (message.method === \"turn/completed\") void this.finish(current, p.turn);\n }).catch(() => {\n void this.finish(current, undefined, new AgentError(\"PROTOCOL_ERROR\", \"Codex sent an invalid turn event.\"));\n });\n };\n }\n\n private async finish(active: ActiveTurn, turn?: any, failure?: AgentError): Promise<void> {\n if (active.terminal) return;\n active.terminal = true;\n active.approvals.clear();\n active.acceptingTools = false;\n await Promise.allSettled([...active.tools]);\n if (this.active === active) this.active = undefined;\n if (failure) return active.reject(failure);\n if (active.failure) return active.reject(active.failure);\n if (typeof turn !== \"object\" || turn === null || !Array.isArray(turn.items)) {\n return active.reject(new AgentError(\"PROTOCOL_ERROR\", \"Codex sent an invalid turn event.\"));\n }\n for (const item of turn.items) {\n if (item?.type !== \"agentMessage\") continue;\n if (typeof item.id !== \"string\" || typeof item.text !== \"string\") {\n return active.reject(new AgentError(\"PROTOCOL_ERROR\", \"Codex sent an invalid turn event.\"));\n }\n active.messages.set(item.id, { text: item.text, final: item.phase === \"final_answer\" });\n }\n const messages = [...active.messages.values()].reverse();\n const text = messages.find(m => m.final)?.text ?? messages[0]?.text ?? \"\";\n if (Buffer.byteLength(text, \"utf8\") > 1024 * 1024) active.reject(new AgentError(\"RESPONSE_TOO_LARGE\", \"Codex response exceeds 1 MiB.\"));\n else if (turn?.status === \"completed\") active.resolve(text);\n else active.reject(new AgentError(turn?.status === \"interrupted\" ? \"INTERRUPTED\" : \"HARNESS_FAILED\", \"Codex did not complete the turn successfully.\"));\n }\n\n private stopForInput(method: unknown): void {\n const active = this.active;\n if (!active || active.failure) return;\n active.acceptingTools = false;\n active.approvals.clear();\n active.failure = codexInputRequired(method);\n void (async () => {\n try {\n await active.started;\n if (this.active === active) await this.rpc.request(\"turn/interrupt\", { threadId: this.threadId, turnId: active.id });\n } catch {\n const stopping = this.finish(active, undefined, new AgentError(\"CANCELLATION_FAILED\", \"Codex could not confirm interruption after requesting input.\"));\n await this.rpc.close();\n await stopping;\n }\n })();\n }\n\n private async toolCall(id: string | number, params: any): Promise<void> {\n let result: ExecutedToolResult, success = false;\n try {\n const tools = this.options.agent.tools ?? {};\n if (params.namespace !== \"subharness\" || !Object.hasOwn(tools, params.tool)) throw new AgentError(\"TOOL_UNKNOWN\", \"Unknown tool.\");\n result = await executeTool(tools[params.tool]!, params.arguments);\n success = true;\n } catch (error) {\n result = error instanceof AgentError ? `Tool failed (${error.code}).` : \"Tool execution failed.\";\n }\n try { this.rpc.send({ id, result: { contentItems: codexContent(result), success } }); } catch { /* A cancelled native turn no longer accepts its tool result. */ }\n }\n\n async turn(prompt: string): Promise<string> {\n if (this.active) throw new AgentError(\"SESSION_BUSY\", \"Codex already has an active turn.\");\n let resolve!: (text: string) => void, reject!: (error: Error) => void;\n const completion = new Promise<string>((a, b) => { resolve = a; reject = b; });\n const active: ActiveTurn = { messages: new Map(), tools: new Set(), approvals: new NativeApprovals(), items: new Map(), withdrawnApprovals: new Set(), acceptingTools: true, resolve, reject, completion };\n this.active = active;\n void completion.catch(() => {});\n try {\n active.started = this.rpc.request(\"turn/start\", {\n threadId: this.threadId, input: [{ type: \"text\", text: prompt }], effort: this.options.harness.effort,\n model: this.model,\n serviceTierForTurn: this.options.harness.fast ? \"fast\" : \"default\",\n }).then(result => { active.id = result.turn.id; });\n await active.started;\n return await completion;\n } catch (error) { if (this.active === active) this.active = undefined; throw error; }\n }\n\n async steer(prompt: string): Promise<void> {\n const active = this.active;\n await active?.started;\n if (!active?.id || this.active !== active) throw new AgentError(\"UNSUPPORTED_DELIVERY\", \"Codex has no active turn to steer.\");\n await this.rpc.request(\"turn/steer\", { threadId: this.threadId, expectedTurnId: active.id, input: [{ type: \"text\", text: prompt }] });\n }\n\n async interrupt(): Promise<void> {\n const active = this.active;\n if (!active) return;\n active.acceptingTools = false;\n active.approvals.clear();\n await active.started;\n if (this.active !== active) return;\n if (!active.terminal) await this.rpc.request(\"turn/interrupt\", { threadId: this.threadId, turnId: active.id });\n try { await active.completion; } catch (error) {\n if (!(error instanceof AgentError) || error.code !== \"INTERRUPTED\") throw error;\n }\n }\n\n async resume(): Promise<string> { throw new AgentError(\"RECOVERY_UNSUPPORTED\", \"Codex does not expose retry of a failed turn without replay.\"); }\n async close(): Promise<void> {\n const active = this.active;\n if (active) { active.acceptingTools = false; active.approvals.clear(); }\n await this.rpc.close();\n if (active) await Promise.allSettled([...active.tools]);\n }\n}\n\nfunction codexContent(result: ExecutedToolResult) {\n if (typeof result === \"string\") return [{ type: \"inputText\" as const, text: result }];\n return result.content.map(block => block.type === \"text\"\n ? { type: \"inputText\" as const, text: block.text }\n : { type: \"inputImage\" as const, imageUrl: `data:${block.mimeType};base64,${block.data}` });\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import type { NativeApprovalRequest } from "../approvals/types.js";
2
+ export declare function fxApproval(params: any): NativeApprovalRequest;
@@ -0,0 +1,14 @@
1
+ import { approvalContext } from "./approval-context.js";
2
+ import { AgentError } from "../errors.js";
3
+ export function fxApproval(params) {
4
+ const choices = params?.options;
5
+ if (!Array.isArray(choices) || !choices.length || choices.some(choice => !choice || typeof choice.optionId !== "string" || !choice.optionId || typeof choice.name !== "string"
6
+ || !["allow_once", "allow_always", "reject_once", "reject_always"].includes(choice.kind)) || new Set(choices.map(choice => choice.optionId)).size !== choices.length
7
+ || !params.toolCall || typeof params.toolCall !== "object" || Array.isArray(params.toolCall)) {
8
+ throw new AgentError("INPUT_REQUIRED", "fx requested a permission that cannot be represented safely.");
9
+ }
10
+ return { kind: "permission", harness: "fx", message: typeof params.toolCall.title === "string" ? params.toolCall.title : "Choose a response to the native tool permission request.",
11
+ requestedSchema: { type: "object", properties: { decision: { type: "string", oneOf: choices.map(choice => ({ const: choice.optionId, title: choice.name })) } }, required: ["decision"] },
12
+ context: { sessionId: params.sessionId, toolCall: approvalContext(params.toolCall, ["toolCallId", "name", "title", "kind", "status", "rawInput", "content", "locations"]), options: choices.map(choice => approvalContext(choice, ["optionId", "name", "kind"])), reuseScope: "session" } };
13
+ }
14
+ //# sourceMappingURL=fx-approvals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fx-approvals.js","sourceRoot":"","sources":["../../src/adapters/fx-approvals.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG1C,MAAM,UAAU,UAAU,CAAC,MAAW;IACpC,MAAM,OAAO,GAAC,MAAM,EAAE,OAAO,CAAC;IAC9B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAA,EAAE,CAAA,CAAC,MAAM,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;WACvK,CAAC,CAAC,YAAY,EAAC,cAAc,EAAC,aAAa,EAAC,eAAe,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAA,EAAE,CAAA,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,MAAM;WAC5J,CAAC,MAAM,CAAC,QAAQ,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/F,MAAM,IAAI,UAAU,CAAC,gBAAgB,EAAC,8DAA8D,CAAC,CAAC;IACxG,CAAC;IACD,OAAO,EAAC,IAAI,EAAC,YAAY,EAAC,OAAO,EAAC,IAAI,EAAC,OAAO,EAAC,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,0DAA0D;QAC3K,eAAe,EAAC,EAAC,IAAI,EAAC,QAAQ,EAAC,UAAU,EAAC,EAAC,QAAQ,EAAC,EAAC,IAAI,EAAC,QAAQ,EAAC,KAAK,EAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAA,EAAE,CAAA,CAAC,EAAC,KAAK,EAAC,MAAM,CAAC,QAAQ,EAAC,KAAK,EAAC,MAAM,CAAC,IAAI,EAAC,CAAC,CAAC,EAAC,EAAC,EAAC,QAAQ,EAAC,CAAC,UAAU,CAAC,EAAC;QAClK,OAAO,EAAC,EAAC,SAAS,EAAC,MAAM,CAAC,SAAS,EAAC,QAAQ,EAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,EAAC,CAAC,YAAY,EAAC,MAAM,EAAC,OAAO,EAAC,MAAM,EAAC,QAAQ,EAAC,UAAU,EAAC,SAAS,EAAC,WAAW,CAAC,CAAC,EAAC,OAAO,EAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAA,EAAE,CAAA,eAAe,CAAC,MAAM,EAAC,CAAC,UAAU,EAAC,MAAM,EAAC,MAAM,CAAC,CAAC,CAAC,EAAC,UAAU,EAAC,SAAS,EAAC,EAAC,CAAC;AACxQ,CAAC","sourcesContent":["import { approvalContext } from \"./approval-context.js\";\nimport { AgentError } from \"../errors.js\";\nimport type { NativeApprovalRequest } from \"../approvals/types.js\";\n\nexport function fxApproval(params: any): NativeApprovalRequest {\n const choices=params?.options;\n if (!Array.isArray(choices) || !choices.length || choices.some(choice=>!choice || typeof choice.optionId !== \"string\" || !choice.optionId || typeof choice.name !== \"string\"\n || ![\"allow_once\",\"allow_always\",\"reject_once\",\"reject_always\"].includes(choice.kind)) || new Set(choices.map(choice=>choice.optionId)).size !== choices.length\n || !params.toolCall || typeof params.toolCall !== \"object\" || Array.isArray(params.toolCall)) {\n throw new AgentError(\"INPUT_REQUIRED\",\"fx requested a permission that cannot be represented safely.\");\n }\n return {kind:\"permission\",harness:\"fx\",message:typeof params.toolCall.title === \"string\" ? params.toolCall.title : \"Choose a response to the native tool permission request.\",\n requestedSchema:{type:\"object\",properties:{decision:{type:\"string\",oneOf:choices.map(choice=>({const:choice.optionId,title:choice.name}))}},required:[\"decision\"]},\n context:{sessionId:params.sessionId,toolCall:approvalContext(params.toolCall,[\"toolCallId\",\"name\",\"title\",\"kind\",\"status\",\"rawInput\",\"content\",\"locations\"]),options:choices.map(choice=>approvalContext(choice,[\"optionId\",\"name\",\"kind\"])),reuseScope:\"session\"}};\n}\n"]}
@@ -1,3 +1,5 @@
1
+ import { NativeApprovals } from "./approval-lifetime.js";
2
+ import { fxApproval } from "./fx-approvals.js";
1
3
  import { AgentError } from "../errors.js";
2
4
  import { fxEnvironment, fxSettingsFingerprint, verifyFxAccess } from "./fx-auth.js";
3
5
  import { FxRpc } from "./fx-rpc.js";
@@ -114,6 +116,7 @@ class FxSession {
114
116
  rpc.setFailureHandler(error => {
115
117
  this.failure ??= error;
116
118
  const active = this.active;
119
+ active?.approvals.clear();
117
120
  this.retirement ??= this.rpc.close();
118
121
  if (active)
119
122
  void this.retirement.then(() => this.finish(active, undefined, error));
@@ -123,27 +126,29 @@ class FxSession {
123
126
  message(message) {
124
127
  const active = this.active;
125
128
  const params = message.params;
129
+ if (message.method === "$/cancel_request" && active && (typeof params?.requestId === "string" || typeof params?.requestId === "number")) {
130
+ active.withdrawnApprovals.add(params.requestId);
131
+ active.approvals.withdraw(params.requestId);
132
+ return;
133
+ }
126
134
  if (message.id !== undefined) {
127
- try {
128
- this.rpc.send({ id: message.id, result: { outcome: { outcome: "cancelled" } } });
129
- }
130
- catch { /* cancellation will surface the transport failure */ }
131
- if (!active) {
132
- this.rpc.abort(new AgentError("INPUT_REQUIRED", "fx requested interactive input outside an active task."));
133
- }
134
- else if (!active.failure) {
135
- active.failure = new AgentError("INPUT_REQUIRED", "fx requested interactive input or approval. Configure native permissions before retrying; no approval was granted.");
136
- this.tools.stopAdmission();
135
+ if (active && active.submitted && !active.terminal && !active.cancelRequested && !active.failure && params?.sessionId === this.sessionId
136
+ && message.method === "session/request_permission" && this.options.onApproval) {
137
137
  try {
138
- this.rpc.send({ method: "session/cancel", params: { sessionId: this.sessionId } });
138
+ const request = fxApproval(params);
139
+ void active.approvals.request(message.id, request, this.options.onApproval).then(content => {
140
+ if (this.active === active && !active.terminal && !active.cancelRequested && !active.failure && !active.withdrawnApprovals.has(message.id)) {
141
+ this.rpc.send({ id: message.id, result: { outcome: { outcome: "selected", optionId: content.decision } } });
142
+ }
143
+ }).catch(error => {
144
+ if (!(error instanceof AgentError && error.code === "REQUEST_EXPIRED"))
145
+ this.unsupportedRequest(message, active);
146
+ });
147
+ return;
139
148
  }
140
- catch { /* onFailure settles the turn */ }
141
- active.cancellationTimer = setTimeout(() => {
142
- if (this.active === active && !active.terminal)
143
- this.rpc.abort(new AgentError("CANCELLATION_FAILED", "fx did not stop after requesting interactive input."));
144
- }, 2_000);
145
- active.cancellationTimer.unref();
149
+ catch { /* Unsupported requests retain the explicit input failure path. */ }
146
150
  }
151
+ this.unsupportedRequest(message, active);
147
152
  return;
148
153
  }
149
154
  if (params?.sessionId !== this.sessionId)
@@ -173,10 +178,34 @@ class FxSession {
173
178
  else
174
179
  active.text += update.content.text;
175
180
  }
181
+ unsupportedRequest(message, active) {
182
+ try {
183
+ this.rpc.send({ id: message.id, result: { outcome: { outcome: "cancelled" } } });
184
+ }
185
+ catch { /* cancellation will surface the transport failure */ }
186
+ if (!active) {
187
+ this.rpc.abort(new AgentError("INPUT_REQUIRED", "fx requested interactive input outside an active task."));
188
+ }
189
+ else if (!active.failure) {
190
+ active.failure = new AgentError("INPUT_REQUIRED", "fx requested interactive input or approval. Configure native permissions before retrying; no approval was granted.");
191
+ active.approvals.clear();
192
+ this.tools.stopAdmission();
193
+ try {
194
+ this.rpc.send({ method: "session/cancel", params: { sessionId: this.sessionId } });
195
+ }
196
+ catch { /* onFailure settles the turn */ }
197
+ active.cancellationTimer = setTimeout(() => {
198
+ if (this.active === active && !active.terminal)
199
+ this.rpc.abort(new AgentError("CANCELLATION_FAILED", "fx did not stop after requesting interactive input."));
200
+ }, 2_000);
201
+ active.cancellationTimer.unref();
202
+ }
203
+ }
176
204
  async finish(active, result, failure) {
177
205
  if (active.terminal)
178
206
  return;
179
207
  active.terminal = true;
208
+ active.approvals.clear();
180
209
  active.resolveNativeStopped();
181
210
  if (active.cancellationTimer)
182
211
  clearTimeout(active.cancellationTimer);
@@ -208,7 +237,7 @@ class FxSession {
208
237
  const completion = new Promise((a, b) => { resolve = a; reject = b; });
209
238
  const admission = new Promise(resolveAdmission => { releaseAdmission = resolveAdmission; });
210
239
  const nativeStopped = new Promise(resolveStopped => { resolveNativeStopped = resolveStopped; });
211
- const active = { text: "", responseBytes: 0, responseTooLarge: false, completion, resolve, reject, terminal: false, submitted: false, cancelRequested: false, admission, releaseAdmission, nativeStopped, resolveNativeStopped };
240
+ const active = { approvals: new NativeApprovals(), withdrawnApprovals: new Set(), text: "", responseBytes: 0, responseTooLarge: false, completion, resolve, reject, terminal: false, submitted: false, cancelRequested: false, admission, releaseAdmission, nativeStopped, resolveNativeStopped };
212
241
  this.active = active;
213
242
  void completion.catch(() => { });
214
243
  try {
@@ -248,6 +277,7 @@ class FxSession {
248
277
  if (!active)
249
278
  return;
250
279
  active.cancelRequested = true;
280
+ active.approvals.clear();
251
281
  this.tools.stopAdmission();
252
282
  await bounded(active.admission, 2_000);
253
283
  const admittedTools = this.tools.drain();
@@ -276,6 +306,7 @@ class FxSession {
276
306
  try {
277
307
  if (this.active) {
278
308
  this.active.cancelRequested = true;
309
+ this.active.approvals.clear();
279
310
  await bounded(this.active.admission, 2_000);
280
311
  if (this.active.submitted && !this.active.terminal)
281
312
  this.rpc.send({ method: "session/cancel", params: { sessionId: this.sessionId } });
@@ -1 +1 @@
1
- {"version":3,"file":"fx.js","sourceRoot":"","sources":["../../src/adapters/fx.ts"],"names":[],"mappings":"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","sourcesContent":["import { AgentError } from \"../errors.js\";\nimport { fxEnvironment, fxSettingsFingerprint, verifyFxAccess } from \"./fx-auth.js\";\nimport { FxRpc, type AcpEnvelope } from \"./fx-rpc.js\";\nimport { verifyFxPermissionMode } from \"./fx-permissions.js\";\nimport { startFxTools, type FxToolEndpoint } from \"./fx-tools.js\";\nimport type { AdapterOptions, NativeSession } from \"./types.js\";\n\ntype ActiveTurn = {\n lastMessageId?: string;\n text: string;\n responseBytes: number;\n responseTooLarge: boolean;\n completion: Promise<string>;\n resolve(text: string): void;\n reject(error: Error): void;\n terminal: boolean;\n submitted: boolean;\n cancelRequested: boolean;\n admission: Promise<void>;\n releaseAdmission(): void;\n nativeStopped: Promise<void>;\n resolveNativeStopped(): void;\n cancellationTimer?: NodeJS.Timeout;\n failure?: AgentError;\n};\n\nexport async function openFx(\n options: AdapterOptions,\n createRpc: (cwd: string, env: NodeJS.ProcessEnv, model?: string) => FxRpc = (cwd, env, model) => new FxRpc(cwd, env, model),\n): Promise<NativeSession> {\n if (options.harness.kind !== \"fx\") throw new AgentError(\"INVALID_CONFIG\", \"fx received configuration for a different harness.\");\n const env = fxEnvironment(options);\n const baseline = await fxSettingsFingerprint(env);\n await verifyFxAccess(options.cwd, env, options.access.type);\n await verifyFxPermissionMode(options.cwd, env, options.harness.permissionMode);\n const tools = await startFxTools(options.agent);\n let rpc: FxRpc | undefined;\n try {\n const startedRpc = createRpc(options.cwd, env, options.harness.model);\n rpc = startedRpc;\n let startupFailure: AgentError | undefined;\n startedRpc.setFailureHandler(error => { startupFailure ??= error; });\n tools.onFailure(error => startedRpc.abort(error));\n startedRpc.onMessage = message => startupRequest(startedRpc, message);\n const initialized = await startedRpc.request(\"initialize\", { protocolVersion: 1, clientInfo: { name: \"subharness\", version: \"0.1.0\" }, clientCapabilities: {} });\n if (!initialized || typeof initialized !== \"object\" || Array.isArray(initialized) || typeof initialized.protocolVersion !== \"number\") {\n throw new AgentError(\"PROTOCOL_ERROR\", \"fx returned an invalid ACP initialization response.\");\n }\n if (initialized.protocolVersion !== 1) throw new AgentError(\"HARNESS_UNAVAILABLE\", \"The installed fx ACP protocol is not compatible with version 1.\");\n const created = await startedRpc.request(\"session/new\", {\n cwd: options.cwd,\n mcpServers: tools.descriptor ? [tools.descriptor] : [],\n });\n if (typeof created?.sessionId !== \"string\" || created.sessionId.length === 0) throw new AgentError(\"PROTOCOL_ERROR\", \"fx did not return a native session identifier.\");\n const selectedModel = verifySelection(created.configOptions, options.harness.model);\n if (options.harness.effort !== undefined) {\n verifyEffortAvailable(created.configOptions, options.harness.effort);\n const configured = await startedRpc.request(\"session/set_config_option\", { sessionId: created.sessionId, configId: \"effort\", value: options.harness.effort });\n verifySelection(configured?.configOptions, selectedModel, options.harness.effort);\n }\n if (await fxSettingsFingerprint(env) !== baseline) throw new AgentError(\"INVALID_CONFIG\", \"fx native settings changed during session startup. Start a new session.\");\n if (startupFailure) throw startupFailure;\n return new FxSession(startedRpc, created.sessionId, options, env, baseline, tools);\n } catch (error) {\n await rpc?.close();\n await tools.close();\n if (error instanceof AgentError) throw error;\n throw new AgentError(\"HARNESS_UNAVAILABLE\", \"Cannot start fx. Check the native executable and session configuration.\");\n }\n}\n\nfunction startupRequest(rpc: FxRpc, message: AcpEnvelope): void {\n if (message.id === undefined) return;\n try { rpc.send({ id: message.id, result: { outcome: { outcome: \"cancelled\" } } }); } catch { /* process may already be closing */ }\n rpc.abort(new AgentError(\"INPUT_REQUIRED\", \"fx requested interactive input during startup. Complete its native setup before running an agent.\"));\n}\n\nfunction option(options: unknown, id: string): any {\n if (!Array.isArray(options)) throw new AgentError(\"PROTOCOL_ERROR\", \"fx returned invalid native session options.\");\n return options.find(value => value && typeof value === \"object\" && (value as any).id === id);\n}\n\nfunction verifySelection(configOptions: unknown, requestedModel?: string, effort?: string): string {\n const provider = option(configOptions, \"provider\");\n const selectedModel = option(configOptions, \"model\");\n if (!provider || !selectedModel) {\n throw new AgentError(\"PROTOCOL_ERROR\", \"fx did not expose compatible native provider and model selectors.\");\n }\n if (provider.currentValue !== \"gateway\") {\n throw new AgentError(\"INVALID_CONFIG\", \"fx selected a provider outside the authorized Gateway route.\");\n }\n const model = selectedModel.currentValue;\n if (typeof model !== \"string\" || model.length === 0) {\n throw new AgentError(\"INVALID_CONFIG\", \"fx could not select a verifiable native default for this connection. Supply --model <model>.\");\n }\n if (requestedModel && model !== requestedModel) {\n throw new AgentError(\"INVALID_CONFIG\", \"fx changed the explicitly selected Gateway model.\");\n }\n if (effort !== undefined && option(configOptions, \"effort\")?.currentValue !== effort) {\n throw new AgentError(\"INVALID_CONFIG\", \"fx did not apply the explicitly selected effort.\");\n }\n return model;\n}\n\nfunction verifyEffortAvailable(configOptions: unknown, effort: string): void {\n const configured = option(configOptions, \"effort\");\n if (!configured || !Array.isArray(configured.options) || !configured.options.some((value: any) => value?.value === effort)) {\n throw new AgentError(\"UNSUPPORTED_OPTION\", \"The requested fx effort is not supported by the selected model.\");\n }\n}\n\nclass FxSession implements NativeSession {\n private active?: ActiveTurn;\n private failure?: AgentError;\n private retirement?: Promise<void>;\n private first = true;\n private closed = false;\n\n constructor(\n private readonly rpc: FxRpc,\n private readonly sessionId: string,\n private readonly options: AdapterOptions,\n private readonly env: NodeJS.ProcessEnv,\n private readonly settingsFingerprint: string,\n private readonly tools: FxToolEndpoint,\n ) {\n rpc.setFailureHandler(error => {\n this.failure ??= error;\n const active = this.active;\n this.retirement ??= this.rpc.close();\n if (active) void this.retirement.then(() => this.finish(active, undefined, error));\n });\n rpc.onMessage = message => this.message(message);\n }\n\n private message(message: AcpEnvelope): void {\n const active = this.active;\n const params = message.params;\n if (message.id !== undefined) {\n try { this.rpc.send({ id: message.id, result: { outcome: { outcome: \"cancelled\" } } }); } catch { /* cancellation will surface the transport failure */ }\n if (!active) {\n this.rpc.abort(new AgentError(\"INPUT_REQUIRED\", \"fx requested interactive input outside an active task.\"));\n } else if (!active.failure) {\n active.failure = new AgentError(\"INPUT_REQUIRED\", \"fx requested interactive input or approval. Configure native permissions before retrying; no approval was granted.\");\n this.tools.stopAdmission();\n try { this.rpc.send({ method: \"session/cancel\", params: { sessionId: this.sessionId } }); } catch { /* onFailure settles the turn */ }\n active.cancellationTimer = setTimeout(() => {\n if (this.active === active && !active.terminal) this.rpc.abort(new AgentError(\"CANCELLATION_FAILED\", \"fx did not stop after requesting interactive input.\"));\n }, 2_000);\n active.cancellationTimer.unref();\n }\n return;\n }\n if (params?.sessionId !== this.sessionId) return;\n if (!active || message.method !== \"session/update\") return;\n const update = params.update;\n if (!update || typeof update !== \"object\" || typeof update.sessionUpdate !== \"string\") {\n this.rpc.abort(new AgentError(\"PROTOCOL_ERROR\", \"fx returned an invalid ACP session update.\"));\n return;\n }\n if (update.sessionUpdate !== \"agent_message_chunk\") return;\n if (typeof update.messageId !== \"string\" || update.content?.type !== \"text\" || typeof update.content.text !== \"string\") {\n this.rpc.abort(new AgentError(\"PROTOCOL_ERROR\", \"fx returned an invalid agent message chunk.\"));\n return;\n }\n if (active.lastMessageId !== update.messageId) {\n active.lastMessageId = update.messageId;\n active.text = \"\";\n active.responseBytes = 0;\n active.responseTooLarge = false;\n }\n active.responseBytes += Buffer.byteLength(update.content.text, \"utf8\");\n if (active.responseBytes > 1024 * 1024) active.responseTooLarge = true;\n else active.text += update.content.text;\n }\n\n private async finish(active: ActiveTurn, result?: any, failure?: AgentError): Promise<void> {\n if (active.terminal) return;\n active.terminal = true;\n active.resolveNativeStopped();\n if (active.cancellationTimer) clearTimeout(active.cancellationTimer);\n this.tools.stopAdmission();\n await this.tools.drain();\n if (this.active === active) this.active = undefined;\n if (failure) return active.reject(failure);\n if (active.failure) return active.reject(active.failure);\n if (active.responseTooLarge) return active.reject(new AgentError(\"RESPONSE_TOO_LARGE\", \"fx response exceeds 1 MiB.\"));\n if (result?.stopReason === \"end_turn\") active.resolve(active.text);\n else active.reject(new AgentError(result?.stopReason === \"cancelled\" ? \"INTERRUPTED\" : \"HARNESS_FAILED\", \"fx did not complete the turn successfully.\"));\n }\n\n async turn(prompt: string): Promise<string> {\n if (this.closed) throw new AgentError(\"HARNESS_FAILED\", \"The fx session is closed.\");\n if (this.failure) throw this.failure;\n if (this.active) throw new AgentError(\"SESSION_BUSY\", \"fx already has an active turn.\");\n let resolve!: (text: string) => void, reject!: (error: Error) => void;\n let releaseAdmission!: () => void;\n let resolveNativeStopped!: () => void;\n const completion = new Promise<string>((a, b) => { resolve = a; reject = b; });\n const admission = new Promise<void>(resolveAdmission => { releaseAdmission = resolveAdmission; });\n const nativeStopped = new Promise<void>(resolveStopped => { resolveNativeStopped = resolveStopped; });\n const active: ActiveTurn = { text: \"\", responseBytes: 0, responseTooLarge: false, completion, resolve, reject, terminal: false, submitted: false, cancelRequested: false, admission, releaseAdmission, nativeStopped, resolveNativeStopped };\n this.active = active;\n void completion.catch(() => {});\n try {\n if (await fxSettingsFingerprint(this.env) !== this.settingsFingerprint) {\n throw new AgentError(\"INVALID_CONFIG\", \"fx native settings changed while the session was active. Start a new session.\");\n }\n if (this.failure) throw this.failure;\n if (active.terminal || this.active !== active) throw new AgentError(\"HARNESS_FAILED\", \"fx stopped while preparing the native prompt.\");\n if (active.cancelRequested || this.closed) throw new AgentError(\"INTERRUPTED\", \"The fx turn was interrupted before submission.\");\n this.tools.beginTurn();\n const includeInstructions = this.first;\n const text = includeInstructions && this.options.agent.instructions ? firstPrompt(this.options.agent.instructions, prompt) : prompt;\n active.submitted = true;\n active.releaseAdmission();\n const result = await this.rpc.request(\"session/prompt\", { sessionId: this.sessionId, prompt: [{ type: \"text\", text }] });\n if (includeInstructions) this.first = false;\n await this.finish(active, result);\n return await completion;\n } catch (error) {\n active.releaseAdmission();\n if (this.failure && this.retirement) await this.retirement;\n await this.finish(active, undefined, error instanceof AgentError ? error : new AgentError(\"HARNESS_FAILED\", \"fx could not complete the native prompt.\"));\n return await completion;\n }\n }\n\n async steer(_prompt: string): Promise<void> {\n throw new AgentError(\"UNSUPPORTED_DELIVERY\", \"fx does not expose verified active steering.\");\n }\n\n async interrupt(): Promise<void> {\n const active = this.active;\n if (!active) return;\n active.cancelRequested = true;\n this.tools.stopAdmission();\n await bounded(active.admission, 2_000);\n const admittedTools = this.tools.drain();\n let cancellationFailure: unknown;\n try {\n if (active.submitted && !active.terminal) this.rpc.send({ method: \"session/cancel\", params: { sessionId: this.sessionId } });\n } catch (error) {\n cancellationFailure = error;\n }\n await admittedTools;\n if (cancellationFailure && !this.failure) throw cancellationFailure;\n await bounded(active.nativeStopped, 3_000);\n await active.completion.catch(() => {});\n }\n\n async resume(): Promise<string> {\n throw new AgentError(\"RECOVERY_UNSUPPORTED\", \"fx recovery without a new prompt is unavailable.\");\n }\n\n async close(): Promise<void> {\n if (this.closed) return;\n this.closed = true;\n this.tools.stopAdmission();\n try {\n if (this.active) {\n this.active.cancelRequested = true;\n await bounded(this.active.admission, 2_000);\n if (this.active.submitted && !this.active.terminal) this.rpc.send({ method: \"session/cancel\", params: { sessionId: this.sessionId } });\n }\n await bounded(this.rpc.request(\"session/close\", { sessionId: this.sessionId }), 2_000);\n } catch { /* process termination below still retires the session */ }\n await this.rpc.close();\n await this.tools.close();\n }\n}\n\nfunction firstPrompt(instructions: string, prompt: string): string {\n return `<subharness-instructions>\\n${instructions}\\n</subharness-instructions>\\n\\n${prompt}`;\n}\n\nasync function bounded<T>(promise: Promise<T>, milliseconds: number): Promise<T> {\n let timer!: NodeJS.Timeout;\n const timeout = new Promise<never>((_resolve, reject) => {\n timer = setTimeout(() => reject(new AgentError(\"CANCELLATION_FAILED\", \"fx did not confirm that native execution stopped.\")), milliseconds);\n timer.unref();\n });\n try { return await Promise.race([promise, timeout]); }\n finally { clearTimeout(timer); }\n}\n"]}
1
+ {"version":3,"file":"fx.js","sourceRoot":"","sources":["../../src/adapters/fx.ts"],"names":[],"mappings":"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","sourcesContent":["import { NativeApprovals } from \"./approval-lifetime.js\";\nimport { fxApproval } from \"./fx-approvals.js\";\nimport { AgentError } from \"../errors.js\";\nimport { fxEnvironment, fxSettingsFingerprint, verifyFxAccess } from \"./fx-auth.js\";\nimport { FxRpc, type AcpEnvelope } from \"./fx-rpc.js\";\nimport { verifyFxPermissionMode } from \"./fx-permissions.js\";\nimport { startFxTools, type FxToolEndpoint } from \"./fx-tools.js\";\nimport type { AdapterOptions, NativeSession } from \"./types.js\";\n\ntype ActiveTurn = {\n lastMessageId?: string;\n text: string;\n responseBytes: number;\n responseTooLarge: boolean;\n completion: Promise<string>;\n resolve(text: string): void;\n reject(error: Error): void;\n terminal: boolean;\n submitted: boolean;\n cancelRequested: boolean;\n admission: Promise<void>;\n releaseAdmission(): void;\n nativeStopped: Promise<void>;\n resolveNativeStopped(): void;\n cancellationTimer?: NodeJS.Timeout;\n failure?: AgentError;\n approvals: NativeApprovals;\n withdrawnApprovals: Set<string | number>;\n};\n\nexport async function openFx(\n options: AdapterOptions,\n createRpc: (cwd: string, env: NodeJS.ProcessEnv, model?: string) => FxRpc = (cwd, env, model) => new FxRpc(cwd, env, model),\n): Promise<NativeSession> {\n if (options.harness.kind !== \"fx\") throw new AgentError(\"INVALID_CONFIG\", \"fx received configuration for a different harness.\");\n const env = fxEnvironment(options);\n const baseline = await fxSettingsFingerprint(env);\n await verifyFxAccess(options.cwd, env, options.access.type);\n await verifyFxPermissionMode(options.cwd, env, options.harness.permissionMode);\n const tools = await startFxTools(options.agent);\n let rpc: FxRpc | undefined;\n try {\n const startedRpc = createRpc(options.cwd, env, options.harness.model);\n rpc = startedRpc;\n let startupFailure: AgentError | undefined;\n startedRpc.setFailureHandler(error => { startupFailure ??= error; });\n tools.onFailure(error => startedRpc.abort(error));\n startedRpc.onMessage = message => startupRequest(startedRpc, message);\n const initialized = await startedRpc.request(\"initialize\", { protocolVersion: 1, clientInfo: { name: \"subharness\", version: \"0.1.0\" }, clientCapabilities: {} });\n if (!initialized || typeof initialized !== \"object\" || Array.isArray(initialized) || typeof initialized.protocolVersion !== \"number\") {\n throw new AgentError(\"PROTOCOL_ERROR\", \"fx returned an invalid ACP initialization response.\");\n }\n if (initialized.protocolVersion !== 1) throw new AgentError(\"HARNESS_UNAVAILABLE\", \"The installed fx ACP protocol is not compatible with version 1.\");\n const created = await startedRpc.request(\"session/new\", {\n cwd: options.cwd,\n mcpServers: tools.descriptor ? [tools.descriptor] : [],\n });\n if (typeof created?.sessionId !== \"string\" || created.sessionId.length === 0) throw new AgentError(\"PROTOCOL_ERROR\", \"fx did not return a native session identifier.\");\n const selectedModel = verifySelection(created.configOptions, options.harness.model);\n if (options.harness.effort !== undefined) {\n verifyEffortAvailable(created.configOptions, options.harness.effort);\n const configured = await startedRpc.request(\"session/set_config_option\", { sessionId: created.sessionId, configId: \"effort\", value: options.harness.effort });\n verifySelection(configured?.configOptions, selectedModel, options.harness.effort);\n }\n if (await fxSettingsFingerprint(env) !== baseline) throw new AgentError(\"INVALID_CONFIG\", \"fx native settings changed during session startup. Start a new session.\");\n if (startupFailure) throw startupFailure;\n return new FxSession(startedRpc, created.sessionId, options, env, baseline, tools);\n } catch (error) {\n await rpc?.close();\n await tools.close();\n if (error instanceof AgentError) throw error;\n throw new AgentError(\"HARNESS_UNAVAILABLE\", \"Cannot start fx. Check the native executable and session configuration.\");\n }\n}\n\nfunction startupRequest(rpc: FxRpc, message: AcpEnvelope): void {\n if (message.id === undefined) return;\n try { rpc.send({ id: message.id, result: { outcome: { outcome: \"cancelled\" } } }); } catch { /* process may already be closing */ }\n rpc.abort(new AgentError(\"INPUT_REQUIRED\", \"fx requested interactive input during startup. Complete its native setup before running an agent.\"));\n}\n\nfunction option(options: unknown, id: string): any {\n if (!Array.isArray(options)) throw new AgentError(\"PROTOCOL_ERROR\", \"fx returned invalid native session options.\");\n return options.find(value => value && typeof value === \"object\" && (value as any).id === id);\n}\n\nfunction verifySelection(configOptions: unknown, requestedModel?: string, effort?: string): string {\n const provider = option(configOptions, \"provider\");\n const selectedModel = option(configOptions, \"model\");\n if (!provider || !selectedModel) {\n throw new AgentError(\"PROTOCOL_ERROR\", \"fx did not expose compatible native provider and model selectors.\");\n }\n if (provider.currentValue !== \"gateway\") {\n throw new AgentError(\"INVALID_CONFIG\", \"fx selected a provider outside the authorized Gateway route.\");\n }\n const model = selectedModel.currentValue;\n if (typeof model !== \"string\" || model.length === 0) {\n throw new AgentError(\"INVALID_CONFIG\", \"fx could not select a verifiable native default for this connection. Supply --model <model>.\");\n }\n if (requestedModel && model !== requestedModel) {\n throw new AgentError(\"INVALID_CONFIG\", \"fx changed the explicitly selected Gateway model.\");\n }\n if (effort !== undefined && option(configOptions, \"effort\")?.currentValue !== effort) {\n throw new AgentError(\"INVALID_CONFIG\", \"fx did not apply the explicitly selected effort.\");\n }\n return model;\n}\n\nfunction verifyEffortAvailable(configOptions: unknown, effort: string): void {\n const configured = option(configOptions, \"effort\");\n if (!configured || !Array.isArray(configured.options) || !configured.options.some((value: any) => value?.value === effort)) {\n throw new AgentError(\"UNSUPPORTED_OPTION\", \"The requested fx effort is not supported by the selected model.\");\n }\n}\n\nclass FxSession implements NativeSession {\n private active?: ActiveTurn;\n private failure?: AgentError;\n private retirement?: Promise<void>;\n private first = true;\n private closed = false;\n\n constructor(\n private readonly rpc: FxRpc,\n private readonly sessionId: string,\n private readonly options: AdapterOptions,\n private readonly env: NodeJS.ProcessEnv,\n private readonly settingsFingerprint: string,\n private readonly tools: FxToolEndpoint,\n ) {\n rpc.setFailureHandler(error => {\n this.failure ??= error;\n const active = this.active;\n active?.approvals.clear();\n this.retirement ??= this.rpc.close();\n if (active) void this.retirement.then(() => this.finish(active, undefined, error));\n });\n rpc.onMessage = message => this.message(message);\n }\n\n private message(message: AcpEnvelope): void {\n const active = this.active;\n const params = message.params;\n if (message.method === \"$/cancel_request\" && active && (typeof params?.requestId === \"string\" || typeof params?.requestId === \"number\")) {\n active.withdrawnApprovals.add(params.requestId);\n active.approvals.withdraw(params.requestId);\n return;\n }\n if (message.id !== undefined) {\n if (active && active.submitted && !active.terminal && !active.cancelRequested && !active.failure && params?.sessionId === this.sessionId\n && message.method === \"session/request_permission\" && this.options.onApproval) {\n try {\n const request = fxApproval(params);\n void active.approvals.request(message.id, request, this.options.onApproval).then(content => {\n if (this.active === active && !active.terminal && !active.cancelRequested && !active.failure && !active.withdrawnApprovals.has(message.id!)) {\n this.rpc.send({id:message.id,result:{outcome:{outcome:\"selected\",optionId:content.decision}}});\n }\n }).catch(error => {\n if (!(error instanceof AgentError && error.code === \"REQUEST_EXPIRED\")) this.unsupportedRequest(message, active);\n });\n return;\n } catch { /* Unsupported requests retain the explicit input failure path. */ }\n }\n this.unsupportedRequest(message, active);\n return;\n }\n if (params?.sessionId !== this.sessionId) return;\n if (!active || message.method !== \"session/update\") return;\n const update = params.update;\n if (!update || typeof update !== \"object\" || typeof update.sessionUpdate !== \"string\") {\n this.rpc.abort(new AgentError(\"PROTOCOL_ERROR\", \"fx returned an invalid ACP session update.\"));\n return;\n }\n if (update.sessionUpdate !== \"agent_message_chunk\") return;\n if (typeof update.messageId !== \"string\" || update.content?.type !== \"text\" || typeof update.content.text !== \"string\") {\n this.rpc.abort(new AgentError(\"PROTOCOL_ERROR\", \"fx returned an invalid agent message chunk.\"));\n return;\n }\n if (active.lastMessageId !== update.messageId) {\n active.lastMessageId = update.messageId;\n active.text = \"\";\n active.responseBytes = 0;\n active.responseTooLarge = false;\n }\n active.responseBytes += Buffer.byteLength(update.content.text, \"utf8\");\n if (active.responseBytes > 1024 * 1024) active.responseTooLarge = true;\n else active.text += update.content.text;\n }\n\n private unsupportedRequest(message: AcpEnvelope, active: ActiveTurn | undefined): void {\n try { this.rpc.send({ id: message.id, result: { outcome: { outcome: \"cancelled\" } } }); } catch { /* cancellation will surface the transport failure */ }\n if (!active) {\n this.rpc.abort(new AgentError(\"INPUT_REQUIRED\", \"fx requested interactive input outside an active task.\"));\n } else if (!active.failure) {\n active.failure = new AgentError(\"INPUT_REQUIRED\", \"fx requested interactive input or approval. Configure native permissions before retrying; no approval was granted.\");\n active.approvals.clear();\n this.tools.stopAdmission();\n try { this.rpc.send({ method: \"session/cancel\", params: { sessionId: this.sessionId } }); } catch { /* onFailure settles the turn */ }\n active.cancellationTimer = setTimeout(() => {\n if (this.active === active && !active.terminal) this.rpc.abort(new AgentError(\"CANCELLATION_FAILED\", \"fx did not stop after requesting interactive input.\"));\n }, 2_000);\n active.cancellationTimer.unref();\n }\n }\n\n private async finish(active: ActiveTurn, result?: any, failure?: AgentError): Promise<void> {\n if (active.terminal) return;\n active.terminal = true;\n active.approvals.clear();\n active.resolveNativeStopped();\n if (active.cancellationTimer) clearTimeout(active.cancellationTimer);\n this.tools.stopAdmission();\n await this.tools.drain();\n if (this.active === active) this.active = undefined;\n if (failure) return active.reject(failure);\n if (active.failure) return active.reject(active.failure);\n if (active.responseTooLarge) return active.reject(new AgentError(\"RESPONSE_TOO_LARGE\", \"fx response exceeds 1 MiB.\"));\n if (result?.stopReason === \"end_turn\") active.resolve(active.text);\n else active.reject(new AgentError(result?.stopReason === \"cancelled\" ? \"INTERRUPTED\" : \"HARNESS_FAILED\", \"fx did not complete the turn successfully.\"));\n }\n\n async turn(prompt: string): Promise<string> {\n if (this.closed) throw new AgentError(\"HARNESS_FAILED\", \"The fx session is closed.\");\n if (this.failure) throw this.failure;\n if (this.active) throw new AgentError(\"SESSION_BUSY\", \"fx already has an active turn.\");\n let resolve!: (text: string) => void, reject!: (error: Error) => void;\n let releaseAdmission!: () => void;\n let resolveNativeStopped!: () => void;\n const completion = new Promise<string>((a, b) => { resolve = a; reject = b; });\n const admission = new Promise<void>(resolveAdmission => { releaseAdmission = resolveAdmission; });\n const nativeStopped = new Promise<void>(resolveStopped => { resolveNativeStopped = resolveStopped; });\n const active: ActiveTurn = { approvals: new NativeApprovals(), withdrawnApprovals: new Set(), text: \"\", responseBytes: 0, responseTooLarge: false, completion, resolve, reject, terminal: false, submitted: false, cancelRequested: false, admission, releaseAdmission, nativeStopped, resolveNativeStopped };\n this.active = active;\n void completion.catch(() => {});\n try {\n if (await fxSettingsFingerprint(this.env) !== this.settingsFingerprint) {\n throw new AgentError(\"INVALID_CONFIG\", \"fx native settings changed while the session was active. Start a new session.\");\n }\n if (this.failure) throw this.failure;\n if (active.terminal || this.active !== active) throw new AgentError(\"HARNESS_FAILED\", \"fx stopped while preparing the native prompt.\");\n if (active.cancelRequested || this.closed) throw new AgentError(\"INTERRUPTED\", \"The fx turn was interrupted before submission.\");\n this.tools.beginTurn();\n const includeInstructions = this.first;\n const text = includeInstructions && this.options.agent.instructions ? firstPrompt(this.options.agent.instructions, prompt) : prompt;\n active.submitted = true;\n active.releaseAdmission();\n const result = await this.rpc.request(\"session/prompt\", { sessionId: this.sessionId, prompt: [{ type: \"text\", text }] });\n if (includeInstructions) this.first = false;\n await this.finish(active, result);\n return await completion;\n } catch (error) {\n active.releaseAdmission();\n if (this.failure && this.retirement) await this.retirement;\n await this.finish(active, undefined, error instanceof AgentError ? error : new AgentError(\"HARNESS_FAILED\", \"fx could not complete the native prompt.\"));\n return await completion;\n }\n }\n\n async steer(_prompt: string): Promise<void> {\n throw new AgentError(\"UNSUPPORTED_DELIVERY\", \"fx does not expose verified active steering.\");\n }\n\n async interrupt(): Promise<void> {\n const active = this.active;\n if (!active) return;\n active.cancelRequested = true;\n active.approvals.clear();\n this.tools.stopAdmission();\n await bounded(active.admission, 2_000);\n const admittedTools = this.tools.drain();\n let cancellationFailure: unknown;\n try {\n if (active.submitted && !active.terminal) this.rpc.send({ method: \"session/cancel\", params: { sessionId: this.sessionId } });\n } catch (error) {\n cancellationFailure = error;\n }\n await admittedTools;\n if (cancellationFailure && !this.failure) throw cancellationFailure;\n await bounded(active.nativeStopped, 3_000);\n await active.completion.catch(() => {});\n }\n\n async resume(): Promise<string> {\n throw new AgentError(\"RECOVERY_UNSUPPORTED\", \"fx recovery without a new prompt is unavailable.\");\n }\n\n async close(): Promise<void> {\n if (this.closed) return;\n this.closed = true;\n this.tools.stopAdmission();\n try {\n if (this.active) {\n this.active.cancelRequested = true;\n this.active.approvals.clear();\n await bounded(this.active.admission, 2_000);\n if (this.active.submitted && !this.active.terminal) this.rpc.send({ method: \"session/cancel\", params: { sessionId: this.sessionId } });\n }\n await bounded(this.rpc.request(\"session/close\", { sessionId: this.sessionId }), 2_000);\n } catch { /* process termination below still retires the session */ }\n await this.rpc.close();\n await this.tools.close();\n }\n}\n\nfunction firstPrompt(instructions: string, prompt: string): string {\n return `<subharness-instructions>\\n${instructions}\\n</subharness-instructions>\\n\\n${prompt}`;\n}\n\nasync function bounded<T>(promise: Promise<T>, milliseconds: number): Promise<T> {\n let timer!: NodeJS.Timeout;\n const timeout = new Promise<never>((_resolve, reject) => {\n timer = setTimeout(() => reject(new AgentError(\"CANCELLATION_FAILED\", \"fx did not confirm that native execution stopped.\")), milliseconds);\n timer.unref();\n });\n try { return await Promise.race([promise, timeout]); }\n finally { clearTimeout(timer); }\n}\n"]}
@@ -1,3 +1,4 @@
1
+ import type { ApprovalHandler } from "../approvals/types.js";
1
2
  import type { AgentDefinition, HarnessConfig } from "../sdk/types.js";
2
3
  export type HarnessRequest = HarnessConfig extends infer Config ? Config extends HarnessConfig ? Omit<Config, "model"> & {
3
4
  readonly model?: Config["model"];
@@ -16,6 +17,7 @@ export interface AdapterOptions {
16
17
  cwd: string;
17
18
  env: NodeJS.ProcessEnv;
18
19
  access: ResolvedAccess;
20
+ onApproval?: ApprovalHandler;
19
21
  }
20
22
  /** A native conversation. The external harness owns its reasoning and tool loop. */
21
23
  export interface NativeSession {
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { AgentDefinition, HarnessConfig } from \"../sdk/types.js\";\n\nexport type HarnessRequest = HarnessConfig extends infer Config\n ? Config extends HarnessConfig\n ? Omit<Config, \"model\"> & { readonly model?: Config[\"model\"] }\n : never\n : never;\n\nexport type ExecutionDefinition = Omit<AgentDefinition, \"harness\"> & {\n readonly harness: HarnessRequest | readonly HarnessRequest[];\n};\n\nexport type AccessType = \"subscription\" | \"api-key\" | \"vercel-api-key\" | \"vercel-oidc\";\n\nexport interface ResolvedAccess {\n type: AccessType;\n token?: string;\n}\n\nexport interface AdapterOptions {\n agent: ExecutionDefinition;\n harness: HarnessRequest;\n cwd: string;\n env: NodeJS.ProcessEnv;\n access: ResolvedAccess;\n}\n\n/** A native conversation. The external harness owns its reasoning and tool loop. */\nexport interface NativeSession {\n turn(prompt: string): Promise<string>;\n steer(prompt: string): Promise<void>;\n /** Resolves only once active execution has stopped. */\n interrupt(): Promise<void>;\n resume(): Promise<string>;\n close(): Promise<void>;\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ApprovalHandler } from \"../approvals/types.js\";\nimport type { AgentDefinition, HarnessConfig } from \"../sdk/types.js\";\n\nexport type HarnessRequest = HarnessConfig extends infer Config\n ? Config extends HarnessConfig\n ? Omit<Config, \"model\"> & { readonly model?: Config[\"model\"] }\n : never\n : never;\n\nexport type ExecutionDefinition = Omit<AgentDefinition, \"harness\"> & {\n readonly harness: HarnessRequest | readonly HarnessRequest[];\n};\n\nexport type AccessType = \"subscription\" | \"api-key\" | \"vercel-api-key\" | \"vercel-oidc\";\n\nexport interface ResolvedAccess {\n type: AccessType;\n token?: string;\n}\n\nexport interface AdapterOptions {\n agent: ExecutionDefinition;\n harness: HarnessRequest;\n cwd: string;\n env: NodeJS.ProcessEnv;\n access: ResolvedAccess;\n onApproval?: ApprovalHandler;\n}\n\n/** A native conversation. The external harness owns its reasoning and tool loop. */\nexport interface NativeSession {\n turn(prompt: string): Promise<string>;\n steer(prompt: string): Promise<void>;\n /** Resolves only once active execution has stopped. */\n interrupt(): Promise<void>;\n resume(): Promise<string>;\n close(): Promise<void>;\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import type { ApprovalContent, ApprovalSchema } from "./types.js";
2
+ /** Reject unsupported schema constructs before publishing a native request. */
3
+ export declare function validateApprovalSchema(schema: unknown): asserts schema is ApprovalSchema;
4
+ export declare function validateApprovalContent(schema: ApprovalSchema, content: unknown): ApprovalContent;