@provos/ironcurtain 0.9.1 → 0.11.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 (502) hide show
  1. package/README.md +69 -10
  2. package/dist/auth/oauth-provider.js +1 -4
  3. package/dist/auth/oauth-provider.js.map +1 -1
  4. package/dist/cli.js +40 -2
  5. package/dist/cli.js.map +1 -1
  6. package/dist/config/config-command.js +174 -10
  7. package/dist/config/config-command.js.map +1 -1
  8. package/dist/config/first-start.js +61 -0
  9. package/dist/config/first-start.js.map +1 -1
  10. package/dist/config/generated/compiled-policy.json +528 -161
  11. package/dist/config/generated/test-scenarios.json +4810 -170
  12. package/dist/config/generated/tool-annotations.json +34 -47
  13. package/dist/config/index.d.ts +58 -0
  14. package/dist/config/index.js +97 -15
  15. package/dist/config/index.js.map +1 -1
  16. package/dist/config/mcp-servers.json +2 -2
  17. package/dist/config/model-provider.d.ts +8 -2
  18. package/dist/config/model-provider.js +52 -9
  19. package/dist/config/model-provider.js.map +1 -1
  20. package/dist/config/paths.d.ts +181 -0
  21. package/dist/config/paths.js +326 -23
  22. package/dist/config/paths.js.map +1 -1
  23. package/dist/config/types.d.ts +7 -1
  24. package/dist/config/user-config.d.ts +61 -4
  25. package/dist/config/user-config.js +108 -21
  26. package/dist/config/user-config.js.map +1 -1
  27. package/dist/config/validate-policy-dir.d.ts +10 -0
  28. package/dist/config/validate-policy-dir.js +59 -0
  29. package/dist/config/validate-policy-dir.js.map +1 -0
  30. package/dist/cron/compile-task-policy.js +1 -0
  31. package/dist/cron/compile-task-policy.js.map +1 -1
  32. package/dist/cron/job-commands.js +22 -2
  33. package/dist/cron/job-commands.js.map +1 -1
  34. package/dist/cron/types.d.ts +16 -2
  35. package/dist/cron/types.js +1 -3
  36. package/dist/cron/types.js.map +1 -1
  37. package/dist/daemon/daemon-command.js +16 -2
  38. package/dist/daemon/daemon-command.js.map +1 -1
  39. package/dist/daemon/ironcurtain-daemon.d.ts +44 -1
  40. package/dist/daemon/ironcurtain-daemon.js +210 -8
  41. package/dist/daemon/ironcurtain-daemon.js.map +1 -1
  42. package/dist/docker/adapters/claude-code.d.ts +2 -1
  43. package/dist/docker/adapters/claude-code.js +320 -131
  44. package/dist/docker/adapters/claude-code.js.map +1 -1
  45. package/dist/docker/adapters/goose.d.ts +12 -11
  46. package/dist/docker/adapters/goose.js +80 -27
  47. package/dist/docker/adapters/goose.js.map +1 -1
  48. package/dist/docker/agent-adapter.d.ts +178 -4
  49. package/dist/docker/agent-adapter.js +14 -0
  50. package/dist/docker/agent-adapter.js.map +1 -1
  51. package/dist/docker/agent-registry.js +3 -2
  52. package/dist/docker/agent-registry.js.map +1 -1
  53. package/dist/docker/code-mode-proxy.d.ts +27 -0
  54. package/dist/docker/code-mode-proxy.js +3 -0
  55. package/dist/docker/code-mode-proxy.js.map +1 -1
  56. package/dist/docker/container-lifecycle.d.ts +15 -0
  57. package/dist/docker/container-lifecycle.js +32 -0
  58. package/dist/docker/container-lifecycle.js.map +1 -0
  59. package/dist/docker/docker-agent-session.d.ts +113 -62
  60. package/dist/docker/docker-agent-session.js +241 -300
  61. package/dist/docker/docker-agent-session.js.map +1 -1
  62. package/dist/docker/docker-infrastructure.d.ts +256 -21
  63. package/dist/docker/docker-infrastructure.js +585 -30
  64. package/dist/docker/docker-infrastructure.js.map +1 -1
  65. package/dist/docker/docker-manager.d.ts +36 -1
  66. package/dist/docker/docker-manager.js +168 -26
  67. package/dist/docker/docker-manager.js.map +1 -1
  68. package/dist/docker/docker-progress-sink.d.ts +43 -0
  69. package/dist/docker/docker-progress-sink.js +299 -0
  70. package/dist/docker/docker-progress-sink.js.map +1 -0
  71. package/dist/docker/mitm-proxy.d.ts +90 -1
  72. package/dist/docker/mitm-proxy.js +720 -40
  73. package/dist/docker/mitm-proxy.js.map +1 -1
  74. package/dist/docker/oauth-credentials.d.ts +46 -3
  75. package/dist/docker/oauth-credentials.js +56 -14
  76. package/dist/docker/oauth-credentials.js.map +1 -1
  77. package/dist/docker/oauth-token-manager.js +2 -2
  78. package/dist/docker/oauth-token-manager.js.map +1 -1
  79. package/dist/docker/orientation.d.ts +1 -1
  80. package/dist/docker/provider-config.d.ts +81 -2
  81. package/dist/docker/provider-config.js +222 -28
  82. package/dist/docker/provider-config.js.map +1 -1
  83. package/dist/docker/proxy-tools.d.ts +0 -2
  84. package/dist/docker/proxy-tools.js +2 -7
  85. package/dist/docker/proxy-tools.js.map +1 -1
  86. package/dist/docker/pty-session.d.ts +49 -1
  87. package/dist/docker/pty-session.js +212 -90
  88. package/dist/docker/pty-session.js.map +1 -1
  89. package/dist/docker/pty-types.d.ts +0 -2
  90. package/dist/docker/pty-types.js +0 -2
  91. package/dist/docker/pty-types.js.map +1 -1
  92. package/dist/docker/resource-limits.d.ts +125 -0
  93. package/dist/docker/resource-limits.js +200 -0
  94. package/dist/docker/resource-limits.js.map +1 -0
  95. package/dist/docker/spawn-with-idle-timeout.d.ts +39 -0
  96. package/dist/docker/spawn-with-idle-timeout.js +152 -0
  97. package/dist/docker/spawn-with-idle-timeout.js.map +1 -0
  98. package/dist/docker/sse-extractor.d.ts +51 -0
  99. package/dist/docker/sse-extractor.js +303 -0
  100. package/dist/docker/sse-extractor.js.map +1 -0
  101. package/dist/docker/token-stream-bus.d.ts +83 -0
  102. package/dist/docker/token-stream-bus.js +98 -0
  103. package/dist/docker/token-stream-bus.js.map +1 -0
  104. package/dist/docker/token-stream-types.d.ts +71 -0
  105. package/dist/docker/token-stream-types.js +8 -0
  106. package/dist/docker/token-stream-types.js.map +1 -0
  107. package/dist/docker/types.d.ts +61 -6
  108. package/dist/doctor/checks.d.ts +138 -0
  109. package/dist/doctor/checks.js +511 -0
  110. package/dist/doctor/checks.js.map +1 -0
  111. package/dist/doctor/doctor-command.d.ts +29 -0
  112. package/dist/doctor/doctor-command.js +160 -0
  113. package/dist/doctor/doctor-command.js.map +1 -0
  114. package/dist/doctor/mcp-liveness.d.ts +28 -0
  115. package/dist/doctor/mcp-liveness.js +84 -0
  116. package/dist/doctor/mcp-liveness.js.map +1 -0
  117. package/dist/doctor/oauth-checks.d.ts +23 -0
  118. package/dist/doctor/oauth-checks.js +157 -0
  119. package/dist/doctor/oauth-checks.js.map +1 -0
  120. package/dist/doctor/output.d.ts +26 -0
  121. package/dist/doctor/output.js +82 -0
  122. package/dist/doctor/output.js.map +1 -0
  123. package/dist/escalation/listener-command.js +0 -3
  124. package/dist/escalation/listener-command.js.map +1 -1
  125. package/dist/event-bus/typed-event-bus.d.ts +26 -0
  126. package/dist/event-bus/typed-event-bus.js +35 -0
  127. package/dist/event-bus/typed-event-bus.js.map +1 -0
  128. package/dist/index.js +32 -9
  129. package/dist/index.js.map +1 -1
  130. package/dist/logger.js +31 -2
  131. package/dist/logger.js.map +1 -1
  132. package/dist/memory/auto-save.d.ts +18 -4
  133. package/dist/memory/auto-save.js +46 -6
  134. package/dist/memory/auto-save.js.map +1 -1
  135. package/dist/memory/memory-policy.d.ts +41 -0
  136. package/dist/memory/memory-policy.js +36 -0
  137. package/dist/memory/memory-policy.js.map +1 -0
  138. package/dist/mux/mux-app.d.ts +2 -0
  139. package/dist/mux/mux-app.js +30 -34
  140. package/dist/mux/mux-app.js.map +1 -1
  141. package/dist/mux/mux-command.d.ts +10 -1
  142. package/dist/mux/mux-command.js +62 -35
  143. package/dist/mux/mux-command.js.map +1 -1
  144. package/dist/mux/mux-renderer.js +22 -17
  145. package/dist/mux/mux-renderer.js.map +1 -1
  146. package/dist/mux/pty-bridge.d.ts +2 -0
  147. package/dist/mux/pty-bridge.js +3 -0
  148. package/dist/mux/pty-bridge.js.map +1 -1
  149. package/dist/mux/session-scanner.d.ts +7 -0
  150. package/dist/mux/session-scanner.js +21 -2
  151. package/dist/mux/session-scanner.js.map +1 -1
  152. package/dist/mux/types.d.ts +0 -4
  153. package/dist/mux/types.js.map +1 -1
  154. package/dist/{pipeline → observability}/llm-logger.d.ts +9 -3
  155. package/dist/{pipeline → observability}/llm-logger.js +16 -4
  156. package/dist/observability/llm-logger.js.map +1 -0
  157. package/dist/observe/observe-command.d.ts +12 -0
  158. package/dist/observe/observe-command.js +298 -0
  159. package/dist/observe/observe-command.js.map +1 -0
  160. package/dist/observe/observe-renderer.d.ts +24 -0
  161. package/dist/observe/observe-renderer.js +87 -0
  162. package/dist/observe/observe-renderer.js.map +1 -0
  163. package/dist/observe/observe-tui-rain.d.ts +42 -0
  164. package/dist/observe/observe-tui-rain.js +531 -0
  165. package/dist/observe/observe-tui-rain.js.map +1 -0
  166. package/dist/observe/observe-tui-text-panel.d.ts +46 -0
  167. package/dist/observe/observe-tui-text-panel.js +525 -0
  168. package/dist/observe/observe-tui-text-panel.js.map +1 -0
  169. package/dist/observe/observe-tui-types.d.ts +270 -0
  170. package/dist/observe/observe-tui-types.js +200 -0
  171. package/dist/observe/observe-tui-types.js.map +1 -0
  172. package/dist/observe/observe-tui-word-scorer.d.ts +143 -0
  173. package/dist/observe/observe-tui-word-scorer.js +572 -0
  174. package/dist/observe/observe-tui-word-scorer.js.map +1 -0
  175. package/dist/observe/observe-tui.d.ts +59 -0
  176. package/dist/observe/observe-tui.js +592 -0
  177. package/dist/observe/observe-tui.js.map +1 -0
  178. package/dist/persona/compile-persona-policy.js +1 -0
  179. package/dist/persona/compile-persona-policy.js.map +1 -1
  180. package/dist/persona/memory-gate.d.ts +19 -0
  181. package/dist/persona/memory-gate.js +33 -0
  182. package/dist/persona/memory-gate.js.map +1 -0
  183. package/dist/persona/persona-command.js +41 -6
  184. package/dist/persona/persona-command.js.map +1 -1
  185. package/dist/persona/resolve.d.ts +22 -0
  186. package/dist/persona/resolve.js +45 -2
  187. package/dist/persona/resolve.js.map +1 -1
  188. package/dist/persona/types.d.ts +16 -0
  189. package/dist/pipeline/annotate.d.ts +7 -1
  190. package/dist/pipeline/annotate.js +92 -2
  191. package/dist/pipeline/annotate.js.map +1 -1
  192. package/dist/pipeline/compile.js +2 -0
  193. package/dist/pipeline/compile.js.map +1 -1
  194. package/dist/pipeline/constitution-compiler.d.ts +25 -14
  195. package/dist/pipeline/constitution-compiler.js +107 -38
  196. package/dist/pipeline/constitution-compiler.js.map +1 -1
  197. package/dist/pipeline/dynamic-list-types.d.ts +3 -6
  198. package/dist/pipeline/dynamic-list-types.js +3 -16
  199. package/dist/pipeline/dynamic-list-types.js.map +1 -1
  200. package/dist/pipeline/parallel-progress.d.ts +59 -0
  201. package/dist/pipeline/parallel-progress.js +263 -0
  202. package/dist/pipeline/parallel-progress.js.map +1 -0
  203. package/dist/pipeline/pipeline-runner.d.ts +49 -8
  204. package/dist/pipeline/pipeline-runner.js +419 -231
  205. package/dist/pipeline/pipeline-runner.js.map +1 -1
  206. package/dist/pipeline/pipeline-shared.d.ts +59 -1
  207. package/dist/pipeline/pipeline-shared.js +127 -12
  208. package/dist/pipeline/pipeline-shared.js.map +1 -1
  209. package/dist/pipeline/policy-verifier.js +16 -3
  210. package/dist/pipeline/policy-verifier.js.map +1 -1
  211. package/dist/pipeline/proxy-mcp-connections.js +17 -2
  212. package/dist/pipeline/proxy-mcp-connections.js.map +1 -1
  213. package/dist/pipeline/scenario-generator.d.ts +4 -8
  214. package/dist/pipeline/scenario-generator.js +13 -46
  215. package/dist/pipeline/scenario-generator.js.map +1 -1
  216. package/dist/pipeline/server-prefilter.d.ts +31 -0
  217. package/dist/pipeline/server-prefilter.js +115 -0
  218. package/dist/pipeline/server-prefilter.js.map +1 -0
  219. package/dist/pipeline/types.d.ts +5 -0
  220. package/dist/sandbox/index.d.ts +14 -0
  221. package/dist/sandbox/index.js +335 -116
  222. package/dist/sandbox/index.js.map +1 -1
  223. package/dist/sandbox/ironcurtain-protocol.d.ts +52 -0
  224. package/dist/sandbox/ironcurtain-protocol.js +185 -0
  225. package/dist/sandbox/ironcurtain-protocol.js.map +1 -0
  226. package/dist/session/agent-session.d.ts +6 -0
  227. package/dist/session/agent-session.js +16 -5
  228. package/dist/session/agent-session.js.map +1 -1
  229. package/dist/session/cli-transport.js +0 -6
  230. package/dist/session/cli-transport.js.map +1 -1
  231. package/dist/session/index.d.ts +35 -14
  232. package/dist/session/index.js +324 -130
  233. package/dist/session/index.js.map +1 -1
  234. package/dist/session/preflight.d.ts +50 -13
  235. package/dist/session/preflight.js +252 -80
  236. package/dist/session/preflight.js.map +1 -1
  237. package/dist/session/prompts.d.ts +2 -5
  238. package/dist/session/prompts.js.map +1 -1
  239. package/dist/session/session-manager.d.ts +61 -6
  240. package/dist/session/session-manager.js +72 -10
  241. package/dist/session/session-manager.js.map +1 -1
  242. package/dist/session/session-metadata.d.ts +21 -5
  243. package/dist/session/session-metadata.js +34 -12
  244. package/dist/session/session-metadata.js.map +1 -1
  245. package/dist/session/types.d.ts +311 -5
  246. package/dist/session/types.js +57 -1
  247. package/dist/session/types.js.map +1 -1
  248. package/dist/signal/setup-signal.js +13 -21
  249. package/dist/signal/setup-signal.js.map +1 -1
  250. package/dist/signal/signal-bot-daemon.d.ts +16 -1
  251. package/dist/signal/signal-bot-daemon.js +39 -27
  252. package/dist/signal/signal-bot-daemon.js.map +1 -1
  253. package/dist/signal/signal-container.js +7 -1
  254. package/dist/signal/signal-container.js.map +1 -1
  255. package/dist/skills/discovery.d.ts +77 -0
  256. package/dist/skills/discovery.js +206 -0
  257. package/dist/skills/discovery.js.map +1 -0
  258. package/dist/skills/index.d.ts +4 -0
  259. package/dist/skills/index.js +3 -0
  260. package/dist/skills/index.js.map +1 -0
  261. package/dist/skills/staging.d.ts +28 -0
  262. package/dist/skills/staging.js +68 -0
  263. package/dist/skills/staging.js.map +1 -0
  264. package/dist/skills/types.d.ts +46 -0
  265. package/dist/skills/types.js +2 -0
  266. package/dist/skills/types.js.map +1 -0
  267. package/dist/trusted-process/approval-whitelist.d.ts +0 -2
  268. package/dist/trusted-process/approval-whitelist.js +17 -17
  269. package/dist/trusted-process/approval-whitelist.js.map +1 -1
  270. package/dist/trusted-process/async-mutex.d.ts +32 -0
  271. package/dist/trusted-process/async-mutex.js +50 -0
  272. package/dist/trusted-process/async-mutex.js.map +1 -0
  273. package/dist/trusted-process/audit-log.d.ts +38 -1
  274. package/dist/trusted-process/audit-log.js +82 -13
  275. package/dist/trusted-process/audit-log.js.map +1 -1
  276. package/dist/trusted-process/call-circuit-breaker.js +2 -1
  277. package/dist/trusted-process/call-circuit-breaker.js.map +1 -1
  278. package/dist/trusted-process/control-server.d.ts +101 -0
  279. package/dist/trusted-process/control-server.js +282 -0
  280. package/dist/trusted-process/control-server.js.map +1 -0
  281. package/dist/trusted-process/domain-utils.d.ts +6 -6
  282. package/dist/trusted-process/domain-utils.js +7 -23
  283. package/dist/trusted-process/domain-utils.js.map +1 -1
  284. package/dist/trusted-process/error-prefixes.d.ts +16 -0
  285. package/dist/trusted-process/error-prefixes.js +17 -0
  286. package/dist/trusted-process/error-prefixes.js.map +1 -0
  287. package/dist/trusted-process/index.d.ts +40 -23
  288. package/dist/trusted-process/index.js +131 -225
  289. package/dist/trusted-process/index.js.map +1 -1
  290. package/dist/trusted-process/list-matcher.d.ts +17 -0
  291. package/dist/trusted-process/list-matcher.js +31 -0
  292. package/dist/trusted-process/list-matcher.js.map +1 -0
  293. package/dist/trusted-process/mcp-client-manager.d.ts +35 -6
  294. package/dist/trusted-process/mcp-client-manager.js +40 -45
  295. package/dist/trusted-process/mcp-client-manager.js.map +1 -1
  296. package/dist/trusted-process/mcp-proxy-server.d.ts +31 -120
  297. package/dist/trusted-process/mcp-proxy-server.js +166 -657
  298. package/dist/trusted-process/mcp-proxy-server.js.map +1 -1
  299. package/dist/trusted-process/policy-engine.d.ts +16 -4
  300. package/dist/trusted-process/policy-engine.js +90 -45
  301. package/dist/trusted-process/policy-engine.js.map +1 -1
  302. package/dist/trusted-process/policy-roots.d.ts +6 -0
  303. package/dist/trusted-process/policy-roots.js +20 -0
  304. package/dist/trusted-process/policy-roots.js.map +1 -1
  305. package/dist/trusted-process/sandbox-integration.d.ts +12 -0
  306. package/dist/trusted-process/sandbox-integration.js +26 -0
  307. package/dist/trusted-process/sandbox-integration.js.map +1 -1
  308. package/dist/trusted-process/tool-call-coordinator.d.ts +269 -0
  309. package/dist/trusted-process/tool-call-coordinator.js +508 -0
  310. package/dist/trusted-process/tool-call-coordinator.js.map +1 -0
  311. package/dist/trusted-process/tool-call-pipeline.d.ts +205 -0
  312. package/dist/trusted-process/tool-call-pipeline.js +798 -0
  313. package/dist/trusted-process/tool-call-pipeline.js.map +1 -0
  314. package/dist/trusted-process/tool-description-hints.d.ts +1 -1
  315. package/dist/types/argument-roles.d.ts +1 -1
  316. package/dist/types/argument-roles.js +14 -1
  317. package/dist/types/argument-roles.js.map +1 -1
  318. package/dist/types/audit.d.ts +9 -0
  319. package/dist/{session → types}/errors.d.ts +8 -2
  320. package/dist/{session → types}/errors.js +8 -2
  321. package/dist/types/errors.js.map +1 -0
  322. package/dist/types/reserved-servers.d.ts +11 -0
  323. package/dist/types/reserved-servers.js +12 -0
  324. package/dist/types/reserved-servers.js.map +1 -0
  325. package/dist/types/server-listing.d.ts +14 -0
  326. package/dist/types/server-listing.js +2 -0
  327. package/dist/types/server-listing.js.map +1 -0
  328. package/dist/types/slug.d.ts +2 -0
  329. package/dist/types/slug.js +2 -0
  330. package/dist/types/slug.js.map +1 -1
  331. package/dist/types/url-normalize.d.ts +16 -0
  332. package/dist/types/url-normalize.js +33 -0
  333. package/dist/types/url-normalize.js.map +1 -0
  334. package/dist/utils/error-message.d.ts +8 -0
  335. package/dist/utils/error-message.js +11 -0
  336. package/dist/utils/error-message.js.map +1 -0
  337. package/dist/utils/exec-error.d.ts +19 -0
  338. package/dist/utils/exec-error.js +16 -0
  339. package/dist/utils/exec-error.js.map +1 -0
  340. package/dist/utils/is-plain-object.d.ts +7 -0
  341. package/dist/utils/is-plain-object.js +12 -0
  342. package/dist/utils/is-plain-object.js.map +1 -0
  343. package/dist/utils/preflight-checks.d.ts +16 -0
  344. package/dist/utils/preflight-checks.js +178 -0
  345. package/dist/utils/preflight-checks.js.map +1 -0
  346. package/dist/web-ui/__tests__/json-rpc-dispatch.test.d.ts +7 -0
  347. package/dist/web-ui/__tests__/json-rpc-dispatch.test.js +725 -0
  348. package/dist/web-ui/__tests__/json-rpc-dispatch.test.js.map +1 -0
  349. package/dist/web-ui/dispatch/escalation-dispatch.d.ts +7 -0
  350. package/dist/web-ui/dispatch/escalation-dispatch.js +52 -0
  351. package/dist/web-ui/dispatch/escalation-dispatch.js.map +1 -0
  352. package/dist/web-ui/dispatch/job-dispatch.d.ts +8 -0
  353. package/dist/web-ui/dispatch/job-dispatch.js +83 -0
  354. package/dist/web-ui/dispatch/job-dispatch.js.map +1 -0
  355. package/dist/web-ui/dispatch/persona-dispatch.d.ts +6 -0
  356. package/dist/web-ui/dispatch/persona-dispatch.js +116 -0
  357. package/dist/web-ui/dispatch/persona-dispatch.js.map +1 -0
  358. package/dist/web-ui/dispatch/session-dispatch.d.ts +9 -0
  359. package/dist/web-ui/dispatch/session-dispatch.js +201 -0
  360. package/dist/web-ui/dispatch/session-dispatch.js.map +1 -0
  361. package/dist/web-ui/dispatch/token-stream-dispatch.d.ts +15 -0
  362. package/dist/web-ui/dispatch/token-stream-dispatch.js +55 -0
  363. package/dist/web-ui/dispatch/token-stream-dispatch.js.map +1 -0
  364. package/dist/web-ui/dispatch/types.d.ts +31 -0
  365. package/dist/web-ui/dispatch/types.js +68 -0
  366. package/dist/web-ui/dispatch/types.js.map +1 -0
  367. package/dist/web-ui/dispatch/workflow-dispatch.d.ts +103 -0
  368. package/dist/web-ui/dispatch/workflow-dispatch.js +925 -0
  369. package/dist/web-ui/dispatch/workflow-dispatch.js.map +1 -0
  370. package/dist/web-ui/json-rpc-dispatch.d.ts +12 -0
  371. package/dist/web-ui/json-rpc-dispatch.js +34 -0
  372. package/dist/web-ui/json-rpc-dispatch.js.map +1 -0
  373. package/dist/web-ui/state-graph.d.ts +13 -0
  374. package/dist/web-ui/state-graph.js +82 -0
  375. package/dist/web-ui/state-graph.js.map +1 -0
  376. package/dist/web-ui/token-stream-bridge.d.ts +76 -0
  377. package/dist/web-ui/token-stream-bridge.js +265 -0
  378. package/dist/web-ui/token-stream-bridge.js.map +1 -0
  379. package/dist/web-ui/web-event-bus.d.ts +152 -0
  380. package/dist/web-ui/web-event-bus.js +19 -0
  381. package/dist/web-ui/web-event-bus.js.map +1 -0
  382. package/dist/web-ui/web-session-transport.d.ts +31 -0
  383. package/dist/web-ui/web-session-transport.js +109 -0
  384. package/dist/web-ui/web-session-transport.js.map +1 -0
  385. package/dist/web-ui/web-ui-server.d.ts +76 -0
  386. package/dist/web-ui/web-ui-server.js +461 -0
  387. package/dist/web-ui/web-ui-server.js.map +1 -0
  388. package/dist/web-ui/web-ui-types.d.ts +290 -0
  389. package/dist/web-ui/web-ui-types.js +32 -0
  390. package/dist/web-ui/web-ui-types.js.map +1 -0
  391. package/dist/web-ui/ws-utils.d.ts +5 -0
  392. package/dist/web-ui/ws-utils.js +12 -0
  393. package/dist/web-ui/ws-utils.js.map +1 -0
  394. package/dist/web-ui-static/assets/index-BFO5z1js.js +76 -0
  395. package/dist/web-ui-static/assets/index-CCUwrkIL.css +1 -0
  396. package/dist/web-ui-static/assets/orbitron-latin-700-normal-4jsRXGGJ.woff2 +0 -0
  397. package/dist/web-ui-static/assets/orbitron-latin-700-normal-DmYOh-W9.woff +0 -0
  398. package/dist/web-ui-static/index.html +14 -0
  399. package/dist/workflow/artifacts.d.ts +59 -0
  400. package/dist/workflow/artifacts.js +188 -0
  401. package/dist/workflow/artifacts.js.map +1 -0
  402. package/dist/workflow/checkpoint-selection.d.ts +34 -0
  403. package/dist/workflow/checkpoint-selection.js +48 -0
  404. package/dist/workflow/checkpoint-selection.js.map +1 -0
  405. package/dist/workflow/checkpoint.d.ts +35 -0
  406. package/dist/workflow/checkpoint.js +84 -0
  407. package/dist/workflow/checkpoint.js.map +1 -0
  408. package/dist/workflow/cli-support.d.ts +92 -0
  409. package/dist/workflow/cli-support.js +423 -0
  410. package/dist/workflow/cli-support.js.map +1 -0
  411. package/dist/workflow/definition-loader.d.ts +32 -0
  412. package/dist/workflow/definition-loader.js +56 -0
  413. package/dist/workflow/definition-loader.js.map +1 -0
  414. package/dist/workflow/discovery.d.ts +78 -0
  415. package/dist/workflow/discovery.js +203 -0
  416. package/dist/workflow/discovery.js.map +1 -0
  417. package/dist/workflow/errors.d.ts +66 -0
  418. package/dist/workflow/errors.js +49 -0
  419. package/dist/workflow/errors.js.map +1 -0
  420. package/dist/workflow/guards.d.ts +8 -0
  421. package/dist/workflow/guards.js +38 -0
  422. package/dist/workflow/guards.js.map +1 -0
  423. package/dist/workflow/lint-integration.d.ts +64 -0
  424. package/dist/workflow/lint-integration.js +56 -0
  425. package/dist/workflow/lint-integration.js.map +1 -0
  426. package/dist/workflow/lint.d.ts +66 -0
  427. package/dist/workflow/lint.js +410 -0
  428. package/dist/workflow/lint.js.map +1 -0
  429. package/dist/workflow/machine-builder.d.ts +90 -0
  430. package/dist/workflow/machine-builder.js +485 -0
  431. package/dist/workflow/machine-builder.js.map +1 -0
  432. package/dist/workflow/message-log.d.ts +85 -0
  433. package/dist/workflow/message-log.js +40 -0
  434. package/dist/workflow/message-log.js.map +1 -0
  435. package/dist/workflow/orchestrator.d.ts +450 -0
  436. package/dist/workflow/orchestrator.js +1941 -0
  437. package/dist/workflow/orchestrator.js.map +1 -0
  438. package/dist/workflow/prompt-builder.d.ts +39 -0
  439. package/dist/workflow/prompt-builder.js +242 -0
  440. package/dist/workflow/prompt-builder.js.map +1 -0
  441. package/dist/workflow/run-state-command.d.ts +9 -0
  442. package/dist/workflow/run-state-command.js +414 -0
  443. package/dist/workflow/run-state-command.js.map +1 -0
  444. package/dist/workflow/run-state-debug-capture.d.ts +40 -0
  445. package/dist/workflow/run-state-debug-capture.js +101 -0
  446. package/dist/workflow/run-state-debug-capture.js.map +1 -0
  447. package/dist/workflow/status-parser.d.ts +68 -0
  448. package/dist/workflow/status-parser.js +259 -0
  449. package/dist/workflow/status-parser.js.map +1 -0
  450. package/dist/workflow/types.d.ts +498 -0
  451. package/dist/workflow/types.js +83 -0
  452. package/dist/workflow/types.js.map +1 -0
  453. package/dist/workflow/validate.d.ts +58 -0
  454. package/dist/workflow/validate.js +499 -0
  455. package/dist/workflow/validate.js.map +1 -0
  456. package/dist/workflow/workflow-command.d.ts +26 -0
  457. package/dist/workflow/workflow-command.js +648 -0
  458. package/dist/workflow/workflow-command.js.map +1 -0
  459. package/dist/workflow/workflow-discovery.d.ts +25 -0
  460. package/dist/workflow/workflow-discovery.js +100 -0
  461. package/dist/workflow/workflow-discovery.js.map +1 -0
  462. package/dist/workflow/workflow-manager.d.ts +122 -0
  463. package/dist/workflow/workflow-manager.js +308 -0
  464. package/dist/workflow/workflow-manager.js.map +1 -0
  465. package/dist/workflow/workflows/design-and-code/workflow.yaml +169 -0
  466. package/dist/workflow/workflows/test-email-summary/skills/email-formatting/SKILL.md +55 -0
  467. package/dist/workflow/workflows/test-email-summary/skills/gmail-query-syntax/SKILL.md +63 -0
  468. package/dist/workflow/workflows/test-email-summary/skills/json-schema-emails/SKILL.md +41 -0
  469. package/dist/workflow/workflows/test-email-summary/skills/json-schema-emails/schema.json +34 -0
  470. package/dist/workflow/workflows/test-email-summary/skills/summary-style-guide/SKILL.md +51 -0
  471. package/dist/workflow/workflows/test-email-summary/workflow.yaml +89 -0
  472. package/dist/workflow/workflows/vuln-discovery/skills/harness-design-fuzzing/SKILL.md +201 -0
  473. package/dist/workflow/workflows/vuln-discovery/skills/memory-safety-c-cpp/SKILL.md +166 -0
  474. package/dist/workflow/workflows/vuln-discovery/skills/vulnerability-triage/SKILL.md +185 -0
  475. package/dist/workflow/workflows/vuln-discovery/workflow.yaml +920 -0
  476. package/dist/workflow/worktree.d.ts +43 -0
  477. package/dist/workflow/worktree.js +106 -0
  478. package/dist/workflow/worktree.js.map +1 -0
  479. package/docker/Dockerfile.base +12 -1
  480. package/docker/Dockerfile.base.arm64 +17 -1
  481. package/docker/entrypoint-claude-code.sh +46 -0
  482. package/docker/entrypoint-goose.sh +25 -0
  483. package/package.json +22 -8
  484. package/packages/web-ui/README.md +113 -0
  485. package/packages/web-ui/docs/workflow-state-machine.png +0 -0
  486. package/src/config/generated/compiled-policy.json +528 -161
  487. package/src/config/generated/test-scenarios.json +4810 -170
  488. package/src/config/generated/tool-annotations.json +34 -47
  489. package/src/config/mcp-servers.json +2 -2
  490. package/src/workflow/workflows/design-and-code/workflow.yaml +169 -0
  491. package/src/workflow/workflows/test-email-summary/skills/email-formatting/SKILL.md +55 -0
  492. package/src/workflow/workflows/test-email-summary/skills/gmail-query-syntax/SKILL.md +63 -0
  493. package/src/workflow/workflows/test-email-summary/skills/json-schema-emails/SKILL.md +41 -0
  494. package/src/workflow/workflows/test-email-summary/skills/json-schema-emails/schema.json +34 -0
  495. package/src/workflow/workflows/test-email-summary/skills/summary-style-guide/SKILL.md +51 -0
  496. package/src/workflow/workflows/test-email-summary/workflow.yaml +89 -0
  497. package/src/workflow/workflows/vuln-discovery/skills/harness-design-fuzzing/SKILL.md +201 -0
  498. package/src/workflow/workflows/vuln-discovery/skills/memory-safety-c-cpp/SKILL.md +166 -0
  499. package/src/workflow/workflows/vuln-discovery/skills/vulnerability-triage/SKILL.md +185 -0
  500. package/src/workflow/workflows/vuln-discovery/workflow.yaml +920 -0
  501. package/dist/pipeline/llm-logger.js.map +0 -1
  502. package/dist/session/errors.js.map +0 -1
