subharness 0.0.4 → 0.0.7

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 (303) hide show
  1. package/README.md +95 -9
  2. package/dist/adapters/claude-process.d.ts +3 -0
  3. package/dist/adapters/claude-process.js +19 -2
  4. package/dist/adapters/claude-process.js.map +1 -1
  5. package/dist/adapters/claude-result.d.ts +2 -0
  6. package/dist/adapters/claude-result.js +22 -0
  7. package/dist/adapters/claude-result.js.map +1 -0
  8. package/dist/adapters/claude-tools.d.ts +6 -2
  9. package/dist/adapters/claude-tools.js +14 -12
  10. package/dist/adapters/claude-tools.js.map +1 -1
  11. package/dist/adapters/claude-worker-client.d.ts +49 -0
  12. package/dist/adapters/claude-worker-client.js +359 -0
  13. package/dist/adapters/claude-worker-client.js.map +1 -0
  14. package/dist/adapters/claude-worker-process.d.ts +20 -0
  15. package/dist/adapters/claude-worker-process.js +76 -0
  16. package/dist/adapters/claude-worker-process.js.map +1 -0
  17. package/dist/adapters/claude-worker-protocol.d.ts +38 -0
  18. package/dist/adapters/claude-worker-protocol.js +2 -0
  19. package/dist/adapters/claude-worker-protocol.js.map +1 -0
  20. package/dist/adapters/claude-worker.d.ts +1 -0
  21. package/dist/adapters/claude-worker.js +126 -0
  22. package/dist/adapters/claude-worker.js.map +1 -0
  23. package/dist/adapters/claude.d.ts +16 -6
  24. package/dist/adapters/claude.js +164 -75
  25. package/dist/adapters/claude.js.map +1 -1
  26. package/dist/adapters/codex.js +4 -1
  27. package/dist/adapters/codex.js.map +1 -1
  28. package/dist/adapters/copilot-permissions.d.ts +26 -0
  29. package/dist/adapters/copilot-permissions.js +121 -0
  30. package/dist/adapters/copilot-permissions.js.map +1 -0
  31. package/dist/adapters/copilot-tools.d.ts +12 -0
  32. package/dist/adapters/copilot-tools.js +61 -0
  33. package/dist/adapters/copilot-tools.js.map +1 -0
  34. package/dist/adapters/copilot.d.ts +108 -0
  35. package/dist/adapters/copilot.js +819 -0
  36. package/dist/adapters/copilot.js.map +1 -0
  37. package/dist/adapters/cursor-cli-approvals.d.ts +2 -0
  38. package/dist/adapters/cursor-cli-approvals.js +83 -0
  39. package/dist/adapters/cursor-cli-approvals.js.map +1 -0
  40. package/dist/adapters/cursor-cli-model.d.ts +4 -0
  41. package/dist/adapters/cursor-cli-model.js +64 -0
  42. package/dist/adapters/cursor-cli-model.js.map +1 -0
  43. package/dist/adapters/cursor-cli-session.d.ts +32 -0
  44. package/dist/adapters/cursor-cli-session.js +316 -0
  45. package/dist/adapters/cursor-cli-session.js.map +1 -0
  46. package/dist/adapters/cursor-cli-tools.d.ts +20 -0
  47. package/dist/adapters/cursor-cli-tools.js +181 -0
  48. package/dist/adapters/cursor-cli-tools.js.map +1 -0
  49. package/dist/adapters/cursor-cli.d.ts +2 -0
  50. package/dist/adapters/cursor-cli.js +306 -0
  51. package/dist/adapters/cursor-cli.js.map +1 -0
  52. package/dist/adapters/cursor-model.d.ts +7 -0
  53. package/dist/adapters/cursor-model.js +67 -0
  54. package/dist/adapters/cursor-model.js.map +1 -0
  55. package/dist/adapters/cursor-rpc.d.ts +42 -0
  56. package/dist/adapters/cursor-rpc.js +271 -0
  57. package/dist/adapters/cursor-rpc.js.map +1 -0
  58. package/dist/adapters/cursor-session.d.ts +4 -0
  59. package/dist/adapters/cursor-session.js +327 -0
  60. package/dist/adapters/cursor-session.js.map +1 -0
  61. package/dist/adapters/cursor-startup.d.ts +16 -0
  62. package/dist/adapters/cursor-startup.js +74 -0
  63. package/dist/adapters/cursor-startup.js.map +1 -0
  64. package/dist/adapters/cursor-tools.d.ts +11 -0
  65. package/dist/adapters/cursor-tools.js +49 -0
  66. package/dist/adapters/cursor-tools.js.map +1 -0
  67. package/dist/adapters/cursor.d.ts +6 -0
  68. package/dist/adapters/cursor.js +17 -0
  69. package/dist/adapters/cursor.js.map +1 -0
  70. package/dist/adapters/fx-auth.d.ts +12 -2
  71. package/dist/adapters/fx-auth.js +51 -61
  72. package/dist/adapters/fx-auth.js.map +1 -1
  73. package/dist/adapters/fx-profile.d.ts +8 -0
  74. package/dist/adapters/fx-profile.js +101 -0
  75. package/dist/adapters/fx-profile.js.map +1 -0
  76. package/dist/adapters/fx-rpc.d.ts +2 -0
  77. package/dist/adapters/fx-rpc.js +30 -4
  78. package/dist/adapters/fx-rpc.js.map +1 -1
  79. package/dist/adapters/fx-status.d.ts +2 -0
  80. package/dist/adapters/fx-status.js +96 -0
  81. package/dist/adapters/fx-status.js.map +1 -0
  82. package/dist/adapters/fx.js +28 -12
  83. package/dist/adapters/fx.js.map +1 -1
  84. package/dist/adapters/opencode-access.d.ts +13 -0
  85. package/dist/adapters/opencode-access.js +76 -0
  86. package/dist/adapters/opencode-access.js.map +1 -0
  87. package/dist/adapters/opencode-config.d.ts +11 -0
  88. package/dist/adapters/opencode-config.js +238 -0
  89. package/dist/adapters/opencode-config.js.map +1 -0
  90. package/dist/adapters/opencode-http.d.ts +28 -0
  91. package/dist/adapters/opencode-http.js +297 -0
  92. package/dist/adapters/opencode-http.js.map +1 -0
  93. package/dist/adapters/opencode-tools.d.ts +19 -0
  94. package/dist/adapters/opencode-tools.js +127 -0
  95. package/dist/adapters/opencode-tools.js.map +1 -0
  96. package/dist/adapters/opencode.d.ts +2 -0
  97. package/dist/adapters/opencode.js +569 -0
  98. package/dist/adapters/opencode.js.map +1 -0
  99. package/dist/adapters/rpc.d.ts +3 -0
  100. package/dist/adapters/rpc.js +45 -4
  101. package/dist/adapters/rpc.js.map +1 -1
  102. package/dist/adapters/types.d.ts +5 -0
  103. package/dist/adapters/types.js.map +1 -1
  104. package/dist/approvals/types.d.ts +1 -1
  105. package/dist/approvals/types.js.map +1 -1
  106. package/dist/cli/args.d.ts +1 -1
  107. package/dist/cli/args.js +4 -1
  108. package/dist/cli/args.js.map +1 -1
  109. package/dist/cli/catalog-worker.js.map +1 -1
  110. package/dist/cli/dashboard-client.js +20 -31
  111. package/dist/cli/dashboard-client.js.map +1 -1
  112. package/dist/cli/dashboard-controller.d.ts +7 -0
  113. package/dist/cli/dashboard-controller.js +27 -0
  114. package/dist/cli/dashboard-controller.js.map +1 -0
  115. package/dist/cli/dashboard-detail-view.d.ts +1 -1
  116. package/dist/cli/dashboard-detail-view.js +3 -4
  117. package/dist/cli/dashboard-detail-view.js.map +1 -1
  118. package/dist/cli/dashboard-history-view.js.map +1 -1
  119. package/dist/cli/dashboard-input.d.ts +1 -1
  120. package/dist/cli/dashboard-input.js +11 -1
  121. package/dist/cli/dashboard-input.js.map +1 -1
  122. package/dist/cli/dashboard-layout.js +3 -3
  123. package/dist/cli/dashboard-layout.js.map +1 -1
  124. package/dist/cli/dashboard-renderer.js.map +1 -1
  125. package/dist/cli/dashboard-style.js +2 -2
  126. package/dist/cli/dashboard-style.js.map +1 -1
  127. package/dist/cli/dashboard.d.ts +2 -2
  128. package/dist/cli/dashboard.js +7 -32
  129. package/dist/cli/dashboard.js.map +1 -1
  130. package/dist/cli/help.d.ts +1 -1
  131. package/dist/cli/help.js +30 -12
  132. package/dist/cli/help.js.map +1 -1
  133. package/dist/cli/main.js +55 -43
  134. package/dist/cli/main.js.map +1 -1
  135. package/dist/config/access-provenance.d.ts +10 -0
  136. package/dist/config/access-provenance.js +31 -0
  137. package/dist/config/access-provenance.js.map +1 -0
  138. package/dist/config/access.d.ts +12 -2
  139. package/dist/config/access.js +125 -27
  140. package/dist/config/access.js.map +1 -1
  141. package/dist/config/loader.js +1 -0
  142. package/dist/config/loader.js.map +1 -1
  143. package/dist/config/oidc.js +4 -2
  144. package/dist/config/oidc.js.map +1 -1
  145. package/dist/config/project.js +2 -1
  146. package/dist/config/project.js.map +1 -1
  147. package/dist/config/resolve-access.js +24 -10
  148. package/dist/config/resolve-access.js.map +1 -1
  149. package/dist/errors.d.ts +2 -2
  150. package/dist/errors.js.map +1 -1
  151. package/dist/index.d.ts +8 -2
  152. package/dist/index.js +4 -1
  153. package/dist/index.js.map +1 -1
  154. package/dist/process-diagnostics.d.ts +2 -0
  155. package/dist/process-diagnostics.js +11 -0
  156. package/dist/process-diagnostics.js.map +1 -0
  157. package/dist/runtime/access-errors.d.ts +4 -0
  158. package/dist/runtime/access-errors.js +25 -0
  159. package/dist/runtime/access-errors.js.map +1 -0
  160. package/dist/runtime/approval-registry.d.ts +9 -0
  161. package/dist/runtime/approval-registry.js +144 -5
  162. package/dist/runtime/approval-registry.js.map +1 -1
  163. package/dist/runtime/capture.d.ts +22 -0
  164. package/dist/runtime/capture.js +320 -0
  165. package/dist/runtime/capture.js.map +1 -0
  166. package/dist/runtime/catalog.d.ts +39 -0
  167. package/dist/runtime/catalog.js +84 -0
  168. package/dist/runtime/catalog.js.map +1 -0
  169. package/dist/runtime/client.d.ts +2 -1
  170. package/dist/runtime/client.js +74 -47
  171. package/dist/runtime/client.js.map +1 -1
  172. package/dist/runtime/coordinator.d.ts +44 -7
  173. package/dist/runtime/coordinator.js +265 -31
  174. package/dist/runtime/coordinator.js.map +1 -1
  175. package/dist/runtime/daemon.js +12 -6
  176. package/dist/runtime/daemon.js.map +1 -1
  177. package/dist/runtime/dashboard-sanitize.d.ts +2 -0
  178. package/dist/runtime/dashboard-sanitize.js +7 -0
  179. package/dist/runtime/dashboard-sanitize.js.map +1 -0
  180. package/dist/runtime/dashboard-workspace.js +5 -1
  181. package/dist/runtime/dashboard-workspace.js.map +1 -1
  182. package/dist/runtime/dashboard.d.ts +1 -1
  183. package/dist/runtime/dashboard.js +2 -3
  184. package/dist/runtime/dashboard.js.map +1 -1
  185. package/dist/runtime/definition.d.ts +6 -1
  186. package/dist/runtime/definition.js +42 -2
  187. package/dist/runtime/definition.js.map +1 -1
  188. package/dist/runtime/native-owner.js +7 -1
  189. package/dist/runtime/native-owner.js.map +1 -1
  190. package/dist/runtime/pagination.d.ts +9 -0
  191. package/dist/runtime/pagination.js +36 -0
  192. package/dist/runtime/pagination.js.map +1 -0
  193. package/dist/runtime/sdk-observation.d.ts +8 -0
  194. package/dist/runtime/sdk-observation.js +75 -0
  195. package/dist/runtime/sdk-observation.js.map +1 -0
  196. package/dist/runtime/sdk-projection.d.ts +8 -0
  197. package/dist/runtime/sdk-projection.js +19 -0
  198. package/dist/runtime/sdk-projection.js.map +1 -0
  199. package/dist/runtime/sdk-service.d.ts +11 -0
  200. package/dist/runtime/sdk-service.js +109 -0
  201. package/dist/runtime/sdk-service.js.map +1 -0
  202. package/dist/runtime/select-native.d.ts +4 -1
  203. package/dist/runtime/select-native.js +28 -13
  204. package/dist/runtime/select-native.js.map +1 -1
  205. package/dist/runtime/service.d.ts +11 -1
  206. package/dist/runtime/service.js +178 -3
  207. package/dist/runtime/service.js.map +1 -1
  208. package/dist/runtime/session-launcher.js +1 -1
  209. package/dist/runtime/session-launcher.js.map +1 -1
  210. package/dist/runtime/snapshots.d.ts +103 -0
  211. package/dist/runtime/snapshots.js +124 -0
  212. package/dist/runtime/snapshots.js.map +1 -0
  213. package/dist/runtime/state.d.ts +26 -0
  214. package/dist/runtime/state.js +86 -17
  215. package/dist/runtime/state.js.map +1 -1
  216. package/dist/runtime/task-data.d.ts +38 -0
  217. package/dist/runtime/task-data.js +2 -0
  218. package/dist/runtime/task-data.js.map +1 -0
  219. package/dist/runtime/transport.d.ts +13 -0
  220. package/dist/runtime/transport.js +166 -0
  221. package/dist/runtime/transport.js.map +1 -0
  222. package/dist/runtime/types.d.ts +28 -9
  223. package/dist/runtime/types.js.map +1 -1
  224. package/dist/runtime/worker-client.js +40 -13
  225. package/dist/runtime/worker-client.js.map +1 -1
  226. package/dist/runtime/worker-server.js +105 -24
  227. package/dist/runtime/worker-server.js.map +1 -1
  228. package/dist/sdk/connected-types.d.ts +42 -0
  229. package/dist/sdk/connected-types.js +2 -0
  230. package/dist/sdk/connected-types.js.map +1 -0
  231. package/dist/sdk/connected.d.ts +3 -0
  232. package/dist/sdk/connected.js +232 -0
  233. package/dist/sdk/connected.js.map +1 -0
  234. package/dist/sdk/definitions.d.ts +4 -1
  235. package/dist/sdk/definitions.js +16 -2
  236. package/dist/sdk/definitions.js.map +1 -1
  237. package/dist/sdk/execution-definition.d.ts +3 -0
  238. package/dist/sdk/execution-definition.js +59 -0
  239. package/dist/sdk/execution-definition.js.map +1 -0
  240. package/dist/sdk/execution-driver.d.ts +6 -0
  241. package/dist/sdk/execution-driver.js +86 -0
  242. package/dist/sdk/execution-driver.js.map +1 -0
  243. package/dist/sdk/execution-observation.d.ts +3 -0
  244. package/dist/sdk/execution-observation.js +35 -0
  245. package/dist/sdk/execution-observation.js.map +1 -0
  246. package/dist/sdk/execution-options.d.ts +17 -0
  247. package/dist/sdk/execution-options.js +115 -0
  248. package/dist/sdk/execution-options.js.map +1 -0
  249. package/dist/sdk/execution-types.d.ts +72 -0
  250. package/dist/sdk/execution-types.js +2 -0
  251. package/dist/sdk/execution-types.js.map +1 -0
  252. package/dist/sdk/execution.d.ts +3 -0
  253. package/dist/sdk/execution.js +3 -0
  254. package/dist/sdk/execution.js.map +1 -0
  255. package/dist/sdk/hosted-error.d.ts +3 -0
  256. package/dist/sdk/hosted-error.js +14 -0
  257. package/dist/sdk/hosted-error.js.map +1 -0
  258. package/dist/sdk/hosted.d.ts +23 -0
  259. package/dist/sdk/hosted.js +204 -0
  260. package/dist/sdk/hosted.js.map +1 -0
  261. package/dist/sdk/permission-validation.js +10 -1
  262. package/dist/sdk/permission-validation.js.map +1 -1
  263. package/dist/sdk/runner.d.ts +5 -0
  264. package/dist/sdk/runner.js +107 -0
  265. package/dist/sdk/runner.js.map +1 -0
  266. package/dist/sdk/tools.js +4 -1
  267. package/dist/sdk/tools.js.map +1 -1
  268. package/dist/sdk/types.d.ts +29 -1
  269. package/dist/sdk/types.js.map +1 -1
  270. package/package.json +6 -3
  271. package/sdk/access-config.md +60 -4
  272. package/sdk/adapter-contract.md +13 -3
  273. package/sdk/additional-harnesses.md +43 -0
  274. package/sdk/agent-skill.md +2 -2
  275. package/sdk/agent.md +6 -4
  276. package/sdk/approvals.md +5 -1
  277. package/sdk/authentication.md +1 -1
  278. package/sdk/cli/dashboard-design.md +6 -0
  279. package/sdk/cli/index.md +9 -6
  280. package/sdk/cli/output.md +3 -1
  281. package/sdk/completion-notifications.md +2 -0
  282. package/sdk/config.md +1 -1
  283. package/sdk/copilot.md +53 -0
  284. package/sdk/cursor.md +68 -0
  285. package/sdk/diagnostics.md +29 -0
  286. package/sdk/distribution.md +5 -3
  287. package/sdk/evals.md +1 -1
  288. package/sdk/examples/chat-tool.ts +126 -0
  289. package/sdk/execution.md +743 -0
  290. package/sdk/fx.md +50 -5
  291. package/sdk/harnesses.md +13 -13
  292. package/sdk/index.md +45 -20
  293. package/sdk/message-delivery.md +2 -0
  294. package/sdk/opencode.md +57 -0
  295. package/sdk/permissions.md +6 -2
  296. package/sdk/plugins/sub-agents.md +4 -2
  297. package/sdk/project-team.md +25 -1
  298. package/sdk/sessions.md +2 -0
  299. package/sdk/tools.md +4 -2
  300. package/sdk/v1-runtime.md +8 -6
  301. package/dist/cli/catalog.d.ts +0 -26
  302. package/dist/cli/catalog.js +0 -41
  303. package/dist/cli/catalog.js.map +0 -1
