@provos/ironcurtain 0.10.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (467) hide show
  1. package/README.md +60 -8
  2. package/dist/auth/oauth-provider.js +1 -4
  3. package/dist/auth/oauth-provider.js.map +1 -1
  4. package/dist/cli.js +38 -0
  5. package/dist/cli.js.map +1 -1
  6. package/dist/config/config-command.js +162 -7
  7. package/dist/config/config-command.js.map +1 -1
  8. package/dist/config/first-start.js +61 -0
  9. package/dist/config/first-start.js.map +1 -1
  10. package/dist/config/generated/compiled-policy.json +528 -161
  11. package/dist/config/generated/test-scenarios.json +4810 -170
  12. package/dist/config/generated/tool-annotations.json +34 -47
  13. package/dist/config/index.d.ts +58 -0
  14. package/dist/config/index.js +97 -15
  15. package/dist/config/index.js.map +1 -1
  16. package/dist/config/mcp-servers.json +2 -2
  17. package/dist/config/paths.d.ts +175 -0
  18. package/dist/config/paths.js +308 -14
  19. package/dist/config/paths.js.map +1 -1
  20. package/dist/config/types.d.ts +7 -1
  21. package/dist/config/user-config.d.ts +53 -5
  22. package/dist/config/user-config.js +96 -30
  23. package/dist/config/user-config.js.map +1 -1
  24. package/dist/config/validate-policy-dir.d.ts +10 -0
  25. package/dist/config/validate-policy-dir.js +59 -0
  26. package/dist/config/validate-policy-dir.js.map +1 -0
  27. package/dist/cron/job-commands.js +22 -2
  28. package/dist/cron/job-commands.js.map +1 -1
  29. package/dist/cron/types.d.ts +16 -2
  30. package/dist/cron/types.js +1 -3
  31. package/dist/cron/types.js.map +1 -1
  32. package/dist/daemon/daemon-command.js +16 -2
  33. package/dist/daemon/daemon-command.js.map +1 -1
  34. package/dist/daemon/ironcurtain-daemon.d.ts +44 -1
  35. package/dist/daemon/ironcurtain-daemon.js +210 -8
  36. package/dist/daemon/ironcurtain-daemon.js.map +1 -1
  37. package/dist/docker/adapters/claude-code.js +194 -20
  38. package/dist/docker/adapters/claude-code.js.map +1 -1
  39. package/dist/docker/adapters/goose.d.ts +12 -11
  40. package/dist/docker/adapters/goose.js +80 -27
  41. package/dist/docker/adapters/goose.js.map +1 -1
  42. package/dist/docker/agent-adapter.d.ts +178 -4
  43. package/dist/docker/agent-adapter.js +14 -0
  44. package/dist/docker/agent-adapter.js.map +1 -1
  45. package/dist/docker/code-mode-proxy.d.ts +27 -0
  46. package/dist/docker/code-mode-proxy.js +3 -0
  47. package/dist/docker/code-mode-proxy.js.map +1 -1
  48. package/dist/docker/docker-agent-session.d.ts +113 -62
  49. package/dist/docker/docker-agent-session.js +242 -294
  50. package/dist/docker/docker-agent-session.js.map +1 -1
  51. package/dist/docker/docker-infrastructure.d.ts +246 -21
  52. package/dist/docker/docker-infrastructure.js +520 -29
  53. package/dist/docker/docker-infrastructure.js.map +1 -1
  54. package/dist/docker/docker-manager.d.ts +36 -1
  55. package/dist/docker/docker-manager.js +135 -30
  56. package/dist/docker/docker-manager.js.map +1 -1
  57. package/dist/docker/docker-progress-sink.d.ts +43 -0
  58. package/dist/docker/docker-progress-sink.js +299 -0
  59. package/dist/docker/docker-progress-sink.js.map +1 -0
  60. package/dist/docker/mitm-proxy.d.ts +84 -1
  61. package/dist/docker/mitm-proxy.js +380 -18
  62. package/dist/docker/mitm-proxy.js.map +1 -1
  63. package/dist/docker/oauth-credentials.d.ts +46 -3
  64. package/dist/docker/oauth-credentials.js +56 -14
  65. package/dist/docker/oauth-credentials.js.map +1 -1
  66. package/dist/docker/oauth-token-manager.js +2 -2
  67. package/dist/docker/oauth-token-manager.js.map +1 -1
  68. package/dist/docker/orientation.d.ts +1 -1
  69. package/dist/docker/provider-config.d.ts +49 -2
  70. package/dist/docker/provider-config.js +202 -28
  71. package/dist/docker/provider-config.js.map +1 -1
  72. package/dist/docker/proxy-tools.d.ts +0 -2
  73. package/dist/docker/proxy-tools.js +2 -7
  74. package/dist/docker/proxy-tools.js.map +1 -1
  75. package/dist/docker/pty-session.d.ts +49 -1
  76. package/dist/docker/pty-session.js +199 -69
  77. package/dist/docker/pty-session.js.map +1 -1
  78. package/dist/docker/pty-types.d.ts +0 -2
  79. package/dist/docker/pty-types.js +0 -2
  80. package/dist/docker/pty-types.js.map +1 -1
  81. package/dist/docker/resource-limits.d.ts +125 -0
  82. package/dist/docker/resource-limits.js +200 -0
  83. package/dist/docker/resource-limits.js.map +1 -0
  84. package/dist/docker/spawn-with-idle-timeout.d.ts +39 -0
  85. package/dist/docker/spawn-with-idle-timeout.js +152 -0
  86. package/dist/docker/spawn-with-idle-timeout.js.map +1 -0
  87. package/dist/docker/sse-extractor.d.ts +51 -0
  88. package/dist/docker/sse-extractor.js +303 -0
  89. package/dist/docker/sse-extractor.js.map +1 -0
  90. package/dist/docker/token-stream-bus.d.ts +83 -0
  91. package/dist/docker/token-stream-bus.js +98 -0
  92. package/dist/docker/token-stream-bus.js.map +1 -0
  93. package/dist/docker/token-stream-types.d.ts +71 -0
  94. package/dist/docker/token-stream-types.js +8 -0
  95. package/dist/docker/token-stream-types.js.map +1 -0
  96. package/dist/docker/types.d.ts +53 -6
  97. package/dist/doctor/checks.d.ts +138 -0
  98. package/dist/doctor/checks.js +511 -0
  99. package/dist/doctor/checks.js.map +1 -0
  100. package/dist/doctor/doctor-command.d.ts +29 -0
  101. package/dist/doctor/doctor-command.js +160 -0
  102. package/dist/doctor/doctor-command.js.map +1 -0
  103. package/dist/doctor/mcp-liveness.d.ts +28 -0
  104. package/dist/doctor/mcp-liveness.js +84 -0
  105. package/dist/doctor/mcp-liveness.js.map +1 -0
  106. package/dist/doctor/oauth-checks.d.ts +23 -0
  107. package/dist/doctor/oauth-checks.js +157 -0
  108. package/dist/doctor/oauth-checks.js.map +1 -0
  109. package/dist/doctor/output.d.ts +26 -0
  110. package/dist/doctor/output.js +82 -0
  111. package/dist/doctor/output.js.map +1 -0
  112. package/dist/escalation/listener-command.js +0 -3
  113. package/dist/escalation/listener-command.js.map +1 -1
  114. package/dist/event-bus/typed-event-bus.d.ts +26 -0
  115. package/dist/event-bus/typed-event-bus.js +35 -0
  116. package/dist/event-bus/typed-event-bus.js.map +1 -0
  117. package/dist/index.js +24 -9
  118. package/dist/index.js.map +1 -1
  119. package/dist/logger.js +31 -2
  120. package/dist/logger.js.map +1 -1
  121. package/dist/memory/auto-save.d.ts +18 -4
  122. package/dist/memory/auto-save.js +46 -6
  123. package/dist/memory/auto-save.js.map +1 -1
  124. package/dist/memory/memory-policy.d.ts +41 -0
  125. package/dist/memory/memory-policy.js +36 -0
  126. package/dist/memory/memory-policy.js.map +1 -0
  127. package/dist/mux/mux-command.d.ts +10 -1
  128. package/dist/mux/mux-command.js +56 -35
  129. package/dist/mux/mux-command.js.map +1 -1
  130. package/dist/mux/mux-renderer.js +2 -12
  131. package/dist/mux/mux-renderer.js.map +1 -1
  132. package/dist/mux/session-scanner.js +1 -2
  133. package/dist/mux/session-scanner.js.map +1 -1
  134. package/dist/{pipeline → observability}/llm-logger.d.ts +8 -3
  135. package/dist/{pipeline → observability}/llm-logger.js +8 -3
  136. package/dist/observability/llm-logger.js.map +1 -0
  137. package/dist/observe/observe-command.d.ts +12 -0
  138. package/dist/observe/observe-command.js +298 -0
  139. package/dist/observe/observe-command.js.map +1 -0
  140. package/dist/observe/observe-renderer.d.ts +24 -0
  141. package/dist/observe/observe-renderer.js +87 -0
  142. package/dist/observe/observe-renderer.js.map +1 -0
  143. package/dist/observe/observe-tui-rain.d.ts +42 -0
  144. package/dist/observe/observe-tui-rain.js +531 -0
  145. package/dist/observe/observe-tui-rain.js.map +1 -0
  146. package/dist/observe/observe-tui-text-panel.d.ts +46 -0
  147. package/dist/observe/observe-tui-text-panel.js +525 -0
  148. package/dist/observe/observe-tui-text-panel.js.map +1 -0
  149. package/dist/observe/observe-tui-types.d.ts +270 -0
  150. package/dist/observe/observe-tui-types.js +200 -0
  151. package/dist/observe/observe-tui-types.js.map +1 -0
  152. package/dist/observe/observe-tui-word-scorer.d.ts +143 -0
  153. package/dist/observe/observe-tui-word-scorer.js +572 -0
  154. package/dist/observe/observe-tui-word-scorer.js.map +1 -0
  155. package/dist/observe/observe-tui.d.ts +59 -0
  156. package/dist/observe/observe-tui.js +592 -0
  157. package/dist/observe/observe-tui.js.map +1 -0
  158. package/dist/persona/memory-gate.d.ts +19 -0
  159. package/dist/persona/memory-gate.js +33 -0
  160. package/dist/persona/memory-gate.js.map +1 -0
  161. package/dist/persona/persona-command.js +41 -6
  162. package/dist/persona/persona-command.js.map +1 -1
  163. package/dist/persona/resolve.d.ts +22 -0
  164. package/dist/persona/resolve.js +45 -2
  165. package/dist/persona/resolve.js.map +1 -1
  166. package/dist/persona/types.d.ts +16 -0
  167. package/dist/pipeline/constitution-compiler.d.ts +25 -14
  168. package/dist/pipeline/constitution-compiler.js +107 -38
  169. package/dist/pipeline/constitution-compiler.js.map +1 -1
  170. package/dist/pipeline/dynamic-list-types.d.ts +3 -6
  171. package/dist/pipeline/dynamic-list-types.js +3 -16
  172. package/dist/pipeline/dynamic-list-types.js.map +1 -1
  173. package/dist/pipeline/pipeline-runner.js +89 -50
  174. package/dist/pipeline/pipeline-runner.js.map +1 -1
  175. package/dist/pipeline/pipeline-shared.d.ts +1 -1
  176. package/dist/pipeline/pipeline-shared.js +3 -11
  177. package/dist/pipeline/pipeline-shared.js.map +1 -1
  178. package/dist/pipeline/policy-verifier.js +16 -3
  179. package/dist/pipeline/policy-verifier.js.map +1 -1
  180. package/dist/pipeline/proxy-mcp-connections.js +17 -2
  181. package/dist/pipeline/proxy-mcp-connections.js.map +1 -1
  182. package/dist/pipeline/scenario-generator.d.ts +4 -8
  183. package/dist/pipeline/scenario-generator.js +13 -46
  184. package/dist/pipeline/scenario-generator.js.map +1 -1
  185. package/dist/sandbox/index.d.ts +14 -0
  186. package/dist/sandbox/index.js +335 -116
  187. package/dist/sandbox/index.js.map +1 -1
  188. package/dist/sandbox/ironcurtain-protocol.d.ts +52 -0
  189. package/dist/sandbox/ironcurtain-protocol.js +185 -0
  190. package/dist/sandbox/ironcurtain-protocol.js.map +1 -0
  191. package/dist/session/agent-session.d.ts +6 -0
  192. package/dist/session/agent-session.js +16 -5
  193. package/dist/session/agent-session.js.map +1 -1
  194. package/dist/session/cli-transport.js +0 -6
  195. package/dist/session/cli-transport.js.map +1 -1
  196. package/dist/session/index.d.ts +35 -14
  197. package/dist/session/index.js +324 -130
  198. package/dist/session/index.js.map +1 -1
  199. package/dist/session/preflight.d.ts +50 -13
  200. package/dist/session/preflight.js +252 -80
  201. package/dist/session/preflight.js.map +1 -1
  202. package/dist/session/prompts.d.ts +2 -5
  203. package/dist/session/prompts.js.map +1 -1
  204. package/dist/session/session-manager.d.ts +61 -6
  205. package/dist/session/session-manager.js +72 -10
  206. package/dist/session/session-manager.js.map +1 -1
  207. package/dist/session/session-metadata.d.ts +21 -5
  208. package/dist/session/session-metadata.js +34 -12
  209. package/dist/session/session-metadata.js.map +1 -1
  210. package/dist/session/types.d.ts +311 -5
  211. package/dist/session/types.js +57 -1
  212. package/dist/session/types.js.map +1 -1
  213. package/dist/signal/setup-signal.js +13 -21
  214. package/dist/signal/setup-signal.js.map +1 -1
  215. package/dist/signal/signal-bot-daemon.d.ts +16 -1
  216. package/dist/signal/signal-bot-daemon.js +39 -27
  217. package/dist/signal/signal-bot-daemon.js.map +1 -1
  218. package/dist/signal/signal-container.js +7 -1
  219. package/dist/signal/signal-container.js.map +1 -1
  220. package/dist/skills/discovery.d.ts +77 -0
  221. package/dist/skills/discovery.js +206 -0
  222. package/dist/skills/discovery.js.map +1 -0
  223. package/dist/skills/index.d.ts +4 -0
  224. package/dist/skills/index.js +3 -0
  225. package/dist/skills/index.js.map +1 -0
  226. package/dist/skills/staging.d.ts +28 -0
  227. package/dist/skills/staging.js +68 -0
  228. package/dist/skills/staging.js.map +1 -0
  229. package/dist/skills/types.d.ts +46 -0
  230. package/dist/skills/types.js +2 -0
  231. package/dist/skills/types.js.map +1 -0
  232. package/dist/trusted-process/approval-whitelist.d.ts +0 -2
  233. package/dist/trusted-process/approval-whitelist.js +17 -17
  234. package/dist/trusted-process/approval-whitelist.js.map +1 -1
  235. package/dist/trusted-process/async-mutex.d.ts +32 -0
  236. package/dist/trusted-process/async-mutex.js +50 -0
  237. package/dist/trusted-process/async-mutex.js.map +1 -0
  238. package/dist/trusted-process/audit-log.d.ts +38 -1
  239. package/dist/trusted-process/audit-log.js +82 -13
  240. package/dist/trusted-process/audit-log.js.map +1 -1
  241. package/dist/trusted-process/call-circuit-breaker.js +2 -1
  242. package/dist/trusted-process/call-circuit-breaker.js.map +1 -1
  243. package/dist/trusted-process/control-server.d.ts +101 -0
  244. package/dist/trusted-process/control-server.js +282 -0
  245. package/dist/trusted-process/control-server.js.map +1 -0
  246. package/dist/trusted-process/domain-utils.d.ts +6 -6
  247. package/dist/trusted-process/domain-utils.js +7 -23
  248. package/dist/trusted-process/domain-utils.js.map +1 -1
  249. package/dist/trusted-process/error-prefixes.d.ts +16 -0
  250. package/dist/trusted-process/error-prefixes.js +17 -0
  251. package/dist/trusted-process/error-prefixes.js.map +1 -0
  252. package/dist/trusted-process/index.d.ts +40 -23
  253. package/dist/trusted-process/index.js +131 -225
  254. package/dist/trusted-process/index.js.map +1 -1
  255. package/dist/trusted-process/list-matcher.d.ts +17 -0
  256. package/dist/trusted-process/list-matcher.js +31 -0
  257. package/dist/trusted-process/list-matcher.js.map +1 -0
  258. package/dist/trusted-process/mcp-client-manager.d.ts +35 -6
  259. package/dist/trusted-process/mcp-client-manager.js +40 -45
  260. package/dist/trusted-process/mcp-client-manager.js.map +1 -1
  261. package/dist/trusted-process/mcp-proxy-server.d.ts +31 -120
  262. package/dist/trusted-process/mcp-proxy-server.js +166 -657
  263. package/dist/trusted-process/mcp-proxy-server.js.map +1 -1
  264. package/dist/trusted-process/policy-engine.d.ts +16 -4
  265. package/dist/trusted-process/policy-engine.js +90 -45
  266. package/dist/trusted-process/policy-engine.js.map +1 -1
  267. package/dist/trusted-process/policy-roots.d.ts +6 -0
  268. package/dist/trusted-process/policy-roots.js +20 -0
  269. package/dist/trusted-process/policy-roots.js.map +1 -1
  270. package/dist/trusted-process/sandbox-integration.d.ts +12 -0
  271. package/dist/trusted-process/sandbox-integration.js +18 -0
  272. package/dist/trusted-process/sandbox-integration.js.map +1 -1
  273. package/dist/trusted-process/tool-call-coordinator.d.ts +269 -0
  274. package/dist/trusted-process/tool-call-coordinator.js +508 -0
  275. package/dist/trusted-process/tool-call-coordinator.js.map +1 -0
  276. package/dist/trusted-process/tool-call-pipeline.d.ts +205 -0
  277. package/dist/trusted-process/tool-call-pipeline.js +798 -0
  278. package/dist/trusted-process/tool-call-pipeline.js.map +1 -0
  279. package/dist/trusted-process/tool-description-hints.d.ts +1 -1
  280. package/dist/types/argument-roles.d.ts +1 -1
  281. package/dist/types/argument-roles.js +14 -1
  282. package/dist/types/argument-roles.js.map +1 -1
  283. package/dist/types/audit.d.ts +9 -0
  284. package/dist/{session → types}/errors.d.ts +8 -2
  285. package/dist/{session → types}/errors.js +8 -2
  286. package/dist/types/errors.js.map +1 -0
  287. package/dist/types/reserved-servers.d.ts +11 -0
  288. package/dist/types/reserved-servers.js +12 -0
  289. package/dist/types/reserved-servers.js.map +1 -0
  290. package/dist/types/server-listing.d.ts +14 -0
  291. package/dist/types/server-listing.js +2 -0
  292. package/dist/types/server-listing.js.map +1 -0
  293. package/dist/types/slug.d.ts +2 -0
  294. package/dist/types/slug.js +2 -0
  295. package/dist/types/slug.js.map +1 -1
  296. package/dist/types/url-normalize.d.ts +16 -0
  297. package/dist/types/url-normalize.js +33 -0
  298. package/dist/types/url-normalize.js.map +1 -0
  299. package/dist/utils/error-message.d.ts +8 -0
  300. package/dist/utils/error-message.js +11 -0
  301. package/dist/utils/error-message.js.map +1 -0
  302. package/dist/utils/exec-error.d.ts +19 -0
  303. package/dist/utils/exec-error.js +16 -0
  304. package/dist/utils/exec-error.js.map +1 -0
  305. package/dist/utils/is-plain-object.d.ts +7 -0
  306. package/dist/utils/is-plain-object.js +12 -0
  307. package/dist/utils/is-plain-object.js.map +1 -0
  308. package/dist/utils/preflight-checks.d.ts +16 -0
  309. package/dist/utils/preflight-checks.js +178 -0
  310. package/dist/utils/preflight-checks.js.map +1 -0
  311. package/dist/web-ui/__tests__/json-rpc-dispatch.test.d.ts +7 -0
  312. package/dist/web-ui/__tests__/json-rpc-dispatch.test.js +725 -0
  313. package/dist/web-ui/__tests__/json-rpc-dispatch.test.js.map +1 -0
  314. package/dist/web-ui/dispatch/escalation-dispatch.d.ts +7 -0
  315. package/dist/web-ui/dispatch/escalation-dispatch.js +52 -0
  316. package/dist/web-ui/dispatch/escalation-dispatch.js.map +1 -0
  317. package/dist/web-ui/dispatch/job-dispatch.d.ts +8 -0
  318. package/dist/web-ui/dispatch/job-dispatch.js +83 -0
  319. package/dist/web-ui/dispatch/job-dispatch.js.map +1 -0
  320. package/dist/web-ui/dispatch/persona-dispatch.d.ts +6 -0
  321. package/dist/web-ui/dispatch/persona-dispatch.js +116 -0
  322. package/dist/web-ui/dispatch/persona-dispatch.js.map +1 -0
  323. package/dist/web-ui/dispatch/session-dispatch.d.ts +9 -0
  324. package/dist/web-ui/dispatch/session-dispatch.js +201 -0
  325. package/dist/web-ui/dispatch/session-dispatch.js.map +1 -0
  326. package/dist/web-ui/dispatch/token-stream-dispatch.d.ts +15 -0
  327. package/dist/web-ui/dispatch/token-stream-dispatch.js +55 -0
  328. package/dist/web-ui/dispatch/token-stream-dispatch.js.map +1 -0
  329. package/dist/web-ui/dispatch/types.d.ts +31 -0
  330. package/dist/web-ui/dispatch/types.js +68 -0
  331. package/dist/web-ui/dispatch/types.js.map +1 -0
  332. package/dist/web-ui/dispatch/workflow-dispatch.d.ts +103 -0
  333. package/dist/web-ui/dispatch/workflow-dispatch.js +925 -0
  334. package/dist/web-ui/dispatch/workflow-dispatch.js.map +1 -0
  335. package/dist/web-ui/json-rpc-dispatch.d.ts +12 -0
  336. package/dist/web-ui/json-rpc-dispatch.js +34 -0
  337. package/dist/web-ui/json-rpc-dispatch.js.map +1 -0
  338. package/dist/web-ui/state-graph.d.ts +13 -0
  339. package/dist/web-ui/state-graph.js +82 -0
  340. package/dist/web-ui/state-graph.js.map +1 -0
  341. package/dist/web-ui/token-stream-bridge.d.ts +76 -0
  342. package/dist/web-ui/token-stream-bridge.js +265 -0
  343. package/dist/web-ui/token-stream-bridge.js.map +1 -0
  344. package/dist/web-ui/web-event-bus.d.ts +152 -0
  345. package/dist/web-ui/web-event-bus.js +19 -0
  346. package/dist/web-ui/web-event-bus.js.map +1 -0
  347. package/dist/web-ui/web-session-transport.d.ts +31 -0
  348. package/dist/web-ui/web-session-transport.js +109 -0
  349. package/dist/web-ui/web-session-transport.js.map +1 -0
  350. package/dist/web-ui/web-ui-server.d.ts +76 -0
  351. package/dist/web-ui/web-ui-server.js +461 -0
  352. package/dist/web-ui/web-ui-server.js.map +1 -0
  353. package/dist/web-ui/web-ui-types.d.ts +290 -0
  354. package/dist/web-ui/web-ui-types.js +32 -0
  355. package/dist/web-ui/web-ui-types.js.map +1 -0
  356. package/dist/web-ui/ws-utils.d.ts +5 -0
  357. package/dist/web-ui/ws-utils.js +12 -0
  358. package/dist/web-ui/ws-utils.js.map +1 -0
  359. package/dist/web-ui-static/assets/index-BFO5z1js.js +76 -0
  360. package/dist/web-ui-static/assets/index-CCUwrkIL.css +1 -0
  361. package/dist/web-ui-static/assets/orbitron-latin-700-normal-4jsRXGGJ.woff2 +0 -0
  362. package/dist/web-ui-static/assets/orbitron-latin-700-normal-DmYOh-W9.woff +0 -0
  363. package/dist/web-ui-static/index.html +14 -0
  364. package/dist/workflow/artifacts.d.ts +59 -0
  365. package/dist/workflow/artifacts.js +188 -0
  366. package/dist/workflow/artifacts.js.map +1 -0
  367. package/dist/workflow/checkpoint-selection.d.ts +34 -0
  368. package/dist/workflow/checkpoint-selection.js +48 -0
  369. package/dist/workflow/checkpoint-selection.js.map +1 -0
  370. package/dist/workflow/checkpoint.d.ts +35 -0
  371. package/dist/workflow/checkpoint.js +84 -0
  372. package/dist/workflow/checkpoint.js.map +1 -0
  373. package/dist/workflow/cli-support.d.ts +92 -0
  374. package/dist/workflow/cli-support.js +423 -0
  375. package/dist/workflow/cli-support.js.map +1 -0
  376. package/dist/workflow/definition-loader.d.ts +32 -0
  377. package/dist/workflow/definition-loader.js +56 -0
  378. package/dist/workflow/definition-loader.js.map +1 -0
  379. package/dist/workflow/discovery.d.ts +78 -0
  380. package/dist/workflow/discovery.js +203 -0
  381. package/dist/workflow/discovery.js.map +1 -0
  382. package/dist/workflow/errors.d.ts +66 -0
  383. package/dist/workflow/errors.js +49 -0
  384. package/dist/workflow/errors.js.map +1 -0
  385. package/dist/workflow/guards.d.ts +8 -0
  386. package/dist/workflow/guards.js +38 -0
  387. package/dist/workflow/guards.js.map +1 -0
  388. package/dist/workflow/lint-integration.d.ts +64 -0
  389. package/dist/workflow/lint-integration.js +56 -0
  390. package/dist/workflow/lint-integration.js.map +1 -0
  391. package/dist/workflow/lint.d.ts +66 -0
  392. package/dist/workflow/lint.js +410 -0
  393. package/dist/workflow/lint.js.map +1 -0
  394. package/dist/workflow/machine-builder.d.ts +90 -0
  395. package/dist/workflow/machine-builder.js +485 -0
  396. package/dist/workflow/machine-builder.js.map +1 -0
  397. package/dist/workflow/message-log.d.ts +85 -0
  398. package/dist/workflow/message-log.js +40 -0
  399. package/dist/workflow/message-log.js.map +1 -0
  400. package/dist/workflow/orchestrator.d.ts +450 -0
  401. package/dist/workflow/orchestrator.js +1941 -0
  402. package/dist/workflow/orchestrator.js.map +1 -0
  403. package/dist/workflow/prompt-builder.d.ts +39 -0
  404. package/dist/workflow/prompt-builder.js +242 -0
  405. package/dist/workflow/prompt-builder.js.map +1 -0
  406. package/dist/workflow/run-state-command.d.ts +9 -0
  407. package/dist/workflow/run-state-command.js +414 -0
  408. package/dist/workflow/run-state-command.js.map +1 -0
  409. package/dist/workflow/run-state-debug-capture.d.ts +40 -0
  410. package/dist/workflow/run-state-debug-capture.js +101 -0
  411. package/dist/workflow/run-state-debug-capture.js.map +1 -0
  412. package/dist/workflow/status-parser.d.ts +68 -0
  413. package/dist/workflow/status-parser.js +259 -0
  414. package/dist/workflow/status-parser.js.map +1 -0
  415. package/dist/workflow/types.d.ts +498 -0
  416. package/dist/workflow/types.js +83 -0
  417. package/dist/workflow/types.js.map +1 -0
  418. package/dist/workflow/validate.d.ts +58 -0
  419. package/dist/workflow/validate.js +499 -0
  420. package/dist/workflow/validate.js.map +1 -0
  421. package/dist/workflow/workflow-command.d.ts +26 -0
  422. package/dist/workflow/workflow-command.js +648 -0
  423. package/dist/workflow/workflow-command.js.map +1 -0
  424. package/dist/workflow/workflow-discovery.d.ts +25 -0
  425. package/dist/workflow/workflow-discovery.js +100 -0
  426. package/dist/workflow/workflow-discovery.js.map +1 -0
  427. package/dist/workflow/workflow-manager.d.ts +122 -0
  428. package/dist/workflow/workflow-manager.js +308 -0
  429. package/dist/workflow/workflow-manager.js.map +1 -0
  430. package/dist/workflow/workflows/design-and-code/workflow.yaml +169 -0
  431. package/dist/workflow/workflows/test-email-summary/skills/email-formatting/SKILL.md +55 -0
  432. package/dist/workflow/workflows/test-email-summary/skills/gmail-query-syntax/SKILL.md +63 -0
  433. package/dist/workflow/workflows/test-email-summary/skills/json-schema-emails/SKILL.md +41 -0
  434. package/dist/workflow/workflows/test-email-summary/skills/json-schema-emails/schema.json +34 -0
  435. package/dist/workflow/workflows/test-email-summary/skills/summary-style-guide/SKILL.md +51 -0
  436. package/dist/workflow/workflows/test-email-summary/workflow.yaml +89 -0
  437. package/dist/workflow/workflows/vuln-discovery/skills/harness-design-fuzzing/SKILL.md +201 -0
  438. package/dist/workflow/workflows/vuln-discovery/skills/memory-safety-c-cpp/SKILL.md +166 -0
  439. package/dist/workflow/workflows/vuln-discovery/skills/vulnerability-triage/SKILL.md +185 -0
  440. package/dist/workflow/workflows/vuln-discovery/workflow.yaml +920 -0
  441. package/dist/workflow/worktree.d.ts +43 -0
  442. package/dist/workflow/worktree.js +106 -0
  443. package/dist/workflow/worktree.js.map +1 -0
  444. package/docker/Dockerfile.base +9 -0
  445. package/docker/Dockerfile.base.arm64 +9 -0
  446. package/docker/entrypoint-claude-code.sh +46 -0
  447. package/docker/entrypoint-goose.sh +25 -0
  448. package/package.json +19 -8
  449. package/packages/web-ui/README.md +113 -0
  450. package/packages/web-ui/docs/workflow-state-machine.png +0 -0
  451. package/src/config/generated/compiled-policy.json +528 -161
  452. package/src/config/generated/test-scenarios.json +4810 -170
  453. package/src/config/generated/tool-annotations.json +34 -47
  454. package/src/config/mcp-servers.json +2 -2
  455. package/src/workflow/workflows/design-and-code/workflow.yaml +169 -0
  456. package/src/workflow/workflows/test-email-summary/skills/email-formatting/SKILL.md +55 -0
  457. package/src/workflow/workflows/test-email-summary/skills/gmail-query-syntax/SKILL.md +63 -0
  458. package/src/workflow/workflows/test-email-summary/skills/json-schema-emails/SKILL.md +41 -0
  459. package/src/workflow/workflows/test-email-summary/skills/json-schema-emails/schema.json +34 -0
  460. package/src/workflow/workflows/test-email-summary/skills/summary-style-guide/SKILL.md +51 -0
  461. package/src/workflow/workflows/test-email-summary/workflow.yaml +89 -0
  462. package/src/workflow/workflows/vuln-discovery/skills/harness-design-fuzzing/SKILL.md +201 -0
  463. package/src/workflow/workflows/vuln-discovery/skills/memory-safety-c-cpp/SKILL.md +166 -0
  464. package/src/workflow/workflows/vuln-discovery/skills/vulnerability-triage/SKILL.md +185 -0
  465. package/src/workflow/workflows/vuln-discovery/workflow.yaml +920 -0
  466. package/dist/pipeline/llm-logger.js.map +0 -1
  467. package/dist/session/errors.js.map +0 -1
