@evalops/maestro 0.10.8 → 0.10.11

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 (1009) hide show
  1. package/README.md +3 -1
  2. package/dist/agent/action-approval.d.ts +6 -0
  3. package/dist/agent/action-approval.d.ts.map +1 -1
  4. package/dist/agent/action-approval.js.map +1 -1
  5. package/dist/agent/agent.d.ts +13 -1
  6. package/dist/agent/agent.d.ts.map +1 -1
  7. package/dist/agent/agent.js +368 -1
  8. package/dist/agent/agent.js.map +1 -1
  9. package/dist/agent/auto-compaction.d.ts +4 -4
  10. package/dist/agent/auto-compaction.d.ts.map +1 -1
  11. package/dist/agent/auto-compaction.js.map +1 -1
  12. package/dist/agent/compaction-cleanup.d.ts +2 -0
  13. package/dist/agent/compaction-cleanup.d.ts.map +1 -1
  14. package/dist/agent/compaction-cleanup.js +17 -2
  15. package/dist/agent/compaction-cleanup.js.map +1 -1
  16. package/dist/agent/compaction.d.ts +3 -1
  17. package/dist/agent/compaction.d.ts.map +1 -1
  18. package/dist/agent/compaction.js +10 -2
  19. package/dist/agent/compaction.js.map +1 -1
  20. package/dist/agent/context-manager.d.ts +4 -0
  21. package/dist/agent/context-manager.d.ts.map +1 -1
  22. package/dist/agent/context-manager.js +8 -0
  23. package/dist/agent/context-manager.js.map +1 -1
  24. package/dist/agent/context-providers.d.ts +2 -0
  25. package/dist/agent/context-providers.d.ts.map +1 -1
  26. package/dist/agent/context-providers.js +3 -2
  27. package/dist/agent/context-providers.js.map +1 -1
  28. package/dist/agent/providers/google-gemini-cli.js +17 -5
  29. package/dist/agent/providers/google.js +174 -144
  30. package/dist/agent/providers/openai-codex-responses.d.ts +4 -0
  31. package/dist/agent/providers/openai-codex-responses.d.ts.map +1 -0
  32. package/dist/agent/providers/openai-codex-responses.js +637 -0
  33. package/dist/agent/providers/openai-codex-responses.js.map +1 -0
  34. package/dist/agent/providers/openai-codex-session.d.ts +18 -0
  35. package/dist/agent/providers/openai-codex-session.d.ts.map +1 -0
  36. package/dist/agent/providers/openai-codex-session.js +53 -0
  37. package/dist/agent/providers/openai-codex-session.js.map +1 -0
  38. package/dist/agent/providers/openai-responses-sdk.d.ts.map +1 -1
  39. package/dist/agent/providers/openai-responses-sdk.js +16 -6
  40. package/dist/agent/providers/openai-responses-sdk.js.map +1 -1
  41. package/dist/agent/providers/openai-shared.d.ts +12 -5
  42. package/dist/agent/providers/openai-shared.d.ts.map +1 -1
  43. package/dist/agent/providers/openai-shared.js +291 -2
  44. package/dist/agent/providers/openai-shared.js.map +1 -1
  45. package/dist/agent/providers/openai.d.ts +1 -1
  46. package/dist/agent/providers/openai.d.ts.map +1 -1
  47. package/dist/agent/providers/openai.js +48 -20
  48. package/dist/agent/providers/openai.js.map +1 -1
  49. package/dist/agent/providers/vertex.js +7 -0
  50. package/dist/agent/tracing.d.ts +16 -5
  51. package/dist/agent/tracing.d.ts.map +1 -1
  52. package/dist/agent/tracing.js +44 -2
  53. package/dist/agent/tracing.js.map +1 -1
  54. package/dist/agent/transport/create-provider-stream.d.ts.map +1 -1
  55. package/dist/agent/transport/create-provider-stream.js +9 -0
  56. package/dist/agent/transport/create-provider-stream.js.map +1 -1
  57. package/dist/agent/transport/tool-execution-bridge.d.ts +86 -0
  58. package/dist/agent/transport/tool-execution-bridge.d.ts.map +1 -0
  59. package/dist/agent/transport/tool-execution-bridge.js +665 -0
  60. package/dist/agent/transport/tool-execution-bridge.js.map +1 -0
  61. package/dist/agent/transport/tool-execution.d.ts +3 -0
  62. package/dist/agent/transport/tool-execution.d.ts.map +1 -1
  63. package/dist/agent/transport/tool-execution.js +16 -1
  64. package/dist/agent/transport/tool-execution.js.map +1 -1
  65. package/dist/agent/transport/tool-safety-pipeline.d.ts +7 -1
  66. package/dist/agent/transport/tool-safety-pipeline.d.ts.map +1 -1
  67. package/dist/agent/transport/tool-safety-pipeline.js +207 -40
  68. package/dist/agent/transport/tool-safety-pipeline.js.map +1 -1
  69. package/dist/agent/transport/tool-update-queue.d.ts +2 -0
  70. package/dist/agent/transport/tool-update-queue.d.ts.map +1 -1
  71. package/dist/agent/transport/tool-update-queue.js.map +1 -1
  72. package/dist/agent/transport.d.ts +3 -0
  73. package/dist/agent/transport.d.ts.map +1 -1
  74. package/dist/agent/transport.js +96 -16
  75. package/dist/agent/transport.js.map +1 -1
  76. package/dist/agent/types.d.ts +50 -2
  77. package/dist/agent/types.d.ts.map +1 -1
  78. package/dist/agent/types.js.map +1 -1
  79. package/dist/approvals/platform-action-approval.d.ts +32 -0
  80. package/dist/approvals/platform-action-approval.d.ts.map +1 -0
  81. package/dist/approvals/platform-action-approval.js +210 -0
  82. package/dist/approvals/platform-action-approval.js.map +1 -0
  83. package/dist/approvals/service-client.d.ts +56 -0
  84. package/dist/approvals/service-client.d.ts.map +1 -0
  85. package/dist/approvals/service-client.js +316 -0
  86. package/dist/approvals/service-client.js.map +1 -0
  87. package/dist/audit/logger.d.ts +4 -4
  88. package/dist/bootstrap/auth-setup.d.ts +2 -2
  89. package/dist/bootstrap/auth-setup.d.ts.map +1 -1
  90. package/dist/bootstrap/auth-setup.js +4 -7
  91. package/dist/bootstrap/auth-setup.js.map +1 -1
  92. package/dist/cli/args.d.ts +2 -0
  93. package/dist/cli/args.d.ts.map +1 -1
  94. package/dist/cli/args.js +29 -0
  95. package/dist/cli/args.js.map +1 -1
  96. package/dist/cli/commands/codex.d.ts +2 -0
  97. package/dist/cli/commands/codex.d.ts.map +1 -0
  98. package/dist/cli/commands/codex.js +65 -0
  99. package/dist/cli/commands/codex.js.map +1 -0
  100. package/dist/cli/commands/config.js +1 -1
  101. package/dist/cli/commands/config.js.map +1 -1
  102. package/dist/cli/commands/evalops.d.ts +2 -0
  103. package/dist/cli/commands/evalops.d.ts.map +1 -0
  104. package/dist/cli/commands/evalops.js +74 -0
  105. package/dist/cli/commands/evalops.js.map +1 -0
  106. package/dist/cli/commands/hosted-runner.d.ts +23 -0
  107. package/dist/cli/commands/hosted-runner.d.ts.map +1 -0
  108. package/dist/cli/commands/hosted-runner.js +241 -0
  109. package/dist/cli/commands/hosted-runner.js.map +1 -0
  110. package/dist/cli/commands/init.d.ts +4 -0
  111. package/dist/cli/commands/init.d.ts.map +1 -0
  112. package/dist/cli/commands/init.js +140 -0
  113. package/dist/cli/commands/init.js.map +1 -0
  114. package/dist/cli/commands/memory.d.ts.map +1 -1
  115. package/dist/cli/commands/memory.js +23 -30
  116. package/dist/cli/commands/memory.js.map +1 -1
  117. package/dist/cli/commands/remote.d.ts +3 -0
  118. package/dist/cli/commands/remote.d.ts.map +1 -0
  119. package/dist/cli/commands/remote.js +631 -0
  120. package/dist/cli/commands/remote.js.map +1 -0
  121. package/dist/cli/commands/stats.d.ts +7 -0
  122. package/dist/cli/commands/stats.d.ts.map +1 -0
  123. package/dist/cli/commands/stats.js +167 -0
  124. package/dist/cli/commands/stats.js.map +1 -0
  125. package/dist/cli/headless-protocol.d.ts +16 -1
  126. package/dist/cli/headless-protocol.d.ts.map +1 -1
  127. package/dist/cli/headless-protocol.js +60 -4
  128. package/dist/cli/headless-protocol.js.map +1 -1
  129. package/dist/cli/headless.d.ts.map +1 -1
  130. package/dist/cli/headless.js +1 -0
  131. package/dist/cli/headless.js.map +1 -1
  132. package/dist/cli/help.d.ts.map +1 -1
  133. package/dist/cli/help.js +44 -1
  134. package/dist/cli/help.js.map +1 -1
  135. package/dist/cli/jsonl-writer.d.ts.map +1 -1
  136. package/dist/cli/jsonl-writer.js +19 -6
  137. package/dist/cli/jsonl-writer.js.map +1 -1
  138. package/dist/cli-tui/client-tools/client-tool-controller.d.ts.map +1 -1
  139. package/dist/cli-tui/client-tools/client-tool-controller.js +17 -1
  140. package/dist/cli-tui/client-tools/client-tool-controller.js.map +1 -1
  141. package/dist/cli-tui/commands/access-command.js +1 -1
  142. package/dist/cli-tui/commands/access-command.js.map +1 -1
  143. package/dist/cli-tui/commands/audit-command.js +1 -1
  144. package/dist/cli-tui/commands/audit-command.js.map +1 -1
  145. package/dist/cli-tui/commands/command-catalog.d.ts +29 -0
  146. package/dist/cli-tui/commands/command-catalog.d.ts.map +1 -0
  147. package/dist/cli-tui/commands/command-catalog.js +645 -0
  148. package/dist/cli-tui/commands/command-catalog.js.map +1 -0
  149. package/dist/cli-tui/commands/command-registry-adapter.d.ts +12 -0
  150. package/dist/cli-tui/commands/command-registry-adapter.d.ts.map +1 -0
  151. package/dist/cli-tui/commands/command-registry-adapter.js +120 -0
  152. package/dist/cli-tui/commands/command-registry-adapter.js.map +1 -0
  153. package/dist/cli-tui/commands/command-suite-catalog.d.ts +14 -0
  154. package/dist/cli-tui/commands/command-suite-catalog.d.ts.map +1 -0
  155. package/dist/cli-tui/commands/command-suite-catalog.js +147 -0
  156. package/dist/cli-tui/commands/command-suite-catalog.js.map +1 -0
  157. package/dist/cli-tui/commands/{grouped-command-handlers.d.ts → command-suite-handlers.d.ts} +27 -26
  158. package/dist/cli-tui/commands/command-suite-handlers.d.ts.map +1 -0
  159. package/dist/cli-tui/commands/command-suite-handlers.js +110 -0
  160. package/dist/cli-tui/commands/command-suite-handlers.js.map +1 -0
  161. package/dist/cli-tui/commands/hotkeys-command.d.ts +1 -1
  162. package/dist/cli-tui/commands/hotkeys-command.d.ts.map +1 -1
  163. package/dist/cli-tui/commands/hotkeys-command.js +2 -2
  164. package/dist/cli-tui/commands/hotkeys-command.js.map +1 -1
  165. package/dist/cli-tui/commands/limits-command.js +1 -1
  166. package/dist/cli-tui/commands/limits-command.js.map +1 -1
  167. package/dist/cli-tui/commands/pii-command.js +1 -1
  168. package/dist/cli-tui/commands/pii-command.js.map +1 -1
  169. package/dist/cli-tui/commands/registry.d.ts +1 -1
  170. package/dist/cli-tui/commands/registry.d.ts.map +1 -1
  171. package/dist/cli-tui/commands/registry.js +29 -921
  172. package/dist/cli-tui/commands/registry.js.map +1 -1
  173. package/dist/cli-tui/commands/{grouped → subcommands}/auth-commands.d.ts +2 -1
  174. package/dist/cli-tui/commands/subcommands/auth-commands.d.ts.map +1 -0
  175. package/dist/cli-tui/commands/{grouped → subcommands}/auth-commands.js +22 -6
  176. package/dist/cli-tui/commands/subcommands/auth-commands.js.map +1 -0
  177. package/dist/cli-tui/commands/{grouped → subcommands}/config-commands.d.ts +0 -1
  178. package/dist/cli-tui/commands/subcommands/config-commands.d.ts.map +1 -0
  179. package/dist/cli-tui/commands/{grouped → subcommands}/config-commands.js +2 -2
  180. package/dist/cli-tui/commands/subcommands/config-commands.js.map +1 -0
  181. package/dist/cli-tui/commands/{grouped → subcommands}/diag-commands.d.ts +1 -2
  182. package/dist/cli-tui/commands/subcommands/diag-commands.d.ts.map +1 -0
  183. package/dist/cli-tui/commands/{grouped → subcommands}/diag-commands.js +5 -7
  184. package/dist/cli-tui/commands/subcommands/diag-commands.js.map +1 -0
  185. package/dist/cli-tui/commands/{grouped → subcommands}/git-commands.d.ts +0 -2
  186. package/dist/cli-tui/commands/subcommands/git-commands.d.ts.map +1 -0
  187. package/dist/cli-tui/commands/{grouped → subcommands}/git-commands.js +2 -2
  188. package/dist/cli-tui/commands/subcommands/git-commands.js.map +1 -0
  189. package/dist/cli-tui/commands/{grouped → subcommands}/index.d.ts +2 -2
  190. package/dist/cli-tui/commands/subcommands/index.d.ts.map +1 -0
  191. package/dist/cli-tui/commands/{grouped → subcommands}/index.js +2 -2
  192. package/dist/cli-tui/commands/subcommands/index.js.map +1 -0
  193. package/dist/cli-tui/commands/{grouped → subcommands}/safety-commands.d.ts +0 -1
  194. package/dist/cli-tui/commands/subcommands/safety-commands.d.ts.map +1 -0
  195. package/dist/cli-tui/commands/{grouped → subcommands}/safety-commands.js +12 -12
  196. package/dist/cli-tui/commands/subcommands/safety-commands.js.map +1 -0
  197. package/dist/cli-tui/commands/{grouped → subcommands}/session-commands.d.ts +1 -2
  198. package/dist/cli-tui/commands/subcommands/session-commands.d.ts.map +1 -0
  199. package/dist/cli-tui/commands/{grouped → subcommands}/session-commands.js +3 -3
  200. package/dist/cli-tui/commands/subcommands/session-commands.js.map +1 -0
  201. package/dist/cli-tui/commands/{grouped → subcommands}/tools-commands.d.ts +0 -1
  202. package/dist/cli-tui/commands/subcommands/tools-commands.d.ts.map +1 -0
  203. package/dist/cli-tui/commands/{grouped → subcommands}/tools-commands.js +2 -2
  204. package/dist/cli-tui/commands/subcommands/tools-commands.js.map +1 -0
  205. package/dist/cli-tui/commands/{grouped → subcommands}/ui-commands.d.ts +0 -1
  206. package/dist/cli-tui/commands/subcommands/ui-commands.d.ts.map +1 -0
  207. package/dist/cli-tui/commands/{grouped → subcommands}/ui-commands.js +5 -5
  208. package/dist/cli-tui/commands/subcommands/ui-commands.js.map +1 -0
  209. package/dist/cli-tui/commands/{grouped → subcommands}/undo-commands.d.ts +1 -2
  210. package/dist/cli-tui/commands/subcommands/undo-commands.d.ts.map +1 -0
  211. package/dist/cli-tui/commands/{grouped → subcommands}/undo-commands.js +6 -6
  212. package/dist/cli-tui/commands/subcommands/undo-commands.js.map +1 -0
  213. package/dist/cli-tui/commands/subcommands/usage-commands.d.ts.map +1 -0
  214. package/dist/cli-tui/commands/{grouped → subcommands}/usage-commands.js +2 -2
  215. package/dist/cli-tui/commands/subcommands/usage-commands.js.map +1 -0
  216. package/dist/cli-tui/commands/{grouped → subcommands}/utils.d.ts +15 -15
  217. package/dist/cli-tui/commands/subcommands/utils.d.ts.map +1 -0
  218. package/dist/cli-tui/commands/{grouped → subcommands}/utils.js +13 -8
  219. package/dist/cli-tui/commands/subcommands/utils.js.map +1 -0
  220. package/dist/cli-tui/commands/types.d.ts +3 -3
  221. package/dist/cli-tui/commands/types.d.ts.map +1 -1
  222. package/dist/cli-tui/commands/types.js.map +1 -1
  223. package/dist/cli-tui/editor-view.d.ts +1 -1
  224. package/dist/cli-tui/editor-view.d.ts.map +1 -1
  225. package/dist/cli-tui/editor-view.js +1 -1
  226. package/dist/cli-tui/editor-view.js.map +1 -1
  227. package/dist/cli-tui/oauth/oauth-flow-controller.d.ts +4 -0
  228. package/dist/cli-tui/oauth/oauth-flow-controller.d.ts.map +1 -1
  229. package/dist/cli-tui/oauth/oauth-flow-controller.js +76 -5
  230. package/dist/cli-tui/oauth/oauth-flow-controller.js.map +1 -1
  231. package/dist/cli-tui/run/run-controller.d.ts +2 -2
  232. package/dist/cli-tui/run/run-controller.d.ts.map +1 -1
  233. package/dist/cli-tui/run/run-controller.js +3 -2
  234. package/dist/cli-tui/run/run-controller.js.map +1 -1
  235. package/dist/cli-tui/run/run-shell-command.d.ts.map +1 -1
  236. package/dist/cli-tui/run/run-shell-command.js +11 -3
  237. package/dist/cli-tui/run/run-shell-command.js.map +1 -1
  238. package/dist/cli-tui/run/streaming-shell-command.d.ts.map +1 -1
  239. package/dist/cli-tui/run/streaming-shell-command.js +11 -3
  240. package/dist/cli-tui/run/streaming-shell-command.js.map +1 -1
  241. package/dist/cli-tui/selectors/model-selector.d.ts.map +1 -1
  242. package/dist/cli-tui/selectors/model-selector.js +1 -0
  243. package/dist/cli-tui/selectors/model-selector.js.map +1 -1
  244. package/dist/cli-tui/tui-renderer/agent-event-bridge.d.ts +8 -0
  245. package/dist/cli-tui/tui-renderer/agent-event-bridge.d.ts.map +1 -1
  246. package/dist/cli-tui/tui-renderer/agent-event-bridge.js +23 -2
  247. package/dist/cli-tui/tui-renderer/agent-event-bridge.js.map +1 -1
  248. package/dist/cli-tui/tui-renderer/command-registry-options.d.ts +3 -3
  249. package/dist/cli-tui/tui-renderer/command-registry-options.d.ts.map +1 -1
  250. package/dist/cli-tui/tui-renderer/command-registry-options.js +12 -2
  251. package/dist/cli-tui/tui-renderer/command-registry-options.js.map +1 -1
  252. package/dist/cli-tui/tui-renderer/command-suite-wiring.d.ts +32 -0
  253. package/dist/cli-tui/tui-renderer/command-suite-wiring.d.ts.map +1 -0
  254. package/dist/cli-tui/tui-renderer/command-suite-wiring.js +108 -0
  255. package/dist/cli-tui/tui-renderer/command-suite-wiring.js.map +1 -0
  256. package/dist/cli-tui/tui-renderer/input-controller.d.ts +2 -2
  257. package/dist/cli-tui/tui-renderer/input-controller.d.ts.map +1 -1
  258. package/dist/cli-tui/tui-renderer/input-controller.js +2 -2
  259. package/dist/cli-tui/tui-renderer/input-controller.js.map +1 -1
  260. package/dist/cli-tui/tui-renderer/ui-state-controller.d.ts +1 -1
  261. package/dist/cli-tui/tui-renderer/ui-state-controller.js +1 -1
  262. package/dist/cli-tui/tui-renderer/ui-state-controller.js.map +1 -1
  263. package/dist/cli-tui/tui-renderer.d.ts +1 -3
  264. package/dist/cli-tui/tui-renderer.d.ts.map +1 -1
  265. package/dist/cli-tui/tui-renderer.js +37 -83
  266. package/dist/cli-tui/tui-renderer.js.map +1 -1
  267. package/dist/cli-tui/utils/runtime-badges.d.ts +8 -0
  268. package/dist/cli-tui/utils/runtime-badges.d.ts.map +1 -1
  269. package/dist/cli-tui/utils/runtime-badges.js +58 -0
  270. package/dist/cli-tui/utils/runtime-badges.js.map +1 -1
  271. package/dist/cli.js +42555 -23133
  272. package/dist/cli.js.map +1 -1
  273. package/dist/config/env-vars.d.ts +4 -0
  274. package/dist/config/env-vars.d.ts.map +1 -1
  275. package/dist/config/env-vars.js +4 -0
  276. package/dist/config/env-vars.js.map +1 -1
  277. package/dist/config/feature-flags.d.ts +44 -0
  278. package/dist/config/feature-flags.d.ts.map +1 -1
  279. package/dist/config/feature-flags.js +214 -0
  280. package/dist/config/feature-flags.js.map +1 -1
  281. package/dist/connectors/service-client.d.ts +98 -0
  282. package/dist/connectors/service-client.d.ts.map +1 -0
  283. package/dist/connectors/service-client.js +459 -0
  284. package/dist/connectors/service-client.js.map +1 -0
  285. package/dist/conversation/render-model.d.ts.map +1 -1
  286. package/dist/conversation/render-model.js +53 -3
  287. package/dist/conversation/render-model.js.map +1 -1
  288. package/dist/db/health.d.ts +8 -0
  289. package/dist/db/health.d.ts.map +1 -0
  290. package/dist/db/health.js +64 -0
  291. package/dist/db/health.js.map +1 -0
  292. package/dist/db/migrate.d.ts +301 -0
  293. package/dist/db/migrate.d.ts.map +1 -1
  294. package/dist/db/migrate.js +186 -0
  295. package/dist/db/migrate.js.map +1 -1
  296. package/dist/db/migrations/0000_initial.sql +308 -0
  297. package/dist/db/migrations/0001_shared_sessions.sql +18 -0
  298. package/dist/db/migrations/0002_usage_metrics.sql +28 -0
  299. package/dist/db/migrations/0003_execution_traces.sql +18 -0
  300. package/dist/db/migrations/0004_workspace_config.sql +11 -0
  301. package/dist/db/migrations/0005_revenue_attribution.sql +31 -0
  302. package/dist/db/migrations/0006_hosted_session_storage.sql +51 -0
  303. package/dist/db/migrations/0007_reconcile_legacy_audit_hash_cache.sql +24 -0
  304. package/dist/db/migrations/0008_reconcile_legacy_webhook_deliveries.sql +290 -0
  305. package/dist/db/migrations/meta/0000_snapshot.json +2438 -0
  306. package/dist/db/migrations/meta/_journal.json +69 -0
  307. package/dist/db/schema.d.ts +2232 -844
  308. package/dist/db/schema.d.ts.map +1 -1
  309. package/dist/db/schema.js +187 -1
  310. package/dist/db/schema.js.map +1 -1
  311. package/dist/evalops/agent-bootstrap.d.ts +73 -0
  312. package/dist/evalops/agent-bootstrap.d.ts.map +1 -0
  313. package/dist/evalops/agent-bootstrap.js +380 -0
  314. package/dist/evalops/agent-bootstrap.js.map +1 -0
  315. package/dist/export-html.d.ts.map +1 -1
  316. package/dist/export-html.js +7 -4
  317. package/dist/export-html.js.map +1 -1
  318. package/dist/headless/utility-command-manager.d.ts +2 -1
  319. package/dist/headless/utility-command-manager.d.ts.map +1 -1
  320. package/dist/headless/utility-command-manager.js +12 -6
  321. package/dist/headless/utility-command-manager.js.map +1 -1
  322. package/dist/headless/utility-file-read.d.ts +1 -0
  323. package/dist/headless/utility-file-read.d.ts.map +1 -1
  324. package/dist/headless/utility-file-read.js +5 -1
  325. package/dist/headless/utility-file-read.js.map +1 -1
  326. package/dist/headless/utility-file-search.d.ts +1 -0
  327. package/dist/headless/utility-file-search.d.ts.map +1 -1
  328. package/dist/headless/utility-file-search.js +4 -1
  329. package/dist/headless/utility-file-search.js.map +1 -1
  330. package/dist/headless/utility-file-watch-manager.d.ts +2 -1
  331. package/dist/headless/utility-file-watch-manager.d.ts.map +1 -1
  332. package/dist/headless/utility-file-watch-manager.js +6 -2
  333. package/dist/headless/utility-file-watch-manager.js.map +1 -1
  334. package/dist/headless/workspace-root.d.ts +8 -0
  335. package/dist/headless/workspace-root.d.ts.map +1 -0
  336. package/dist/headless/workspace-root.js +74 -0
  337. package/dist/headless/workspace-root.js.map +1 -0
  338. package/dist/hooks/notification-hooks.d.ts +5 -0
  339. package/dist/hooks/notification-hooks.d.ts.map +1 -1
  340. package/dist/hooks/notification-hooks.js +4 -0
  341. package/dist/hooks/notification-hooks.js.map +1 -1
  342. package/dist/lsp/diagnostic-deltas.d.ts +20 -0
  343. package/dist/lsp/diagnostic-deltas.d.ts.map +1 -0
  344. package/dist/lsp/diagnostic-deltas.js +92 -0
  345. package/dist/lsp/diagnostic-deltas.js.map +1 -0
  346. package/dist/lsp/diagnostic-repair.d.ts +48 -0
  347. package/dist/lsp/diagnostic-repair.d.ts.map +1 -0
  348. package/dist/lsp/diagnostic-repair.js +143 -0
  349. package/dist/lsp/diagnostic-repair.js.map +1 -0
  350. package/dist/main.d.ts.map +1 -1
  351. package/dist/main.js +127 -37
  352. package/dist/main.js.map +1 -1
  353. package/dist/mcp/config.d.ts +4 -2
  354. package/dist/mcp/config.d.ts.map +1 -1
  355. package/dist/mcp/config.js +58 -14
  356. package/dist/mcp/config.js.map +1 -1
  357. package/dist/mcp/index.d.ts +1 -0
  358. package/dist/mcp/index.d.ts.map +1 -1
  359. package/dist/mcp/index.js +1 -0
  360. package/dist/mcp/index.js.map +1 -1
  361. package/dist/mcp/manager.d.ts +1 -0
  362. package/dist/mcp/manager.d.ts.map +1 -1
  363. package/dist/mcp/manager.js +1 -0
  364. package/dist/mcp/manager.js.map +1 -1
  365. package/dist/mcp/platform-plugin.d.ts +3 -0
  366. package/dist/mcp/platform-plugin.d.ts.map +1 -0
  367. package/dist/mcp/platform-plugin.js +117 -0
  368. package/dist/mcp/platform-plugin.js.map +1 -0
  369. package/dist/mcp/tool-bridge.d.ts +15 -0
  370. package/dist/mcp/tool-bridge.d.ts.map +1 -1
  371. package/dist/mcp/tool-bridge.js +194 -6
  372. package/dist/mcp/tool-bridge.js.map +1 -1
  373. package/dist/memory/platform-memory-client.d.ts +130 -0
  374. package/dist/memory/platform-memory-client.d.ts.map +1 -0
  375. package/dist/memory/platform-memory-client.js +330 -0
  376. package/dist/memory/platform-memory-client.js.map +1 -0
  377. package/dist/memory/service-client.d.ts.map +1 -1
  378. package/dist/memory/service-client.js +1 -2
  379. package/dist/memory/service-client.js.map +1 -1
  380. package/dist/models/builtin.d.ts.map +1 -1
  381. package/dist/models/builtin.js +137 -0
  382. package/dist/models/builtin.js.map +1 -1
  383. package/dist/models/config-loader.d.ts +10 -10
  384. package/dist/models/config-loader.d.ts.map +1 -1
  385. package/dist/models/config-loader.js +1 -0
  386. package/dist/models/config-loader.js.map +1 -1
  387. package/dist/models/registry.d.ts +1 -0
  388. package/dist/models/registry.d.ts.map +1 -1
  389. package/dist/models/registry.js +1 -0
  390. package/dist/models/registry.js.map +1 -1
  391. package/dist/oauth/connectors.d.ts +25 -0
  392. package/dist/oauth/connectors.d.ts.map +1 -0
  393. package/dist/oauth/connectors.js +253 -0
  394. package/dist/oauth/connectors.js.map +1 -0
  395. package/dist/oauth/device-identity.d.ts +18 -0
  396. package/dist/oauth/device-identity.d.ts.map +1 -0
  397. package/dist/oauth/device-identity.js +193 -0
  398. package/dist/oauth/device-identity.js.map +1 -0
  399. package/dist/oauth/evalops.d.ts.map +1 -1
  400. package/dist/oauth/evalops.js +74 -15
  401. package/dist/oauth/evalops.js.map +1 -1
  402. package/dist/oauth/index.d.ts +1 -1
  403. package/dist/oauth/index.d.ts.map +1 -1
  404. package/dist/oauth/index.js +31 -1
  405. package/dist/oauth/index.js.map +1 -1
  406. package/dist/oauth/openai-codex.d.ts +16 -0
  407. package/dist/oauth/openai-codex.d.ts.map +1 -0
  408. package/dist/oauth/openai-codex.js +300 -0
  409. package/dist/oauth/openai-codex.js.map +1 -0
  410. package/dist/opentelemetry.d.ts.map +1 -1
  411. package/dist/opentelemetry.js +9 -2
  412. package/dist/opentelemetry.js.map +1 -1
  413. package/dist/platform/agent-runtime-client.d.ts +279 -0
  414. package/dist/platform/agent-runtime-client.d.ts.map +1 -0
  415. package/dist/platform/agent-runtime-client.js +515 -0
  416. package/dist/platform/agent-runtime-client.js.map +1 -0
  417. package/dist/platform/cerebro-facts-client.d.ts +56 -0
  418. package/dist/platform/cerebro-facts-client.d.ts.map +1 -0
  419. package/dist/platform/cerebro-facts-client.js +297 -0
  420. package/dist/platform/cerebro-facts-client.js.map +1 -0
  421. package/dist/platform/client.d.ts +2 -1
  422. package/dist/platform/client.d.ts.map +1 -1
  423. package/dist/platform/client.js +9 -26
  424. package/dist/platform/client.js.map +1 -1
  425. package/dist/platform/core-services.d.ts +128 -0
  426. package/dist/platform/core-services.d.ts.map +1 -1
  427. package/dist/platform/core-services.js +128 -0
  428. package/dist/platform/core-services.js.map +1 -1
  429. package/dist/platform/maestro-timeline-client.d.ts +22 -0
  430. package/dist/platform/maestro-timeline-client.d.ts.map +1 -0
  431. package/dist/platform/maestro-timeline-client.js +373 -0
  432. package/dist/platform/maestro-timeline-client.js.map +1 -0
  433. package/dist/platform/tool-execution-client.d.ts +104 -0
  434. package/dist/platform/tool-execution-client.d.ts.map +1 -0
  435. package/dist/platform/tool-execution-client.js +284 -0
  436. package/dist/platform/tool-execution-client.js.map +1 -0
  437. package/dist/prompts/service-client.d.ts.map +1 -1
  438. package/dist/prompts/service-client.js +5 -2
  439. package/dist/prompts/service-client.js.map +1 -1
  440. package/dist/providers/anthropic-auth.d.ts.map +1 -1
  441. package/dist/providers/anthropic-auth.js +8 -6
  442. package/dist/providers/anthropic-auth.js.map +1 -1
  443. package/dist/providers/api-keys.d.ts +1 -0
  444. package/dist/providers/api-keys.d.ts.map +1 -1
  445. package/dist/providers/api-keys.js +5 -0
  446. package/dist/providers/api-keys.js.map +1 -1
  447. package/dist/providers/auth.d.ts +2 -1
  448. package/dist/providers/auth.d.ts.map +1 -1
  449. package/dist/providers/auth.js +26 -3
  450. package/dist/providers/auth.js.map +1 -1
  451. package/dist/remote-runner/attach-client.d.ts +41 -0
  452. package/dist/remote-runner/attach-client.d.ts.map +1 -0
  453. package/dist/remote-runner/attach-client.js +692 -0
  454. package/dist/remote-runner/attach-client.js.map +1 -0
  455. package/dist/remote-runner/client.d.ts +205 -0
  456. package/dist/remote-runner/client.d.ts.map +1 -0
  457. package/dist/remote-runner/client.js +633 -0
  458. package/dist/remote-runner/client.js.map +1 -0
  459. package/dist/safety/action-firewall.d.ts +6 -1
  460. package/dist/safety/action-firewall.d.ts.map +1 -1
  461. package/dist/safety/action-firewall.js +62 -26
  462. package/dist/safety/action-firewall.js.map +1 -1
  463. package/dist/safety/governance-service-client.d.ts +36 -0
  464. package/dist/safety/governance-service-client.d.ts.map +1 -0
  465. package/dist/safety/governance-service-client.js +279 -0
  466. package/dist/safety/governance-service-client.js.map +1 -0
  467. package/dist/safety/policy.d.ts +13 -2
  468. package/dist/safety/policy.d.ts.map +1 -1
  469. package/dist/safety/policy.js +474 -52
  470. package/dist/safety/policy.js.map +1 -1
  471. package/dist/sdk-tools.d.ts +21 -0
  472. package/dist/sdk-tools.d.ts.map +1 -1
  473. package/dist/sdk-tools.js +16 -0
  474. package/dist/sdk-tools.js.map +1 -1
  475. package/dist/server/app-context.d.ts +25 -0
  476. package/dist/server/app-context.d.ts.map +1 -1
  477. package/dist/server/app-context.js.map +1 -1
  478. package/dist/server/approval-service.d.ts +7 -8
  479. package/dist/server/approval-service.d.ts.map +1 -1
  480. package/dist/server/approval-service.js +12 -24
  481. package/dist/server/approval-service.js.map +1 -1
  482. package/dist/server/authz.d.ts +23 -2
  483. package/dist/server/authz.d.ts.map +1 -1
  484. package/dist/server/authz.js +153 -17
  485. package/dist/server/authz.js.map +1 -1
  486. package/dist/server/handlers/approvals.d.ts.map +1 -1
  487. package/dist/server/handlers/approvals.js +3 -10
  488. package/dist/server/handlers/approvals.js.map +1 -1
  489. package/dist/server/handlers/branch.d.ts.map +1 -1
  490. package/dist/server/handlers/branch.js +29 -20
  491. package/dist/server/handlers/branch.js.map +1 -1
  492. package/dist/server/handlers/bridge.d.ts.map +1 -1
  493. package/dist/server/handlers/bridge.js +3 -2
  494. package/dist/server/handlers/bridge.js.map +1 -1
  495. package/dist/server/handlers/chat-ws.d.ts.map +1 -1
  496. package/dist/server/handlers/chat-ws.js +23 -31
  497. package/dist/server/handlers/chat-ws.js.map +1 -1
  498. package/dist/server/handlers/chat.d.ts.map +1 -1
  499. package/dist/server/handlers/chat.js +105 -46
  500. package/dist/server/handlers/chat.js.map +1 -1
  501. package/dist/server/handlers/compliance.d.ts +3 -0
  502. package/dist/server/handlers/compliance.d.ts.map +1 -0
  503. package/dist/server/handlers/compliance.js +53 -0
  504. package/dist/server/handlers/compliance.js.map +1 -0
  505. package/dist/server/handlers/context.d.ts.map +1 -1
  506. package/dist/server/handlers/context.js +3 -8
  507. package/dist/server/handlers/context.js.map +1 -1
  508. package/dist/server/handlers/fleet.d.ts +4 -0
  509. package/dist/server/handlers/fleet.d.ts.map +1 -0
  510. package/dist/server/handlers/fleet.js +9 -0
  511. package/dist/server/handlers/fleet.js.map +1 -0
  512. package/dist/server/handlers/headless-sessions.d.ts +4 -0
  513. package/dist/server/handlers/headless-sessions.d.ts.map +1 -1
  514. package/dist/server/handlers/headless-sessions.js +168 -3
  515. package/dist/server/handlers/headless-sessions.js.map +1 -1
  516. package/dist/server/handlers/health.d.ts +31 -2
  517. package/dist/server/handlers/health.d.ts.map +1 -1
  518. package/dist/server/handlers/health.js +82 -8
  519. package/dist/server/handlers/health.js.map +1 -1
  520. package/dist/server/handlers/hosted-runner-drain.d.ts +128 -0
  521. package/dist/server/handlers/hosted-runner-drain.d.ts.map +1 -0
  522. package/dist/server/handlers/hosted-runner-drain.js +373 -0
  523. package/dist/server/handlers/hosted-runner-drain.js.map +1 -0
  524. package/dist/server/handlers/hosted-runner-identity.d.ts +17 -0
  525. package/dist/server/handlers/hosted-runner-identity.d.ts.map +1 -0
  526. package/dist/server/handlers/hosted-runner-identity.js +39 -0
  527. package/dist/server/handlers/hosted-runner-identity.js.map +1 -0
  528. package/dist/server/handlers/intelligent-router.d.ts +3 -0
  529. package/dist/server/handlers/intelligent-router.d.ts.map +1 -0
  530. package/dist/server/handlers/intelligent-router.js +141 -0
  531. package/dist/server/handlers/intelligent-router.js.map +1 -0
  532. package/dist/server/handlers/models.d.ts.map +1 -1
  533. package/dist/server/handlers/models.js +14 -0
  534. package/dist/server/handlers/models.js.map +1 -1
  535. package/dist/server/handlers/pending-requests.d.ts +8 -0
  536. package/dist/server/handlers/pending-requests.d.ts.map +1 -0
  537. package/dist/server/handlers/pending-requests.js +149 -0
  538. package/dist/server/handlers/pending-requests.js.map +1 -0
  539. package/dist/server/handlers/revenue-attribution.d.ts +3 -0
  540. package/dist/server/handlers/revenue-attribution.d.ts.map +1 -0
  541. package/dist/server/handlers/revenue-attribution.js +45 -0
  542. package/dist/server/handlers/revenue-attribution.js.map +1 -0
  543. package/dist/server/handlers/runtime-app-server-ws.d.ts +10 -0
  544. package/dist/server/handlers/runtime-app-server-ws.d.ts.map +1 -0
  545. package/dist/server/handlers/runtime-app-server-ws.js +206 -0
  546. package/dist/server/handlers/runtime-app-server-ws.js.map +1 -0
  547. package/dist/server/handlers/session-artifacts.js +2 -2
  548. package/dist/server/handlers/session-artifacts.js.map +1 -1
  549. package/dist/server/handlers/session-attachments.js +3 -3
  550. package/dist/server/handlers/session-attachments.js.map +1 -1
  551. package/dist/server/handlers/session-timeline.d.ts +11 -0
  552. package/dist/server/handlers/session-timeline.d.ts.map +1 -0
  553. package/dist/server/handlers/session-timeline.js +77 -0
  554. package/dist/server/handlers/session-timeline.js.map +1 -0
  555. package/dist/server/handlers/sessions.d.ts +11 -0
  556. package/dist/server/handlers/sessions.d.ts.map +1 -1
  557. package/dist/server/handlers/sessions.js +68 -100
  558. package/dist/server/handlers/sessions.js.map +1 -1
  559. package/dist/server/handlers/traces.d.ts +3 -0
  560. package/dist/server/handlers/traces.d.ts.map +1 -0
  561. package/dist/server/handlers/traces.js +60 -0
  562. package/dist/server/handlers/traces.js.map +1 -0
  563. package/dist/server/handlers/usage-analytics.d.ts +3 -0
  564. package/dist/server/handlers/usage-analytics.d.ts.map +1 -0
  565. package/dist/server/handlers/usage-analytics.js +40 -0
  566. package/dist/server/handlers/usage-analytics.js.map +1 -0
  567. package/dist/server/handlers/workspace-config.d.ts +3 -0
  568. package/dist/server/handlers/workspace-config.d.ts.map +1 -0
  569. package/dist/server/handlers/workspace-config.js +62 -0
  570. package/dist/server/handlers/workspace-config.js.map +1 -0
  571. package/dist/server/headless-in-process-host.d.ts +8 -1
  572. package/dist/server/headless-in-process-host.d.ts.map +1 -1
  573. package/dist/server/headless-in-process-host.js +6 -0
  574. package/dist/server/headless-in-process-host.js.map +1 -1
  575. package/dist/server/headless-runtime-service.d.ts +99 -1
  576. package/dist/server/headless-runtime-service.d.ts.map +1 -1
  577. package/dist/server/headless-runtime-service.js +286 -23
  578. package/dist/server/headless-runtime-service.js.map +1 -1
  579. package/dist/server/hosted-session-manager.d.ts +103 -0
  580. package/dist/server/hosted-session-manager.d.ts.map +1 -0
  581. package/dist/server/hosted-session-manager.js +629 -0
  582. package/dist/server/hosted-session-manager.js.map +1 -0
  583. package/dist/server/pending-request-payload.d.ts +4 -0
  584. package/dist/server/pending-request-payload.d.ts.map +1 -0
  585. package/dist/server/pending-request-payload.js +107 -0
  586. package/dist/server/pending-request-payload.js.map +1 -0
  587. package/dist/server/request-context.d.ts +4 -0
  588. package/dist/server/request-context.d.ts.map +1 -1
  589. package/dist/server/request-context.js +9 -0
  590. package/dist/server/request-context.js.map +1 -1
  591. package/dist/server/routes.d.ts.map +1 -1
  592. package/dist/server/routes.js +149 -1
  593. package/dist/server/routes.js.map +1 -1
  594. package/dist/server/runtime-ws-access.d.ts +16 -0
  595. package/dist/server/runtime-ws-access.d.ts.map +1 -0
  596. package/dist/server/runtime-ws-access.js +21 -0
  597. package/dist/server/runtime-ws-access.js.map +1 -0
  598. package/dist/server/server-middlewares.d.ts +1 -1
  599. package/dist/server/server-middlewares.d.ts.map +1 -1
  600. package/dist/server/server-middlewares.js +35 -27
  601. package/dist/server/server-middlewares.js.map +1 -1
  602. package/dist/server/server-request-manager.d.ts +8 -27
  603. package/dist/server/server-request-manager.d.ts.map +1 -1
  604. package/dist/server/server-request-manager.js +7 -0
  605. package/dist/server/server-request-manager.js.map +1 -1
  606. package/dist/server/server-utils.d.ts +2 -1
  607. package/dist/server/server-utils.d.ts.map +1 -1
  608. package/dist/server/server-utils.js +11 -1
  609. package/dist/server/server-utils.js.map +1 -1
  610. package/dist/server/session-event-env.d.ts +2 -0
  611. package/dist/server/session-event-env.d.ts.map +1 -0
  612. package/dist/server/session-event-env.js +8 -0
  613. package/dist/server/session-event-env.js.map +1 -0
  614. package/dist/server/session-initialization.d.ts +25 -4
  615. package/dist/server/session-initialization.d.ts.map +1 -1
  616. package/dist/server/session-initialization.js +22 -5
  617. package/dist/server/session-initialization.js.map +1 -1
  618. package/dist/server/session-scope.d.ts +4 -0
  619. package/dist/server/session-scope.d.ts.map +1 -1
  620. package/dist/server/session-scope.js +44 -4
  621. package/dist/server/session-scope.js.map +1 -1
  622. package/dist/server/session-timeline.d.ts +13 -0
  623. package/dist/server/session-timeline.d.ts.map +1 -0
  624. package/dist/server/session-timeline.js +566 -0
  625. package/dist/server/session-timeline.js.map +1 -0
  626. package/dist/services/compliance/controls.d.ts +6 -0
  627. package/dist/services/compliance/controls.d.ts.map +1 -0
  628. package/dist/services/compliance/controls.js +113 -0
  629. package/dist/services/compliance/controls.js.map +1 -0
  630. package/dist/services/compliance/index.d.ts +6 -0
  631. package/dist/services/compliance/index.d.ts.map +1 -0
  632. package/dist/services/compliance/index.js +5 -0
  633. package/dist/services/compliance/index.js.map +1 -0
  634. package/dist/services/compliance/normalize.d.ts +23 -0
  635. package/dist/services/compliance/normalize.d.ts.map +1 -0
  636. package/dist/services/compliance/normalize.js +226 -0
  637. package/dist/services/compliance/normalize.js.map +1 -0
  638. package/dist/services/compliance/recorder.d.ts +22 -0
  639. package/dist/services/compliance/recorder.d.ts.map +1 -0
  640. package/dist/services/compliance/recorder.js +89 -0
  641. package/dist/services/compliance/recorder.js.map +1 -0
  642. package/dist/services/compliance/service.d.ts +24 -0
  643. package/dist/services/compliance/service.d.ts.map +1 -0
  644. package/dist/services/compliance/service.js +426 -0
  645. package/dist/services/compliance/service.js.map +1 -0
  646. package/dist/services/compliance/types.d.ts +185 -0
  647. package/dist/services/compliance/types.d.ts.map +1 -0
  648. package/dist/services/compliance/types.js +2 -0
  649. package/dist/services/compliance/types.js.map +1 -0
  650. package/dist/services/intelligent-router/index.d.ts +5 -0
  651. package/dist/services/intelligent-router/index.d.ts.map +1 -0
  652. package/dist/services/intelligent-router/index.js +5 -0
  653. package/dist/services/intelligent-router/index.js.map +1 -0
  654. package/dist/services/intelligent-router/normalize.d.ts +9 -0
  655. package/dist/services/intelligent-router/normalize.d.ts.map +1 -0
  656. package/dist/services/intelligent-router/normalize.js +169 -0
  657. package/dist/services/intelligent-router/normalize.js.map +1 -0
  658. package/dist/services/intelligent-router/recorder.d.ts +24 -0
  659. package/dist/services/intelligent-router/recorder.d.ts.map +1 -0
  660. package/dist/services/intelligent-router/recorder.js +98 -0
  661. package/dist/services/intelligent-router/recorder.js.map +1 -0
  662. package/dist/services/intelligent-router/service.d.ts +22 -0
  663. package/dist/services/intelligent-router/service.d.ts.map +1 -0
  664. package/dist/services/intelligent-router/service.js +328 -0
  665. package/dist/services/intelligent-router/service.js.map +1 -0
  666. package/dist/services/intelligent-router/types.d.ts +98 -0
  667. package/dist/services/intelligent-router/types.d.ts.map +1 -0
  668. package/dist/services/intelligent-router/types.js +7 -0
  669. package/dist/services/intelligent-router/types.js.map +1 -0
  670. package/dist/services/revenue-attribution/index.d.ts +4 -0
  671. package/dist/services/revenue-attribution/index.d.ts.map +1 -0
  672. package/dist/services/revenue-attribution/index.js +4 -0
  673. package/dist/services/revenue-attribution/index.js.map +1 -0
  674. package/dist/services/revenue-attribution/normalize.d.ts +13 -0
  675. package/dist/services/revenue-attribution/normalize.d.ts.map +1 -0
  676. package/dist/services/revenue-attribution/normalize.js +155 -0
  677. package/dist/services/revenue-attribution/normalize.js.map +1 -0
  678. package/dist/services/revenue-attribution/service.d.ts +21 -0
  679. package/dist/services/revenue-attribution/service.d.ts.map +1 -0
  680. package/dist/services/revenue-attribution/service.js +248 -0
  681. package/dist/services/revenue-attribution/service.js.map +1 -0
  682. package/dist/services/revenue-attribution/types.d.ts +96 -0
  683. package/dist/services/revenue-attribution/types.d.ts.map +1 -0
  684. package/dist/services/revenue-attribution/types.js +7 -0
  685. package/dist/services/revenue-attribution/types.js.map +1 -0
  686. package/dist/services/traces/index.d.ts +5 -0
  687. package/dist/services/traces/index.d.ts.map +1 -0
  688. package/dist/services/traces/index.js +4 -0
  689. package/dist/services/traces/index.js.map +1 -0
  690. package/dist/services/traces/normalize.d.ts +20 -0
  691. package/dist/services/traces/normalize.d.ts.map +1 -0
  692. package/dist/services/traces/normalize.js +261 -0
  693. package/dist/services/traces/normalize.js.map +1 -0
  694. package/dist/services/traces/otel.d.ts +3 -0
  695. package/dist/services/traces/otel.d.ts.map +1 -0
  696. package/dist/services/traces/otel.js +173 -0
  697. package/dist/services/traces/otel.js.map +1 -0
  698. package/dist/services/traces/service.d.ts +17 -0
  699. package/dist/services/traces/service.d.ts.map +1 -0
  700. package/dist/services/traces/service.js +197 -0
  701. package/dist/services/traces/service.js.map +1 -0
  702. package/dist/services/traces/types.d.ts +130 -0
  703. package/dist/services/traces/types.d.ts.map +1 -0
  704. package/dist/services/traces/types.js +8 -0
  705. package/dist/services/traces/types.js.map +1 -0
  706. package/dist/services/usage-analytics/aggregation.d.ts +18 -0
  707. package/dist/services/usage-analytics/aggregation.d.ts.map +1 -0
  708. package/dist/services/usage-analytics/aggregation.js +130 -0
  709. package/dist/services/usage-analytics/aggregation.js.map +1 -0
  710. package/dist/services/usage-analytics/index.d.ts +5 -0
  711. package/dist/services/usage-analytics/index.d.ts.map +1 -0
  712. package/dist/services/usage-analytics/index.js +4 -0
  713. package/dist/services/usage-analytics/index.js.map +1 -0
  714. package/dist/services/usage-analytics/recorder.d.ts +16 -0
  715. package/dist/services/usage-analytics/recorder.d.ts.map +1 -0
  716. package/dist/services/usage-analytics/recorder.js +128 -0
  717. package/dist/services/usage-analytics/recorder.js.map +1 -0
  718. package/dist/services/usage-analytics/service.d.ts +15 -0
  719. package/dist/services/usage-analytics/service.d.ts.map +1 -0
  720. package/dist/services/usage-analytics/service.js +210 -0
  721. package/dist/services/usage-analytics/service.js.map +1 -0
  722. package/dist/services/usage-analytics/types.d.ts +80 -0
  723. package/dist/services/usage-analytics/types.d.ts.map +1 -0
  724. package/dist/services/usage-analytics/types.js +2 -0
  725. package/dist/services/usage-analytics/types.js.map +1 -0
  726. package/dist/services/workspace-config/index.d.ts +6 -0
  727. package/dist/services/workspace-config/index.d.ts.map +1 -0
  728. package/dist/services/workspace-config/index.js +5 -0
  729. package/dist/services/workspace-config/index.js.map +1 -0
  730. package/dist/services/workspace-config/middleware.d.ts +5 -0
  731. package/dist/services/workspace-config/middleware.d.ts.map +1 -0
  732. package/dist/services/workspace-config/middleware.js +98 -0
  733. package/dist/services/workspace-config/middleware.js.map +1 -0
  734. package/dist/services/workspace-config/normalize.d.ts +17 -0
  735. package/dist/services/workspace-config/normalize.d.ts.map +1 -0
  736. package/dist/services/workspace-config/normalize.js +148 -0
  737. package/dist/services/workspace-config/normalize.js.map +1 -0
  738. package/dist/services/workspace-config/policy.d.ts +16 -0
  739. package/dist/services/workspace-config/policy.d.ts.map +1 -0
  740. package/dist/services/workspace-config/policy.js +77 -0
  741. package/dist/services/workspace-config/policy.js.map +1 -0
  742. package/dist/services/workspace-config/service.d.ts +20 -0
  743. package/dist/services/workspace-config/service.d.ts.map +1 -0
  744. package/dist/services/workspace-config/service.js +162 -0
  745. package/dist/services/workspace-config/service.js.map +1 -0
  746. package/dist/services/workspace-config/types.d.ts +71 -0
  747. package/dist/services/workspace-config/types.d.ts.map +1 -0
  748. package/dist/services/workspace-config/types.js +2 -0
  749. package/dist/services/workspace-config/types.js.map +1 -0
  750. package/dist/session/manager.d.ts.map +1 -1
  751. package/dist/session/manager.js +10 -0
  752. package/dist/session/manager.js.map +1 -1
  753. package/dist/session/migration.d.ts.map +1 -1
  754. package/dist/session/migration.js +2 -1
  755. package/dist/session/migration.js.map +1 -1
  756. package/dist/session/session-memory.d.ts.map +1 -1
  757. package/dist/session/session-memory.js +7 -1
  758. package/dist/session/session-memory.js.map +1 -1
  759. package/dist/session/types.d.ts +1 -2
  760. package/dist/session/types.d.ts.map +1 -1
  761. package/dist/session/types.js +1 -22
  762. package/dist/session/types.js.map +1 -1
  763. package/dist/session/wire-format.d.ts +7 -0
  764. package/dist/session/wire-format.d.ts.map +1 -0
  765. package/dist/session/wire-format.generated.d.ts +95 -0
  766. package/dist/session/wire-format.generated.d.ts.map +1 -0
  767. package/dist/session/wire-format.generated.js +111 -0
  768. package/dist/session/wire-format.generated.js.map +1 -0
  769. package/dist/session/wire-format.js +145 -0
  770. package/dist/session/wire-format.js.map +1 -0
  771. package/dist/shared-memory/client.d.ts.map +1 -1
  772. package/dist/shared-memory/client.js +22 -22
  773. package/dist/shared-memory/client.js.map +1 -1
  774. package/dist/skills/artifact-metadata.d.ts +16 -0
  775. package/dist/skills/artifact-metadata.d.ts.map +1 -0
  776. package/dist/skills/artifact-metadata.js +86 -0
  777. package/dist/skills/artifact-metadata.js.map +1 -0
  778. package/dist/skills/loader.d.ts +2 -2
  779. package/dist/skills/loader.d.ts.map +1 -1
  780. package/dist/skills/loader.js +1 -0
  781. package/dist/skills/loader.js.map +1 -1
  782. package/dist/skills/service-client.d.ts +42 -0
  783. package/dist/skills/service-client.d.ts.map +1 -0
  784. package/dist/skills/service-client.js +258 -0
  785. package/dist/skills/service-client.js.map +1 -0
  786. package/dist/skills/tool.d.ts +3 -0
  787. package/dist/skills/tool.d.ts.map +1 -1
  788. package/dist/skills/tool.js +67 -5
  789. package/dist/skills/tool.js.map +1 -1
  790. package/dist/telemetry/index.d.ts +4 -0
  791. package/dist/telemetry/index.d.ts.map +1 -1
  792. package/dist/telemetry/index.js +5 -0
  793. package/dist/telemetry/index.js.map +1 -1
  794. package/dist/telemetry/maestro-event-bus.d.ts +440 -0
  795. package/dist/telemetry/maestro-event-bus.d.ts.map +1 -0
  796. package/dist/telemetry/maestro-event-bus.js +784 -0
  797. package/dist/telemetry/maestro-event-bus.js.map +1 -0
  798. package/dist/telemetry/maestro-event-catalog.d.ts +48 -0
  799. package/dist/telemetry/maestro-event-catalog.d.ts.map +1 -0
  800. package/dist/telemetry/maestro-event-catalog.js +69 -0
  801. package/dist/telemetry/maestro-event-catalog.js.map +1 -0
  802. package/dist/telemetry/maestro-platform-replay-fixture.d.ts +24 -0
  803. package/dist/telemetry/maestro-platform-replay-fixture.d.ts.map +1 -0
  804. package/dist/telemetry/maestro-platform-replay-fixture.js +400 -0
  805. package/dist/telemetry/maestro-platform-replay-fixture.js.map +1 -0
  806. package/dist/telemetry/maestro-publisher-conformance-fixture.d.ts +29 -0
  807. package/dist/telemetry/maestro-publisher-conformance-fixture.d.ts.map +1 -0
  808. package/dist/telemetry/maestro-publisher-conformance-fixture.js +240 -0
  809. package/dist/telemetry/maestro-publisher-conformance-fixture.js.map +1 -0
  810. package/dist/telemetry/meter-service-client.d.ts +0 -33
  811. package/dist/telemetry/meter-service-client.d.ts.map +1 -1
  812. package/dist/telemetry/meter-service-client.js +22 -50
  813. package/dist/telemetry/meter-service-client.js.map +1 -1
  814. package/dist/telemetry/turn-tracker.d.ts.map +1 -1
  815. package/dist/telemetry/turn-tracker.js +5 -5
  816. package/dist/telemetry/turn-tracker.js.map +1 -1
  817. package/dist/telemetry/wide-events.d.ts +8 -0
  818. package/dist/telemetry/wide-events.d.ts.map +1 -1
  819. package/dist/telemetry/wide-events.js +28 -0
  820. package/dist/telemetry/wide-events.js.map +1 -1
  821. package/dist/telemetry.d.ts +1 -1
  822. package/dist/telemetry.d.ts.map +1 -1
  823. package/dist/telemetry.js +14 -4
  824. package/dist/telemetry.js.map +1 -1
  825. package/dist/timeline/redaction.d.ts +5 -0
  826. package/dist/timeline/redaction.d.ts.map +1 -0
  827. package/dist/timeline/redaction.js +119 -0
  828. package/dist/timeline/redaction.js.map +1 -0
  829. package/dist/tools/ask-user.d.ts +26 -0
  830. package/dist/tools/ask-user.d.ts.map +1 -1
  831. package/dist/tools/ask-user.js +33 -1
  832. package/dist/tools/ask-user.js.map +1 -1
  833. package/dist/tools/background/task-types.d.ts +1 -1
  834. package/dist/tools/edit.d.ts +2 -0
  835. package/dist/tools/edit.d.ts.map +1 -1
  836. package/dist/tools/edit.js +27 -7
  837. package/dist/tools/edit.js.map +1 -1
  838. package/dist/tools/index.d.ts +9 -0
  839. package/dist/tools/index.d.ts.map +1 -1
  840. package/dist/tools/pipeline.d.ts.map +1 -1
  841. package/dist/tools/pipeline.js +16 -7
  842. package/dist/tools/pipeline.js.map +1 -1
  843. package/dist/tools/write.d.ts +2 -0
  844. package/dist/tools/write.d.ts.map +1 -1
  845. package/dist/tools/write.js +24 -6
  846. package/dist/tools/write.js.map +1 -1
  847. package/dist/tracking/cost-tracker.d.ts +15 -12
  848. package/dist/tracking/cost-tracker.d.ts.map +1 -1
  849. package/dist/tracking/cost-tracker.js +29 -40
  850. package/dist/tracking/cost-tracker.js.map +1 -1
  851. package/dist/utils/checkpoint-profiler.d.ts +29 -0
  852. package/dist/utils/checkpoint-profiler.d.ts.map +1 -0
  853. package/dist/utils/checkpoint-profiler.js +118 -0
  854. package/dist/utils/checkpoint-profiler.js.map +1 -0
  855. package/dist/utils/downstream-http.d.ts +21 -0
  856. package/dist/utils/downstream-http.d.ts.map +1 -0
  857. package/dist/utils/downstream-http.js +151 -0
  858. package/dist/utils/downstream-http.js.map +1 -0
  859. package/dist/utils/downstream.d.ts +18 -0
  860. package/dist/utils/downstream.d.ts.map +1 -0
  861. package/dist/utils/downstream.js +47 -0
  862. package/dist/utils/downstream.js.map +1 -0
  863. package/dist/utils/logger.d.ts +3 -1
  864. package/dist/utils/logger.d.ts.map +1 -1
  865. package/dist/utils/logger.js +12 -1
  866. package/dist/utils/logger.js.map +1 -1
  867. package/dist/utils/oauth-http.d.ts +8 -0
  868. package/dist/utils/oauth-http.d.ts.map +1 -0
  869. package/dist/utils/oauth-http.js +41 -0
  870. package/dist/utils/oauth-http.js.map +1 -0
  871. package/dist/utils/path-utils.d.ts +2 -0
  872. package/dist/utils/path-utils.d.ts.map +1 -0
  873. package/dist/utils/path-utils.js +12 -0
  874. package/dist/utils/path-utils.js.map +1 -0
  875. package/dist/utils/path-validation.d.ts +1 -1
  876. package/dist/utils/path-validation.d.ts.map +1 -1
  877. package/dist/utils/path-validation.js +3 -3
  878. package/dist/utils/path-validation.js.map +1 -1
  879. package/dist/version.json +2 -2
  880. package/dist/web-server.d.ts +7 -1
  881. package/dist/web-server.d.ts.map +1 -1
  882. package/dist/web-server.js +117 -15
  883. package/dist/web-server.js.map +1 -1
  884. package/dist/webhooks/delivery.d.ts.map +1 -1
  885. package/dist/webhooks/delivery.js +9 -12
  886. package/dist/webhooks/delivery.js.map +1 -1
  887. package/node_modules/@bufbuild/protobuf/dist/cjs/descriptors.d.ts +12 -5
  888. package/node_modules/@bufbuild/protobuf/dist/cjs/from-binary.js +7 -7
  889. package/node_modules/@bufbuild/protobuf/dist/cjs/from-json.d.ts +1 -1
  890. package/node_modules/@bufbuild/protobuf/dist/cjs/from-json.js +1 -1
  891. package/node_modules/@bufbuild/protobuf/dist/cjs/reflect/path.d.ts +1 -1
  892. package/node_modules/@bufbuild/protobuf/dist/cjs/registry.js +24 -1
  893. package/node_modules/@bufbuild/protobuf/dist/cjs/to-json.d.ts +1 -1
  894. package/node_modules/@bufbuild/protobuf/dist/cjs/to-json.js +9 -10
  895. package/node_modules/@bufbuild/protobuf/dist/cjs/types.d.ts +1 -1
  896. package/node_modules/@bufbuild/protobuf/dist/cjs/wire/binary-encoding.d.ts +9 -7
  897. package/node_modules/@bufbuild/protobuf/dist/cjs/wire/binary-encoding.js +18 -8
  898. package/node_modules/@bufbuild/protobuf/dist/cjs/wire/text-encoding.d.ts +4 -2
  899. package/node_modules/@bufbuild/protobuf/dist/cjs/wire/text-encoding.js +8 -1
  900. package/node_modules/@bufbuild/protobuf/dist/cjs/wkt/gen/google/protobuf/api_pb.d.ts +1 -1
  901. package/node_modules/@bufbuild/protobuf/dist/cjs/wkt/gen/google/protobuf/compiler/plugin_pb.d.ts +2 -2
  902. package/node_modules/@bufbuild/protobuf/dist/cjs/wkt/gen/google/protobuf/descriptor_pb.d.ts +37 -23
  903. package/node_modules/@bufbuild/protobuf/dist/cjs/wkt/gen/google/protobuf/descriptor_pb.js +1 -1
  904. package/node_modules/@bufbuild/protobuf/dist/cjs/wkt/gen/google/protobuf/field_mask_pb.d.ts +32 -36
  905. package/node_modules/@bufbuild/protobuf/dist/cjs/wkt/gen/google/protobuf/go_features_pb.d.ts +65 -0
  906. package/node_modules/@bufbuild/protobuf/dist/cjs/wkt/gen/google/protobuf/go_features_pb.js +38 -2
  907. package/node_modules/@bufbuild/protobuf/dist/cjs/wkt/gen/google/protobuf/timestamp_pb.d.ts +5 -5
  908. package/node_modules/@bufbuild/protobuf/dist/cjs/wkt/gen/google/protobuf/type_pb.d.ts +3 -3
  909. package/node_modules/@bufbuild/protobuf/dist/cjs/wkt/wrappers.d.ts +10 -0
  910. package/node_modules/@bufbuild/protobuf/dist/cjs/wkt/wrappers.js +24 -0
  911. package/node_modules/@bufbuild/protobuf/dist/esm/descriptors.d.ts +12 -5
  912. package/node_modules/@bufbuild/protobuf/dist/esm/from-binary.js +7 -7
  913. package/node_modules/@bufbuild/protobuf/dist/esm/from-json.d.ts +1 -1
  914. package/node_modules/@bufbuild/protobuf/dist/esm/from-json.js +2 -2
  915. package/node_modules/@bufbuild/protobuf/dist/esm/reflect/path.d.ts +1 -1
  916. package/node_modules/@bufbuild/protobuf/dist/esm/registry.js +24 -1
  917. package/node_modules/@bufbuild/protobuf/dist/esm/to-json.d.ts +1 -1
  918. package/node_modules/@bufbuild/protobuf/dist/esm/to-json.js +10 -11
  919. package/node_modules/@bufbuild/protobuf/dist/esm/types.d.ts +1 -1
  920. package/node_modules/@bufbuild/protobuf/dist/esm/wire/binary-encoding.d.ts +9 -7
  921. package/node_modules/@bufbuild/protobuf/dist/esm/wire/binary-encoding.js +18 -8
  922. package/node_modules/@bufbuild/protobuf/dist/esm/wire/text-encoding.d.ts +4 -2
  923. package/node_modules/@bufbuild/protobuf/dist/esm/wire/text-encoding.js +8 -1
  924. package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/api_pb.d.ts +1 -1
  925. package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/compiler/plugin_pb.d.ts +2 -2
  926. package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/descriptor_pb.d.ts +37 -23
  927. package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/descriptor_pb.js +1 -1
  928. package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/field_mask_pb.d.ts +32 -36
  929. package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/go_features_pb.d.ts +65 -0
  930. package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/go_features_pb.js +37 -1
  931. package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/timestamp_pb.d.ts +5 -5
  932. package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/type_pb.d.ts +3 -3
  933. package/node_modules/@bufbuild/protobuf/dist/esm/wkt/wrappers.d.ts +10 -0
  934. package/node_modules/@bufbuild/protobuf/dist/esm/wkt/wrappers.js +23 -0
  935. package/node_modules/@bufbuild/protobuf/package.json +1 -1
  936. package/node_modules/@evalops/contracts/dist/headless-protocol-schemas.generated.d.ts +305 -2
  937. package/node_modules/@evalops/contracts/dist/headless-protocol-schemas.generated.d.ts.map +1 -1
  938. package/node_modules/@evalops/contracts/dist/headless-protocol-schemas.generated.js +34 -4
  939. package/node_modules/@evalops/contracts/dist/headless-protocol-schemas.generated.js.map +1 -1
  940. package/node_modules/@evalops/contracts/dist/index.d.ts +88 -0
  941. package/node_modules/@evalops/contracts/dist/index.d.ts.map +1 -1
  942. package/node_modules/@evalops/contracts/dist/index.js +2 -0
  943. package/node_modules/@evalops/contracts/dist/index.js.map +1 -1
  944. package/node_modules/@evalops/contracts/dist/proto/maestro/v1/headless_pb.d.ts +77 -77
  945. package/node_modules/@evalops/contracts/dist/proto/maestro/v1/headless_pb.d.ts.map +1 -1
  946. package/node_modules/@evalops/contracts/dist/proto/maestro/v1/headless_pb.js +1 -1
  947. package/node_modules/@evalops/contracts/dist/proto/maestro/v1/headless_pb.js.map +1 -1
  948. package/node_modules/@evalops/contracts/dist/runtime-app-server.d.ts +182 -0
  949. package/node_modules/@evalops/contracts/dist/runtime-app-server.d.ts.map +1 -0
  950. package/node_modules/@evalops/contracts/dist/runtime-app-server.js +83 -0
  951. package/node_modules/@evalops/contracts/dist/runtime-app-server.js.map +1 -0
  952. package/node_modules/@evalops/contracts/dist/runtime-server-request.d.ts +133 -0
  953. package/node_modules/@evalops/contracts/dist/runtime-server-request.d.ts.map +1 -0
  954. package/node_modules/@evalops/contracts/dist/runtime-server-request.js +68 -0
  955. package/node_modules/@evalops/contracts/dist/runtime-server-request.js.map +1 -0
  956. package/node_modules/@evalops/contracts/dist/schemas.d.ts +178 -0
  957. package/node_modules/@evalops/contracts/dist/schemas.d.ts.map +1 -1
  958. package/node_modules/@evalops/contracts/dist/schemas.js +165 -0
  959. package/node_modules/@evalops/contracts/dist/schemas.js.map +1 -1
  960. package/node_modules/@evalops/contracts/dist/typebox-utils.d.ts +2 -0
  961. package/node_modules/@evalops/contracts/dist/typebox-utils.d.ts.map +1 -0
  962. package/node_modules/@evalops/contracts/dist/typebox-utils.js +5 -0
  963. package/node_modules/@evalops/contracts/dist/typebox-utils.js.map +1 -0
  964. package/node_modules/@evalops/contracts/dist/validators.d.ts +4 -1
  965. package/node_modules/@evalops/contracts/dist/validators.d.ts.map +1 -1
  966. package/node_modules/@evalops/contracts/dist/validators.js +4 -1
  967. package/node_modules/@evalops/contracts/dist/validators.js.map +1 -1
  968. package/node_modules/@evalops/contracts/package.json +1 -1
  969. package/node_modules/@evalops/tui/package.json +1 -1
  970. package/node_modules/string-width/index.js +93 -9
  971. package/node_modules/string-width/package.json +1 -1
  972. package/package.json +32 -25
  973. package/dist/cli-tui/commands/grouped/auth-commands.d.ts.map +0 -1
  974. package/dist/cli-tui/commands/grouped/auth-commands.js.map +0 -1
  975. package/dist/cli-tui/commands/grouped/config-commands.d.ts.map +0 -1
  976. package/dist/cli-tui/commands/grouped/config-commands.js.map +0 -1
  977. package/dist/cli-tui/commands/grouped/diag-commands.d.ts.map +0 -1
  978. package/dist/cli-tui/commands/grouped/diag-commands.js.map +0 -1
  979. package/dist/cli-tui/commands/grouped/git-commands.d.ts.map +0 -1
  980. package/dist/cli-tui/commands/grouped/git-commands.js.map +0 -1
  981. package/dist/cli-tui/commands/grouped/index.d.ts.map +0 -1
  982. package/dist/cli-tui/commands/grouped/index.js.map +0 -1
  983. package/dist/cli-tui/commands/grouped/safety-commands.d.ts.map +0 -1
  984. package/dist/cli-tui/commands/grouped/safety-commands.js.map +0 -1
  985. package/dist/cli-tui/commands/grouped/session-commands.d.ts.map +0 -1
  986. package/dist/cli-tui/commands/grouped/session-commands.js.map +0 -1
  987. package/dist/cli-tui/commands/grouped/tools-commands.d.ts.map +0 -1
  988. package/dist/cli-tui/commands/grouped/tools-commands.js.map +0 -1
  989. package/dist/cli-tui/commands/grouped/ui-commands.d.ts.map +0 -1
  990. package/dist/cli-tui/commands/grouped/ui-commands.js.map +0 -1
  991. package/dist/cli-tui/commands/grouped/undo-commands.d.ts.map +0 -1
  992. package/dist/cli-tui/commands/grouped/undo-commands.js.map +0 -1
  993. package/dist/cli-tui/commands/grouped/usage-commands.d.ts.map +0 -1
  994. package/dist/cli-tui/commands/grouped/usage-commands.js.map +0 -1
  995. package/dist/cli-tui/commands/grouped/utils.d.ts.map +0 -1
  996. package/dist/cli-tui/commands/grouped/utils.js.map +0 -1
  997. package/dist/cli-tui/commands/grouped-command-handlers.d.ts.map +0 -1
  998. package/dist/cli-tui/commands/grouped-command-handlers.js +0 -135
  999. package/dist/cli-tui/commands/grouped-command-handlers.js.map +0 -1
  1000. package/dist/cli-tui/tui-renderer/grouped-handlers-wiring.d.ts +0 -78
  1001. package/dist/cli-tui/tui-renderer/grouped-handlers-wiring.d.ts.map +0 -1
  1002. package/dist/cli-tui/tui-renderer/grouped-handlers-wiring.js +0 -129
  1003. package/dist/cli-tui/tui-renderer/grouped-handlers-wiring.js.map +0 -1
  1004. package/node_modules/@evalops/memory/dist/client.d.ts +0 -94
  1005. package/node_modules/@evalops/memory/dist/client.js +0 -503
  1006. package/node_modules/@evalops/memory/gen/proto/dist/memory/v1/memory_pb.d.ts +0 -608
  1007. package/node_modules/@evalops/memory/gen/proto/dist/memory/v1/memory_pb.js +0 -187
  1008. package/node_modules/@evalops/memory/package.json +0 -26
  1009. /package/dist/cli-tui/commands/{grouped → subcommands}/usage-commands.d.ts +0 -0
