@provos/ironcurtain 0.11.0 → 0.13.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 (472) hide show
  1. package/README.md +23 -19
  2. package/dist/cli-help.d.ts +12 -0
  3. package/dist/cli-help.js +21 -0
  4. package/dist/cli-help.js.map +1 -1
  5. package/dist/cli.js +14 -6
  6. package/dist/cli.js.map +1 -1
  7. package/dist/config/agent-model-guard.d.ts +14 -0
  8. package/dist/config/agent-model-guard.js +24 -0
  9. package/dist/config/agent-model-guard.js.map +1 -0
  10. package/dist/config/config-command.d.ts +33 -1
  11. package/dist/config/config-command.js +723 -11
  12. package/dist/config/config-command.js.map +1 -1
  13. package/dist/config/first-start.js +2 -8
  14. package/dist/config/first-start.js.map +1 -1
  15. package/dist/config/model-provider.d.ts +9 -0
  16. package/dist/config/model-provider.js +13 -0
  17. package/dist/config/model-provider.js.map +1 -1
  18. package/dist/config/openrouter-catalog.d.ts +46 -0
  19. package/dist/config/openrouter-catalog.js +111 -0
  20. package/dist/config/openrouter-catalog.js.map +1 -0
  21. package/dist/config/openrouter-models-fallback.d.ts +15 -0
  22. package/dist/config/openrouter-models-fallback.js +49 -0
  23. package/dist/config/openrouter-models-fallback.js.map +1 -0
  24. package/dist/config/paths.d.ts +48 -6
  25. package/dist/config/paths.js +63 -8
  26. package/dist/config/paths.js.map +1 -1
  27. package/dist/config/types.d.ts +8 -0
  28. package/dist/config/user-config.d.ts +179 -6
  29. package/dist/config/user-config.js +282 -5
  30. package/dist/config/user-config.js.map +1 -1
  31. package/dist/daemon/daemon-command.js +14 -5
  32. package/dist/daemon/daemon-command.js.map +1 -1
  33. package/dist/daemon/ironcurtain-daemon.d.ts +18 -0
  34. package/dist/daemon/ironcurtain-daemon.js +28 -1
  35. package/dist/daemon/ironcurtain-daemon.js.map +1 -1
  36. package/dist/daemon-client/daemon-client.d.ts +123 -0
  37. package/dist/daemon-client/daemon-client.js +324 -0
  38. package/dist/daemon-client/daemon-client.js.map +1 -0
  39. package/dist/docker/adapters/claude-code.js +109 -1
  40. package/dist/docker/adapters/claude-code.js.map +1 -1
  41. package/dist/docker/adapters/codex.d.ts +18 -0
  42. package/dist/docker/adapters/codex.js +376 -0
  43. package/dist/docker/adapters/codex.js.map +1 -0
  44. package/dist/docker/adapters/goose.js +38 -2
  45. package/dist/docker/adapters/goose.js.map +1 -1
  46. package/dist/docker/agent-adapter.d.ts +34 -6
  47. package/dist/docker/agent-adapter.js +2 -0
  48. package/dist/docker/agent-adapter.js.map +1 -1
  49. package/dist/docker/agent-registry.js +5 -0
  50. package/dist/docker/agent-registry.js.map +1 -1
  51. package/dist/docker/apple-container-manager.d.ts +49 -0
  52. package/dist/docker/apple-container-manager.js +486 -0
  53. package/dist/docker/apple-container-manager.js.map +1 -0
  54. package/dist/docker/ca.js +9 -2
  55. package/dist/docker/ca.js.map +1 -1
  56. package/dist/docker/code-mode-proxy.d.ts +11 -0
  57. package/dist/docker/code-mode-proxy.js +3 -1
  58. package/dist/docker/code-mode-proxy.js.map +1 -1
  59. package/dist/docker/container-lifecycle.d.ts +2 -2
  60. package/dist/docker/container-lifecycle.js +9 -0
  61. package/dist/docker/container-lifecycle.js.map +1 -1
  62. package/dist/docker/container-runtime.d.ts +29 -0
  63. package/dist/docker/container-runtime.js +76 -0
  64. package/dist/docker/container-runtime.js.map +1 -0
  65. package/dist/docker/docker-agent-session.d.ts +31 -0
  66. package/dist/docker/docker-agent-session.js +97 -7
  67. package/dist/docker/docker-agent-session.js.map +1 -1
  68. package/dist/docker/docker-infrastructure.d.ts +232 -15
  69. package/dist/docker/docker-infrastructure.js +762 -118
  70. package/dist/docker/docker-infrastructure.js.map +1 -1
  71. package/dist/docker/docker-manager.d.ts +25 -5
  72. package/dist/docker/docker-manager.js +388 -21
  73. package/dist/docker/docker-manager.js.map +1 -1
  74. package/dist/docker/docker-probe.d.ts +45 -0
  75. package/dist/docker/docker-probe.js +86 -0
  76. package/dist/docker/docker-probe.js.map +1 -0
  77. package/dist/docker/docker-progress-sink.d.ts +1 -1
  78. package/dist/docker/docker-resource-lifecycle.d.ts +71 -0
  79. package/dist/docker/docker-resource-lifecycle.js +454 -0
  80. package/dist/docker/docker-resource-lifecycle.js.map +1 -0
  81. package/dist/docker/gc-command.d.ts +2 -0
  82. package/dist/docker/gc-command.js +37 -0
  83. package/dist/docker/gc-command.js.map +1 -0
  84. package/dist/docker/mitm-proxy.d.ts +58 -5
  85. package/dist/docker/mitm-proxy.js +338 -26
  86. package/dist/docker/mitm-proxy.js.map +1 -1
  87. package/dist/docker/network-topology.d.ts +88 -0
  88. package/dist/docker/network-topology.js +167 -0
  89. package/dist/docker/network-topology.js.map +1 -0
  90. package/dist/docker/oauth-credentials.d.ts +13 -0
  91. package/dist/docker/oauth-credentials.js +125 -0
  92. package/dist/docker/oauth-credentials.js.map +1 -1
  93. package/dist/docker/openrouter.d.ts +107 -0
  94. package/dist/docker/openrouter.js +236 -0
  95. package/dist/docker/openrouter.js.map +1 -0
  96. package/dist/docker/orientation.js +1 -1
  97. package/dist/docker/orientation.js.map +1 -1
  98. package/dist/docker/package-types.d.ts +1 -1
  99. package/dist/docker/platform.d.ts +3 -1
  100. package/dist/docker/platform.js +3 -1
  101. package/dist/docker/platform.js.map +1 -1
  102. package/dist/docker/provider-config.d.ts +35 -1
  103. package/dist/docker/provider-config.js +93 -3
  104. package/dist/docker/provider-config.js.map +1 -1
  105. package/dist/docker/provision-lock.d.ts +46 -0
  106. package/dist/docker/provision-lock.js +152 -0
  107. package/dist/docker/provision-lock.js.map +1 -0
  108. package/dist/docker/pty-session.d.ts +22 -0
  109. package/dist/docker/pty-session.js +238 -84
  110. package/dist/docker/pty-session.js.map +1 -1
  111. package/dist/docker/pty-types.d.ts +15 -0
  112. package/dist/docker/pty-types.js +8 -0
  113. package/dist/docker/pty-types.js.map +1 -1
  114. package/dist/docker/registry-proxy.d.ts +46 -0
  115. package/dist/docker/registry-proxy.js +255 -1
  116. package/dist/docker/registry-proxy.js.map +1 -1
  117. package/dist/docker/resource-limits.d.ts +14 -5
  118. package/dist/docker/resource-limits.js +11 -8
  119. package/dist/docker/resource-limits.js.map +1 -1
  120. package/dist/docker/sse-extractor.js +55 -5
  121. package/dist/docker/sse-extractor.js.map +1 -1
  122. package/dist/docker/stream-delay.d.ts +86 -0
  123. package/dist/docker/stream-delay.js +218 -0
  124. package/dist/docker/stream-delay.js.map +1 -0
  125. package/dist/docker/token-stream-types.d.ts +15 -0
  126. package/dist/docker/trajectory-capture.d.ts +79 -0
  127. package/dist/docker/trajectory-capture.js +521 -0
  128. package/dist/docker/trajectory-capture.js.map +1 -0
  129. package/dist/docker/trajectory-reassembler.d.ts +286 -0
  130. package/dist/docker/trajectory-reassembler.js +1010 -0
  131. package/dist/docker/trajectory-reassembler.js.map +1 -0
  132. package/dist/docker/trajectory-tap.d.ts +100 -0
  133. package/dist/docker/trajectory-tap.js +410 -0
  134. package/dist/docker/trajectory-tap.js.map +1 -0
  135. package/dist/docker/trajectory-types.d.ts +187 -0
  136. package/dist/docker/trajectory-types.js +43 -0
  137. package/dist/docker/trajectory-types.js.map +1 -0
  138. package/dist/docker/types.d.ts +116 -12
  139. package/dist/doctor/checks.d.ts +39 -6
  140. package/dist/doctor/checks.js +129 -25
  141. package/dist/doctor/checks.js.map +1 -1
  142. package/dist/doctor/doctor-command.js +39 -9
  143. package/dist/doctor/doctor-command.js.map +1 -1
  144. package/dist/doctor/mcp-liveness.d.ts +1 -1
  145. package/dist/doctor/mcp-liveness.js +12 -4
  146. package/dist/doctor/mcp-liveness.js.map +1 -1
  147. package/dist/escalation/escalation-watcher.js +6 -0
  148. package/dist/escalation/escalation-watcher.js.map +1 -1
  149. package/dist/{mux → escalation}/trusted-input.d.ts +7 -4
  150. package/dist/{mux → escalation}/trusted-input.js +8 -5
  151. package/dist/escalation/trusted-input.js.map +1 -0
  152. package/dist/hash.js.map +1 -1
  153. package/dist/index.js +65 -16
  154. package/dist/index.js.map +1 -1
  155. package/dist/mux/mux-app.d.ts +9 -0
  156. package/dist/mux/mux-app.js +18 -16
  157. package/dist/mux/mux-app.js.map +1 -1
  158. package/dist/mux/mux-command.js +26 -8
  159. package/dist/mux/mux-command.js.map +1 -1
  160. package/dist/mux/mux-input-handler.d.ts +26 -2
  161. package/dist/mux/mux-input-handler.js +93 -11
  162. package/dist/mux/mux-input-handler.js.map +1 -1
  163. package/dist/mux/mux-renderer.d.ts +2 -1
  164. package/dist/mux/mux-renderer.js +67 -0
  165. package/dist/mux/mux-renderer.js.map +1 -1
  166. package/dist/mux/provider-profile-snapshot.d.ts +44 -0
  167. package/dist/mux/provider-profile-snapshot.js +56 -0
  168. package/dist/mux/provider-profile-snapshot.js.map +1 -0
  169. package/dist/mux/types.d.ts +3 -2
  170. package/dist/mux/types.js +6 -2
  171. package/dist/mux/types.js.map +1 -1
  172. package/dist/observe/observe-command.js +112 -125
  173. package/dist/observe/observe-command.js.map +1 -1
  174. package/dist/persona/broad-policy-validator.d.ts +95 -0
  175. package/dist/persona/broad-policy-validator.js +171 -0
  176. package/dist/persona/broad-policy-validator.js.map +1 -0
  177. package/dist/persona/compile-persona-policy.d.ts +54 -2
  178. package/dist/persona/compile-persona-policy.js +29 -4
  179. package/dist/persona/compile-persona-policy.js.map +1 -1
  180. package/dist/persona/event-bus-progress-reporter.d.ts +57 -0
  181. package/dist/persona/event-bus-progress-reporter.js +66 -0
  182. package/dist/persona/event-bus-progress-reporter.js.map +1 -0
  183. package/dist/persona/persona-command.js +46 -76
  184. package/dist/persona/persona-command.js.map +1 -1
  185. package/dist/persona/persona-compile-orchestrator.d.ts +101 -0
  186. package/dist/persona/persona-compile-orchestrator.js +504 -0
  187. package/dist/persona/persona-compile-orchestrator.js.map +1 -0
  188. package/dist/persona/persona-service.d.ts +137 -0
  189. package/dist/persona/persona-service.js +263 -0
  190. package/dist/persona/persona-service.js.map +1 -0
  191. package/dist/persona/policy-mutation-audit.d.ts +109 -0
  192. package/dist/persona/policy-mutation-audit.js +179 -0
  193. package/dist/persona/policy-mutation-audit.js.map +1 -0
  194. package/dist/persona/rule-delta.d.ts +30 -0
  195. package/dist/persona/rule-delta.js +82 -0
  196. package/dist/persona/rule-delta.js.map +1 -0
  197. package/dist/persona/types.d.ts +12 -0
  198. package/dist/pipeline/annotate.js +10 -2
  199. package/dist/pipeline/annotate.js.map +1 -1
  200. package/dist/pipeline/compile.js +14 -2
  201. package/dist/pipeline/compile.js.map +1 -1
  202. package/dist/pipeline/constitution-compiler.js.map +1 -1
  203. package/dist/pipeline/generate-with-repair.js.map +1 -1
  204. package/dist/pipeline/pipeline-runner.d.ts +63 -4
  205. package/dist/pipeline/pipeline-runner.js +159 -50
  206. package/dist/pipeline/pipeline-runner.js.map +1 -1
  207. package/dist/pipeline/pipeline-shared.d.ts +32 -3
  208. package/dist/pipeline/pipeline-shared.js +76 -8
  209. package/dist/pipeline/pipeline-shared.js.map +1 -1
  210. package/dist/pipeline/refresh-lists.js +3 -5
  211. package/dist/pipeline/refresh-lists.js.map +1 -1
  212. package/dist/pipeline/scenario-schema-validator.js.map +1 -1
  213. package/dist/{mux → pty}/pty-bridge.d.ts +41 -3
  214. package/dist/{mux → pty}/pty-bridge.js +71 -18
  215. package/dist/pty/pty-bridge.js.map +1 -0
  216. package/dist/pty/resolve-ironcurtain-bin.d.ts +17 -0
  217. package/dist/pty/resolve-ironcurtain-bin.js +22 -0
  218. package/dist/pty/resolve-ironcurtain-bin.js.map +1 -0
  219. package/dist/sandbox/index.d.ts +19 -4
  220. package/dist/sandbox/index.js +31 -18
  221. package/dist/sandbox/index.js.map +1 -1
  222. package/dist/servers/fetch-server.js +2 -0
  223. package/dist/servers/fetch-server.js.map +1 -1
  224. package/dist/session/index.d.ts +1 -1
  225. package/dist/session/index.js +20 -2
  226. package/dist/session/index.js.map +1 -1
  227. package/dist/session/preflight.d.ts +20 -35
  228. package/dist/session/preflight.js +92 -109
  229. package/dist/session/preflight.js.map +1 -1
  230. package/dist/session/resource-budget-tracker.js +8 -0
  231. package/dist/session/resource-budget-tracker.js.map +1 -1
  232. package/dist/session/session-manager.d.ts +7 -0
  233. package/dist/session/session-manager.js.map +1 -1
  234. package/dist/session/types.d.ts +23 -0
  235. package/dist/signal/bot-command.js +6 -1
  236. package/dist/signal/bot-command.js.map +1 -1
  237. package/dist/signal/setup-signal.js +1 -1
  238. package/dist/signal/setup-signal.js.map +1 -1
  239. package/dist/signal/signal-bot-daemon.d.ts +1 -0
  240. package/dist/signal/signal-bot-daemon.js +9 -2
  241. package/dist/signal/signal-bot-daemon.js.map +1 -1
  242. package/dist/signal/signal-container.d.ts +3 -3
  243. package/dist/signal/signal-container.js +2 -2
  244. package/dist/signal/signal-container.js.map +1 -1
  245. package/dist/trusted-process/call-circuit-breaker.d.ts +6 -0
  246. package/dist/trusted-process/call-circuit-breaker.js +22 -3
  247. package/dist/trusted-process/call-circuit-breaker.js.map +1 -1
  248. package/dist/trusted-process/container-command.d.ts +35 -0
  249. package/dist/trusted-process/container-command.js +49 -0
  250. package/dist/trusted-process/container-command.js.map +1 -0
  251. package/dist/trusted-process/mcp-error-utils.js +4 -1
  252. package/dist/trusted-process/mcp-error-utils.js.map +1 -1
  253. package/dist/trusted-process/mcp-proxy-server.js +37 -3
  254. package/dist/trusted-process/mcp-proxy-server.js.map +1 -1
  255. package/dist/trusted-process/policy-engine.js +13 -2
  256. package/dist/trusted-process/policy-engine.js.map +1 -1
  257. package/dist/trusted-process/tcp-server-transport.d.ts +19 -1
  258. package/dist/trusted-process/tcp-server-transport.js +56 -10
  259. package/dist/trusted-process/tcp-server-transport.js.map +1 -1
  260. package/dist/trusted-process/tool-call-coordinator.d.ts +22 -8
  261. package/dist/trusted-process/tool-call-coordinator.js +149 -65
  262. package/dist/trusted-process/tool-call-coordinator.js.map +1 -1
  263. package/dist/trusted-process/tool-call-pipeline.d.ts +8 -0
  264. package/dist/trusted-process/tool-call-pipeline.js +68 -34
  265. package/dist/trusted-process/tool-call-pipeline.js.map +1 -1
  266. package/dist/util/atomic-write.d.ts +31 -0
  267. package/dist/util/atomic-write.js +43 -0
  268. package/dist/util/atomic-write.js.map +1 -0
  269. package/dist/utils/preflight-checks.js +1 -3
  270. package/dist/utils/preflight-checks.js.map +1 -1
  271. package/dist/utils/stdio-guard.d.ts +1 -0
  272. package/dist/utils/stdio-guard.js +27 -0
  273. package/dist/utils/stdio-guard.js.map +1 -0
  274. package/dist/web-ui/__tests__/config-dispatch.test.d.ts +13 -0
  275. package/dist/web-ui/__tests__/config-dispatch.test.js +383 -0
  276. package/dist/web-ui/__tests__/config-dispatch.test.js.map +1 -0
  277. package/dist/web-ui/__tests__/json-rpc-dispatch.test.js +6 -0
  278. package/dist/web-ui/__tests__/json-rpc-dispatch.test.js.map +1 -1
  279. package/dist/web-ui/conn-registry.d.ts +14 -0
  280. package/dist/web-ui/conn-registry.js +25 -0
  281. package/dist/web-ui/conn-registry.js.map +1 -0
  282. package/dist/web-ui/dispatch/config-dispatch.d.ts +15 -0
  283. package/dist/web-ui/dispatch/config-dispatch.js +277 -0
  284. package/dist/web-ui/dispatch/config-dispatch.js.map +1 -0
  285. package/dist/web-ui/dispatch/escalation-dispatch.js +11 -2
  286. package/dist/web-ui/dispatch/escalation-dispatch.js.map +1 -1
  287. package/dist/web-ui/dispatch/persona-dispatch.d.ts +46 -2
  288. package/dist/web-ui/dispatch/persona-dispatch.js +209 -56
  289. package/dist/web-ui/dispatch/persona-dispatch.js.map +1 -1
  290. package/dist/web-ui/dispatch/pty-dispatch.d.ts +15 -0
  291. package/dist/web-ui/dispatch/pty-dispatch.js +66 -0
  292. package/dist/web-ui/dispatch/pty-dispatch.js.map +1 -0
  293. package/dist/web-ui/dispatch/session-dispatch.js +89 -6
  294. package/dist/web-ui/dispatch/session-dispatch.js.map +1 -1
  295. package/dist/web-ui/dispatch/types.d.ts +35 -0
  296. package/dist/web-ui/dispatch/types.js +42 -1
  297. package/dist/web-ui/dispatch/types.js.map +1 -1
  298. package/dist/web-ui/dispatch/workflow-dispatch.js +116 -5
  299. package/dist/web-ui/dispatch/workflow-dispatch.js.map +1 -1
  300. package/dist/web-ui/json-rpc-dispatch.js +4 -1
  301. package/dist/web-ui/json-rpc-dispatch.js.map +1 -1
  302. package/dist/web-ui/pty-session-manager.d.ts +234 -0
  303. package/dist/web-ui/pty-session-manager.js +599 -0
  304. package/dist/web-ui/pty-session-manager.js.map +1 -0
  305. package/dist/web-ui/web-event-bus.d.ts +34 -1
  306. package/dist/web-ui/web-event-bus.js.map +1 -1
  307. package/dist/web-ui/web-session-transport.js.map +1 -1
  308. package/dist/web-ui/web-ui-server.d.ts +22 -0
  309. package/dist/web-ui/web-ui-server.js +41 -0
  310. package/dist/web-ui/web-ui-server.js.map +1 -1
  311. package/dist/web-ui/web-ui-types.d.ts +212 -5
  312. package/dist/web-ui/web-ui-types.js.map +1 -1
  313. package/dist/web-ui-static/assets/index-CCVI4nEK.css +1 -0
  314. package/dist/web-ui-static/assets/index-Dm012gvY.js +114 -0
  315. package/dist/web-ui-static/index.html +2 -2
  316. package/dist/workflow/cli-shared.d.ts +62 -0
  317. package/dist/workflow/cli-shared.js +117 -0
  318. package/dist/workflow/cli-shared.js.map +1 -0
  319. package/dist/workflow/cli-support.js +0 -2
  320. package/dist/workflow/cli-support.js.map +1 -1
  321. package/dist/workflow/container-snapshots.d.ts +29 -0
  322. package/dist/workflow/container-snapshots.js +137 -0
  323. package/dist/workflow/container-snapshots.js.map +1 -0
  324. package/dist/workflow/daemon-gate-commands.d.ts +21 -0
  325. package/dist/workflow/daemon-gate-commands.js +595 -0
  326. package/dist/workflow/daemon-gate-commands.js.map +1 -0
  327. package/dist/workflow/discovery.d.ts +29 -0
  328. package/dist/workflow/discovery.js +67 -7
  329. package/dist/workflow/discovery.js.map +1 -1
  330. package/dist/workflow/lane-template.d.ts +89 -0
  331. package/dist/workflow/lane-template.js +141 -0
  332. package/dist/workflow/lane-template.js.map +1 -0
  333. package/dist/workflow/lint.d.ts +7 -1
  334. package/dist/workflow/lint.js +186 -3
  335. package/dist/workflow/lint.js.map +1 -1
  336. package/dist/workflow/machine-builder.d.ts +90 -2
  337. package/dist/workflow/machine-builder.js +222 -29
  338. package/dist/workflow/machine-builder.js.map +1 -1
  339. package/dist/workflow/message-log.d.ts +15 -1
  340. package/dist/workflow/message-log.js.map +1 -1
  341. package/dist/workflow/orchestrator.d.ts +505 -1
  342. package/dist/workflow/orchestrator.js +1725 -69
  343. package/dist/workflow/orchestrator.js.map +1 -1
  344. package/dist/workflow/prompt-builder.js +2 -1
  345. package/dist/workflow/prompt-builder.js.map +1 -1
  346. package/dist/workflow/run-state-command.js +1 -1
  347. package/dist/workflow/run-state-command.js.map +1 -1
  348. package/dist/workflow/shutdown-signals.d.ts +7 -0
  349. package/dist/workflow/shutdown-signals.js +40 -0
  350. package/dist/workflow/shutdown-signals.js.map +1 -0
  351. package/dist/workflow/status-parser.js +19 -4
  352. package/dist/workflow/status-parser.js.map +1 -1
  353. package/dist/workflow/types.d.ts +123 -23
  354. package/dist/workflow/types.js +2 -0
  355. package/dist/workflow/types.js.map +1 -1
  356. package/dist/workflow/validate.d.ts +23 -1
  357. package/dist/workflow/validate.js +311 -22
  358. package/dist/workflow/validate.js.map +1 -1
  359. package/dist/workflow/workflow-command.d.ts +0 -17
  360. package/dist/workflow/workflow-command.js +118 -94
  361. package/dist/workflow/workflow-command.js.map +1 -1
  362. package/dist/workflow/workflow-discovery.d.ts +2 -0
  363. package/dist/workflow/workflow-discovery.js +22 -1
  364. package/dist/workflow/workflow-discovery.js.map +1 -1
  365. package/dist/workflow/workflow-manager.d.ts +34 -0
  366. package/dist/workflow/workflow-manager.js +52 -1
  367. package/dist/workflow/workflow-manager.js.map +1 -1
  368. package/dist/workflow/workflows/design-and-code/README.md +50 -0
  369. package/dist/workflow/workflows/deterministic-eval-smoke/scripts/format_report.js +29 -0
  370. package/dist/workflow/workflows/deterministic-eval-smoke/scripts/package.json +5 -0
  371. package/dist/workflow/workflows/deterministic-eval-smoke/scripts/requirements.txt +1 -0
  372. package/dist/workflow/workflows/deterministic-eval-smoke/scripts/run_eval.py +41 -0
  373. package/dist/workflow/workflows/deterministic-eval-smoke/workflow.yaml +57 -0
  374. package/dist/workflow/workflows/deterministic-verdict-smoke/scripts/classify.py +18 -0
  375. package/dist/workflow/workflows/deterministic-verdict-smoke/workflow.yaml +51 -0
  376. package/dist/workflow/workflows/evolve/README.md +66 -0
  377. package/dist/workflow/workflows/evolve/scripts/LICENSE +201 -0
  378. package/dist/workflow/workflows/evolve/scripts/README.md +314 -0
  379. package/dist/workflow/workflows/evolve/scripts/evolve-brief +16 -0
  380. package/dist/workflow/workflows/evolve/scripts/evolve-cognition +16 -0
  381. package/dist/workflow/workflows/evolve/scripts/evolve-db +16 -0
  382. package/dist/workflow/workflows/evolve/scripts/evolve-eval +16 -0
  383. package/dist/workflow/workflows/evolve/scripts/evolve-files +16 -0
  384. package/dist/workflow/workflows/evolve/scripts/evolve-summary +16 -0
  385. package/dist/workflow/workflows/evolve/scripts/evolve_core/__init__.py +14 -0
  386. package/dist/workflow/workflows/evolve/scripts/evolve_core/algorithms/__init__.py +17 -0
  387. package/dist/workflow/workflows/evolve/scripts/evolve_core/algorithms/base.py +21 -0
  388. package/dist/workflow/workflows/evolve/scripts/evolve_core/algorithms/factory.py +90 -0
  389. package/dist/workflow/workflows/evolve/scripts/evolve_core/algorithms/greedy.py +17 -0
  390. package/dist/workflow/workflows/evolve/scripts/evolve_core/algorithms/island.py +316 -0
  391. package/dist/workflow/workflows/evolve/scripts/evolve_core/algorithms/random.py +18 -0
  392. package/dist/workflow/workflows/evolve/scripts/evolve_core/algorithms/ucb1.py +55 -0
  393. package/dist/workflow/workflows/evolve/scripts/evolve_core/best_snapshot.py +62 -0
  394. package/dist/workflow/workflows/evolve/scripts/evolve_core/cli.py +752 -0
  395. package/dist/workflow/workflows/evolve/scripts/evolve_core/cognition.py +127 -0
  396. package/dist/workflow/workflows/evolve/scripts/evolve_core/database.py +218 -0
  397. package/dist/workflow/workflows/evolve/scripts/evolve_core/diff.py +57 -0
  398. package/dist/workflow/workflows/evolve/scripts/evolve_core/embedding.py +84 -0
  399. package/dist/workflow/workflows/evolve/scripts/evolve_core/file_lock.py +45 -0
  400. package/dist/workflow/workflows/evolve/scripts/evolve_core/run_state.py +343 -0
  401. package/dist/workflow/workflows/evolve/scripts/evolve_core/sampling_config.py +173 -0
  402. package/dist/workflow/workflows/evolve/scripts/evolve_core/structures.py +93 -0
  403. package/dist/workflow/workflows/evolve/scripts/evolve_core/vector_index.py +191 -0
  404. package/dist/workflow/workflows/evolve/scripts/evolve_result.py +1503 -0
  405. package/dist/workflow/workflows/evolve/scripts/requirements.txt +2 -0
  406. package/dist/workflow/workflows/evolve/workflow.yaml +646 -0
  407. package/dist/workflow/workflows/test-email-summary/workflow.yaml +1 -0
  408. package/dist/workflow/workflows/vuln-discovery/README.md +54 -0
  409. package/dist/workflow/workflows/vuln-discovery/skills/harness-design-fuzzing/SKILL.md +6 -1
  410. package/dist/workflow/workflows/vuln-discovery/skills/memory-safety-c-cpp/SKILL.md +1 -0
  411. package/dist/workflow/workflows/vuln-discovery/skills/vulnerability-triage/SKILL.md +4 -0
  412. package/dist/workflow/workflows/vuln-discovery/workflow.yaml +13 -8
  413. package/docker/Dockerfile.base +22 -0
  414. package/docker/Dockerfile.base.arm64 +18 -0
  415. package/docker/Dockerfile.claude-code +3 -1
  416. package/docker/Dockerfile.codex +17 -0
  417. package/docker/Dockerfile.goose +3 -1
  418. package/docker/entrypoint-claude-code.sh +28 -45
  419. package/docker/entrypoint-codex.sh +42 -0
  420. package/docker/entrypoint-goose.sh +5 -24
  421. package/docker/entrypoint-uid-remap.sh +93 -0
  422. package/package.json +39 -30
  423. package/src/workflow/workflows/design-and-code/README.md +50 -0
  424. package/src/workflow/workflows/deterministic-eval-smoke/scripts/format_report.js +29 -0
  425. package/src/workflow/workflows/deterministic-eval-smoke/scripts/package.json +5 -0
  426. package/src/workflow/workflows/deterministic-eval-smoke/scripts/requirements.txt +1 -0
  427. package/src/workflow/workflows/deterministic-eval-smoke/scripts/run_eval.py +41 -0
  428. package/src/workflow/workflows/deterministic-eval-smoke/workflow.yaml +57 -0
  429. package/src/workflow/workflows/deterministic-verdict-smoke/scripts/classify.py +18 -0
  430. package/src/workflow/workflows/deterministic-verdict-smoke/workflow.yaml +51 -0
  431. package/src/workflow/workflows/evolve/README.md +66 -0
  432. package/src/workflow/workflows/evolve/scripts/LICENSE +201 -0
  433. package/src/workflow/workflows/evolve/scripts/README.md +314 -0
  434. package/src/workflow/workflows/evolve/scripts/evolve-brief +16 -0
  435. package/src/workflow/workflows/evolve/scripts/evolve-cognition +16 -0
  436. package/src/workflow/workflows/evolve/scripts/evolve-db +16 -0
  437. package/src/workflow/workflows/evolve/scripts/evolve-eval +16 -0
  438. package/src/workflow/workflows/evolve/scripts/evolve-files +16 -0
  439. package/src/workflow/workflows/evolve/scripts/evolve-summary +16 -0
  440. package/src/workflow/workflows/evolve/scripts/evolve_core/__init__.py +14 -0
  441. package/src/workflow/workflows/evolve/scripts/evolve_core/algorithms/__init__.py +17 -0
  442. package/src/workflow/workflows/evolve/scripts/evolve_core/algorithms/base.py +21 -0
  443. package/src/workflow/workflows/evolve/scripts/evolve_core/algorithms/factory.py +90 -0
  444. package/src/workflow/workflows/evolve/scripts/evolve_core/algorithms/greedy.py +17 -0
  445. package/src/workflow/workflows/evolve/scripts/evolve_core/algorithms/island.py +316 -0
  446. package/src/workflow/workflows/evolve/scripts/evolve_core/algorithms/random.py +18 -0
  447. package/src/workflow/workflows/evolve/scripts/evolve_core/algorithms/ucb1.py +55 -0
  448. package/src/workflow/workflows/evolve/scripts/evolve_core/best_snapshot.py +62 -0
  449. package/src/workflow/workflows/evolve/scripts/evolve_core/cli.py +752 -0
  450. package/src/workflow/workflows/evolve/scripts/evolve_core/cognition.py +127 -0
  451. package/src/workflow/workflows/evolve/scripts/evolve_core/database.py +218 -0
  452. package/src/workflow/workflows/evolve/scripts/evolve_core/diff.py +57 -0
  453. package/src/workflow/workflows/evolve/scripts/evolve_core/embedding.py +84 -0
  454. package/src/workflow/workflows/evolve/scripts/evolve_core/file_lock.py +45 -0
  455. package/src/workflow/workflows/evolve/scripts/evolve_core/run_state.py +343 -0
  456. package/src/workflow/workflows/evolve/scripts/evolve_core/sampling_config.py +173 -0
  457. package/src/workflow/workflows/evolve/scripts/evolve_core/structures.py +93 -0
  458. package/src/workflow/workflows/evolve/scripts/evolve_core/vector_index.py +191 -0
  459. package/src/workflow/workflows/evolve/scripts/evolve_result.py +1503 -0
  460. package/src/workflow/workflows/evolve/scripts/requirements.txt +2 -0
  461. package/src/workflow/workflows/evolve/workflow.yaml +646 -0
  462. package/src/workflow/workflows/test-email-summary/workflow.yaml +1 -0
  463. package/src/workflow/workflows/vuln-discovery/README.md +54 -0
  464. package/src/workflow/workflows/vuln-discovery/skills/harness-design-fuzzing/SKILL.md +6 -1
  465. package/src/workflow/workflows/vuln-discovery/skills/memory-safety-c-cpp/SKILL.md +1 -0
  466. package/src/workflow/workflows/vuln-discovery/skills/vulnerability-triage/SKILL.md +4 -0
  467. package/src/workflow/workflows/vuln-discovery/workflow.yaml +13 -8
  468. package/dist/mux/pty-bridge.js.map +0 -1
  469. package/dist/mux/trusted-input.js.map +0 -1
  470. package/dist/web-ui-static/assets/index-BFO5z1js.js +0 -76
  471. package/dist/web-ui-static/assets/index-CCUwrkIL.css +0 -1
  472. package/packages/web-ui/README.md +0 -113