@@ -0,0 +1,592 @@
1
+ /**
2
+ * TUI orchestrator for the observe command.
3
+ *
4
+ * Manages the screen lifecycle (alternate buffer, cursor, raw mode),
5
+ * runs the 15fps frame loop, routes token stream events to the rain
6
+ * engine and text panel, and renders the divider and status bar.
7
+ *
8
+ * Computes the dominant agent phase across active sessions and
9
+ * communicates it to the rain engine for phase-driven color shifts.
10
+ * Uses TF-IDF scoring to select interesting words from LLM output
11
+ * and tool calls for rain panel word drops.
12
+ *
13
+ * Depends on observe-tui-types.ts, observe-tui-rain.ts,
14
+ * observe-tui-text-panel.ts, and observe-tui-word-scorer.ts.
15
+ * No external dependencies beyond Node built-ins.
16
+ */
17
+ import { truncate } from '../mux/mux-renderer.js';
18
+ import { FRAME_MS, MIN_USABLE_ROWS, SGR, calculateTuiLayout, isUtf8Locale, visibleLength, } from './observe-tui-types.js';
19
+ import { createRainEngine } from './observe-tui-rain.js';
20
+ import { createTextPanel } from './observe-tui-text-panel.js';
21
+ import { createWordScorer, createSessionWordState, processEventForWords, } from './observe-tui-word-scorer.js';
22
+ // ---------------------------------------------------------------------------
23
+ // Constants
24
+ // ---------------------------------------------------------------------------
25
+ /** Maximum visible characters for model name in status bar. */
26
+ const STATUS_MODEL_MAX_LEN = 20;
27
+ /** Maximum visible characters for tool name in status bar. */
28
+ const STATUS_TOOL_MAX_LEN = 25;
29
+ /** Frames to keep error phase active (~2 seconds at 15fps). */
30
+ const ERROR_PHASE_FRAMES = 30;
31
+ // ---------------------------------------------------------------------------
32
+ // Rain token extraction
33
+ // ---------------------------------------------------------------------------
34
+ /**
35
+ * Extract rain tokens from a single token stream event.
36
+ *
37
+ * - text_delta: each character -> RainToken kind='text'
38
+ * - tool_use: each character of toolName -> kind='tool'
39
+ * - error: each character of message -> kind='error'
40
+ * - Other event kinds produce no rain tokens.
41
+ */
42
+ export function extractRainTokens(event) {
43
+ switch (event.kind) {
44
+ case 'text_delta':
45
+ return charsToTokens(event.text, 'text');
46
+ case 'tool_use':
47
+ return charsToTokens(event.toolName, 'tool');
48
+ case 'tool_result':
49
+ // Extract a few characters from tool result content for rain effect
50
+ return charsToTokens(event.content.slice(0, 8), 'tool');
51
+ case 'error':
52
+ return charsToTokens(event.message, 'error');
53
+ default:
54
+ return [];
55
+ }
56
+ }
57
+ function charsToTokens(text, kind) {
58
+ const tokens = [];
59
+ for (const char of text) {
60
+ tokens.push({ char, kind });
61
+ }
62
+ return tokens;
63
+ }
64
+ // ---------------------------------------------------------------------------
65
+ // Session state management
66
+ // ---------------------------------------------------------------------------
67
+ function createSessionState(label) {
68
+ return {
69
+ label,
70
+ inputTokens: 0,
71
+ outputTokens: 0,
72
+ toolCount: 0,
73
+ model: null,
74
+ phase: 'idle',
75
+ lastEventTime: Date.now(),
76
+ ended: false,
77
+ endReason: null,
78
+ currentToolName: null,
79
+ };
80
+ }
81
+ /**
82
+ * Update a SessionState from a single event.
83
+ * Mutates the state in place.
84
+ */
85
+ export function updateSessionState(state, event) {
86
+ state.lastEventTime = Date.now();
87
+ switch (event.kind) {
88
+ case 'text_delta':
89
+ state.phase = 'thinking';
90
+ state.currentToolName = null;
91
+ break;
92
+ case 'tool_use':
93
+ state.phase = 'tool_use';
94
+ // Only increment toolCount for new tool calls (non-empty toolName)
95
+ if (event.toolName !== '') {
96
+ state.toolCount++;
97
+ state.currentToolName = event.toolName;
98
+ }
99
+ break;
100
+ case 'message_start':
101
+ state.model = event.model;
102
+ break;
103
+ case 'message_end':
104
+ state.inputTokens += event.inputTokens;
105
+ state.outputTokens += event.outputTokens;
106
+ state.phase = 'idle';
107
+ state.currentToolName = null;
108
+ break;
109
+ // error, tool_result, and raw events do not change phase or counters
110
+ }
111
+ }
112
+ // ---------------------------------------------------------------------------
113
+ // Dominant phase computation
114
+ // ---------------------------------------------------------------------------
115
+ /**
116
+ * Compute the dominant agent phase across all active sessions.
117
+ * Priority: error > tool_use > thinking > idle.
118
+ * Error phase is tracked separately via errorFramesRemaining.
119
+ */
120
+ export function computeDominantPhase(sessions, errorActive) {
121
+ if (errorActive)
122
+ return 'error';
123
+ let dominant = 'idle';
124
+ for (const s of sessions.values()) {
125
+ if (s.ended)
126
+ continue;
127
+ if (s.phase === 'tool_use')
128
+ dominant = 'tool_use';
129
+ if (s.phase === 'thinking' && dominant === 'idle')
130
+ dominant = 'thinking';
131
+ }
132
+ return dominant;
133
+ }
134
+ /**
135
+ * Sliding window tracker for tokens/sec computation.
136
+ * Records (timestamp, cumulativeTokens) snapshots and computes
137
+ * the rate over the most recent windowMs period.
138
+ */
139
+ export class TokenRateTracker {
140
+ windowMs;
141
+ samples = [];
142
+ constructor(windowMs = 3000) {
143
+ this.windowMs = windowMs;
144
+ }
145
+ /** Record a new snapshot of cumulative token count. */
146
+ record(now, totalTokens) {
147
+ this.samples.push({ time: now, tokens: totalTokens });
148
+ // Evict samples older than the window
149
+ const cutoff = now - this.windowMs;
150
+ while (this.samples.length > 1 && this.samples[0].time < cutoff) {
151
+ this.samples.shift();
152
+ }
153
+ }
154
+ /** Compute tokens/sec over the sliding window. */
155
+ rate() {
156
+ if (this.samples.length < 2)
157
+ return 0;
158
+ const oldest = this.samples[0];
159
+ const newest = this.samples[this.samples.length - 1];
160
+ const elapsed = (newest.time - oldest.time) / 1000;
161
+ if (elapsed <= 0)
162
+ return 0;
163
+ return (newest.tokens - oldest.tokens) / elapsed;
164
+ }
165
+ }
166
+ function computeMetrics(sessions, queueDepth, rateTracker, dominantPhase) {
167
+ let totalTokens = 0;
168
+ let activeSessions = 0;
169
+ let model = null;
170
+ let currentToolName = null;
171
+ let latestEventTime = 0;
172
+ for (const s of sessions.values()) {
173
+ totalTokens += s.inputTokens + s.outputTokens;
174
+ if (!s.ended) {
175
+ activeSessions++;
176
+ // Track model from most recently active non-ended session
177
+ if (s.model && s.lastEventTime > latestEventTime) {
178
+ model = s.model;
179
+ latestEventTime = s.lastEventTime;
180
+ }
181
+ // Track current tool name from session in tool_use phase
182
+ if (s.phase === 'tool_use' && s.currentToolName) {
183
+ currentToolName = s.currentToolName;
184
+ }
185
+ }
186
+ }
187
+ rateTracker.record(Date.now(), totalTokens);
188
+ return {
189
+ totalTokens,
190
+ activeSessions,
191
+ totalSessions: sessions.size,
192
+ queueDepth,
193
+ tokensPerSec: rateTracker.rate(),
194
+ model,
195
+ phase: dominantPhase,
196
+ currentToolName,
197
+ };
198
+ }
199
+ // ---------------------------------------------------------------------------
200
+ // Divider rendering
201
+ // ---------------------------------------------------------------------------
202
+ const BOX_VERTICAL = '\u2502'; // |
203
+ const ASCII_VERTICAL = '|';
204
+ function renderDivider(layout, utf8) {
205
+ if (layout.rainCols <= 0)
206
+ return '';
207
+ const buf = [];
208
+ const col = layout.dividerCol + 1; // 1-indexed
209
+ const char = utf8 ? BOX_VERTICAL : ASCII_VERTICAL;
210
+ for (let row = 0; row < layout.textRows; row++) {
211
+ buf.push(`\x1b[${row + 1};${col}H${SGR.DIVIDER}${char}`);
212
+ }
213
+ buf.push(SGR.RESET);
214
+ return buf.join('');
215
+ }
216
+ // ---------------------------------------------------------------------------
217
+ // Status bar rendering
218
+ // ---------------------------------------------------------------------------
219
+ export function formatTokenCount(n) {
220
+ if (n >= 1_000_000)
221
+ return `${(n / 1_000_000).toFixed(1)}M`;
222
+ if (n >= 1_000)
223
+ return `${(n / 1_000).toFixed(1)}k`;
224
+ return String(n);
225
+ }
226
+ function renderStatusBar(layout, metrics, connectionError) {
227
+ const row = layout.statusRow + 1; // 1-indexed
228
+ const sep = `${SGR.STATUS_SEPARATOR} \u2502 ${SGR.RESET}`;
229
+ if (connectionError) {
230
+ const msg = ` ${SGR.STATUS_ERROR}\u26a0 ${connectionError}${SGR.RESET}`;
231
+ const padding = Math.max(0, layout.cols - visibleLength(msg));
232
+ return `\x1b[${row};1H${SGR.STATUS_BG}${msg}${' '.repeat(padding)}${SGR.RESET}`;
233
+ }
234
+ const parts = [];
235
+ // Session count
236
+ if (metrics.totalSessions > 0) {
237
+ parts.push(`${SGR.STATUS_LABEL}sessions${SGR.RESET} ${SGR.STATUS_VALUE}${metrics.activeSessions}/${metrics.totalSessions}${SGR.RESET}`);
238
+ }
239
+ // Model name (truncated)
240
+ if (metrics.model) {
241
+ const truncModel = truncate(metrics.model, STATUS_MODEL_MAX_LEN);
242
+ parts.push(`${SGR.STATUS_VALUE}${truncModel}${SGR.RESET}`);
243
+ }
244
+ // Phase indicator with color
245
+ const phaseColor = {
246
+ thinking: SGR.STATUS_PHASE_THINKING,
247
+ tool_use: SGR.STATUS_PHASE_TOOL,
248
+ idle: SGR.STATUS_PHASE_IDLE,
249
+ error: SGR.STATUS_PHASE_ERROR,
250
+ };
251
+ const pColor = phaseColor[metrics.phase];
252
+ let phaseLabel;
253
+ if (metrics.phase === 'tool_use' && metrics.currentToolName) {
254
+ const truncTool = truncate(metrics.currentToolName, STATUS_TOOL_MAX_LEN);
255
+ phaseLabel = `TOOL: ${truncTool}`;
256
+ }
257
+ else {
258
+ phaseLabel = metrics.phase.toUpperCase();
259
+ }
260
+ parts.push(`${pColor}${phaseLabel}${SGR.RESET}`);
261
+ // Total tokens (input + output)
262
+ parts.push(`${SGR.STATUS_LABEL}tokens${SGR.RESET} ${SGR.STATUS_VALUE}${formatTokenCount(metrics.totalTokens)}${SGR.RESET}`);
263
+ // Tokens/sec rate (only when > 0)
264
+ if (metrics.tokensPerSec > 0) {
265
+ const rateStr = metrics.tokensPerSec >= 100 ? Math.round(metrics.tokensPerSec).toString() : metrics.tokensPerSec.toFixed(1);
266
+ parts.push(`${SGR.STATUS_LABEL}tok/s${SGR.RESET} ${SGR.STATUS_VALUE}${rateStr}${SGR.RESET}`);
267
+ }
268
+ // Queue depth (only when non-zero)
269
+ if (metrics.queueDepth > 0) {
270
+ parts.push(`${SGR.STATUS_LABEL}queue${SGR.RESET} ${SGR.STATUS_VALUE}${metrics.queueDepth}${SGR.RESET}`);
271
+ }
272
+ // Exit hint
273
+ parts.push(`${SGR.STATUS_HINT}Ctrl+C exit${SGR.RESET}`);
274
+ let content = ` ${parts.join(sep)} `;
275
+ // If content exceeds terminal width, drop low-priority segments
276
+ while (visibleLength(content) > layout.cols && parts.length > 3) {
277
+ // Drop second-to-last segment (queue or tok/s, before exit hint)
278
+ parts.splice(parts.length - 2, 1);
279
+ content = ` ${parts.join(sep)} `;
280
+ }
281
+ const padding = Math.max(0, layout.cols - visibleLength(content));
282
+ return `\x1b[${row};1H${SGR.STATUS_BG}${content}${' '.repeat(padding)}${SGR.RESET}`;
283
+ }
284
+ /** Read current terminal dimensions with sensible fallbacks. */
285
+ function getTerminalSize() {
286
+ return {
287
+ cols: process.stdout.columns || 80,
288
+ rows: process.stdout.rows || 24,
289
+ };
290
+ }
291
+ export function createObserveTui(options) {
292
+ const { raw, showLabel, debug } = options;
293
+ const effectiveRaw = raw || debug;
294
+ const utf8 = isUtf8Locale();
295
+ // State
296
+ const sessions = new Map();
297
+ const sessionWordStates = new Map();
298
+ const wordScorer = createWordScorer();
299
+ let started = false;
300
+ let destroyed = false;
301
+ let frameTimer = null;
302
+ let resizeTimer = null;
303
+ // Layout (initialized on start)
304
+ const { cols, rows } = getTerminalSize();
305
+ let layout = calculateTuiLayout(cols, rows);
306
+ // Sub-systems (created lazily on start)
307
+ let rainEngine;
308
+ let textPanel;
309
+ // Dirty flags for conditional rendering
310
+ let dividerDirty = true;
311
+ let textDirty = true;
312
+ let statusDirty = true;
313
+ // Cached divider ANSI string (recomputed only on resize)
314
+ let cachedDivider = '';
315
+ // Token rate tracking (3-second sliding window)
316
+ const rateTracker = new TokenRateTracker();
317
+ // Connection error state (shown in status bar)
318
+ let connectionError = null;
319
+ let connectionExitTimer = null;
320
+ let errorFramesRemaining = 0;
321
+ // Current dominant phase (cached for status bar)
322
+ let dominantPhase = 'idle';
323
+ // Signal handlers (stored for removal on destroy)
324
+ let sigintHandler = null;
325
+ let sigtermHandler = null;
326
+ let sigwinchHandler = null;
327
+ let stdinHandler = null;
328
+ // ------------------------------------------------------------------
329
+ // Phase computation helper
330
+ // ------------------------------------------------------------------
331
+ function recomputePhase() {
332
+ dominantPhase = computeDominantPhase(sessions, errorFramesRemaining > 0);
333
+ rainEngine.setPhase(dominantPhase);
334
+ }
335
+ // ------------------------------------------------------------------
336
+ // Frame loop
337
+ // ------------------------------------------------------------------
338
+ /** Schedule the next frame, yielding to I/O between frames. */
339
+ function scheduleNextFrame() {
340
+ if (destroyed)
341
+ return;
342
+ frameTimer = setTimeout(tick, FRAME_MS);
343
+ }
344
+ function tick() {
345
+ if (destroyed)
346
+ return;
347
+ // Decrement error counter
348
+ if (errorFramesRemaining > 0) {
349
+ errorFramesRemaining--;
350
+ if (errorFramesRemaining === 0) {
351
+ recomputePhase();
352
+ statusDirty = true;
353
+ }
354
+ }
355
+ const buf = [];
356
+ const tooSmall = layout.rows < MIN_USABLE_ROWS;
357
+ if (!tooSmall) {
358
+ // 1. Rain panel
359
+ rainEngine.tick();
360
+ buf.push(rainEngine.render());
361
+ // 2. Divider (only when dirty -- content only changes on resize)
362
+ if (dividerDirty && layout.rainCols > 0) {
363
+ cachedDivider = renderDivider(layout, utf8);
364
+ dividerDirty = false;
365
+ }
366
+ if (cachedDivider)
367
+ buf.push(cachedDivider);
368
+ // 3. Text panel (only when dirty)
369
+ if (textDirty) {
370
+ buf.push(textPanel.render());
371
+ textDirty = false;
372
+ }
373
+ }
374
+ else {
375
+ // Terminal too small: just advance rain state without rendering
376
+ rainEngine.tick();
377
+ }
378
+ // 4. Status bar (always re-render when metrics may have changed)
379
+ if (statusDirty) {
380
+ const metrics = computeMetrics(sessions, rainEngine.queueDepth, rateTracker, dominantPhase);
381
+ buf.push(renderStatusBar(layout, metrics, connectionError));
382
+ statusDirty = false;
383
+ }
384
+ // 5. Flush
385
+ buf.push(SGR.RESET);
386
+ process.stdout.write(buf.join(''));
387
+ // 6. Schedule next frame (yields to event loop for I/O)
388
+ scheduleNextFrame();
389
+ }
390
+ // ------------------------------------------------------------------
391
+ // Resize handling
392
+ // ------------------------------------------------------------------
393
+ function handleResize() {
394
+ if (resizeTimer)
395
+ clearTimeout(resizeTimer);
396
+ resizeTimer = setTimeout(() => {
397
+ resizeTimer = null;
398
+ const size = getTerminalSize();
399
+ layout = calculateTuiLayout(size.cols, size.rows);
400
+ rainEngine.resize(layout);
401
+ textPanel.resize(layout.textStartCol, layout.textCols, layout.textRows);
402
+ dividerDirty = true;
403
+ textDirty = true;
404
+ statusDirty = true;
405
+ cachedDivider = '';
406
+ // Clear entire screen to avoid artifacts
407
+ process.stdout.write('\x1b[2J');
408
+ }, 100);
409
+ }
410
+ // ------------------------------------------------------------------
411
+ // Cleanup
412
+ // ------------------------------------------------------------------
413
+ function destroy() {
414
+ if (destroyed)
415
+ return;
416
+ destroyed = true;
417
+ // 1. Stop frame loop
418
+ if (frameTimer) {
419
+ clearTimeout(frameTimer);
420
+ frameTimer = null;
421
+ }
422
+ // 2. Cancel pending timers
423
+ if (resizeTimer) {
424
+ clearTimeout(resizeTimer);
425
+ resizeTimer = null;
426
+ }
427
+ if (connectionExitTimer) {
428
+ clearTimeout(connectionExitTimer);
429
+ connectionExitTimer = null;
430
+ }
431
+ // 3. Remove signal handlers
432
+ if (sigintHandler)
433
+ process.off('SIGINT', sigintHandler);
434
+ if (sigtermHandler)
435
+ process.off('SIGTERM', sigtermHandler);
436
+ if (sigwinchHandler)
437
+ process.off('SIGWINCH', sigwinchHandler);
438
+ // 4. Remove stdin listener and restore raw mode
439
+ if (stdinHandler) {
440
+ process.stdin.off('data', stdinHandler);
441
+ stdinHandler = null;
442
+ }
443
+ if (process.stdin.isTTY) {
444
+ try {
445
+ process.stdin.setRawMode(false);
446
+ }
447
+ catch {
448
+ // Ignore errors if stdin is already closed
449
+ }
450
+ }
451
+ // Allow the process to exit naturally (stdin keeps it alive in raw mode)
452
+ process.stdin.unref();
453
+ // 5. Restore terminal
454
+ process.stdout.write('\x1b[?25h'); // show cursor
455
+ process.stdout.write('\x1b[?1049l'); // leave alternate screen
456
+ process.stdout.write('\n'); // clean shell return
457
+ }
458
+ // ------------------------------------------------------------------
459
+ // Public interface
460
+ // ------------------------------------------------------------------
461
+ return {
462
+ start() {
463
+ if (destroyed || started)
464
+ return;
465
+ started = true;
466
+ // Calculate initial layout
467
+ const size = getTerminalSize();
468
+ layout = calculateTuiLayout(size.cols, size.rows);
469
+ // Create sub-systems
470
+ rainEngine = createRainEngine({ layout });
471
+ textPanel = createTextPanel(layout.textStartCol, layout.textCols, layout.textRows);
472
+ // Enter alternate screen and hide cursor
473
+ process.stdout.write('\x1b[?1049h');
474
+ process.stdout.write('\x1b[?25l');
475
+ // Enable raw mode for Ctrl+C detection
476
+ if (process.stdin.isTTY) {
477
+ process.stdin.setRawMode(true);
478
+ process.stdin.resume();
479
+ }
480
+ // Listen for keypress (Ctrl+C)
481
+ stdinHandler = (data) => {
482
+ if (data[0] === 0x03) {
483
+ destroy();
484
+ process.exit(0);
485
+ }
486
+ };
487
+ process.stdin.on('data', stdinHandler);
488
+ // Signal handlers
489
+ sigintHandler = () => {
490
+ destroy();
491
+ process.exit(0);
492
+ };
493
+ sigtermHandler = () => {
494
+ destroy();
495
+ process.exit(0);
496
+ };
497
+ process.on('SIGINT', sigintHandler);
498
+ process.on('SIGTERM', sigtermHandler);
499
+ // Resize handler
500
+ sigwinchHandler = handleResize;
501
+ process.on('SIGWINCH', sigwinchHandler);
502
+ // Safety net: restore terminal on unexpected exit
503
+ process.on('exit', () => {
504
+ process.stdout.write('\x1b[?25h\x1b[?1049l');
505
+ });
506
+ // Start frame loop (setTimeout-based to yield to I/O between frames)
507
+ scheduleNextFrame();
508
+ },
509
+ destroy,
510
+ pushEvents(label, events) {
511
+ if (!started || destroyed)
512
+ return;
513
+ // Ensure session state exists
514
+ let state = sessions.get(label);
515
+ if (!state) {
516
+ state = createSessionState(label);
517
+ sessions.set(label, state);
518
+ }
519
+ // Ensure per-session word scoring state exists
520
+ let wordState = sessionWordStates.get(label);
521
+ if (!wordState) {
522
+ wordState = createSessionWordState();
523
+ sessionWordStates.set(label, wordState);
524
+ }
525
+ for (const event of events) {
526
+ const previousPhase = state.phase;
527
+ // Update session state
528
+ updateSessionState(state, event);
529
+ // Extract and enqueue rain tokens
530
+ const rainTokens = extractRainTokens(event);
531
+ if (rainTokens.length > 0) {
532
+ rainEngine.enqueueTokens(rainTokens);
533
+ }
534
+ // TF-IDF word scoring: process event for word drop candidates
535
+ const candidates = processEventForWords(event, wordState, wordScorer);
536
+ for (const c of candidates) {
537
+ rainEngine.enqueueWord(c.word, c.source);
538
+ }
539
+ // Word drops: phase transition to thinking
540
+ if (previousPhase !== state.phase && state.phase === 'thinking') {
541
+ rainEngine.enqueueWord('thinking...', 'phase');
542
+ }
543
+ if (event.kind === 'error') {
544
+ errorFramesRemaining = ERROR_PHASE_FRAMES;
545
+ }
546
+ // Forward to text panel (with debug flag threading)
547
+ textPanel.appendEvent(label, event, {
548
+ raw: effectiveRaw,
549
+ showLabel,
550
+ debug,
551
+ });
552
+ }
553
+ // Recompute dominant phase after processing all events
554
+ recomputePhase();
555
+ textDirty = true;
556
+ statusDirty = true;
557
+ },
558
+ sessionEnded(label, reason) {
559
+ if (!started || destroyed)
560
+ return;
561
+ const state = sessions.get(label);
562
+ if (state) {
563
+ state.ended = true;
564
+ state.endReason = reason;
565
+ state.phase = 'idle';
566
+ state.currentToolName = null;
567
+ }
568
+ textPanel.sessionEnded(label, reason, showLabel);
569
+ recomputePhase();
570
+ textDirty = true;
571
+ statusDirty = true;
572
+ },
573
+ connectionLost(reason) {
574
+ if (!started || destroyed)
575
+ return;
576
+ // Show in text panel
577
+ textPanel.connectionLost(reason);
578
+ textDirty = true;
579
+ statusDirty = true;
580
+ // Show in status bar (overrides normal metrics display)
581
+ connectionError = `Connection lost: ${reason}`;
582
+ // Start 3-second exit timer (rain keeps draining during this window)
583
+ if (!connectionExitTimer) {
584
+ connectionExitTimer = setTimeout(() => {
585
+ destroy();
586
+ process.exit(0);
587
+ }, 3000);
588
+ }
589
+ },
590
+ };
591
+ }
592
+ //# sourceMappingURL=observe-tui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observe-tui.js","sourceRoot":"","sources":["../../src/observe/observe-tui.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAOL,QAAQ,EACR,eAAe,EACf,GAAG,EACH,kBAAkB,EAClB,YAAY,EACZ,aAAa,GACd,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,gBAAgB,EAAmB,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAkB,MAAM,6BAA6B,CAAC;AAC9E,OAAO,EAEL,gBAAgB,EAChB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,8BAA8B,CAAC;AAEtC,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,+DAA+D;AAC/D,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEhC,8DAA8D;AAC9D,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAE/B,+DAA+D;AAC/D,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAE9B,8EAA8E;AAC9E,wBAAwB;AACxB,8EAA8E;AAE9E;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAuB;IACvD,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,YAAY;YACf,OAAO,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC3C,KAAK,UAAU;YACb,OAAO,aAAa,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC/C,KAAK,aAAa;YAChB,oEAAoE;YACpE,OAAO,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAC1D,KAAK,OAAO;YACV,OAAO,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC/C;YACE,OAAO,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,IAAY,EAAE,IAAuB;IAC1D,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,8EAA8E;AAC9E,2BAA2B;AAC3B,8EAA8E;AAE9E,SAAS,kBAAkB,CAAC,KAAa;IACvC,OAAO;QACL,KAAK;QACL,WAAW,EAAE,CAAC;QACd,YAAY,EAAE,CAAC;QACf,SAAS,EAAE,CAAC;QACZ,KAAK,EAAE,IAAI;QACX,KAAK,EAAE,MAAM;QACb,aAAa,EAAE,IAAI,CAAC,GAAG,EAAE;QACzB,KAAK,EAAE,KAAK;QACZ,SAAS,EAAE,IAAI;QACf,eAAe,EAAE,IAAI;KACtB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAmB,EAAE,KAAuB;IAC7E,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEjC,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,YAAY;YACf,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC;YACzB,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC;YAC7B,MAAM;QACR,KAAK,UAAU;YACb,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC;YACzB,mEAAmE;YACnE,IAAI,KAAK,CAAC,QAAQ,KAAK,EAAE,EAAE,CAAC;gBAC1B,KAAK,CAAC,SAAS,EAAE,CAAC;gBAClB,KAAK,CAAC,eAAe,GAAG,KAAK,CAAC,QAAQ,CAAC;YACzC,CAAC;YACD,MAAM;QACR,KAAK,eAAe;YAClB,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;YAC1B,MAAM;QACR,KAAK,aAAa;YAChB,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,WAAW,CAAC;YACvC,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,YAAY,CAAC;YACzC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC;YACrB,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC;YAC7B,MAAM;QACR,qEAAqE;IACvE,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,6BAA6B;AAC7B,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAAmC,EAAE,WAAoB;IAC5F,IAAI,WAAW;QAAE,OAAO,OAAO,CAAC;IAEhC,IAAI,QAAQ,GAAe,MAAM,CAAC;IAClC,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QAClC,IAAI,CAAC,CAAC,KAAK;YAAE,SAAS;QACtB,IAAI,CAAC,CAAC,KAAK,KAAK,UAAU;YAAE,QAAQ,GAAG,UAAU,CAAC;QAClD,IAAI,CAAC,CAAC,KAAK,KAAK,UAAU,IAAI,QAAQ,KAAK,MAAM;YAAE,QAAQ,GAAG,UAAU,CAAC;IAC3E,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAoBD;;;;GAIG;AACH,MAAM,OAAO,gBAAgB;IACV,QAAQ,CAAS;IACjB,OAAO,GAA4C,EAAE,CAAC;IAEvE,YAAY,QAAQ,GAAG,IAAI;QACzB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,uDAAuD;IACvD,MAAM,CAAC,GAAW,EAAE,WAAmB;QACrC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;QACtD,sCAAsC;QACtC,MAAM,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;QACnC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,MAAM,EAAE,CAAC;YAChE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAED,kDAAkD;IAClD,IAAI;QACF,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QACnD,IAAI,OAAO,IAAI,CAAC;YAAE,OAAO,CAAC,CAAC;QAC3B,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC;IACnD,CAAC;CACF;AAED,SAAS,cAAc,CACrB,QAAmC,EACnC,UAAkB,EAClB,WAA6B,EAC7B,aAAyB;IAEzB,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,KAAK,GAAkB,IAAI,CAAC;IAChC,IAAI,eAAe,GAAkB,IAAI,CAAC;IAC1C,IAAI,eAAe,GAAG,CAAC,CAAC;IAExB,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QAClC,WAAW,IAAI,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,YAAY,CAAC;QAC9C,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;YACb,cAAc,EAAE,CAAC;YACjB,0DAA0D;YAC1D,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,aAAa,GAAG,eAAe,EAAE,CAAC;gBACjD,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;gBAChB,eAAe,GAAG,CAAC,CAAC,aAAa,CAAC;YACpC,CAAC;YACD,yDAAyD;YACzD,IAAI,CAAC,CAAC,KAAK,KAAK,UAAU,IAAI,CAAC,CAAC,eAAe,EAAE,CAAC;gBAChD,eAAe,GAAG,CAAC,CAAC,eAAe,CAAC;YACtC,CAAC;QACH,CAAC;IACH,CAAC;IAED,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC;IAE5C,OAAO;QACL,WAAW;QACX,cAAc;QACd,aAAa,EAAE,QAAQ,CAAC,IAAI;QAC5B,UAAU;QACV,YAAY,EAAE,WAAW,CAAC,IAAI,EAAE;QAChC,KAAK;QACL,KAAK,EAAE,aAAa;QACpB,eAAe;KAChB,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E,MAAM,YAAY,GAAG,QAAQ,CAAC,CAAC,IAAI;AACnC,MAAM,cAAc,GAAG,GAAG,CAAC;AAE3B,SAAS,aAAa,CAAC,MAAiB,EAAE,IAAa;IACrD,IAAI,MAAM,CAAC,QAAQ,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAEpC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,YAAY;IAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,cAAc,CAAC;IAElD,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,MAAM,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,CAAC;QAC/C,GAAG,CAAC,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACpB,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACtB,CAAC;AAED,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAE9E,MAAM,UAAU,gBAAgB,CAAC,CAAS;IACxC,IAAI,CAAC,IAAI,SAAS;QAAE,OAAO,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAC5D,IAAI,CAAC,IAAI,KAAK;QAAE,OAAO,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IACpD,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;AACnB,CAAC;AAED,SAAS,eAAe,CAAC,MAAiB,EAAE,OAAyB,EAAE,eAA8B;IACnG,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,YAAY;IAC9C,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,gBAAgB,WAAW,GAAG,CAAC,KAAK,EAAE,CAAC;IAE1D,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,YAAY,UAAU,eAAe,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC;QACxE,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9D,OAAO,QAAQ,GAAG,MAAM,GAAG,CAAC,SAAS,GAAG,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC;IAClF,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,gBAAgB;IAChB,IAAI,OAAO,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CACR,GAAG,GAAG,CAAC,YAAY,WAAW,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,YAAY,GAAG,OAAO,CAAC,cAAc,IAAI,OAAO,CAAC,aAAa,GAAG,GAAG,CAAC,KAAK,EAAE,CAC5H,CAAC;IACJ,CAAC;IAED,yBAAyB;IACzB,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,oBAAoB,CAAC,CAAC;QACjE,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,YAAY,GAAG,UAAU,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,6BAA6B;IAC7B,MAAM,UAAU,GAA+B;QAC7C,QAAQ,EAAE,GAAG,CAAC,qBAAqB;QACnC,QAAQ,EAAE,GAAG,CAAC,iBAAiB;QAC/B,IAAI,EAAE,GAAG,CAAC,iBAAiB;QAC3B,KAAK,EAAE,GAAG,CAAC,kBAAkB;KAC9B,CAAC;IACF,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACzC,IAAI,UAAkB,CAAC;IACvB,IAAI,OAAO,CAAC,KAAK,KAAK,UAAU,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;QAC5D,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,eAAe,EAAE,mBAAmB,CAAC,CAAC;QACzE,UAAU,GAAG,SAAS,SAAS,EAAE,CAAC;IACpC,CAAC;SAAM,CAAC;QACN,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;IAC3C,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,UAAU,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;IAEjD,gCAAgC;IAChC,KAAK,CAAC,IAAI,CACR,GAAG,GAAG,CAAC,YAAY,SAAS,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,YAAY,GAAG,gBAAgB,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,GAAG,CAAC,KAAK,EAAE,CAChH,CAAC;IAEF,kCAAkC;IAClC,IAAI,OAAO,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,OAAO,GACX,OAAO,CAAC,YAAY,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC9G,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,YAAY,QAAQ,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,YAAY,GAAG,OAAO,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;IAC/F,CAAC;IAED,mCAAmC;IACnC,IAAI,OAAO,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,YAAY,QAAQ,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,YAAY,GAAG,OAAO,CAAC,UAAU,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;IAC1G,CAAC;IAED,YAAY;IACZ,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,WAAW,cAAc,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;IAExD,IAAI,OAAO,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IAErC,gEAAgE;IAChE,OAAO,aAAa,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChE,iEAAiE;QACjE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAClC,OAAO,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IACnC,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;IAElE,OAAO,QAAQ,GAAG,MAAM,GAAG,CAAC,SAAS,GAAG,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC;AACtF,CAAC;AAYD,gEAAgE;AAChE,SAAS,eAAe;IACtB,OAAO;QACL,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE;QAClC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE;KAChC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAA0B;IACzD,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAC1C,MAAM,YAAY,GAAG,GAAG,IAAI,KAAK,CAAC;IAClC,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;IAE5B,QAAQ;IACR,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAwB,CAAC;IACjD,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAA4B,CAAC;IAC9D,MAAM,UAAU,GAAG,gBAAgB,EAAE,CAAC;IACtC,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,UAAU,GAAyC,IAAI,CAAC;IAC5D,IAAI,WAAW,GAAyC,IAAI,CAAC;IAE7D,gCAAgC;IAChC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,eAAe,EAAE,CAAC;IACzC,IAAI,MAAM,GAAc,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAEvD,wCAAwC;IACxC,IAAI,UAAsB,CAAC;IAC3B,IAAI,SAAoB,CAAC;IAEzB,wCAAwC;IACxC,IAAI,YAAY,GAAG,IAAI,CAAC;IACxB,IAAI,SAAS,GAAG,IAAI,CAAC;IACrB,IAAI,WAAW,GAAG,IAAI,CAAC;IAEvB,yDAAyD;IACzD,IAAI,aAAa,GAAG,EAAE,CAAC;IAEvB,gDAAgD;IAChD,MAAM,WAAW,GAAG,IAAI,gBAAgB,EAAE,CAAC;IAE3C,+CAA+C;IAC/C,IAAI,eAAe,GAAkB,IAAI,CAAC;IAC1C,IAAI,mBAAmB,GAAyC,IAAI,CAAC;IAErE,IAAI,oBAAoB,GAAG,CAAC,CAAC;IAE7B,iDAAiD;IACjD,IAAI,aAAa,GAAe,MAAM,CAAC;IAEvC,kDAAkD;IAClD,IAAI,aAAa,GAAwB,IAAI,CAAC;IAC9C,IAAI,cAAc,GAAwB,IAAI,CAAC;IAC/C,IAAI,eAAe,GAAwB,IAAI,CAAC;IAChD,IAAI,YAAY,GAAoC,IAAI,CAAC;IAEzD,qEAAqE;IACrE,2BAA2B;IAC3B,qEAAqE;IAErE,SAAS,cAAc;QACrB,aAAa,GAAG,oBAAoB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,CAAC,CAAC,CAAC;QACzE,UAAU,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IACrC,CAAC;IAED,qEAAqE;IACrE,aAAa;IACb,qEAAqE;IAErE,+DAA+D;IAC/D,SAAS,iBAAiB;QACxB,IAAI,SAAS;YAAE,OAAO;QACtB,UAAU,GAAG,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC1C,CAAC;IAED,SAAS,IAAI;QACX,IAAI,SAAS;YAAE,OAAO;QAEtB,0BAA0B;QAC1B,IAAI,oBAAoB,GAAG,CAAC,EAAE,CAAC;YAC7B,oBAAoB,EAAE,CAAC;YACvB,IAAI,oBAAoB,KAAK,CAAC,EAAE,CAAC;gBAC/B,cAAc,EAAE,CAAC;gBACjB,WAAW,GAAG,IAAI,CAAC;YACrB,CAAC;QACH,CAAC;QAED,MAAM,GAAG,GAAa,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,GAAG,eAAe,CAAC;QAE/C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,gBAAgB;YAChB,UAAU,CAAC,IAAI,EAAE,CAAC;YAClB,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;YAE9B,iEAAiE;YACjE,IAAI,YAAY,IAAI,MAAM,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;gBACxC,aAAa,GAAG,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBAC5C,YAAY,GAAG,KAAK,CAAC;YACvB,CAAC;YACD,IAAI,aAAa;gBAAE,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAE3C,kCAAkC;YAClC,IAAI,SAAS,EAAE,CAAC;gBACd,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC7B,SAAS,GAAG,KAAK,CAAC;YACpB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,gEAAgE;YAChE,UAAU,CAAC,IAAI,EAAE,CAAC;QACpB,CAAC;QAED,iEAAiE;QACjE,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,EAAE,UAAU,CAAC,UAAU,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;YAC5F,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC;YAC5D,WAAW,GAAG,KAAK,CAAC;QACtB,CAAC;QAED,WAAW;QACX,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAEnC,wDAAwD;QACxD,iBAAiB,EAAE,CAAC;IACtB,CAAC;IAED,qEAAqE;IACrE,kBAAkB;IAClB,qEAAqE;IAErE,SAAS,YAAY;QACnB,IAAI,WAAW;YAAE,YAAY,CAAC,WAAW,CAAC,CAAC;QAC3C,WAAW,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,WAAW,GAAG,IAAI,CAAC;YACnB,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;YAC/B,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAClD,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC1B,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;YACxE,YAAY,GAAG,IAAI,CAAC;YACpB,SAAS,GAAG,IAAI,CAAC;YACjB,WAAW,GAAG,IAAI,CAAC;YACnB,aAAa,GAAG,EAAE,CAAC;YACnB,yCAAyC;YACzC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAClC,CAAC,EAAE,GAAG,CAAC,CAAC;IACV,CAAC;IAED,qEAAqE;IACrE,UAAU;IACV,qEAAqE;IAErE,SAAS,OAAO;QACd,IAAI,SAAS;YAAE,OAAO;QACtB,SAAS,GAAG,IAAI,CAAC;QAEjB,qBAAqB;QACrB,IAAI,UAAU,EAAE,CAAC;YACf,YAAY,CAAC,UAAU,CAAC,CAAC;YACzB,UAAU,GAAG,IAAI,CAAC;QACpB,CAAC;QAED,2BAA2B;QAC3B,IAAI,WAAW,EAAE,CAAC;YAChB,YAAY,CAAC,WAAW,CAAC,CAAC;YAC1B,WAAW,GAAG,IAAI,CAAC;QACrB,CAAC;QACD,IAAI,mBAAmB,EAAE,CAAC;YACxB,YAAY,CAAC,mBAAmB,CAAC,CAAC;YAClC,mBAAmB,GAAG,IAAI,CAAC;QAC7B,CAAC;QAED,4BAA4B;QAC5B,IAAI,aAAa;YAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QACxD,IAAI,cAAc;YAAE,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;QAC3D,IAAI,eAAe;YAAE,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;QAE9D,gDAAgD;QAChD,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;YACxC,YAAY,GAAG,IAAI,CAAC;QACtB,CAAC;QACD,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACxB,IAAI,CAAC;gBACH,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YAClC,CAAC;YAAC,MAAM,CAAC;gBACP,2CAA2C;YAC7C,CAAC;QACH,CAAC;QACD,yEAAyE;QACzE,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAEtB,sBAAsB;QACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc;QACjD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,yBAAyB;QAC9D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,qBAAqB;IACnD,CAAC;IAED,qEAAqE;IACrE,mBAAmB;IACnB,qEAAqE;IAErE,OAAO;QACL,KAAK;YACH,IAAI,SAAS,IAAI,OAAO;gBAAE,OAAO;YACjC,OAAO,GAAG,IAAI,CAAC;YAEf,2BAA2B;YAC3B,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;YAC/B,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAElD,qBAAqB;YACrB,UAAU,GAAG,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;YAC1C,SAAS,GAAG,eAAe,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;YAEnF,yCAAyC;YACzC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YACpC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAElC,uCAAuC;YACvC,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;gBACxB,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBAC/B,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACzB,CAAC;YAED,+BAA+B;YAC/B,YAAY,GAAG,CAAC,IAAY,EAAE,EAAE;gBAC9B,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;oBACrB,OAAO,EAAE,CAAC;oBACV,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC,CAAC;YACF,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;YAEvC,kBAAkB;YAClB,aAAa,GAAG,GAAG,EAAE;gBACnB,OAAO,EAAE,CAAC;gBACV,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC,CAAC;YACF,cAAc,GAAG,GAAG,EAAE;gBACpB,OAAO,EAAE,CAAC;gBACV,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC,CAAC;YACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;YACpC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;YAEtC,iBAAiB;YACjB,eAAe,GAAG,YAAY,CAAC;YAC/B,OAAO,CAAC,EAAE,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;YAExC,kDAAkD;YAClD,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;gBACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;YAC/C,CAAC,CAAC,CAAC;YAEH,qEAAqE;YACrE,iBAAiB,EAAE,CAAC;QACtB,CAAC;QAED,OAAO;QAEP,UAAU,CAAC,KAAa,EAAE,MAAmC;YAC3D,IAAI,CAAC,OAAO,IAAI,SAAS;gBAAE,OAAO;YAElC,8BAA8B;YAC9B,IAAI,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAChC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,KAAK,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAClC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC7B,CAAC;YAED,+CAA+C;YAC/C,IAAI,SAAS,GAAG,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC7C,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,SAAS,GAAG,sBAAsB,EAAE,CAAC;gBACrC,iBAAiB,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YAC1C,CAAC;YAED,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC;gBAElC,uBAAuB;gBACvB,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;gBAEjC,kCAAkC;gBAClC,MAAM,UAAU,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;gBAC5C,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC1B,UAAU,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;gBACvC,CAAC;gBAED,8DAA8D;gBAC9D,MAAM,UAAU,GAAG,oBAAoB,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;gBACtE,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;oBAC3B,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;gBAC3C,CAAC;gBAED,2CAA2C;gBAC3C,IAAI,aAAa,KAAK,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;oBAChE,UAAU,CAAC,WAAW,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;gBACjD,CAAC;gBAED,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBAC3B,oBAAoB,GAAG,kBAAkB,CAAC;gBAC5C,CAAC;gBAED,oDAAoD;gBACpD,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE;oBAClC,GAAG,EAAE,YAAY;oBACjB,SAAS;oBACT,KAAK;iBACN,CAAC,CAAC;YACL,CAAC;YAED,uDAAuD;YACvD,cAAc,EAAE,CAAC;YAEjB,SAAS,GAAG,IAAI,CAAC;YACjB,WAAW,GAAG,IAAI,CAAC;QACrB,CAAC;QAED,YAAY,CAAC,KAAa,EAAE,MAAc;YACxC,IAAI,CAAC,OAAO,IAAI,SAAS;gBAAE,OAAO;YAElC,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAClC,IAAI,KAAK,EAAE,CAAC;gBACV,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC;gBACnB,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC;gBACzB,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC;gBACrB,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC;YAC/B,CAAC;YAED,SAAS,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;YAEjD,cAAc,EAAE,CAAC;YACjB,SAAS,GAAG,IAAI,CAAC;YACjB,WAAW,GAAG,IAAI,CAAC;QACrB,CAAC;QAED,cAAc,CAAC,MAAc;YAC3B,IAAI,CAAC,OAAO,IAAI,SAAS;gBAAE,OAAO;YAElC,qBAAqB;YACrB,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YACjC,SAAS,GAAG,IAAI,CAAC;YACjB,WAAW,GAAG,IAAI,CAAC;YAEnB,wDAAwD;YACxD,eAAe,GAAG,oBAAoB,MAAM,EAAE,CAAC;YAE/C,qEAAqE;YACrE,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBACzB,mBAAmB,GAAG,UAAU,CAAC,GAAG,EAAE;oBACpC,OAAO,EAAE,CAAC;oBACV,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC,EAAE,IAAI,CAAC,CAAC;YACX,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -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"}