@@ -20,41 +20,48 @@
20
20
  * - Session persistence with auto-initialization
21
21
  * - Approval mode configuration via headers
22
22
  */
23
+ import { isAssistantMessage } from "../../agent/type-guards.js";
23
24
  import { runUserPromptWithRecovery } from "../../agent/user-prompt-runtime.js";
24
25
  import { dispatchAgentNotification } from "../../hooks/notification-hooks.js";
25
26
  import { createSessionHookService } from "../../hooks/session-integration.js";
26
27
  import { withMcpPostKeepMessages } from "../../mcp/prompt-recovery.js";
27
28
  import { createAutomaticMemoryConsolidationCoordinator, getMemoryConsolidationSystemPrompt, } from "../../memory/auto-consolidation.js";
28
29
  import { createAutomaticMemoryExtractionCoordinator } from "../../memory/auto-extraction.js";
29
- import { createLogger } from "../../utils/logger.js";
30
- const logger = createLogger("web:chat");
31
- function getComposerTextContent(content) {
32
- if (typeof content === "string")
33
- return content;
34
- if (!Array.isArray(content))
35
- return "";
36
- return content
37
- .filter((block) => block.type === "text")
38
- .map((block) => block.text)
39
- .join("");
40
- }
30
+ import { recordComplianceAssistantAction, recordComplianceToolAction, } from "../../services/compliance/recorder.js";
31
+ import { recordIntelligentRouterChatMetric, selectIntelligentRouterModel, } from "../../services/intelligent-router/recorder.js";
32
+ import { recordAssistantUsageMetric } from "../../services/usage-analytics/recorder.js";
33
+ import { evaluateModelPolicy } from "../../services/workspace-config/policy.js";
41
34
  import { toSessionModelMetadata } from "../../session/manager.js";