package/dist/errors.d.ts CHANGED
@@ -3,7 +3,7 @@ export declare class AgentError extends Error {
3
3
  constructor(code: string, message: string);
4
4
  }
5
5
  export type ErrorInfo = {
6
- code: string;
7
- message: string;
6
+ readonly code: string;
7
+ readonly message: string;
8
8
  };
9
9
  export declare function errorInfo(error: unknown): ErrorInfo;
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,UAAW,SAAQ,KAAK;IACP,IAAI;IAAhC,YAA4B,IAAY,EAAE,OAAe;QACvD,KAAK,CAAC,OAAO,CAAC,CAAC;oBADW,IAAI;QAE9B,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF;AAID,MAAM,UAAU,SAAS,CAAC,KAAc;IACtC,OAAO,KAAK,YAAY,UAAU;QAChC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE;QAC9C,CAAC,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AAClG,CAAC","sourcesContent":["export class AgentError extends Error {\n constructor(public readonly code: string, message: string) {\n super(message);\n this.name = \"AgentError\";\n }\n}\n\nexport type ErrorInfo = { code: string; message: string };\n\nexport function errorInfo(error: unknown): ErrorInfo {\n return error instanceof AgentError\n ? { code: error.code, message: error.message }\n : { code: \"INTERNAL_ERROR\", message: error instanceof Error ? error.message : String(error) };\n}\n"]}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,UAAW,SAAQ,KAAK;IACP,IAAI;IAAhC,YAA4B,IAAY,EAAE,OAAe;QACvD,KAAK,CAAC,OAAO,CAAC,CAAC;oBADW,IAAI;QAE9B,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF;AAID,MAAM,UAAU,SAAS,CAAC,KAAc;IACtC,OAAO,KAAK,YAAY,UAAU;QAChC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE;QAC9C,CAAC,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AAClG,CAAC","sourcesContent":["export class AgentError extends Error {\n constructor(public readonly code: string, message: string) {\n super(message);\n this.name = \"AgentError\";\n }\n}\n\nexport type ErrorInfo = { readonly code: string; readonly message: string };\n\nexport function errorInfo(error: unknown): ErrorInfo {\n return error instanceof AgentError\n ? { code: error.code, message: error.message }\n : { code: \"INTERNAL_ERROR\", message: error instanceof Error ? error.message : String(error) };\n}\n"]}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,10 @@
1
- export { agent, codex, claudeCode, fx } from "./sdk/definitions.js";
1
+ export { agent, codex, claudeCode, fx, opencode, copilot, cursor } from "./sdk/definitions.js";
2
+ export { createRunner } from "./sdk/execution.js";
3
+ export { connect } from "./sdk/connected.js";
2
4
  export { tool, toolResult } from "./sdk/tools.js";
