@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,95 @@
1
+ /**
2
+ * src/persona/broad-policy-validator.ts
3
+ *
4
+ * Broad-policy validator (Phase 1c, §7). Passed as the `validateCompiled` hook
5
+ * to `compilePersonaPolicy` by the persona-compile orchestrator. It runs on the
6
+ * in-memory `CompiledPolicyFile` BEFORE any artifact is written, so a rejection
7
+ * leaves the prior generation's files intact (no partial write).
8
+ *
9
+ * It defeats constitution prompt-injection toward an over-permissive policy in a
10
+ * way that is fully LLM-independent: it inspects the COMPILED rules, not the
11
+ * constitution text. A persona may only emit a "broad" policy if it has been
12
+ * explicitly opted in via the gated `personas.setBroadPolicyOptIn` flow
13
+ * (`persona.allowBroadPolicy === true`). Otherwise the following are rejected:
14
+ *
15
+ * - any "broad wildcard" `domains.allowed` entry (see isBroadDomainPattern),
16
+ * - any "broad wildcard" `lists[].allowed` entry,
17
+ * - any `paths.within` that resolves OUTSIDE the persona's workspace dir.
18
+ *
19
+ * A "broad wildcard" is not just the literal `*`. The runtime matcher
20
+ * (domainMatchesAllowlist in trusted-process/domain-utils.ts) treats any
21
+ * `*.`-prefixed pattern as a hostname suffix match, and the compiler is
22
+ * explicitly allowed to emit prefix wildcards (`*.example.com`). A TLD-level
23
+ * wildcard like `*.com`, `*.gov`, or the empty-suffix `*.` therefore grants
24
+ * near-wildcard egress and must be treated as broad — only a wildcard whose
25
+ * suffix has TWO OR MORE labels (e.g. `*.github.com`, scoped to a single
26
+ * registered domain) is considered narrow and allowed without opt-in.
27
+ *
28
+ * Rejection throws {@link BroadPolicyRejectedError}; the orchestrator maps the
29
+ * `code` (`BROAD_POLICY_REJECTED`) onto a terminal `persona.compile.failed`
30
+ * event.
31
+ *
32
+ * ZERO runtime value-imports from src/pipeline — the `CompiledPolicyFile` shape
33
+ * is a type-only import. Path containment uses the live-layer `resolveRealPath`
34
+ * helper (symlink-aware), consistent with the policy engine.
35
+ *
36
+ * @see docs/designs/web-ui-policy-persona-management.md §7
37
+ */
38
+ import type { ErrorCode } from '../web-ui/web-ui-types.js';
39
+ import type { CompiledPolicyFile, DynamicListsFile } from '../pipeline/types.js';
40
+ /** Thrown when a compiled policy is "broad" but the persona is not opted in. */
41
+ export declare class BroadPolicyRejectedError extends Error {
42
+ readonly data?: {
43
+ broadenedDomains: string[];
44
+ outOfWorkspacePaths: string[];
45
+ } | undefined;
46
+ readonly code: ErrorCode;
47
+ constructor(message: string, data?: {
48
+ broadenedDomains: string[];
49
+ outOfWorkspacePaths: string[];
50
+ } | undefined);
51
+ }
52
+ /** Findings produced by inspecting a compiled policy for broadening. */
53
+ export interface BroadPolicyFindings {
54
+ /**
55
+ * Broad-wildcard entries found in any `domains.allowed` or `lists[].allowed`
56
+ * (the literal pattern, e.g. `*`, `*.`, `*.com`). See {@link isBroadDomainPattern}.
57
+ */
58
+ readonly broadenedDomains: string[];
59
+ /** `paths.within` values resolving outside the workspace dir. */
60
+ readonly outOfWorkspacePaths: string[];
61
+ }
62
+ /**
63
+ * Returns true iff `pattern` grants near-wildcard egress and therefore requires
64
+ * the broad-policy opt-in. This mirrors the runtime matcher semantics in
65
+ * `domainMatchesAllowlist` (trusted-process/domain-utils.ts), where `*` matches
66
+ * any non-IP host and `*.<suffix>` matches every host ending in `.<suffix>`.
67
+ *
68
+ * Broad (rejected without opt-in):
69
+ * - `*` — matches every (non-IP) host
70
+ * - `*.` — empty suffix; `endsWith('.')` matches ~everything
71
+ * - `*.com`/`*.gov`— TLD-only suffix (<= 1 label after the `*.`)
72
+ *
73
+ * Narrow (allowed without opt-in):
74
+ * - `*.github.com` — suffix has >= 2 labels (one registered domain)
75
+ * - `github.com` — bare hostname (no wildcard)
76
+ */
77
+ export declare function isBroadDomainPattern(pattern: string): boolean;
78
+ /**
79
+ * Inspects a compiled policy and returns the set of "broad" findings. Pure /
80
+ * side-effect-free so it can also feed the ruleDelta computation. A path is
81
+ * "out of workspace" iff its real-resolved form is neither the workspace dir nor
82
+ * a descendant of it. When `dynamicLists` is supplied, `@list` references in
83
+ * `domains.allowed` / `lists[].allowed` are resolved to their concrete values so
84
+ * a list that resolves to a broad wildcard is detected (the validator passes it;
85
+ * callers without the resolved lists — e.g. the rule-delta report — still get the
86
+ * literal-pattern findings).
87
+ */
88
+ export declare function findBroadPolicy(policy: CompiledPolicyFile, workspaceDir: string, dynamicLists?: DynamicListsFile): BroadPolicyFindings;
89
+ /**
90
+ * Builds a `validateCompiled` hook bound to a persona's workspace dir and
91
+ * opt-in flag. When `allowBroadPolicy` is true the hook is a no-op (broadening
92
+ * is permitted); otherwise it throws {@link BroadPolicyRejectedError} on any
93
+ * broad finding.
94
+ */
95
+ export declare function makeBroadPolicyValidator(workspaceDir: string, allowBroadPolicy: boolean): (policy: CompiledPolicyFile, dynamicLists?: DynamicListsFile) => void;
@@ -0,0 +1,171 @@
1
+ /**
2
+ * src/persona/broad-policy-validator.ts
3
+ *
4
+ * Broad-policy validator (Phase 1c, §7). Passed as the `validateCompiled` hook
5
+ * to `compilePersonaPolicy` by the persona-compile orchestrator. It runs on the
6
+ * in-memory `CompiledPolicyFile` BEFORE any artifact is written, so a rejection
7
+ * leaves the prior generation's files intact (no partial write).
8
+ *
9
+ * It defeats constitution prompt-injection toward an over-permissive policy in a
10
+ * way that is fully LLM-independent: it inspects the COMPILED rules, not the
11
+ * constitution text. A persona may only emit a "broad" policy if it has been
12
+ * explicitly opted in via the gated `personas.setBroadPolicyOptIn` flow
13
+ * (`persona.allowBroadPolicy === true`). Otherwise the following are rejected:
14
+ *
15
+ * - any "broad wildcard" `domains.allowed` entry (see isBroadDomainPattern),
16
+ * - any "broad wildcard" `lists[].allowed` entry,
17
+ * - any `paths.within` that resolves OUTSIDE the persona's workspace dir.
18
+ *
19
+ * A "broad wildcard" is not just the literal `*`. The runtime matcher
20
+ * (domainMatchesAllowlist in trusted-process/domain-utils.ts) treats any
21
+ * `*.`-prefixed pattern as a hostname suffix match, and the compiler is
22
+ * explicitly allowed to emit prefix wildcards (`*.example.com`). A TLD-level
23
+ * wildcard like `*.com`, `*.gov`, or the empty-suffix `*.` therefore grants
24
+ * near-wildcard egress and must be treated as broad — only a wildcard whose
25
+ * suffix has TWO OR MORE labels (e.g. `*.github.com`, scoped to a single
26
+ * registered domain) is considered narrow and allowed without opt-in.
27
+ *
28
+ * Rejection throws {@link BroadPolicyRejectedError}; the orchestrator maps the
29
+ * `code` (`BROAD_POLICY_REJECTED`) onto a terminal `persona.compile.failed`
30
+ * event.
31
+ *
32
+ * ZERO runtime value-imports from src/pipeline — the `CompiledPolicyFile` shape
33
+ * is a type-only import. Path containment uses the live-layer `resolveRealPath`
34
+ * helper (symlink-aware), consistent with the policy engine.
35
+ *
36
+ * @see docs/designs/web-ui-policy-persona-management.md §7
37
+ */
38
+ import { resolveRealPath } from '../types/argument-roles.js';
39
+ /** Thrown when a compiled policy is "broad" but the persona is not opted in. */
40
+ export class BroadPolicyRejectedError extends Error {
41
+ data;
42
+ code = 'BROAD_POLICY_REJECTED';
43
+ constructor(message, data) {
44
+ super(message);
45
+ this.data = data;
46
+ this.name = 'BroadPolicyRejectedError';
47
+ }
48
+ }
49
+ /**
50
+ * Returns true iff `pattern` grants near-wildcard egress and therefore requires
51
+ * the broad-policy opt-in. This mirrors the runtime matcher semantics in
52
+ * `domainMatchesAllowlist` (trusted-process/domain-utils.ts), where `*` matches
53
+ * any non-IP host and `*.<suffix>` matches every host ending in `.<suffix>`.
54
+ *
55
+ * Broad (rejected without opt-in):
56
+ * - `*` — matches every (non-IP) host
57
+ * - `*.` — empty suffix; `endsWith('.')` matches ~everything
58
+ * - `*.com`/`*.gov`— TLD-only suffix (<= 1 label after the `*.`)
59
+ *
60
+ * Narrow (allowed without opt-in):
61
+ * - `*.github.com` — suffix has >= 2 labels (one registered domain)
62
+ * - `github.com` — bare hostname (no wildcard)
63
+ */
64
+ export function isBroadDomainPattern(pattern) {
65
+ if (pattern === '*')
66
+ return true;
67
+ if (!pattern.startsWith('*.'))
68
+ return false;
69
+ const suffix = pattern.slice(2); // drop the leading "*."
70
+ // Empty or single-label suffix (TLD-only) => broad. Count non-empty labels.
71
+ const labels = suffix.split('.').filter((l) => l.length > 0);
72
+ return labels.length <= 1;
73
+ }
74
+ /**
75
+ * Expands an `allowed` array (from `domains.allowed` or `lists[].allowed`) into
76
+ * the concrete values to test for breadth. A `@list` reference contributes its
77
+ * EFFECTIVE values (values + manualAdditions − manualRemovals), mirroring
78
+ * `PolicyEngine.getEffectiveListValues` — so a list that RESOLVES to a broad
79
+ * wildcard (e.g. a "major news sites" list containing `*.com`) is caught even
80
+ * though the rule only stores the `@list` symbol and the resolved values live
81
+ * separately in dynamic-lists.json. A missing list contributes nothing: the
82
+ * runtime fails closed (missing `@list` => empty => deny), so there is nothing
83
+ * broad to flag. `via` records the originating `@list` for a clear message.
84
+ */
85
+ function expandAllowedForBreadth(allowed, dynamicLists) {
86
+ const out = [];
87
+ for (const entry of allowed) {
88
+ if (!entry.startsWith('@')) {
89
+ out.push({ value: entry });
90
+ continue;
91
+ }
92
+ const list = dynamicLists?.lists[entry.slice(1)];
93
+ if (!list)
94
+ continue;
95
+ const removals = new Set(list.manualRemovals);
96
+ for (const v of new Set([...list.values, ...list.manualAdditions])) {
97
+ if (!removals.has(v))
98
+ out.push({ value: v, via: entry });
99
+ }
100
+ }
101
+ return out;
102
+ }
103
+ /**
104
+ * Inspects a compiled policy and returns the set of "broad" findings. Pure /
105
+ * side-effect-free so it can also feed the ruleDelta computation. A path is
106
+ * "out of workspace" iff its real-resolved form is neither the workspace dir nor
107
+ * a descendant of it. When `dynamicLists` is supplied, `@list` references in
108
+ * `domains.allowed` / `lists[].allowed` are resolved to their concrete values so
109
+ * a list that resolves to a broad wildcard is detected (the validator passes it;
110
+ * callers without the resolved lists — e.g. the rule-delta report — still get the
111
+ * literal-pattern findings).
112
+ */
113
+ export function findBroadPolicy(policy, workspaceDir, dynamicLists) {
114
+ const broadenedDomains = new Set();
115
+ const outOfWorkspacePaths = new Set();
116
+ const workspaceReal = resolveRealPath(workspaceDir);
117
+ const flagBroad = (entries) => {
118
+ for (const { value, via } of expandAllowedForBreadth(entries, dynamicLists)) {
119
+ if (isBroadDomainPattern(value))
120
+ broadenedDomains.add(via ? `${value} (via ${via})` : value);
121
+ }
122
+ };
123
+ for (const rule of policy.rules) {
124
+ const cond = rule.if;
125
+ // Wildcard domains — incl. those reached through a resolved @list.
126
+ if (cond.domains?.allowed)
127
+ flagBroad(cond.domains.allowed);
128
+ // Wildcard list allowances.
129
+ if (cond.lists) {
130
+ for (const list of cond.lists)
131
+ flagBroad(list.allowed);
132
+ }
133
+ // Out-of-workspace path containment.
134
+ if (cond.paths?.within) {
135
+ const within = cond.paths.within;
136
+ const withinReal = resolveRealPath(within);
137
+ const contained = withinReal === workspaceReal || withinReal.startsWith(workspaceReal + '/');
138
+ if (!contained)
139
+ outOfWorkspacePaths.add(within);
140
+ }
141
+ }
142
+ return {
143
+ broadenedDomains: [...broadenedDomains],
144
+ outOfWorkspacePaths: [...outOfWorkspacePaths],
145
+ };
146
+ }
147
+ /**
148
+ * Builds a `validateCompiled` hook bound to a persona's workspace dir and
149
+ * opt-in flag. When `allowBroadPolicy` is true the hook is a no-op (broadening
150
+ * is permitted); otherwise it throws {@link BroadPolicyRejectedError} on any
151
+ * broad finding.
152
+ */
153
+ export function makeBroadPolicyValidator(workspaceDir, allowBroadPolicy) {
154
+ return (policy, dynamicLists) => {
155
+ if (allowBroadPolicy)
156
+ return;
157
+ const findings = findBroadPolicy(policy, workspaceDir, dynamicLists);
158
+ if (findings.broadenedDomains.length === 0 && findings.outOfWorkspacePaths.length === 0) {
159
+ return;
160
+ }
161
+ const parts = [];
162
+ if (findings.broadenedDomains.length > 0) {
163
+ parts.push(`broad wildcard domain/list access: ${findings.broadenedDomains.join(', ')}`);
164
+ }
165
+ if (findings.outOfWorkspacePaths.length > 0) {
166
+ parts.push(`out-of-workspace path(s): ${findings.outOfWorkspacePaths.join(', ')}`);
167
+ }
168
+ throw new BroadPolicyRejectedError(`Compiled policy is too broad (${parts.join('; ')}). Enable broad policy for this persona to allow it.`, { broadenedDomains: findings.broadenedDomains, outOfWorkspacePaths: findings.outOfWorkspacePaths });
169
+ };
170
+ }
171
+ //# sourceMappingURL=broad-policy-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"broad-policy-validator.js","sourceRoot":"","sources":["../../src/persona/broad-policy-validator.ts"],"names":[],"mappings":"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"}
@@ -6,9 +6,61 @@
6
6
  * compileTaskPolicy() in src/cron/compile-task-policy.ts. The key