42
35
  import { createRuntimeSessionSummaryUpdater } from "../../session/runtime-summary-updater.js";
43
36
  import { recordSseSkip } from "../../telemetry.js";
37
+ import { createLogger } from "../../utils/logger.js";
44
38
  import { normalizeApprovalMode, resolveApprovalModeForRequest, } from "../approval-mode-store.js";
45
39
  import { WebActionApprovalService } from "../approval-service.js";
46
40
  import { publishArtifactUpdate } from "../artifacts-live-reload.js";
47
41
  import { getAuthSubject } from "../authz.js";
48
42
  import { getAgentCircuitBreaker } from "../circuit-breaker.js";
49
43
  import { clientToolService } from "../client-tools-service.js";
44
+ import { isHostedSessionManager } from "../hosted-session-manager.js";
45
+ import { getWorkspaceConfigContext } from "../request-context.js";
50
46
  import { serverRequestManager } from "../server-request-manager.js";
51
47
  import { getRequestHeader, respondWithApiError, sendJson, } from "../server-utils.js";
52
48
  import { startSessionWithPolicy } from "../session-initialization.js";
53
- import { createSessionManagerForRequest } from "../session-scope.js";
49
+ import { createWebSessionManagerForRequest } from "../session-scope.js";
54
50
  import { convertComposerMessagesToApp } from "../session-serialization.js";