5
+ export { AgentError } from "./errors.js";
6
+ export type { ErrorInfo } from "./errors.js";
7
+ export type { AccessConnection, AccessSelection, ApprovalAction, ApprovalGrant, ApprovalRequest, ApprovalResponse, ApprovalScope, CompleteResponse, Delivery, Page, PageOptions, Runner, RunnerOptions, PromptReceipt, SessionHandle, SessionSnapshot, SessionSummary, TaskHandle, TaskDetails, TaskResult, TaskSnapshot, TaskState, TaskSummary, TerminalState, WorkspaceInfo, } from "./sdk/execution.js";
3
8
  export type { ToolContent, ToolResult } from "./sdk/tools.js";
4
- export type { AgentDefinition, ClaudeCodeConfig, ClaudeCodeOptions, CodexConfig, CodexOptions, FxConfig, FxOptions, HarnessConfig, HarnessKind, ToolDefinition, } from "./sdk/types.js";
9
+ export type { AgentSummary, Client, ConnectedSessionOptions, ConnectOptions } from "./sdk/connected.js";
10
+ export type { AgentDefinition, ClaudeCodeConfig, ClaudeCodeOptions, CodexConfig, CodexOptions, FxConfig, FxOptions, OpencodeConfig, OpencodeOptions, CopilotConfig, CopilotOptions, CursorConfig, CursorOptions, HarnessConfig, HarnessKind, ToolDefinition, } from "./sdk/types.js";
package/dist/index.js CHANGED
@@ -1,3 +1,6 @@
1
- export { agent, codex, claudeCode, fx } from "./sdk/definitions.js";
1
+ export { agent, codex, claudeCode, fx, opencode, copilot, cursor } from "./sdk/definitions.js";
2
+ export { createRunner } from "./sdk/execution.js";
3
+ export { connect } from "./sdk/connected.js";
2
4
  export { tool, toolResult } from "./sdk/tools.js";
5
+ export { AgentError } from "./errors.js";
3
6
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC","sourcesContent":["export { agent, codex, claudeCode, fx } from \"./sdk/definitions.js\";\nexport { tool, toolResult } from \"./sdk/tools.js\";\nexport type { ToolContent, ToolResult } from \"./sdk/tools.js\";\nexport type {\n AgentDefinition,\n ClaudeCodeConfig,\n ClaudeCodeOptions,\n CodexConfig,\n CodexOptions,\n FxConfig,\n FxOptions,\n HarnessConfig,\n HarnessKind,\n ToolDefinition,\n} from \"./sdk/types.js\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC/F,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC","sourcesContent":["export { agent, codex, claudeCode, fx, opencode, copilot, cursor } from \"./sdk/definitions.js\";\nexport { createRunner } from \"./sdk/execution.js\";\nexport { connect } from \"./sdk/connected.js\";\nexport { tool, toolResult } from \"./sdk/tools.js\";\nexport { AgentError } from \"./errors.js\";\nexport type { ErrorInfo } from \"./errors.js\";\nexport type {\n AccessConnection,\n AccessSelection,\n ApprovalAction,\n ApprovalGrant,\n ApprovalRequest,\n ApprovalResponse,\n ApprovalScope,\n CompleteResponse,\n Delivery,\n Page,\n PageOptions,\n Runner,\n RunnerOptions,\n PromptReceipt,\n SessionHandle,\n SessionSnapshot,\n SessionSummary,\n TaskHandle,\n TaskDetails,\n TaskResult,\n TaskSnapshot,\n TaskState,\n TaskSummary,\n TerminalState,\n WorkspaceInfo,\n} from \"./sdk/execution.js\";\nexport type { ToolContent, ToolResult } from \"./sdk/tools.js\";\nexport type { AgentSummary, Client, ConnectedSessionOptions, ConnectOptions } from \"./sdk/connected.js\";\nexport type {\n AgentDefinition,\n ClaudeCodeConfig,\n ClaudeCodeOptions,\n CodexConfig,\n CodexOptions,\n FxConfig,\n FxOptions,\n OpencodeConfig,\n OpencodeOptions,\n CopilotConfig,\n CopilotOptions,\n CursorConfig,\n CursorOptions,\n HarnessConfig,\n HarnessKind,\n ToolDefinition,\n} from \"./sdk/types.js\";\n"]}
@@ -0,0 +1,2 @@
1
+ /** Formats only bounded, observed child-process termination metadata. */
2
+ export declare function processExitDescription(code: unknown, signal: unknown): string;
@@ -0,0 +1,11 @@
1
+ import { constants } from "node:os";
2
+ /** Formats only bounded, observed child-process termination metadata. */
3
+ export function processExitDescription(code, signal) {
4
+ if (typeof signal === "string" && Object.hasOwn(constants.signals, signal)) {
5
+ return ` (signal ${signal})`;
6
+ }
7
+ return typeof code === "number" && Number.isSafeInteger(code)
8
+ ? ` (exit code ${code})`
9
+ : "";
10
+ }
11
+ //# sourceMappingURL=process-diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-diagnostics.js","sourceRoot":"","sources":["../src/process-diagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpC,yEAAyE;AACzE,MAAM,UAAU,sBAAsB,CAAC,IAAa,EAAE,MAAe;IACnE,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;QAC3E,OAAO,YAAY,MAAM,GAAG,CAAC;IAC/B,CAAC;IACD,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC;QAC3D,CAAC,CAAC,eAAe,IAAI,GAAG;QACxB,CAAC,CAAC,EAAE,CAAC;AACT,CAAC","sourcesContent":["import { constants } from \"node:os\";\n\n/** Formats only bounded, observed child-process termination metadata. */\nexport function processExitDescription(code: unknown, signal: unknown): string {\n if (typeof signal === \"string\" && Object.hasOwn(constants.signals, signal)) {\n return ` (signal ${signal})`;\n }\n return typeof code === \"number\" && Number.isSafeInteger(code)\n ? ` (exit code ${code})`\n : \"\";\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import type { NativeSession } from "../adapters/types.js";
2
+ import { AgentError } from "../errors.js";
3
+ export declare function withAccessContext(error: AgentError, context: string): AgentError;
4
+ export declare function withSessionAccessContext(native: NativeSession, context: string): NativeSession;
@@ -0,0 +1,25 @@
1
+ import { AgentError } from "../errors.js";
2
+ export function withAccessContext(error, context) {
3
+ return new AgentError(error.code, `${error.message}\n${context}`);
4
+ }
5
+ async function sessionCall(operation, context) {
6
+ try {
7
+ return await operation();
8
+ }
9
+ catch (error) {
10
+ if (error instanceof AgentError && error.code === "INVALID_CONFIG") {
11
+ throw withAccessContext(error, context);
12
+ }
13
+ throw error;
14
+ }
15
+ }
16
+ export function withSessionAccessContext(native, context) {
17
+ return {
18
+ turn: prompt => sessionCall(() => native.turn(prompt), context),
19
+ steer: prompt => sessionCall(() => native.steer(prompt), context),
20
+ interrupt: () => sessionCall(() => native.interrupt(), context),
21
+ resume: () => sessionCall(() => native.resume(), context),
22
+ close: () => sessionCall(() => native.close(), context),
23
+ };
24
+ }
25
+ //# sourceMappingURL=access-errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"access-errors.js","sourceRoot":"","sources":["../../src/runtime/access-errors.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,UAAU,iBAAiB,CAAC,KAAiB,EAAE,OAAe;IAClE,OAAO,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC,CAAC;AACpE,CAAC;AAED,KAAK,UAAU,WAAW,CAAI,SAA2B,EAAE,OAAe;IACxE,IAAI,CAAC;QAAC,OAAO,MAAM,SAAS,EAAE,CAAC;IAAC,CAAC;IACjC,OAAO,KAAK,EAAE,CAAC;QACb,IAAI,KAAK,YAAY,UAAU,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;YACnE,MAAM,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC1C,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,MAAqB,EAAE,OAAe;IAC7E,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;QAC/D,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;QACjE,SAAS,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,OAAO,CAAC;QAC/D,MAAM,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC;QACzD,KAAK,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,OAAO,CAAC;KACxD,CAAC;AACJ,CAAC","sourcesContent":["import type { NativeSession } from \"../adapters/types.js\";\nimport { AgentError } from \"../errors.js\";\n\nexport function withAccessContext(error: AgentError, context: string): AgentError {\n return new AgentError(error.code, `${error.message}\\n${context}`);\n}\n\nasync function sessionCall<T>(operation: () => Promise<T>, context: string): Promise<T> {\n try { return await operation(); }\n catch (error) {\n if (error instanceof AgentError && error.code === \"INVALID_CONFIG\") {\n throw withAccessContext(error, context);\n }\n throw error;\n }\n}\n\nexport function withSessionAccessContext(native: NativeSession, context: string): NativeSession {\n return {\n turn: prompt => sessionCall(() => native.turn(prompt), context),\n steer: prompt => sessionCall(() => native.steer(prompt), context),\n interrupt: () => sessionCall(() => native.interrupt(), context),\n resume: () => sessionCall(() => native.resume(), context),\n close: () => sessionCall(() => native.close(), context),\n };\n}\n"]}
@@ -1,5 +1,6 @@
1
1
  import type { ApprovalContent, NativeApprovalRequest } from '../approvals/types.js';