@@ -0,0 +1,187 @@
1
+ /**
2
+ * MITM token-trajectory capture: shared types.
3
+ *
4
+ * Types backing the on-disk JSONL schema (see
5
+ * docs/designs/mitm-token-trajectory-capture.md §4) and the dispatcher's
6
+ * internal state. The schema is the source of truth for the corpus
7
+ * downstream tooling consumes — keep field names byte-faithful with the
8
+ * design doc.
9
+ */
10
+ import type { SessionId } from '../session/types.js';
11
+ /**
12
+ * Provider identity. `unknown` is reserved for hosts the capture sees but
13
+ * cannot classify (and is captured raw). `'openai'` is the OpenAI Responses
14
+ * API stream Codex emits on `chatgpt.com`.
15
+ */
16
+ export type CaptureProvider = 'anthropic' | 'openai' | 'unknown';
17
+ /** Reason a session was poisoned. See §9 for the full taxonomy. */
18
+ export type PoisonReason = 'reassembly-failure' | 'disk-error' | 'queue-overflow' | 'mid-stream-abort' | 'infrastructure-teardown' | 'unsupported-encoding' | 'unknown';
19
+ /**
20
+ * Single HTTP exchange captured by the MITM proxy. One line per
21
+ * exchange in the on-disk JSONL.
22
+ */
23
+ export interface ExchangeRecord {
24
+ readonly schemaVersion: 1;
25
+ readonly exchangeId: string;
26
+ readonly sessionId: string;
27
+ readonly persona?: string;
28
+ readonly workflowRunId?: string;
29
+ readonly bundleId?: string;
30
+ readonly recordedAgentName?: string;
31
+ readonly provider: CaptureProvider;
32
+ readonly method: string;
33
+ readonly host: string;
34
+ readonly path: string;
35
+ readonly requestStartedAt: number;
36
+ readonly requestFinishedAt: number;
37
+ readonly responseFinishedAt: number;
38
+ readonly request: {
39
+ readonly headers: Readonly<Record<string, string>>;
40
+ /** UTF-8 body when content-encoding is identity (or absent); empty otherwise. */
41
+ readonly bodyUtf8: string;
42
+ /** Present iff body is compressed or otherwise not valid UTF-8. */
43
+ readonly bodyBase64?: string;
44
+ readonly bodyBytes: number;
45
+ readonly contentEncoding?: string;
46
+ };
47
+ readonly response: {
48
+ readonly status: number;
49
+ readonly headers: Readonly<Record<string, string>>;
50
+ readonly streaming: boolean;
51
+ readonly providerRequestId?: string;
52
+ readonly stopReason?: string;
53
+ readonly modelFingerprint?: string;
54
+ readonly usage?: Readonly<Record<string, unknown>>;
55
+ readonly bodyUtf8: string;
56
+ readonly bodyBase64?: string;
57
+ readonly bodyBytes: number;
58
+ readonly streamRaw?: {
59
+ readonly events: ReadonlyArray<{
60
+ readonly eventType: string;
61
+ readonly dataUtf8: string;
62
+ readonly offsetMs: number;
63
+ }>;
64
+ };
65
+ };
66
+ readonly capture: {
67
+ readonly reassemblyOk: boolean;
68
+ readonly reassemblyDiagnostic?: string;
69
+ readonly retried?: boolean;
70
+ };
71
+ }
72
+ /**
73
+ * Single line in `manifest.jsonl`. Always one `session-start` paired
74
+ * with one `session-end` (modulo crash safety nets, where the start
75
+ * may exist without a matching end — see §9).
76
+ */
77
+ export type ManifestEntry = {
78
+ readonly schemaVersion: 1;
79
+ readonly event: 'session-start';
80
+ readonly seq: number;
81
+ readonly sessionId: string;
82
+ readonly persona?: string;
83
+ readonly fsmState?: string;
84
+ readonly ts: string;
85
+ } | {
86
+ readonly schemaVersion: 1;
87
+ readonly event: 'session-end';
88
+ readonly seq: number;
89
+ readonly sessionId: string;
90
+ readonly persona?: string;
91
+ readonly fsmState?: string;
92
+ readonly ts: string;
93
+ readonly exchanges: number;
94
+ readonly bytesWritten: number;
95
+ readonly poisoned: boolean;
96
+ readonly poisonReason?: PoisonReason;
97
+ readonly closedReason?: 'infrastructure-teardown';
98
+ };
99
+ /**
100
+ * Capture configuration. v0 surface is a single boolean — see §10 for
101
+ * the rationale (no knobs that would silently produce partial captures).
102
+ */
103
+ export interface CaptureConfig {
104
+ readonly enabled: boolean;
105
+ }
106
+ /**
107
+ * Inputs to `beginSession` / `beginCaptureSession`.
108
+ */
109
+ export interface BeginCaptureSessionOptions {
110
+ readonly sessionId: SessionId;
111
+ readonly persona?: string;
112
+ readonly fsmState?: string;
113
+ }
114
+ /**
115
+ * Aggregate dispatcher diagnostics.
116
+ */
117
+ export interface CaptureStats {
118
+ /** Records successfully written to disk across all sessions. */
119
+ readonly written: number;
120
+ /**
121
+ * Records dropped before disk (poisoned session, missing beginSession,
122
+ * etc.). Individual records are never dropped on successful sessions;
123
+ * this is for diagnostic visibility only.
124
+ */
125
+ readonly dropped: number;
126
+ readonly queued: number;
127
+ readonly bytesWritten: number;
128
+ readonly openSessions: number;
129
+ }
130
+ /**
131
+ * Reassembler interface. Each provider has its own state machine; the
132
+ * dispatcher routes by host. See §5 for the byte-fidelity rules.
133
+ */
134
+ export interface Reassembler {
135
+ /** Feed raw response chunk bytes (verbatim). */
136
+ push(chunk: Buffer): void;
137
+ /**
138
+ * Signal that the upstream response stream closed cleanly. Returns
139
+ * the reassembled body plus structured fields. Throws (or marks the
140
+ * reassembly as failed) if the stream did not finish in a well-formed
141
+ * state. After `finalize()`, the reassembler MUST NOT be reused.
142
+ */
143
+ finalize(): ReassemblyResult;
144
+ /**
145
+ * True once the provider's terminal event has been parsed
146
+ * (`message_stop` / `[DONE]` / `response.completed`). Lets the tap
147
+ * finalize a complete-but-socket-aborted stream (write a faithful
148
+ * record) instead of poisoning it as a mid-stream abort. When false,
149
+ * a close/error before the terminal event is a genuine truncation.
150
+ */
151
+ canFinalize(): boolean;
152
+ }
153
+ /**
154
+ * Output of a successful reassembly.
155
+ */
156
+ export interface ReassemblyResult {
157
+ /**
158
+ * Reassembled body as a string. Constructed via raw substring
159
+ * concatenation of wire bytes — never JSON.parse → JSON.stringify
160
+ * on captured content. See §6 invariant #1.
161
+ */
162
+ readonly bodyUtf8: string;
163
+ readonly providerRequestId?: string;
164
+ readonly stopReason?: string;
165
+ readonly modelFingerprint?: string;
166
+ readonly usage?: Readonly<Record<string, unknown>>;
167
+ /** Raw event log for diagnostics (`streamRaw.events`). */
168
+ readonly events: ReadonlyArray<{
169
+ readonly eventType: string;
170
+ readonly dataUtf8: string;
171
+ readonly offsetMs: number;
172
+ }>;
173
+ }
174
+ /**
175
+ * Headers/body redaction is centralized so the writer-input unit test
176
+ * (§12 test #2(a)) can drive the redaction layer directly without a
177
+ * proxy.
178
+ */
179
+ export declare const REDACTED_HEADER_NAMES: ReadonlySet<string>;
180
+ export declare const REDACTED_VALUE = "<redacted>";
181
+ /**
182
+ * Drop / replace any header in the redaction set. Case-insensitive on
183
+ * the name. Always emits the redaction sentinel so the schema shape is
184
+ * preserved (downstream tooling can see that a header was present and
185
+ * stripped, vs. truly absent).
186
+ */
187
+ export declare function redactHeaders(headers: Readonly<Record<string, string | string[] | undefined>>): Record<string, string>;
@@ -0,0 +1,43 @@
1
+ /**
2
+ * MITM token-trajectory capture: shared types.
3
+ *
4
+ * Types backing the on-disk JSONL schema (see
5
+ * docs/designs/mitm-token-trajectory-capture.md §4) and the dispatcher's
6
+ * internal state. The schema is the source of truth for the corpus
7
+ * downstream tooling consumes — keep field names byte-faithful with the
8
+ * design doc.
9
+ */
10
+ /**
11
+ * Headers/body redaction is centralized so the writer-input unit test
12
+ * (§12 test #2(a)) can drive the redaction layer directly without a
13
+ * proxy.
14
+ */
15
+ export const REDACTED_HEADER_NAMES = new Set([
16
+ 'authorization',
17
+ 'x-api-key',
18
+ 'proxy-authorization',
19
+ 'cookie',
20
+ 'set-cookie',
21
+ ]);
22
+ export const REDACTED_VALUE = '<redacted>';
23
+ /**
24
+ * Drop / replace any header in the redaction set. Case-insensitive on
25
+ * the name. Always emits the redaction sentinel so the schema shape is
26
+ * preserved (downstream tooling can see that a header was present and
27
+ * stripped, vs. truly absent).
28
+ */
29
+ export function redactHeaders(headers) {
30
+ const out = {};
31
+ for (const [name, value] of Object.entries(headers)) {
32
+ if (value === undefined)
33
+ continue;
34
+ const lower = name.toLowerCase();
35
+ if (REDACTED_HEADER_NAMES.has(lower)) {
36
+ out[lower] = REDACTED_VALUE;
37
+ continue;
38
+ }
39
+ out[lower] = Array.isArray(value) ? value.join(', ') : value;
40
+ }
41
+ return out;
42
+ }
43
+ //# sourceMappingURL=trajectory-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trajectory-types.js","sourceRoot":"","sources":["../../src/docker/trajectory-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA6LH;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAwB,IAAI,GAAG,CAAC;IAChE,eAAe;IACf,WAAW;IACX,qBAAqB;IACrB,QAAQ;IACR,YAAY;CACb,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,YAAY,CAAC;AAE3C;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAC3B,OAAgE;IAEhE,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACpD,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACjC,IAAI,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACrC,GAAG,CAAC,KAAK,CAAC,GAAG,cAAc,CAAC;YAC5B,SAAS;QACX,CAAC;QACD,GAAG,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC/D,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -42,6 +42,8 @@ export interface DockerContainerConfig {
42
42
  * on standalone CLI / PTY sessions (which have no scope concept).