7
7
  * difference is constitutionKind: 'constitution' (broad principles)
8
8
  * vs 'task-policy' (task-specific whitelist).
9
+ *
10
+ * This is the SANCTIONED pipeline value-import seam (see
11
+ * test/pipeline-import-boundary.test.ts + the ESLint no-restricted-imports
12
+ * rule). It is reached ONLY via `await import(...)` from
13
+ * persona-compile-orchestrator.ts; nothing on the live runtime path imports it
14
+ * statically.
9
15
  */
16
+ import { type PipelineModels } from '../pipeline/pipeline-runner.js';
10
17
  import type { PersonaName } from './types.js';
11
- import type { CompiledPolicyFile } from '../pipeline/types.js';
18
+ import type { CompiledPolicyFile, DynamicListsFile } from '../pipeline/types.js';
19
+ import type { ServerProgressReporter } from '../pipeline/pipeline-shared.js';
20
+ /**
21
+ * Options for a streamed persona compile (Phase 1b). Threads the long-running
22
+ * concerns through to `PipelineRunner.run`. All fields are optional; absent =>
23
+ * the legacy CLI behavior (no reporter factory, no signal, not quiet, MCP lists
24
+ * allowed, workspace-bound allowedDirectory).
25
+ */
26
+ export interface CompilePersonaOptions {
27
+ /** Per-server progress reporter factory (the EventBusProgressReporter). */
28
+ readonly reporterFactory?: (serverName: string) => ServerProgressReporter;
29
+ /** Cooperative cancellation (wall-clock cap / shutdown). */
30
+ readonly signal?: AbortSignal;
31
+ /** Suppress narrative stderr; requires a reporterFactory. */
32
+ readonly quiet?: boolean;
33
+ /**
34
+ * Operation id used to scope the per-op LLM interaction log to
35
+ * `generated/llm-interactions/<operationId>.jsonl`.
36
+ */
37
+ readonly operationId?: string;
38
+ /**
39
+ * Whether the list resolver may connect to live MCP servers. The WS path
40
+ * passes false (no live MCP) so MCP-backed lists fail fast.
41
+ */
42
+ readonly allowMcpLists?: boolean;
43
+ /**
44
+ * Sandbox boundary for structural invariant checks. Defaults to the
45
+ * persona's workspace dir (stable, persona-bound). Per spike A9 this is for
46
+ * cache/log stability only — it is NOT the runtime containment authority.
47
+ */
48
+ readonly allowedDirectory?: string;
49
+ /**
50
+ * Optional validation hook invoked on the in-memory compiled policy BEFORE any
51
+ * artifact is written (threads through to `PipelineRunner.run`). Throwing
52
+ * rejects the compile and leaves prior artifacts intact. Phase 1c uses this to
53
+ * enforce the broad-policy invariant (reject `'*'` domains/lists or
54
+ * out-of-workspace `paths.within` unless the persona is opted in).
55
+ */
56
+ readonly validateCompiled?: (policy: CompiledPolicyFile, dynamicLists?: DynamicListsFile) => void;
57
+ /**
58
+ * TEST-ONLY injection seam: pre-built PipelineModels (fake LLM). When absent,
59
+ * `createPipelineModels` is called (real provider). Production callers never
60
+ * pass this.
61
+ */
62
+ readonly models?: PipelineModels;
63
+ }
12
64
  /**
13
65
  * Compiles a persona's constitution.md into policy rules, writing
14
66
  * output to the persona's generated/ directory.
@@ -18,4 +70,4 @@ import type { CompiledPolicyFile } from '../pipeline/types.js';
18
70
  * allowlist, only filtered servers are passed to the pipeline so the
19
71
  * compiled policy only references relevant tools.
20
72
  */