@@ -0,0 +1,410 @@
1
+ /**
2
+ * Workflow semantic linter. Receives a `WorkflowDefinition` that has
3
+ * already passed `validateDefinition()` and returns `Diagnostic`s for
4
+ * higher-level smells (cross-cutting or requiring external context)
5
+ * that structural validation deliberately leaves alone.
6
+ *
7
+ * See `docs/designs/workflow-semantic-linter-v2.md` for each check's
8
+ * rationale.
9
+ */
10
+ import { resolve } from 'node:path';
11
+ import { GLOBAL_PERSONA } from './types.js';
12
+ import { findReachableStates, iterateSkillRefIssues, parseArtifactRef } from './validate.js';
13
+ import { getWorkflowPackageDir } from './discovery.js';
14
+ import { ACTIONABLE_DISCOVERY_REASONS, discoverSkillsWithErrors } from '../skills/discovery.js';
15
+ // ---------------------------------------------------------------------------
16
+ // Entry point
17
+ // ---------------------------------------------------------------------------
18
+ /**
19
+ * Runs all registered checks against `def`. Pure: same input => same
20
+ * output. Diagnostics come back in stable order (WF001 first, WF007 last).
21
+ */
22
+ export function lintWorkflow(def, ctx) {
23
+ const reachable = findReachableStates(def.initial, def.states);
24
+ const reachableAgentOutputs = collectReachableAgentOutputs(def, reachable);
25
+ return [
26
+ ...checkUnreachableTerminal(def, reachable),
27
+ ...checkUnversionedArtifacts(def, reachableAgentOutputs),
28
+ ...checkTerminalOutputs(def, reachable, reachableAgentOutputs),
29
+ ...checkHumanGatePresent(def, reachable, reachableAgentOutputs),
30
+ ...checkMaxRoundsHasGuard(def),
31
+ ...checkPersonaExists(def, ctx),
32
+ ...checkVisitCapTransitionOrder(def),
33
+ ...checkSkillReferencesAndManifests(def, ctx),
34
+ ];
35
+ }
36
+ export function countBySeverity(diagnostics) {
37
+ let errors = 0;
38
+ let warnings = 0;
39
+ for (const d of diagnostics) {
40
+ if (d.severity === 'error')
41
+ errors++;
42
+ else
43
+ warnings++;
44
+ }
45
+ return { errors, warnings };
46
+ }
47
+ // ---------------------------------------------------------------------------
48
+ // Shared helpers
49
+ // ---------------------------------------------------------------------------
50
+ /**
51
+ * Output artifacts produced by reachable agent states. Terminal
52
+ * `outputs:` are declarations of expected arrival state, not production
53
+ * (no runtime code writes them), so they don't count: WF002/WF003/WF004
54
+ * all ask "is this name actually produced?"
55
+ */
56
+ function collectReachableAgentOutputs(def, reachable) {
57
+ const outputs = new Set();
58
+ for (const [stateId, state] of Object.entries(def.states)) {
59
+ if (!reachable.has(stateId))
60
+ continue;
61
+ if (state.type === 'agent') {
62
+ for (const o of state.outputs)
63
+ outputs.add(o);
64
+ }
65
+ }
66
+ return outputs;
67
+ }
68
+ function isAgentState(state) {
69
+ return state.type === 'agent';
70
+ }
71
+ // ---------------------------------------------------------------------------
72
+ // WF001 — State can't reach any terminal
73
+ // ---------------------------------------------------------------------------
74
+ function checkUnreachableTerminal(def, reachable) {
75
+ const diagnostics = [];
76
+ for (const stateId of reachable) {
77
+ const state = def.states[stateId];
78
+ if (state.type === 'terminal')
79
+ continue;
80
+ const cone = findReachableStates(stateId, def.states);
81
+ let touchesTerminal = false;
82
+ for (const target of cone) {
83
+ if (def.states[target].type === 'terminal') {
84
+ touchesTerminal = true;
85
+ break;
86
+ }
87
+ }
88
+ if (!touchesTerminal) {
89
+ diagnostics.push({
90
+ code: 'WF001',
91
+ severity: 'error',
92
+ stateId,
93
+ message: `State "${stateId}" cannot reach any terminal state — the workflow will loop forever if it enters this state.`,
94
+ hint: 'Add a transition (guarded or unconditional) whose forward graph eventually reaches a terminal state.',
95
+ });
96
+ }
97
+ }
98
+ return diagnostics;
99
+ }
100
+ // ---------------------------------------------------------------------------
101
+ // WF002 — unversionedArtifacts entry not produced by any state
102
+ // ---------------------------------------------------------------------------
103
+ function checkUnversionedArtifacts(def, produced) {
104
+ const entries = def.settings?.unversionedArtifacts ?? [];
105
+ if (entries.length === 0)
106
+ return [];
107
+ const diagnostics = [];
108
+ for (const name of entries) {
109
+ if (!produced.has(name)) {
110
+ diagnostics.push({
111
+ code: 'WF002',
112
+ severity: 'warning',
113
+ message: `settings.unversionedArtifacts entry "${name}" is not produced by any state — it will be silently versioned.`,
114
+ hint: "Remove the entry, or add the artifact to some agent state's outputs list.",
115
+ });
116
+ }
117
+ }
118
+ return diagnostics;
119
+ }
120
+ // ---------------------------------------------------------------------------
121
+ // WF003 — terminal.outputs entry not produced by any reachable state
122
+ // ---------------------------------------------------------------------------
123
+ function checkTerminalOutputs(def, reachable, produced) {
124
+ const diagnostics = [];
125
+ for (const [stateId, state] of Object.entries(def.states)) {
126
+ if (state.type !== 'terminal')
127
+ continue;
128
+ if (!reachable.has(stateId))
129
+ continue;
130
+ for (const name of state.outputs ?? []) {
131
+ if (!produced.has(name)) {
132
+ diagnostics.push({
133
+ code: 'WF003',
134
+ severity: 'warning',
135
+ stateId,
136
+ message: `Terminal "${stateId}" lists output "${name}" which is not produced by any reachable state.`,
137
+ hint: 'Remove the output from the terminal, or ensure a reachable agent state produces it.',
138
+ });
139
+ }
140
+ }
141
+ }
142
+ return diagnostics;
143
+ }
144
+ // ---------------------------------------------------------------------------
145
+ // WF004 — human_gate present entry not produced by any reachable state
146
+ // ---------------------------------------------------------------------------
147
+ function checkHumanGatePresent(def, reachable, produced) {
148
+ const diagnostics = [];
149
+ for (const [stateId, state] of Object.entries(def.states)) {
150
+ if (state.type !== 'human_gate')
151
+ continue;
152
+ if (!reachable.has(stateId))
153
+ continue;
154
+ for (const entry of state.present ?? []) {
155
+ const { name } = parseArtifactRef(entry);
156
+ if (!produced.has(name)) {
157
+ diagnostics.push({
158
+ code: 'WF004',
159
+ severity: 'error',
160
+ stateId,
161
+ message: `Human gate "${stateId}" presents artifact "${name}" which is not produced by any reachable state — the human will approve without seeing it.`,
162
+ hint: 'Fix the artifact name, or ensure a reachable agent state produces it.',
163
+ });
164
+ }
165
+ }
166
+ }
167
+ return diagnostics;
168
+ }
169
+ // ---------------------------------------------------------------------------
170
+ // WF006 — maxRounds set without any isRoundLimitReached guard
171
+ // ---------------------------------------------------------------------------
172
+ const ROUND_LIMIT_GUARD = 'isRoundLimitReached';
173
+ function checkMaxRoundsHasGuard(def) {
174
+ if (def.settings?.maxRounds === undefined)
175
+ return [];
176
+ for (const state of Object.values(def.states)) {
177
+ if (state.type !== 'agent' && state.type !== 'deterministic')
178
+ continue;
179
+ for (const t of state.transitions) {
180
+ if (t.guard === ROUND_LIMIT_GUARD)
181
+ return [];
182
+ }
183
+ }
184
+ return [
185
+ {
186
+ code: 'WF006',
187
+ severity: 'warning',
188
+ message: `settings.maxRounds=${def.settings.maxRounds} is set but no transition uses the "isRoundLimitReached" guard — the limit is silently ignored.`,
189
+ hint: 'Add a transition with guard: isRoundLimitReached to an iterative state, or remove maxRounds.',
190
+ },
191
+ ];
192
+ }
193
+ // ---------------------------------------------------------------------------
194
+ // WF007 — agent persona not installed
195
+ // ---------------------------------------------------------------------------
196
+ /**
197
+ * Flags any agent state whose `persona` is neither the reserved
198
+ * `GLOBAL_PERSONA` alias nor an installed persona directory.
199
+ *
200
+ * Emitted as a warning (not error) because personas are user-local state:
201
+ * a workflow author may legitimately ship a definition that depends on
202
+ * a persona the user hasn't installed yet. `--strict-lint` promotes this
203
+ * to a failure.
204
+ */
205
+ function checkPersonaExists(def, ctx) {
206
+ const diagnostics = [];
207
+ for (const [stateId, state] of Object.entries(def.states)) {
208
+ if (!isAgentState(state))
209
+ continue;
210
+ const persona = state.persona;
211
+ if (persona === GLOBAL_PERSONA)
212
+ continue;
213
+ if (ctx.personaExists(persona))
214
+ continue;
215
+ diagnostics.push({
216
+ code: 'WF007',
217
+ severity: 'warning',
218
+ stateId,
219
+ message: `Agent state "${stateId}" references persona "${persona}" which is not installed locally — session creation will fail at runtime.`,
220
+ hint: `Install the persona with: ironcurtain persona create ${persona}, or change the state's persona to "${GLOBAL_PERSONA}".`,
221
+ });
222
+ }
223
+ return diagnostics;
224
+ }
225
+ // ---------------------------------------------------------------------------
226
+ // WF008 — visit-cap guard must precede loop-continuing transitions
227
+ // ---------------------------------------------------------------------------
228
+ /**
229
+ * Verdict values that indicate an approval-style exit from a bounded loop.
230
+ * Transitions taken on these verdicts represent the success path out of the
231
+ * loop, so a visit-cap guard is legitimately ordered AFTER them (on the cap
232
+ * visit, if the agent still emits `approved`, we take the approval exit
233
+ * rather than escalating).
234
+ *
235
+ * Any other `when` verdict (rejected, rejected_build, blocked, or any
236
+ * workflow-specific loop-continuation verdict) must NOT precede the cap
237
+ * guard: if it did, the cap would never fire and the loop is effectively
238
+ * unbounded except for the workflow-wide `maxRounds`.
239
+ */
240
+ const VISIT_CAP_GUARD = 'isStateVisitLimitReached';
241
+ const APPROVAL_EXIT_VERDICTS = new Set(['approved', 'complete', 'done', 'success', 'passed']);
242
+ /**
243
+ * Returns true if `t.when` represents an approval-style exit. Approval
244
+ * exits are allowed to precede the visit-cap guard. Everything else is
245
+ * considered loop-continuing for the purposes of WF008 — including:
246
+ * - no `when` clause at all (always matches)
247
+ * - empty `when: {}` (always matches; flagged separately by validation)
248
+ * - a verdict not in the approval allowlist
249
+ * - a `when` clause that sets fields other than `verdict` (future-
250
+ * proofing: those match something other than the approval verdict)
251
+ */
252
+ function isApprovalExitTransition(t) {
253
+ if (!t.when)
254
+ return false;
255
+ const keys = Object.keys(t.when);
256
+ if (keys.length === 0)
257
+ return false;
258
+ if (keys.length !== 1 || keys[0] !== 'verdict')
259
+ return false;
260
+ const verdict = t.when.verdict;
261
+ return typeof verdict === 'string' && APPROVAL_EXIT_VERDICTS.has(verdict);
262
+ }
263
+ function checkVisitCapTransitionOrder(def) {
264
+ const diagnostics = [];
265
+ for (const [stateId, state] of Object.entries(def.states)) {
266
+ if (!isAgentState(state))
267
+ continue;
268
+ if (state.maxVisits === undefined)
269
+ continue;
270
+ const transitions = state.transitions;
271
+ const capIndex = transitions.findIndex((t) => t.guard === VISIT_CAP_GUARD);
272
+ if (capIndex === -1)
273
+ continue;
274
+ // Find the first loop-continuing transition that precedes the cap.
275
+ for (let i = 0; i < capIndex; i++) {
276
+ const t = transitions[i];
277
+ if (isApprovalExitTransition(t))
278
+ continue;
279
+ // `t` is either unconditional, a non-approval `when`, or a different
280
+ // guard — all of which can match before the cap guard is evaluated.
281
+ const descriptor = describeTransition(t);
282
+ diagnostics.push({
283
+ code: 'WF008',
284
+ severity: 'error',
285
+ stateId,
286
+ message: `State "${stateId}" has maxVisits=${state.maxVisits} with an "${VISIT_CAP_GUARD}" ` +
287
+ `transition at position ${capIndex + 1}, but a loop-continuing transition (${descriptor}) ` +
288
+ `at position ${i + 1} will match first on every iteration, so the visit cap is never ` +
289
+ `reached and the loop is effectively unbounded except by settings.maxRounds.`,
290
+ hint: `Move the "${VISIT_CAP_GUARD}" transition above any non-approval "when" clause ` +
291
+ `(only ${Array.from(APPROVAL_EXIT_VERDICTS).join('/')} verdicts may precede the cap).`,
292
+ });
293
+ // One diagnostic per state is sufficient; multiple preceding loop-
294
+ // continuing transitions all share the same fix.
295
+ break;
296
+ }
297
+ }
298
+ return diagnostics;
299
+ }
300
+ function describeTransition(t) {
301
+ if (t.guard)
302
+ return `guard: ${t.guard} -> ${t.to}`;
303
+ if (t.when) {
304
+ const parts = Object.entries(t.when).map(([k, v]) => `${k}: ${JSON.stringify(v)}`);
305
+ return `when { ${parts.join(', ')} } -> ${t.to}`;
306
+ }
307
+ return `unconditional -> ${t.to}`;
308
+ }
309
+ // ---------------------------------------------------------------------------
310
+ // WF010 — skill references and skill-manifest integrity
311
+ // ---------------------------------------------------------------------------
312
+ /**
313
+ * Entry point for WF010. Skips cleanly when `ctx.workflowFilePath` is
314
+ * absent (in-memory definitions have no package dir to scan).
315
+ * `checkSkillManifests` runs independently of any state reference so
316
+ * a typo'd frontmatter — which would silently disappear from
317
+ * discovery — still surfaces.
318
+ */
319
+ function checkSkillReferencesAndManifests(def, ctx) {
320
+ if (!ctx.workflowFilePath)
321
+ return [];
322
+ const skillsRoot = resolve(getWorkflowPackageDir(ctx.workflowFilePath), 'skills');
323
+ const { skills, errors } = discoverSkillsWithErrors(skillsRoot, 'workflow');
324
+ return [...checkSkillManifests(errors), ...checkSkillReferences(def, skills, skillsRoot)];
325
+ }
326
+ function checkSkillManifests(errors) {
327
+ const diagnostics = [];
328
+ for (const err of errors) {
329
+ if (!ACTIONABLE_DISCOVERY_REASONS.has(err.reason))
330
+ continue;
331
+ diagnostics.push({
332
+ code: 'WF010',
333
+ severity: 'error',
334
+ ...buildSkillManifestDiagnostic(err),
335
+ });
336
+ }
337
+ return diagnostics;
338
+ }
339
+ function buildSkillManifestDiagnostic(err) {
340
+ const detail = err.detail ?? err.reason;
341
+ // Switch is exhaustive over `SkillDiscoveryErrorReason`. No `default`:
342
+ // a new union member must add a case here or TypeScript will flag the
343
+ // missing return-type coverage at compile time.
344
+ switch (err.reason) {
345
+ case 'malformed-frontmatter':
346
+ return {
347
+ message: `Malformed SKILL.md frontmatter at ${err.skillDir}: ${detail}.`,
348
+ hint: 'Fix the YAML frontmatter (the block fenced by `---` lines at the top of SKILL.md).',
349
+ };
350
+ case 'missing-required-fields':
351
+ return {
352
+ message: `SKILL.md at ${err.skillDir} is missing required frontmatter fields: ${detail}.`,
353
+ hint: 'SKILL.md frontmatter must declare both `name:` and `description:` as strings.',
354
+ };
355
+ case 'unreadable':
356
+ return {
357
+ message: `Unreadable SKILL.md at ${err.skillDir}: ${detail}.`,
358
+ hint: 'Check filesystem permissions or whether the path is a directory.',
359
+ };
360
+ case 'missing-manifest':
361
+ return {
362
+ message: `Missing SKILL.md at ${err.skillDir}: ${detail}.`,
363
+ hint: 'Create a SKILL.md file with a `---`-fenced YAML frontmatter declaring `name:` and `description:`.',
364
+ };
365
+ case 'duplicate-name':
366
+ return {
367
+ message: `Duplicate skill at ${err.skillDir}: ${detail}.`,
368
+ hint: 'Two skill directories under the same skills root cannot share the same frontmatter `name:`. Rename one in its SKILL.md frontmatter.',
369
+ };
370
+ }
371
+ }
372
+ /**
373
+ * Walks every agent state's `skills?: string[]` and emits one
374
+ * diagnostic per offending entry — either an invalid name (rejected by
375
+ * `validateSkillName`) or a name that does not match any discovered
376
+ * skill's frontmatter `name:` under `<packageDir>/skills/`. The
377
+ * frontmatter name is the user-facing identifier (matched by
378
+ * `workflowSkillFilter` in `src/skills/discovery.ts`), not the
379
+ * directory name. The orchestrator's `validateWorkflowSkillReferences`
380
+ * throws for the same conditions at start; surfacing them at lint time
381
+ * gives authors fast feedback before they hit runtime.
382
+ */
383
+ function checkSkillReferences(def, discovered, skillsRoot) {
384
+ const discoveredNames = new Set(discovered.map((s) => s.name));
385
+ const available = [...discoveredNames].sort();
386
+ const availableHint = available.length > 0 ? available.join(', ') : '(none)';
387
+ const diagnostics = [];
388
+ for (const issue of iterateSkillRefIssues(def, discoveredNames)) {
389
+ if (issue.kind === 'invalid-name') {
390
+ diagnostics.push({
391
+ code: 'WF010',
392
+ severity: 'error',
393
+ stateId: issue.stateId,
394
+ message: `Invalid skill name "${issue.name}" in state "${issue.stateId}": ${issue.detail}.`,
395
+ hint: 'Skill names must be a single non-empty path segment with no separators or "."/"..".',
396
+ });
397
+ }
398
+ else {
399
+ diagnostics.push({
400
+ code: 'WF010',
401
+ severity: 'error',
402
+ stateId: issue.stateId,
403
+ message: `State "${issue.stateId}" references skill "${issue.name}" but no skill with that frontmatter name was found under ${skillsRoot}. Available: ${availableHint}.`,
404
+ hint: `Add a SKILL.md under <workflow-pkg>/skills/ whose frontmatter \`name:\` is "${issue.name}", or remove "${issue.name}" from the state's skills list.`,
405
+ });
406
+ }
407
+ }
408
+ return diagnostics;
409
+ }
410
+ //# sourceMappingURL=lint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint.js","sourceRoot":"","sources":["../../src/workflow/lint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ import { type AnyStateMachine } from 'xstate';
2
+ import type { WorkflowDefinition, WorkflowContext, AgentStateDefinition, AgentOutput } from './types.js';
3
+ import type { AgentConversationId } from '../session/types.js';
4
+ /** Input provided to each invoked agent service. */
5
+ export interface AgentInvokeInput {
6
+ readonly stateId: string;
7
+ readonly stateConfig: AgentStateDefinition;
8
+ readonly context: WorkflowContext;
9
+ }
10
+ /** Result returned by an agent service promise. */
11
+ export interface AgentInvokeResult {
12
+ readonly output: AgentOutput;
13
+ /**
14
+ * Agent CLI conversation id used for this invocation. Minted or reused
15
+ * by the orchestrator before session construction (see
16
+ * `executeAgentState` and `docs/designs/workflow-session-identity.md`
17
+ * §3). Threaded through the result only so the
18
+ * `updateContextFromAgentResult` XState action can write it into
19
+ * `agentConversationsByState[stateId]`; not a read-back from the
20
+ * session.
21
+ */
22
+ readonly agentConversationId: AgentConversationId;
23
+ readonly artifacts: Record<string, string>;
24
+ /** SHA-256 of output artifacts, computed by the orchestrator. */
25
+ readonly outputHash: string;
26
+ /** Raw response text from session.sendMessage(). */
27
+ readonly responseText: string;
28
+ /**
29
+ * Cumulative workflow-level output-token count at the moment this
30
+ * agent finished. Copied onto `ctx.totalTokens` by the XState
31
+ * `updateContextFromAgentResult` assign action. Sourced from the
32
+ * orchestrator's token-stream bus subscription, which sums every
33
+ * `message_end.outputTokens` seen for sessions belonging to this
34
+ * workflow run.
35
+ */
36
+ readonly totalTokens: number;
37
+ }
38
+ /** Input provided to each invoked deterministic service. */
39
+ export interface DeterministicInvokeInput {
40
+ readonly stateId: string;
41
+ readonly commands: readonly (readonly string[])[];
42
+ readonly context: WorkflowContext;
43
+ }
44
+ /** Result from a deterministic (test/lint) state. */
45
+ export interface DeterministicInvokeResult {
46
+ readonly passed: boolean;
47
+ readonly testCount?: number;
48
+ readonly errors?: string;
49
+ }
50
+ export interface BuildMachineResult {
51
+ /** The XState machine (with placeholder actors). */
52
+ readonly machine: AnyStateMachine;
53
+ /** Set of state names that are human gates (for snapshot.matches()). */
54
+ readonly gateStateNames: ReadonlySet<string>;
55
+ /** Set of state names that are terminal (for completion detection). */
56
+ readonly terminalStateNames: ReadonlySet<string>;
57
+ }
58
+ /**
59
+ * Sanitizes agent response text for reuse in subsequent prompts: escapes any
60
+ * literal NUL bytes and truncates to stay within the 32KB limit.
61
+ *
62
+ * NUL escaping is load-bearing, not cosmetic. Agent output flows back into
63
+ * later prompts via `previousAgentOutput` / `previousAgentNotes`, which the
64
+ * Docker adapter passes as an argv element to `child_process.spawn`. Node
65
+ * refuses argv strings containing `\0` (`ERR_INVALID_ARG_VALUE`) and throws
66
+ * synchronously before the container even starts — aborting the workflow. A
67
+ * security-research agent describing a binary file format ("APP1 'Exif\\0\\0'")
68
+ * is the natural way this happens. We escape rather than strip so the textual
69
+ * description survives intact for downstream readers.
70
+ *
71
+ * Exported for testing.
72
+ */
73
+ export declare function truncateAgentOutput(text: string): string;
74
+ /**
75
+ * Creates the initial WorkflowContext for a given definition.
76
+ * Exported for testing.
77
+ */
78
+ export declare function createInitialContext(definition: WorkflowDefinition): Omit<WorkflowContext, 'taskDescription'>;
79
+ /**
80
+ * Builds an XState v5 machine from a validated WorkflowDefinition.
81
+ *
82
+ * The returned machine has placeholder actors (`agentService`,
83
+ * `deterministicService`) that throw if invoked directly. Callers
84
+ * must call `.provide({ actors: { ... } })` to inject real
85
+ * implementations before passing to `createActor()`.
86
+ *
87
+ * Guards are registered with concrete implementations from the guards
88
+ * module. Actions for context updates are defined inline via `assign`.
89
+ */
90
+ export declare function buildWorkflowMachine(definition: WorkflowDefinition, taskDescription: string): BuildMachineResult;