43
43
  */
44
44
  readonly scopeLabel?: string;
45
+ /** Additional runtime ownership/housekeeping labels. */
46
+ readonly labels?: Readonly<Record<string, string>>;
45
47
  /** Extra --add-host entries (e.g. ["host.docker.internal:172.30.0.3"]). When set, suppresses the default host-gateway mapping. */
46
48
  readonly extraHosts?: readonly string[];
47
49
  /** Optional resource limits. */
@@ -83,6 +85,23 @@ export interface DockerContainerConfig {
83
85
  * Optional. Defaults to false (no TTY allocated).
84
86
  */
85
87
  readonly tty?: boolean;
88
+ /**
89
+ * Guest-listens / host-connects Unix-domain-socket bridges
90
+ * (`container create --publish-socket <hostPath>:<containerPath>`).
91
+ *
92
+ * Apple `container` only — the runtime creates a vsock relay so a
93
+ * socket the guest `bind()`s at `containerPath` becomes reachable on
94
+ * the host at `hostPath`. Used by PTY mode on the `uds` topology to
95
+ * expose the in-container PTY listener without any network interface.
96
+ * The host-side socket materializes when the guest binds, so
97
+ * existence-polling is a valid readiness signal.
98
+ *
99
+ * Docker has no equivalent; `buildCreateArgs` throws when this is set.
100
+ */
101
+ readonly publishSockets?: readonly {
102
+ readonly hostPath: string;
103
+ readonly containerPath: string;
104
+ }[];
86
105
  /**
87
106
  * Override the container's effective user at creation time.
88
107
  * Maps to `docker create --user <value>` (formats: `uid`, `uid:gid`,
@@ -117,15 +136,67 @@ export interface DockerExecResult {
117
136
  readonly stdout: string;
118
137
  readonly stderr: string;
119
138
  }
139
+ export interface DockerCommitOptions {
140
+ readonly tag?: string;
141
+ readonly changes?: readonly string[];
142
+ readonly pause?: boolean;
143
+ readonly timeoutMs?: number;
144
+ /**
145
+ * When true, snapshot through docker export/import instead of docker commit
146
+ * so the resulting image is flattened and does not retain the source image
147
+ * as an inspectable parent (a superseded snapshot digest can then be
148
+ * force-removed without a dependent-child-image conflict). Intended for
149
+ * workflow resume snapshots. The image Config that export/import would
150
+ * otherwise drop (ENTRYPOINT/CMD/WORKDIR/USER/ENV) is re-baked from the
151
+ * source container, so a flattened image still behaves like its source.
152
+ */
153
+ readonly flatten?: boolean;
154
+ }
155
+ export interface DockerImageInfo {
156
+ readonly id: string;
157
+ readonly repoTags: readonly string[];
158
+ readonly labels: Readonly<Record<string, string>>;
159
+ readonly created: string;
160
+ }
161
+ /** Docker network state used by crash reconciliation and subnet allocation. */
162
+ export interface DockerNetworkInfo {
163
+ readonly id: string;
164
+ readonly name: string;
165
+ readonly created: string;
166
+ readonly labels: Readonly<Record<string, string>>;
167
+ readonly subnets: readonly string[];
168
+ readonly containerIds: readonly string[];
169
+ }
170
+ /** Docker container state used by crash reconciliation. */
171
+ export interface DockerContainerInfo {
172
+ readonly id: string;
173
+ readonly name: string;
174
+ readonly created: string;
175
+ readonly running: boolean;
176
+ readonly labels: Readonly<Record<string, string>>;
177
+ }
178
+ export interface DockerNetworkCreateOptions {
179
+ readonly internal?: boolean;
180
+ readonly subnet?: string;
181
+ readonly gateway?: string;
182
+ readonly labels?: Readonly<Record<string, string>>;
183
+ }
120
184
  /**
121
- * Manages Docker container lifecycle for agent sessions.
185
+ * Manages container lifecycle for agent sessions.
186
+ *
187
+ * Implementations wrap a specific container runtime CLI -- Docker today
188
+ * (`createDockerManager()` in docker-manager.ts), Apple `container` planned
189
+ * (see docs/designs/apple-container-runtime.md). Select via
190
+ * `createContainerRuntime()` in container-runtime.ts.
122
191
  *
123
- * Uses the Docker CLI (not the Docker API) for simplicity.
124
- * The Docker socket is only accessed from the host process,
125
- * never from inside agent containers.
192
+ * Implementations use the runtime's CLI (not an engine API) for simplicity.
193
+ * The runtime is only invoked from the host process, never from inside
194
+ * agent containers.
126
195
  */