2
2
  import type { ApprovalRequest } from './types.js';
3
+ import type { SdkApprovalRequest } from './task-data.js';
3
4
  type RequestIdentity = Pick<ApprovalRequest, 'requestId' | 'taskId' | 'sessionId'>;
4
5
  /** Retains pending requests and a bounded settlement-ordered outcome history. */
5
6
  export declare class ApprovalRegistry {
@@ -17,6 +18,14 @@ export declare class ApprovalRegistry {
17
18
  sessionId: string;
18
19
  };
19
20
  pendingFor(taskId: string): ApprovalRequest[];
21
+ sdkPendingFor(taskId: string): SdkApprovalRequest[];
22
+ respondSdk(id: string, response: unknown): {
23
+ version: 1;
24
+ type: 'approval_answered';
25
+ requestId: string;
26
+ taskId: string;
27
+ sessionId: string;
28
+ };
20
29
  retireTask(taskId: string): void;
21
30
  close(): void;
22
31
  private retire;
@@ -31,16 +31,29 @@ export class ApprovalRegistry {
31
31
  catch {
32
32
  throw new AgentError('INPUT_REQUIRED', 'The native permission request cannot be represented within 64 KiB.');
33
33
  }
34
- if (copy.kind !== 'permission' || !['codex', 'claudeCode', 'fx'].includes(copy.harness) || typeof copy.message !== 'string')
34
+ if (copy.kind !== 'permission' || !['codex', 'claudeCode', 'fx', 'opencode', 'copilot', 'cursor'].includes(copy.harness) || typeof copy.message !== 'string')
35
35
  throw new AgentError('INPUT_REQUIRED', 'The native permission request cannot be represented.');
36
36
  validateApprovalSchema(copy.requestedSchema);
37
37
  const requestId = `req_${randomUUID()}`;
38
38
  const snapshot = { ...copy, requestId, taskId, sessionId };
39
39
  if (Buffer.byteLength(JSON.stringify(snapshot)) > 64 * 1024)
40
40
  throw new AgentError('INPUT_REQUIRED', 'The native permission request cannot be represented within 64 KiB.');
41
+ let sdk;
42
+ let actions;
43
+ try {
44
+ const normalized = normalize(snapshot);
45
+ sdk = normalized.request;
46
+ actions = normalized.actions;
47
+ }
48
+ catch (error) {
49
+ if (!(error instanceof AgentError) || error.code !== 'INPUT_REQUIRED')
50
+ throw error;
51
+ sdk = error;
52
+ actions = new Map();
53
+ }
41
54
  const answer = new Promise((resolve, reject) => {
42
55
  const abort = () => this.retire(requestId);
43
- this.pending.set(requestId, { outcome: 'pending', request: snapshot,
56
+ this.pending.set(requestId, { outcome: 'pending', request: snapshot, sdk, actions,
44
57
  continuation: { resolve, reject, cleanup: () => signal.removeEventListener('abort', abort) } });
45
58
  signal.addEventListener('abort', abort, { once: true });
46
59
  });
@@ -65,16 +78,24 @@ export class ApprovalRegistry {
65
78
  if (settled.outcome === 'withdrawn')
66
79
  throw expired();
67
80
  this.validateBoundedContent(content);
68
- if (!isDeepStrictEqual(settled.answer, content))
81
+ let answer;
82
+ try {
83
+ answer = canonicalBySchema(settled.schema, validateApprovalContent(settled.schema, content));
84
+ }
85
+ catch {
86
+ invalidResponse();
87
+ }
88
+ if (!isDeepStrictEqual(settled.answer, answer))
69
89
  throw new AgentError('INVALID_APPROVAL_RESPONSE', 'This permission request already has a different answer.');
70
90
  return this.receipt(settled.identity);
71
91
  }
72
92
  this.validateBoundedContent(content);
73
- const answer = validateApprovalContent(pending.request.requestedSchema, content);
93
+ const answer = canonicalBySchema(pending.request.requestedSchema, validateApprovalContent(pending.request.requestedSchema, content));
74
94
  const requestIdentity = identity(pending.request);
75
95
  this.pending.delete(id);
76
96
  pending.continuation.cleanup();
77
- this.retain({ outcome: 'answered', identity: requestIdentity, answer: structuredClone(answer) });
97
+ this.retain({ outcome: 'answered', identity: requestIdentity, answer: structuredClone(answer),
98
+ schema: structuredClone(pending.request.requestedSchema), actions: pending.actions });
78
99
  pending.continuation.resolve(answer);
79
100
  this.changed(requestIdentity.taskId);
80
101
  return this.receipt(requestIdentity);
@@ -83,6 +104,41 @@ export class ApprovalRegistry {
83
104
  return [...this.pending.values()].filter(entry => entry.request.taskId === taskId)
84
105
  .map(entry => structuredClone(entry.request));
85
106
  }
107
+ sdkPendingFor(taskId) {
108
+ return [...this.pending.values()].filter(entry => entry.request.taskId === taskId)
109
+ .map(entry => {
110
+ if (entry.sdk instanceof AgentError)
111
+ throw new AgentError(entry.sdk.code, entry.sdk.message);
112
+ return structuredClone(entry.sdk);
113
+ });
114
+ }
115
+ respondSdk(id, response) {
116
+ const entry = this.pending.get(id) ?? this.settled.get(id);
117
+ if (!entry)
118
+ throw unknown();
119
+ if (entry.outcome === 'withdrawn')
120
+ throw expired();
121
+ this.validateBoundedContent(response);
122
+ if (!plain(response) || Reflect.ownKeys(response).some(key => typeof key !== 'string' || !['actionId', 'grants'].includes(key))
123
+ || typeof response.actionId !== 'string')
124
+ invalidResponse();
125
+ const mapping = entry.actions.get(response.actionId);
126
+ if (!mapping)
127
+ invalidResponse();
128
+ const submitted = response;
129
+ let native = structuredClone(mapping.native);
130
+ if (mapping.grants) {
131
+ if (mapping.action.decision !== 'allow' || !Array.isArray(submitted.grants)
132
+ || submitted.grants.some(value => typeof value !== 'string') || new Set(submitted.grants).size !== submitted.grants.length
133
+ || submitted.grants.some(value => !mapping.grants.includes(value)))
134
+ invalidResponse();
135
+ const selected = new Set(submitted.grants);
136
+ native = { ...native, grants: mapping.grants.filter(id => selected.has(id)) };
137
+ }
138
+ else if (Object.hasOwn(response, 'grants'))
139
+ invalidResponse();
140
+ return this.respond(id, native);
141
+ }
86
142
  retireTask(taskId) {
87
143
  for (const [id, entry] of this.pending)
88
144
  if (entry.request.taskId === taskId)
@@ -123,4 +179,87 @@ export class ApprovalRegistry {
123
179
  taskId: request.taskId, sessionId: request.sessionId };
124
180
  }
125
181
  }
182
+ function invalidResponse() {
183
+ throw new AgentError('INVALID_APPROVAL_RESPONSE', 'The approval response does not match the requested actions.');
184
+ }
185
+ function plain(value) {
186
+ return value !== null && typeof value === 'object' && !Array.isArray(value)
187
+ && [Object.prototype, null].includes(Object.getPrototypeOf(value));
188
+ }
189
+ function normalize(request) {
190
+ const actions = new Map();
191
+ const grantsField = request.requestedSchema.properties.grants;
192
+ const scopeField = request.requestedSchema.properties.scope;
193
+ let grants;
194
+ if (grantsField?.type === 'array' && grantsField.items.anyOf && scopeField?.type === 'string' && scopeField.oneOf) {
195
+ grants = grantsField.items.anyOf.map(choice => ({ id: choice.const, label: choice.title }));
196
+ for (const choice of scopeField.oneOf) {
197
+ const scope = choice.const === 'session' ? 'session' : 'turn';
198
+ const action = { id: `act_${randomUUID()}`, label: `Allow for this ${scope}`, decision: 'allow', scope };
199
+ actions.set(action.id, { action, native: { scope: choice.const }, grants: grants.map(grant => grant.id) });
200
+ }
201
+ }
202
+ else {
203
+ const decision = request.requestedSchema.properties.decision;
204
+ const choices = decision?.type === 'string'
205
+ ? (decision.oneOf ?? decision.enum?.map(value => ({ const: value, title: value }))) : undefined;
206
+ if (!choices?.length)
207
+ invalidNative();
208
+ for (const choice of choices) {
209
+ const metadata = decisionMetadata(request, choice.const);
210
+ const action = metadata.decision === 'cancel'
211
+ ? { id: `act_${randomUUID()}`, label: choice.title, decision: 'cancel' }
212
+ : { id: `act_${randomUUID()}`, label: choice.title, decision: metadata.decision, scope: metadata.scope,
213
+ ...(metadata.scope === 'session' ? { description: 'Applies to this native conversation.' } : {}) };
214
+ actions.set(action.id, { action, native: { decision: choice.const } });
215
+ }
216
+ }
217
+ if (!actions.size)
218
+ invalidNative();
219
+ const groups = new Map();
220
+ for (const mapping of actions.values()) {
221
+ const key = mapping.action.decision === 'cancel' ? 'cancel' : `${mapping.action.decision}:${mapping.action.scope}`;
222
+ const group = groups.get(key) ?? [];
223
+ group.push(mapping);
224
+ groups.set(key, group);
225
+ }
226
+ for (const group of groups.values())
227
+ if (group.length > 1)
228
+ for (const mapping of group) {
229
+ const native = typeof mapping.native.decision === 'string' ? mapping.native.decision : String(mapping.native.scope);
230
+ mapping.action = { ...mapping.action, description: [mapping.action.description, `Native option: ${native}`].filter(Boolean).join(' ') };
231
+ }
232
+ return { request: { id: request.requestId, taskId: request.taskId, sessionId: request.sessionId, harness: request.harness,
233
+ message: request.message, actions: [...actions.values()].map(value => value.action),
234
+ ...(grants ? { grants } : {}), ...(request.context ? { context: structuredClone(request.context) } : {}) }, actions };
235
+ }
236
+ function invalidNative() {
237
+ throw new AgentError('INPUT_REQUIRED', 'The native permission request cannot be represented.');
238
+ }
239
+ function decisionMetadata(request, value) {
240
+ const options = Array.isArray(request.context?.options) ? request.context.options : [];
241
+ const offered = options.find(option => plain(option) && (option.optionId === value));
242
+ const kind = plain(offered) && typeof offered.kind === 'string' ? offered.kind : value;
243
+ if (kind === 'cancel')
244
+ return { decision: 'cancel' };
245
+ if (['acceptForSession', 'allow_session', 'allow_always'].includes(kind))
246
+ return { decision: 'allow', scope: 'session' };
247
+ if (kind === 'reject_always')
248
+ return { decision: 'deny', scope: 'session' };
249
+ if (['accept', 'allow', 'allow_once', 'once', 'approve-once'].includes(kind))
250
+ return { decision: 'allow', scope: 'once' };
251
+ if (['decline', 'deny', 'reject', 'reject_once'].includes(kind))
252
+ return { decision: 'deny', scope: 'once' };
253
+ invalidNative();
254
+ }
255
+ function canonicalBySchema(schema, answer) {
256
+ if (!Array.isArray(answer.grants))
257
+ return answer;
258
+ const field = schema.properties.grants;
259
+ if (field?.type !== 'array')
260
+ return answer;
261
+ const order = (field.items.anyOf ?? field.items.enum?.map(value => ({ const: value, title: value })) ?? []).map(choice => choice.const);
262
+ const selected = new Set(answer.grants);
263
+ return { ...answer, grants: order.filter(value => selected.has(value)) };
264
+ }
126
265
  //# sourceMappingURL=approval-registry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"approval-registry.js","sourceRoot":"","sources":["../../src/runtime/approval-registry.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from 'node:crypto';\nimport { isDeepStrictEqual } from 'node:util';\nimport { AgentError } from '../errors.js';\nimport { validateApprovalContent, validateApprovalSchema } from '../approvals/schema.js';\nimport type { ApprovalContent, NativeApprovalRequest } from '../approvals/types.js';\nimport type { ApprovalRequest } from './types.js';\n\ntype RequestIdentity = Pick<ApprovalRequest,'requestId'|'taskId'|'sessionId'>;\ninterface Continuation {\n resolve(content: ApprovalContent): void;\n reject(error: AgentError): void;\n cleanup(): void;\n}\ninterface PendingEntry {\n outcome: 'pending';\n request: ApprovalRequest;\n continuation: Continuation;\n}\ninterface AnsweredEntry { outcome: 'answered'; identity: RequestIdentity; answer: ApprovalContent }\ninterface WithdrawnEntry { outcome: 'withdrawn'; identity: RequestIdentity }\ntype SettledEntry = AnsweredEntry | WithdrawnEntry;\n\nconst MAX_SETTLED_REQUESTS = 1_024;\nconst expired = () => new AgentError('REQUEST_EXPIRED','The native permission request is no longer pending.');\nconst unknown = () => new AgentError('UNKNOWN_REQUEST','Permission request is unavailable in this coordinator.');\nconst identity = (request: ApprovalRequest): RequestIdentity => ({\n requestId:request.requestId,taskId:request.taskId,sessionId:request.sessionId,\n});\n\n/** Retains pending requests and a bounded settlement-ordered outcome history. */\nexport class ApprovalRegistry {\n private pending = new Map<string,PendingEntry>();\n private settled = new Map<string,SettledEntry>();\n constructor(private readonly changed: (taskId: string) => void) {}\n\n async register(taskId: string, sessionId: string, request: NativeApprovalRequest, signal: AbortSignal): Promise<ApprovalContent> {\n if (signal.aborted) throw expired();\n if (this.pendingFor(taskId).length >= 32)\n throw new AgentError('INPUT_REQUIRED','A task cannot wait on more than 32 permission requests.');\n let copy: NativeApprovalRequest;\n try {\n const serialized = JSON.stringify(request);\n if (Buffer.byteLength(serialized) > 64 * 1024) throw new Error();\n copy = JSON.parse(serialized) as NativeApprovalRequest;\n } catch { throw new AgentError('INPUT_REQUIRED','The native permission request cannot be represented within 64 KiB.'); }\n if (copy.kind !== 'permission' || !['codex','claudeCode','fx'].includes(copy.harness) || typeof copy.message !== 'string')\n throw new AgentError('INPUT_REQUIRED','The native permission request cannot be represented.');\n validateApprovalSchema(copy.requestedSchema);\n const requestId = `req_${randomUUID()}`;\n const snapshot: ApprovalRequest = {...copy,requestId,taskId,sessionId};\n if (Buffer.byteLength(JSON.stringify(snapshot)) > 64 * 1024)\n throw new AgentError('INPUT_REQUIRED','The native permission request cannot be represented within 64 KiB.');\n const answer = new Promise<ApprovalContent>((resolve,reject) => {\n const abort = () => this.retire(requestId);\n this.pending.set(requestId,{outcome:'pending',request:snapshot,\n continuation:{resolve,reject,cleanup:() => signal.removeEventListener('abort',abort)}});\n signal.addEventListener('abort',abort,{once:true});\n });\n this.changed(taskId);\n return answer;\n }\n\n request(id: string): RequestIdentity {\n const pending = this.pending.get(id);\n if (pending) return identity(pending.request);\n const settled = this.settled.get(id);\n if (!settled) throw unknown();\n return {...settled.identity};\n }\n\n respond(id: string, content: unknown) {\n const pending = this.pending.get(id);\n if (!pending) {\n const settled = this.settled.get(id);\n if (!settled) throw unknown();\n if (settled.outcome === 'withdrawn') throw expired();\n this.validateBoundedContent(content);\n if (!isDeepStrictEqual(settled.answer,content))\n throw new AgentError('INVALID_APPROVAL_RESPONSE','This permission request already has a different answer.');\n return this.receipt(settled.identity);\n }\n this.validateBoundedContent(content);\n const answer = validateApprovalContent(pending.request.requestedSchema,content);\n const requestIdentity = identity(pending.request);\n this.pending.delete(id);\n pending.continuation.cleanup();\n this.retain({outcome:'answered',identity:requestIdentity,answer:structuredClone(answer)});\n pending.continuation.resolve(answer);\n this.changed(requestIdentity.taskId);\n return this.receipt(requestIdentity);\n }\n\n pendingFor(taskId: string): ApprovalRequest[] {\n return [...this.pending.values()].filter(entry => entry.request.taskId === taskId)\n .map(entry => structuredClone(entry.request));\n }\n\n retireTask(taskId: string) {\n for (const [id,entry] of this.pending) if (entry.request.taskId === taskId) this.retire(id);\n }\n\n close() { for (const id of [...this.pending.keys()]) this.retire(id); }\n\n private retire(id: string) {\n const entry = this.pending.get(id);\n if (!entry) return;\n const requestIdentity = identity(entry.request);\n this.pending.delete(id);\n entry.continuation.cleanup();\n this.retain({outcome:'withdrawn',identity:requestIdentity});\n entry.continuation.reject(expired());\n this.changed(requestIdentity.taskId);\n }\n\n private retain(entry: SettledEntry) {\n this.settled.set(entry.identity.requestId,entry);\n while (this.settled.size > MAX_SETTLED_REQUESTS) {\n const oldest = this.settled.keys().next().value;\n if (oldest !== undefined) this.settled.delete(oldest);\n }\n }\n\n private validateBoundedContent(content: unknown) {\n let serialized: string | undefined;\n try { serialized = JSON.stringify(content); } catch { /* Report no submitted data. */ }\n if (!serialized || Buffer.byteLength(serialized) > 16 * 1024)\n throw new AgentError('INVALID_APPROVAL_RESPONSE','Approval content must be a JSON object within 16 KiB.');\n }\n\n private receipt(request: RequestIdentity) {\n return {version:1 as const,type:'approval_answered' as const,requestId:request.requestId,\n taskId:request.taskId,sessionId:request.sessionId};\n }\n}\n"]}
1
+ {"version":3,"file":"approval-registry.js","sourceRoot":"","sources":["../../src/runtime/approval-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAuBzF,MAAM,oBAAoB,GAAG,KAAK,CAAC;AACnC,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,IAAI,UAAU,CAAC,iBAAiB,EAAC,qDAAqD,CAAC,CAAC;AAC9G,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,IAAI,UAAU,CAAC,iBAAiB,EAAC,wDAAwD,CAAC,CAAC;AACjH,MAAM,QAAQ,GAAG,CAAC,OAAwB,EAAmB,EAAE,CAAC,CAAC;IAC/D,SAAS,EAAC,OAAO,CAAC,SAAS,EAAC,MAAM,EAAC,OAAO,CAAC,MAAM,EAAC,SAAS,EAAC,OAAO,CAAC,SAAS;CAC9E,CAAC,CAAC;AAEH,iFAAiF;AACjF,MAAM,OAAO,gBAAgB;IAGE,OAAO;IAF5B,OAAO,GAAG,IAAI,GAAG,EAAuB,CAAC;IACzC,OAAO,GAAG,IAAI,GAAG,EAAuB,CAAC;IACjD,YAA6B,OAAiC;uBAAjC,OAAO;IAA6B,CAAC;IAElE,KAAK,CAAC,QAAQ,CAAC,MAAc,EAAE,SAAiB,EAAE,OAA8B,EAAE,MAAmB;QACnG,IAAI,MAAM,CAAC,OAAO;YAAE,MAAM,OAAO,EAAE,CAAC;QACpC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,IAAI,EAAE;YACtC,MAAM,IAAI,UAAU,CAAC,gBAAgB,EAAC,yDAAyD,CAAC,CAAC;QACnG,IAAI,IAA2B,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAC3C,IAAI,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,IAAI;gBAAE,MAAM,IAAI,KAAK,EAAE,CAAC;YACjE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAA0B,CAAC;QACzD,CAAC;QAAC,MAAM,CAAC;YAAC,MAAM,IAAI,UAAU,CAAC,gBAAgB,EAAC,oEAAoE,CAAC,CAAC;QAAC,CAAC;QACxH,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,IAAI,CAAC,CAAC,OAAO,EAAC,YAAY,EAAC,IAAI,EAAC,UAAU,EAAC,SAAS,EAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ;YACrJ,MAAM,IAAI,UAAU,CAAC,gBAAgB,EAAC,sDAAsD,CAAC,CAAC;QAChG,sBAAsB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC7C,MAAM,SAAS,GAAG,OAAO,UAAU,EAAE,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAoB,EAAC,GAAG,IAAI,EAAC,SAAS,EAAC,MAAM,EAAC,SAAS,EAAC,CAAC;QACvE,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI;YACzD,MAAM,IAAI,UAAU,CAAC,gBAAgB,EAAC,oEAAoE,CAAC,CAAC;QAC9G,IAAI,GAAiC,CAAC;QACtC,IAAI,OAAiC,CAAC;QACtC,IAAI,CAAC;YAAC,MAAM,UAAU,GAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YAAC,GAAG,GAAC,UAAU,CAAC,OAAO,CAAC;YAAC,OAAO,GAAC,UAAU,CAAC,OAAO,CAAC;QAAC,CAAC;QACjG,OAAM,KAAK,EAAE,CAAC;YACZ,IAAI,CAAC,CAAC,KAAK,YAAY,UAAU,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB;gBAAE,MAAM,KAAK,CAAC;YACnF,GAAG,GAAC,KAAK,CAAC;YAAC,OAAO,GAAC,IAAI,GAAG,EAAE,CAAC;QAC/B,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,OAAO,CAAkB,CAAC,OAAO,EAAC,MAAM,EAAE,EAAE;YAC7D,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC3C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAC,EAAC,OAAO,EAAC,SAAS,EAAC,OAAO,EAAC,QAAQ,EAAC,GAAG,EAAC,OAAO;gBACxE,YAAY,EAAC,EAAC,OAAO,EAAC,MAAM,EAAC,OAAO,EAAC,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAC,KAAK,CAAC,EAAC,EAAC,CAAC,CAAC;YAC1F,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAC,KAAK,EAAC,EAAC,IAAI,EAAC,IAAI,EAAC,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACrB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO,CAAC,EAAU;QAChB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACrC,IAAI,OAAO;YAAE,OAAO,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,OAAO;YAAE,MAAM,OAAO,EAAE,CAAC;QAC9B,OAAO,EAAC,GAAG,OAAO,CAAC,QAAQ,EAAC,CAAC;IAC/B,CAAC;IAED,OAAO,CAAC,EAAU,EAAE,OAAgB;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACrC,IAAI,CAAC,OAAO;gBAAE,MAAM,OAAO,EAAE,CAAC;YAC9B,IAAI,OAAO,CAAC,OAAO,KAAK,WAAW;gBAAE,MAAM,OAAO,EAAE,CAAC;YACrD,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;YACrC,IAAI,MAAsB,CAAC;YAC3B,IAAI,CAAC;gBAAC,MAAM,GAAC,iBAAiB,CAAC,OAAO,CAAC,MAAM,EAAC,uBAAuB,CAAC,OAAO,CAAC,MAAM,EAAC,OAAO,CAAC,CAAC,CAAC;YAAC,CAAC;YACjG,MAAM,CAAC;gBAAC,eAAe,EAAE,CAAC;YAAC,CAAC;YAC5B,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,MAAM,EAAC,MAAM,CAAC;gBAC3C,MAAM,IAAI,UAAU,CAAC,2BAA2B,EAAC,yDAAyD,CAAC,CAAC;YAC9G,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,EAAC,uBAAuB,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,EAAC,OAAO,CAAC,CAAC,CAAC;QACnI,MAAM,eAAe,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACxB,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,EAAC,OAAO,EAAC,UAAU,EAAC,QAAQ,EAAC,eAAe,EAAC,MAAM,EAAC,eAAe,CAAC,MAAM,CAAC;YACrF,MAAM,EAAC,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,EAAC,OAAO,EAAC,OAAO,CAAC,OAAO,EAAC,CAAC,CAAC;QACpF,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IACvC,CAAC;IAED,UAAU,CAAC,MAAc;QACvB,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC;aAC/E,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,aAAa,CAAC,MAAc;QAC1B,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC;aAC/E,GAAG,CAAC,KAAK,CAAC,EAAE;YACX,IAAI,KAAK,CAAC,GAAG,YAAY,UAAU;gBAAE,MAAM,IAAI,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC5F,OAAO,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACP,CAAC;IAED,UAAU,CAAC,EAAU,EAAE,QAAiB;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC3D,IAAI,CAAC,KAAK;YAAE,MAAM,OAAO,EAAE,CAAC;QAC5B,IAAI,KAAK,CAAC,OAAO,KAAK,WAAW;YAAE,MAAM,OAAO,EAAE,CAAC;QACnD,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,CAAC,UAAU,EAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;eACzH,OAAO,QAAQ,CAAC,QAAQ,KAAK,QAAQ;YAAE,eAAe,EAAE,CAAC;QAC9D,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACrD,IAAI,CAAC,OAAO;YAAE,eAAe,EAAE,CAAC;QAChC,MAAM,SAAS,GAAG,QAAuC,CAAC;QAC1D,IAAI,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,IAAI,OAAO,CAAC,MAAM,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC;mBACtE,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,IAAI,IAAI,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,MAAM,CAAC,MAAM;mBACvH,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,MAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAAE,eAAe,EAAE,CAAC;YACzF,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAC3C,MAAM,GAAG,EAAC,GAAG,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC;QAC9E,CAAC;aAAM,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAC,QAAQ,CAAC;YAAE,eAAe,EAAE,CAAC;QAC/D,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,EAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IAED,UAAU,CAAC,MAAc;QACvB,KAAK,MAAM,CAAC,EAAE,EAAC,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO;YAAE,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,MAAM;gBAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC9F,CAAC;IAED,KAAK,KAAK,KAAK,MAAM,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAE/D,MAAM,CAAC,EAAU;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,MAAM,eAAe,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACxB,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,EAAC,OAAO,EAAC,WAAW,EAAC,QAAQ,EAAC,eAAe,EAAC,CAAC,CAAC;QAC5D,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAEO,MAAM,CAAC,KAAmB;QAChC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,EAAC,KAAK,CAAC,CAAC;QACjD,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,oBAAoB,EAAE,CAAC;YAChD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YAChD,IAAI,MAAM,KAAK,SAAS;gBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAEO,sBAAsB,CAAC,OAAgB;QAC7C,IAAI,UAA8B,CAAC;QACnC,IAAI,CAAC;YAAC,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,+BAA+B,CAAC,CAAC;QACvF,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,IAAI;YAC1D,MAAM,IAAI,UAAU,CAAC,2BAA2B,EAAC,uDAAuD,CAAC,CAAC;IAC9G,CAAC;IAEO,OAAO,CAAC,OAAwB;QACtC,OAAO,EAAC,OAAO,EAAC,CAAU,EAAC,IAAI,EAAC,mBAA4B,EAAC,SAAS,EAAC,OAAO,CAAC,SAAS;YACtF,MAAM,EAAC,OAAO,CAAC,MAAM,EAAC,SAAS,EAAC,OAAO,CAAC,SAAS,EAAC,CAAC;IACvD,CAAC;CACF;AAED,SAAS,eAAe;IACtB,MAAM,IAAI,UAAU,CAAC,2BAA2B,EAAC,6DAA6D,CAAC,CAAC;AAClH,CAAC;AAED,SAAS,KAAK,CAAC,KAAc;IAC3B,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;WACtE,CAAC,MAAM,CAAC,SAAS,EAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;AACtE,CAAC;AAED,SAAS,SAAS,CAAC,OAAwB;IACzC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAwB,CAAC;IAChD,MAAM,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC,UAAU,CAAC,MAAM,CAAC;IAC9D,MAAM,UAAU,GAAG,OAAO,CAAC,eAAe,CAAC,UAAU,CAAC,KAAK,CAAC;IAC5D,IAAI,MAA8C,CAAC;IACnD,IAAI,WAAW,EAAE,IAAI,KAAK,OAAO,IAAI,WAAW,CAAC,KAAK,CAAC,KAAK,IAAI,UAAU,EAAE,IAAI,KAAK,QAAQ,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;QAClH,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAC,EAAE,EAAC,MAAM,CAAC,KAAK,EAAC,KAAK,EAAC,MAAM,CAAC,KAAK,EAAC,CAAC,CAAC,CAAC;QACvF,KAAK,MAAM,MAAM,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;YACtC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;YAC9D,MAAM,MAAM,GAAmB,EAAC,EAAE,EAAC,OAAO,UAAU,EAAE,EAAE,EAAC,KAAK,EAAC,kBAAkB,KAAK,EAAE,EAAC,QAAQ,EAAC,OAAO,EAAC,KAAK,EAAC,CAAC;YACjH,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAC,EAAC,MAAM,EAAC,MAAM,EAAC,EAAC,KAAK,EAAC,MAAM,CAAC,KAAK,EAAC,EAAC,MAAM,EAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAA,EAAE,CAAA,KAAK,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC;QACjG,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,QAAQ,GAAG,OAAO,CAAC,eAAe,CAAC,UAAU,CAAC,QAAQ,CAAC;QAC7D,MAAM,OAAO,GAAC,QAAQ,EAAE,IAAI,KAAK,QAAQ;YACvC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAA,EAAE,CAAA,CAAC,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3F,IAAI,CAAC,OAAO,EAAE,MAAM;YAAE,aAAa,EAAE,CAAC;QACtC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,gBAAgB,CAAC,OAAO,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACxD,MAAM,MAAM,GAAmB,QAAQ,CAAC,QAAQ,KAAK,QAAQ;gBAC3D,CAAC,CAAC,EAAC,EAAE,EAAC,OAAO,UAAU,EAAE,EAAE,EAAC,KAAK,EAAC,MAAM,CAAC,KAAK,EAAC,QAAQ,EAAC,QAAQ,EAAC;gBACjE,CAAC,CAAC,EAAC,EAAE,EAAC,OAAO,UAAU,EAAE,EAAE,EAAC,KAAK,EAAC,MAAM,CAAC,KAAK,EAAC,QAAQ,EAAC,QAAQ,CAAC,QAAQ,EAAC,KAAK,EAAC,QAAQ,CAAC,KAAK;oBAC1F,GAAG,CAAC,QAAQ,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAC,WAAW,EAAC,sCAAsC,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAC,CAAC;YACrG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAC,EAAC,MAAM,EAAC,MAAM,EAAC,EAAC,QAAQ,EAAC,MAAM,CAAC,KAAK,EAAC,EAAC,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,IAAI;QAAE,aAAa,EAAE,CAAC;IACnC,MAAM,MAAM,GAAC,IAAI,GAAG,EAA0B,CAAC;IAC/C,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QACvC,MAAM,GAAG,GAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACjH,MAAM,KAAK,GAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAC,KAAK,CAAC,CAAC;IAChF,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,KAAK,MAAM,OAAO,IAAI,KAAK,EAAE,CAAC;gBACvF,MAAM,MAAM,GAAC,OAAO,OAAO,CAAC,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAClH,OAAO,CAAC,MAAM,GAAC,EAAC,GAAG,OAAO,CAAC,MAAM,EAAC,WAAW,EAAC,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,EAAC,kBAAkB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAC,CAAC;YACnI,CAAC;IACD,OAAO,EAAC,OAAO,EAAC,EAAC,EAAE,EAAC,OAAO,CAAC,SAAS,EAAC,MAAM,EAAC,OAAO,CAAC,MAAM,EAAC,SAAS,EAAC,OAAO,CAAC,SAAS,EAAC,OAAO,EAAC,OAAO,CAAC,OAAO;YAC7G,OAAO,EAAC,OAAO,CAAC,OAAO,EAAC,OAAO,EAAC,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAA,EAAE,CAAA,KAAK,CAAC,MAAM,CAAC;YAC9E,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAC,MAAM,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAC,OAAO,EAAC,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAC,EAAC,OAAO,EAAC,CAAC;AACjH,CAAC;AAED,SAAS,aAAa;IACpB,MAAM,IAAI,UAAU,CAAC,gBAAgB,EAAC,sDAAsD,CAAC,CAAC;AAChG,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAwB,EAAE,KAAa;IAC/D,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IACvF,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC;IACrF,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;IACvF,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,EAAC,QAAQ,EAAC,QAAQ,EAAC,CAAC;IAClD,IAAI,CAAC,kBAAkB,EAAC,eAAe,EAAC,cAAc,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,KAAK,EAAC,SAAS,EAAC,CAAC;IAClH,IAAI,IAAI,KAAK,eAAe;QAAE,OAAO,EAAC,QAAQ,EAAC,MAAM,EAAC,KAAK,EAAC,SAAS,EAAC,CAAC;IACvE,IAAI,CAAC,QAAQ,EAAC,OAAO,EAAC,YAAY,EAAC,MAAM,EAAC,cAAc,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,KAAK,EAAC,MAAM,EAAC,CAAC;IACjH,IAAI,CAAC,SAAS,EAAC,MAAM,EAAC,QAAQ,EAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,EAAC,QAAQ,EAAC,MAAM,EAAC,KAAK,EAAC,MAAM,EAAC,CAAC;IACpG,aAAa,EAAE,CAAC;AAClB,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAqB,EAAC,MAAsB;IACrE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IACjD,MAAM,KAAK,GAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC;IACrC,IAAI,KAAK,EAAE,IAAI,KAAK,OAAO;QAAE,OAAO,MAAM,CAAC;IAC3C,MAAM,KAAK,GAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAA,EAAE,CAAA,CAAC,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAA,EAAE,CAAA,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7H,MAAM,QAAQ,GAAC,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACtC,OAAO,EAAC,GAAG,MAAM,EAAC,MAAM,EAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAA,EAAE,CAAA,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAC,CAAC;AACrE,CAAC","sourcesContent":["import { randomUUID } from 'node:crypto';\nimport { isDeepStrictEqual } from 'node:util';\nimport { AgentError } from '../errors.js';\nimport { validateApprovalContent, validateApprovalSchema } from '../approvals/schema.js';\nimport type { ApprovalContent, ApprovalSchema, NativeApprovalRequest } from '../approvals/types.js';\nimport type { ApprovalRequest } from './types.js';\nimport type { ApprovalAction, ApprovalResponse, SdkApprovalRequest } from './task-data.js';\n\ntype RequestIdentity = Pick<ApprovalRequest,'requestId'|'taskId'|'sessionId'>;\ninterface Continuation {\n resolve(content: ApprovalContent): void;\n reject(error: AgentError): void;\n cleanup(): void;\n}\ninterface PendingEntry {\n outcome: 'pending';\n request: ApprovalRequest;\n continuation: Continuation;\n sdk: SdkApprovalRequest | AgentError;\n actions: Map<string, ActionMapping>;\n}\ninterface AnsweredEntry { outcome: 'answered'; identity: RequestIdentity; answer: ApprovalContent; schema: ApprovalSchema; actions: Map<string, ActionMapping> }\ninterface WithdrawnEntry { outcome: 'withdrawn'; identity: RequestIdentity }\ntype SettledEntry = AnsweredEntry | WithdrawnEntry;\ninterface ActionMapping { action: ApprovalAction; native: ApprovalContent; grants?: readonly string[] }\n\nconst MAX_SETTLED_REQUESTS = 1_024;\nconst expired = () => new AgentError('REQUEST_EXPIRED','The native permission request is no longer pending.');\nconst unknown = () => new AgentError('UNKNOWN_REQUEST','Permission request is unavailable in this coordinator.');\nconst identity = (request: ApprovalRequest): RequestIdentity => ({\n requestId:request.requestId,taskId:request.taskId,sessionId:request.sessionId,\n});\n\n/** Retains pending requests and a bounded settlement-ordered outcome history. */\nexport class ApprovalRegistry {\n private pending = new Map<string,PendingEntry>();\n private settled = new Map<string,SettledEntry>();\n constructor(private readonly changed: (taskId: string) => void) {}\n\n async register(taskId: string, sessionId: string, request: NativeApprovalRequest, signal: AbortSignal): Promise<ApprovalContent> {\n if (signal.aborted) throw expired();\n if (this.pendingFor(taskId).length >= 32)\n throw new AgentError('INPUT_REQUIRED','A task cannot wait on more than 32 permission requests.');\n let copy: NativeApprovalRequest;\n try {\n const serialized = JSON.stringify(request);\n if (Buffer.byteLength(serialized) > 64 * 1024) throw new Error();\n copy = JSON.parse(serialized) as NativeApprovalRequest;\n } catch { throw new AgentError('INPUT_REQUIRED','The native permission request cannot be represented within 64 KiB.'); }\n if (copy.kind !== 'permission' || !['codex','claudeCode','fx','opencode','copilot','cursor'].includes(copy.harness) || typeof copy.message !== 'string')\n throw new AgentError('INPUT_REQUIRED','The native permission request cannot be represented.');\n validateApprovalSchema(copy.requestedSchema);\n const requestId = `req_${randomUUID()}`;\n const snapshot: ApprovalRequest = {...copy,requestId,taskId,sessionId};\n if (Buffer.byteLength(JSON.stringify(snapshot)) > 64 * 1024)\n throw new AgentError('INPUT_REQUIRED','The native permission request cannot be represented within 64 KiB.');\n let sdk:SdkApprovalRequest|AgentError;\n let actions:Map<string,ActionMapping>;\n try { const normalized=normalize(snapshot); sdk=normalized.request; actions=normalized.actions; }\n catch(error) {\n if (!(error instanceof AgentError) || error.code !== 'INPUT_REQUIRED') throw error;\n sdk=error; actions=new Map();\n }\n const answer = new Promise<ApprovalContent>((resolve,reject) => {\n const abort = () => this.retire(requestId);\n this.pending.set(requestId,{outcome:'pending',request:snapshot,sdk,actions,\n continuation:{resolve,reject,cleanup:() => signal.removeEventListener('abort',abort)}});\n signal.addEventListener('abort',abort,{once:true});\n });\n this.changed(taskId);\n return answer;\n }\n\n request(id: string): RequestIdentity {\n const pending = this.pending.get(id);\n if (pending) return identity(pending.request);\n const settled = this.settled.get(id);\n if (!settled) throw unknown();\n return {...settled.identity};\n }\n\n respond(id: string, content: unknown) {\n const pending = this.pending.get(id);\n if (!pending) {\n const settled = this.settled.get(id);\n if (!settled) throw unknown();\n if (settled.outcome === 'withdrawn') throw expired();\n this.validateBoundedContent(content);\n let answer:ApprovalContent;\n try { answer=canonicalBySchema(settled.schema,validateApprovalContent(settled.schema,content)); }\n catch { invalidResponse(); }\n if (!isDeepStrictEqual(settled.answer,answer))\n throw new AgentError('INVALID_APPROVAL_RESPONSE','This permission request already has a different answer.');\n return this.receipt(settled.identity);\n }\n this.validateBoundedContent(content);\n const answer = canonicalBySchema(pending.request.requestedSchema,validateApprovalContent(pending.request.requestedSchema,content));\n const requestIdentity = identity(pending.request);\n this.pending.delete(id);\n pending.continuation.cleanup();\n this.retain({outcome:'answered',identity:requestIdentity,answer:structuredClone(answer),\n schema:structuredClone(pending.request.requestedSchema),actions:pending.actions});\n pending.continuation.resolve(answer);\n this.changed(requestIdentity.taskId);\n return this.receipt(requestIdentity);\n }\n\n pendingFor(taskId: string): ApprovalRequest[] {\n return [...this.pending.values()].filter(entry => entry.request.taskId === taskId)\n .map(entry => structuredClone(entry.request));\n }\n\n sdkPendingFor(taskId: string): SdkApprovalRequest[] {\n return [...this.pending.values()].filter(entry => entry.request.taskId === taskId)\n .map(entry => {\n if (entry.sdk instanceof AgentError) throw new AgentError(entry.sdk.code,entry.sdk.message);\n return structuredClone(entry.sdk);\n });\n }\n\n respondSdk(id: string, response: unknown) {\n const entry = this.pending.get(id) ?? this.settled.get(id);\n if (!entry) throw unknown();\n if (entry.outcome === 'withdrawn') throw expired();\n this.validateBoundedContent(response);\n if (!plain(response) || Reflect.ownKeys(response).some(key => typeof key !== 'string' || !['actionId','grants'].includes(key))\n || typeof response.actionId !== 'string') invalidResponse();\n const mapping = entry.actions.get(response.actionId);\n if (!mapping) invalidResponse();\n const submitted = response as unknown as ApprovalResponse;\n let native = structuredClone(mapping.native);\n if (mapping.grants) {\n if (mapping.action.decision !== 'allow' || !Array.isArray(submitted.grants)\n || submitted.grants.some(value => typeof value !== 'string') || new Set(submitted.grants).size !== submitted.grants.length\n || submitted.grants.some(value => !mapping.grants!.includes(value))) invalidResponse();\n const selected = new Set(submitted.grants);\n native = {...native, grants: mapping.grants.filter(id => selected.has(id))};\n } else if (Object.hasOwn(response,'grants')) invalidResponse();\n return this.respond(id,native);\n }\n\n retireTask(taskId: string) {\n for (const [id,entry] of this.pending) if (entry.request.taskId === taskId) this.retire(id);\n }\n\n close() { for (const id of [...this.pending.keys()]) this.retire(id); }\n\n private retire(id: string) {\n const entry = this.pending.get(id);\n if (!entry) return;\n const requestIdentity = identity(entry.request);\n this.pending.delete(id);\n entry.continuation.cleanup();\n this.retain({outcome:'withdrawn',identity:requestIdentity});\n entry.continuation.reject(expired());\n this.changed(requestIdentity.taskId);\n }\n\n private retain(entry: SettledEntry) {\n this.settled.set(entry.identity.requestId,entry);\n while (this.settled.size > MAX_SETTLED_REQUESTS) {\n const oldest = this.settled.keys().next().value;\n if (oldest !== undefined) this.settled.delete(oldest);\n }\n }\n\n private validateBoundedContent(content: unknown) {\n let serialized: string | undefined;\n try { serialized = JSON.stringify(content); } catch { /* Report no submitted data. */ }\n if (!serialized || Buffer.byteLength(serialized) > 16 * 1024)\n throw new AgentError('INVALID_APPROVAL_RESPONSE','Approval content must be a JSON object within 16 KiB.');\n }\n\n private receipt(request: RequestIdentity) {\n return {version:1 as const,type:'approval_answered' as const,requestId:request.requestId,\n taskId:request.taskId,sessionId:request.sessionId};\n }\n}\n\nfunction invalidResponse(): never {\n throw new AgentError('INVALID_APPROVAL_RESPONSE','The approval response does not match the requested actions.');\n}\n\nfunction plain(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n && [Object.prototype,null].includes(Object.getPrototypeOf(value));\n}\n\nfunction normalize(request: ApprovalRequest): {request: SdkApprovalRequest; actions: Map<string,ActionMapping>} {\n const actions = new Map<string,ActionMapping>();\n const grantsField = request.requestedSchema.properties.grants;\n const scopeField = request.requestedSchema.properties.scope;\n let grants: {id:string;label:string}[] | undefined;\n if (grantsField?.type === 'array' && grantsField.items.anyOf && scopeField?.type === 'string' && scopeField.oneOf) {\n grants = grantsField.items.anyOf.map(choice => ({id:choice.const,label:choice.title}));\n for (const choice of scopeField.oneOf) {\n const scope = choice.const === 'session' ? 'session' : 'turn';\n const action: ApprovalAction = {id:`act_${randomUUID()}`,label:`Allow for this ${scope}`,decision:'allow',scope};\n actions.set(action.id,{action,native:{scope:choice.const},grants:grants.map(grant=>grant.id)});\n }\n } else {\n const decision = request.requestedSchema.properties.decision;\n const choices=decision?.type === 'string'\n ? (decision.oneOf ?? decision.enum?.map(value=>({const:value,title:value}))) : undefined;\n if (!choices?.length) invalidNative();\n for (const choice of choices) {\n const metadata = decisionMetadata(request,choice.const);\n const action: ApprovalAction = metadata.decision === 'cancel'\n ? {id:`act_${randomUUID()}`,label:choice.title,decision:'cancel'}\n : {id:`act_${randomUUID()}`,label:choice.title,decision:metadata.decision,scope:metadata.scope,\n ...(metadata.scope === 'session' ? {description:'Applies to this native conversation.'} : {})};\n actions.set(action.id,{action,native:{decision:choice.const}});\n }\n }\n if (!actions.size) invalidNative();\n const groups=new Map<string,ActionMapping[]>();\n for (const mapping of actions.values()) {\n const key=mapping.action.decision === 'cancel' ? 'cancel' : `${mapping.action.decision}:${mapping.action.scope}`;\n const group=groups.get(key) ?? []; group.push(mapping); groups.set(key,group);\n }\n for (const group of groups.values()) if (group.length > 1) for (const mapping of group) {\n const native=typeof mapping.native.decision === 'string' ? mapping.native.decision : String(mapping.native.scope);\n mapping.action={...mapping.action,description:[mapping.action.description,`Native option: ${native}`].filter(Boolean).join(' ')};\n }\n return {request:{id:request.requestId,taskId:request.taskId,sessionId:request.sessionId,harness:request.harness,\n message:request.message,actions:[...actions.values()].map(value=>value.action),\n ...(grants ? {grants} : {}),...(request.context ? {context:structuredClone(request.context)} : {})},actions};\n}\n\nfunction invalidNative(): never {\n throw new AgentError('INPUT_REQUIRED','The native permission request cannot be represented.');\n}\n\nfunction decisionMetadata(request: ApprovalRequest, value: string): {decision:'allow'|'deny';scope:'once'|'session'} | {decision:'cancel'} {\n const options = Array.isArray(request.context?.options) ? request.context.options : [];\n const offered = options.find(option => plain(option) && (option.optionId === value));\n const kind = plain(offered) && typeof offered.kind === 'string' ? offered.kind : value;\n if (kind === 'cancel') return {decision:'cancel'};\n if (['acceptForSession','allow_session','allow_always'].includes(kind)) return {decision:'allow',scope:'session'};\n if (kind === 'reject_always') return {decision:'deny',scope:'session'};\n if (['accept','allow','allow_once','once','approve-once'].includes(kind)) return {decision:'allow',scope:'once'};\n if (['decline','deny','reject','reject_once'].includes(kind)) return {decision:'deny',scope:'once'};\n invalidNative();\n}\n\nfunction canonicalBySchema(schema:ApprovalSchema,answer:ApprovalContent):ApprovalContent {\n if (!Array.isArray(answer.grants)) return answer;\n const field=schema.properties.grants;\n if (field?.type !== 'array') return answer;\n const order=(field.items.anyOf ?? field.items.enum?.map(value=>({const:value,title:value})) ?? []).map(choice=>choice.const);\n const selected=new Set(answer.grants);\n return {...answer,grants:order.filter(value=>selected.has(value))};\n}\n"]}
@@ -0,0 +1,22 @@
1
+ import type { HarnessConfig } from '../sdk/types.js';
2
+ import type { CatalogEnvironment } from './catalog.js';
3
+ import type { ExecutionReference, PreparedExecution } from './types.js';
4
+ export interface CapturedChild {
5
+ readonly name: string;
6
+ readonly description: string;
7
+ }
8
+ export interface CapturedExecution {
9
+ readonly reference: ExecutionReference;
10
+ readonly prepared: PreparedExecution;
11
+ readonly children: readonly CapturedChild[];
12
+ child(name: string): Promise<CapturedExecution>;
13
+ }
14
+ interface CaptureOptions {
15
+ workerModule?: URL;
16
+ shutdownTimeoutMs?: number;
17
+ }
18
+ export declare function captureExecution(agent: string | HarnessConfig, input: CatalogEnvironment, options?: CaptureOptions): Promise<CapturedExecution>;
19
+ /** Captures an already resolved private CLI reference without applying public connected validation. */
20
+ export declare function captureReference(reference: ExecutionReference, input: CatalogEnvironment, options?: CaptureOptions): Promise<CapturedExecution>;
21
+ export declare function checkCapturedExecution(captured: CapturedExecution, input: CatalogEnvironment): Promise<void>;
22
+ export {};