55
51
  import { SseSession, sendSSE, sendSessionUpdate } from "../sse-session.js";
56
52
  import { ServerRequestToolRetryService } from "../tool-retry-service.js";
57
53
  import { ChatRequestSchema, parseAndValidateJson, } from "../validation.js";
54
+ const logger = createLogger("web:chat");
55
+ function getComposerTextContent(content) {
56
+ if (typeof content === "string")
57
+ return content;
58
+ if (!Array.isArray(content))
59
+ return "";
60
+ return content
61
+ .filter((block) => block.type === "text")
62
+ .map((block) => block.text)
63
+ .join("");
64
+ }
58
65
  /**
59
66
  * Handle an incoming chat request.
60
67
  *
@@ -178,19 +185,69 @@ export async function handleChat(req, res, context) {
178
185
  }
179
186
  // ===== Phase 3: Session and Agent Setup =====
180
187
  // Create session manager (false = don't auto-initialize from disk)
181
- const sessionManager = createSessionManagerForRequest(req, false);
188
+ const sessionManager = createWebSessionManagerForRequest(req, false);
182
189
  const subject = getAuthSubject(req);
183
190
  // Resume existing session if sessionId provided
184
191
  let existingSessionLoaded = false;
185
192
  if (chatReq.sessionId) {
186
- const sessionFile = sessionManager.getSessionFileById(chatReq.sessionId);
187
- if (sessionFile) {
188
- sessionManager.setSessionFile(sessionFile);
189
- existingSessionLoaded = true;
193
+ if (isHostedSessionManager(sessionManager)) {
194
+ existingSessionLoaded = await sessionManager.resumeSession(chatReq.sessionId);
190
195
  }
196
+ else {
197
+ const sessionFile = sessionManager.getSessionFileById(chatReq.sessionId);
198
+ if (sessionFile) {
199
+ sessionManager.setSessionFile(sessionFile);
200
+ existingSessionLoaded = true;
201
+ }
202
+ }
203
+ }
204
+ // Resolve model from registry through the intelligent router. With no history,
205
+ // this preserves the caller's requested model; with enough data or overrides,
206
+ // it can select a better-scoring model and expose explicit fallbacks.
207
+ const routingSelection = selectIntelligentRouterModel({
208
+ req,
209
+ requestedModel: chatReq.model,
210
+ body: chatReq,
211
+ });
212
+ let registeredModel;
213
+ let lastModelError;
214
+ let selectedModelError;
215
+ let selectedModelPolicyViolation = null;
216
+ for (const [index, modelInput] of routingSelection.modelInputs.entries()) {
217
+ try {
218
+ const candidateModel = await getRegisteredModel(modelInput);
219
+ const violation = evaluateModelPolicy(getWorkspaceConfigContext()?.config, {
220
+ provider: candidateModel.provider,
221
+ modelId: candidateModel.id,
222
+ });
223
+ if (violation) {
224
+ if (index === 0) {
225
+ selectedModelPolicyViolation = violation;
226
+ }
227
+ continue;
228
+ }
229
+ registeredModel = candidateModel;
230
+ break;
231
+ }
232
+ catch (error) {
233
+ lastModelError = error;
234
+ if (index === 0) {
235
+ selectedModelError = error;
236
+ }
237
+ }
238
+ }
239
+ if (!registeredModel && selectedModelPolicyViolation) {
240
+ sendJson(res, 403, {
241
+ error: selectedModelPolicyViolation.message,
242
+ code: selectedModelPolicyViolation.code,
243
+ workspaceId: selectedModelPolicyViolation.workspaceId,
244
+ }, cors, req);
245
+ return;
246
+ }
247
+ if (!registeredModel) {
248
+ throw selectedModelError ?? lastModelError;
191
249
  }
192
- // Resolve model from registry
193
- const registeredModel = await getRegisteredModel(chatReq.model);
250
+ const routeStartedAt = Date.now();
194
251
  // Parse approval mode from request header (allows per-request override)
195
252
  const headerApproval = normalizeApprovalMode(getRequestHeader(req, "x-composer-approval-mode", "x-maestro-approval-mode") ?? undefined);
196
253
  const effectiveApproval = resolveApprovalModeForRequest({
@@ -256,11 +313,11 @@ export async function handleChat(req, res, context) {
256
313
  // Subscribe to agent events and forward them to the SSE stream
257
314
  // Pre-load enterprise context for session tracking
258
315
  const { enterpriseContext } = await import("../../enterprise/context.js");
259
- const initializeSessionIfNeeded = () => {
316
+ const initializeSessionIfNeeded = async () => {
260
317
  if (existingSessionLoaded || sessionManager.isInitialized()) {
261
318
  return null;
262
319
  }
263
- const initializationError = startSessionWithPolicy({
320
+ const initializationError = await startSessionWithPolicy({
264
321
  agent,
265
322
  enterpriseContext,
266
323
  logger,
@@ -278,7 +335,7 @@ export async function handleChat(req, res, context) {
278
335
  existingSessionLoaded = true;
279
336
  return null;
280
337
  };
281
- const initializationError = initializeSessionIfNeeded();
338
+ const initializationError = await initializeSessionIfNeeded();
282
339
  if (initializationError) {
283
340
  sendSSE(sseSession, {
284
341
  type: "error",
@@ -434,6 +491,12 @@ export async function handleChat(req, res, context) {
434
491
  storeToolArgs(event.toolCallId, event.args);
435
492
  }
436
493
  if (event.type === "tool_execution_end") {
494
+ recordComplianceToolAction({
495
+ req,
496
+ event,
497
+ sessionId: sessionManager.getSessionId(),
498
+ subject,
499
+ });
437
500
  if (event.toolName === "artifacts" && !event.isError) {
438
501
  const sessionId = sessionManager.getSessionId();
439
502
  const args = toolArgsByCallId.get(event.toolCallId) ?? {};
@@ -453,24 +516,27 @@ export async function handleChat(req, res, context) {
453
516
  // Handle message completion - persist to session
454
517
  if (event.type === "message_end") {
455
518
  sessionManager.saveMessage(event.message);
456
- if (event.message.role === "assistant") {
457
- automaticMemoryExtraction.schedule(sessionManager.getSessionFile());
458
- }
459
- let initializationError = null;
460
- // Auto-initialize session on first user message
461
- if (sessionManager.shouldInitializeSession(agent.state.messages)) {
462
- initializationError = startSessionWithPolicy({
463
- agent,
464
- enterpriseContext,
465
- logger,
466
- modelId: registeredModel.id,
467
- onSessionReady: (sessionId) => {
468
- sendSessionUpdate(sseSession, sessionId);
469
- sseSession.setContext({ sessionId });
470
- },
471
- sessionManager,
519
+ if (isAssistantMessage(event.message)) {
520
+ recordAssistantUsageMetric({
521
+ req,
522
+ message: event.message,
523
+ sessionId: sessionManager.getSessionId(),
472
524
  subject,
473
525
  });
526
+ recordIntelligentRouterChatMetric({
527
+ taskType: routingSelection.taskType,
528
+ provider: registeredModel.provider,
529
+ model: registeredModel.id,
530
+ startedAt: routeStartedAt,
531
+ message: event.message,
532
+ });
533
+ recordComplianceAssistantAction({
534
+ req,
535
+ message: event.message,
536
+ sessionId: sessionManager.getSessionId(),
537
+ subject,
538
+ });
539
+ automaticMemoryExtraction.schedule(sessionManager.getSessionFile());
474
540
  }
475
541
  // Update session snapshot on every event
476
542
  sessionManager.updateSnapshot(agent.state, toSessionModelMetadata(registeredModel));
@@ -482,13 +548,6 @@ export async function handleChat(req, res, context) {
482
548
  sessionHookService,
483
549
  logger,
484
550
  });
485
- if (initializationError) {
486
- sendSSE(sseSession, {
487
- type: "error",
488
- message: `[Policy] ${initializationError}`,
489
- });
490
- sseSession.end();
491
- }
492
551
  return;
493
552
  }
494
553
  // Update session snapshot on every event
@@ -1 +1 @@
1
- {"version":3,"file":"chat.js","sourceRoot":"","sources":["../../../src/server/handlers/chat.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Chat Handler - Main WebSocket/SSE Endpoint for Agent Conversations\n *\n * This module implements the primary chat endpoint for the web server.\n * It handles incoming chat requests, manages agent execution, and streams\n * responses back to clients via Server-Sent Events (SSE).\n *\n * Request flow:\n * 1. Parse and validate incoming JSON request\n * 2. Acquire SSE connection slot (rate limited)\n * 3. Create or resume session based on sessionId\n * 4. Initialize agent with model and approval settings\n * 5. Hydrate conversation history from request\n * 6. Stream agent events to client via SSE\n * 7. Persist session state on completion\n *\n * Key features:\n * - Circuit breaker protection for agent calls\n * - Graceful handling of client disconnects\n * - Session persistence with auto-initialization\n * - Approval mode configuration via headers\n */\n\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport type { ComposerChatRequest, ComposerMessage } from \"@evalops/contracts\";\nimport type {\n\tAttachment as AgentAttachment,\n\tAgentEvent,\n} from \"../../agent/types.js\";\nimport { runUserPromptWithRecovery } from \"../../agent/user-prompt-runtime.js\";\nimport { dispatchAgentNotification } from \"../../hooks/notification-hooks.js\";\nimport { createSessionHookService } from \"../../hooks/session-integration.js\";\nimport { withMcpPostKeepMessages } from \"../../mcp/prompt-recovery.js\";\nimport {\n\tcreateAutomaticMemoryConsolidationCoordinator,\n\tgetMemoryConsolidationSystemPrompt,\n} from \"../../memory/auto-consolidation.js\";\nimport { createAutomaticMemoryExtractionCoordinator } from \"../../memory/auto-extraction.js\";\nimport type { RegisteredModel } from \"../../models/registry.js\";\nimport { createLogger } from \"../../utils/logger.js\";\n\nconst logger = createLogger(\"web:chat\");\n\nfunction getComposerTextContent(content: ComposerMessage[\"content\"]): string {\n\tif (typeof content === \"string\") return content;\n\tif (!Array.isArray(content)) return \"\";\n\treturn content\n\t\t.filter((block) => block.type === \"text\")\n\t\t.map((block) => block.text)\n\t\t.join(\"\");\n}\n\n// SessionManager type import for annotations, value import for instantiation\nimport type { SessionManager } from \"../../session/manager.js\";\nimport { toSessionModelMetadata } from \"../../session/manager.js\";\nimport { createRuntimeSessionSummaryUpdater } from \"../../session/runtime-summary-updater.js\";\nimport { recordSseSkip } from \"../../telemetry.js\";\nimport type { WebServerContext } from \"../app-context.js\";\nimport {\n\tnormalizeApprovalMode,\n\tresolveApprovalModeForRequest,\n} from \"../approval-mode-store.js\";\nimport { WebActionApprovalService } from \"../approval-service.js\";\nimport { publishArtifactUpdate } from \"../artifacts-live-reload.js\";\nimport { getAuthSubject } from \"../authz.js\";\nimport { getAgentCircuitBreaker } from \"../circuit-breaker.js\";\nimport { clientToolService } from \"../client-tools-service.js\";\nimport { serverRequestManager } from \"../server-request-manager.js\";\nimport {\n\tApiError,\n\tgetRequestHeader,\n\trespondWithApiError,\n\tsendJson,\n} from \"../server-utils.js\";\nimport { startSessionWithPolicy } from \"../session-initialization.js\";\nimport { createSessionManagerForRequest } from \"../session-scope.js\";\nimport { convertComposerMessagesToApp } from \"../session-serialization.js\";\nimport { SseSession, sendSSE, sendSessionUpdate } from \"../sse-session.js\";\nimport { ServerRequestToolRetryService } from \"../tool-retry-service.js\";\nimport {\n\ttype ChatRequestInput,\n\tChatRequestSchema,\n\tparseAndValidateJson,\n} from \"../validation.js\";\n\n/**\n * Handle an incoming chat request.\n *\n * This is the main entry point for chat interactions. It:\n * 1. Validates the request format\n * 2. Sets up SSE streaming\n * 3. Runs the agent with the user's message\n * 4. Streams events back to the client\n * 5. Persists the session state\n *\n * @param req - The incoming HTTP request\n * @param res - The HTTP response (will be converted to SSE stream)\n * @param context - Server context with agent factory and configuration\n */\nexport async function handleChat(\n\treq: IncomingMessage,\n\tres: ServerResponse,\n\tcontext: WebServerContext,\n) {\n\t// Destructure context for cleaner code\n\tconst {\n\t\tcreateAgent,\n\t\tcreateBackgroundAgent,\n\t\tgetRegisteredModel,\n\t\tdefaultApprovalMode,\n\t\tacquireSse,\n\t\treleaseSse,\n\t\tcorsHeaders: cors,\n\t} = context;\n\n\t// Track SSE lease for cleanup in finally block\n\tlet sseLease: symbol | null = null;\n\n\ttry {\n\t\t// ===== Phase 1: Request Validation =====\n\t\tconst chatReq = (await parseAndValidateJson<ChatRequestInput>(\n\t\t\treq,\n\t\t\tChatRequestSchema,\n\t\t)) as ComposerChatRequest;\n\n\t\t// Validate message array exists and is non-empty\n\t\tconst incomingMessages = Array.isArray(chatReq.messages)\n\t\t\t? (chatReq.messages as ComposerMessage[])\n\t\t\t: [];\n\t\tif (incomingMessages.length === 0) {\n\t\t\tsendJson(res, 400, { error: \"No messages supplied\" }, cors, req);\n\t\t\treturn;\n\t\t}\n\n\t\t// The last message must be the user's current input\n\t\tconst latestMessage = incomingMessages[incomingMessages.length - 1];\n\t\tif (!latestMessage || latestMessage.role !== \"user\") {\n\t\t\tsendJson(\n\t\t\t\tres,\n\t\t\t\t400,\n\t\t\t\t{ error: \"Last message must be a user message\" },\n\t\t\t\tcors,\n\t\t\t\treq,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tconst { attachmentsToSend, attachmentError } = (() => {\n\t\t\tconst MAX_ATTACHMENT_BYTES = 8 * 1024 * 1024;\n\t\t\tconst MAX_TOTAL_BYTES = 20 * 1024 * 1024;\n\n\t\t\tconst raw = latestMessage.attachments;\n\t\t\tif (!Array.isArray(raw) || raw.length === 0) {\n\t\t\t\treturn {\n\t\t\t\t\tattachmentsToSend: undefined as AgentAttachment[] | undefined,\n\t\t\t\t\tattachmentError: null as string | null,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst attachments: AgentAttachment[] = [];\n\t\t\tlet totalBytes = 0;\n\n\t\t\tfor (const item of raw) {\n\t\t\t\tif (!item || typeof item !== \"object\") continue;\n\t\t\t\tconst id = typeof item.id === \"string\" ? item.id : \"\";\n\t\t\t\tconst type =\n\t\t\t\t\titem.type === \"image\" || item.type === \"document\" ? item.type : null;\n\t\t\t\tconst fileName =\n\t\t\t\t\ttypeof item.fileName === \"string\" ? item.fileName : \"attachment\";\n\t\t\t\tconst mimeType =\n\t\t\t\t\ttypeof item.mimeType === \"string\"\n\t\t\t\t\t\t? item.mimeType\n\t\t\t\t\t\t: \"application/octet-stream\";\n\t\t\t\tconst size =\n\t\t\t\t\ttypeof item.size === \"number\" && Number.isFinite(item.size)\n\t\t\t\t\t\t? item.size\n\t\t\t\t\t\t: 0;\n\t\t\t\tconst content = typeof item.content === \"string\" ? item.content : \"\";\n\t\t\t\tconst extractedText =\n\t\t\t\t\ttypeof item.extractedText === \"string\"\n\t\t\t\t\t\t? item.extractedText\n\t\t\t\t\t\t: undefined;\n\t\t\t\tconst preview =\n\t\t\t\t\ttypeof item.preview === \"string\" ? item.preview : undefined;\n\n\t\t\t\tif (!id || !type) continue;\n\t\t\t\tif (!content) {\n\t\t\t\t\t// Content omitted (e.g., session fetch); keep metadata for UI but do not send to model.\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Base64 -> bytes (approx). Prefer validating against actual content length.\n\t\t\t\tconst approxBytes = Math.floor((content.length * 3) / 4);\n\t\t\t\tconst bytes = approxBytes > 0 ? approxBytes : size;\n\n\t\t\t\tif (bytes > MAX_ATTACHMENT_BYTES) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tattachmentsToSend: undefined,\n\t\t\t\t\t\tattachmentError: `Attachment too large: ${fileName} (${Math.ceil(bytes / 1024 / 1024)}MB). Max per file is ${Math.ceil(MAX_ATTACHMENT_BYTES / 1024 / 1024)}MB.`,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\ttotalBytes += bytes;\n\t\t\t\tif (totalBytes > MAX_TOTAL_BYTES) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tattachmentsToSend: undefined,\n\t\t\t\t\t\tattachmentError: `Attachments too large: total exceeds ${Math.ceil(MAX_TOTAL_BYTES / 1024 / 1024)}MB.`,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tattachments.push({\n\t\t\t\t\tid,\n\t\t\t\t\ttype,\n\t\t\t\t\tfileName,\n\t\t\t\t\tmimeType,\n\t\t\t\t\tsize: size || bytes,\n\t\t\t\t\tcontent,\n\t\t\t\t\textractedText,\n\t\t\t\t\tpreview,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tattachmentsToSend: attachments.length ? attachments : undefined,\n\t\t\t\tattachmentError: null,\n\t\t\t};\n\t\t})();\n\n\t\tif (attachmentError) {\n\t\t\tsendJson(res, 413, { error: attachmentError }, cors, req);\n\t\t\treturn;\n\t\t}\n\n\t\tconst userInput = getComposerTextContent(latestMessage.content).trim();\n\t\tif (!userInput && !attachmentsToSend) {\n\t\t\tsendJson(res, 400, { error: \"User message cannot be empty\" }, cors, req);\n\t\t\treturn;\n\t\t}\n\n\t\t// ===== Phase 2: SSE Connection Management =====\n\t\t// Acquire a lease to limit concurrent SSE connections\n\t\tif (acquireSse) {\n\t\t\tsseLease = acquireSse();\n\t\t\tif (!sseLease) {\n\t\t\t\tsendJson(\n\t\t\t\t\tres,\n\t\t\t\t\t429,\n\t\t\t\t\t{ error: \"Too many active SSE connections\" },\n\t\t\t\t\tcors,\n\t\t\t\t\treq,\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// ===== Phase 3: Session and Agent Setup =====\n\t\t// Create session manager (false = don't auto-initialize from disk)\n\t\tconst sessionManager = createSessionManagerForRequest(req, false);\n\t\tconst subject = getAuthSubject(req);\n\n\t\t// Resume existing session if sessionId provided\n\t\tlet existingSessionLoaded = false;\n\t\tif (chatReq.sessionId) {\n\t\t\tconst sessionFile = sessionManager.getSessionFileById(chatReq.sessionId);\n\t\t\tif (sessionFile) {\n\t\t\t\tsessionManager.setSessionFile(sessionFile);\n\t\t\t\texistingSessionLoaded = true;\n\t\t\t}\n\t\t}\n\n\t\t// Resolve model from registry\n\t\tconst registeredModel = await getRegisteredModel(chatReq.model);\n\n\t\t// Parse approval mode from request header (allows per-request override)\n\t\tconst headerApproval = normalizeApprovalMode(\n\t\t\tgetRequestHeader(\n\t\t\t\treq,\n\t\t\t\t\"x-composer-approval-mode\",\n\t\t\t\t\"x-maestro-approval-mode\",\n\t\t\t) ?? undefined,\n\t\t);\n\n\t\tconst effectiveApproval = resolveApprovalModeForRequest({\n\t\t\tsessionId: chatReq.sessionId,\n\t\t\tsubject,\n\t\t\theaderApprovalMode: headerApproval,\n\t\t\tdefaultApprovalMode,\n\t\t});\n\n\t\t// Create the agent with the resolved configuration\n\t\tconst clientToolsHeader =\n\t\t\tgetRequestHeader(\n\t\t\t\treq,\n\t\t\t\t\"x-composer-client-tools\",\n\t\t\t\t\"x-maestro-client-tools\",\n\t\t\t) === \"1\";\n\n\t\tconst clientHeader = getRequestHeader(\n\t\t\treq,\n\t\t\t\"x-composer-client\",\n\t\t\t\"x-maestro-client\",\n\t\t)?.toLowerCase();\n\t\tconst sessionIdProvider = () => sessionManager.getSessionId() ?? undefined;\n\t\tconst requestApprovalService = new WebActionApprovalService(\n\t\t\teffectiveApproval,\n\t\t\tsessionIdProvider,\n\t\t);\n\t\tconst toolRetryService = new ServerRequestToolRetryService(\n\t\t\t\"prompt\",\n\t\t\tsessionIdProvider,\n\t\t);\n\n\t\tconst agent = await createAgent(\n\t\t\tregisteredModel,\n\t\t\tchatReq.thinkingLevel || \"off\",\n\t\t\teffectiveApproval,\n\t\t\t{\n\t\t\t\tapprovalService: requestApprovalService,\n\t\t\t\ttoolRetryService,\n\t\t\t\t...(clientToolsHeader\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tenableClientTools: true,\n\t\t\t\t\t\t\tclientToolService:\n\t\t\t\t\t\t\t\tclientToolService.forSession(sessionIdProvider),\n\t\t\t\t\t\t\tincludeVscodeTools: clientHeader === \"vscode\",\n\t\t\t\t\t\t\tincludeJetBrainsTools: clientHeader === \"jetbrains\",\n\t\t\t\t\t\t\tincludeConductorTools: clientHeader === \"conductor\",\n\t\t\t\t\t\t}\n\t\t\t\t\t: {}),\n\t\t\t},\n\t\t);\n\n\t\t// Hydrate conversation history (all messages except the current user input)\n\t\tconst historyMessages = incomingMessages.slice(0, -1);\n\t\tconst hydratedHistory = convertComposerMessagesToApp(\n\t\t\thistoryMessages,\n\t\t\tregisteredModel,\n\t\t);\n\t\tif (hydratedHistory.length > 0) {\n\t\t\tagent.replaceMessages(hydratedHistory);\n\t\t} else {\n\t\t\tagent.clearMessages();\n\t\t}\n\n\t\t// ===== Phase 4: SSE Stream Setup =====\n\t\t// Initialize the SSE response headers\n\t\tres.writeHead(200, {\n\t\t\t\"Content-Type\": \"text/event-stream\",\n\t\t\t\"Cache-Control\": \"no-cache\",\n\t\t\tConnection: \"keep-alive\",\n\t\t\t...cors,\n\t\t});\n\n\t\t// Create SSE session with telemetry callback for skip tracking\n\t\tconst requestId = Math.random().toString(36).slice(2);\n\t\tconst modelKey = `${registeredModel.provider}/${registeredModel.id}`;\n\t\tconst sseSession = new SseSession(\n\t\t\tres,\n\t\t\t(metrics) => {\n\t\t\t\t// Record telemetry when SSE writes are skipped (client disconnected)\n\t\t\t\trecordSseSkip(metrics.sent, metrics.skipped, {\n\t\t\t\t\trequestId: metrics.context?.requestId,\n\t\t\t\t\tmodelKey: metrics.context?.modelKey,\n\t\t\t\t\tsessionId: metrics.context?.sessionId,\n\t\t\t\t\tlastError:\n\t\t\t\t\t\tmetrics.lastError instanceof Error\n\t\t\t\t\t\t\t? metrics.lastError.message\n\t\t\t\t\t\t\t: metrics.lastError,\n\t\t\t\t});\n\t\t\t},\n\t\t\t{ requestId, modelKey },\n\t\t);\n\t\tsseSession.startHeartbeat(); // Keep connection alive during idle periods\n\n\t\t// Track cleanup state to prevent double-cleanup\n\t\tlet cleanedUp = false;\n\n\t\t// ===== Phase 5: Agent Event Subscription =====\n\t\t// Subscribe to agent events and forward them to the SSE stream\n\t\t// Pre-load enterprise context for session tracking\n\t\tconst { enterpriseContext } = await import(\"../../enterprise/context.js\");\n\n\t\tconst initializeSessionIfNeeded = (): string | null => {\n\t\t\tif (existingSessionLoaded || sessionManager.isInitialized()) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst initializationError = startSessionWithPolicy({\n\t\t\t\tagent,\n\t\t\t\tenterpriseContext,\n\t\t\t\tlogger,\n\t\t\t\tmodelId: registeredModel.id,\n\t\t\t\tonSessionReady: (sessionId) => {\n\t\t\t\t\tsendSessionUpdate(sseSession, sessionId);\n\t\t\t\t\tsseSession.setContext({ sessionId });\n\t\t\t\t},\n\t\t\t\tsessionManager,\n\t\t\t\tsubject,\n\t\t\t});\n\t\t\tif (initializationError) {\n\t\t\t\treturn initializationError;\n\t\t\t}\n\t\t\texistingSessionLoaded = true;\n\t\t\treturn null;\n\t\t};\n\n\t\tconst initializationError = initializeSessionIfNeeded();\n\t\tif (initializationError) {\n\t\t\tsendSSE(sseSession, {\n\t\t\t\ttype: \"error\",\n\t\t\t\tmessage: `[Policy] ${initializationError}`,\n\t\t\t});\n\t\t\tsseSession.end();\n\t\t\tif (sseLease && releaseSse) {\n\t\t\t\treleaseSse(sseLease);\n\t\t\t\tsseLease = null;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tconst toolArgsByCallId = new Map<string, Record<string, unknown>>();\n\t\tconst storeToolArgs = (toolCallId: string, args: unknown) => {\n\t\t\ttoolArgsByCallId.set(\n\t\t\t\ttoolCallId,\n\t\t\t\t(args && typeof args === \"object\" && !Array.isArray(args)\n\t\t\t\t\t? (args as Record<string, unknown>)\n\t\t\t\t\t: {}) as Record<string, unknown>,\n\t\t\t);\n\t\t};\n\t\tconst slimValue = getRequestHeader(\n\t\t\treq,\n\t\t\t\"x-composer-slim-events\",\n\t\t\t\"x-maestro-slim-events\",\n\t\t);\n\t\tconst slimEvents = slimValue === \"1\" || slimValue === \"true\";\n\t\tconst slimToolCallArgsLimit = (() => {\n\t\t\tconst raw = process.env.MAESTRO_SLIM_TOOLCALL_ARGS_MAX_BYTES;\n\t\t\tif (!raw) return 4096;\n\t\t\tconst parsed = Number(raw);\n\t\t\tif (!Number.isFinite(parsed) || parsed <= 0) return 4096;\n\t\t\treturn Math.min(parsed, 1024 * 1024);\n\t\t})();\n\t\tconst extractToolCallInfo = (assistantEvent: {\n\t\t\tcontentIndex?: number;\n\t\t\tpartial?: { content?: unknown[] };\n\t\t}): {\n\t\t\ttoolCallId?: string;\n\t\t\ttoolCallName?: string;\n\t\t\ttoolCallArgs?: Record<string, unknown>;\n\t\t\ttoolCallArgsTruncated?: boolean;\n\t\t} => {\n\t\t\tconst assistantMessageEvent = assistantEvent.partial;\n\t\t\tconst contentIndex = assistantEvent.contentIndex;\n\t\t\tif (\n\t\t\t\t!assistantMessageEvent ||\n\t\t\t\ttypeof contentIndex !== \"number\" ||\n\t\t\t\t!Array.isArray(assistantMessageEvent.content)\n\t\t\t) {\n\t\t\t\treturn {};\n\t\t\t}\n\t\t\tconst block = assistantMessageEvent.content[contentIndex];\n\t\t\tif (!block || typeof block !== \"object\") {\n\t\t\t\treturn {};\n\t\t\t}\n\t\t\tconst maybeToolCall = block as {\n\t\t\t\ttype?: string;\n\t\t\t\tid?: string;\n\t\t\t\tname?: string;\n\t\t\t\targuments?: Record<string, unknown>;\n\t\t\t};\n\t\t\tif (maybeToolCall.type !== \"toolCall\") {\n\t\t\t\treturn {};\n\t\t\t}\n\t\t\tconst maybeArgs = maybeToolCall.arguments;\n\t\t\tconst toolCallArgs =\n\t\t\t\tmaybeArgs && typeof maybeArgs === \"object\" && !Array.isArray(maybeArgs)\n\t\t\t\t\t? maybeArgs\n\t\t\t\t\t: undefined;\n\t\t\tif (toolCallArgs) {\n\t\t\t\ttry {\n\t\t\t\t\tconst size = Buffer.byteLength(JSON.stringify(toolCallArgs), \"utf8\");\n\t\t\t\t\tif (size > slimToolCallArgsLimit) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\ttoolCallId: maybeToolCall.id,\n\t\t\t\t\t\t\ttoolCallName: maybeToolCall.name,\n\t\t\t\t\t\t\ttoolCallArgsTruncated: true,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttoolCallId: maybeToolCall.id,\n\t\t\t\t\t\ttoolCallName: maybeToolCall.name,\n\t\t\t\t\t\ttoolCallArgsTruncated: true,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn {\n\t\t\t\ttoolCallId: maybeToolCall.id,\n\t\t\t\ttoolCallName: maybeToolCall.name,\n\t\t\t\ttoolCallArgs,\n\t\t\t};\n\t\t};\n\t\tconst maybeSlimEvent = (event: AgentEvent): AgentEvent => {\n\t\t\tif (!slimEvents || event.type !== \"message_update\") {\n\t\t\t\treturn event;\n\t\t\t}\n\n\t\t\tconst assistantEvent = event.assistantMessageEvent;\n\t\t\tconst slimEvent: Record<string, unknown> = { ...event };\n\t\t\tdelete slimEvent.message;\n\n\t\t\tif (!assistantEvent) {\n\t\t\t\treturn slimEvent as AgentEvent;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tassistantEvent.type === \"text_delta\" ||\n\t\t\t\tassistantEvent.type === \"thinking_delta\"\n\t\t\t) {\n\t\t\t\tconst { partial, ...assistantWithoutPartial } = assistantEvent as {\n\t\t\t\t\tpartial?: unknown;\n\t\t\t\t\t[key: string]: unknown;\n\t\t\t\t};\n\n\t\t\t\tslimEvent.assistantMessageEvent = assistantWithoutPartial;\n\t\t\t\treturn slimEvent as AgentEvent;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tassistantEvent.type === \"toolcall_start\" ||\n\t\t\t\tassistantEvent.type === \"toolcall_delta\" ||\n\t\t\t\tassistantEvent.type === \"toolcall_end\"\n\t\t\t) {\n\t\t\t\tconst { partial, ...assistantWithoutPartial } = assistantEvent as {\n\t\t\t\t\tpartial?: unknown;\n\t\t\t\t\t[key: string]: unknown;\n\t\t\t\t};\n\t\t\t\tconst toolCallInfo =\n\t\t\t\t\tassistantEvent.type === \"toolcall_end\"\n\t\t\t\t\t\t? {}\n\t\t\t\t\t\t: extractToolCallInfo(assistantEvent);\n\n\t\t\t\tslimEvent.assistantMessageEvent = {\n\t\t\t\t\t...assistantWithoutPartial,\n\t\t\t\t\t...toolCallInfo,\n\t\t\t\t};\n\t\t\t\treturn slimEvent as AgentEvent;\n\t\t\t}\n\n\t\t\tslimEvent.assistantMessageEvent = assistantEvent;\n\t\t\treturn slimEvent as AgentEvent;\n\t\t};\n\t\tconst updateSessionSummary =\n\t\t\tcreateRuntimeSessionSummaryUpdater(sessionManager);\n\t\tconst automaticMemoryConsolidation =\n\t\t\tcreateAutomaticMemoryConsolidationCoordinator({\n\t\t\t\tcreateAgent: async () =>\n\t\t\t\t\tcreateBackgroundAgent(agent.state.model as RegisteredModel, {\n\t\t\t\t\t\tsystemPrompt: getMemoryConsolidationSystemPrompt(),\n\t\t\t\t\t}),\n\t\t\t\tgetModel: () => agent.state.model,\n\t\t\t});\n\t\tconst automaticMemoryExtraction =\n\t\t\tcreateAutomaticMemoryExtractionCoordinator({\n\t\t\t\tcreateAgent: async () =>\n\t\t\t\t\tcreateBackgroundAgent(agent.state.model as RegisteredModel),\n\t\t\t\tgetModel: () => agent.state.model,\n\t\t\t\tonProcessed: () => automaticMemoryConsolidation.schedule(),\n\t\t\t\tsessionManager,\n\t\t\t});\n\t\tconst sessionHookService = createSessionHookService({\n\t\t\tcwd: process.cwd(),\n\t\t\tsessionId: sessionManager.getSessionId(),\n\t\t});\n\t\tconst unsubscribeMcpElicitationBridge = serverRequestManager.subscribe(\n\t\t\t(event) => {\n\t\t\t\tconst activeSessionId = sessionIdProvider();\n\t\t\t\tif (!activeSessionId || event.request.sessionId !== activeSessionId) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (event.request.kind !== \"mcp_elicitation\") {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (event.type === \"registered\") {\n\t\t\t\t\tsendSSE(sseSession, {\n\t\t\t\t\t\ttype: \"client_tool_request\",\n\t\t\t\t\t\ttoolCallId: event.request.callId,\n\t\t\t\t\t\ttoolName: event.request.toolName,\n\t\t\t\t\t\targs: event.request.args,\n\t\t\t\t\t});\n\t\t\t\t\tstoreToolArgs(event.request.callId, event.request.args);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\ttoolArgsByCallId.delete(event.request.callId);\n\t\t\t},\n\t\t);\n\n\t\tconst unsubscribe = agent.subscribe((event: AgentEvent) => {\n\t\t\tupdateSessionSummary(event);\n\n\t\t\t// Forward event to client\n\t\t\tsendSSE(sseSession, maybeSlimEvent(event));\n\n\t\t\t// Track tool args for later event correlation (used by artifact live reload)\n\t\t\tif (event.type === \"tool_execution_start\") {\n\t\t\t\tstoreToolArgs(event.toolCallId, event.args);\n\t\t\t}\n\t\t\tif (event.type === \"client_tool_request\") {\n\t\t\t\tstoreToolArgs(event.toolCallId, event.args);\n\t\t\t}\n\t\t\tif (event.type === \"tool_execution_end\") {\n\t\t\t\tif (event.toolName === \"artifacts\" && !event.isError) {\n\t\t\t\t\tconst sessionId = sessionManager.getSessionId();\n\t\t\t\t\tconst args = toolArgsByCallId.get(event.toolCallId) ?? {};\n\t\t\t\t\tconst filename =\n\t\t\t\t\t\ttypeof args.filename === \"string\" ? args.filename : null;\n\t\t\t\t\tconst command =\n\t\t\t\t\t\ttypeof args.command === \"string\" ? args.command : null;\n\t\t\t\t\tif (\n\t\t\t\t\t\tsessionId &&\n\t\t\t\t\t\tfilename &&\n\t\t\t\t\t\t(command === \"create\" ||\n\t\t\t\t\t\t\tcommand === \"update\" ||\n\t\t\t\t\t\t\tcommand === \"rewrite\" ||\n\t\t\t\t\t\t\tcommand === \"delete\")\n\t\t\t\t\t) {\n\t\t\t\t\t\tpublishArtifactUpdate(sessionId, filename);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ttoolArgsByCallId.delete(event.toolCallId);\n\t\t\t}\n\n\t\t\t// Handle message completion - persist to session\n\t\t\tif (event.type === \"message_end\") {\n\t\t\t\tsessionManager.saveMessage(event.message);\n\t\t\t\tif (event.message.role === \"assistant\") {\n\t\t\t\t\tautomaticMemoryExtraction.schedule(sessionManager.getSessionFile());\n\t\t\t\t}\n\t\t\t\tlet initializationError: string | null = null;\n\n\t\t\t\t// Auto-initialize session on first user message\n\t\t\t\tif (sessionManager.shouldInitializeSession(agent.state.messages)) {\n\t\t\t\t\tinitializationError = startSessionWithPolicy({\n\t\t\t\t\t\tagent,\n\t\t\t\t\t\tenterpriseContext,\n\t\t\t\t\t\tlogger,\n\t\t\t\t\t\tmodelId: registeredModel.id,\n\t\t\t\t\t\tonSessionReady: (sessionId) => {\n\t\t\t\t\t\t\tsendSessionUpdate(sseSession, sessionId);\n\t\t\t\t\t\t\tsseSession.setContext({ sessionId });\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsessionManager,\n\t\t\t\t\t\tsubject,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Update session snapshot on every event\n\t\t\t\tsessionManager.updateSnapshot(\n\t\t\t\t\tagent.state,\n\t\t\t\t\ttoSessionModelMetadata(registeredModel),\n\t\t\t\t);\n\t\t\t\tdispatchAgentNotification(\n\t\t\t\t\tevent,\n\t\t\t\t\t{\n\t\t\t\t\t\tcwd: process.cwd(),\n\t\t\t\t\t\tsessionId: sessionManager.getSessionId(),\n\t\t\t\t\t\tmessages: agent.state.messages,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tsessionHookService,\n\t\t\t\t\t\tlogger,\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tif (initializationError) {\n\t\t\t\t\tsendSSE(sseSession, {\n\t\t\t\t\t\ttype: \"error\",\n\t\t\t\t\t\tmessage: `[Policy] ${initializationError}`,\n\t\t\t\t\t});\n\t\t\t\t\tsseSession.end();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Update session snapshot on every event\n\t\t\tsessionManager.updateSnapshot(\n\t\t\t\tagent.state,\n\t\t\t\ttoSessionModelMetadata(registeredModel),\n\t\t\t);\n\t\t\tdispatchAgentNotification(\n\t\t\t\tevent,\n\t\t\t\t{\n\t\t\t\t\tcwd: process.cwd(),\n\t\t\t\t\tsessionId: sessionManager.getSessionId(),\n\t\t\t\t\tmessages: agent.state.messages,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tsessionHookService,\n\t\t\t\t\tlogger,\n\t\t\t\t},\n\t\t\t);\n\t\t});\n\n\t\t// ===== Phase 6: Connection Close Handling =====\n\t\t// Abort agent and cleanup when client disconnects\n\t\tconst handleConnectionClose = () => {\n\t\t\tagent.abort();\n\t\t\tvoid cleanup(true);\n\t\t};\n\n\t\treq.on(\"close\", handleConnectionClose);\n\t\tres.on(\"close\", handleConnectionClose);\n\n\t\t/**\n\t\t * Cleanup resources after request completion or abort.\n\t\t * Idempotent - safe to call multiple times.\n\t\t */\n\t\tconst cleanup = async (aborted = false) => {\n\t\t\tif (cleanedUp) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcleanedUp = true;\n\n\t\t\t// Stop keepalive and remove event listeners\n\t\t\tsseSession.stopHeartbeat();\n\t\t\treq.off(\"close\", handleConnectionClose);\n\t\t\tres.off(\"close\", handleConnectionClose);\n\t\t\tunsubscribe();\n\t\t\tunsubscribeMcpElicitationBridge();\n\n\t\t\tawait automaticMemoryExtraction.flush();\n\t\t\tawait automaticMemoryConsolidation.flush();\n\t\t\tawait sessionManager.flush();\n\n\t\t\t// Send final SSE events if connection is still open\n\t\t\tif (!res.writableEnded) {\n\t\t\t\tif (aborted) {\n\t\t\t\t\tsseSession.sendAborted();\n\t\t\t\t}\n\t\t\t\tsseSession.end();\n\t\t\t}\n\n\t\t\t// Log if we had to skip writes due to client disconnect\n\t\t\tconst metrics = sseSession.getMetrics();\n\t\t\tif (metrics.skipped > 0) {\n\t\t\t\tconsole.debug(\"SSE writes skipped after disconnect\", metrics);\n\t\t\t}\n\t\t};\n\n\t\t// ===== Phase 7: Agent Execution =====\n\t\ttry {\n\t\t\t// Use circuit breaker to protect against cascading failures\n\t\t\t// If the provider is having issues, we'll fail fast\n\t\t\tconst breaker = getAgentCircuitBreaker(registeredModel.provider);\n\n\t\t\t// Execute the agent with the user's input\n\t\t\tawait runUserPromptWithRecovery({\n\t\t\t\tagent,\n\t\t\t\tsessionManager,\n\t\t\t\tcwd: process.cwd(),\n\t\t\t\tprompt: userInput,\n\t\t\t\tattachmentCount: attachmentsToSend?.length ?? 0,\n\t\t\t\tattachmentNames: attachmentsToSend?.map(\n\t\t\t\t\t(attachment) => attachment.fileName,\n\t\t\t\t),\n\t\t\t\texecute: () =>\n\t\t\t\t\tbreaker.execute(() => agent.prompt(userInput, attachmentsToSend)),\n\t\t\t\tgetPostKeepMessages: withMcpPostKeepMessages(),\n\t\t\t});\n\n\t\t\t// Send completion signal if connection is still open\n\t\t\tif (!res.writableEnded) {\n\t\t\t\tsseSession.sendDone();\n\t\t\t}\n\t\t} catch (error) {\n\t\t\t// Log and forward errors to client\n\t\t\tlogger.error(\n\t\t\t\t\"Agent prompt error\",\n\t\t\t\terror instanceof Error ? error : undefined,\n\t\t\t\t{ sessionId: sessionManager.getSessionId?.() },\n\t\t\t);\n\t\t\tsendSSE(sseSession, {\n\t\t\t\ttype: \"error\",\n\t\t\t\tmessage: error instanceof Error ? error.message : \"Unknown error\",\n\t\t\t});\n\t\t} finally {\n\t\t\t// Always cleanup, even on error\n\t\t\tawait cleanup(false);\n\t\t}\n\t} catch (error) {\n\t\t// Handle errors during setup (before SSE stream is established)\n\t\tlogger.error(\n\t\t\t\"Chat handler error\",\n\t\t\terror instanceof Error ? error : undefined,\n\t\t);\n\t\trespondWithApiError(res, error, 500, cors, req);\n\t} finally {\n\t\t// Release SSE connection slot\n\t\tif (sseLease && releaseSse) {\n\t\t\treleaseSse(sseLease);\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"chat.js","sourceRoot":"","sources":["../../../src/server/handlers/chat.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Chat Handler - Main WebSocket/SSE Endpoint for Agent Conversations\n *\n * This module implements the primary chat endpoint for the web server.\n * It handles incoming chat requests, manages agent execution, and streams\n * responses back to clients via Server-Sent Events (SSE).\n *\n * Request flow:\n * 1. Parse and validate incoming JSON request\n * 2. Acquire SSE connection slot (rate limited)\n * 3. Create or resume session based on sessionId\n * 4. Initialize agent with model and approval settings\n * 5. Hydrate conversation history from request\n * 6. Stream agent events to client via SSE\n * 7. Persist session state on completion\n *\n * Key features:\n * - Circuit breaker protection for agent calls\n * - Graceful handling of client disconnects\n * - Session persistence with auto-initialization\n * - Approval mode configuration via headers\n */\n\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport type { ComposerChatRequest, ComposerMessage } from \"@evalops/contracts\";\nimport { isAssistantMessage } from \"../../agent/type-guards.js\";\nimport type {\n\tAttachment as AgentAttachment,\n\tAgentEvent,\n} from \"../../agent/types.js\";\nimport { runUserPromptWithRecovery } from \"../../agent/user-prompt-runtime.js\";\nimport { dispatchAgentNotification } from \"../../hooks/notification-hooks.js\";\nimport { createSessionHookService } from \"../../hooks/session-integration.js\";\nimport { withMcpPostKeepMessages } from \"../../mcp/prompt-recovery.js\";\nimport {\n\tcreateAutomaticMemoryConsolidationCoordinator,\n\tgetMemoryConsolidationSystemPrompt,\n} from \"../../memory/auto-consolidation.js\";\nimport { createAutomaticMemoryExtractionCoordinator } from \"../../memory/auto-extraction.js\";\nimport type { RegisteredModel } from \"../../models/registry.js\";\nimport {\n\trecordComplianceAssistantAction,\n\trecordComplianceToolAction,\n} from \"../../services/compliance/recorder.js\";\nimport {\n\trecordIntelligentRouterChatMetric,\n\tselectIntelligentRouterModel,\n} from \"../../services/intelligent-router/recorder.js\";\nimport { recordAssistantUsageMetric } from \"../../services/usage-analytics/recorder.js\";\nimport { evaluateModelPolicy } from \"../../services/workspace-config/policy.js\";\nimport { toSessionModelMetadata } from \"../../session/manager.js\";\nimport { createRuntimeSessionSummaryUpdater } from \"../../session/runtime-summary-updater.js\";\nimport { recordSseSkip } from \"../../telemetry.js\";\nimport { createLogger } from \"../../utils/logger.js\";\nimport type { WebServerContext } from \"../app-context.js\";\nimport {\n\tnormalizeApprovalMode,\n\tresolveApprovalModeForRequest,\n} from \"../approval-mode-store.js\";\nimport { WebActionApprovalService } from \"../approval-service.js\";\nimport { publishArtifactUpdate } from \"../artifacts-live-reload.js\";\nimport { getAuthSubject } from \"../authz.js\";\nimport { getAgentCircuitBreaker } from \"../circuit-breaker.js\";\nimport { clientToolService } from \"../client-tools-service.js\";\nimport { isHostedSessionManager } from \"../hosted-session-manager.js\";\nimport { getWorkspaceConfigContext } from \"../request-context.js\";\nimport { serverRequestManager } from \"../server-request-manager.js\";\nimport {\n\tApiError,\n\tgetRequestHeader,\n\trespondWithApiError,\n\tsendJson,\n} from \"../server-utils.js\";\nimport { startSessionWithPolicy } from \"../session-initialization.js\";\nimport { createWebSessionManagerForRequest } from \"../session-scope.js\";\nimport { convertComposerMessagesToApp } from \"../session-serialization.js\";\nimport { SseSession, sendSSE, sendSessionUpdate } from \"../sse-session.js\";\nimport { ServerRequestToolRetryService } from \"../tool-retry-service.js\";\nimport {\n\ttype ChatRequestInput,\n\tChatRequestSchema,\n\tparseAndValidateJson,\n} from \"../validation.js\";\n\nconst logger = createLogger(\"web:chat\");\n\nfunction getComposerTextContent(content: ComposerMessage[\"content\"]): string {\n\tif (typeof content === \"string\") return content;\n\tif (!Array.isArray(content)) return \"\";\n\treturn content\n\t\t.filter((block) => block.type === \"text\")\n\t\t.map((block) => block.text)\n\t\t.join(\"\");\n}\n\n/**\n * Handle an incoming chat request.\n *\n * This is the main entry point for chat interactions. It:\n * 1. Validates the request format\n * 2. Sets up SSE streaming\n * 3. Runs the agent with the user's message\n * 4. Streams events back to the client\n * 5. Persists the session state\n *\n * @param req - The incoming HTTP request\n * @param res - The HTTP response (will be converted to SSE stream)\n * @param context - Server context with agent factory and configuration\n */\nexport async function handleChat(\n\treq: IncomingMessage,\n\tres: ServerResponse,\n\tcontext: WebServerContext,\n) {\n\t// Destructure context for cleaner code\n\tconst {\n\t\tcreateAgent,\n\t\tcreateBackgroundAgent,\n\t\tgetRegisteredModel,\n\t\tdefaultApprovalMode,\n\t\tacquireSse,\n\t\treleaseSse,\n\t\tcorsHeaders: cors,\n\t} = context;\n\n\t// Track SSE lease for cleanup in finally block\n\tlet sseLease: symbol | null = null;\n\n\ttry {\n\t\t// ===== Phase 1: Request Validation =====\n\t\tconst chatReq = (await parseAndValidateJson<ChatRequestInput>(\n\t\t\treq,\n\t\t\tChatRequestSchema,\n\t\t)) as ComposerChatRequest;\n\n\t\t// Validate message array exists and is non-empty\n\t\tconst incomingMessages = Array.isArray(chatReq.messages)\n\t\t\t? (chatReq.messages as ComposerMessage[])\n\t\t\t: [];\n\t\tif (incomingMessages.length === 0) {\n\t\t\tsendJson(res, 400, { error: \"No messages supplied\" }, cors, req);\n\t\t\treturn;\n\t\t}\n\n\t\t// The last message must be the user's current input\n\t\tconst latestMessage = incomingMessages[incomingMessages.length - 1];\n\t\tif (!latestMessage || latestMessage.role !== \"user\") {\n\t\t\tsendJson(\n\t\t\t\tres,\n\t\t\t\t400,\n\t\t\t\t{ error: \"Last message must be a user message\" },\n\t\t\t\tcors,\n\t\t\t\treq,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tconst { attachmentsToSend, attachmentError } = (() => {\n\t\t\tconst MAX_ATTACHMENT_BYTES = 8 * 1024 * 1024;\n\t\t\tconst MAX_TOTAL_BYTES = 20 * 1024 * 1024;\n\n\t\t\tconst raw = latestMessage.attachments;\n\t\t\tif (!Array.isArray(raw) || raw.length === 0) {\n\t\t\t\treturn {\n\t\t\t\t\tattachmentsToSend: undefined as AgentAttachment[] | undefined,\n\t\t\t\t\tattachmentError: null as string | null,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst attachments: AgentAttachment[] = [];\n\t\t\tlet totalBytes = 0;\n\n\t\t\tfor (const item of raw) {\n\t\t\t\tif (!item || typeof item !== \"object\") continue;\n\t\t\t\tconst id = typeof item.id === \"string\" ? item.id : \"\";\n\t\t\t\tconst type =\n\t\t\t\t\titem.type === \"image\" || item.type === \"document\" ? item.type : null;\n\t\t\t\tconst fileName =\n\t\t\t\t\ttypeof item.fileName === \"string\" ? item.fileName : \"attachment\";\n\t\t\t\tconst mimeType =\n\t\t\t\t\ttypeof item.mimeType === \"string\"\n\t\t\t\t\t\t? item.mimeType\n\t\t\t\t\t\t: \"application/octet-stream\";\n\t\t\t\tconst size =\n\t\t\t\t\ttypeof item.size === \"number\" && Number.isFinite(item.size)\n\t\t\t\t\t\t? item.size\n\t\t\t\t\t\t: 0;\n\t\t\t\tconst content = typeof item.content === \"string\" ? item.content : \"\";\n\t\t\t\tconst extractedText =\n\t\t\t\t\ttypeof item.extractedText === \"string\"\n\t\t\t\t\t\t? item.extractedText\n\t\t\t\t\t\t: undefined;\n\t\t\t\tconst preview =\n\t\t\t\t\ttypeof item.preview === \"string\" ? item.preview : undefined;\n\n\t\t\t\tif (!id || !type) continue;\n\t\t\t\tif (!content) {\n\t\t\t\t\t// Content omitted (e.g., session fetch); keep metadata for UI but do not send to model.\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Base64 -> bytes (approx). Prefer validating against actual content length.\n\t\t\t\tconst approxBytes = Math.floor((content.length * 3) / 4);\n\t\t\t\tconst bytes = approxBytes > 0 ? approxBytes : size;\n\n\t\t\t\tif (bytes > MAX_ATTACHMENT_BYTES) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tattachmentsToSend: undefined,\n\t\t\t\t\t\tattachmentError: `Attachment too large: ${fileName} (${Math.ceil(bytes / 1024 / 1024)}MB). Max per file is ${Math.ceil(MAX_ATTACHMENT_BYTES / 1024 / 1024)}MB.`,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\ttotalBytes += bytes;\n\t\t\t\tif (totalBytes > MAX_TOTAL_BYTES) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tattachmentsToSend: undefined,\n\t\t\t\t\t\tattachmentError: `Attachments too large: total exceeds ${Math.ceil(MAX_TOTAL_BYTES / 1024 / 1024)}MB.`,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tattachments.push({\n\t\t\t\t\tid,\n\t\t\t\t\ttype,\n\t\t\t\t\tfileName,\n\t\t\t\t\tmimeType,\n\t\t\t\t\tsize: size || bytes,\n\t\t\t\t\tcontent,\n\t\t\t\t\textractedText,\n\t\t\t\t\tpreview,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tattachmentsToSend: attachments.length ? attachments : undefined,\n\t\t\t\tattachmentError: null,\n\t\t\t};\n\t\t})();\n\n\t\tif (attachmentError) {\n\t\t\tsendJson(res, 413, { error: attachmentError }, cors, req);\n\t\t\treturn;\n\t\t}\n\n\t\tconst userInput = getComposerTextContent(latestMessage.content).trim();\n\t\tif (!userInput && !attachmentsToSend) {\n\t\t\tsendJson(res, 400, { error: \"User message cannot be empty\" }, cors, req);\n\t\t\treturn;\n\t\t}\n\n\t\t// ===== Phase 2: SSE Connection Management =====\n\t\t// Acquire a lease to limit concurrent SSE connections\n\t\tif (acquireSse) {\n\t\t\tsseLease = acquireSse();\n\t\t\tif (!sseLease) {\n\t\t\t\tsendJson(\n\t\t\t\t\tres,\n\t\t\t\t\t429,\n\t\t\t\t\t{ error: \"Too many active SSE connections\" },\n\t\t\t\t\tcors,\n\t\t\t\t\treq,\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// ===== Phase 3: Session and Agent Setup =====\n\t\t// Create session manager (false = don't auto-initialize from disk)\n\t\tconst sessionManager = createWebSessionManagerForRequest(req, false);\n\t\tconst subject = getAuthSubject(req);\n\n\t\t// Resume existing session if sessionId provided\n\t\tlet existingSessionLoaded = false;\n\t\tif (chatReq.sessionId) {\n\t\t\tif (isHostedSessionManager(sessionManager)) {\n\t\t\t\texistingSessionLoaded = await sessionManager.resumeSession(\n\t\t\t\t\tchatReq.sessionId,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tconst sessionFile = sessionManager.getSessionFileById(\n\t\t\t\t\tchatReq.sessionId,\n\t\t\t\t);\n\t\t\t\tif (sessionFile) {\n\t\t\t\t\tsessionManager.setSessionFile(sessionFile);\n\t\t\t\t\texistingSessionLoaded = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Resolve model from registry through the intelligent router. With no history,\n\t\t// this preserves the caller's requested model; with enough data or overrides,\n\t\t// it can select a better-scoring model and expose explicit fallbacks.\n\t\tconst routingSelection = selectIntelligentRouterModel({\n\t\t\treq,\n\t\t\trequestedModel: chatReq.model,\n\t\t\tbody: chatReq,\n\t\t});\n\t\tlet registeredModel: RegisteredModel | undefined;\n\t\tlet lastModelError: unknown;\n\t\tlet selectedModelError: unknown;\n\t\tlet selectedModelPolicyViolation: ReturnType<\n\t\t\ttypeof evaluateModelPolicy\n\t\t> | null = null;\n\t\tfor (const [index, modelInput] of routingSelection.modelInputs.entries()) {\n\t\t\ttry {\n\t\t\t\tconst candidateModel = await getRegisteredModel(modelInput);\n\t\t\t\tconst violation = evaluateModelPolicy(\n\t\t\t\t\tgetWorkspaceConfigContext()?.config,\n\t\t\t\t\t{\n\t\t\t\t\t\tprovider: candidateModel.provider,\n\t\t\t\t\t\tmodelId: candidateModel.id,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tif (violation) {\n\t\t\t\t\tif (index === 0) {\n\t\t\t\t\t\tselectedModelPolicyViolation = violation;\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tregisteredModel = candidateModel;\n\t\t\t\tbreak;\n\t\t\t} catch (error) {\n\t\t\t\tlastModelError = error;\n\t\t\t\tif (index === 0) {\n\t\t\t\t\tselectedModelError = error;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!registeredModel && selectedModelPolicyViolation) {\n\t\t\tsendJson(\n\t\t\t\tres,\n\t\t\t\t403,\n\t\t\t\t{\n\t\t\t\t\terror: selectedModelPolicyViolation.message,\n\t\t\t\t\tcode: selectedModelPolicyViolation.code,\n\t\t\t\t\tworkspaceId: selectedModelPolicyViolation.workspaceId,\n\t\t\t\t},\n\t\t\t\tcors,\n\t\t\t\treq,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tif (!registeredModel) {\n\t\t\tthrow selectedModelError ?? lastModelError;\n\t\t}\n\t\tconst routeStartedAt = Date.now();\n\n\t\t// Parse approval mode from request header (allows per-request override)\n\t\tconst headerApproval = normalizeApprovalMode(\n\t\t\tgetRequestHeader(\n\t\t\t\treq,\n\t\t\t\t\"x-composer-approval-mode\",\n\t\t\t\t\"x-maestro-approval-mode\",\n\t\t\t) ?? undefined,\n\t\t);\n\n\t\tconst effectiveApproval = resolveApprovalModeForRequest({\n\t\t\tsessionId: chatReq.sessionId,\n\t\t\tsubject,\n\t\t\theaderApprovalMode: headerApproval,\n\t\t\tdefaultApprovalMode,\n\t\t});\n\n\t\t// Create the agent with the resolved configuration\n\t\tconst clientToolsHeader =\n\t\t\tgetRequestHeader(\n\t\t\t\treq,\n\t\t\t\t\"x-composer-client-tools\",\n\t\t\t\t\"x-maestro-client-tools\",\n\t\t\t) === \"1\";\n\n\t\tconst clientHeader = getRequestHeader(\n\t\t\treq,\n\t\t\t\"x-composer-client\",\n\t\t\t\"x-maestro-client\",\n\t\t)?.toLowerCase();\n\t\tconst sessionIdProvider = () => sessionManager.getSessionId() ?? undefined;\n\t\tconst requestApprovalService = new WebActionApprovalService(\n\t\t\teffectiveApproval,\n\t\t\tsessionIdProvider,\n\t\t);\n\t\tconst toolRetryService = new ServerRequestToolRetryService(\n\t\t\t\"prompt\",\n\t\t\tsessionIdProvider,\n\t\t);\n\n\t\tconst agent = await createAgent(\n\t\t\tregisteredModel,\n\t\t\tchatReq.thinkingLevel || \"off\",\n\t\t\teffectiveApproval,\n\t\t\t{\n\t\t\t\tapprovalService: requestApprovalService,\n\t\t\t\ttoolRetryService,\n\t\t\t\t...(clientToolsHeader\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tenableClientTools: true,\n\t\t\t\t\t\t\tclientToolService:\n\t\t\t\t\t\t\t\tclientToolService.forSession(sessionIdProvider),\n\t\t\t\t\t\t\tincludeVscodeTools: clientHeader === \"vscode\",\n\t\t\t\t\t\t\tincludeJetBrainsTools: clientHeader === \"jetbrains\",\n\t\t\t\t\t\t\tincludeConductorTools: clientHeader === \"conductor\",\n\t\t\t\t\t\t}\n\t\t\t\t\t: {}),\n\t\t\t},\n\t\t);\n\n\t\t// Hydrate conversation history (all messages except the current user input)\n\t\tconst historyMessages = incomingMessages.slice(0, -1);\n\t\tconst hydratedHistory = convertComposerMessagesToApp(\n\t\t\thistoryMessages,\n\t\t\tregisteredModel,\n\t\t);\n\t\tif (hydratedHistory.length > 0) {\n\t\t\tagent.replaceMessages(hydratedHistory);\n\t\t} else {\n\t\t\tagent.clearMessages();\n\t\t}\n\n\t\t// ===== Phase 4: SSE Stream Setup =====\n\t\t// Initialize the SSE response headers\n\t\tres.writeHead(200, {\n\t\t\t\"Content-Type\": \"text/event-stream\",\n\t\t\t\"Cache-Control\": \"no-cache\",\n\t\t\tConnection: \"keep-alive\",\n\t\t\t...cors,\n\t\t});\n\n\t\t// Create SSE session with telemetry callback for skip tracking\n\t\tconst requestId = Math.random().toString(36).slice(2);\n\t\tconst modelKey = `${registeredModel.provider}/${registeredModel.id}`;\n\t\tconst sseSession = new SseSession(\n\t\t\tres,\n\t\t\t(metrics) => {\n\t\t\t\t// Record telemetry when SSE writes are skipped (client disconnected)\n\t\t\t\trecordSseSkip(metrics.sent, metrics.skipped, {\n\t\t\t\t\trequestId: metrics.context?.requestId,\n\t\t\t\t\tmodelKey: metrics.context?.modelKey,\n\t\t\t\t\tsessionId: metrics.context?.sessionId,\n\t\t\t\t\tlastError:\n\t\t\t\t\t\tmetrics.lastError instanceof Error\n\t\t\t\t\t\t\t? metrics.lastError.message\n\t\t\t\t\t\t\t: metrics.lastError,\n\t\t\t\t});\n\t\t\t},\n\t\t\t{ requestId, modelKey },\n\t\t);\n\t\tsseSession.startHeartbeat(); // Keep connection alive during idle periods\n\n\t\t// Track cleanup state to prevent double-cleanup\n\t\tlet cleanedUp = false;\n\n\t\t// ===== Phase 5: Agent Event Subscription =====\n\t\t// Subscribe to agent events and forward them to the SSE stream\n\t\t// Pre-load enterprise context for session tracking\n\t\tconst { enterpriseContext } = await import(\"../../enterprise/context.js\");\n\n\t\tconst initializeSessionIfNeeded = async (): Promise<string | null> => {\n\t\t\tif (existingSessionLoaded || sessionManager.isInitialized()) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst initializationError = await startSessionWithPolicy({\n\t\t\t\tagent,\n\t\t\t\tenterpriseContext,\n\t\t\t\tlogger,\n\t\t\t\tmodelId: registeredModel.id,\n\t\t\t\tonSessionReady: (sessionId) => {\n\t\t\t\t\tsendSessionUpdate(sseSession, sessionId);\n\t\t\t\t\tsseSession.setContext({ sessionId });\n\t\t\t\t},\n\t\t\t\tsessionManager,\n\t\t\t\tsubject,\n\t\t\t});\n\t\t\tif (initializationError) {\n\t\t\t\treturn initializationError;\n\t\t\t}\n\t\t\texistingSessionLoaded = true;\n\t\t\treturn null;\n\t\t};\n\n\t\tconst initializationError = await initializeSessionIfNeeded();\n\t\tif (initializationError) {\n\t\t\tsendSSE(sseSession, {\n\t\t\t\ttype: \"error\",\n\t\t\t\tmessage: `[Policy] ${initializationError}`,\n\t\t\t});\n\t\t\tsseSession.end();\n\t\t\tif (sseLease && releaseSse) {\n\t\t\t\treleaseSse(sseLease);\n\t\t\t\tsseLease = null;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tconst toolArgsByCallId = new Map<string, Record<string, unknown>>();\n\t\tconst storeToolArgs = (toolCallId: string, args: unknown) => {\n\t\t\ttoolArgsByCallId.set(\n\t\t\t\ttoolCallId,\n\t\t\t\t(args && typeof args === \"object\" && !Array.isArray(args)\n\t\t\t\t\t? (args as Record<string, unknown>)\n\t\t\t\t\t: {}) as Record<string, unknown>,\n\t\t\t);\n\t\t};\n\t\tconst slimValue = getRequestHeader(\n\t\t\treq,\n\t\t\t\"x-composer-slim-events\",\n\t\t\t\"x-maestro-slim-events\",\n\t\t);\n\t\tconst slimEvents = slimValue === \"1\" || slimValue === \"true\";\n\t\tconst slimToolCallArgsLimit = (() => {\n\t\t\tconst raw = process.env.MAESTRO_SLIM_TOOLCALL_ARGS_MAX_BYTES;\n\t\t\tif (!raw) return 4096;\n\t\t\tconst parsed = Number(raw);\n\t\t\tif (!Number.isFinite(parsed) || parsed <= 0) return 4096;\n\t\t\treturn Math.min(parsed, 1024 * 1024);\n\t\t})();\n\t\tconst extractToolCallInfo = (assistantEvent: {\n\t\t\tcontentIndex?: number;\n\t\t\tpartial?: { content?: unknown[] };\n\t\t}): {\n\t\t\ttoolCallId?: string;\n\t\t\ttoolCallName?: string;\n\t\t\ttoolCallArgs?: Record<string, unknown>;\n\t\t\ttoolCallArgsTruncated?: boolean;\n\t\t} => {\n\t\t\tconst assistantMessageEvent = assistantEvent.partial;\n\t\t\tconst contentIndex = assistantEvent.contentIndex;\n\t\t\tif (\n\t\t\t\t!assistantMessageEvent ||\n\t\t\t\ttypeof contentIndex !== \"number\" ||\n\t\t\t\t!Array.isArray(assistantMessageEvent.content)\n\t\t\t) {\n\t\t\t\treturn {};\n\t\t\t}\n\t\t\tconst block = assistantMessageEvent.content[contentIndex];\n\t\t\tif (!block || typeof block !== \"object\") {\n\t\t\t\treturn {};\n\t\t\t}\n\t\t\tconst maybeToolCall = block as {\n\t\t\t\ttype?: string;\n\t\t\t\tid?: string;\n\t\t\t\tname?: string;\n\t\t\t\targuments?: Record<string, unknown>;\n\t\t\t};\n\t\t\tif (maybeToolCall.type !== \"toolCall\") {\n\t\t\t\treturn {};\n\t\t\t}\n\t\t\tconst maybeArgs = maybeToolCall.arguments;\n\t\t\tconst toolCallArgs =\n\t\t\t\tmaybeArgs && typeof maybeArgs === \"object\" && !Array.isArray(maybeArgs)\n\t\t\t\t\t? maybeArgs\n\t\t\t\t\t: undefined;\n\t\t\tif (toolCallArgs) {\n\t\t\t\ttry {\n\t\t\t\t\tconst size = Buffer.byteLength(JSON.stringify(toolCallArgs), \"utf8\");\n\t\t\t\t\tif (size > slimToolCallArgsLimit) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\ttoolCallId: maybeToolCall.id,\n\t\t\t\t\t\t\ttoolCallName: maybeToolCall.name,\n\t\t\t\t\t\t\ttoolCallArgsTruncated: true,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttoolCallId: maybeToolCall.id,\n\t\t\t\t\t\ttoolCallName: maybeToolCall.name,\n\t\t\t\t\t\ttoolCallArgsTruncated: true,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn {\n\t\t\t\ttoolCallId: maybeToolCall.id,\n\t\t\t\ttoolCallName: maybeToolCall.name,\n\t\t\t\ttoolCallArgs,\n\t\t\t};\n\t\t};\n\t\tconst maybeSlimEvent = (event: AgentEvent): AgentEvent => {\n\t\t\tif (!slimEvents || event.type !== \"message_update\") {\n\t\t\t\treturn event;\n\t\t\t}\n\n\t\t\tconst assistantEvent = event.assistantMessageEvent;\n\t\t\tconst slimEvent: Record<string, unknown> = { ...event };\n\t\t\tdelete slimEvent.message;\n\n\t\t\tif (!assistantEvent) {\n\t\t\t\treturn slimEvent as AgentEvent;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tassistantEvent.type === \"text_delta\" ||\n\t\t\t\tassistantEvent.type === \"thinking_delta\"\n\t\t\t) {\n\t\t\t\tconst { partial, ...assistantWithoutPartial } = assistantEvent as {\n\t\t\t\t\tpartial?: unknown;\n\t\t\t\t\t[key: string]: unknown;\n\t\t\t\t};\n\n\t\t\t\tslimEvent.assistantMessageEvent = assistantWithoutPartial;\n\t\t\t\treturn slimEvent as AgentEvent;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tassistantEvent.type === \"toolcall_start\" ||\n\t\t\t\tassistantEvent.type === \"toolcall_delta\" ||\n\t\t\t\tassistantEvent.type === \"toolcall_end\"\n\t\t\t) {\n\t\t\t\tconst { partial, ...assistantWithoutPartial } = assistantEvent as {\n\t\t\t\t\tpartial?: unknown;\n\t\t\t\t\t[key: string]: unknown;\n\t\t\t\t};\n\t\t\t\tconst toolCallInfo =\n\t\t\t\t\tassistantEvent.type === \"toolcall_end\"\n\t\t\t\t\t\t? {}\n\t\t\t\t\t\t: extractToolCallInfo(assistantEvent);\n\n\t\t\t\tslimEvent.assistantMessageEvent = {\n\t\t\t\t\t...assistantWithoutPartial,\n\t\t\t\t\t...toolCallInfo,\n\t\t\t\t};\n\t\t\t\treturn slimEvent as AgentEvent;\n\t\t\t}\n\n\t\t\tslimEvent.assistantMessageEvent = assistantEvent;\n\t\t\treturn slimEvent as AgentEvent;\n\t\t};\n\t\tconst updateSessionSummary =\n\t\t\tcreateRuntimeSessionSummaryUpdater(sessionManager);\n\t\tconst automaticMemoryConsolidation =\n\t\t\tcreateAutomaticMemoryConsolidationCoordinator({\n\t\t\t\tcreateAgent: async () =>\n\t\t\t\t\tcreateBackgroundAgent(agent.state.model as RegisteredModel, {\n\t\t\t\t\t\tsystemPrompt: getMemoryConsolidationSystemPrompt(),\n\t\t\t\t\t}),\n\t\t\t\tgetModel: () => agent.state.model,\n\t\t\t});\n\t\tconst automaticMemoryExtraction =\n\t\t\tcreateAutomaticMemoryExtractionCoordinator({\n\t\t\t\tcreateAgent: async () =>\n\t\t\t\t\tcreateBackgroundAgent(agent.state.model as RegisteredModel),\n\t\t\t\tgetModel: () => agent.state.model,\n\t\t\t\tonProcessed: () => automaticMemoryConsolidation.schedule(),\n\t\t\t\tsessionManager,\n\t\t\t});\n\t\tconst sessionHookService = createSessionHookService({\n\t\t\tcwd: process.cwd(),\n\t\t\tsessionId: sessionManager.getSessionId(),\n\t\t});\n\t\tconst unsubscribeMcpElicitationBridge = serverRequestManager.subscribe(\n\t\t\t(event) => {\n\t\t\t\tconst activeSessionId = sessionIdProvider();\n\t\t\t\tif (!activeSessionId || event.request.sessionId !== activeSessionId) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (event.request.kind !== \"mcp_elicitation\") {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (event.type === \"registered\") {\n\t\t\t\t\tsendSSE(sseSession, {\n\t\t\t\t\t\ttype: \"client_tool_request\",\n\t\t\t\t\t\ttoolCallId: event.request.callId,\n\t\t\t\t\t\ttoolName: event.request.toolName,\n\t\t\t\t\t\targs: event.request.args,\n\t\t\t\t\t});\n\t\t\t\t\tstoreToolArgs(event.request.callId, event.request.args);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\ttoolArgsByCallId.delete(event.request.callId);\n\t\t\t},\n\t\t);\n\n\t\tconst unsubscribe = agent.subscribe((event: AgentEvent) => {\n\t\t\tupdateSessionSummary(event);\n\n\t\t\t// Forward event to client\n\t\t\tsendSSE(sseSession, maybeSlimEvent(event));\n\n\t\t\t// Track tool args for later event correlation (used by artifact live reload)\n\t\t\tif (event.type === \"tool_execution_start\") {\n\t\t\t\tstoreToolArgs(event.toolCallId, event.args);\n\t\t\t}\n\t\t\tif (event.type === \"client_tool_request\") {\n\t\t\t\tstoreToolArgs(event.toolCallId, event.args);\n\t\t\t}\n\t\t\tif (event.type === \"tool_execution_end\") {\n\t\t\t\trecordComplianceToolAction({\n\t\t\t\t\treq,\n\t\t\t\t\tevent,\n\t\t\t\t\tsessionId: sessionManager.getSessionId(),\n\t\t\t\t\tsubject,\n\t\t\t\t});\n\t\t\t\tif (event.toolName === \"artifacts\" && !event.isError) {\n\t\t\t\t\tconst sessionId = sessionManager.getSessionId();\n\t\t\t\t\tconst args = toolArgsByCallId.get(event.toolCallId) ?? {};\n\t\t\t\t\tconst filename =\n\t\t\t\t\t\ttypeof args.filename === \"string\" ? args.filename : null;\n\t\t\t\t\tconst command =\n\t\t\t\t\t\ttypeof args.command === \"string\" ? args.command : null;\n\t\t\t\t\tif (\n\t\t\t\t\t\tsessionId &&\n\t\t\t\t\t\tfilename &&\n\t\t\t\t\t\t(command === \"create\" ||\n\t\t\t\t\t\t\tcommand === \"update\" ||\n\t\t\t\t\t\t\tcommand === \"rewrite\" ||\n\t\t\t\t\t\t\tcommand === \"delete\")\n\t\t\t\t\t) {\n\t\t\t\t\t\tpublishArtifactUpdate(sessionId, filename);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ttoolArgsByCallId.delete(event.toolCallId);\n\t\t\t}\n\n\t\t\t// Handle message completion - persist to session\n\t\t\tif (event.type === \"message_end\") {\n\t\t\t\tsessionManager.saveMessage(event.message);\n\t\t\t\tif (isAssistantMessage(event.message)) {\n\t\t\t\t\trecordAssistantUsageMetric({\n\t\t\t\t\t\treq,\n\t\t\t\t\t\tmessage: event.message,\n\t\t\t\t\t\tsessionId: sessionManager.getSessionId(),\n\t\t\t\t\t\tsubject,\n\t\t\t\t\t});\n\t\t\t\t\trecordIntelligentRouterChatMetric({\n\t\t\t\t\t\ttaskType: routingSelection.taskType,\n\t\t\t\t\t\tprovider: registeredModel.provider,\n\t\t\t\t\t\tmodel: registeredModel.id,\n\t\t\t\t\t\tstartedAt: routeStartedAt,\n\t\t\t\t\t\tmessage: event.message,\n\t\t\t\t\t});\n\t\t\t\t\trecordComplianceAssistantAction({\n\t\t\t\t\t\treq,\n\t\t\t\t\t\tmessage: event.message,\n\t\t\t\t\t\tsessionId: sessionManager.getSessionId(),\n\t\t\t\t\t\tsubject,\n\t\t\t\t\t});\n\t\t\t\t\tautomaticMemoryExtraction.schedule(sessionManager.getSessionFile());\n\t\t\t\t}\n\t\t\t\t// Update session snapshot on every event\n\t\t\t\tsessionManager.updateSnapshot(\n\t\t\t\t\tagent.state,\n\t\t\t\t\ttoSessionModelMetadata(registeredModel),\n\t\t\t\t);\n\t\t\t\tdispatchAgentNotification(\n\t\t\t\t\tevent,\n\t\t\t\t\t{\n\t\t\t\t\t\tcwd: process.cwd(),\n\t\t\t\t\t\tsessionId: sessionManager.getSessionId(),\n\t\t\t\t\t\tmessages: agent.state.messages,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tsessionHookService,\n\t\t\t\t\t\tlogger,\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Update session snapshot on every event\n\t\t\tsessionManager.updateSnapshot(\n\t\t\t\tagent.state,\n\t\t\t\ttoSessionModelMetadata(registeredModel),\n\t\t\t);\n\t\t\tdispatchAgentNotification(\n\t\t\t\tevent,\n\t\t\t\t{\n\t\t\t\t\tcwd: process.cwd(),\n\t\t\t\t\tsessionId: sessionManager.getSessionId(),\n\t\t\t\t\tmessages: agent.state.messages,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tsessionHookService,\n\t\t\t\t\tlogger,\n\t\t\t\t},\n\t\t\t);\n\t\t});\n\n\t\t// ===== Phase 6: Connection Close Handling =====\n\t\t// Abort agent and cleanup when client disconnects\n\t\tconst handleConnectionClose = () => {\n\t\t\tagent.abort();\n\t\t\tvoid cleanup(true);\n\t\t};\n\n\t\treq.on(\"close\", handleConnectionClose);\n\t\tres.on(\"close\", handleConnectionClose);\n\n\t\t/**\n\t\t * Cleanup resources after request completion or abort.\n\t\t * Idempotent - safe to call multiple times.\n\t\t */\n\t\tconst cleanup = async (aborted = false) => {\n\t\t\tif (cleanedUp) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcleanedUp = true;\n\n\t\t\t// Stop keepalive and remove event listeners\n\t\t\tsseSession.stopHeartbeat();\n\t\t\treq.off(\"close\", handleConnectionClose);\n\t\t\tres.off(\"close\", handleConnectionClose);\n\t\t\tunsubscribe();\n\t\t\tunsubscribeMcpElicitationBridge();\n\n\t\t\tawait automaticMemoryExtraction.flush();\n\t\t\tawait automaticMemoryConsolidation.flush();\n\t\t\tawait sessionManager.flush();\n\n\t\t\t// Send final SSE events if connection is still open\n\t\t\tif (!res.writableEnded) {\n\t\t\t\tif (aborted) {\n\t\t\t\t\tsseSession.sendAborted();\n\t\t\t\t}\n\t\t\t\tsseSession.end();\n\t\t\t}\n\n\t\t\t// Log if we had to skip writes due to client disconnect\n\t\t\tconst metrics = sseSession.getMetrics();\n\t\t\tif (metrics.skipped > 0) {\n\t\t\t\tconsole.debug(\"SSE writes skipped after disconnect\", metrics);\n\t\t\t}\n\t\t};\n\n\t\t// ===== Phase 7: Agent Execution =====\n\t\ttry {\n\t\t\t// Use circuit breaker to protect against cascading failures\n\t\t\t// If the provider is having issues, we'll fail fast\n\t\t\tconst breaker = getAgentCircuitBreaker(registeredModel.provider);\n\n\t\t\t// Execute the agent with the user's input\n\t\t\tawait runUserPromptWithRecovery({\n\t\t\t\tagent,\n\t\t\t\tsessionManager,\n\t\t\t\tcwd: process.cwd(),\n\t\t\t\tprompt: userInput,\n\t\t\t\tattachmentCount: attachmentsToSend?.length ?? 0,\n\t\t\t\tattachmentNames: attachmentsToSend?.map(\n\t\t\t\t\t(attachment) => attachment.fileName,\n\t\t\t\t),\n\t\t\t\texecute: () =>\n\t\t\t\t\tbreaker.execute(() => agent.prompt(userInput, attachmentsToSend)),\n\t\t\t\tgetPostKeepMessages: withMcpPostKeepMessages(),\n\t\t\t});\n\n\t\t\t// Send completion signal if connection is still open\n\t\t\tif (!res.writableEnded) {\n\t\t\t\tsseSession.sendDone();\n\t\t\t}\n\t\t} catch (error) {\n\t\t\t// Log and forward errors to client\n\t\t\tlogger.error(\n\t\t\t\t\"Agent prompt error\",\n\t\t\t\terror instanceof Error ? error : undefined,\n\t\t\t\t{ sessionId: sessionManager.getSessionId?.() },\n\t\t\t);\n\t\t\tsendSSE(sseSession, {\n\t\t\t\ttype: \"error\",\n\t\t\t\tmessage: error instanceof Error ? error.message : \"Unknown error\",\n\t\t\t});\n\t\t} finally {\n\t\t\t// Always cleanup, even on error\n\t\t\tawait cleanup(false);\n\t\t}\n\t} catch (error) {\n\t\t// Handle errors during setup (before SSE stream is established)\n\t\tlogger.error(\n\t\t\t\"Chat handler error\",\n\t\t\terror instanceof Error ? error : undefined,\n\t\t);\n\t\trespondWithApiError(res, error, 500, cors, req);\n\t} finally {\n\t\t// Release SSE connection slot\n\t\tif (sseLease && releaseSse) {\n\t\t\treleaseSse(sseLease);\n\t\t}\n\t}\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import type { IncomingMessage, ServerResponse } from "node:http";
2
+ export declare function handleCompliance(req: IncomingMessage, res: ServerResponse, cors: Record<string, string>, params?: Record<string, string>): Promise<void>;
3
+ //# sourceMappingURL=compliance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compliance.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/compliance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAiCjE,wBAAsB,gBAAgB,CACrC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5B,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GACjC,OAAO,CAAC,IAAI,CAAC,CA0Df"}
@@ -0,0 +1,53 @@
1
+ import { ComplianceValidationError, getComplianceService, normalizeComplianceEvidenceQuery, parseComplianceFrameworks, } from "../../services/compliance/index.js";
2
+ import { readJsonBody, respondWithApiError, sendJson, } from "../server-utils.js";
3
+ function optionalSearchParam(params, ...names) {
4
+ for (const name of names) {
5
+ const value = params.get(name)?.trim();
6
+ if (value)
7
+ return value;
8
+ }
9
+ return undefined;
10
+ }
11
+ function frameworksFromQuery(params) {
12
+ const raw = optionalSearchParam(params, "frameworks", "framework");
13
+ return raw ? parseComplianceFrameworks(raw) : undefined;
14
+ }
15
+ export async function handleCompliance(req, res, cors, params = {}) {
16
+ try {
17
+ const url = new URL(req.url || "/api/compliance", `http://${req.headers.host || "localhost"}`);
18
+ const service = getComplianceService();
19
+ if (req.method === "POST") {
20
+ const body = await readJsonBody(req, 2_000_000);
21
+ const report = await service.generateReport(body);
22
+ sendJson(res, 200, { report }, cors, req);
23
+ return;
24
+ }
25
+ if (req.method === "GET" && params.controlId) {
26
+ const result = await service.getEvidenceForControl(decodeURIComponent(params.controlId), normalizeComplianceEvidenceQuery({
27
+ workspaceId: optionalSearchParam(url.searchParams, "workspace_id", "workspaceId"),
28
+ from: optionalSearchParam(url.searchParams, "from"),
29
+ to: optionalSearchParam(url.searchParams, "to"),
30
+ }));
31
+ if (!result) {
32
+ sendJson(res, 404, { error: "Compliance control not found." }, cors, req);
33
+ return;
34
+ }
35
+ sendJson(res, 200, result, cors, req);
36
+ return;
37
+ }
38
+ if (req.method === "GET") {
39
+ const controls = service.listControls(frameworksFromQuery(url.searchParams));
40
+ sendJson(res, 200, { controls }, cors, req);
41
+ return;
42
+ }
43
+ sendJson(res, 405, { error: "Method not allowed" }, cors, req);
44
+ }
45
+ catch (error) {
46
+ if (error instanceof ComplianceValidationError) {
47
+ sendJson(res, 400, { error: error.message }, cors, req);
48
+ return;
49
+ }
50
+ respondWithApiError(res, error, 500, cors, req);
51
+ }
52
+ }
53
+ //# sourceMappingURL=compliance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compliance.js","sourceRoot":"","sources":["../../../src/server/handlers/compliance.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IncomingMessage, ServerResponse } from \"node:http\";\nimport {\n\ttype ComplianceFramework,\n\ttype ComplianceReportRequest,\n\tComplianceValidationError,\n\tgetComplianceService,\n\tnormalizeComplianceEvidenceQuery,\n\tparseComplianceFrameworks,\n} from \"../../services/compliance/index.js\";\nimport {\n\treadJsonBody,\n\trespondWithApiError,\n\tsendJson,\n} from \"../server-utils.js\";\n\nfunction optionalSearchParam(\n\tparams: URLSearchParams,\n\t...names: string[]\n): string | undefined {\n\tfor (const name of names) {\n\t\tconst value = params.get(name)?.trim();\n\t\tif (value) return value;\n\t}\n\treturn undefined;\n}\n\nfunction frameworksFromQuery(\n\tparams: URLSearchParams,\n): ComplianceFramework[] | undefined {\n\tconst raw = optionalSearchParam(params, \"frameworks\", \"framework\");\n\treturn raw ? parseComplianceFrameworks(raw) : undefined;\n}\n\nexport async function handleCompliance(\n\treq: IncomingMessage,\n\tres: ServerResponse,\n\tcors: Record<string, string>,\n\tparams: Record<string, string> = {},\n): Promise<void> {\n\ttry {\n\t\tconst url = new URL(\n\t\t\treq.url || \"/api/compliance\",\n\t\t\t`http://${req.headers.host || \"localhost\"}`,\n\t\t);\n\t\tconst service = getComplianceService();\n\n\t\tif (req.method === \"POST\") {\n\t\t\tconst body = await readJsonBody<ComplianceReportRequest>(req, 2_000_000);\n\t\t\tconst report = await service.generateReport(body);\n\t\t\tsendJson(res, 200, { report }, cors, req);\n\t\t\treturn;\n\t\t}\n\n\t\tif (req.method === \"GET\" && params.controlId) {\n\t\t\tconst result = await service.getEvidenceForControl(\n\t\t\t\tdecodeURIComponent(params.controlId),\n\t\t\t\tnormalizeComplianceEvidenceQuery({\n\t\t\t\t\tworkspaceId: optionalSearchParam(\n\t\t\t\t\t\turl.searchParams,\n\t\t\t\t\t\t\"workspace_id\",\n\t\t\t\t\t\t\"workspaceId\",\n\t\t\t\t\t),\n\t\t\t\t\tfrom: optionalSearchParam(url.searchParams, \"from\"),\n\t\t\t\t\tto: optionalSearchParam(url.searchParams, \"to\"),\n\t\t\t\t}),\n\t\t\t);\n\t\t\tif (!result) {\n\t\t\t\tsendJson(\n\t\t\t\t\tres,\n\t\t\t\t\t404,\n\t\t\t\t\t{ error: \"Compliance control not found.\" },\n\t\t\t\t\tcors,\n\t\t\t\t\treq,\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsendJson(res, 200, result, cors, req);\n\t\t\treturn;\n\t\t}\n\n\t\tif (req.method === \"GET\") {\n\t\t\tconst controls = service.listControls(\n\t\t\t\tframeworksFromQuery(url.searchParams),\n\t\t\t);\n\t\t\tsendJson(res, 200, { controls }, cors, req);\n\t\t\treturn;\n\t\t}\n\n\t\tsendJson(res, 405, { error: \"Method not allowed\" }, cors, req);\n\t} catch (error) {\n\t\tif (error instanceof ComplianceValidationError) {\n\t\t\tsendJson(res, 400, { error: error.message }, cors, req);\n\t\t\treturn;\n\t\t}\n\t\trespondWithApiError(res, error, 500, cors, req);\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAuDjE,wBAAsB,aAAa,CAClC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,iBAgGnC"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAuDjE,wBAAsB,aAAa,CAClC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,iBAqFnC"}
@@ -1,6 +1,6 @@
1
1
  import { getAuthSubject, requireApiAuth } from "../authz.js";