127
- export interface DockerManager {
128
- /** Check that Docker is available and the image exists. */
196
+ export interface ContainerRuntime {
197
+ /** True when this runtime can commit containers to images and manage snapshot images. */
198
+ readonly supportsImageSnapshots: boolean;
199
+ /** Check that the runtime is available and the image exists. */
129
200
  preflight(image: string): Promise<void>;
130
201
  /** Create a container with the given configuration. Returns container ID. */
131
202
  create(config: DockerContainerConfig): Promise<string>;
@@ -145,8 +216,10 @@ export interface DockerManager {
145
216
  * - `null`: skip the `--user` flag entirely. Required for non-agent
146
217
  * containers that have no `codespace` account (e.g. the
147
218
  * `bbernhard/signal-cli-rest-api` image).
219
+ * @param workdir - optional working directory passed via
220
+ * `docker exec --workdir <dir>`.
148
221
  */
149
- exec(nameOrId: string, command: readonly string[], timeoutMs?: number, execUser?: string | null): Promise<DockerExecResult>;
222
+ exec(nameOrId: string, command: readonly string[], timeoutMs?: number, execUser?: string | null, workdir?: string): Promise<DockerExecResult>;
150
223
  /** Stop a running container (SIGTERM, then SIGKILL after grace period). */
151
224
  stop(nameOrId: string): Promise<void>;
152
225
  /** Remove a container (must be stopped). */
@@ -155,18 +228,42 @@ export interface DockerManager {
155
228
  isRunning(nameOrId: string): Promise<boolean>;
156
229
  /** Check if a Docker image exists locally. */
157
230
  imageExists(image: string): Promise<boolean>;
231
+ /** Commit a container writable layer to an image and return its immutable sha256 image ID. */
232
+ commit(containerId: string, options?: DockerCommitOptions): Promise<string>;
233
+ /** Remove a Docker image by digest or tag. Returns true when a removal was attempted successfully. */
234
+ removeImage(ref: string): Promise<boolean>;
235
+ /** List local Docker images, optionally filtered by label. */
236
+ listImages(options?: {
237
+ readonly labelFilter?: string;
238
+ }): Promise<readonly DockerImageInfo[]>;
239
+ /** Inspect one local Docker image. Returns undefined when the image does not exist. */
240
+ inspectImage(ref: string): Promise<DockerImageInfo | undefined>;
158
241
  /** Build a Docker image from a Dockerfile. Optional labels are stamped on the image. */
159
242
  buildImage(tag: string, dockerfilePath: string, contextDir: string, labels?: Record<string, string>): Promise<void>;
160
243
  /** Read a label value from a Docker image. Returns undefined if image or label doesn't exist. */
161
244
  getImageLabel(image: string, label: string): Promise<string | undefined>;
245
+ /**
246
+ * Probe the version string of an agent binary baked into an image by running
247
+ * a throwaway, network-isolated container (`run --rm --network none
248
+ * --entrypoint <command[0]> <image> <command[1..]>`) and returning its trimmed
249
+ * stdout. Network isolation is required — the probe executes an agent binary
250
+ * that may attempt update-check/telemetry egress. Best-effort: returns
251
+ * undefined on any failure. Optional — runtimes that cannot cheaply run an
252
+ * ephemeral container may omit it, in which case callers skip version logging.
253
+ */
254
+ probeImageVersion?(image: string, command: readonly string[]): Promise<string | undefined>;
162
255
  /** Create a Docker network. No-op if it already exists. */
163
- createNetwork(name: string, options?: {
164
- internal?: boolean;
165
- subnet?: string;
166
- gateway?: string;
167
- }): Promise<void>;
256
+ createNetwork(name: string, options?: DockerNetworkCreateOptions): Promise<void>;
257
+ /** Enumerate Docker networks. Optional for non-Docker runtimes. */
258
+ listNetworks?(): Promise<readonly DockerNetworkInfo[]>;
259
+ /** Enumerate Docker containers, including stopped containers. Optional for non-Docker runtimes. */
260
+ listContainers?(options?: {
261
+ readonly labelFilter?: string;
262
+ }): Promise<readonly DockerContainerInfo[]>;
168
263
  /** Remove a Docker network. Ignores errors (e.g., already removed). */
169
264
  removeNetwork(name: string): Promise<void>;
265
+ /** Check whether a named network still exists. Optional for non-Docker runtimes. */
266
+ networkExists?(name: string): Promise<boolean>;
170
267
  /** Pull a Docker image from a registry. */
171
268
  pullImage(image: string): Promise<void>;
172
269
  /**
@@ -186,6 +283,13 @@ export interface DockerManager {
186
283
  getImageId(nameOrId: string): Promise<string | undefined>;
187
284
  /** Connect an existing container to a Docker network. */
188
285
  connectNetwork(networkName: string, containerId: string): Promise<void>;
286
+ /**
287
+ * Returns the host-side IPv4 gateway address of a network, or undefined
288
+ * if the network does not exist or has no gateway. Optional: only the
289
+ * tcp-hostonly topology consumes it (see network-topology.ts), and it
290
+ * falls back to deriving the gateway from the subnet when absent.
291
+ */
292
+ getNetworkGateway?(name: string): Promise<string | undefined>;
189
293
  /** Get a container's IP address on a specific network. */
190
294
  getContainerIp(containerId: string, network: string): Promise<string>;
191
295
  }
@@ -6,7 +6,8 @@
6
6
  * responsible for translating results into an exit code so unit tests
7
7
  * can call check functions directly without short-circuits.
8
8
  */
9
- import { type DockerAvailability } from '../session/preflight.js';
9
+ import { type DockerAvailability } from '../docker/docker-probe.js';
10
+ import { type ContainerRuntimeKind } from '../docker/container-runtime.js';
10
11
  import { type ExecFileFn } from '../docker/resource-limits.js';
11
12
  import type { AgentId } from '../docker/agent-adapter.js';
12
13
  import { loadGeneratedPolicy, findAnnotationServerDrift } from '../config/index.js';
@@ -29,19 +30,51 @@ export declare function checkSandbox(): Promise<CheckResult>;
29
30
  * be reused in contexts that don't care about preferred mode.
30
31
  */
31
32
  export declare function checkDocker(probe?: () => Promise<DockerAvailability>): Promise<CheckResult>;
33
+ /**
34
+ * Reports Apple `container` runtime status. `skip` on platforms where the
35
+ * backend is structurally unavailable (non-macOS, Intel, pre-macOS-26);
36
+ * `warn` when the platform qualifies but the CLI/services are not ready —
37
+ * `checkActiveRuntime` upgrades that to a fail when this backend is the
38
+ * one sessions will actually use.
39
+ */
40
+ export declare function checkAppleContainer(probe?: () => Promise<DockerAvailability>, hostPlatform?: string, hostArch?: string): Promise<CheckResult>;
41
+ /**
42
+ * Reports whether Rosetta is installed. Only meaningful when the Apple
43
+ * container backend is in play: its BuildKit builder VM requires Rosetta,
44
+ * so agent-image builds fail without it. Probed by running an x86_64
45
+ * binary under `arch` — exits 0 iff Rosetta can translate it.
46
+ */
47
+ export declare function checkRosetta(runX86?: () => boolean): CheckResult;
48
+ /** Output of checkActiveRuntime: the resolved backend plus its availability. */
49
+ export interface ActiveRuntime {
50
+ readonly result: CheckResult;
51
+ readonly kind: ContainerRuntimeKind;
52
+ /** Human label for messages ("Docker" / "Apple container"). */
53
+ readonly label: string;
54
+ /** The availability CheckResult of the backend sessions will use. */
55
+ readonly availability: CheckResult;
56
+ }
57
+ /**
58
+ * Resolves which container runtime sessions will use (env override >
59
+ * `containerRuntime` config > auto probe) and pairs it with the matching
60
+ * availability result from the Environment section, so downstream checks
61
+ * (preferred mode, resource limits) evaluate the backend that actually
62
+ * runs — not unconditionally Docker.
63
+ */
64
+ export declare function checkActiveRuntime(config: IronCurtainConfig, dockerResult: CheckResult, appleResult: CheckResult): Promise<ActiveRuntime>;
32
65
  /**
33
66
  * Reports whether the user's `preferredMode` is satisfiable on this host.
34
67
  *
35
68
  * Reuses the prior `dockerResult` from `checkDocker` so Docker is probed
36
- * exactly once per `doctor` run. Maps the (preferredMode × dockerResult ×
69
+ * exactly once per `doctor` run. Maps the (preferredMode × runtime availability ×
37
70
  * api-key-presence) tuple to a status:
38
71
  *
39
- * - preferredMode: 'docker' + Docker ok -> ok
40
- * - preferredMode: 'docker' + Docker unavailable -> fail (sessions will refuse to start)
72
+ * - preferredMode: 'container' + active runtime ok -> ok
73
+ * - preferredMode: 'container' + active runtime unavailable -> fail (sessions will refuse to start)
41
74
  * - preferredMode: 'builtin' + API key present -> ok
42
75
  * - preferredMode: 'builtin' + no API key -> warn (sessions will fail to start by default)
43
76
  */
44
- export declare function checkPreferredMode(config: IronCurtainConfig, dockerResult: CheckResult): CheckResult;
77
+ export declare function checkPreferredMode(config: IronCurtainConfig, dockerResult: CheckResult, runtimeLabel?: string): CheckResult;
45
78
  /**
46
79
  * Reports whether the user's Docker resource ceilings (after clamping)
47
80
  * are accepted by Docker. Two-step:
@@ -63,7 +96,7 @@ export interface CheckDockerResourcesDeps {
63
96
  readonly execFile?: ExecFileFn;
64
97
  readonly resolveImage?: (agentId: AgentId) => Promise<string>;
65
98
  }
66
- export declare function checkDockerResources(config: IronCurtainConfig, deps?: CheckDockerResourcesDeps): Promise<CheckResult>;
99
+ export declare function checkDockerResources(config: IronCurtainConfig, deps?: CheckDockerResourcesDeps, runtimeKind?: ContainerRuntimeKind): Promise<CheckResult>;
67
100
  export interface ConfigLoadOk {
68
101
  readonly result: CheckResult;
69
102
  readonly config: IronCurtainConfig;