@provos/ironcurtain 0.10.0 → 0.12.0

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 (660) hide show
  1. package/README.md +68 -14
  2. package/dist/auth/oauth-provider.js +1 -4
  3. package/dist/auth/oauth-provider.js.map +1 -1
  4. package/dist/cli-help.d.ts +12 -0
  5. package/dist/cli-help.js +21 -0
  6. package/dist/cli-help.js.map +1 -1
  7. package/dist/cli.js +46 -6
  8. package/dist/cli.js.map +1 -1
  9. package/dist/config/agent-model-guard.d.ts +14 -0
  10. package/dist/config/agent-model-guard.js +24 -0
  11. package/dist/config/agent-model-guard.js.map +1 -0
  12. package/dist/config/config-command.js +277 -7
  13. package/dist/config/config-command.js.map +1 -1
  14. package/dist/config/first-start.js +62 -7
  15. package/dist/config/first-start.js.map +1 -1
  16. package/dist/config/generated/compiled-policy.json +528 -161
  17. package/dist/config/generated/test-scenarios.json +4810 -170
  18. package/dist/config/generated/tool-annotations.json +34 -47
  19. package/dist/config/index.d.ts +58 -0
  20. package/dist/config/index.js +97 -15
  21. package/dist/config/index.js.map +1 -1
  22. package/dist/config/mcp-servers.json +2 -2
  23. package/dist/config/model-provider.d.ts +9 -0
  24. package/dist/config/model-provider.js +13 -0
  25. package/dist/config/model-provider.js.map +1 -1
  26. package/dist/config/paths.d.ts +217 -0
  27. package/dist/config/paths.js +363 -14
  28. package/dist/config/paths.js.map +1 -1
  29. package/dist/config/types.d.ts +7 -1
  30. package/dist/config/user-config.d.ts +101 -6
  31. package/dist/config/user-config.js +145 -31
  32. package/dist/config/user-config.js.map +1 -1
  33. package/dist/config/validate-policy-dir.d.ts +10 -0
  34. package/dist/config/validate-policy-dir.js +59 -0
  35. package/dist/config/validate-policy-dir.js.map +1 -0
  36. package/dist/cron/job-commands.js +22 -2
  37. package/dist/cron/job-commands.js.map +1 -1
  38. package/dist/cron/types.d.ts +16 -2
  39. package/dist/cron/types.js +1 -3
  40. package/dist/cron/types.js.map +1 -1
  41. package/dist/daemon/daemon-command.js +30 -7
  42. package/dist/daemon/daemon-command.js.map +1 -1
  43. package/dist/daemon/ironcurtain-daemon.d.ts +62 -1
  44. package/dist/daemon/ironcurtain-daemon.js +231 -8
  45. package/dist/daemon/ironcurtain-daemon.js.map +1 -1
  46. package/dist/daemon-client/daemon-client.d.ts +123 -0
  47. package/dist/daemon-client/daemon-client.js +324 -0
  48. package/dist/daemon-client/daemon-client.js.map +1 -0
  49. package/dist/docker/adapters/claude-code.js +194 -20
  50. package/dist/docker/adapters/claude-code.js.map +1 -1
  51. package/dist/docker/adapters/codex.d.ts +9 -0
  52. package/dist/docker/adapters/codex.js +297 -0
  53. package/dist/docker/adapters/codex.js.map +1 -0
  54. package/dist/docker/adapters/goose.d.ts +12 -11
  55. package/dist/docker/adapters/goose.js +80 -27
  56. package/dist/docker/adapters/goose.js.map +1 -1
  57. package/dist/docker/agent-adapter.d.ts +183 -5
  58. package/dist/docker/agent-adapter.js +16 -0
  59. package/dist/docker/agent-adapter.js.map +1 -1
  60. package/dist/docker/agent-registry.js +5 -0
  61. package/dist/docker/agent-registry.js.map +1 -1
  62. package/dist/docker/apple-container-manager.d.ts +49 -0
  63. package/dist/docker/apple-container-manager.js +464 -0
  64. package/dist/docker/apple-container-manager.js.map +1 -0
  65. package/dist/docker/code-mode-proxy.d.ts +38 -0
  66. package/dist/docker/code-mode-proxy.js +6 -1
  67. package/dist/docker/code-mode-proxy.js.map +1 -1
  68. package/dist/docker/container-lifecycle.d.ts +2 -2
  69. package/dist/docker/container-lifecycle.js.map +1 -1
  70. package/dist/docker/container-runtime.d.ts +29 -0
  71. package/dist/docker/container-runtime.js +76 -0
  72. package/dist/docker/container-runtime.js.map +1 -0
  73. package/dist/docker/docker-agent-session.d.ts +113 -62
  74. package/dist/docker/docker-agent-session.js +271 -294
  75. package/dist/docker/docker-agent-session.js.map +1 -1
  76. package/dist/docker/docker-infrastructure.d.ts +428 -26
  77. package/dist/docker/docker-infrastructure.js +1005 -70
  78. package/dist/docker/docker-infrastructure.js.map +1 -1
  79. package/dist/docker/docker-manager.d.ts +58 -3
  80. package/dist/docker/docker-manager.js +378 -33
  81. package/dist/docker/docker-manager.js.map +1 -1
  82. package/dist/docker/docker-probe.d.ts +45 -0
  83. package/dist/docker/docker-probe.js +86 -0
  84. package/dist/docker/docker-probe.js.map +1 -0
  85. package/dist/docker/docker-progress-sink.d.ts +43 -0
  86. package/dist/docker/docker-progress-sink.js +299 -0
  87. package/dist/docker/docker-progress-sink.js.map +1 -0
  88. package/dist/docker/mitm-proxy.d.ts +135 -1
  89. package/dist/docker/mitm-proxy.js +611 -25
  90. package/dist/docker/mitm-proxy.js.map +1 -1
  91. package/dist/docker/network-topology.d.ts +81 -0
  92. package/dist/docker/network-topology.js +160 -0
  93. package/dist/docker/network-topology.js.map +1 -0
  94. package/dist/docker/oauth-credentials.d.ts +59 -3
  95. package/dist/docker/oauth-credentials.js +181 -14
  96. package/dist/docker/oauth-credentials.js.map +1 -1
  97. package/dist/docker/oauth-token-manager.js +2 -2
  98. package/dist/docker/oauth-token-manager.js.map +1 -1
  99. package/dist/docker/orientation.d.ts +1 -1
  100. package/dist/docker/package-types.d.ts +1 -1
  101. package/dist/docker/provider-config.d.ts +78 -3
  102. package/dist/docker/provider-config.js +295 -31
  103. package/dist/docker/provider-config.js.map +1 -1
  104. package/dist/docker/provision-lock.d.ts +46 -0
  105. package/dist/docker/provision-lock.js +152 -0
  106. package/dist/docker/provision-lock.js.map +1 -0
  107. package/dist/docker/proxy-tools.d.ts +0 -2
  108. package/dist/docker/proxy-tools.js +2 -7
  109. package/dist/docker/proxy-tools.js.map +1 -1
  110. package/dist/docker/pty-session.d.ts +64 -1
  111. package/dist/docker/pty-session.js +306 -104
  112. package/dist/docker/pty-session.js.map +1 -1
  113. package/dist/docker/pty-types.d.ts +0 -2
  114. package/dist/docker/pty-types.js +0 -2
  115. package/dist/docker/pty-types.js.map +1 -1
  116. package/dist/docker/registry-proxy.d.ts +46 -0
  117. package/dist/docker/registry-proxy.js +255 -1
  118. package/dist/docker/registry-proxy.js.map +1 -1
  119. package/dist/docker/resource-limits.d.ts +134 -0
  120. package/dist/docker/resource-limits.js +203 -0
  121. package/dist/docker/resource-limits.js.map +1 -0
  122. package/dist/docker/spawn-with-idle-timeout.d.ts +39 -0
  123. package/dist/docker/spawn-with-idle-timeout.js +152 -0
  124. package/dist/docker/spawn-with-idle-timeout.js.map +1 -0
  125. package/dist/docker/sse-extractor.d.ts +51 -0
  126. package/dist/docker/sse-extractor.js +303 -0
  127. package/dist/docker/sse-extractor.js.map +1 -0
  128. package/dist/docker/token-stream-bus.d.ts +83 -0
  129. package/dist/docker/token-stream-bus.js +98 -0
  130. package/dist/docker/token-stream-bus.js.map +1 -0
  131. package/dist/docker/token-stream-types.d.ts +71 -0
  132. package/dist/docker/token-stream-types.js +8 -0
  133. package/dist/docker/token-stream-types.js.map +1 -0
  134. package/dist/docker/trajectory-capture.d.ts +79 -0
  135. package/dist/docker/trajectory-capture.js +521 -0
  136. package/dist/docker/trajectory-capture.js.map +1 -0
  137. package/dist/docker/trajectory-reassembler.d.ts +286 -0
  138. package/dist/docker/trajectory-reassembler.js +990 -0
  139. package/dist/docker/trajectory-reassembler.js.map +1 -0
  140. package/dist/docker/trajectory-tap.d.ts +100 -0
  141. package/dist/docker/trajectory-tap.js +410 -0
  142. package/dist/docker/trajectory-tap.js.map +1 -0
  143. package/dist/docker/trajectory-types.d.ts +187 -0
  144. package/dist/docker/trajectory-types.js +43 -0
  145. package/dist/docker/trajectory-types.js.map +1 -0
  146. package/dist/docker/types.d.ts +105 -12
  147. package/dist/doctor/checks.d.ts +171 -0
  148. package/dist/doctor/checks.js +598 -0
  149. package/dist/doctor/checks.js.map +1 -0
  150. package/dist/doctor/doctor-command.d.ts +29 -0
  151. package/dist/doctor/doctor-command.js +190 -0
  152. package/dist/doctor/doctor-command.js.map +1 -0
  153. package/dist/doctor/mcp-liveness.d.ts +28 -0
  154. package/dist/doctor/mcp-liveness.js +92 -0
  155. package/dist/doctor/mcp-liveness.js.map +1 -0
  156. package/dist/doctor/oauth-checks.d.ts +23 -0
  157. package/dist/doctor/oauth-checks.js +157 -0
  158. package/dist/doctor/oauth-checks.js.map +1 -0
  159. package/dist/doctor/output.d.ts +26 -0
  160. package/dist/doctor/output.js +82 -0
  161. package/dist/doctor/output.js.map +1 -0
  162. package/dist/escalation/listener-command.js +0 -3
  163. package/dist/escalation/listener-command.js.map +1 -1
  164. package/dist/event-bus/typed-event-bus.d.ts +26 -0
  165. package/dist/event-bus/typed-event-bus.js +35 -0
  166. package/dist/event-bus/typed-event-bus.js.map +1 -0
  167. package/dist/index.js +54 -21
  168. package/dist/index.js.map +1 -1
  169. package/dist/logger.js +31 -2
  170. package/dist/logger.js.map +1 -1
  171. package/dist/memory/auto-save.d.ts +18 -4
  172. package/dist/memory/auto-save.js +46 -6
  173. package/dist/memory/auto-save.js.map +1 -1
  174. package/dist/memory/memory-policy.d.ts +41 -0
  175. package/dist/memory/memory-policy.js +36 -0
  176. package/dist/memory/memory-policy.js.map +1 -0
  177. package/dist/mux/mux-app.d.ts +2 -0
  178. package/dist/mux/mux-app.js +1 -0
  179. package/dist/mux/mux-app.js.map +1 -1
  180. package/dist/mux/mux-command.d.ts +10 -1
  181. package/dist/mux/mux-command.js +74 -40
  182. package/dist/mux/mux-command.js.map +1 -1
  183. package/dist/mux/mux-renderer.js +2 -12
  184. package/dist/mux/mux-renderer.js.map +1 -1
  185. package/dist/mux/pty-bridge.d.ts +2 -0
  186. package/dist/mux/pty-bridge.js +3 -0
  187. package/dist/mux/pty-bridge.js.map +1 -1
  188. package/dist/mux/session-scanner.js +1 -2
  189. package/dist/mux/session-scanner.js.map +1 -1
  190. package/dist/{pipeline → observability}/llm-logger.d.ts +8 -3
  191. package/dist/{pipeline → observability}/llm-logger.js +8 -3
  192. package/dist/observability/llm-logger.js.map +1 -0
  193. package/dist/observe/observe-command.d.ts +12 -0
  194. package/dist/observe/observe-command.js +285 -0
  195. package/dist/observe/observe-command.js.map +1 -0
  196. package/dist/observe/observe-renderer.d.ts +24 -0
  197. package/dist/observe/observe-renderer.js +87 -0
  198. package/dist/observe/observe-renderer.js.map +1 -0
  199. package/dist/observe/observe-tui-rain.d.ts +42 -0
  200. package/dist/observe/observe-tui-rain.js +531 -0
  201. package/dist/observe/observe-tui-rain.js.map +1 -0
  202. package/dist/observe/observe-tui-text-panel.d.ts +46 -0
  203. package/dist/observe/observe-tui-text-panel.js +525 -0
  204. package/dist/observe/observe-tui-text-panel.js.map +1 -0
  205. package/dist/observe/observe-tui-types.d.ts +270 -0
  206. package/dist/observe/observe-tui-types.js +200 -0
  207. package/dist/observe/observe-tui-types.js.map +1 -0
  208. package/dist/observe/observe-tui-word-scorer.d.ts +143 -0
  209. package/dist/observe/observe-tui-word-scorer.js +572 -0
  210. package/dist/observe/observe-tui-word-scorer.js.map +1 -0
  211. package/dist/observe/observe-tui.d.ts +59 -0
  212. package/dist/observe/observe-tui.js +592 -0
  213. package/dist/observe/observe-tui.js.map +1 -0
  214. package/dist/persona/broad-policy-validator.d.ts +95 -0
  215. package/dist/persona/broad-policy-validator.js +171 -0
  216. package/dist/persona/broad-policy-validator.js.map +1 -0
  217. package/dist/persona/compile-persona-policy.d.ts +54 -2
  218. package/dist/persona/compile-persona-policy.js +29 -4
  219. package/dist/persona/compile-persona-policy.js.map +1 -1
  220. package/dist/persona/event-bus-progress-reporter.d.ts +57 -0
  221. package/dist/persona/event-bus-progress-reporter.js +66 -0
  222. package/dist/persona/event-bus-progress-reporter.js.map +1 -0
  223. package/dist/persona/memory-gate.d.ts +19 -0
  224. package/dist/persona/memory-gate.js +33 -0
  225. package/dist/persona/memory-gate.js.map +1 -0
  226. package/dist/persona/persona-command.js +77 -72
  227. package/dist/persona/persona-command.js.map +1 -1
  228. package/dist/persona/persona-compile-orchestrator.d.ts +101 -0
  229. package/dist/persona/persona-compile-orchestrator.js +504 -0
  230. package/dist/persona/persona-compile-orchestrator.js.map +1 -0
  231. package/dist/persona/persona-service.d.ts +137 -0
  232. package/dist/persona/persona-service.js +263 -0
  233. package/dist/persona/persona-service.js.map +1 -0
  234. package/dist/persona/policy-mutation-audit.d.ts +109 -0
  235. package/dist/persona/policy-mutation-audit.js +179 -0
  236. package/dist/persona/policy-mutation-audit.js.map +1 -0
  237. package/dist/persona/resolve.d.ts +22 -0
  238. package/dist/persona/resolve.js +45 -2
  239. package/dist/persona/resolve.js.map +1 -1
  240. package/dist/persona/rule-delta.d.ts +30 -0
  241. package/dist/persona/rule-delta.js +82 -0
  242. package/dist/persona/rule-delta.js.map +1 -0
  243. package/dist/persona/types.d.ts +28 -0
  244. package/dist/pipeline/annotate.js +10 -2
  245. package/dist/pipeline/annotate.js.map +1 -1
  246. package/dist/pipeline/compile.js +14 -2
  247. package/dist/pipeline/compile.js.map +1 -1
  248. package/dist/pipeline/constitution-compiler.d.ts +25 -14
  249. package/dist/pipeline/constitution-compiler.js +107 -38
  250. package/dist/pipeline/constitution-compiler.js.map +1 -1
  251. package/dist/pipeline/dynamic-list-types.d.ts +3 -6
  252. package/dist/pipeline/dynamic-list-types.js +3 -16
  253. package/dist/pipeline/dynamic-list-types.js.map +1 -1
  254. package/dist/pipeline/pipeline-runner.d.ts +63 -4
  255. package/dist/pipeline/pipeline-runner.js +242 -94
  256. package/dist/pipeline/pipeline-runner.js.map +1 -1
  257. package/dist/pipeline/pipeline-shared.d.ts +33 -4
  258. package/dist/pipeline/pipeline-shared.js +79 -19
  259. package/dist/pipeline/pipeline-shared.js.map +1 -1
  260. package/dist/pipeline/policy-verifier.js +16 -3
  261. package/dist/pipeline/policy-verifier.js.map +1 -1
  262. package/dist/pipeline/proxy-mcp-connections.js +17 -2
  263. package/dist/pipeline/proxy-mcp-connections.js.map +1 -1
  264. package/dist/pipeline/refresh-lists.js +3 -5
  265. package/dist/pipeline/refresh-lists.js.map +1 -1
  266. package/dist/pipeline/scenario-generator.d.ts +4 -8
  267. package/dist/pipeline/scenario-generator.js +13 -46
  268. package/dist/pipeline/scenario-generator.js.map +1 -1
  269. package/dist/sandbox/index.d.ts +29 -0
  270. package/dist/sandbox/index.js +351 -119
  271. package/dist/sandbox/index.js.map +1 -1
  272. package/dist/sandbox/ironcurtain-protocol.d.ts +52 -0
  273. package/dist/sandbox/ironcurtain-protocol.js +185 -0
  274. package/dist/sandbox/ironcurtain-protocol.js.map +1 -0
  275. package/dist/session/agent-session.d.ts +6 -0
  276. package/dist/session/agent-session.js +16 -5
  277. package/dist/session/agent-session.js.map +1 -1
  278. package/dist/session/cli-transport.js +0 -6
  279. package/dist/session/cli-transport.js.map +1 -1
  280. package/dist/session/index.d.ts +35 -14
  281. package/dist/session/index.js +333 -130
  282. package/dist/session/index.js.map +1 -1
  283. package/dist/session/preflight.d.ts +21 -13
  284. package/dist/session/preflight.js +227 -88
  285. package/dist/session/preflight.js.map +1 -1
  286. package/dist/session/prompts.d.ts +2 -5
  287. package/dist/session/prompts.js.map +1 -1
  288. package/dist/session/session-manager.d.ts +61 -6
  289. package/dist/session/session-manager.js +72 -10
  290. package/dist/session/session-manager.js.map +1 -1
  291. package/dist/session/session-metadata.d.ts +21 -5
  292. package/dist/session/session-metadata.js +34 -12
  293. package/dist/session/session-metadata.js.map +1 -1
  294. package/dist/session/types.d.ts +320 -5
  295. package/dist/session/types.js +57 -1
  296. package/dist/session/types.js.map +1 -1
  297. package/dist/signal/bot-command.js +6 -1
  298. package/dist/signal/bot-command.js.map +1 -1
  299. package/dist/signal/setup-signal.js +13 -21
  300. package/dist/signal/setup-signal.js.map +1 -1
  301. package/dist/signal/signal-bot-daemon.d.ts +16 -1
  302. package/dist/signal/signal-bot-daemon.js +39 -27
  303. package/dist/signal/signal-bot-daemon.js.map +1 -1
  304. package/dist/signal/signal-container.d.ts +3 -3
  305. package/dist/signal/signal-container.js +9 -3
  306. package/dist/signal/signal-container.js.map +1 -1
  307. package/dist/skills/discovery.d.ts +77 -0
  308. package/dist/skills/discovery.js +206 -0
  309. package/dist/skills/discovery.js.map +1 -0
  310. package/dist/skills/index.d.ts +4 -0
  311. package/dist/skills/index.js +3 -0
  312. package/dist/skills/index.js.map +1 -0
  313. package/dist/skills/staging.d.ts +28 -0
  314. package/dist/skills/staging.js +68 -0
  315. package/dist/skills/staging.js.map +1 -0
  316. package/dist/skills/types.d.ts +46 -0
  317. package/dist/skills/types.js +2 -0
  318. package/dist/skills/types.js.map +1 -0
  319. package/dist/trusted-process/approval-whitelist.d.ts +0 -2
  320. package/dist/trusted-process/approval-whitelist.js +17 -17
  321. package/dist/trusted-process/approval-whitelist.js.map +1 -1
  322. package/dist/trusted-process/async-mutex.d.ts +32 -0
  323. package/dist/trusted-process/async-mutex.js +50 -0
  324. package/dist/trusted-process/async-mutex.js.map +1 -0
  325. package/dist/trusted-process/audit-log.d.ts +38 -1
  326. package/dist/trusted-process/audit-log.js +82 -13
  327. package/dist/trusted-process/audit-log.js.map +1 -1
  328. package/dist/trusted-process/call-circuit-breaker.d.ts +6 -0
  329. package/dist/trusted-process/call-circuit-breaker.js +23 -3
  330. package/dist/trusted-process/call-circuit-breaker.js.map +1 -1
  331. package/dist/trusted-process/container-command.d.ts +35 -0
  332. package/dist/trusted-process/container-command.js +49 -0
  333. package/dist/trusted-process/container-command.js.map +1 -0
  334. package/dist/trusted-process/control-server.d.ts +101 -0
  335. package/dist/trusted-process/control-server.js +282 -0
  336. package/dist/trusted-process/control-server.js.map +1 -0
  337. package/dist/trusted-process/domain-utils.d.ts +6 -6
  338. package/dist/trusted-process/domain-utils.js +7 -23
  339. package/dist/trusted-process/domain-utils.js.map +1 -1
  340. package/dist/trusted-process/error-prefixes.d.ts +16 -0
  341. package/dist/trusted-process/error-prefixes.js +17 -0
  342. package/dist/trusted-process/error-prefixes.js.map +1 -0
  343. package/dist/trusted-process/index.d.ts +40 -23
  344. package/dist/trusted-process/index.js +131 -225
  345. package/dist/trusted-process/index.js.map +1 -1
  346. package/dist/trusted-process/list-matcher.d.ts +17 -0
  347. package/dist/trusted-process/list-matcher.js +31 -0
  348. package/dist/trusted-process/list-matcher.js.map +1 -0
  349. package/dist/trusted-process/mcp-client-manager.d.ts +35 -6
  350. package/dist/trusted-process/mcp-client-manager.js +40 -45
  351. package/dist/trusted-process/mcp-client-manager.js.map +1 -1
  352. package/dist/trusted-process/mcp-proxy-server.d.ts +31 -120
  353. package/dist/trusted-process/mcp-proxy-server.js +201 -660
  354. package/dist/trusted-process/mcp-proxy-server.js.map +1 -1
  355. package/dist/trusted-process/policy-engine.d.ts +16 -4
  356. package/dist/trusted-process/policy-engine.js +103 -47
  357. package/dist/trusted-process/policy-engine.js.map +1 -1
  358. package/dist/trusted-process/policy-roots.d.ts +6 -0
  359. package/dist/trusted-process/policy-roots.js +20 -0
  360. package/dist/trusted-process/policy-roots.js.map +1 -1
  361. package/dist/trusted-process/sandbox-integration.d.ts +12 -0
  362. package/dist/trusted-process/sandbox-integration.js +18 -0
  363. package/dist/trusted-process/sandbox-integration.js.map +1 -1
  364. package/dist/trusted-process/tcp-server-transport.d.ts +12 -1
  365. package/dist/trusted-process/tcp-server-transport.js +9 -1
  366. package/dist/trusted-process/tcp-server-transport.js.map +1 -1
  367. package/dist/trusted-process/tool-call-coordinator.d.ts +283 -0
  368. package/dist/trusted-process/tool-call-coordinator.js +592 -0
  369. package/dist/trusted-process/tool-call-coordinator.js.map +1 -0
  370. package/dist/trusted-process/tool-call-pipeline.d.ts +213 -0
  371. package/dist/trusted-process/tool-call-pipeline.js +832 -0
  372. package/dist/trusted-process/tool-call-pipeline.js.map +1 -0
  373. package/dist/trusted-process/tool-description-hints.d.ts +1 -1
  374. package/dist/types/argument-roles.d.ts +1 -1
  375. package/dist/types/argument-roles.js +14 -1
  376. package/dist/types/argument-roles.js.map +1 -1
  377. package/dist/types/audit.d.ts +9 -0
  378. package/dist/{session → types}/errors.d.ts +8 -2
  379. package/dist/{session → types}/errors.js +8 -2
  380. package/dist/types/errors.js.map +1 -0
  381. package/dist/types/reserved-servers.d.ts +11 -0
  382. package/dist/types/reserved-servers.js +12 -0
  383. package/dist/types/reserved-servers.js.map +1 -0
  384. package/dist/types/server-listing.d.ts +14 -0
  385. package/dist/types/server-listing.js +2 -0
  386. package/dist/types/server-listing.js.map +1 -0
  387. package/dist/types/slug.d.ts +2 -0
  388. package/dist/types/slug.js +2 -0
  389. package/dist/types/slug.js.map +1 -1
  390. package/dist/types/url-normalize.d.ts +16 -0
  391. package/dist/types/url-normalize.js +33 -0
  392. package/dist/types/url-normalize.js.map +1 -0
  393. package/dist/util/atomic-write.d.ts +31 -0
  394. package/dist/util/atomic-write.js +43 -0
  395. package/dist/util/atomic-write.js.map +1 -0
  396. package/dist/utils/error-message.d.ts +8 -0
  397. package/dist/utils/error-message.js +11 -0
  398. package/dist/utils/error-message.js.map +1 -0
  399. package/dist/utils/exec-error.d.ts +19 -0
  400. package/dist/utils/exec-error.js +16 -0
  401. package/dist/utils/exec-error.js.map +1 -0
  402. package/dist/utils/is-plain-object.d.ts +7 -0
  403. package/dist/utils/is-plain-object.js +12 -0
  404. package/dist/utils/is-plain-object.js.map +1 -0
  405. package/dist/utils/preflight-checks.d.ts +16 -0
  406. package/dist/utils/preflight-checks.js +178 -0
  407. package/dist/utils/preflight-checks.js.map +1 -0
  408. package/dist/web-ui/__tests__/json-rpc-dispatch.test.d.ts +7 -0
  409. package/dist/web-ui/__tests__/json-rpc-dispatch.test.js +725 -0
  410. package/dist/web-ui/__tests__/json-rpc-dispatch.test.js.map +1 -0
  411. package/dist/web-ui/conn-registry.d.ts +14 -0
  412. package/dist/web-ui/conn-registry.js +25 -0
  413. package/dist/web-ui/conn-registry.js.map +1 -0
  414. package/dist/web-ui/dispatch/escalation-dispatch.d.ts +7 -0
  415. package/dist/web-ui/dispatch/escalation-dispatch.js +52 -0
  416. package/dist/web-ui/dispatch/escalation-dispatch.js.map +1 -0
  417. package/dist/web-ui/dispatch/job-dispatch.d.ts +8 -0
  418. package/dist/web-ui/dispatch/job-dispatch.js +83 -0
  419. package/dist/web-ui/dispatch/job-dispatch.js.map +1 -0
  420. package/dist/web-ui/dispatch/persona-dispatch.d.ts +50 -0
  421. package/dist/web-ui/dispatch/persona-dispatch.js +269 -0
  422. package/dist/web-ui/dispatch/persona-dispatch.js.map +1 -0
  423. package/dist/web-ui/dispatch/session-dispatch.d.ts +9 -0
  424. package/dist/web-ui/dispatch/session-dispatch.js +219 -0
  425. package/dist/web-ui/dispatch/session-dispatch.js.map +1 -0
  426. package/dist/web-ui/dispatch/token-stream-dispatch.d.ts +15 -0
  427. package/dist/web-ui/dispatch/token-stream-dispatch.js +55 -0
  428. package/dist/web-ui/dispatch/token-stream-dispatch.js.map +1 -0
  429. package/dist/web-ui/dispatch/types.d.ts +54 -0
  430. package/dist/web-ui/dispatch/types.js +72 -0
  431. package/dist/web-ui/dispatch/types.js.map +1 -0
  432. package/dist/web-ui/dispatch/workflow-dispatch.d.ts +103 -0
  433. package/dist/web-ui/dispatch/workflow-dispatch.js +1036 -0
  434. package/dist/web-ui/dispatch/workflow-dispatch.js.map +1 -0
  435. package/dist/web-ui/json-rpc-dispatch.d.ts +12 -0
  436. package/dist/web-ui/json-rpc-dispatch.js +34 -0
  437. package/dist/web-ui/json-rpc-dispatch.js.map +1 -0
  438. package/dist/web-ui/state-graph.d.ts +13 -0
  439. package/dist/web-ui/state-graph.js +82 -0
  440. package/dist/web-ui/state-graph.js.map +1 -0
  441. package/dist/web-ui/token-stream-bridge.d.ts +76 -0
  442. package/dist/web-ui/token-stream-bridge.js +265 -0
  443. package/dist/web-ui/token-stream-bridge.js.map +1 -0
  444. package/dist/web-ui/web-event-bus.d.ts +176 -0
  445. package/dist/web-ui/web-event-bus.js +19 -0
  446. package/dist/web-ui/web-event-bus.js.map +1 -0
  447. package/dist/web-ui/web-session-transport.d.ts +31 -0
  448. package/dist/web-ui/web-session-transport.js +109 -0
  449. package/dist/web-ui/web-session-transport.js.map +1 -0
  450. package/dist/web-ui/web-ui-server.d.ts +90 -0
  451. package/dist/web-ui/web-ui-server.js +477 -0
  452. package/dist/web-ui/web-ui-server.js.map +1 -0
  453. package/dist/web-ui/web-ui-types.d.ts +418 -0
  454. package/dist/web-ui/web-ui-types.js +32 -0
  455. package/dist/web-ui/web-ui-types.js.map +1 -0
  456. package/dist/web-ui/ws-utils.d.ts +5 -0
  457. package/dist/web-ui/ws-utils.js +12 -0
  458. package/dist/web-ui/ws-utils.js.map +1 -0
  459. package/dist/web-ui-static/assets/index-BD5U6ILh.css +1 -0
  460. package/dist/web-ui-static/assets/index-FMsHWEfK.js +79 -0
  461. package/dist/web-ui-static/assets/orbitron-latin-700-normal-4jsRXGGJ.woff2 +0 -0
  462. package/dist/web-ui-static/assets/orbitron-latin-700-normal-DmYOh-W9.woff +0 -0
  463. package/dist/web-ui-static/index.html +14 -0
  464. package/dist/workflow/artifacts.d.ts +59 -0
  465. package/dist/workflow/artifacts.js +188 -0
  466. package/dist/workflow/artifacts.js.map +1 -0
  467. package/dist/workflow/checkpoint-selection.d.ts +34 -0
  468. package/dist/workflow/checkpoint-selection.js +48 -0
  469. package/dist/workflow/checkpoint-selection.js.map +1 -0
  470. package/dist/workflow/checkpoint.d.ts +35 -0
  471. package/dist/workflow/checkpoint.js +84 -0
  472. package/dist/workflow/checkpoint.js.map +1 -0
  473. package/dist/workflow/cli-shared.d.ts +62 -0
  474. package/dist/workflow/cli-shared.js +117 -0
  475. package/dist/workflow/cli-shared.js.map +1 -0
  476. package/dist/workflow/cli-support.d.ts +92 -0
  477. package/dist/workflow/cli-support.js +421 -0
  478. package/dist/workflow/cli-support.js.map +1 -0
  479. package/dist/workflow/container-snapshots.d.ts +29 -0
  480. package/dist/workflow/container-snapshots.js +137 -0
  481. package/dist/workflow/container-snapshots.js.map +1 -0
  482. package/dist/workflow/daemon-gate-commands.d.ts +21 -0
  483. package/dist/workflow/daemon-gate-commands.js +599 -0
  484. package/dist/workflow/daemon-gate-commands.js.map +1 -0
  485. package/dist/workflow/definition-loader.d.ts +32 -0
  486. package/dist/workflow/definition-loader.js +56 -0
  487. package/dist/workflow/definition-loader.js.map +1 -0
  488. package/dist/workflow/discovery.d.ts +107 -0
  489. package/dist/workflow/discovery.js +263 -0
  490. package/dist/workflow/discovery.js.map +1 -0
  491. package/dist/workflow/errors.d.ts +66 -0
  492. package/dist/workflow/errors.js +49 -0
  493. package/dist/workflow/errors.js.map +1 -0
  494. package/dist/workflow/guards.d.ts +8 -0
  495. package/dist/workflow/guards.js +38 -0
  496. package/dist/workflow/guards.js.map +1 -0
  497. package/dist/workflow/lane-template.d.ts +89 -0
  498. package/dist/workflow/lane-template.js +141 -0
  499. package/dist/workflow/lane-template.js.map +1 -0
  500. package/dist/workflow/lint-integration.d.ts +64 -0
  501. package/dist/workflow/lint-integration.js +56 -0
  502. package/dist/workflow/lint-integration.js.map +1 -0
  503. package/dist/workflow/lint.d.ts +72 -0
  504. package/dist/workflow/lint.js +593 -0
  505. package/dist/workflow/lint.js.map +1 -0
  506. package/dist/workflow/machine-builder.d.ts +178 -0
  507. package/dist/workflow/machine-builder.js +678 -0
  508. package/dist/workflow/machine-builder.js.map +1 -0
  509. package/dist/workflow/message-log.d.ts +99 -0
  510. package/dist/workflow/message-log.js +40 -0
  511. package/dist/workflow/message-log.js.map +1 -0
  512. package/dist/workflow/orchestrator.d.ts +954 -0
  513. package/dist/workflow/orchestrator.js +3594 -0
  514. package/dist/workflow/orchestrator.js.map +1 -0
  515. package/dist/workflow/prompt-builder.d.ts +39 -0
  516. package/dist/workflow/prompt-builder.js +243 -0
  517. package/dist/workflow/prompt-builder.js.map +1 -0
  518. package/dist/workflow/run-state-command.d.ts +9 -0
  519. package/dist/workflow/run-state-command.js +414 -0
  520. package/dist/workflow/run-state-command.js.map +1 -0
  521. package/dist/workflow/run-state-debug-capture.d.ts +40 -0
  522. package/dist/workflow/run-state-debug-capture.js +101 -0
  523. package/dist/workflow/run-state-debug-capture.js.map +1 -0
  524. package/dist/workflow/status-parser.d.ts +68 -0
  525. package/dist/workflow/status-parser.js +274 -0
  526. package/dist/workflow/status-parser.js.map +1 -0
  527. package/dist/workflow/types.d.ts +598 -0
  528. package/dist/workflow/types.js +85 -0
  529. package/dist/workflow/types.js.map +1 -0
  530. package/dist/workflow/validate.d.ts +80 -0
  531. package/dist/workflow/validate.js +788 -0
  532. package/dist/workflow/validate.js.map +1 -0
  533. package/dist/workflow/workflow-command.d.ts +9 -0
  534. package/dist/workflow/workflow-command.js +670 -0
  535. package/dist/workflow/workflow-command.js.map +1 -0
  536. package/dist/workflow/workflow-discovery.d.ts +27 -0
  537. package/dist/workflow/workflow-discovery.js +121 -0
  538. package/dist/workflow/workflow-discovery.js.map +1 -0
  539. package/dist/workflow/workflow-manager.d.ts +156 -0
  540. package/dist/workflow/workflow-manager.js +359 -0
  541. package/dist/workflow/workflow-manager.js.map +1 -0
  542. package/dist/workflow/workflows/design-and-code/README.md +50 -0
  543. package/dist/workflow/workflows/design-and-code/workflow.yaml +169 -0
  544. package/dist/workflow/workflows/deterministic-eval-smoke/scripts/format_report.js +29 -0
  545. package/dist/workflow/workflows/deterministic-eval-smoke/scripts/package.json +5 -0
  546. package/dist/workflow/workflows/deterministic-eval-smoke/scripts/requirements.txt +1 -0
  547. package/dist/workflow/workflows/deterministic-eval-smoke/scripts/run_eval.py +41 -0
  548. package/dist/workflow/workflows/deterministic-eval-smoke/workflow.yaml +57 -0
  549. package/dist/workflow/workflows/deterministic-verdict-smoke/scripts/classify.py +18 -0
  550. package/dist/workflow/workflows/deterministic-verdict-smoke/workflow.yaml +51 -0
  551. package/dist/workflow/workflows/evolve/scripts/LICENSE +201 -0
  552. package/dist/workflow/workflows/evolve/scripts/README.md +314 -0
  553. package/dist/workflow/workflows/evolve/scripts/evolve-brief +16 -0
  554. package/dist/workflow/workflows/evolve/scripts/evolve-cognition +16 -0
  555. package/dist/workflow/workflows/evolve/scripts/evolve-db +16 -0
  556. package/dist/workflow/workflows/evolve/scripts/evolve-eval +16 -0
  557. package/dist/workflow/workflows/evolve/scripts/evolve-files +16 -0
  558. package/dist/workflow/workflows/evolve/scripts/evolve-summary +16 -0
  559. package/dist/workflow/workflows/evolve/scripts/evolve_core/__init__.py +14 -0
  560. package/dist/workflow/workflows/evolve/scripts/evolve_core/algorithms/__init__.py +17 -0
  561. package/dist/workflow/workflows/evolve/scripts/evolve_core/algorithms/base.py +21 -0
  562. package/dist/workflow/workflows/evolve/scripts/evolve_core/algorithms/factory.py +90 -0
  563. package/dist/workflow/workflows/evolve/scripts/evolve_core/algorithms/greedy.py +17 -0
  564. package/dist/workflow/workflows/evolve/scripts/evolve_core/algorithms/island.py +316 -0
  565. package/dist/workflow/workflows/evolve/scripts/evolve_core/algorithms/random.py +18 -0
  566. package/dist/workflow/workflows/evolve/scripts/evolve_core/algorithms/ucb1.py +55 -0
  567. package/dist/workflow/workflows/evolve/scripts/evolve_core/best_snapshot.py +62 -0
  568. package/dist/workflow/workflows/evolve/scripts/evolve_core/cli.py +752 -0
  569. package/dist/workflow/workflows/evolve/scripts/evolve_core/cognition.py +127 -0
  570. package/dist/workflow/workflows/evolve/scripts/evolve_core/database.py +218 -0
  571. package/dist/workflow/workflows/evolve/scripts/evolve_core/diff.py +57 -0
  572. package/dist/workflow/workflows/evolve/scripts/evolve_core/embedding.py +84 -0
  573. package/dist/workflow/workflows/evolve/scripts/evolve_core/file_lock.py +45 -0
  574. package/dist/workflow/workflows/evolve/scripts/evolve_core/run_state.py +343 -0
  575. package/dist/workflow/workflows/evolve/scripts/evolve_core/sampling_config.py +173 -0
  576. package/dist/workflow/workflows/evolve/scripts/evolve_core/structures.py +93 -0
  577. package/dist/workflow/workflows/evolve/scripts/evolve_core/vector_index.py +191 -0
  578. package/dist/workflow/workflows/evolve/scripts/evolve_result.py +1503 -0
  579. package/dist/workflow/workflows/evolve/scripts/requirements.txt +2 -0
  580. package/dist/workflow/workflows/evolve/workflow.yaml +646 -0
  581. package/dist/workflow/workflows/test-email-summary/skills/email-formatting/SKILL.md +55 -0
  582. package/dist/workflow/workflows/test-email-summary/skills/gmail-query-syntax/SKILL.md +63 -0
  583. package/dist/workflow/workflows/test-email-summary/skills/json-schema-emails/SKILL.md +41 -0
  584. package/dist/workflow/workflows/test-email-summary/skills/json-schema-emails/schema.json +34 -0
  585. package/dist/workflow/workflows/test-email-summary/skills/summary-style-guide/SKILL.md +51 -0
  586. package/dist/workflow/workflows/test-email-summary/workflow.yaml +90 -0
  587. package/dist/workflow/workflows/vuln-discovery/skills/harness-design-fuzzing/SKILL.md +206 -0
  588. package/dist/workflow/workflows/vuln-discovery/skills/memory-safety-c-cpp/SKILL.md +167 -0
  589. package/dist/workflow/workflows/vuln-discovery/skills/vulnerability-triage/SKILL.md +189 -0
  590. package/dist/workflow/workflows/vuln-discovery/workflow.yaml +925 -0
  591. package/dist/workflow/worktree.d.ts +43 -0
  592. package/dist/workflow/worktree.js +106 -0
  593. package/dist/workflow/worktree.js.map +1 -0
  594. package/docker/Dockerfile.base +31 -0
  595. package/docker/Dockerfile.base.arm64 +27 -0
  596. package/docker/Dockerfile.claude-code +3 -1
  597. package/docker/Dockerfile.codex +17 -0
  598. package/docker/Dockerfile.goose +3 -1
  599. package/docker/entrypoint-claude-code.sh +7 -0
  600. package/docker/entrypoint-codex.sh +42 -0
  601. package/docker/entrypoint-goose.sh +6 -0
  602. package/docker/entrypoint-uid-remap.sh +93 -0
  603. package/package.json +27 -11
  604. package/packages/web-ui/README.md +113 -0
  605. package/packages/web-ui/docs/workflow-state-machine.png +0 -0
  606. package/src/config/generated/compiled-policy.json +528 -161
  607. package/src/config/generated/test-scenarios.json +4810 -170
  608. package/src/config/generated/tool-annotations.json +34 -47
  609. package/src/config/mcp-servers.json +2 -2
  610. package/src/workflow/workflows/design-and-code/README.md +50 -0
  611. package/src/workflow/workflows/design-and-code/workflow.yaml +169 -0
  612. package/src/workflow/workflows/deterministic-eval-smoke/scripts/format_report.js +29 -0
  613. package/src/workflow/workflows/deterministic-eval-smoke/scripts/package.json +5 -0
  614. package/src/workflow/workflows/deterministic-eval-smoke/scripts/requirements.txt +1 -0
  615. package/src/workflow/workflows/deterministic-eval-smoke/scripts/run_eval.py +41 -0
  616. package/src/workflow/workflows/deterministic-eval-smoke/workflow.yaml +57 -0
  617. package/src/workflow/workflows/deterministic-verdict-smoke/scripts/classify.py +18 -0
  618. package/src/workflow/workflows/deterministic-verdict-smoke/workflow.yaml +51 -0
  619. package/src/workflow/workflows/evolve/scripts/LICENSE +201 -0
  620. package/src/workflow/workflows/evolve/scripts/README.md +314 -0
  621. package/src/workflow/workflows/evolve/scripts/evolve-brief +16 -0
  622. package/src/workflow/workflows/evolve/scripts/evolve-cognition +16 -0
  623. package/src/workflow/workflows/evolve/scripts/evolve-db +16 -0
  624. package/src/workflow/workflows/evolve/scripts/evolve-eval +16 -0
  625. package/src/workflow/workflows/evolve/scripts/evolve-files +16 -0
  626. package/src/workflow/workflows/evolve/scripts/evolve-summary +16 -0
  627. package/src/workflow/workflows/evolve/scripts/evolve_core/__init__.py +14 -0
  628. package/src/workflow/workflows/evolve/scripts/evolve_core/algorithms/__init__.py +17 -0
  629. package/src/workflow/workflows/evolve/scripts/evolve_core/algorithms/base.py +21 -0
  630. package/src/workflow/workflows/evolve/scripts/evolve_core/algorithms/factory.py +90 -0
  631. package/src/workflow/workflows/evolve/scripts/evolve_core/algorithms/greedy.py +17 -0
  632. package/src/workflow/workflows/evolve/scripts/evolve_core/algorithms/island.py +316 -0
  633. package/src/workflow/workflows/evolve/scripts/evolve_core/algorithms/random.py +18 -0
  634. package/src/workflow/workflows/evolve/scripts/evolve_core/algorithms/ucb1.py +55 -0
  635. package/src/workflow/workflows/evolve/scripts/evolve_core/best_snapshot.py +62 -0
  636. package/src/workflow/workflows/evolve/scripts/evolve_core/cli.py +752 -0
  637. package/src/workflow/workflows/evolve/scripts/evolve_core/cognition.py +127 -0
  638. package/src/workflow/workflows/evolve/scripts/evolve_core/database.py +218 -0
  639. package/src/workflow/workflows/evolve/scripts/evolve_core/diff.py +57 -0
  640. package/src/workflow/workflows/evolve/scripts/evolve_core/embedding.py +84 -0
  641. package/src/workflow/workflows/evolve/scripts/evolve_core/file_lock.py +45 -0
  642. package/src/workflow/workflows/evolve/scripts/evolve_core/run_state.py +343 -0
  643. package/src/workflow/workflows/evolve/scripts/evolve_core/sampling_config.py +173 -0
  644. package/src/workflow/workflows/evolve/scripts/evolve_core/structures.py +93 -0
  645. package/src/workflow/workflows/evolve/scripts/evolve_core/vector_index.py +191 -0
  646. package/src/workflow/workflows/evolve/scripts/evolve_result.py +1503 -0
  647. package/src/workflow/workflows/evolve/scripts/requirements.txt +2 -0
  648. package/src/workflow/workflows/evolve/workflow.yaml +646 -0
  649. package/src/workflow/workflows/test-email-summary/skills/email-formatting/SKILL.md +55 -0
  650. package/src/workflow/workflows/test-email-summary/skills/gmail-query-syntax/SKILL.md +63 -0
  651. package/src/workflow/workflows/test-email-summary/skills/json-schema-emails/SKILL.md +41 -0
  652. package/src/workflow/workflows/test-email-summary/skills/json-schema-emails/schema.json +34 -0
  653. package/src/workflow/workflows/test-email-summary/skills/summary-style-guide/SKILL.md +51 -0
  654. package/src/workflow/workflows/test-email-summary/workflow.yaml +90 -0
  655. package/src/workflow/workflows/vuln-discovery/skills/harness-design-fuzzing/SKILL.md +206 -0
  656. package/src/workflow/workflows/vuln-discovery/skills/memory-safety-c-cpp/SKILL.md +167 -0
  657. package/src/workflow/workflows/vuln-discovery/skills/vulnerability-triage/SKILL.md +189 -0
  658. package/src/workflow/workflows/vuln-discovery/workflow.yaml +925 -0
  659. package/dist/pipeline/llm-logger.js.map +0 -1
  660. package/dist/session/errors.js.map +0 -1
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Docker availability probe (leaf module).
3
+ *
4
+ * The single canonical "is Docker available?" check, extracted here so that
5
+ * runtime modules (`docker-manager.ts`, `container-runtime.ts`,
6
+ * `apple-container-manager.ts`) can depend on it without importing
7
+ * `session/preflight.ts` — which itself lazily reaches back into the
8
+ * container-runtime backends. Keeping the probe in a dependency-free leaf
9
+ * breaks that import cycle.
10
+ *
11
+ * This module must stay a leaf: it may import only Node built-ins and
12
+ * `utils/exec-error.js`. Do not add imports from `session/`, `docker/`
13
+ * runtime modules, or any layer that could reach back here.
14
+ */
15
+ import { execFile as execFileCb } from 'node:child_process';
16
+ import { promisify } from 'node:util';
17
+ import { isExecError, isExecTimeout } from '../utils/exec-error.js';
18
+ const execFile = promisify(execFileCb);
19
+ /**
20
+ * Per-attempt timeout for `docker info`. The daemon call can be slow under
21
+ * load (cold daemon, busy machine), so we use a generous timeout and retry
22
+ * on timeout-class failures rather than tightening the bound.
23
+ */
24
+ const DOCKER_PROBE_TIMEOUT_MS = 10_000;
25
+ /** Maximum number of additional attempts after the first one. */
26
+ const DOCKER_PROBE_MAX_RETRIES = 2;
27
+ const DOCKER_UNAVAILABLE_REASON = 'Docker not available';
28
+ function describeProbeFailure(err, fallback) {
29
+ if (!isExecError(err))
30
+ return fallback;
31
+ if (err.code === 'ENOENT') {
32
+ return 'The "docker" command was not found in your PATH. Is Docker installed?';
33
+ }
34
+ const stderr = err.stderr.trim();
35
+ if (stderr.length === 0)
36
+ return fallback;
37
+ if (stderr.includes('permission denied')) {
38
+ return 'Permission denied while connecting to the Docker daemon socket.\nIs your user in the "docker" group?';
39
+ }
40
+ if (stderr.includes('Cannot connect to the Docker daemon')) {
41
+ return ('Cannot connect to the Docker daemon.\n' +
42
+ 'Is the Docker service running? On macOS/Windows, ensure Docker Desktop is started.');
43
+ }
44
+ return stderr;
45
+ }
46
+ /**
47
+ * Single canonical "is Docker available?" probe for the entire codebase. Other
48
+ * modules MUST call this rather than re-implementing `docker info`.
49
+ *
50
+ * `docker info` can blow past a tight timeout on a cold/busy daemon, so we use
51
+ * a generous 10s per attempt and retry on timeout-class failures. We do NOT
52
+ * retry on deterministic failures (ENOENT, permission denied, "Cannot connect
53
+ * to the Docker daemon") — those won't change between attempts and the
54
+ * user-visible failure path should be fast.
55
+ *
56
+ * @param execFileFn Optional `execFile` implementation for tests.
57
+ */
58
+ export async function checkDockerAvailable(execFileFn = execFile) {
59
+ const totalAttempts = DOCKER_PROBE_MAX_RETRIES + 1;
60
+ let lastErr;
61
+ for (let attempt = 1; attempt <= totalAttempts; attempt++) {
62
+ try {
63
+ await execFileFn('docker', ['info'], { timeout: DOCKER_PROBE_TIMEOUT_MS });
64
+ return { available: true };
65
+ }
66
+ catch (err) {
67
+ lastErr = err;
68
+ if (!isExecError(err) || !isExecTimeout(err)) {
69
+ return {
70
+ available: false,
71
+ reason: DOCKER_UNAVAILABLE_REASON,
72
+ detailedMessage: describeProbeFailure(err, err instanceof Error ? err.message : String(err)),
73
+ };
74
+ }
75
+ }
76
+ }
77
+ const baseMessage = lastErr instanceof Error ? lastErr.message : String(lastErr);
78
+ const timeoutSeconds = DOCKER_PROBE_TIMEOUT_MS / 1000;
79
+ return {
80
+ available: false,
81
+ reason: DOCKER_UNAVAILABLE_REASON,
82
+ detailedMessage: `Docker daemon did not respond within ${timeoutSeconds}s after ${totalAttempts} attempts. ` +
83
+ `The daemon may be overloaded or starting up. Original error: ${baseMessage}`,
84
+ };
85
+ }
86
+ //# sourceMappingURL=docker-probe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker-probe.js","sourceRoot":"","sources":["../../src/docker/docker-probe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEpE,MAAM,QAAQ,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;AAEvC;;;;GAIG;AACH,MAAM,uBAAuB,GAAG,MAAM,CAAC;AAEvC,iEAAiE;AACjE,MAAM,wBAAwB,GAAG,CAAC,CAAC;AAEnC,MAAM,yBAAyB,GAAG,sBAAsB,CAAC;AAezD,SAAS,oBAAoB,CAAC,GAAY,EAAE,QAAgB;IAC1D,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;QAAE,OAAO,QAAQ,CAAC;IAEvC,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO,uEAAuE,CAAC;IACjF,CAAC;IAED,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACjC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IACzC,IAAI,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACzC,OAAO,sGAAsG,CAAC;IAChH,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,CAAC,qCAAqC,CAAC,EAAE,CAAC;QAC3D,OAAO,CACL,wCAAwC;YACxC,oFAAoF,CACrF,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,aAA8B,QAAQ;IAC/E,MAAM,aAAa,GAAG,wBAAwB,GAAG,CAAC,CAAC;IACnD,IAAI,OAAgB,CAAC;IAErB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,aAAa,EAAE,OAAO,EAAE,EAAE,CAAC;QAC1D,IAAI,CAAC;YACH,MAAM,UAAU,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC,CAAC;YAC3E,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAC7B,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,OAAO,GAAG,GAAG,CAAC;YACd,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC7C,OAAO;oBACL,SAAS,EAAE,KAAK;oBAChB,MAAM,EAAE,yBAAyB;oBACjC,eAAe,EAAE,oBAAoB,CAAC,GAAG,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;iBAC7F,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,YAAY,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACjF,MAAM,cAAc,GAAG,uBAAuB,GAAG,IAAI,CAAC;IACtD,OAAO;QACL,SAAS,EAAE,KAAK;QAChB,MAAM,EAAE,yBAAyB;QACjC,eAAe,EACb,wCAAwC,cAAc,WAAW,aAAa,aAAa;YAC3F,gEAAgE,WAAW,EAAE;KAChF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Single-line progress renderer for `docker pull` / `docker build` streams.
3
+ *
4
+ * `spawnWithIdleTimeout` (PR #250) restored real-time visibility into image
5
+ * pulls/builds by piping the child's stdout/stderr verbatim to the parent's
6
+ * terminal — fixing silent hangs but flooding the user with thousands of
7
+ * lines of BuildKit / per-layer chatter. This sink replaces that verbatim
8
+ * dump in the interactive (TTY) case with a single status line that
9
+ * updates in place, while still feeding every chunk to the watchdog (the
10
+ * heartbeat detection in `spawnWithIdleTimeout` runs before the chunk
11
+ * reaches the sink — see `forward()` in that file).
12
+ *
13
+ * On non-TTY stderr (CI, redirected logs) the sink passes chunks through
14
+ * verbatim, matching the pre-existing behavior and keeping CI logs useful.
15
+ *
16
+ * On failure, `dumpRecent()` flushes the last ~200 raw lines so the user
17
+ * gets a real diagnostic — the 4 KB stderr-tail quoted in the rejection
18
+ * message from `spawnWithIdleTimeout` is often too short to capture an
19
+ * earlier RUN step that actually went wrong.
20
+ */
21
+ export type DockerProgressOperation = 'docker pull' | 'docker build' | 'container pull' | 'container build';
22
+ export interface DockerProgressSink {
23
+ /** Writable that the child's stdout pipes into. */
24
+ stdout: NodeJS.WritableStream;
25
+ /** Writable that the child's stderr pipes into. */
26
+ stderr: NodeJS.WritableStream;
27
+ /** Commit the in-place line (TTY) or emit a final summary (non-TTY). */
28
+ finish(success: boolean): void;
29
+ /** Flush the rolling raw-line buffer; intended for the failure path. */
30
+ dumpRecent(): void;
31
+ }
32
+ export interface CreateDockerProgressSinkOptions {
33
+ operation: DockerProgressOperation;
34
+ /** Underlying writable. Defaults to `process.stderr`. */
35
+ output?: NodeJS.WritableStream;
36
+ /** Override TTY detection (used by tests). */
37
+ isTTY?: boolean;
38
+ /** Max raw lines retained for failure dump. Defaults to 200. */
39
+ bufferSize?: number;
40
+ /** Override clock for elapsed timers (used by tests). */
41
+ now?: () => number;
42
+ }
43
+ export declare function createDockerProgressSink(opts: CreateDockerProgressSinkOptions): DockerProgressSink;
@@ -0,0 +1,299 @@
1
+ /**
2
+ * Single-line progress renderer for `docker pull` / `docker build` streams.
3
+ *
4
+ * `spawnWithIdleTimeout` (PR #250) restored real-time visibility into image
5
+ * pulls/builds by piping the child's stdout/stderr verbatim to the parent's
6
+ * terminal — fixing silent hangs but flooding the user with thousands of
7
+ * lines of BuildKit / per-layer chatter. This sink replaces that verbatim
8
+ * dump in the interactive (TTY) case with a single status line that
9
+ * updates in place, while still feeding every chunk to the watchdog (the
10
+ * heartbeat detection in `spawnWithIdleTimeout` runs before the chunk
11
+ * reaches the sink — see `forward()` in that file).
12
+ *
13
+ * On non-TTY stderr (CI, redirected logs) the sink passes chunks through
14
+ * verbatim, matching the pre-existing behavior and keeping CI logs useful.
15
+ *
16
+ * On failure, `dumpRecent()` flushes the last ~200 raw lines so the user
17
+ * gets a real diagnostic — the 4 KB stderr-tail quoted in the rejection
18
+ * message from `spawnWithIdleTimeout` is often too short to capture an
19
+ * earlier RUN step that actually went wrong.
20
+ */
21
+ import { Writable } from 'node:stream';
22
+ import chalk from 'chalk';
23
+ const DEFAULT_BUFFER_LINES = 200;
24
+ const PENDING_BUFFER_HARD_CAP = 8 * 1024;
25
+ export function createDockerProgressSink(opts) {
26
+ const output = opts.output ?? process.stderr;
27
+ // `process.stderr` is typed as `WriteStream` (with `isTTY: true | undefined`);
28
+ // a generic `WritableStream` may not have the property at all. Cast to a
29
+ // shape that admits either so ESLint does not flag the comparison.
30
+ const isTTY = opts.isTTY ?? output.isTTY === true;
31
+ const bufferSize = opts.bufferSize ?? DEFAULT_BUFFER_LINES;
32
+ const now = opts.now ?? Date.now;
33
+ // Non-TTY fast path: behave like the pre-sink `process.stderr` so CI logs
34
+ // keep their full transcript. finish/dumpRecent are no-ops because the
35
+ // raw transcript is already on screen.
36
+ if (!isTTY) {
37
+ const makeStream = () => new Writable({
38
+ write(chunk, _encoding, cb) {
39
+ output.write(typeof chunk === 'string' ? chunk : chunk.toString('utf-8'));
40
+ cb();
41
+ },
42
+ });
43
+ return {
44
+ stdout: makeStream(),
45
+ stderr: makeStream(),
46
+ finish: () => { },
47
+ dumpRecent: () => { },
48
+ };
49
+ }
50
+ const parser = opts.operation === 'docker pull' ? createPullParser(now) : createBuildParser(now);
51
+ const ringBuffer = [];
52
+ const startTime = now();
53
+ let pendingStdout = '';
54
+ let pendingStderr = '';
55
+ // Empty string means no in-place line is currently on screen.
56
+ let lastRendered = '';
57
+ let finished = false;
58
+ const record = (line) => {
59
+ if (!line)
60
+ return;
61
+ ringBuffer.push(line);
62
+ if (ringBuffer.length > bufferSize)
63
+ ringBuffer.shift();
64
+ };
65
+ const render = () => {
66
+ if (finished)
67
+ return;
68
+ const summary = parser.summary();
69
+ if (summary === lastRendered)
70
+ return;
71
+ lastRendered = summary;
72
+ output.write(`\r\x1B[2K${summary}`);
73
+ };
74
+ const processChunk = (chunk, isStderr) => {
75
+ const text = typeof chunk === 'string' ? chunk : chunk.toString('utf-8');
76
+ let pending = (isStderr ? pendingStderr : pendingStdout) + text;
77
+ // Docker pull uses `\r` (not `\n`) to update its progress meter in place;
78
+ // we treat both as line boundaries so each transient state is parsed.
79
+ const splitter = /[^\r\n]*[\r\n]/g;
80
+ let lastIdx = 0;
81
+ let match;
82
+ while ((match = splitter.exec(pending)) !== null) {
83
+ const segment = match[0];
84
+ const line = segment.replace(/[\r\n]+$/, '').trimEnd();
85
+ if (line) {
86
+ record(line);
87
+ try {
88
+ parser.feed(line);
89
+ }
90
+ catch {
91
+ // Parser bugs MUST NOT propagate — the streaming pipeline relies
92
+ // on the sink consuming bytes without error so the watchdog stays
93
+ // armed.
94
+ }
95
+ }
96
+ lastIdx = splitter.lastIndex;
97
+ }
98
+ pending = pending.slice(lastIdx);
99
+ // Guard against pathological no-newline output (e.g. a malicious image
100
+ // streaming a giant binary blob to stderr). Keep only the trailing half
101
+ // of the cap so we don't OOM on the pending buffer.
102
+ if (pending.length > PENDING_BUFFER_HARD_CAP) {
103
+ pending = pending.slice(-PENDING_BUFFER_HARD_CAP / 2);
104
+ }
105
+ if (isStderr)
106
+ pendingStderr = pending;
107
+ else
108
+ pendingStdout = pending;
109
+ render();
110
+ };
111
+ const makeWritable = (isStderr) => new Writable({
112
+ write(chunk, _encoding, cb) {
113
+ try {
114
+ processChunk(chunk, isStderr);
115
+ }
116
+ catch {
117
+ // see comment above — never throw from the write path
118
+ }
119
+ cb();
120
+ },
121
+ });
122
+ const flushPending = () => {
123
+ for (const pending of [pendingStdout, pendingStderr]) {
124
+ const trimmed = pending.replace(/[\r\n]+$/, '').trimEnd();
125
+ if (!trimmed)
126
+ continue;
127
+ record(trimmed);
128
+ try {
129
+ parser.feed(trimmed);
130
+ }
131
+ catch {
132
+ /* swallow */
133
+ }
134
+ }
135
+ pendingStdout = '';
136
+ pendingStderr = '';
137
+ };
138
+ return {
139
+ stdout: makeWritable(false),
140
+ stderr: makeWritable(true),
141
+ finish(success) {
142
+ if (finished)
143
+ return;
144
+ finished = true;
145
+ flushPending();
146
+ const elapsed = ((now() - startTime) / 1000).toFixed(1);
147
+ const summary = parser.summary();
148
+ const tag = success ? chalk.green(`${opts.operation} done`) : chalk.red(`${opts.operation} failed`);
149
+ const line = `${tag} ${chalk.dim(`(${elapsed}s)`)} ${chalk.dim(summary)}`;
150
+ if (lastRendered) {
151
+ output.write(`\r\x1B[2K${line}\n`);
152
+ }
153
+ else {
154
+ output.write(`${line}\n`);
155
+ }
156
+ lastRendered = '';
157
+ },
158
+ dumpRecent() {
159
+ if (ringBuffer.length === 0)
160
+ return;
161
+ if (lastRendered) {
162
+ // Make sure our dump starts on a fresh line.
163
+ output.write('\r\x1B[2K');
164
+ lastRendered = '';
165
+ }
166
+ output.write(chalk.dim(`--- last ${ringBuffer.length} lines from ${opts.operation} ---`) + '\n');
167
+ for (const line of ringBuffer) {
168
+ output.write(line + '\n');
169
+ }
170
+ },
171
+ };
172
+ }
173
+ function createPullParser(now) {
174
+ const layers = new Map();
175
+ let statusLine = '';
176
+ const startTime = now();
177
+ return {
178
+ feed(line) {
179
+ const clean = stripAnsi(line).trim();
180
+ // Layer-scoped messages: `<id>: <message>` where id is a short hex
181
+ // digest or a tag name in the case of the first line.
182
+ const layerMatch = clean.match(/^([0-9a-f]{8,}|[A-Za-z][\w.-]*):\s+(.+?)\s*$/);
183
+ if (layerMatch) {
184
+ const [, id, msg] = layerMatch;
185
+ if (/^Pulling fs layer$/i.test(msg) || /^Waiting$/i.test(msg)) {
186
+ if (!layers.has(id))
187
+ layers.set(id, 'pending');
188
+ }
189
+ else if (/^Downloading/i.test(msg)) {
190
+ layers.set(id, 'downloading');
191
+ }
192
+ else if (/^Verifying Checksum/i.test(msg)) {
193
+ layers.set(id, 'verifying');
194
+ }
195
+ else if (/^Download complete/i.test(msg)) {
196
+ layers.set(id, 'downloaded');
197
+ }
198
+ else if (/^Extracting/i.test(msg)) {
199
+ layers.set(id, 'extracting');
200
+ }
201
+ else if (/^Pull complete/i.test(msg)) {
202
+ layers.set(id, 'done');
203
+ }
204
+ else if (/^Already exists/i.test(msg)) {
205
+ layers.set(id, 'exists');
206
+ }
207
+ else if (/^Pulling from /i.test(msg)) {
208
+ statusLine = clean;
209
+ }
210
+ return;
211
+ }
212
+ if (/^Status:|^Digest:/i.test(clean) || /Pulling from /i.test(clean)) {
213
+ statusLine = clean;
214
+ }
215
+ },
216
+ summary() {
217
+ const total = layers.size;
218
+ const phases = [...layers.values()];
219
+ const done = phases.filter((p) => p === 'done' || p === 'exists').length;
220
+ const downloading = phases.filter((p) => p === 'downloading').length;
221
+ const extracting = phases.filter((p) => p === 'extracting').length;
222
+ const elapsed = ((now() - startTime) / 1000).toFixed(0);
223
+ const parts = [chalk.cyan('docker pull')];
224
+ if (total === 0) {
225
+ parts.push(chalk.dim(statusLine || 'starting...'));
226
+ }
227
+ else {
228
+ parts.push(chalk.dim(`${done}/${total} layers`));
229
+ if (downloading > 0)
230
+ parts.push(chalk.yellow(`${downloading} downloading`));
231
+ if (extracting > 0)
232
+ parts.push(chalk.blue(`${extracting} extracting`));
233
+ }
234
+ parts.push(chalk.dim(`(${elapsed}s)`));
235
+ return parts.join(' ');
236
+ },
237
+ };
238
+ }
239
+ function createBuildParser(now) {
240
+ let currentStep;
241
+ let totalSteps;
242
+ let currentDesc;
243
+ let lastBracket;
244
+ const startTime = now();
245
+ return {
246
+ feed(line) {
247
+ const clean = stripAnsi(line);
248
+ // BuildKit `--progress=plain` format. Step headers look like:
249
+ // #5 [stage 2/8] RUN apt-get install -y curl
250
+ // #4 [internal] load build definition from Dockerfile
251
+ // #6 [build 3/5] COPY . /workspace
252
+ // We pull the `N/M` out of the bracket when present so the summary
253
+ // can show progress; otherwise we fall back to the bracket label.
254
+ const stepHeader = clean.match(/^#\d+\s+\[([^\]]+)\]\s+(.+?)\s*$/);
255
+ if (stepHeader) {
256
+ const [, bracket, desc] = stepHeader;
257
+ const numbered = bracket.match(/(\d+)\/(\d+)/);
258
+ if (numbered) {
259
+ currentStep = Number.parseInt(numbered[1], 10);
260
+ totalSteps = Number.parseInt(numbered[2], 10);
261
+ }
262
+ lastBracket = bracket;
263
+ currentDesc = truncate(desc, 80);
264
+ }
265
+ // Step continuation lines (`#5 0.234 ...output...`) and DONE markers
266
+ // intentionally don't update the summary — they'd just flicker the
267
+ // line. Their job is to advance the watchdog, which already happens
268
+ // before the sink is reached.
269
+ },
270
+ summary() {
271
+ const elapsed = ((now() - startTime) / 1000).toFixed(0);
272
+ const parts = [chalk.cyan('docker build')];
273
+ if (currentStep !== undefined && totalSteps !== undefined) {
274
+ parts.push(chalk.dim(`step ${currentStep}/${totalSteps}`));
275
+ }
276
+ else if (lastBracket) {
277
+ parts.push(chalk.dim(lastBracket));
278
+ }
279
+ else {
280
+ parts.push(chalk.dim('starting...'));
281
+ }
282
+ if (currentDesc)
283
+ parts.push(currentDesc);
284
+ parts.push(chalk.dim(`(${elapsed}s)`));
285
+ return parts.join(' ');
286
+ },
287
+ };
288
+ }
289
+ function truncate(s, max) {
290
+ return s.length > max ? s.slice(0, max - 1) + '…' : s;
291
+ }
292
+ // CSI sequence: ESC [ <params> <intermediate> <final>. Strips colors and
293
+ // cursor-control codes BuildKit/docker may embed in line output.
294
+ // eslint-disable-next-line no-control-regex
295
+ const ANSI_PATTERN = /\u001B\[[0-?]*[ -/]*[@-~]/g;
296
+ function stripAnsi(s) {
297
+ return s.replace(ANSI_PATTERN, '');
298
+ }
299
+ //# sourceMappingURL=docker-progress-sink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker-progress-sink.js","sourceRoot":"","sources":["../../src/docker/docker-progress-sink.ts"],"names":[],"mappings":"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"}
@@ -14,10 +14,12 @@
14
14
  */
15
15
  import * as http from 'node:http';
16
16
  import { type CertificateAuthority } from './ca.js';
17
- import { type ProviderConfig } from './provider-config.js';
17
+ import { type AgentKind, type ProviderConfig } from './provider-config.js';
18
18
  import type { OAuthTokenManager } from './oauth-token-manager.js';
19
19
  import type { RegistryConfig, PackageValidator } from './package-types.js';
20
20
  import { type DomainListing } from './proxy-tools.js';
21
+ import type { SseProvider } from './token-stream-types.js';
22
+ import type { TrajectoryCaptureWriter } from './trajectory-capture.js';
21
23
  /**
22
24
  * Runtime control surface for the MITM proxy's host allowlist.
23
25
  *
@@ -65,6 +67,41 @@ export interface MitmProxy {
65
67
  stop(): Promise<void>;
66
68
  /** Runtime control for the dynamic host allowlist. */
67
69
  readonly hosts: DynamicHostController;
70
+ /**
71
+ * Set (or clear) the session ID that token-stream events extracted from
72
+ * LLM API responses are routed under.
73
+ *
74
+ * The MITM proxy is long-lived in shared-container workflow mode, where
75
+ * multiple per-state agent sessions share a single proxy instance. Token
76
+ * events for the active agent must be labeled with that agent's session
77
+ * ID, not with any static workflow-wide ID. Callers flip this value
78
+ * around each agent run: set to the session's ID before the agent runs,
79
+ * reset to `undefined` when the session ends.
80
+ *
81
+ * When the current session ID is `undefined`, extraction sites skip the
82
+ * `bus.push()` entirely — no events are emitted under a sentinel value.
83
+ */
84
+ setTokenSessionId(id: import('../session/types.js').SessionId | undefined): void;
85
+ /**
86
+ * Internal capture-attribution setter. Sets the session ID stamped on
87
+ * subsequent captured ExchangeRecords. Decoupled from
88
+ * `setTokenSessionId` because token-stream-bus and capture are
89
+ * different code paths that must not corrupt each other.
90
+ *
91
+ * Not called directly by orchestrator code — wrapped by
92
+ * `DockerInfrastructure.beginCaptureSession()` / `endCaptureSession()`.
93
+ * Exposed for unit-testing the proxy in isolation.
94
+ *
95
+ * When `undefined`, no capture record is produced for incoming
96
+ * exchanges (the per-handler snapshot is `undefined`).
97
+ */
98
+ setCaptureSessionId(id: import('../session/types.js').SessionId | undefined): void;
99
+ /**
100
+ * Internal capture-attribution setter. Sets the persona stamped on
101
+ * subsequent captured ExchangeRecords. Wrapped by
102
+ * `DockerInfrastructure.beginCaptureSession()`.
103
+ */
104
+ setCapturePersona(persona: string | undefined): void;
68
105
  }
69
106
  export interface MitmProxyOptions {
70
107
  /** Absolute path for the Unix domain socket (UDS mode). Omit for TCP mode. */
@@ -107,6 +144,56 @@ export interface MitmProxyOptions {
107
144
  * Used in tests to avoid real DNS resolution.
108
145
  */
109
146
  readonly dnsLookup?: http.RequestOptions['lookup'];
147
+ /**
148
+ * Connection-source filter for TCP mode. When set, sockets whose
149
+ * remote address fails the predicate are destroyed before any request
150
+ * parsing. Used by the tcp-hostonly topology, where the proxy listens
151
+ * on 0.0.0.0 and only the agent VM's host-only subnet may connect
152
+ * (see src/docker/network-topology.ts). No effect in UDS mode.
153
+ */
154
+ readonly allowRemoteAddress?: (remoteAddress: string | undefined) => boolean;
155
+ /**
156
+ * Initial session ID for token stream routing. When provided, token
157
+ * events extracted from LLM API endpoints are published into the
158
+ * module-scoped singleton bus (see `getTokenStreamBus`) under this ID.
159
+ *
160
+ * The value is mutable at runtime via `MitmProxy.setTokenSessionId()`:
161
+ * long-lived proxies (shared-container workflows) flip this around each
162
+ * agent so the active agent's session ID is used. When no session ID
163
+ * is set (initial value `undefined` AND no subsequent `setTokenSessionId`
164
+ * call), extraction sites skip publishing entirely.
165
+ *
166
+ * Routinely stale in workflow shared-container mode where the
167
+ * orchestrator overrides via `setTokenSessionId`; the seed is only
168
+ * meaningful in single-session standalone mode.
169
+ */
170
+ readonly initialTokenSessionId?: import('../session/types.js').SessionId;
171
+ /**
172
+ * Kind of agent driving this proxy, used by request-body rewriters to
173
+ * apply agent-kind-conditional transforms (currently: stripping the
174
+ * schedule built-in skill's tools when set to `'workflow'`). Immutable
175
+ * over the proxy's lifetime — a single bundle serves a single agent kind.
176
+ * `undefined` means rewriters fall back to the most conservative behavior.
177
+ */
178
+ readonly agentKind?: AgentKind;
179
+ /**
180
+ * Trajectory-capture dispatcher. When set, the proxy taps decrypted
181
+ * request and response bytes on allowed LLM API endpoints and hands
182
+ * complete `ExchangeRecord`s to the writer. When `undefined`, no taps
183
+ * are installed and capture is zero-cost. See
184
+ * docs/designs/mitm-token-trajectory-capture.md.
185
+ */
186
+ readonly capture?: TrajectoryCaptureWriter;
187
+ /**
188
+ * Human-readable agent name (e.g. `'claude-code'`) stamped onto every
189
+ * captured ExchangeRecord. Distinct from `agentKind` (which is the
190
+ * closed `'workflow' | undefined` enum used by the request rewriter).
191
+ */
192
+ readonly recordedAgentName?: string;
193
+ /** Workflow-run ID stamped onto every captured ExchangeRecord (when present). */
194
+ readonly workflowRunId?: string;
195
+ /** Bundle ID stamped onto every captured ExchangeRecord (when present). */
196
+ readonly bundleId?: string;
110
197
  }
111
198
  export interface ProviderKeyMapping {
112
199
  readonly config: ProviderConfig;
@@ -117,4 +204,51 @@ export interface ProviderKeyMapping {
117
204
  /** Optional token manager for OAuth providers — enables proactive refresh and 401 retry. */
118
205
  readonly tokenManager?: OAuthTokenManager;
119
206
  }
207
+ /**
208
+ * Max bytes buffered from a non-streaming JSON response body for token stream
209
+ * extraction. The response is still streamed to the client unchanged; only
210
+ * the extraction side stops capturing once the cap is hit. This protects the
211
+ * proxy from unbounded memory growth on very large completions.
212
+ */
213
+ export declare const MAX_JSON_RESPONSE_CAPTURE_BYTES: number;
214
+ /**
215
+ * Output of `createBoundedJsonResponseCapture` -- the stateful hooks used to
216
+ * drive a bounded capture over a chunked response stream.
217
+ *
218
+ * Exposed primarily for unit testing the OOM guard without standing up the
219
+ * full mitm proxy pipeline.
220
+ */
221
+ export interface BoundedJsonResponseCapture {
222
+ /** Feed a chunk into the capture buffer. Always safe to call. */
223
+ onData(chunk: Buffer): void;
224
+ /**
225
+ * Signal end-of-stream. The callback receives the concatenated buffer,
226
+ * or `null` if the capture overflowed and was discarded.
227
+ */
228
+ onEnd(onComplete: (body: Buffer | null) => void): void;
229
+ }
230
+ /**
231
+ * Create a size-bounded capture for a JSON response body.
232
+ *
233
+ * Up to `maxBytes` of data is accumulated into an internal chunk array.
234
+ * Once that threshold is crossed, any already-buffered chunks are released
235
+ * (so large responses do not pin memory) and further chunks are ignored.
236
+ * The caller is still responsible for piping the stream through to the
237
+ * client -- this helper only manages the extraction-side buffer.
238
+ */
239
+ export declare function createBoundedJsonResponseCapture(maxBytes?: number): BoundedJsonResponseCapture;
240
+ /**
241
+ * Maps a target hostname to the SSE provider for token stream parsing.
242
+ * Only Anthropic and OpenAI hosts are recognized; everything else
243
+ * falls back to 'unknown'.
244
+ */
245
+ export declare function resolveSseProvider(hostname: string): SseProvider;
246
+ export declare function extractToolResults(parsed: Record<string, unknown>, sessionId: import('../session/types.js').SessionId): void;
247
+ /**
248
+ * Extract token stream events from a non-streaming JSON response body.
249
+ * Used when the upstream returns application/json instead of text/event-stream.
250
+ *
251
+ * Emits message_start (model), text_delta (content), and message_end (usage).
252
+ */
253
+ export declare function extractFromJsonResponse(body: Buffer, sessionId: import('../session/types.js').SessionId): void;
120
254
  export declare function createMitmProxy(options: MitmProxyOptions): MitmProxy;