2
2
  import { respondWithApiError, sendJson } from "../server-utils.js";
3
- import { createSessionManagerForRequest } from "../session-scope.js";
3
+ import { createWebSessionManagerForRequest } from "../session-scope.js";
4
4
  import { redactPii } from "../utils/redact.js";
5
5
  import { checkSessionRateLimitAsync } from "../utils/session-rate-limit.js";
6
6
  import { approximateTokensFromJson, } from "../utils/token-estimator.js";
@@ -63,15 +63,10 @@ export async function handleContext(req, res, corsHeaders) {
63
63
  sendJson(res, 429, { error: "Too many context requests" }, corsHeaders);
64
64
  return;
65
65
  }
66
- const sessionManager = createSessionManagerForRequest(req, false);
67
- const sessionFile = sessionManager.getSessionFileById(sessionId);
68
- if (!sessionFile) {
69
- sendJson(res, 404, { error: `Session not found: ${sessionId}` }, corsHeaders);
70
- return;
71
- }
66
+ const sessionManager = createWebSessionManagerForRequest(req, false);
72
67
  const session = await sessionManager.loadSession(sessionId);
73
68
  if (!session) {
74
- sendJson(res, 404, { error: "Session file exists but could not be loaded" }, corsHeaders);
69
+ sendJson(res, 404, { error: `Session not found: ${sessionId}` }, corsHeaders);
75
70
  return;
76
71
  }