21
- export declare function compilePersonaPolicy(name: PersonaName): Promise<CompiledPolicyFile>;
73
+ export declare function compilePersonaPolicy(name: PersonaName, opts?: CompilePersonaOptions): Promise<CompiledPolicyFile>;
@@ -6,12 +6,19 @@
6
6
  * compileTaskPolicy() in src/cron/compile-task-policy.ts. The key
7
7
  * difference is constitutionKind: 'constitution' (broad principles)
8
8
  * vs 'task-policy' (task-specific whitelist).
9
+ *
10
+ * This is the SANCTIONED pipeline value-import seam (see
11
+ * test/pipeline-import-boundary.test.ts + the ESLint no-restricted-imports
12
+ * rule). It is reached ONLY via `await import(...)` from
13
+ * persona-compile-orchestrator.ts; nothing on the live runtime path imports it
14
+ * statically.
9
15
  */
10
16
  import { readFileSync } from 'node:fs';
17
+ import { resolve } from 'node:path';
11
18
  import { PipelineRunner, createPipelineModels } from '../pipeline/pipeline-runner.js';
12
19
  import { loadConfig, getPackageGeneratedDir } from '../config/index.js';
13
20
  import { getUserGeneratedDir } from '../config/paths.js';
14
- import { getPersonaConstitutionPath, getPersonaGeneratedDir, loadPersona, applyServerAllowlist } from './resolve.js';
21
+ import { getPersonaConstitutionPath, getPersonaGeneratedDir, getPersonaWorkspaceDir, loadPersona, applyServerAllowlist, } from './resolve.js';
15
22
  /**
16
23
  * Compiles a persona's constitution.md into policy rules, writing
17
24
  * output to the persona's generated/ directory.
@@ -21,13 +28,23 @@ import { getPersonaConstitutionPath, getPersonaGeneratedDir, loadPersona, applyS
21
28
  * allowlist, only filtered servers are passed to the pipeline so the
22
29
  * compiled policy only references relevant tools.
23
30
  */
