@provos/ironcurtain 0.10.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (660) hide show
  1. package/README.md +68 -14
  2. package/dist/auth/oauth-provider.js +1 -4
  3. package/dist/auth/oauth-provider.js.map +1 -1
  4. package/dist/cli-help.d.ts +12 -0
  5. package/dist/cli-help.js +21 -0
  6. package/dist/cli-help.js.map +1 -1
  7. package/dist/cli.js +46 -6
  8. package/dist/cli.js.map +1 -1
  9. package/dist/config/agent-model-guard.d.ts +14 -0
  10. package/dist/config/agent-model-guard.js +24 -0
  11. package/dist/config/agent-model-guard.js.map +1 -0
  12. package/dist/config/config-command.js +277 -7
  13. package/dist/config/config-command.js.map +1 -1
  14. package/dist/config/first-start.js +62 -7
  15. package/dist/config/first-start.js.map +1 -1
  16. package/dist/config/generated/compiled-policy.json +528 -161
  17. package/dist/config/generated/test-scenarios.json +4810 -170
  18. package/dist/config/generated/tool-annotations.json +34 -47
  19. package/dist/config/index.d.ts +58 -0
  20. package/dist/config/index.js +97 -15
  21. package/dist/config/index.js.map +1 -1
  22. package/dist/config/mcp-servers.json +2 -2
  23. package/dist/config/model-provider.d.ts +9 -0
  24. package/dist/config/model-provider.js +13 -0
  25. package/dist/config/model-provider.js.map +1 -1
  26. package/dist/config/paths.d.ts +217 -0
  27. package/dist/config/paths.js +363 -14
  28. package/dist/config/paths.js.map +1 -1
  29. package/dist/config/types.d.ts +7 -1
  30. package/dist/config/user-config.d.ts +101 -6
  31. package/dist/config/user-config.js +145 -31
  32. package/dist/config/user-config.js.map +1 -1
  33. package/dist/config/validate-policy-dir.d.ts +10 -0
  34. package/dist/config/validate-policy-dir.js +59 -0
  35. package/dist/config/validate-policy-dir.js.map +1 -0
  36. package/dist/cron/job-commands.js +22 -2
  37. package/dist/cron/job-commands.js.map +1 -1
  38. package/dist/cron/types.d.ts +16 -2
  39. package/dist/cron/types.js +1 -3
  40. package/dist/cron/types.js.map +1 -1
  41. package/dist/daemon/daemon-command.js +30 -7
  42. package/dist/daemon/daemon-command.js.map +1 -1
  43. package/dist/daemon/ironcurtain-daemon.d.ts +62 -1
  44. package/dist/daemon/ironcurtain-daemon.js +231 -8
  45. package/dist/daemon/ironcurtain-daemon.js.map +1 -1
  46. package/dist/daemon-client/daemon-client.d.ts +123 -0
  47. package/dist/daemon-client/daemon-client.js +324 -0
  48. package/dist/daemon-client/daemon-client.js.map +1 -0
  49. package/dist/docker/adapters/claude-code.js +194 -20
  50. package/dist/docker/adapters/claude-code.js.map +1 -1
  51. package/dist/docker/adapters/codex.d.ts +9 -0
  52. package/dist/docker/adapters/codex.js +297 -0
  53. package/dist/docker/adapters/codex.js.map +1 -0
  54. package/dist/docker/adapters/goose.d.ts +12 -11
  55. package/dist/docker/adapters/goose.js +80 -27
  56. package/dist/docker/adapters/goose.js.map +1 -1
  57. package/dist/docker/agent-adapter.d.ts +183 -5
  58. package/dist/docker/agent-adapter.js +16 -0
  59. package/dist/docker/agent-adapter.js.map +1 -1
  60. package/dist/docker/agent-registry.js +5 -0
  61. package/dist/docker/agent-registry.js.map +1 -1
  62. package/dist/docker/apple-container-manager.d.ts +49 -0
  63. package/dist/docker/apple-container-manager.js +464 -0
  64. package/dist/docker/apple-container-manager.js.map +1 -0
  65. package/dist/docker/code-mode-proxy.d.ts +38 -0
  66. package/dist/docker/code-mode-proxy.js +6 -1
  67. package/dist/docker/code-mode-proxy.js.map +1 -1
  68. package/dist/docker/container-lifecycle.d.ts +2 -2
  69. package/dist/docker/container-lifecycle.js.map +1 -1
  70. package/dist/docker/container-runtime.d.ts +29 -0
  71. package/dist/docker/container-runtime.js +76 -0
  72. package/dist/docker/container-runtime.js.map +1 -0
  73. package/dist/docker/docker-agent-session.d.ts +113 -62
  74. package/dist/docker/docker-agent-session.js +271 -294
  75. package/dist/docker/docker-agent-session.js.map +1 -1
  76. package/dist/docker/docker-infrastructure.d.ts +428 -26
  77. package/dist/docker/docker-infrastructure.js +1005 -70
  78. package/dist/docker/docker-infrastructure.js.map +1 -1
  79. package/dist/docker/docker-manager.d.ts +58 -3
  80. package/dist/docker/docker-manager.js +378 -33
  81. package/dist/docker/docker-manager.js.map +1 -1
  82. package/dist/docker/docker-probe.d.ts +45 -0
  83. package/dist/docker/docker-probe.js +86 -0
  84. package/dist/docker/docker-probe.js.map +1 -0
  85. package/dist/docker/docker-progress-sink.d.ts +43 -0
  86. package/dist/docker/docker-progress-sink.js +299 -0
  87. package/dist/docker/docker-progress-sink.js.map +1 -0
  88. package/dist/docker/mitm-proxy.d.ts +135 -1
  89. package/dist/docker/mitm-proxy.js +611 -25
  90. package/dist/docker/mitm-proxy.js.map +1 -1
  91. package/dist/docker/network-topology.d.ts +81 -0
  92. package/dist/docker/network-topology.js +160 -0
  93. package/dist/docker/network-topology.js.map +1 -0
  94. package/dist/docker/oauth-credentials.d.ts +59 -3
  95. package/dist/docker/oauth-credentials.js +181 -14
  96. package/dist/docker/oauth-credentials.js.map +1 -1
  97. package/dist/docker/oauth-token-manager.js +2 -2
  98. package/dist/docker/oauth-token-manager.js.map +1 -1
  99. package/dist/docker/orientation.d.ts +1 -1
  100. package/dist/docker/package-types.d.ts +1 -1
  101. package/dist/docker/provider-config.d.ts +78 -3
  102. package/dist/docker/provider-config.js +295 -31
  103. package/dist/docker/provider-config.js.map +1 -1
  104. package/dist/docker/provision-lock.d.ts +46 -0
  105. package/dist/docker/provision-lock.js +152 -0
  106. package/dist/docker/provision-lock.js.map +1 -0
  107. package/dist/docker/proxy-tools.d.ts +0 -2
  108. package/dist/docker/proxy-tools.js +2 -7
  109. package/dist/docker/proxy-tools.js.map +1 -1
  110. package/dist/docker/pty-session.d.ts +64 -1
  111. package/dist/docker/pty-session.js +306 -104
  112. package/dist/docker/pty-session.js.map +1 -1
  113. package/dist/docker/pty-types.d.ts +0 -2
  114. package/dist/docker/pty-types.js +0 -2
  115. package/dist/docker/pty-types.js.map +1 -1
  116. package/dist/docker/registry-proxy.d.ts +46 -0
  117. package/dist/docker/registry-proxy.js +255 -1
  118. package/dist/docker/registry-proxy.js.map +1 -1
  119. package/dist/docker/resource-limits.d.ts +134 -0
  120. package/dist/docker/resource-limits.js +203 -0
  121. package/dist/docker/resource-limits.js.map +1 -0
  122. package/dist/docker/spawn-with-idle-timeout.d.ts +39 -0
  123. package/dist/docker/spawn-with-idle-timeout.js +152 -0
  124. package/dist/docker/spawn-with-idle-timeout.js.map +1 -0
  125. package/dist/docker/sse-extractor.d.ts +51 -0
  126. package/dist/docker/sse-extractor.js +303 -0
  127. package/dist/docker/sse-extractor.js.map +1 -0
  128. package/dist/docker/token-stream-bus.d.ts +83 -0
  129. package/dist/docker/token-stream-bus.js +98 -0
  130. package/dist/docker/token-stream-bus.js.map +1 -0
  131. package/dist/docker/token-stream-types.d.ts +71 -0
  132. package/dist/docker/token-stream-types.js +8 -0
  133. package/dist/docker/token-stream-types.js.map +1 -0
  134. package/dist/docker/trajectory-capture.d.ts +79 -0
  135. package/dist/docker/trajectory-capture.js +521 -0
  136. package/dist/docker/trajectory-capture.js.map +1 -0
  137. package/dist/docker/trajectory-reassembler.d.ts +286 -0
  138. package/dist/docker/trajectory-reassembler.js +990 -0
  139. package/dist/docker/trajectory-reassembler.js.map +1 -0
  140. package/dist/docker/trajectory-tap.d.ts +100 -0
  141. package/dist/docker/trajectory-tap.js +410 -0
  142. package/dist/docker/trajectory-tap.js.map +1 -0
  143. package/dist/docker/trajectory-types.d.ts +187 -0
  144. package/dist/docker/trajectory-types.js +43 -0
  145. package/dist/docker/trajectory-types.js.map +1 -0
  146. package/dist/docker/types.d.ts +105 -12
  147. package/dist/doctor/checks.d.ts +171 -0
  148. package/dist/doctor/checks.js +598 -0
  149. package/dist/doctor/checks.js.map +1 -0
  150. package/dist/doctor/doctor-command.d.ts +29 -0
  151. package/dist/doctor/doctor-command.js +190 -0
  152. package/dist/doctor/doctor-command.js.map +1 -0
  153. package/dist/doctor/mcp-liveness.d.ts +28 -0
  154. package/dist/doctor/mcp-liveness.js +92 -0
  155. package/dist/doctor/mcp-liveness.js.map +1 -0
  156. package/dist/doctor/oauth-checks.d.ts +23 -0
  157. package/dist/doctor/oauth-checks.js +157 -0
  158. package/dist/doctor/oauth-checks.js.map +1 -0
  159. package/dist/doctor/output.d.ts +26 -0
  160. package/dist/doctor/output.js +82 -0
  161. package/dist/doctor/output.js.map +1 -0
  162. package/dist/escalation/listener-command.js +0 -3
  163. package/dist/escalation/listener-command.js.map +1 -1
  164. package/dist/event-bus/typed-event-bus.d.ts +26 -0
  165. package/dist/event-bus/typed-event-bus.js +35 -0
  166. package/dist/event-bus/typed-event-bus.js.map +1 -0
  167. package/dist/index.js +54 -21
  168. package/dist/index.js.map +1 -1
  169. package/dist/logger.js +31 -2
  170. package/dist/logger.js.map +1 -1
  171. package/dist/memory/auto-save.d.ts +18 -4
  172. package/dist/memory/auto-save.js +46 -6
  173. package/dist/memory/auto-save.js.map +1 -1
  174. package/dist/memory/memory-policy.d.ts +41 -0
  175. package/dist/memory/memory-policy.js +36 -0
  176. package/dist/memory/memory-policy.js.map +1 -0
  177. package/dist/mux/mux-app.d.ts +2 -0
  178. package/dist/mux/mux-app.js +1 -0
  179. package/dist/mux/mux-app.js.map +1 -1
  180. package/dist/mux/mux-command.d.ts +10 -1
  181. package/dist/mux/mux-command.js +74 -40
  182. package/dist/mux/mux-command.js.map +1 -1
  183. package/dist/mux/mux-renderer.js +2 -12
  184. package/dist/mux/mux-renderer.js.map +1 -1
  185. package/dist/mux/pty-bridge.d.ts +2 -0
  186. package/dist/mux/pty-bridge.js +3 -0
  187. package/dist/mux/pty-bridge.js.map +1 -1
  188. package/dist/mux/session-scanner.js +1 -2
  189. package/dist/mux/session-scanner.js.map +1 -1
  190. package/dist/{pipeline → observability}/llm-logger.d.ts +8 -3
  191. package/dist/{pipeline → observability}/llm-logger.js +8 -3
  192. package/dist/observability/llm-logger.js.map +1 -0
  193. package/dist/observe/observe-command.d.ts +12 -0
  194. package/dist/observe/observe-command.js +285 -0
  195. package/dist/observe/observe-command.js.map +1 -0
  196. package/dist/observe/observe-renderer.d.ts +24 -0
  197. package/dist/observe/observe-renderer.js +87 -0
  198. package/dist/observe/observe-renderer.js.map +1 -0
  199. package/dist/observe/observe-tui-rain.d.ts +42 -0
  200. package/dist/observe/observe-tui-rain.js +531 -0
  201. package/dist/observe/observe-tui-rain.js.map +1 -0
  202. package/dist/observe/observe-tui-text-panel.d.ts +46 -0
  203. package/dist/observe/observe-tui-text-panel.js +525 -0
  204. package/dist/observe/observe-tui-text-panel.js.map +1 -0
  205. package/dist/observe/observe-tui-types.d.ts +270 -0
  206. package/dist/observe/observe-tui-types.js +200 -0
  207. package/dist/observe/observe-tui-types.js.map +1 -0
  208. package/dist/observe/observe-tui-word-scorer.d.ts +143 -0
  209. package/dist/observe/observe-tui-word-scorer.js +572 -0
  210. package/dist/observe/observe-tui-word-scorer.js.map +1 -0
  211. package/dist/observe/observe-tui.d.ts +59 -0
  212. package/dist/observe/observe-tui.js +592 -0
  213. package/dist/observe/observe-tui.js.map +1 -0
  214. package/dist/persona/broad-policy-validator.d.ts +95 -0
  215. package/dist/persona/broad-policy-validator.js +171 -0
  216. package/dist/persona/broad-policy-validator.js.map +1 -0
  217. package/dist/persona/compile-persona-policy.d.ts +54 -2
  218. package/dist/persona/compile-persona-policy.js +29 -4
  219. package/dist/persona/compile-persona-policy.js.map +1 -1
  220. package/dist/persona/event-bus-progress-reporter.d.ts +57 -0
  221. package/dist/persona/event-bus-progress-reporter.js +66 -0
  222. package/dist/persona/event-bus-progress-reporter.js.map +1 -0
  223. package/dist/persona/memory-gate.d.ts +19 -0
  224. package/dist/persona/memory-gate.js +33 -0
  225. package/dist/persona/memory-gate.js.map +1 -0
  226. package/dist/persona/persona-command.js +77 -72
  227. package/dist/persona/persona-command.js.map +1 -1
  228. package/dist/persona/persona-compile-orchestrator.d.ts +101 -0
  229. package/dist/persona/persona-compile-orchestrator.js +504 -0
  230. package/dist/persona/persona-compile-orchestrator.js.map +1 -0
  231. package/dist/persona/persona-service.d.ts +137 -0
  232. package/dist/persona/persona-service.js +263 -0
  233. package/dist/persona/persona-service.js.map +1 -0
  234. package/dist/persona/policy-mutation-audit.d.ts +109 -0
  235. package/dist/persona/policy-mutation-audit.js +179 -0
  236. package/dist/persona/policy-mutation-audit.js.map +1 -0
  237. package/dist/persona/resolve.d.ts +22 -0
  238. package/dist/persona/resolve.js +45 -2
  239. package/dist/persona/resolve.js.map +1 -1
  240. package/dist/persona/rule-delta.d.ts +30 -0
  241. package/dist/persona/rule-delta.js +82 -0
  242. package/dist/persona/rule-delta.js.map +1 -0
  243. package/dist/persona/types.d.ts +28 -0
  244. package/dist/pipeline/annotate.js +10 -2
  245. package/dist/pipeline/annotate.js.map +1 -1
  246. package/dist/pipeline/compile.js +14 -2
  247. package/dist/pipeline/compile.js.map +1 -1
  248. package/dist/pipeline/constitution-compiler.d.ts +25 -14
  249. package/dist/pipeline/constitution-compiler.js +107 -38
  250. package/dist/pipeline/constitution-compiler.js.map +1 -1
  251. package/dist/pipeline/dynamic-list-types.d.ts +3 -6
  252. package/dist/pipeline/dynamic-list-types.js +3 -16
  253. package/dist/pipeline/dynamic-list-types.js.map +1 -1
  254. package/dist/pipeline/pipeline-runner.d.ts +63 -4
  255. package/dist/pipeline/pipeline-runner.js +242 -94
  256. package/dist/pipeline/pipeline-runner.js.map +1 -1
  257. package/dist/pipeline/pipeline-shared.d.ts +33 -4
  258. package/dist/pipeline/pipeline-shared.js +79 -19
  259. package/dist/pipeline/pipeline-shared.js.map +1 -1
  260. package/dist/pipeline/policy-verifier.js +16 -3
  261. package/dist/pipeline/policy-verifier.js.map +1 -1
  262. package/dist/pipeline/proxy-mcp-connections.js +17 -2
  263. package/dist/pipeline/proxy-mcp-connections.js.map +1 -1
  264. package/dist/pipeline/refresh-lists.js +3 -5
  265. package/dist/pipeline/refresh-lists.js.map +1 -1
  266. package/dist/pipeline/scenario-generator.d.ts +4 -8
  267. package/dist/pipeline/scenario-generator.js +13 -46
  268. package/dist/pipeline/scenario-generator.js.map +1 -1
  269. package/dist/sandbox/index.d.ts +29 -0
  270. package/dist/sandbox/index.js +351 -119
  271. package/dist/sandbox/index.js.map +1 -1
  272. package/dist/sandbox/ironcurtain-protocol.d.ts +52 -0
  273. package/dist/sandbox/ironcurtain-protocol.js +185 -0
  274. package/dist/sandbox/ironcurtain-protocol.js.map +1 -0
  275. package/dist/session/agent-session.d.ts +6 -0
  276. package/dist/session/agent-session.js +16 -5
  277. package/dist/session/agent-session.js.map +1 -1
  278. package/dist/session/cli-transport.js +0 -6
  279. package/dist/session/cli-transport.js.map +1 -1
  280. package/dist/session/index.d.ts +35 -14
  281. package/dist/session/index.js +333 -130
  282. package/dist/session/index.js.map +1 -1
  283. package/dist/session/preflight.d.ts +21 -13
  284. package/dist/session/preflight.js +227 -88
  285. package/dist/session/preflight.js.map +1 -1
  286. package/dist/session/prompts.d.ts +2 -5
  287. package/dist/session/prompts.js.map +1 -1
  288. package/dist/session/session-manager.d.ts +61 -6
  289. package/dist/session/session-manager.js +72 -10
  290. package/dist/session/session-manager.js.map +1 -1
  291. package/dist/session/session-metadata.d.ts +21 -5
  292. package/dist/session/session-metadata.js +34 -12
  293. package/dist/session/session-metadata.js.map +1 -1
  294. package/dist/session/types.d.ts +320 -5
  295. package/dist/session/types.js +57 -1
  296. package/dist/session/types.js.map +1 -1
  297. package/dist/signal/bot-command.js +6 -1
  298. package/dist/signal/bot-command.js.map +1 -1
  299. package/dist/signal/setup-signal.js +13 -21
  300. package/dist/signal/setup-signal.js.map +1 -1
  301. package/dist/signal/signal-bot-daemon.d.ts +16 -1
  302. package/dist/signal/signal-bot-daemon.js +39 -27
  303. package/dist/signal/signal-bot-daemon.js.map +1 -1
  304. package/dist/signal/signal-container.d.ts +3 -3
  305. package/dist/signal/signal-container.js +9 -3
  306. package/dist/signal/signal-container.js.map +1 -1
  307. package/dist/skills/discovery.d.ts +77 -0
  308. package/dist/skills/discovery.js +206 -0
  309. package/dist/skills/discovery.js.map +1 -0
  310. package/dist/skills/index.d.ts +4 -0
  311. package/dist/skills/index.js +3 -0
  312. package/dist/skills/index.js.map +1 -0
  313. package/dist/skills/staging.d.ts +28 -0
  314. package/dist/skills/staging.js +68 -0
  315. package/dist/skills/staging.js.map +1 -0
  316. package/dist/skills/types.d.ts +46 -0
  317. package/dist/skills/types.js +2 -0
  318. package/dist/skills/types.js.map +1 -0
  319. package/dist/trusted-process/approval-whitelist.d.ts +0 -2
  320. package/dist/trusted-process/approval-whitelist.js +17 -17
  321. package/dist/trusted-process/approval-whitelist.js.map +1 -1
  322. package/dist/trusted-process/async-mutex.d.ts +32 -0
  323. package/dist/trusted-process/async-mutex.js +50 -0
  324. package/dist/trusted-process/async-mutex.js.map +1 -0
  325. package/dist/trusted-process/audit-log.d.ts +38 -1
  326. package/dist/trusted-process/audit-log.js +82 -13
  327. package/dist/trusted-process/audit-log.js.map +1 -1
  328. package/dist/trusted-process/call-circuit-breaker.d.ts +6 -0
  329. package/dist/trusted-process/call-circuit-breaker.js +23 -3
  330. package/dist/trusted-process/call-circuit-breaker.js.map +1 -1
  331. package/dist/trusted-process/container-command.d.ts +35 -0
  332. package/dist/trusted-process/container-command.js +49 -0
  333. package/dist/trusted-process/container-command.js.map +1 -0
  334. package/dist/trusted-process/control-server.d.ts +101 -0
  335. package/dist/trusted-process/control-server.js +282 -0
  336. package/dist/trusted-process/control-server.js.map +1 -0
  337. package/dist/trusted-process/domain-utils.d.ts +6 -6
  338. package/dist/trusted-process/domain-utils.js +7 -23
  339. package/dist/trusted-process/domain-utils.js.map +1 -1
  340. package/dist/trusted-process/error-prefixes.d.ts +16 -0
  341. package/dist/trusted-process/error-prefixes.js +17 -0
  342. package/dist/trusted-process/error-prefixes.js.map +1 -0
  343. package/dist/trusted-process/index.d.ts +40 -23
  344. package/dist/trusted-process/index.js +131 -225
  345. package/dist/trusted-process/index.js.map +1 -1
  346. package/dist/trusted-process/list-matcher.d.ts +17 -0
  347. package/dist/trusted-process/list-matcher.js +31 -0
  348. package/dist/trusted-process/list-matcher.js.map +1 -0
  349. package/dist/trusted-process/mcp-client-manager.d.ts +35 -6
  350. package/dist/trusted-process/mcp-client-manager.js +40 -45
  351. package/dist/trusted-process/mcp-client-manager.js.map +1 -1
  352. package/dist/trusted-process/mcp-proxy-server.d.ts +31 -120
  353. package/dist/trusted-process/mcp-proxy-server.js +201 -660
  354. package/dist/trusted-process/mcp-proxy-server.js.map +1 -1
  355. package/dist/trusted-process/policy-engine.d.ts +16 -4
  356. package/dist/trusted-process/policy-engine.js +103 -47
  357. package/dist/trusted-process/policy-engine.js.map +1 -1
  358. package/dist/trusted-process/policy-roots.d.ts +6 -0
  359. package/dist/trusted-process/policy-roots.js +20 -0
  360. package/dist/trusted-process/policy-roots.js.map +1 -1
  361. package/dist/trusted-process/sandbox-integration.d.ts +12 -0
  362. package/dist/trusted-process/sandbox-integration.js +18 -0
  363. package/dist/trusted-process/sandbox-integration.js.map +1 -1
  364. package/dist/trusted-process/tcp-server-transport.d.ts +12 -1
  365. package/dist/trusted-process/tcp-server-transport.js +9 -1
  366. package/dist/trusted-process/tcp-server-transport.js.map +1 -1
  367. package/dist/trusted-process/tool-call-coordinator.d.ts +283 -0
  368. package/dist/trusted-process/tool-call-coordinator.js +592 -0
  369. package/dist/trusted-process/tool-call-coordinator.js.map +1 -0
  370. package/dist/trusted-process/tool-call-pipeline.d.ts +213 -0
  371. package/dist/trusted-process/tool-call-pipeline.js +832 -0
  372. package/dist/trusted-process/tool-call-pipeline.js.map +1 -0
  373. package/dist/trusted-process/tool-description-hints.d.ts +1 -1
  374. package/dist/types/argument-roles.d.ts +1 -1
  375. package/dist/types/argument-roles.js +14 -1
  376. package/dist/types/argument-roles.js.map +1 -1
  377. package/dist/types/audit.d.ts +9 -0
  378. package/dist/{session → types}/errors.d.ts +8 -2
  379. package/dist/{session → types}/errors.js +8 -2
  380. package/dist/types/errors.js.map +1 -0
  381. package/dist/types/reserved-servers.d.ts +11 -0
  382. package/dist/types/reserved-servers.js +12 -0
  383. package/dist/types/reserved-servers.js.map +1 -0
  384. package/dist/types/server-listing.d.ts +14 -0
  385. package/dist/types/server-listing.js +2 -0
  386. package/dist/types/server-listing.js.map +1 -0
  387. package/dist/types/slug.d.ts +2 -0
  388. package/dist/types/slug.js +2 -0
  389. package/dist/types/slug.js.map +1 -1
  390. package/dist/types/url-normalize.d.ts +16 -0
  391. package/dist/types/url-normalize.js +33 -0
  392. package/dist/types/url-normalize.js.map +1 -0
  393. package/dist/util/atomic-write.d.ts +31 -0
  394. package/dist/util/atomic-write.js +43 -0
  395. package/dist/util/atomic-write.js.map +1 -0
  396. package/dist/utils/error-message.d.ts +8 -0
  397. package/dist/utils/error-message.js +11 -0
  398. package/dist/utils/error-message.js.map +1 -0
  399. package/dist/utils/exec-error.d.ts +19 -0
  400. package/dist/utils/exec-error.js +16 -0
  401. package/dist/utils/exec-error.js.map +1 -0
  402. package/dist/utils/is-plain-object.d.ts +7 -0
  403. package/dist/utils/is-plain-object.js +12 -0
  404. package/dist/utils/is-plain-object.js.map +1 -0
  405. package/dist/utils/preflight-checks.d.ts +16 -0
  406. package/dist/utils/preflight-checks.js +178 -0
  407. package/dist/utils/preflight-checks.js.map +1 -0
  408. package/dist/web-ui/__tests__/json-rpc-dispatch.test.d.ts +7 -0
  409. package/dist/web-ui/__tests__/json-rpc-dispatch.test.js +725 -0
  410. package/dist/web-ui/__tests__/json-rpc-dispatch.test.js.map +1 -0
  411. package/dist/web-ui/conn-registry.d.ts +14 -0
  412. package/dist/web-ui/conn-registry.js +25 -0
  413. package/dist/web-ui/conn-registry.js.map +1 -0
  414. package/dist/web-ui/dispatch/escalation-dispatch.d.ts +7 -0
  415. package/dist/web-ui/dispatch/escalation-dispatch.js +52 -0
  416. package/dist/web-ui/dispatch/escalation-dispatch.js.map +1 -0
  417. package/dist/web-ui/dispatch/job-dispatch.d.ts +8 -0
  418. package/dist/web-ui/dispatch/job-dispatch.js +83 -0
  419. package/dist/web-ui/dispatch/job-dispatch.js.map +1 -0
  420. package/dist/web-ui/dispatch/persona-dispatch.d.ts +50 -0
  421. package/dist/web-ui/dispatch/persona-dispatch.js +269 -0
  422. package/dist/web-ui/dispatch/persona-dispatch.js.map +1 -0
  423. package/dist/web-ui/dispatch/session-dispatch.d.ts +9 -0
  424. package/dist/web-ui/dispatch/session-dispatch.js +219 -0
  425. package/dist/web-ui/dispatch/session-dispatch.js.map +1 -0
  426. package/dist/web-ui/dispatch/token-stream-dispatch.d.ts +15 -0
  427. package/dist/web-ui/dispatch/token-stream-dispatch.js +55 -0
  428. package/dist/web-ui/dispatch/token-stream-dispatch.js.map +1 -0
  429. package/dist/web-ui/dispatch/types.d.ts +54 -0
  430. package/dist/web-ui/dispatch/types.js +72 -0
  431. package/dist/web-ui/dispatch/types.js.map +1 -0
  432. package/dist/web-ui/dispatch/workflow-dispatch.d.ts +103 -0
  433. package/dist/web-ui/dispatch/workflow-dispatch.js +1036 -0
  434. package/dist/web-ui/dispatch/workflow-dispatch.js.map +1 -0
  435. package/dist/web-ui/json-rpc-dispatch.d.ts +12 -0
  436. package/dist/web-ui/json-rpc-dispatch.js +34 -0
  437. package/dist/web-ui/json-rpc-dispatch.js.map +1 -0
  438. package/dist/web-ui/state-graph.d.ts +13 -0
  439. package/dist/web-ui/state-graph.js +82 -0
  440. package/dist/web-ui/state-graph.js.map +1 -0
  441. package/dist/web-ui/token-stream-bridge.d.ts +76 -0
  442. package/dist/web-ui/token-stream-bridge.js +265 -0
  443. package/dist/web-ui/token-stream-bridge.js.map +1 -0
  444. package/dist/web-ui/web-event-bus.d.ts +176 -0
  445. package/dist/web-ui/web-event-bus.js +19 -0
  446. package/dist/web-ui/web-event-bus.js.map +1 -0
  447. package/dist/web-ui/web-session-transport.d.ts +31 -0
  448. package/dist/web-ui/web-session-transport.js +109 -0
  449. package/dist/web-ui/web-session-transport.js.map +1 -0
  450. package/dist/web-ui/web-ui-server.d.ts +90 -0
  451. package/dist/web-ui/web-ui-server.js +477 -0
  452. package/dist/web-ui/web-ui-server.js.map +1 -0
  453. package/dist/web-ui/web-ui-types.d.ts +418 -0
  454. package/dist/web-ui/web-ui-types.js +32 -0
  455. package/dist/web-ui/web-ui-types.js.map +1 -0
  456. package/dist/web-ui/ws-utils.d.ts +5 -0
  457. package/dist/web-ui/ws-utils.js +12 -0
  458. package/dist/web-ui/ws-utils.js.map +1 -0
  459. package/dist/web-ui-static/assets/index-BD5U6ILh.css +1 -0
  460. package/dist/web-ui-static/assets/index-FMsHWEfK.js +79 -0
  461. package/dist/web-ui-static/assets/orbitron-latin-700-normal-4jsRXGGJ.woff2 +0 -0
  462. package/dist/web-ui-static/assets/orbitron-latin-700-normal-DmYOh-W9.woff +0 -0
  463. package/dist/web-ui-static/index.html +14 -0
  464. package/dist/workflow/artifacts.d.ts +59 -0
  465. package/dist/workflow/artifacts.js +188 -0
  466. package/dist/workflow/artifacts.js.map +1 -0
  467. package/dist/workflow/checkpoint-selection.d.ts +34 -0
  468. package/dist/workflow/checkpoint-selection.js +48 -0
  469. package/dist/workflow/checkpoint-selection.js.map +1 -0
  470. package/dist/workflow/checkpoint.d.ts +35 -0
  471. package/dist/workflow/checkpoint.js +84 -0
  472. package/dist/workflow/checkpoint.js.map +1 -0
  473. package/dist/workflow/cli-shared.d.ts +62 -0
  474. package/dist/workflow/cli-shared.js +117 -0
  475. package/dist/workflow/cli-shared.js.map +1 -0
  476. package/dist/workflow/cli-support.d.ts +92 -0
  477. package/dist/workflow/cli-support.js +421 -0
  478. package/dist/workflow/cli-support.js.map +1 -0
  479. package/dist/workflow/container-snapshots.d.ts +29 -0
  480. package/dist/workflow/container-snapshots.js +137 -0
  481. package/dist/workflow/container-snapshots.js.map +1 -0
  482. package/dist/workflow/daemon-gate-commands.d.ts +21 -0
  483. package/dist/workflow/daemon-gate-commands.js +599 -0
  484. package/dist/workflow/daemon-gate-commands.js.map +1 -0
  485. package/dist/workflow/definition-loader.d.ts +32 -0
  486. package/dist/workflow/definition-loader.js +56 -0
  487. package/dist/workflow/definition-loader.js.map +1 -0
  488. package/dist/workflow/discovery.d.ts +107 -0
  489. package/dist/workflow/discovery.js +263 -0
  490. package/dist/workflow/discovery.js.map +1 -0
  491. package/dist/workflow/errors.d.ts +66 -0
  492. package/dist/workflow/errors.js +49 -0
  493. package/dist/workflow/errors.js.map +1 -0
  494. package/dist/workflow/guards.d.ts +8 -0
  495. package/dist/workflow/guards.js +38 -0
  496. package/dist/workflow/guards.js.map +1 -0
  497. package/dist/workflow/lane-template.d.ts +89 -0
  498. package/dist/workflow/lane-template.js +141 -0
  499. package/dist/workflow/lane-template.js.map +1 -0
  500. package/dist/workflow/lint-integration.d.ts +64 -0
  501. package/dist/workflow/lint-integration.js +56 -0
  502. package/dist/workflow/lint-integration.js.map +1 -0
  503. package/dist/workflow/lint.d.ts +72 -0
  504. package/dist/workflow/lint.js +593 -0
  505. package/dist/workflow/lint.js.map +1 -0
  506. package/dist/workflow/machine-builder.d.ts +178 -0
  507. package/dist/workflow/machine-builder.js +678 -0
  508. package/dist/workflow/machine-builder.js.map +1 -0
  509. package/dist/workflow/message-log.d.ts +99 -0
  510. package/dist/workflow/message-log.js +40 -0
  511. package/dist/workflow/message-log.js.map +1 -0
  512. package/dist/workflow/orchestrator.d.ts +954 -0
  513. package/dist/workflow/orchestrator.js +3594 -0
  514. package/dist/workflow/orchestrator.js.map +1 -0
  515. package/dist/workflow/prompt-builder.d.ts +39 -0
  516. package/dist/workflow/prompt-builder.js +243 -0
  517. package/dist/workflow/prompt-builder.js.map +1 -0
  518. package/dist/workflow/run-state-command.d.ts +9 -0
  519. package/dist/workflow/run-state-command.js +414 -0
  520. package/dist/workflow/run-state-command.js.map +1 -0
  521. package/dist/workflow/run-state-debug-capture.d.ts +40 -0
  522. package/dist/workflow/run-state-debug-capture.js +101 -0
  523. package/dist/workflow/run-state-debug-capture.js.map +1 -0
  524. package/dist/workflow/status-parser.d.ts +68 -0
  525. package/dist/workflow/status-parser.js +274 -0
  526. package/dist/workflow/status-parser.js.map +1 -0
  527. package/dist/workflow/types.d.ts +598 -0
  528. package/dist/workflow/types.js +85 -0
  529. package/dist/workflow/types.js.map +1 -0
  530. package/dist/workflow/validate.d.ts +80 -0
  531. package/dist/workflow/validate.js +788 -0
  532. package/dist/workflow/validate.js.map +1 -0
  533. package/dist/workflow/workflow-command.d.ts +9 -0
  534. package/dist/workflow/workflow-command.js +670 -0
  535. package/dist/workflow/workflow-command.js.map +1 -0
  536. package/dist/workflow/workflow-discovery.d.ts +27 -0
  537. package/dist/workflow/workflow-discovery.js +121 -0
  538. package/dist/workflow/workflow-discovery.js.map +1 -0
  539. package/dist/workflow/workflow-manager.d.ts +156 -0
  540. package/dist/workflow/workflow-manager.js +359 -0
  541. package/dist/workflow/workflow-manager.js.map +1 -0
  542. package/dist/workflow/workflows/design-and-code/README.md +50 -0
  543. package/dist/workflow/workflows/design-and-code/workflow.yaml +169 -0
  544. package/dist/workflow/workflows/deterministic-eval-smoke/scripts/format_report.js +29 -0
  545. package/dist/workflow/workflows/deterministic-eval-smoke/scripts/package.json +5 -0
  546. package/dist/workflow/workflows/deterministic-eval-smoke/scripts/requirements.txt +1 -0
  547. package/dist/workflow/workflows/deterministic-eval-smoke/scripts/run_eval.py +41 -0
  548. package/dist/workflow/workflows/deterministic-eval-smoke/workflow.yaml +57 -0
  549. package/dist/workflow/workflows/deterministic-verdict-smoke/scripts/classify.py +18 -0
  550. package/dist/workflow/workflows/deterministic-verdict-smoke/workflow.yaml +51 -0
  551. package/dist/workflow/workflows/evolve/scripts/LICENSE +201 -0
  552. package/dist/workflow/workflows/evolve/scripts/README.md +314 -0
  553. package/dist/workflow/workflows/evolve/scripts/evolve-brief +16 -0
  554. package/dist/workflow/workflows/evolve/scripts/evolve-cognition +16 -0
  555. package/dist/workflow/workflows/evolve/scripts/evolve-db +16 -0
  556. package/dist/workflow/workflows/evolve/scripts/evolve-eval +16 -0
  557. package/dist/workflow/workflows/evolve/scripts/evolve-files +16 -0
  558. package/dist/workflow/workflows/evolve/scripts/evolve-summary +16 -0
  559. package/dist/workflow/workflows/evolve/scripts/evolve_core/__init__.py +14 -0
  560. package/dist/workflow/workflows/evolve/scripts/evolve_core/algorithms/__init__.py +17 -0
  561. package/dist/workflow/workflows/evolve/scripts/evolve_core/algorithms/base.py +21 -0
  562. package/dist/workflow/workflows/evolve/scripts/evolve_core/algorithms/factory.py +90 -0
  563. package/dist/workflow/workflows/evolve/scripts/evolve_core/algorithms/greedy.py +17 -0
  564. package/dist/workflow/workflows/evolve/scripts/evolve_core/algorithms/island.py +316 -0
  565. package/dist/workflow/workflows/evolve/scripts/evolve_core/algorithms/random.py +18 -0
  566. package/dist/workflow/workflows/evolve/scripts/evolve_core/algorithms/ucb1.py +55 -0
  567. package/dist/workflow/workflows/evolve/scripts/evolve_core/best_snapshot.py +62 -0
  568. package/dist/workflow/workflows/evolve/scripts/evolve_core/cli.py +752 -0
  569. package/dist/workflow/workflows/evolve/scripts/evolve_core/cognition.py +127 -0
  570. package/dist/workflow/workflows/evolve/scripts/evolve_core/database.py +218 -0
  571. package/dist/workflow/workflows/evolve/scripts/evolve_core/diff.py +57 -0
  572. package/dist/workflow/workflows/evolve/scripts/evolve_core/embedding.py +84 -0
  573. package/dist/workflow/workflows/evolve/scripts/evolve_core/file_lock.py +45 -0
  574. package/dist/workflow/workflows/evolve/scripts/evolve_core/run_state.py +343 -0
  575. package/dist/workflow/workflows/evolve/scripts/evolve_core/sampling_config.py +173 -0
  576. package/dist/workflow/workflows/evolve/scripts/evolve_core/structures.py +93 -0
  577. package/dist/workflow/workflows/evolve/scripts/evolve_core/vector_index.py +191 -0
  578. package/dist/workflow/workflows/evolve/scripts/evolve_result.py +1503 -0
  579. package/dist/workflow/workflows/evolve/scripts/requirements.txt +2 -0
  580. package/dist/workflow/workflows/evolve/workflow.yaml +646 -0
  581. package/dist/workflow/workflows/test-email-summary/skills/email-formatting/SKILL.md +55 -0
  582. package/dist/workflow/workflows/test-email-summary/skills/gmail-query-syntax/SKILL.md +63 -0
  583. package/dist/workflow/workflows/test-email-summary/skills/json-schema-emails/SKILL.md +41 -0
  584. package/dist/workflow/workflows/test-email-summary/skills/json-schema-emails/schema.json +34 -0
  585. package/dist/workflow/workflows/test-email-summary/skills/summary-style-guide/SKILL.md +51 -0
  586. package/dist/workflow/workflows/test-email-summary/workflow.yaml +90 -0
  587. package/dist/workflow/workflows/vuln-discovery/skills/harness-design-fuzzing/SKILL.md +206 -0
  588. package/dist/workflow/workflows/vuln-discovery/skills/memory-safety-c-cpp/SKILL.md +167 -0
  589. package/dist/workflow/workflows/vuln-discovery/skills/vulnerability-triage/SKILL.md +189 -0
  590. package/dist/workflow/workflows/vuln-discovery/workflow.yaml +925 -0
  591. package/dist/workflow/worktree.d.ts +43 -0
  592. package/dist/workflow/worktree.js +106 -0
  593. package/dist/workflow/worktree.js.map +1 -0
  594. package/docker/Dockerfile.base +31 -0
  595. package/docker/Dockerfile.base.arm64 +27 -0
  596. package/docker/Dockerfile.claude-code +3 -1
  597. package/docker/Dockerfile.codex +17 -0
  598. package/docker/Dockerfile.goose +3 -1
  599. package/docker/entrypoint-claude-code.sh +7 -0
  600. package/docker/entrypoint-codex.sh +42 -0
  601. package/docker/entrypoint-goose.sh +6 -0
  602. package/docker/entrypoint-uid-remap.sh +93 -0
  603. package/package.json +27 -11
  604. package/packages/web-ui/README.md +113 -0
  605. package/packages/web-ui/docs/workflow-state-machine.png +0 -0
  606. package/src/config/generated/compiled-policy.json +528 -161
  607. package/src/config/generated/test-scenarios.json +4810 -170
  608. package/src/config/generated/tool-annotations.json +34 -47
  609. package/src/config/mcp-servers.json +2 -2
  610. package/src/workflow/workflows/design-and-code/README.md +50 -0
  611. package/src/workflow/workflows/design-and-code/workflow.yaml +169 -0
  612. package/src/workflow/workflows/deterministic-eval-smoke/scripts/format_report.js +29 -0
  613. package/src/workflow/workflows/deterministic-eval-smoke/scripts/package.json +5 -0
  614. package/src/workflow/workflows/deterministic-eval-smoke/scripts/requirements.txt +1 -0
  615. package/src/workflow/workflows/deterministic-eval-smoke/scripts/run_eval.py +41 -0
  616. package/src/workflow/workflows/deterministic-eval-smoke/workflow.yaml +57 -0
  617. package/src/workflow/workflows/deterministic-verdict-smoke/scripts/classify.py +18 -0
  618. package/src/workflow/workflows/deterministic-verdict-smoke/workflow.yaml +51 -0
  619. package/src/workflow/workflows/evolve/scripts/LICENSE +201 -0
  620. package/src/workflow/workflows/evolve/scripts/README.md +314 -0
  621. package/src/workflow/workflows/evolve/scripts/evolve-brief +16 -0
  622. package/src/workflow/workflows/evolve/scripts/evolve-cognition +16 -0
  623. package/src/workflow/workflows/evolve/scripts/evolve-db +16 -0
  624. package/src/workflow/workflows/evolve/scripts/evolve-eval +16 -0
  625. package/src/workflow/workflows/evolve/scripts/evolve-files +16 -0
  626. package/src/workflow/workflows/evolve/scripts/evolve-summary +16 -0
  627. package/src/workflow/workflows/evolve/scripts/evolve_core/__init__.py +14 -0
  628. package/src/workflow/workflows/evolve/scripts/evolve_core/algorithms/__init__.py +17 -0
  629. package/src/workflow/workflows/evolve/scripts/evolve_core/algorithms/base.py +21 -0
  630. package/src/workflow/workflows/evolve/scripts/evolve_core/algorithms/factory.py +90 -0
  631. package/src/workflow/workflows/evolve/scripts/evolve_core/algorithms/greedy.py +17 -0
  632. package/src/workflow/workflows/evolve/scripts/evolve_core/algorithms/island.py +316 -0
  633. package/src/workflow/workflows/evolve/scripts/evolve_core/algorithms/random.py +18 -0
  634. package/src/workflow/workflows/evolve/scripts/evolve_core/algorithms/ucb1.py +55 -0
  635. package/src/workflow/workflows/evolve/scripts/evolve_core/best_snapshot.py +62 -0
  636. package/src/workflow/workflows/evolve/scripts/evolve_core/cli.py +752 -0
  637. package/src/workflow/workflows/evolve/scripts/evolve_core/cognition.py +127 -0
  638. package/src/workflow/workflows/evolve/scripts/evolve_core/database.py +218 -0
  639. package/src/workflow/workflows/evolve/scripts/evolve_core/diff.py +57 -0
  640. package/src/workflow/workflows/evolve/scripts/evolve_core/embedding.py +84 -0
  641. package/src/workflow/workflows/evolve/scripts/evolve_core/file_lock.py +45 -0
  642. package/src/workflow/workflows/evolve/scripts/evolve_core/run_state.py +343 -0
  643. package/src/workflow/workflows/evolve/scripts/evolve_core/sampling_config.py +173 -0
  644. package/src/workflow/workflows/evolve/scripts/evolve_core/structures.py +93 -0
  645. package/src/workflow/workflows/evolve/scripts/evolve_core/vector_index.py +191 -0
  646. package/src/workflow/workflows/evolve/scripts/evolve_result.py +1503 -0
  647. package/src/workflow/workflows/evolve/scripts/requirements.txt +2 -0
  648. package/src/workflow/workflows/evolve/workflow.yaml +646 -0
  649. package/src/workflow/workflows/test-email-summary/skills/email-formatting/SKILL.md +55 -0
  650. package/src/workflow/workflows/test-email-summary/skills/gmail-query-syntax/SKILL.md +63 -0
  651. package/src/workflow/workflows/test-email-summary/skills/json-schema-emails/SKILL.md +41 -0
  652. package/src/workflow/workflows/test-email-summary/skills/json-schema-emails/schema.json +34 -0
  653. package/src/workflow/workflows/test-email-summary/skills/summary-style-guide/SKILL.md +51 -0
  654. package/src/workflow/workflows/test-email-summary/workflow.yaml +90 -0
  655. package/src/workflow/workflows/vuln-discovery/skills/harness-design-fuzzing/SKILL.md +206 -0
  656. package/src/workflow/workflows/vuln-discovery/skills/memory-safety-c-cpp/SKILL.md +167 -0
  657. package/src/workflow/workflows/vuln-discovery/skills/vulnerability-triage/SKILL.md +189 -0
  658. package/src/workflow/workflows/vuln-discovery/workflow.yaml +925 -0
  659. package/dist/pipeline/llm-logger.js.map +0 -1
  660. package/dist/session/errors.js.map +0 -1
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Fan-out lane templating for the evolve workflow's per-lane working areas.
3
+ *
4
+ * Under N-way fan-out (`docs/designs/evolve-sync-parallelism-slice.md` §7), the
5
+ * shared `current/` scratch directory collides across lanes, so each lane runs
6
+ * in its own `current/lane_<k>/` sub-path. This module rewrites the three
7
+ * surfaces that hardcode `current/`: agent prompts (via `{laneDir}`/`{laneId}`
8
+ * placeholders, §7.3), deterministic argv paths (via current-prefix rewriting,
9
+ * §7.1), and the per-lane `--lane <k>` flag the bridge reads (§7.1/§8.4).
10
+ *
11
+ * ESCAPING INVARIANT (read before adding a new caller). Every substitution here
12
+ * is a LITERAL text replacement, and the substituted values are
13
+ * orchestrator-controlled trusted lane identities: `lane.id` is a non-negative
14
+ * integer the orchestrator assigns (`buildFanOutLaneContext`), and `lane.dir` /
15
+ * `lane.relativeDir` are orchestrator-computed `…/current/lane_<id>` paths — none
16
+ * of them ever carry agent- or user-authored text. The rendered result is
17
+ * concatenated into a prompt (free text) or an argv array, so NO shell, markdown,
18
+ * or argv escaping is performed here. That is sound ONLY because of this
19
+ * invariant. A future caller MUST NOT template untrusted data (agent output, user
20
+ * input, file contents) through these helpers — doing so would inject unescaped
21
+ * text into a prompt/argv. If you need to interpolate untrusted data, escape it
22
+ * at the call site first; do not relax this module to do it for you.
23
+ */
24
+ import type { WorkflowContext, FanOutDefinition, WorkflowSettings } from './types.js';
25
+ /**
26
+ * Resolves the effective lane count for a fan-out state, exactly as the runtime
27
+ * does at `orchestrator.ts` (`runFanOutSegment`): `count: 'workers'` defers to
28
+ * `settings.workers` (default 1), while a numeric `count` is a per-state override
29
+ * independent of the global worker count.
30
+ *
31
+ * Single source of truth so the validator and linter gate their multi-lane
32
+ * safety checks on the SAME lane count the runtime will spin up — a numeric
33
+ * `count` override must not be able to bypass those checks just because
34
+ * `settings.workers` is 1. Keep in lockstep with the orchestrator's resolution.
35
+ */
36
+ export declare function resolveFanOutWorkers(fanOut: FanOutDefinition, settings?: WorkflowSettings): number;
37
+ export declare const DEFAULT_EVOLVE_LANE_DIR = "/workspace/.evolve_runs/main/current";
38
+ /**
39
+ * Zero-pad width of the `step_<NNNN>` batch index. Mirrors the Python `:04d`
40
+ * format in `scripts/evolve_result.py` (`step_{batch_index:04d}_lane_{lane}`).
41
+ */
42
+ export declare const EVOLVE_STEP_INDEX_WIDTH = 4;
43
+ /**
44
+ * The single TS spelling of the fan-out step name `step_<NNNN>_lane_<k>` (the
45
+ * other half of the lane-dir seam above). The Python bridge writes the same
46
+ * literal at `f"step_{batch_index:04d}_lane_{lane}"`; the orchestrator parses it
47
+ * back with EVOLVE_LANE_STEP_RE. Keep all three (this fn, the Python f-string,
48
+ * the regex) in lockstep — they are one cross-language format contract.
49
+ */
50
+ export declare function evolveStepName(batchIndex: number, lane: number): string;
51
+ export declare const DEFAULT_EVOLVE_LANE_RELATIVE_DIR = ".evolve_runs/main/current";
52
+ /**
53
+ * The bridge script basename. Exported so the orchestrator matches fan-out
54
+ * sample commands against the same literal this module uses for `--lane`
55
+ * injection, instead of re-spelling the find/`endsWith` matcher (see
56
+ * {@link evolveResultScriptIndex}).
57
+ */
58
+ export declare const EVOLVE_RESULT_SCRIPT = "evolve_result.py";
59
+ /**
60
+ * Substitutes the `{laneDir}` / `{laneRelativeDir}` / `{laneRelDir}` /
61
+ * `{laneId}` / `${laneId}` placeholders in `value` with this lane's trusted
62
+ * identity (falling back to the bare `current/` dir and lane id `0` when no lane
63
+ * is active, so `workers: 1` renders the legacy paths). Pure literal replacement
64
+ * — see the module's ESCAPING INVARIANT.
65
+ */
66
+ export declare function applyLaneTemplate(value: string, context: WorkflowContext): string;
67
+ /**
68
+ * Lane-scopes a path: first applies the placeholder templating, then rewrites a
69
+ * bare `…/current/<rest>` prefix to `…/current/lane_<k>/<rest>` (both the
70
+ * container-absolute `DEFAULT_EVOLVE_LANE_DIR` and the workspace-relative
71
+ * `DEFAULT_EVOLVE_LANE_RELATIVE_DIR` forms). Returns `value` unchanged when no
72
+ * lane is active. See the module's ESCAPING INVARIANT for why the values are
73
+ * trusted.
74
+ */
75
+ export declare function laneScopeEvolveCurrentPath(value: string, context: WorkflowContext): string;
76
+ /**
77
+ * Lane-scopes every path argument in a deterministic `run:` command, then
78
+ * injects `--lane <id>` after the bridge subcommand for the lane-aware
79
+ * subcommands ({@link EVOLVE_LANE_AWARE_COMMANDS}). Returns the command
80
+ * unchanged when no lane is active. See the module's ESCAPING INVARIANT.
81
+ */
82
+ export declare function templateLaneCommand(command: readonly string[], context: WorkflowContext): readonly string[];
83
+ /**
84
+ * Finds the index of the {@link EVOLVE_RESULT_SCRIPT} bridge entry in a command
85
+ * argv (matching either the bare basename or any `…/evolve_result.py` path), or
86
+ * `-1` if absent. The single source of truth for locating the bridge so the
87
+ * orchestrator and the `--lane` injector agree on what counts as the script.
88
+ */
89
+ export declare function evolveResultScriptIndex(command: readonly string[]): number;
@@ -0,0 +1,141 @@
1
+ /**
2
+ * Resolves the effective lane count for a fan-out state, exactly as the runtime
3
+ * does at `orchestrator.ts` (`runFanOutSegment`): `count: 'workers'` defers to
4
+ * `settings.workers` (default 1), while a numeric `count` is a per-state override
5
+ * independent of the global worker count.
6
+ *
7
+ * Single source of truth so the validator and linter gate their multi-lane
8
+ * safety checks on the SAME lane count the runtime will spin up — a numeric
9
+ * `count` override must not be able to bypass those checks just because
10
+ * `settings.workers` is 1. Keep in lockstep with the orchestrator's resolution.
11
+ */
12
+ export function resolveFanOutWorkers(fanOut, settings) {
13
+ return fanOut.count === 'workers' ? (settings?.workers ?? 1) : fanOut.count;
14
+ }
15
+ // Lane-dir format seam: `current/lane_<k>`. The matching step-name half of this
16
+ // convention lives on the Python side as STEP_NAME_RE in
17
+ // scripts/evolve_result.py (`step_<NNNN>_lane_<k>`) — keep both in sync if the
18
+ // lane/step naming ever changes.
19
+ export const DEFAULT_EVOLVE_LANE_DIR = '/workspace/.evolve_runs/main/current';
20
+ /**
21
+ * Zero-pad width of the `step_<NNNN>` batch index. Mirrors the Python `:04d`
22
+ * format in `scripts/evolve_result.py` (`step_{batch_index:04d}_lane_{lane}`).
23
+ */
24
+ export const EVOLVE_STEP_INDEX_WIDTH = 4;
25
+ /**
26
+ * The single TS spelling of the fan-out step name `step_<NNNN>_lane_<k>` (the
27
+ * other half of the lane-dir seam above). The Python bridge writes the same
28
+ * literal at `f"step_{batch_index:04d}_lane_{lane}"`; the orchestrator parses it
29
+ * back with EVOLVE_LANE_STEP_RE. Keep all three (this fn, the Python f-string,
30
+ * the regex) in lockstep — they are one cross-language format contract.
31
+ */
32
+ export function evolveStepName(batchIndex, lane) {
33
+ return `step_${String(batchIndex).padStart(EVOLVE_STEP_INDEX_WIDTH, '0')}_lane_${lane}`;
34
+ }
35
+ export const DEFAULT_EVOLVE_LANE_RELATIVE_DIR = '.evolve_runs/main/current';
36
+ /**
37
+ * The bridge script basename. Exported so the orchestrator matches fan-out
38
+ * sample commands against the same literal this module uses for `--lane`
39
+ * injection, instead of re-spelling the find/`endsWith` matcher (see
40
+ * {@link evolveResultScriptIndex}).
41
+ */
42
+ export const EVOLVE_RESULT_SCRIPT = 'evolve_result.py';
43
+ const EVOLVE_LANE_AWARE_COMMANDS = new Set(['sample', 'evaluate', 'record', 'attach_analysis']);
44
+ function laneId(context) {
45
+ return String(context.lane?.id ?? 0);
46
+ }
47
+ function laneDir(context) {
48
+ return context.lane?.dir ?? DEFAULT_EVOLVE_LANE_DIR;
49
+ }
50
+ function laneRelativeDir(context) {
51
+ return context.lane?.relativeDir ?? DEFAULT_EVOLVE_LANE_RELATIVE_DIR;
52
+ }
53
+ /**
54
+ * Substitutes the `{laneDir}` / `{laneRelativeDir}` / `{laneRelDir}` /
55
+ * `{laneId}` / `${laneId}` placeholders in `value` with this lane's trusted
56
+ * identity (falling back to the bare `current/` dir and lane id `0` when no lane
57
+ * is active, so `workers: 1` renders the legacy paths). Pure literal replacement
58
+ * — see the module's ESCAPING INVARIANT.
59
+ */
60
+ export function applyLaneTemplate(value, context) {
61
+ let rendered = value;
62
+ rendered = rendered.replaceAll('{laneDir}', laneDir(context));
63
+ rendered = rendered.replaceAll('{laneRelativeDir}', laneRelativeDir(context));
64
+ rendered = rendered.replaceAll('{laneRelDir}', laneRelativeDir(context));
65
+ rendered = rendered.replaceAll('${laneId}', laneId(context));
66
+ rendered = rendered.replaceAll('{laneId}', laneId(context));
67
+ return rendered;
68
+ }
69
+ /**
70
+ * Lane-scopes a path: first applies the placeholder templating, then rewrites a
71
+ * bare `…/current/<rest>` prefix to `…/current/lane_<k>/<rest>` (both the
72
+ * container-absolute `DEFAULT_EVOLVE_LANE_DIR` and the workspace-relative
73
+ * `DEFAULT_EVOLVE_LANE_RELATIVE_DIR` forms). Returns `value` unchanged when no
74
+ * lane is active. See the module's ESCAPING INVARIANT for why the values are
75
+ * trusted.
76
+ */
77
+ export function laneScopeEvolveCurrentPath(value, context) {
78
+ const lane = context.lane;
79
+ if (!lane)
80
+ return applyLaneTemplate(value, context);
81
+ let rendered = applyLaneTemplate(value, context);
82
+ rendered = replaceCurrentPrefix(rendered, DEFAULT_EVOLVE_LANE_DIR, lane.dir);
83
+ rendered = replaceCurrentPrefix(rendered, DEFAULT_EVOLVE_LANE_RELATIVE_DIR, lane.relativeDir);
84
+ return rendered;
85
+ }
86
+ /**
87
+ * Lane-scopes every path argument in a deterministic `run:` command, then
88
+ * injects `--lane <id>` after the bridge subcommand for the lane-aware
89
+ * subcommands ({@link EVOLVE_LANE_AWARE_COMMANDS}). Returns the command
90
+ * unchanged when no lane is active. See the module's ESCAPING INVARIANT.
91
+ */
92
+ export function templateLaneCommand(command, context) {
93
+ const templated = command.map((arg) => laneScopeEvolveCurrentPath(arg, context));
94
+ const lane = context.lane;
95
+ if (!lane)
96
+ return templated;
97
+ return injectEvolveLaneArg(templated, lane.id);
98
+ }
99
+ /**
100
+ * Finds the index of the {@link EVOLVE_RESULT_SCRIPT} bridge entry in a command
101
+ * argv (matching either the bare basename or any `…/evolve_result.py` path), or
102
+ * `-1` if absent. The single source of truth for locating the bridge so the
103
+ * orchestrator and the `--lane` injector agree on what counts as the script.
104
+ */
105
+ export function evolveResultScriptIndex(command) {
106
+ return command.findIndex((arg) => arg === EVOLVE_RESULT_SCRIPT || arg.endsWith(`/${EVOLVE_RESULT_SCRIPT}`));
107
+ }
108
+ function replaceCurrentPrefix(value, currentDir, replacement) {
109
+ if (value === currentDir)
110
+ return replacement;
111
+ const prefix = `${currentDir}/`;
112
+ if (!value.startsWith(prefix))
113
+ return value;
114
+ const suffix = value.slice(prefix.length);
115
+ // Idempotency guard: a path already lane-scoped (`current/lane_<n>/…`) must
116
+ // not be re-prefixed into `current/lane_<k>/lane_<n>/…`. This makes the rewrite
117
+ // safe to apply more than once (e.g. an argv that was templated upstream and
118
+ // re-templated here) and protects manifest paths that hardcode `lane_${laneId}`
119
+ // — applyLaneTemplate already expanded those, so the literal `lane_<n>/` they
120
+ // produce must be left alone. The flip side: a manifest that hardcodes a literal
121
+ // `lane_<digit>/` (no `${laneId}` to expand) is left UNCHANGED by every lane and
122
+ // would clobber — the validator (`HARDCODED_LANE_RESULT_FILE_RE` in validate.ts)
123
+ // rejects exactly that, matching this guard's `/^lane_\d+\//` notion of "a lane
124
+ // segment"; the two must stay consistent.
125
+ if (/^lane_\d+\//.test(suffix))
126
+ return value;
127
+ return `${replacement}/${suffix}`;
128
+ }
129
+ function injectEvolveLaneArg(command, id) {
130
+ if (command.includes('--lane'))
131
+ return command;
132
+ const scriptIndex = evolveResultScriptIndex(command);
133
+ if (scriptIndex < 0)
134
+ return command;
135
+ const subcommandIndex = scriptIndex + 1;
136
+ const subcommand = command[subcommandIndex];
137
+ if (!EVOLVE_LANE_AWARE_COMMANDS.has(subcommand))
138
+ return command;
139
+ return [...command.slice(0, subcommandIndex + 1), '--lane', String(id), ...command.slice(subcommandIndex + 1)];
140
+ }
141
+ //# sourceMappingURL=lane-template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lane-template.js","sourceRoot":"","sources":["../../src/workflow/lane-template.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Shared pre-flight lint integration used by both the CLI and the daemon.
3
+ * UI-agnostic: returns a `PreflightResult` that callers format themselves
4
+ * (stderr for CLI, JSON-RPC error data for the daemon).
5
+ */
6
+ import { type Diagnostic, type LintContext } from './lint.js';
7
+ import type { WorkflowDefinition } from './types.js';
8
+ /**
9
+ * Default `LintContext` shared by both the CLI and the daemon. Backed by the
10
+ * real filesystem-resolving `personaExists` from `src/persona/resolve.ts`.
11
+ */
12
+ export declare const defaultLintContext: LintContext;
13
+ /**
14
+ * How strict the pre-flight should be:
15
+ * - `off` : skip linting entirely; always ok.
16
+ * - `warn` : fail only on error-severity diagnostics; warnings pass.
17
+ * - `strict`: fail on any diagnostic, including warnings.
18
+ */
19
+ export type LintMode = 'off' | 'warn' | 'strict';
20
+ export interface PreflightResult {
21
+ readonly ok: boolean;
22
+ readonly diagnostics: readonly Diagnostic[];
23
+ }
24
+ export declare function preflightLint(definition: WorkflowDefinition, context: LintContext, mode: LintMode): PreflightResult;
25
+ /**
26
+ * Discriminated result for {@link runPreflight}. Three variants:
27
+ *
28
+ * - `{ ok: true, ... }`: the definition loaded and lint either had no
29
+ * diagnostics or had only diagnostics tolerated by `mode`. `warnings`
30
+ * counts the (passing) warnings present.
31
+ * - `{ ok: false, kind: 'load', ... }`: the definition file could not be
32
+ * parsed or did not validate. `loadKind` distinguishes the two.
33
+ * - `{ ok: false, kind: 'lint', ... }`: the definition loaded but lint
34
+ * produced diagnostics that fail `mode`. The definition is still returned
35
+ * so callers can render it alongside the diagnostics.
36
+ */
37
+ export type RunPreflightResult = {
38
+ ok: true;
39
+ definition: WorkflowDefinition;
40
+ diagnostics: readonly Diagnostic[];
41
+ warnings: number;
42
+ } | {
43
+ ok: false;
44
+ kind: 'load';
45
+ loadKind: 'parse' | 'validate';
46
+ message: string;
47
+ } | {
48
+ ok: false;
49
+ kind: 'lint';
50
+ definition: WorkflowDefinition;
51
+ diagnostics: readonly Diagnostic[];
52
+ errors: number;
53
+ warnings: number;
54
+ };
55
+ /**
56
+ * Loads + validates a definition from `definitionPath`, then runs
57
+ * {@link preflightLint} with a {@link LintContext} derived from
58
+ * {@link defaultLintContext} but bound to `definitionPath` so
59
+ * package-relative checks (currently WF010 — skill references) can
60
+ * resolve sibling resources. Never throws — returns a discriminated
61
+ * result that callers map to their own error surfaces (stderr+exit
62
+ * for CLI, RpcError for the daemon).
63
+ */
64
+ export declare function runPreflight(definitionPath: string, mode: LintMode): RunPreflightResult;
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Shared pre-flight lint integration used by both the CLI and the daemon.
3
+ * UI-agnostic: returns a `PreflightResult` that callers format themselves
4
+ * (stderr for CLI, JSON-RPC error data for the daemon).
5
+ */
6
+ import { countBySeverity, lintWorkflow } from './lint.js';
7
+ import { personaExists } from '../persona/resolve.js';
8
+ import { loadDefinition } from './definition-loader.js';
9
+ /**
10
+ * Default `LintContext` shared by both the CLI and the daemon. Backed by the
11
+ * real filesystem-resolving `personaExists` from `src/persona/resolve.ts`.
12
+ */
13
+ export const defaultLintContext = { personaExists };
14
+ export function preflightLint(definition, context, mode) {
15
+ if (mode === 'off')
16
+ return { ok: true, diagnostics: [] };
17
+ const diagnostics = lintWorkflow(definition, context);
18
+ const { errors } = countBySeverity(diagnostics);
19
+ const failed = mode === 'strict' ? diagnostics.length > 0 : errors > 0;
20
+ return { ok: !failed, diagnostics };
21
+ }
22
+ /**
23
+ * Loads + validates a definition from `definitionPath`, then runs
24
+ * {@link preflightLint} with a {@link LintContext} derived from
25
+ * {@link defaultLintContext} but bound to `definitionPath` so
26
+ * package-relative checks (currently WF010 — skill references) can
27
+ * resolve sibling resources. Never throws — returns a discriminated
28
+ * result that callers map to their own error surfaces (stderr+exit
29
+ * for CLI, RpcError for the daemon).
30
+ */
31
+ export function runPreflight(definitionPath, mode) {
32
+ const loaded = loadDefinition(definitionPath);
33
+ if (!loaded.ok) {
34
+ return { ok: false, kind: 'load', loadKind: loaded.kind, message: loaded.message };
35
+ }
36
+ const ctx = { ...defaultLintContext, workflowFilePath: definitionPath };
37
+ const lintResult = preflightLint(loaded.definition, ctx, mode);
38
+ const { errors, warnings } = countBySeverity(lintResult.diagnostics);
39
+ if (lintResult.ok) {
40
+ return {
41
+ ok: true,
42
+ definition: loaded.definition,
43
+ diagnostics: lintResult.diagnostics,
44
+ warnings,
45
+ };
46
+ }
47
+ return {
48
+ ok: false,
49
+ kind: 'lint',
50
+ definition: loaded.definition,
51
+ diagnostics: lintResult.diagnostics,
52
+ errors,
53
+ warnings,
54
+ };
55
+ }
56
+ //# sourceMappingURL=lint-integration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint-integration.js","sourceRoot":"","sources":["../../src/workflow/lint-integration.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,YAAY,EAAqC,MAAM,WAAW,CAAC;AAC7F,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAGxD;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAgB,EAAE,aAAa,EAAE,CAAC;AAejE,MAAM,UAAU,aAAa,CAAC,UAA8B,EAAE,OAAoB,EAAE,IAAc;IAChG,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;IAEzD,MAAM,WAAW,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACtD,MAAM,EAAE,MAAM,EAAE,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IAEvE,OAAO,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC;AACtC,CAAC;AAoCD;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAAC,cAAsB,EAAE,IAAc;IACjE,MAAM,MAAM,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC;IAC9C,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;IACrF,CAAC;IAED,MAAM,GAAG,GAAgB,EAAE,GAAG,kBAAkB,EAAE,gBAAgB,EAAE,cAAc,EAAE,CAAC;IACrF,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IAC/D,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,eAAe,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAErE,IAAI,UAAU,CAAC,EAAE,EAAE,CAAC;QAClB,OAAO;YACL,EAAE,EAAE,IAAI;YACR,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,WAAW,EAAE,UAAU,CAAC,WAAW;YACnC,QAAQ;SACT,CAAC;IACJ,CAAC;IAED,OAAO;QACL,EAAE,EAAE,KAAK;QACT,IAAI,EAAE,MAAM;QACZ,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,MAAM;QACN,QAAQ;KACT,CAAC;AACJ,CAAC"}
@@ -0,0 +1,72 @@
1
+ import type { WorkflowDefinition } from './types.js';
2
+ /**
3
+ * Diagnostic codes.
4
+ *
5
+ * WF008 occupies the slot previously used for a raw-YAML check that
6
+ * `maxVisits` is only declared on agent states. That check now throws
7
+ * `WorkflowValidationError` before lint runs, so it never emits a WF code;
8
+ * the slot is reclaimed here for the visit-cap transition-ordering rule.
9
+ * WF009 is retired for the same reason (state-ID regex is a validation
10
+ * error) and must not be reused.
11
+ *
12
+ * WF005 (parallelKey + worktree needs gitRepoPath) is retired: the
13
+ * `parallelKey` schema field was removed as unused, so the trigger
14
+ * condition can no longer fire. Must not be reused.
15
+ *
16
+ * WF010 covers two related concerns under a single code:
17
+ * 1. State-scoped: an agent state's `skills:` entry is invalid or
18
+ * doesn't match any discoverable skill in the package.
19
+ * 2. Package-scoped: a `SKILL.md` under the workflow package's
20
+ * `skills/` tree is malformed, unreadable, or missing required
21
+ * frontmatter fields. These are surfaced even when no state
22
+ * references the broken skill, so authors get fast feedback on a
23
+ * typo in frontmatter rather than discovering it via a "skill not
24
+ * found" message at runtime.
25
+ *
26
+ * Both concerns are skipped cleanly when the lint caller did not
27
+ * supply a `workflowFilePath` (the package dir is the only place skill
28
+ * manifests can live).
29
+ *
30
+ * WF013 (fan-out maxRounds budget) and WF014 (fan-out child-bounds) are
31
+ * sibling fan-out checks split apart so each carries one concern. WF014
32
+ * previously flagged non-barrier fan-out joins; that is now a parse-time
33
+ * rejection (`FanOutDefinition.join` is the literal `'barrier'`), so the
34
+ * lint became unreachable and the number was reclaimed for child-bounds.
35
+ */
36
+ export type DiagnosticCode = 'WF001' | 'WF002' | 'WF003' | 'WF004' | 'WF006' | 'WF007' | 'WF008' | 'WF010' | 'WF011' | 'WF012' | 'WF013' | 'WF014';
37
+ export type DiagnosticSeverity = 'error' | 'warning';
38
+ export interface Diagnostic {
39
+ readonly code: DiagnosticCode;
40
+ readonly severity: DiagnosticSeverity;
41
+ readonly message: string;
42
+ readonly stateId?: string;
43
+ readonly hint?: string;
44
+ }
45
+ /**
46
+ * Injected facts the linter cannot derive from the definition alone.
47
+ *
48
+ * Kept minimal: methods/fields are added only when a new check
49
+ * genuinely needs external context.
50
+ */
51
+ export interface LintContext {
52
+ /** Returns true iff the named persona is installed locally. */
53
+ personaExists(name: string): boolean;
54
+ /**
55
+ * Absolute path to the workflow file being linted, when known. Used
56
+ * by checks that resolve co-packaged resources off the manifest's
57
+ * directory (currently WF010 — skill references). Lint callers that
58
+ * do not have a path on hand (e.g., synthesized definitions in tests)
59
+ * may omit this; rules that need it skip cleanly when absent.
60
+ */
61
+ readonly workflowFilePath?: string;
62
+ }
63
+ export type LintResult = readonly Diagnostic[];
64
+ /**
65
+ * Runs all registered checks against `def`. Pure: same input => same
66
+ * output. Diagnostics come back in stable order (WF001 first, WF007 last).
67
+ */
68
+ export declare function lintWorkflow(def: WorkflowDefinition, ctx: LintContext): LintResult;
69
+ export declare function countBySeverity(diagnostics: readonly Diagnostic[]): {
70
+ errors: number;
71
+ warnings: number;
72
+ };