77
72
  // Verify session ownership to prevent IDOR attacks
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/server/handlers/context.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IncomingMessage, ServerResponse } from \"node:http\";\nimport { getAuthSubject, requireApiAuth } from \"../authz.js\";\nimport { respondWithApiError, sendJson } from \"../server-utils.js\";\nimport { createSessionManagerForRequest } from \"../session-scope.js\";\nimport { redactPii } from \"../utils/redact.js\";\nimport { checkSessionRateLimitAsync } from \"../utils/session-rate-limit.js\";\nimport {\n\tapproximateTokensFromJson,\n\tapproximateTokensFromText,\n} from \"../utils/token-estimator.js\";\n\nfunction assertSessionId(sessionId: string): void {\n\tif (!/^[A-Za-z0-9._-]+$/.test(sessionId)) {\n\t\tthrow new Error(\"Invalid sessionId format\");\n\t}\n}\n\n/**\n * Check if a user has access to a session.\n *\n * In multi-user deployments, sessions should only be accessible by their owner.\n * This function verifies ownership by checking if the session belongs to the\n * authenticated user's scope.\n *\n * Session ownership is determined by:\n * 1. If session has an explicit 'owner' field, it must match the subject\n * 2. If session has a 'subject' field (API-created sessions), it must match\n * 3. Otherwise, access is denied for API requests in strict mode (prevents IDOR)\n *\n * Note: Current sessions don't store owner info, so this defaults to denying\n * access in strict mode. Set MAESTRO_STRICT_SESSION_ACCESS=false for backwards\n * compatibility in single-user deployments.\n */\nfunction verifySessionOwnership(\n\tsession: Record<string, unknown>,\n\tsubject: string,\n): boolean {\n\t// Check explicit owner field\n\tif (typeof session.owner === \"string\" && session.owner) {\n\t\treturn session.owner === subject;\n\t}\n\n\t// Check subject field (for API-created sessions)\n\tif (typeof session.subject === \"string\" && session.subject) {\n\t\treturn session.subject === subject;\n\t}\n\n\t// For sessions without ownership info:\n\t// In strict mode (multi-user), deny access to prevent IDOR attacks.\n\t// Sessions created via CLI don't have ownership info, but API access\n\t// should be restricted in hosted environments.\n\tconst strictMode = process.env.MAESTRO_STRICT_SESSION_ACCESS !== \"false\";\n\treturn !strictMode;\n}\n\nexport async function handleContext(\n\treq: IncomingMessage,\n\tres: ServerResponse,\n\tcorsHeaders: Record<string, string>,\n) {\n\tif (req.method !== \"GET\") {\n\t\tsendJson(res, 405, { error: \"Method not allowed\" }, corsHeaders);\n\t\treturn;\n\t}\n\tif (!(await requireApiAuth(req, res, corsHeaders))) return;\n\n\tconst url = new URL(req.url || \"/api/context\", `http://${req.headers.host}`);\n\tconst sessionId = url.searchParams.get(\"sessionId\");\n\n\ttry {\n\t\tif (!sessionId) {\n\t\t\tsendJson(\n\t\t\t\tres,\n\t\t\t\t400,\n\t\t\t\t{ error: \"sessionId query parameter is required\" },\n\t\t\t\tcorsHeaders,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tassertSessionId(sessionId);\n\t\tconst subject = getAuthSubject(req);\n\t\tconst sessionKey = `${subject}:${sessionId}`;\n\t\tconst rate = await checkSessionRateLimitAsync(sessionKey);\n\t\tif (!rate.allowed) {\n\t\t\tsendJson(res, 429, { error: \"Too many context requests\" }, corsHeaders);\n\t\t\treturn;\n\t\t}\n\t\tconst sessionManager = createSessionManagerForRequest(req, false);\n\t\tconst sessionFile = sessionManager.getSessionFileById(sessionId);\n\t\tif (!sessionFile) {\n\t\t\tsendJson(\n\t\t\t\tres,\n\t\t\t\t404,\n\t\t\t\t{ error: `Session not found: ${sessionId}` },\n\t\t\t\tcorsHeaders,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tconst session = await sessionManager.loadSession(sessionId);\n\t\tif (!session) {\n\t\t\tsendJson(\n\t\t\t\tres,\n\t\t\t\t404,\n\t\t\t\t{ error: \"Session file exists but could not be loaded\" },\n\t\t\t\tcorsHeaders,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\t// Verify session ownership to prevent IDOR attacks\n\t\tif (!verifySessionOwnership(session, subject)) {\n\t\t\tsendJson(\n\t\t\t\tres,\n\t\t\t\t403,\n\t\t\t\t{ error: \"Access denied: session belongs to another user\" },\n\t\t\t\tcorsHeaders,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tconst items = session.messages.map(\n\t\t\t(msg: { role: string; content?: unknown }, index: number) => ({\n\t\t\t\ttype: msg.role,\n\t\t\t\tindex,\n\t\t\t\ttokenEstimate: approximateTokensFromJson(msg),\n\t\t\t\tsnippet:\n\t\t\t\t\ttypeof msg.content === \"string\"\n\t\t\t\t\t\t? redactPii(msg.content).slice(0, 160)\n\t\t\t\t\t\t: \"\",\n\t\t\t}),\n\t\t);\n\n\t\tconst totalTokens = items.reduce(\n\t\t\t(sum: number, item: { tokenEstimate: number }) =>\n\t\t\t\tsum + item.tokenEstimate,\n\t\t\t0,\n\t\t);\n\n\t\tsendJson(\n\t\t\tres,\n\t\t\t200,\n\t\t\t{\n\t\t\t\tsessionId,\n\t\t\t\titems,\n\t\t\t\ttotalTokens,\n\t\t\t\tmessageCount: session.messages.length,\n\t\t\t},\n\t\t\tcorsHeaders,\n\t\t);\n\t} catch (error) {\n\t\trespondWithApiError(res, error, 500, corsHeaders, req);\n\t}\n}\n"]}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/server/handlers/context.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IncomingMessage, ServerResponse } from \"node:http\";\nimport { getAuthSubject, requireApiAuth } from \"../authz.js\";\nimport { respondWithApiError, sendJson } from \"../server-utils.js\";\nimport { createWebSessionManagerForRequest } from \"../session-scope.js\";\nimport { redactPii } from \"../utils/redact.js\";\nimport { checkSessionRateLimitAsync } from \"../utils/session-rate-limit.js\";\nimport {\n\tapproximateTokensFromJson,\n\tapproximateTokensFromText,\n} from \"../utils/token-estimator.js\";\n\nfunction assertSessionId(sessionId: string): void {\n\tif (!/^[A-Za-z0-9._-]+$/.test(sessionId)) {\n\t\tthrow new Error(\"Invalid sessionId format\");\n\t}\n}\n\n/**\n * Check if a user has access to a session.\n *\n * In multi-user deployments, sessions should only be accessible by their owner.\n * This function verifies ownership by checking if the session belongs to the\n * authenticated user's scope.\n *\n * Session ownership is determined by:\n * 1. If session has an explicit 'owner' field, it must match the subject\n * 2. If session has a 'subject' field (API-created sessions), it must match\n * 3. Otherwise, access is denied for API requests in strict mode (prevents IDOR)\n *\n * Note: Current sessions don't store owner info, so this defaults to denying\n * access in strict mode. Set MAESTRO_STRICT_SESSION_ACCESS=false for backwards\n * compatibility in single-user deployments.\n */\nfunction verifySessionOwnership(\n\tsession: Record<string, unknown>,\n\tsubject: string,\n): boolean {\n\t// Check explicit owner field\n\tif (typeof session.owner === \"string\" && session.owner) {\n\t\treturn session.owner === subject;\n\t}\n\n\t// Check subject field (for API-created sessions)\n\tif (typeof session.subject === \"string\" && session.subject) {\n\t\treturn session.subject === subject;\n\t}\n\n\t// For sessions without ownership info:\n\t// In strict mode (multi-user), deny access to prevent IDOR attacks.\n\t// Sessions created via CLI don't have ownership info, but API access\n\t// should be restricted in hosted environments.\n\tconst strictMode = process.env.MAESTRO_STRICT_SESSION_ACCESS !== \"false\";\n\treturn !strictMode;\n}\n\nexport async function handleContext(\n\treq: IncomingMessage,\n\tres: ServerResponse,\n\tcorsHeaders: Record<string, string>,\n) {\n\tif (req.method !== \"GET\") {\n\t\tsendJson(res, 405, { error: \"Method not allowed\" }, corsHeaders);\n\t\treturn;\n\t}\n\tif (!(await requireApiAuth(req, res, corsHeaders))) return;\n\n\tconst url = new URL(req.url || \"/api/context\", `http://${req.headers.host}`);\n\tconst sessionId = url.searchParams.get(\"sessionId\");\n\n\ttry {\n\t\tif (!sessionId) {\n\t\t\tsendJson(\n\t\t\t\tres,\n\t\t\t\t400,\n\t\t\t\t{ error: \"sessionId query parameter is required\" },\n\t\t\t\tcorsHeaders,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tassertSessionId(sessionId);\n\t\tconst subject = getAuthSubject(req);\n\t\tconst sessionKey = `${subject}:${sessionId}`;\n\t\tconst rate = await checkSessionRateLimitAsync(sessionKey);\n\t\tif (!rate.allowed) {\n\t\t\tsendJson(res, 429, { error: \"Too many context requests\" }, corsHeaders);\n\t\t\treturn;\n\t\t}\n\t\tconst sessionManager = createWebSessionManagerForRequest(req, false);\n\t\tconst session = await sessionManager.loadSession(sessionId);\n\t\tif (!session) {\n\t\t\tsendJson(\n\t\t\t\tres,\n\t\t\t\t404,\n\t\t\t\t{ error: `Session not found: ${sessionId}` },\n\t\t\t\tcorsHeaders,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\t// Verify session ownership to prevent IDOR attacks\n\t\tif (!verifySessionOwnership(session, subject)) {\n\t\t\tsendJson(\n\t\t\t\tres,\n\t\t\t\t403,\n\t\t\t\t{ error: \"Access denied: session belongs to another user\" },\n\t\t\t\tcorsHeaders,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tconst items = session.messages.map(\n\t\t\t(msg: { role: string; content?: unknown }, index: number) => ({\n\t\t\t\ttype: msg.role,\n\t\t\t\tindex,\n\t\t\t\ttokenEstimate: approximateTokensFromJson(msg),\n\t\t\t\tsnippet:\n\t\t\t\t\ttypeof msg.content === \"string\"\n\t\t\t\t\t\t? redactPii(msg.content).slice(0, 160)\n\t\t\t\t\t\t: \"\",\n\t\t\t}),\n\t\t);\n\n\t\tconst totalTokens = items.reduce(\n\t\t\t(sum: number, item: { tokenEstimate: number }) =>\n\t\t\t\tsum + item.tokenEstimate,\n\t\t\t0,\n\t\t);\n\n\t\tsendJson(\n\t\t\tres,\n\t\t\t200,\n\t\t\t{\n\t\t\t\tsessionId,\n\t\t\t\titems,\n\t\t\t\ttotalTokens,\n\t\t\t\tmessageCount: session.messages.length,\n\t\t\t},\n\t\t\tcorsHeaders,\n\t\t);\n\t} catch (error) {\n\t\trespondWithApiError(res, error, 500, corsHeaders, req);\n\t}\n}\n"]}