24
- export async function compilePersonaPolicy(name) {
31
+ export async function compilePersonaPolicy(name, opts = {}) {
25
32
  const config = loadConfig();
26
33
  const outputDir = getPersonaGeneratedDir(name);
27
34
  const constitutionPath = getPersonaConstitutionPath(name);
28
35
  const constitutionText = readFileSync(constitutionPath, 'utf-8');
29
36
  const annotationsDir = getUserGeneratedDir();
30
- const models = await createPipelineModels(outputDir);
37
+ // Per-operation LLM log path when an operationId is supplied:
38
+ // `generated/llm-interactions/<operationId>.jsonl`. The pipeline truncates the
39
+ // file when it initializes the log (createLlmLoggingMiddleware -> initLogFile)
40
+ // and appends thereafter; because the operationId is interpolated into the
41
+ // FILENAME (not just used as a presence check), each compile writes to its own
42
+ // fresh file, so concurrent/successive compiles of the same persona never
43
+ // co-mingle or clobber one another. Without an operationId, the pipeline
44
+ // default (`<outputDir>/llm-interactions.jsonl`) applies.
45
+ const logDir = opts.operationId ? resolve(outputDir, 'llm-interactions') : outputDir;
46
+ const logFileName = opts.operationId ? `${opts.operationId}.jsonl` : undefined;
47
+ const models = opts.models ?? (await createPipelineModels(logDir, logFileName));
31
48
  const runner = new PipelineRunner(models);
32
49
  // Apply server allowlist if the persona specifies one
33
50
  let mcpServers = config.mcpServers;
@@ -35,17 +52,25 @@ export async function compilePersonaPolicy(name) {
35
52
  if (persona.servers) {
36
53
  mcpServers = applyServerAllowlist(mcpServers, persona.servers);
37
54
  }
55
+ // allowedDirectory defaults to the persona workspace dir (stable, persona-
56
+ // bound) rather than the daemon's process.env.ALLOWED_DIRECTORY fallback.
57
+ const allowedDirectory = opts.allowedDirectory ?? getPersonaWorkspaceDir(name);
38
58
  return runner.run({
39
59
  constitutionInput: constitutionText,
40
60
  constitutionKind: 'constitution',
41
61
  outputDir,
42
62
  toolAnnotationsDir: annotationsDir,
43
63
  toolAnnotationsFallbackDir: getPackageGeneratedDir(),
44
- allowedDirectory: config.allowedDirectory,
64
+ allowedDirectory,
45
65
  protectedPaths: config.protectedPaths,
46
66
  mcpServers,
47
67
  includeHandwrittenScenarios: false,
48
68
  prefilterText: constitutionText,
69
+ ...(opts.reporterFactory ? { reporterFactory: opts.reporterFactory } : {}),
70
+ ...(opts.signal ? { signal: opts.signal } : {}),
71
+ ...(opts.quiet !== undefined ? { quiet: opts.quiet } : {}),
72
+ ...(opts.allowMcpLists !== undefined ? { allowMcpLists: opts.allowMcpLists } : {}),
73
+ ...(opts.validateCompiled ? { validateCompiled: opts.validateCompiled } : {}),
49
74
  });
50
75
  }
51
76
  //# sourceMappingURL=compile-persona-policy.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"compile-persona-policy.js","sourceRoot":"","sources":["../../src/persona/compile-persona-policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtF,OAAO,EAAE,UAAU,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,0BAA0B,EAAE,sBAAsB,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAIrH;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,IAAiB;IAC1D,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,SAAS,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,gBAAgB,GAAG,0BAA0B,CAAC,IAAI,CAAC,CAAC;IAC1D,MAAM,gBAAgB,GAAG,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;IACjE,MAAM,cAAc,GAAG,mBAAmB,EAAE,CAAC;IAC7C,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,SAAS,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;IAE1C,sDAAsD;IACtD,IAAI,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IACnC,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,UAAU,GAAG,oBAAoB,CAAC,UAAU,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACjE,CAAC;IAED,OAAO,MAAM,CAAC,GAAG,CAAC;QAChB,iBAAiB,EAAE,gBAAgB;QACnC,gBAAgB,EAAE,cAAc;QAChC,SAAS;QACT,kBAAkB,EAAE,cAAc;QAClC,0BAA0B,EAAE,sBAAsB,EAAE;QACpD,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;QACzC,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,UAAU;QACV,2BAA2B,EAAE,KAAK;QAClC,aAAa,EAAE,gBAAgB;KAChC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"compile-persona-policy.js","sourceRoot":"","sources":["../../src/persona/compile-persona-policy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * src/persona/event-bus-progress-reporter.ts
3
+ *
4
+ * Bridges the pipeline's per-server {@link ServerProgressReporter} contract to
5
+ * the daemon's persona-compile operation record + WS event bus (Phase 1b, §4.2).
6
+ *
7
+ * The reporter is created per server via the `reporterFactory` injected into
8
+ * `PipelineRunConfig`. On every phase transition it:
9
+ * 1. writes the live `{ serverName, compilationPhase, detail }` into the
10
+ * active operation record (the SNAPSHOT — the source of truth, so a
11
+ * reconnecting client renders the current phase from one `listCompiles`
12
+ * call), THEN
13
+ * 2. emits the best-effort / lossy `persona.compile.progress` event (which
14
+ * only reaches currently-open WS clients).
15
+ *
16
+ * ZERO runtime value-imports from src/pipeline — the `ServerProgressReporter` /
17
+ * `CompilationPhase` contracts are TYPE-ONLY imports. Enforced by the Phase-0
18
+ * ESLint no-restricted-imports rule + test/pipeline-import-boundary.test.ts.
19
+ *
20
+ * @see docs/designs/web-ui-policy-persona-management.md §4.2
21
+ */
22
+ import type { ServerProgressReporter, CompilationPhase } from '../pipeline/pipeline-shared.js';
23
+ /** Live server-progress snapshot written into the operation record. */
24
+ export interface ServerProgressSnapshot {
25
+ readonly serverName: string;
26
+ readonly compilationPhase: CompilationPhase;
27
+ readonly detail?: string;
28
+ }
29
+ /** Wiring the reporter needs to update the snapshot and emit progress. */
30
+ export interface EventBusProgressReporterContext {
31
+ readonly operationId: string;
32
+ readonly personaName: string;
33
+ readonly serverName: string;
34
+ /** Emit the (best-effort) progress event. */
35
+ readonly emit: (progress: {
36
+ name: string;
37
+ operationId: string;
38
+ serverName: string;
39
+ phase: CompilationPhase;
40
+ detail?: string;
41
+ }) => void;
42
+ /** Write the live phase into the active operation record (source of truth). */
43
+ readonly snapshotUpdate: (snapshot: ServerProgressSnapshot) => void;
44
+ }
45
+ /**
46
+ * `ServerProgressReporter` implementation that drives the operation-record
47
+ * snapshot first, then emits a progress event.
48
+ */
49
+ export declare class EventBusProgressReporter implements ServerProgressReporter {
50
+ private readonly ctx;
51
+ constructor(ctx: EventBusProgressReporterContext);
52
+ update(phase: CompilationPhase, detail?: string): void;
53
+ complete(phase: CompilationPhase, summary: string, elapsed: number): void;
54
+ warn(message: string): void;
55
+ fail(phase: CompilationPhase, error: Error): void;
56
+ done(summary: string): void;
57
+ }
@@ -0,0 +1,66 @@
1
+ /**
2
+ * src/persona/event-bus-progress-reporter.ts
3
+ *
4
+ * Bridges the pipeline's per-server {@link ServerProgressReporter} contract to
5
+ * the daemon's persona-compile operation record + WS event bus (Phase 1b, §4.2).
6
+ *
7
+ * The reporter is created per server via the `reporterFactory` injected into
8
+ * `PipelineRunConfig`. On every phase transition it:
9
+ * 1. writes the live `{ serverName, compilationPhase, detail }` into the
10
+ * active operation record (the SNAPSHOT — the source of truth, so a
11
+ * reconnecting client renders the current phase from one `listCompiles`
12
+ * call), THEN
13
+ * 2. emits the best-effort / lossy `persona.compile.progress` event (which
14
+ * only reaches currently-open WS clients).
15
+ *
16
+ * ZERO runtime value-imports from src/pipeline — the `ServerProgressReporter` /
17
+ * `CompilationPhase` contracts are TYPE-ONLY imports. Enforced by the Phase-0
18
+ * ESLint no-restricted-imports rule + test/pipeline-import-boundary.test.ts.
19
+ *
20
+ * @see docs/designs/web-ui-policy-persona-management.md §4.2
21
+ */
22
+ /**
23
+ * `ServerProgressReporter` implementation that drives the operation-record
24
+ * snapshot first, then emits a progress event.
25
+ */
26
+ export class EventBusProgressReporter {
27
+ ctx;
28
+ constructor(ctx) {
29
+ this.ctx = ctx;
30
+ }
31
+ update(phase, detail) {
32
+ // 1) snapshot = source of truth — write BEFORE emitting.
33
+ this.ctx.snapshotUpdate({
34
+ serverName: this.ctx.serverName,
35
+ compilationPhase: phase,
36
+ ...(detail ? { detail } : {}),
37
+ });
38
+ // 2) best-effort, lossy progress event.
39
+ this.ctx.emit({
40
+ name: this.ctx.personaName,
41
+ operationId: this.ctx.operationId,
42
+ serverName: this.ctx.serverName,
43
+ phase,
44
+ ...(detail ? { detail } : {}),
45
+ });
46
+ }
47
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars -- interface conformance (elapsed unused)
48
+ complete(phase, summary, elapsed) {
49
+ this.update(phase, summary);
50
+ }
51
+ warn(message) {
52
+ // Route applyServerAllowlist-style warnings as progress, not stderr.
53
+ this.update('compiling', message);
54
+ }
55
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars -- interface conformance
56
+ fail(phase, error) {
57
+ // The terminal `persona.compile.failed` event is emitted by the
58
+ // orchestrator's finally block; nothing to do here.
59
+ }
60
+ done(summary) {
61
+ // The terminal `persona.compile.done` event is emitted by the
62
+ // orchestrator's finally block; reflect the final phase in the snapshot.
63
+ this.update('done', summary);
64
+ }
65
+ }
66
+ //# sourceMappingURL=event-bus-progress-reporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-bus-progress-reporter.js","sourceRoot":"","sources":["../../src/persona/event-bus-progress-reporter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AA4BH;;;GAGG;AACH,MAAM,OAAO,wBAAwB;IACN;IAA7B,YAA6B,GAAoC;QAApC,QAAG,GAAH,GAAG,CAAiC;IAAG,CAAC;IAErE,MAAM,CAAC,KAAuB,EAAE,MAAe;QAC7C,yDAAyD;QACzD,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC;YACtB,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU;YAC/B,gBAAgB,EAAE,KAAK;YACvB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9B,CAAC,CAAC;QACH,wCAAwC;QACxC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW;YAC1B,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW;YACjC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU;YAC/B,KAAK;YACL,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9B,CAAC,CAAC;IACL,CAAC;IAED,uGAAuG;IACvG,QAAQ,CAAC,KAAuB,EAAE,OAAe,EAAE,OAAe;QAChE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED,IAAI,CAAC,OAAe;QAClB,qEAAqE;QACrE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACpC,CAAC;IAED,sFAAsF;IACtF,IAAI,CAAC,KAAuB,EAAE,KAAY;QACxC,gEAAgE;QAChE,oDAAoD;IACtD,CAAC;IAED,IAAI,CAAC,OAAe;QAClB,8DAA8D;QAC9D,yEAAyE;QACzE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,CAAC;CACF"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Loader-aware memory-gate wrapper for callers that have only a persona
3
+ * NAME in scope (e.g., the workflow orchestrator at relay-derivation
4
+ * time).
5
+ *
6
+ * Lives in `src/persona/` (not `src/memory/`) to avoid closing a
7
+ * `memory/ -> persona/ -> memory/` import cycle: `loadPersona` lives
8
+ * in `src/persona/resolve.ts`, which already imports from
9
+ * `src/memory/memory-annotations.ts`.
10
+ */
11
+ import type { ResolvedUserConfig } from '../config/user-config.js';
12
+ /**
13
+ * Loads the persona definition by name and runs the memory gate.
14
+ *
15
+ * Fail-closed: if the persona file is missing or malformed (loadPersona
16
+ * throws), returns false. The orchestrator should not spawn a memory
17
+ * relay for a persona it cannot load.
18
+ */
19
+ export declare function isMemoryEnabledForPersonaName(name: string, userConfig: ResolvedUserConfig): boolean;
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Loader-aware memory-gate wrapper for callers that have only a persona
3
+ * NAME in scope (e.g., the workflow orchestrator at relay-derivation
4
+ * time).
5
+ *
6
+ * Lives in `src/persona/` (not `src/memory/`) to avoid closing a
7
+ * `memory/ -> persona/ -> memory/` import cycle: `loadPersona` lives
8
+ * in `src/persona/resolve.ts`, which already imports from
9
+ * `src/memory/memory-annotations.ts`.
10
+ */
11
+ import { isMemoryEnabledFor } from '../memory/memory-policy.js';
12
+ import { loadPersona } from './resolve.js';
13
+ import { createPersonaName } from './types.js';
14
+ /**
15
+ * Loads the persona definition by name and runs the memory gate.
16
+ *
17
+ * Fail-closed: if the persona file is missing or malformed (loadPersona
18
+ * throws), returns false. The orchestrator should not spawn a memory
19
+ * relay for a persona it cannot load.
20
+ */
21
+ export function isMemoryEnabledForPersonaName(name, userConfig) {
22
+ if (!userConfig.memory.enabled)
23
+ return false;
24
+ let persona;
25
+ try {
26
+ persona = loadPersona(createPersonaName(name));
27
+ }
28
+ catch {
29
+ return false;
30
+ }
31
+ return isMemoryEnabledFor({ persona, userConfig });
32
+ }
33
+ //# sourceMappingURL=memory-gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-gate.js","sourceRoot":"","sources":["../../src/persona/memory-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAA0B,MAAM,YAAY,CAAC;AAEvE;;;;;;GAMG;AACH,MAAM,UAAU,6BAA6B,CAAC,IAAY,EAAE,UAA8B;IACxF,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC7C,IAAI,OAA0B,CAAC;IAC/B,IAAI,CAAC;QACH,OAAO,GAAG,WAAW,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,kBAAkB,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;AACrD,CAAC"}