@evalops/maestro 0.10.22 → 0.10.24

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 (387) hide show
  1. package/README.md +4 -4
  2. package/dist/agent/agent.d.ts +2 -2
  3. package/dist/agent/agent.d.ts.map +1 -1
  4. package/dist/agent/agent.js +1 -1
  5. package/dist/agent/agent.js.map +1 -1
  6. package/dist/agent/keys.d.ts +2 -5
  7. package/dist/agent/keys.d.ts.map +1 -1
  8. package/dist/agent/keys.js +4 -5
  9. package/dist/agent/keys.js.map +1 -1
  10. package/dist/agent/modes.d.ts +2 -2
  11. package/dist/agent/modes.d.ts.map +1 -1
  12. package/dist/agent/modes.js +6 -7
  13. package/dist/agent/modes.js.map +1 -1
  14. package/dist/agent/providers/anthropic.d.ts.map +1 -1
  15. package/dist/agent/providers/anthropic.js +4 -4
  16. package/dist/agent/providers/anthropic.js.map +1 -1
  17. package/dist/agent/providers/google.js +1 -1
  18. package/dist/agent/swarm/executor.d.ts +2 -0
  19. package/dist/agent/swarm/executor.d.ts.map +1 -1
  20. package/dist/agent/swarm/executor.js +208 -35
  21. package/dist/agent/swarm/executor.js.map +1 -1
  22. package/dist/agent/swarm/types.d.ts +2 -0
  23. package/dist/agent/swarm/types.d.ts.map +1 -1
  24. package/dist/agent/swarm/types.js.map +1 -1
  25. package/dist/agent/tool-capability-types.d.ts +36 -0
  26. package/dist/agent/tool-capability-types.d.ts.map +1 -0
  27. package/dist/agent/tool-capability-types.js +2 -0
  28. package/dist/agent/tool-capability-types.js.map +1 -0
  29. package/dist/agent/transport/tool-execution-bridge.d.ts +13 -0
  30. package/dist/agent/transport/tool-execution-bridge.d.ts.map +1 -1
  31. package/dist/agent/transport/tool-execution-bridge.js +28 -15
  32. package/dist/agent/transport/tool-execution-bridge.js.map +1 -1
  33. package/dist/agent/transport/transport-utils.d.ts.map +1 -1
  34. package/dist/agent/transport/transport-utils.js +2 -3
  35. package/dist/agent/transport/transport-utils.js.map +1 -1
  36. package/dist/agent/transport.js +1 -1
  37. package/dist/agent/transport.js.map +1 -1
  38. package/dist/agent/type-guards.d.ts +1 -1
  39. package/dist/agent/type-guards.js +1 -1
  40. package/dist/agent/type-guards.js.map +1 -1
  41. package/dist/agent/types.d.ts +5 -3
  42. package/dist/agent/types.d.ts.map +1 -1
  43. package/dist/agent/types.js +2 -2
  44. package/dist/agent/types.js.map +1 -1
  45. package/dist/app-server/daemon-lifecycle-api.d.ts +31 -0
  46. package/dist/app-server/daemon-lifecycle-api.d.ts.map +1 -0
  47. package/dist/app-server/daemon-lifecycle-api.js +259 -0
  48. package/dist/app-server/daemon-lifecycle-api.js.map +1 -0
  49. package/dist/app-server/external-agent-import-api.d.ts +30 -0
  50. package/dist/app-server/external-agent-import-api.d.ts.map +1 -0
  51. package/dist/app-server/external-agent-import-api.js +553 -0
  52. package/dist/app-server/external-agent-import-api.js.map +1 -0
  53. package/dist/app-server/host-control-api.d.ts +30 -0
  54. package/dist/app-server/host-control-api.d.ts.map +1 -0
  55. package/dist/app-server/host-control-api.js +343 -0
  56. package/dist/app-server/host-control-api.js.map +1 -0
  57. package/dist/app-server/in-process-client.d.ts +2 -2
  58. package/dist/app-server/in-process-client.d.ts.map +1 -1
  59. package/dist/app-server/in-process-client.js.map +1 -1
  60. package/dist/app-server/network-governance-api.d.ts +26 -0
  61. package/dist/app-server/network-governance-api.d.ts.map +1 -0
  62. package/dist/app-server/network-governance-api.js +476 -0
  63. package/dist/app-server/network-governance-api.js.map +1 -0
  64. package/dist/app-server/plugin-bundle-api.d.ts +17 -0
  65. package/dist/app-server/plugin-bundle-api.d.ts.map +1 -0
  66. package/dist/app-server/plugin-bundle-api.js +219 -0
  67. package/dist/app-server/plugin-bundle-api.js.map +1 -0
  68. package/dist/app-server/policy-control-api.d.ts +14 -0
  69. package/dist/app-server/policy-control-api.d.ts.map +1 -0
  70. package/dist/app-server/policy-control-api.js +200 -0
  71. package/dist/app-server/policy-control-api.js.map +1 -0
  72. package/dist/app-server/protocol-modes-api.d.ts +22 -0
  73. package/dist/app-server/protocol-modes-api.d.ts.map +1 -0
  74. package/dist/app-server/protocol-modes-api.js +124 -0
  75. package/dist/app-server/protocol-modes-api.js.map +1 -0
  76. package/dist/app-server/sandbox-proof-api.d.ts +21 -0
  77. package/dist/app-server/sandbox-proof-api.d.ts.map +1 -0
  78. package/dist/app-server/sandbox-proof-api.js +127 -0
  79. package/dist/app-server/sandbox-proof-api.js.map +1 -0
  80. package/dist/app-server/session-api.d.ts +93 -3
  81. package/dist/app-server/session-api.d.ts.map +1 -1
  82. package/dist/app-server/session-api.js +706 -18
  83. package/dist/app-server/session-api.js.map +1 -1
  84. package/dist/audit/logger.d.ts +1 -1
  85. package/dist/bootstrap/auth-setup.d.ts.map +1 -1
  86. package/dist/bootstrap/auth-setup.js +17 -2
  87. package/dist/bootstrap/auth-setup.js.map +1 -1
  88. package/dist/bootstrap/model-resolution-setup.d.ts.map +1 -1
  89. package/dist/bootstrap/model-resolution-setup.js +19 -4
  90. package/dist/bootstrap/model-resolution-setup.js.map +1 -1
  91. package/dist/cli/args.d.ts +2 -2
  92. package/dist/cli/args.d.ts.map +1 -1
  93. package/dist/cli/args.js +2 -2
  94. package/dist/cli/args.js.map +1 -1
  95. package/dist/cli/commands/a2a.d.ts.map +1 -1
  96. package/dist/cli/commands/a2a.js +226 -14
  97. package/dist/cli/commands/a2a.js.map +1 -1
  98. package/dist/cli/commands/anthropic.d.ts +1 -1
  99. package/dist/cli/commands/anthropic.d.ts.map +1 -1
  100. package/dist/cli/commands/anthropic.js +3 -68
  101. package/dist/cli/commands/anthropic.js.map +1 -1
  102. package/dist/cli/commands/modes.js +1 -1
  103. package/dist/cli/commands/modes.js.map +1 -1
  104. package/dist/cli/help.d.ts.map +1 -1
  105. package/dist/cli/help.js +5 -7
  106. package/dist/cli/help.js.map +1 -1
  107. package/dist/cli/rpc-mode.d.ts +1 -1
  108. package/dist/cli/rpc-mode.js +1 -1
  109. package/dist/cli/rpc-mode.js.map +1 -1
  110. package/dist/cli/session.js +1 -1
  111. package/dist/cli/session.js.map +1 -1
  112. package/dist/cli-tui/commands/command-catalog.d.ts.map +1 -1
  113. package/dist/cli-tui/commands/command-catalog.js +7 -12
  114. package/dist/cli-tui/commands/command-catalog.js.map +1 -1
  115. package/dist/cli-tui/commands/subcommands/auth-commands.d.ts +1 -1
  116. package/dist/cli-tui/commands/subcommands/auth-commands.d.ts.map +1 -1
  117. package/dist/cli-tui/commands/subcommands/auth-commands.js +4 -12
  118. package/dist/cli-tui/commands/subcommands/auth-commands.js.map +1 -1
  119. package/dist/cli-tui/custom-editor.d.ts +1 -1
  120. package/dist/cli-tui/custom-editor.js +2 -2
  121. package/dist/cli-tui/custom-editor.js.map +1 -1
  122. package/dist/cli-tui/oauth/oauth-flow-controller.d.ts.map +1 -1
  123. package/dist/cli-tui/oauth/oauth-flow-controller.js +19 -23
  124. package/dist/cli-tui/oauth/oauth-flow-controller.js.map +1 -1
  125. package/dist/cli-tui/selectors/model-selector.d.ts.map +1 -1
  126. package/dist/cli-tui/selectors/model-selector.js +0 -1
  127. package/dist/cli-tui/selectors/model-selector.js.map +1 -1
  128. package/dist/cli-tui/selectors/oauth-selector-view.d.ts +2 -2
  129. package/dist/cli-tui/selectors/oauth-selector-view.d.ts.map +1 -1
  130. package/dist/cli-tui/selectors/oauth-selector-view.js.map +1 -1
  131. package/dist/cli-tui/selectors/oauth-selector.d.ts +2 -2
  132. package/dist/cli-tui/selectors/oauth-selector.d.ts.map +1 -1
  133. package/dist/cli-tui/selectors/oauth-selector.js +3 -4
  134. package/dist/cli-tui/selectors/oauth-selector.js.map +1 -1
  135. package/dist/cli-tui/tui-renderer/mcp-events-setup.js +1 -1
  136. package/dist/cli-tui/tui-renderer/mcp-events-setup.js.map +1 -1
  137. package/dist/cli-tui/tui-renderer.js +2 -2
  138. package/dist/cli-tui/tui-renderer.js.map +1 -1
  139. package/dist/cli-tui/utils/footer-utils.d.ts +1 -1
  140. package/dist/cli-tui/utils/footer-utils.js +1 -1
  141. package/dist/cli-tui/utils/footer-utils.js.map +1 -1
  142. package/dist/cli.js +15171 -14298
  143. package/dist/commands/prompts.d.ts +1 -1
  144. package/dist/commands/prompts.js +1 -1
  145. package/dist/commands/prompts.js.map +1 -1
  146. package/dist/config/constants.d.ts +2 -2
  147. package/dist/config/constants.d.ts.map +1 -1
  148. package/dist/config/constants.js +2 -2
  149. package/dist/config/constants.js.map +1 -1
  150. package/dist/config/index.d.ts +1 -1
  151. package/dist/config/index.js +1 -1
  152. package/dist/config/index.js.map +1 -1
  153. package/dist/config/toml-config.js +3 -3
  154. package/dist/config/toml-config.js.map +1 -1
  155. package/dist/db/client.d.ts +2 -2
  156. package/dist/db/client.js +2 -2
  157. package/dist/db/client.js.map +1 -1
  158. package/dist/db/migrate.d.ts +1 -1
  159. package/dist/db/migrate.js +1 -1
  160. package/dist/db/migrate.js.map +1 -1
  161. package/dist/db/schema.d.ts +2 -2
  162. package/dist/db/schema.js +1 -1
  163. package/dist/db/schema.js.map +1 -1
  164. package/dist/errors/index.d.ts +2 -2
  165. package/dist/errors/index.js +2 -2
  166. package/dist/errors/index.js.map +1 -1
  167. package/dist/main.d.ts +4 -5
  168. package/dist/main.d.ts.map +1 -1
  169. package/dist/main.js +17 -14
  170. package/dist/main.js.map +1 -1
  171. package/dist/mcp/config.d.ts +15 -2
  172. package/dist/mcp/config.d.ts.map +1 -1
  173. package/dist/mcp/config.js +50 -26
  174. package/dist/mcp/config.js.map +1 -1
  175. package/dist/mcp/fathom-cua.d.ts.map +1 -1
  176. package/dist/mcp/fathom-cua.js +10 -0
  177. package/dist/mcp/fathom-cua.js.map +1 -1
  178. package/dist/mcp/manager.d.ts.map +1 -1
  179. package/dist/mcp/manager.js +32 -1
  180. package/dist/mcp/manager.js.map +1 -1
  181. package/dist/mcp/tool-bridge.d.ts.map +1 -1
  182. package/dist/mcp/tool-bridge.js +12 -3
  183. package/dist/mcp/tool-bridge.js.map +1 -1
  184. package/dist/mcp/tool-capabilities.d.ts +5 -0
  185. package/dist/mcp/tool-capabilities.d.ts.map +1 -0
  186. package/dist/mcp/tool-capabilities.js +271 -0
  187. package/dist/mcp/tool-capabilities.js.map +1 -0
  188. package/dist/mcp/types.d.ts +6 -1
  189. package/dist/mcp/types.d.ts.map +1 -1
  190. package/dist/mcp/types.js.map +1 -1
  191. package/dist/models/config-loader.d.ts +1 -1
  192. package/dist/models/factory-integration.d.ts +1 -1
  193. package/dist/models/factory-integration.js +1 -1
  194. package/dist/models/factory-integration.js.map +1 -1
  195. package/dist/node_modules/@evalops/contracts/dist/artifacts.d.ts +58 -0
  196. package/dist/node_modules/@evalops/contracts/dist/artifacts.d.ts.map +1 -0
  197. package/dist/node_modules/@evalops/contracts/dist/artifacts.js +191 -0
  198. package/dist/node_modules/@evalops/contracts/dist/artifacts.js.map +1 -0
  199. package/dist/node_modules/@evalops/contracts/dist/headless-protocol-schemas.generated.d.ts +10 -10
  200. package/dist/node_modules/@evalops/contracts/dist/index.d.ts +4 -3
  201. package/dist/node_modules/@evalops/contracts/dist/index.d.ts.map +1 -1
  202. package/dist/node_modules/@evalops/contracts/dist/index.js +3 -2
  203. package/dist/node_modules/@evalops/contracts/dist/index.js.map +1 -1
  204. package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.d.ts +1182 -14
  205. package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.d.ts.map +1 -1
  206. package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.js +450 -1
  207. package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.js.map +1 -1
  208. package/dist/node_modules/@evalops/contracts/dist/runtime-app-server.d.ts +1 -1
  209. package/dist/node_modules/@evalops/contracts/dist/runtime-server-request.d.ts +3 -3
  210. package/dist/node_modules/@evalops/contracts/package.json +1 -1
  211. package/dist/node_modules/@evalops/tui/package.json +1 -1
  212. package/dist/oauth/connectors.d.ts +2 -2
  213. package/dist/oauth/connectors.d.ts.map +1 -1
  214. package/dist/oauth/connectors.js +3 -5
  215. package/dist/oauth/connectors.js.map +1 -1
  216. package/dist/oauth/github-copilot.d.ts +1 -1
  217. package/dist/oauth/github-copilot.js +1 -1
  218. package/dist/oauth/github-copilot.js.map +1 -1
  219. package/dist/oauth/index.d.ts +10 -8
  220. package/dist/oauth/index.d.ts.map +1 -1
  221. package/dist/oauth/index.js +54 -31
  222. package/dist/oauth/index.js.map +1 -1
  223. package/dist/oauth/openai.d.ts +1 -1
  224. package/dist/oauth/openai.js +2 -2
  225. package/dist/oauth/openai.js.map +1 -1
  226. package/dist/platform/a2a-completion-audit.d.ts +41 -0
  227. package/dist/platform/a2a-completion-audit.d.ts.map +1 -0
  228. package/dist/platform/a2a-completion-audit.js +177 -0
  229. package/dist/platform/a2a-completion-audit.js.map +1 -0
  230. package/dist/platform/a2a-task-ledger.d.ts.map +1 -1
  231. package/dist/platform/a2a-task-ledger.js +17 -0
  232. package/dist/platform/a2a-task-ledger.js.map +1 -1
  233. package/dist/platform/a2a-telemetry-inspect.d.ts +58 -0
  234. package/dist/platform/a2a-telemetry-inspect.d.ts.map +1 -0
  235. package/dist/platform/a2a-telemetry-inspect.js +224 -0
  236. package/dist/platform/a2a-telemetry-inspect.js.map +1 -0
  237. package/dist/platform/agent-registry-client.d.ts +8 -0
  238. package/dist/platform/agent-registry-client.d.ts.map +1 -1
  239. package/dist/platform/agent-registry-client.js +9 -1
  240. package/dist/platform/agent-registry-client.js.map +1 -1
  241. package/dist/providers/api-keys.d.ts +2 -2
  242. package/dist/providers/api-keys.js +2 -2
  243. package/dist/providers/api-keys.js.map +1 -1
  244. package/dist/providers/auth.d.ts +3 -6
  245. package/dist/providers/auth.d.ts.map +1 -1
  246. package/dist/providers/auth.js +1 -40
  247. package/dist/providers/auth.js.map +1 -1
  248. package/dist/rpc/index.d.ts +2 -2
  249. package/dist/rpc/index.js +2 -2
  250. package/dist/rpc/index.js.map +1 -1
  251. package/dist/rpc/rpc-types.d.ts +1 -1
  252. package/dist/rpc/rpc-types.js +1 -1
  253. package/dist/rpc/rpc-types.js.map +1 -1
  254. package/dist/safety/nested-agent-guard.js +1 -1
  255. package/dist/safety/nested-agent-guard.js.map +1 -1
  256. package/dist/safety/policy.d.ts +2 -2
  257. package/dist/safety/policy.js +2 -2
  258. package/dist/safety/policy.js.map +1 -1
  259. package/dist/safety/validators/network-policy-validator.d.ts +8 -0
  260. package/dist/safety/validators/network-policy-validator.d.ts.map +1 -1
  261. package/dist/safety/validators/network-policy-validator.js +29 -4
  262. package/dist/safety/validators/network-policy-validator.js.map +1 -1
  263. package/dist/sandbox/local-sandbox.d.ts +1 -1
  264. package/dist/sandbox/local-sandbox.js +1 -1
  265. package/dist/sandbox/local-sandbox.js.map +1 -1
  266. package/dist/server/app-context.d.ts +2 -0
  267. package/dist/server/app-context.d.ts.map +1 -1
  268. package/dist/server/app-context.js.map +1 -1
  269. package/dist/server/handlers/attachments.d.ts.map +1 -1
  270. package/dist/server/handlers/attachments.js +1 -0
  271. package/dist/server/handlers/attachments.js.map +1 -1
  272. package/dist/server/handlers/models.d.ts.map +1 -1
  273. package/dist/server/handlers/models.js +3 -1
  274. package/dist/server/handlers/models.js.map +1 -1
  275. package/dist/server/handlers/session-artifacts.d.ts.map +1 -1
  276. package/dist/server/handlers/session-artifacts.js +13 -74
  277. package/dist/server/handlers/session-artifacts.js.map +1 -1
  278. package/dist/server/handlers/session-attachments.d.ts.map +1 -1
  279. package/dist/server/handlers/session-attachments.js +2 -0
  280. package/dist/server/handlers/session-attachments.js.map +1 -1
  281. package/dist/server/handlers/sessions.js +1 -1
  282. package/dist/server/handlers/sessions.js.map +1 -1
  283. package/dist/server/handlers/status.d.ts +2 -0
  284. package/dist/server/handlers/status.d.ts.map +1 -1
  285. package/dist/server/handlers/status.js +3 -2
  286. package/dist/server/handlers/status.js.map +1 -1
  287. package/dist/server/headless-runtime-service.d.ts.map +1 -1
  288. package/dist/server/headless-runtime-service.js +32 -3
  289. package/dist/server/headless-runtime-service.js.map +1 -1
  290. package/dist/server/hosted-session-manager.d.ts +2 -0
  291. package/dist/server/hosted-session-manager.d.ts.map +1 -1
  292. package/dist/server/hosted-session-manager.js +9 -0
  293. package/dist/server/hosted-session-manager.js.map +1 -1
  294. package/dist/server/model-selection.d.ts.map +1 -1
  295. package/dist/server/model-selection.js +9 -1
  296. package/dist/server/model-selection.js.map +1 -1
  297. package/dist/server/rate-limiter.d.ts +1 -1
  298. package/dist/server/rate-limiter.js +1 -1
  299. package/dist/server/rate-limiter.js.map +1 -1
  300. package/dist/server/router.d.ts +2 -2
  301. package/dist/server/router.js.map +1 -1
  302. package/dist/server/session-serialization.d.ts +9 -9
  303. package/dist/server/session-serialization.js +15 -15
  304. package/dist/server/session-serialization.js.map +1 -1
  305. package/dist/session/manager.d.ts +5 -0
  306. package/dist/session/manager.d.ts.map +1 -1
  307. package/dist/session/manager.js +56 -8
  308. package/dist/session/manager.js.map +1 -1
  309. package/dist/session/session-catalog.d.ts +2 -0
  310. package/dist/session/session-catalog.d.ts.map +1 -1
  311. package/dist/session/session-catalog.js +6 -0
  312. package/dist/session/session-catalog.js.map +1 -1
  313. package/dist/session/session-context.d.ts +2 -0
  314. package/dist/session/session-context.d.ts.map +1 -1
  315. package/dist/session/session-context.js +15 -0
  316. package/dist/session/session-context.js.map +1 -1
  317. package/dist/session/types.d.ts +7 -0
  318. package/dist/session/types.d.ts.map +1 -1
  319. package/dist/session/types.js.map +1 -1
  320. package/dist/session/wire-format.generated.d.ts +1 -0
  321. package/dist/session/wire-format.generated.d.ts.map +1 -1
  322. package/dist/session/wire-format.generated.js +1 -0
  323. package/dist/session/wire-format.generated.js.map +1 -1
  324. package/dist/shared-memory/contract.d.ts +4 -4
  325. package/dist/shared-memory/contract.js +2 -2
  326. package/dist/shared-memory/contract.js.map +1 -1
  327. package/dist/telemetry/index.d.ts +2 -2
  328. package/dist/telemetry/index.d.ts.map +1 -1
  329. package/dist/telemetry/index.js +2 -2
  330. package/dist/telemetry/index.js.map +1 -1
  331. package/dist/telemetry/maestro-event-bus.d.ts +57 -0
  332. package/dist/telemetry/maestro-event-bus.d.ts.map +1 -1
  333. package/dist/telemetry/maestro-event-bus.js +59 -1
  334. package/dist/telemetry/maestro-event-bus.js.map +1 -1
  335. package/dist/telemetry/maestro-event-catalog.d.ts +17 -1
  336. package/dist/telemetry/maestro-event-catalog.d.ts.map +1 -1
  337. package/dist/telemetry/maestro-event-catalog.js +24 -0
  338. package/dist/telemetry/maestro-event-catalog.js.map +1 -1
  339. package/dist/telemetry/mcp-beacon.d.ts +2 -0
  340. package/dist/telemetry/mcp-beacon.d.ts.map +1 -1
  341. package/dist/telemetry/mcp-beacon.js +15 -0
  342. package/dist/telemetry/mcp-beacon.js.map +1 -1
  343. package/dist/telemetry/metrics.d.ts +62 -0
  344. package/dist/telemetry/metrics.d.ts.map +1 -1
  345. package/dist/telemetry/metrics.js +84 -0
  346. package/dist/telemetry/metrics.js.map +1 -1
  347. package/dist/telemetry.d.ts +44 -0
  348. package/dist/telemetry.d.ts.map +1 -1
  349. package/dist/telemetry.js +84 -2
  350. package/dist/telemetry.js.map +1 -1
  351. package/dist/theme/theme-loader.js +2 -2
  352. package/dist/theme/theme-loader.js.map +1 -1
  353. package/dist/theme/theme-schema.json +2 -2
  354. package/dist/theme/theme.d.ts +1 -1
  355. package/dist/theme/theme.js.map +1 -1
  356. package/dist/tools/background/task-types.d.ts +1 -1
  357. package/dist/tools/extract-document.d.ts +1 -0
  358. package/dist/tools/extract-document.d.ts.map +1 -1
  359. package/dist/tools/extract-document.js +2 -1
  360. package/dist/tools/extract-document.js.map +1 -1
  361. package/dist/tools/index.d.ts +55 -55
  362. package/dist/tools/index.js +1 -1
  363. package/dist/tools/index.js.map +1 -1
  364. package/dist/tools/tool-dsl.d.ts +1 -1
  365. package/dist/tools/tool-dsl.js +1 -1
  366. package/dist/tools/tool-dsl.js.map +1 -1
  367. package/dist/utils/document-extractor.d.ts +1 -0
  368. package/dist/utils/document-extractor.d.ts.map +1 -1
  369. package/dist/utils/document-extractor.js +320 -40
  370. package/dist/utils/document-extractor.js.map +1 -1
  371. package/dist/utils/logger.d.ts +1 -1
  372. package/dist/utils/logger.js +1 -1
  373. package/dist/utils/logger.js.map +1 -1
  374. package/dist/version.json +2 -2
  375. package/dist/web-server.d.ts +1 -1
  376. package/dist/web-server.d.ts.map +1 -1
  377. package/dist/web-server.js +12 -8
  378. package/dist/web-server.js.map +1 -1
  379. package/package.json +4 -2
  380. package/dist/oauth/anthropic.d.ts +0 -17
  381. package/dist/oauth/anthropic.d.ts.map +0 -1
  382. package/dist/oauth/anthropic.js +0 -81
  383. package/dist/oauth/anthropic.js.map +0 -1
  384. package/dist/providers/anthropic-auth.d.ts +0 -75
  385. package/dist/providers/anthropic-auth.d.ts.map +0 -1
  386. package/dist/providers/anthropic-auth.js +0 -221
  387. package/dist/providers/anthropic-auth.js.map +0 -1
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Web server for Composer - HTTP/SSE API used by the web UI
2
+ * Web server for Maestro - HTTP/SSE API used by the web UI
3
3
  */
4
4
  import { randomBytes, randomUUID } from "node:crypto";
5
5
  import { createServer, } from "node:http";
@@ -124,9 +124,7 @@ async function validateRuntimeSessionAccess(req, sessionId) {
124
124
  }
125
125
  function normalizeAuthMode(value) {
126
126
  const normalized = value?.trim().toLowerCase();
127
- if (normalized === "auto" ||
128
- normalized === "api-key" ||
129
- normalized === "claude") {
127
+ if (normalized === "auto" || normalized === "api-key") {
130
128
  return normalized;
131
129
  }
132
130
  return "auto";
@@ -214,8 +212,8 @@ const sseLimiter = {
214
212
  const authResolver = createAuthResolver({
215
213
  mode: AUTH_MODE,
216
214
  });
217
- const DEFAULT_PROVIDER = "anthropic";
218
- const DEFAULT_MODEL_ID = "claude-sonnet-4-5";
215
+ const DEFAULT_PROVIDER = "openai-codex";
216
+ const DEFAULT_MODEL_ID = "gpt-5.5";
219
217
  /**
220
218
  * Process-local selection store (keeps last chosen model for convenience only).
221
219
  * This avoids cross-request mutations elsewhere and can be replaced with
@@ -250,11 +248,14 @@ function logMissingCredentialHints(provider) {
250
248
  hints.push(`Populate ${envVars.join(" or ")} or configure a custom provider secret before retrying.`);
251
249
  }
252
250
  if (provider === "anthropic") {
253
- hints.push("Run `maestro anthropic login` to provision OAuth credentials.");
251
+ hints.push("Set ANTHROPIC_API_KEY to use Anthropic models.");
254
252
  }
255
253
  else if (provider === "openai") {
256
254
  hints.push("Set OPENAI_API_KEY or run `maestro openai login`.");
257
255
  }
256
+ else if (provider === "openai-codex") {
257
+ hints.push("Run `maestro codex login` to sign in with ChatGPT.");
258
+ }
258
259
  logger.warn(hints.join(" "), { provider });
259
260
  }
260
261
  function buildMissingCredentialMessage(provider) {
@@ -271,7 +272,9 @@ async function ensureCredential(provider) {
271
272
  async function getRegisteredModel(input) {
272
273
  const selection = determineModelSelection(input, DEFAULT_PROVIDER, DEFAULT_MODEL_ID);
273
274
  const registeredModel = getRegisteredModelOrThrow(selection);
274
- await ensureCredential(registeredModel.provider);
275
+ if (registeredModel.api !== "openai-codex-app-server") {
276
+ await ensureCredential(registeredModel.provider);
277
+ }
275
278
  modelSelectionStore.set(registeredModel);
276
279
  return registeredModel;
277
280
  }
@@ -322,6 +325,7 @@ async function createAgent(registeredModel, thinkingLevel = "off", approvalMode
322
325
  (options?.enableClientTools || options?.useClientAskUser
323
326
  ? clientToolService
324
327
  : undefined),
328
+ platformToolExecutionBridge: options?.platformToolExecutionBridge,
325
329
  sessionTokenCounter,
326
330
  auditLogger,
327
331
  });
@@ -1 +1 @@
1
- {"version":3,"file":"web-server.js","sourceRoot":"","sources":["../src/web-server.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Web server for Composer - HTTP/SSE API used by the web UI\n */\n\nimport { randomBytes, randomUUID } from \"node:crypto\";\nimport {\n\ttype IncomingMessage,\n\ttype ServerResponse,\n\tcreateServer,\n} from \"node:http\";\nimport type { Socket } from \"node:net\";\nimport { dirname, resolve } from \"node:path\";\nimport { fileURLToPath, parse } from \"node:url\";\nimport { WebSocketServer } from \"ws\";\nimport type {\n\tActionApprovalService,\n\tApprovalMode,\n} from \"./agent/action-approval.js\";\nimport { createBackgroundTextAgent } from \"./agent/background-agent.js\";\nimport {\n\tBackgroundTaskContextSource,\n\tCurrentDateContextSource,\n\tFrameworkPreferenceContextSource,\n\tGitSnapshotContextSource,\n\tIDEContextSource,\n\tLspContextSource,\n\tTeamMemoryContextSource,\n\tTodoContextSource,\n} from \"./agent/context-providers.js\";\nimport { Agent, ProviderTransport } from \"./agent/index.js\";\nimport type { ToolRetryService } from \"./agent/tool-retry.js\";\nimport type { ClientToolExecutionService } from \"./agent/transport.js\";\nimport type { AgentTool, ThinkingLevel } from \"./agent/types.js\";\nimport {\n\tdisposeCheckpointService,\n\tinitCheckpointService,\n} from \"./checkpoints/index.js\";\nimport { detectRuntimeConstraintContext } from \"./cli/system-prompt.js\";\nimport { composerManager } from \"./composers/index.js\";\nimport { resolveDefaultApprovalMode } from \"./config/default-approval-mode.js\";\nimport { loadUnifiedContextManifest } from \"./context/manifest.js\";\nimport { initLifecycle, shutdownLifecycle } from \"./lifecycle.js\";\nimport { loadEnv } from \"./load-env.js\";\nimport { bootstrapLsp } from \"./lsp/bootstrap.js\";\nimport { loadMcpConfig, mcpManager } from \"./mcp/index.js\";\nimport { prefetchOfficialMcpRegistry } from \"./mcp/official-registry.js\";\nimport { getAllMcpTools } from \"./mcp/tool-bridge.js\";\nimport { getMemoryExtractionSystemPrompt } from \"./memory/auto-extraction.js\";\nimport type { RegisteredModel } from \"./models/registry.js\";\nimport {\n\tgetFactoryDefaultModelSelection,\n\treloadModelConfig,\n} from \"./models/registry.js\";\nimport { initOpenTelemetry } from \"./opentelemetry.js\";\nimport { resolveMaestroSystemPrompt } from \"./prompts/system-prompt.js\";\nimport { getEnvVarsForProvider } from \"./providers/api-keys.js\";\nimport {\n\ttype AuthCredential,\n\ttype AuthMode,\n\tcreateAuthResolver,\n} from \"./providers/auth.js\";\nimport { registerBackgroundTaskShutdownHooks } from \"./runtime/background-task-hooks.js\";\nimport { configureSafeMode } from \"./safety/safe-mode.js\";\nimport type {\n\tHostedRunnerContext,\n\tWebServerContext,\n} from \"./server/app-context.js\";\nimport {\n\tHostedRunnerDrainReasonValue,\n\tHostedRunnerDrainStatusValue,\n\tdrainHostedRunnerForShutdown,\n} from \"./server/handlers/hosted-runner-drain.js\";\nimport { createWorkspaceConfigMiddleware } from \"./services/workspace-config/middleware.js\";\nimport { recordApiRequest } from \"./telemetry.js\";\nimport { artifactsClientTool } from \"./tools/artifacts-client.js\";\nimport { askUserClientTool } from \"./tools/ask-user-client.js\";\nimport {\n\tcodingTools,\n\tconductorClientTools,\n\tjetbrainsTools,\n\tvscodeTools,\n} from \"./tools/index.js\";\nimport { javascriptReplClientTool } from \"./tools/javascript-repl-client.js\";\nimport { createLogger } from \"./utils/logger.js\";\n\nconst logger = createLogger(\"web-server\");\n\ninterface StartWebServerOptions {\n\thost?: string;\n\thostedRunner?: HostedRunnerContext;\n\tskipStartupMigration?: boolean;\n}\n\nconst getAuditModule = (() => {\n\tlet promise: Promise<\n\t\ttypeof import(\"./enterprise/audit-integration.js\")\n\t> | null = null;\n\treturn () => {\n\t\tif (!promise) {\n\t\t\tpromise = import(\"./enterprise/audit-integration.js\");\n\t\t}\n\t\treturn promise;\n\t};\n})();\n\nconst getBillingModule = (() => {\n\tlet promise: Promise<typeof import(\"./billing/token-tracker.js\")> | null =\n\t\tnull;\n\treturn () => {\n\t\tif (!promise) {\n\t\t\tpromise = import(\"./billing/token-tracker.js\");\n\t\t}\n\t\treturn promise;\n\t};\n})();\n\nconst getDbModule = (() => {\n\tlet promise: Promise<typeof import(\"./db/client.js\")> | null = null;\n\treturn () => {\n\t\tif (!promise) {\n\t\t\tpromise = import(\"./db/client.js\");\n\t\t}\n\t\treturn promise;\n\t};\n})();\nimport { captureSentryException, flushSentry, initSentry } from \"./sentry.js\";\nimport { WebActionApprovalService } from \"./server/approval-service.js\";\nimport { checkApiAuth, getAuthSubject } from \"./server/authz.js\";\nimport { startAutomationScheduler } from \"./server/automations/scheduler.js\";\nimport { clientToolService } from \"./server/client-tools-service.js\";\nimport { handleChatWebSocket } from \"./server/handlers/chat-ws.js\";\nimport { platformA2APushAuthBoundaryExemptPaths } from \"./server/handlers/platform-a2a-push.js\";\nimport { handleRuntimeAppServerWebSocket } from \"./server/handlers/runtime-app-server-ws.js\";\nimport {\n\tsessionIdPattern,\n\tverifySessionOwnership,\n} from \"./server/handlers/sessions.js\";\nimport { HeadlessRuntimeService } from \"./server/headless-runtime-service.js\";\nimport {\n\tisOverloaded,\n\tlogError,\n\tlogRequest,\n\tlogStartup,\n\tstartStatsCollection,\n\tstopStatsCollection,\n} from \"./server/logger.js\";\nimport { compose } from \"./server/middleware.js\";\nimport {\n\tdetermineModelSelection,\n\tgetRegisteredModelOrThrow,\n} from \"./server/model-selection.js\";\nimport { TieredRateLimiter } from \"./server/rate-limiter.js\";\nimport {\n\ttype RequestContext,\n\tparseTraceParent,\n\trequestContextStorage,\n} from \"./server/request-context.js\";\nimport { requestTracker } from \"./server/request-tracker.js\";\nimport { createRequestHandler } from \"./server/router.js\";\nimport { createRoutes } from \"./server/routes.js\";\nimport { authorizeRuntimeWebSocketSession } from \"./server/runtime-ws-access.js\";\nimport {\n\tcreateAuthMiddleware,\n\tcreateCorsMiddleware,\n\tcreateCsrfMiddleware,\n\tcreateLoadSheddingMiddleware,\n\tcreateRouterMiddleware,\n\tcreateTieredRateLimitMiddleware,\n} from \"./server/server-middlewares.js\";\nimport {\n\tApiError,\n\tauthenticateRequest,\n\tcreateCorsHeaders,\n\tsendJson,\n} from \"./server/server-utils.js\";\nimport { createWebSessionManagerForRequest } from \"./server/session-scope.js\";\nimport { serveStatic } from \"./server/static-server.js\";\nimport { resolveWebRoot } from \"./server/web-root.js\";\n\n// Re-export for existing test imports\nexport { SseSession } from \"./server/sse-session.js\";\n\nloadEnv();\nvoid initOpenTelemetry(\"composer-web-server\");\ninitSentry(\"maestro-web-server\");\n\n// Global crash handlers\nfunction registerCrashHandlers() {\n\tprocess.on(\"uncaughtException\", (error) => {\n\t\tlogError(error);\n\t\tcaptureSentryException(error);\n\t\tlogger.error(\"FATAL: Uncaught Exception. Exiting...\");\n\t\tvoid flushSentry().finally(() => process.exit(1));\n\t});\n\n\tprocess.on(\"unhandledRejection\", (reason) => {\n\t\tconst error =\n\t\t\treason instanceof Error\n\t\t\t\t? reason\n\t\t\t\t: new Error(`Unhandled Rejection: ${String(reason)}`);\n\t\tlogError(error);\n\t\tcaptureSentryException(error);\n\t\tlogger.error(\"FATAL: Unhandled Rejection. Exiting...\");\n\t\tvoid flushSentry().finally(() => process.exit(1));\n\t});\n}\n\nasync function validateRuntimeSessionAccess(\n\treq: IncomingMessage,\n\tsessionId: string,\n): Promise<boolean> {\n\tif (!sessionIdPattern.test(sessionId)) {\n\t\treturn false;\n\t}\n\tconst sessionManager = createWebSessionManagerForRequest(req, false);\n\tconst session = await sessionManager.loadSession(sessionId);\n\tif (!session) {\n\t\treturn false;\n\t}\n\treturn verifySessionOwnership(session, getAuthSubject(req));\n}\n\nfunction normalizeAuthMode(value?: string | null): AuthMode {\n\tconst normalized = value?.trim().toLowerCase();\n\tif (\n\t\tnormalized === \"auto\" ||\n\t\tnormalized === \"api-key\" ||\n\t\tnormalized === \"claude\"\n\t) {\n\t\treturn normalized;\n\t}\n\treturn \"auto\";\n}\n\nconst PROFILE = (\n\tprocess.env.MAESTRO_PROFILE ||\n\tprocess.env.MAESTRO_WEB_PROFILE ||\n\t\"\"\n)\n\t.trim()\n\t.toLowerCase();\nconst PROD_PROFILE =\n\tPROFILE === \"prod\" ||\n\tPROFILE === \"production\" ||\n\tPROFILE === \"secure\" ||\n\tPROFILE === \"hardened\";\n\nconst DEFAULT_APPROVAL_MODE = resolveDefaultApprovalMode({\n\tprofile: PROFILE,\n\texplicitApprovalMode: process.env.MAESTRO_APPROVAL_MODE,\n});\nconst AUTH_MODE = normalizeAuthMode(process.env.MAESTRO_AUTH_MODE);\nconst WEB_API_KEY = process.env.MAESTRO_WEB_API_KEY?.trim() || null;\nconst requireKeyEnv = process.env.MAESTRO_WEB_REQUIRE_KEY;\nconst requireRedisEnv = process.env.MAESTRO_WEB_REQUIRE_REDIS;\nconst CSRF_TOKEN = process.env.MAESTRO_WEB_CSRF_TOKEN?.trim() || null;\nconst AUTH_BOUNDARY_EXEMPT_PATHS = platformA2APushAuthBoundaryExemptPaths();\nconst REQUIRE_CSRF =\n\t(PROD_PROFILE && process.env.MAESTRO_WEB_REQUIRE_CSRF !== \"0\") ||\n\tBoolean(process.env.MAESTRO_WEB_CSRF_TOKEN);\n// Default: require in normal runtime, but don't break tests unless explicitly opted in.\nconst REQUIRE_WEB_API_KEY =\n\t(requireKeyEnv ?? (process.env.NODE_ENV === \"test\" ? \"0\" : \"1\")) !== \"0\";\nconst REQUIRE_REDIS =\n\t(requireRedisEnv ?? (process.env.NODE_ENV === \"test\" ? \"0\" : \"1\")) !== \"0\";\nconst DEFAULT_WEB_ORIGIN =\n\tprocess.env.MAESTRO_WEB_ORIGIN?.trim() || \"http://localhost:4173\";\nconst STATIC_MAX_AGE =\n\tNumber.parseInt(\n\t\tprocess.env.MAESTRO_STATIC_MAX_AGE ||\n\t\t\t(process.env.NODE_ENV === \"production\" ? \"86400\" : \"60\"),\n\t\t10,\n\t) || 60;\nconst MAX_SSE_CONNECTIONS =\n\tNumber.parseInt(process.env.MAESTRO_MAX_SSE_CONNECTIONS || \"100\", 10) || 100;\nconst REQUEST_TIMEOUT_MS =\n\tNumber.parseInt(process.env.MAESTRO_REQUEST_TIMEOUT_MS || \"60000\", 10) ||\n\t60000;\n\n// Harden defaults for hosted deployments.\nprocess.env.MAESTRO_WEB_SERVER = \"1\";\nif (!process.env.MAESTRO_SAFE_MODE) process.env.MAESTRO_SAFE_MODE = \"1\";\nif (!process.env.MAESTRO_SAFE_REQUIRE_PLAN)\n\tprocess.env.MAESTRO_SAFE_REQUIRE_PLAN = \"1\";\nif (PROD_PROFILE && !process.env.MAESTRO_FAIL_UNTAGGED_EGRESS) {\n\tprocess.env.MAESTRO_FAIL_UNTAGGED_EGRESS = \"1\";\n}\nif (PROD_PROFILE && !process.env.MAESTRO_BACKGROUND_SHELL_DISABLE) {\n\tprocess.env.MAESTRO_BACKGROUND_SHELL_DISABLE = \"1\";\n}\nif (REQUIRE_CSRF && !CSRF_TOKEN) {\n\tthrow new Error(\n\t\t\"MAESTRO_WEB_CSRF_TOKEN is required when CSRF enforcement is enabled (MAESTRO_PROFILE=prod or MAESTRO_WEB_REQUIRE_CSRF=1).\",\n\t);\n}\n\n// Parse and validate TRUST_PROXY setting\n// WARNING: Only enable if behind a trusted reverse proxy that sets X-Forwarded-For\nconst trustProxyEnv = process.env.MAESTRO_TRUST_PROXY?.toLowerCase();\nconst TRUST_PROXY = trustProxyEnv === \"true\";\n\n// Number of trusted proxy hops (default 1). Use this to extract the correct client IP\n// when behind multiple proxies (e.g., CDN -> nginx -> app). The IP is read from the\n// right side of X-Forwarded-For, skipping this many trusted proxy IPs.\nconst rawProxyHops = Number.parseInt(\n\tprocess.env.MAESTRO_TRUST_PROXY_HOPS || \"1\",\n\t10,\n);\nconst TRUST_PROXY_HOPS =\n\tNumber.isNaN(rawProxyHops) || rawProxyHops < 1 ? 1 : rawProxyHops;\n\nif (\n\tprocess.env.MAESTRO_TRUST_PROXY_HOPS &&\n\t(Number.isNaN(rawProxyHops) || rawProxyHops < 1)\n) {\n\tlogger.warn(\n\t\t\"Invalid MAESTRO_TRUST_PROXY_HOPS value. Must be a positive integer. Defaulting to 1.\",\n\t\t{ value: process.env.MAESTRO_TRUST_PROXY_HOPS },\n\t);\n}\n\nif (trustProxyEnv && trustProxyEnv !== \"true\" && trustProxyEnv !== \"false\") {\n\tlogger.warn(\n\t\t\"Invalid MAESTRO_TRUST_PROXY value. Must be 'true' or 'false'. Defaulting to false.\",\n\t\t{ value: process.env.MAESTRO_TRUST_PROXY },\n\t);\n}\n\nif (TRUST_PROXY) {\n\tlogger.warn(\n\t\t\"MAESTRO_TRUST_PROXY is enabled. Ensure this server is behind a trusted reverse proxy.\",\n\t);\n}\n\nconst sseLimiter = {\n\tactive: 0,\n\tmax: MAX_SSE_CONNECTIONS,\n\ttryAcquire(): symbol | null {\n\t\tif (this.active >= this.max) return null;\n\t\tthis.active += 1;\n\t\treturn Symbol(\"sse-lease\");\n\t},\n\trelease(token: symbol | null) {\n\t\tif (!token) return;\n\t\tif (this.active > 0) this.active -= 1;\n\t},\n};\n\nconst authResolver = createAuthResolver({\n\tmode: AUTH_MODE,\n});\n\nconst DEFAULT_PROVIDER = \"anthropic\";\nconst DEFAULT_MODEL_ID = \"claude-sonnet-4-5\";\n\n/**\n * Process-local selection store (keeps last chosen model for convenience only).\n * This avoids cross-request mutations elsewhere and can be replaced with\n * per-session selection later without blocking concurrent requests.\n */\nconst modelSelectionStore = {\n\tcurrentKey: null as string | null,\n\tset(model: RegisteredModel) {\n\t\tthis.currentKey = `${model.provider}/${model.id}`;\n\t},\n\tget(): { provider: string; modelId: string } | null {\n\t\tif (!this.currentKey) return null;\n\t\tconst [provider, ...modelParts] = this.currentKey.split(\"/\");\n\t\tconst modelId = modelParts.join(\"/\");\n\t\treturn provider && modelId ? { provider, modelId } : null;\n\t},\n\treset() {\n\t\tthis.currentKey = null;\n\t},\n};\n\n// Exposed for testing/internal use only\nexport const __modelSelectionStore = {\n\tset: (model: RegisteredModel) => modelSelectionStore.set(model),\n\treset: () => modelSelectionStore.reset(),\n\tget: () => modelSelectionStore.get(),\n};\n\nfunction logMissingCredentialHints(provider: string): void {\n\tconst envVars = getEnvVarsForProvider(provider);\n\tconst hints: string[] = [`Missing credentials for provider \"${provider}\".`];\n\tif (envVars.length > 0) {\n\t\thints.push(\n\t\t\t`Populate ${envVars.join(\" or \")} or configure a custom provider secret before retrying.`,\n\t\t);\n\t}\n\tif (provider === \"anthropic\") {\n\t\thints.push(\"Run `maestro anthropic login` to provision OAuth credentials.\");\n\t} else if (provider === \"openai\") {\n\t\thints.push(\"Set OPENAI_API_KEY or run `maestro openai login`.\");\n\t}\n\tlogger.warn(hints.join(\" \"), { provider });\n}\n\nfunction buildMissingCredentialMessage(provider: string): string {\n\tlogMissingCredentialHints(provider);\n\treturn `Credentials are required for provider \"${provider}\".`;\n}\n\nasync function ensureCredential(provider: string): Promise<AuthCredential> {\n\tconst credential = await authResolver(provider);\n\tif (credential) {\n\t\treturn credential;\n\t}\n\tthrow new ApiError(401, buildMissingCredentialMessage(provider));\n}\n\nasync function getRegisteredModel(input: string | null | undefined) {\n\tconst selection = determineModelSelection(\n\t\tinput,\n\t\tDEFAULT_PROVIDER,\n\t\tDEFAULT_MODEL_ID,\n\t);\n\tconst registeredModel = getRegisteredModelOrThrow(selection);\n\tawait ensureCredential(registeredModel.provider);\n\tmodelSelectionStore.set(registeredModel);\n\treturn registeredModel;\n}\n\nfunction getCurrentSelection(): { provider: string; modelId: string } {\n\tconst stored = modelSelectionStore.get();\n\tif (stored) return stored;\n\tconst factoryDefault = getFactoryDefaultModelSelection();\n\tif (factoryDefault) return factoryDefault;\n\treturn { provider: DEFAULT_PROVIDER, modelId: DEFAULT_MODEL_ID };\n}\n\nasync function createAgent(\n\tregisteredModel: RegisteredModel,\n\tthinkingLevel: ThinkingLevel = \"off\",\n\tapprovalMode: ApprovalMode = DEFAULT_APPROVAL_MODE,\n\toptions?: {\n\t\tcwd?: string;\n\t\tenableClientTools?: boolean;\n\t\tuseClientAskUser?: boolean;\n\t\tincludeVscodeTools?: boolean;\n\t\tincludeJetBrainsTools?: boolean;\n\t\tincludeConductorTools?: boolean;\n\t\tapprovalService?: ActionApprovalService;\n\t\tclientToolService?: ClientToolExecutionService;\n\t\ttoolRetryService?: ToolRetryService;\n\t},\n): Promise<Agent> {\n\tconst cwd = options?.cwd ?? process.cwd();\n\tconst sessionTokenCounter = async (sessionId: string) => {\n\t\ttry {\n\t\t\tconst { isDatabaseConfigured } = await getDbModule();\n\t\t\tif (!isDatabaseConfigured()) return null;\n\t\t\tconst { getSessionTokenCount } = await getBillingModule();\n\t\t\treturn await getSessionTokenCount(sessionId);\n\t\t} catch (error) {\n\t\t\tlogger.warn(\"Failed to get session token count\", {\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t});\n\t\t\treturn null;\n\t\t}\n\t};\n\n\tconst auditLogger = async (entry: {\n\t\ttoolName: string;\n\t\targs: Record<string, unknown>;\n\t\tstatus: \"success\" | \"failure\" | \"denied\";\n\t\tdurationMs: number;\n\t\terror?: string;\n\t}) => {\n\t\ttry {\n\t\t\tconst { logSensitiveToolExecution } = await getAuditModule();\n\t\t\tawait logSensitiveToolExecution(\n\t\t\t\tentry.toolName,\n\t\t\t\tentry.args,\n\t\t\t\tentry.status,\n\t\t\t\tentry.durationMs,\n\t\t\t\tentry.error,\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tlogger.warn(\"Failed to log tool execution\", {\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\ttoolName: entry.toolName,\n\t\t\t});\n\t\t}\n\t};\n\n\tconst transport = new ProviderTransport({\n\t\tgetAuthContext: async (provider: string) => authResolver(provider),\n\t\tcwd,\n\t\tapprovalService:\n\t\t\toptions?.approvalService ?? new WebActionApprovalService(approvalMode),\n\t\ttoolRetryService: options?.toolRetryService,\n\t\tclientToolService:\n\t\t\toptions?.clientToolService ??\n\t\t\t(options?.enableClientTools || options?.useClientAskUser\n\t\t\t\t? clientToolService\n\t\t\t\t: undefined),\n\t\tsessionTokenCounter,\n\t\tauditLogger,\n\t});\n\n\tconst runtimeConstraints = detectRuntimeConstraintContext({\n\t\tcwd,\n\t\tsandboxMode: process.env.MAESTRO_SANDBOX_MODE ?? null,\n\t});\n\tconst { systemPrompt, promptMetadata, promptContextManifest } =\n\t\tawait resolveMaestroSystemPrompt({\n\t\t\tcwd,\n\t\t\truntimeConstraints,\n\t\t});\n\tconst unifiedContextManifest = loadUnifiedContextManifest(cwd, {\n\t\tprojectDocs: promptContextManifest,\n\t});\n\n\t// Only include IDE client tools when a compatible client is connected.\n\t// Without a connected client, these tools will hang waiting for responses.\n\tconst mcpTools = getAllMcpTools();\n\tconst baseTools = options?.useClientAskUser\n\t\t? codingTools.map((tool) =>\n\t\t\t\ttool.name === \"ask_user\" ? askUserClientTool : tool,\n\t\t\t)\n\t\t: codingTools;\n\tconst tools: AgentTool[] = [...baseTools, ...mcpTools];\n\tif (options?.includeVscodeTools) {\n\t\ttools.push(...vscodeTools);\n\t}\n\tif (options?.includeJetBrainsTools) {\n\t\ttools.push(...jetbrainsTools);\n\t}\n\tif (options?.enableClientTools) {\n\t\ttools.push(artifactsClientTool);\n\t\ttools.push(javascriptReplClientTool);\n\t\tif (options?.includeConductorTools) {\n\t\t\ttools.push(...conductorClientTools);\n\t\t}\n\t}\n\n\tconst agent = new Agent({\n\t\ttransport,\n\t\tinitialState: {\n\t\t\tsystemPrompt,\n\t\t\tpromptMetadata,\n\t\t\tpromptContextManifest,\n\t\t\tunifiedContextManifest,\n\t\t\tmodel: registeredModel,\n\t\t\tthinkingLevel,\n\t\t\ttools,\n\t\t\tsandboxMode: process.env.MAESTRO_SANDBOX ?? null,\n\t\t\tsandboxEnabled: Boolean(process.env.MAESTRO_SANDBOX),\n\t\t},\n\t\tcontextSources: [\n\t\t\tnew TodoContextSource(),\n\t\t\tnew BackgroundTaskContextSource(),\n\t\t\tnew CurrentDateContextSource(),\n\t\t\tnew GitSnapshotContextSource(cwd),\n\t\t\tnew LspContextSource(cwd),\n\t\t\tnew FrameworkPreferenceContextSource(),\n\t\t\tnew TeamMemoryContextSource(cwd),\n\t\t\tnew IDEContextSource(),\n\t\t],\n\t});\n\n\t// Initialize composer manager for this agent (enables sub-agents/composers)\n\tcomposerManager.initialize(agent, systemPrompt, tools, cwd);\n\n\treturn agent;\n}\n\nasync function createBackgroundAgent(\n\tregisteredModel: RegisteredModel,\n\toptions?: {\n\t\tcwd?: string;\n\t\tsystemPrompt?: string;\n\t},\n): Promise<Agent> {\n\treturn createBackgroundTextAgent({\n\t\tmodel: registeredModel,\n\t\tsystemPrompt: options?.systemPrompt ?? getMemoryExtractionSystemPrompt(),\n\t\tcwd: options?.cwd ?? process.cwd(),\n\t\tgetAuthContext: async (provider: string) => authResolver(provider),\n\t});\n}\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst WEB_ROOT = resolveWebRoot({ baseDir: __dirname });\nconst ALLOWED_ORIGIN = DEFAULT_WEB_ORIGIN;\nconst CORS_HEADERS = createCorsHeaders(ALLOWED_ORIGIN);\nconst SECURITY_HEADERS: Record<string, string> =\n\tPROD_PROFILE || process.env.MAESTRO_WEB_CSP?.trim()\n\t\t? {\n\t\t\t\t\"Content-Security-Policy\":\n\t\t\t\t\tprocess.env.MAESTRO_WEB_CSP ||\n\t\t\t\t\t[\n\t\t\t\t\t\t\"default-src 'none'\",\n\t\t\t\t\t\t`connect-src 'self' ${ALLOWED_ORIGIN}`,\n\t\t\t\t\t\t\"img-src 'self' data:\",\n\t\t\t\t\t\t\"style-src 'self' 'unsafe-inline'\",\n\t\t\t\t\t\t\"script-src 'self'\",\n\t\t\t\t\t\t\"font-src 'self' data:\",\n\t\t\t\t\t\t\"frame-ancestors 'none'\",\n\t\t\t\t\t\t\"base-uri 'self'\",\n\t\t\t\t\t\t\"form-action 'self'\",\n\t\t\t\t\t].join(\"; \"),\n\t\t\t\t\"Referrer-Policy\": \"no-referrer\",\n\t\t\t\t\"X-Content-Type-Options\": \"nosniff\",\n\t\t\t\t\"Permissions-Policy\": \"geolocation=(), microphone=(self), camera=()\",\n\t\t\t}\n\t\t: {};\n\nconst headlessRuntimeService = new HeadlessRuntimeService();\n\nconst context: WebServerContext = {\n\tcorsHeaders: CORS_HEADERS,\n\tstaticMaxAge: STATIC_MAX_AGE,\n\tdefaultApprovalMode: DEFAULT_APPROVAL_MODE,\n\tdefaultProvider: DEFAULT_PROVIDER,\n\tdefaultModelId: DEFAULT_MODEL_ID,\n\tcreateAgent,\n\tcreateBackgroundAgent,\n\tgetRegisteredModel,\n\tgetCurrentSelection,\n\tensureCredential,\n\tsetModelSelection: (model) => modelSelectionStore.set(model),\n\tacquireSse: () => sseLimiter.tryAcquire(),\n\treleaseSse: (token) => sseLimiter.release(token),\n\theadlessRuntimeService,\n};\n\nconst routes = createRoutes(context);\n\nconst router = createRequestHandler(\n\troutes,\n\t(req, res, pathname) => {\n\t\tif (pathname.startsWith(\"/api\")) {\n\t\t\tsendJson(res, 404, { error: \"Not found\" }, CORS_HEADERS, req);\n\t\t\treturn;\n\t\t}\n\t\tserveStatic(pathname, req, res, {\n\t\t\twebRoot: WEB_ROOT,\n\t\t\tcorsHeaders: CORS_HEADERS,\n\t\t\tmaxAgeSeconds: STATIC_MAX_AGE,\n\t\t\tsecurityHeaders: SECURITY_HEADERS,\n\t\t\tspaFallback: true,\n\t\t});\n\t},\n\tCORS_HEADERS,\n);\n\n// Active request tracking for graceful shutdown and debugging\n// Tiered rate limiter with per-endpoint limits\n// Global: 1000/min, with stricter limits for expensive endpoints\nconst rateLimiter = new TieredRateLimiter();\n\nasync function handleRequest(req: IncomingMessage, res: ServerResponse) {\n\tconst start = performance.now();\n\tconst parsedUrl = parse(req.url || \"/\", true);\n\tconst pathname = parsedUrl.pathname || \"/\";\n\tconst requestId = randomUUID();\n\n\t// Parse W3C Trace Context\n\t// traceparent: 00-traceid-spanid-flags\n\tconst traceParent = req.headers.traceparent as string | undefined;\n\tconst { traceId, parentSpanId } = parseTraceParent(traceParent);\n\tconst spanId = randomBytes(8).toString(\"hex\"); // New span for this service\n\tconst responseTraceParent = `00-${traceId}-${spanId}-01`;\n\tres.setHeader(\"traceparent\", responseTraceParent);\n\tres.setHeader(\"server-timing\", `traceparent;desc=\"${responseTraceParent}\"`);\n\n\t// Attach request to response for easy access in helpers\n\t(res as ServerResponse & { req?: IncomingMessage }).req = req;\n\n\tconst context: RequestContext = {\n\t\trequestId,\n\t\ttraceId,\n\t\tspanId,\n\t\tstartTime: start,\n\t\tmethod: req.method || \"GET\",\n\t\turl: pathname,\n\t};\n\n\t// Set a hard timeout for processing\n\t// Skip for SSE endpoints which are meant to be long-lived\n\tif (!pathname.startsWith(\"/api/chat\")) {\n\t\tconst timeout = setTimeout(() => {\n\t\t\tif (!res.headersSent && !res.writableEnded) {\n\t\t\t\trequestContextStorage.run(context, () => {\n\t\t\t\t\tlogError(`Request timeout for ${pathname} [${requestId}]`);\n\t\t\t\t\tconst duration = performance.now() - start;\n\t\t\t\t\trecordApiRequest(req.method || \"UNKNOWN\", pathname, 504, duration, {\n\t\t\t\t\t\trequestId,\n\t\t\t\t\t\ttraceId,\n\t\t\t\t\t\tspanId,\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\tres.writeHead(504, {\n\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\t...CORS_HEADERS,\n\t\t\t\t});\n\t\t\t\tres.end(JSON.stringify({ error: \"Gateway Timeout\" }));\n\t\t\t}\n\t\t}, REQUEST_TIMEOUT_MS);\n\n\t\tconst cleanup = () => {\n\t\t\tclearTimeout(timeout);\n\t\t};\n\n\t\tres.on(\"finish\", cleanup);\n\t\tres.on(\"close\", cleanup);\n\t}\n\n\t// Track request for introspection (Channelz) and graceful shutdown\n\trequestTracker.track(req, {\n\t\tid: requestId,\n\t\tmethod: req.method || \"GET\",\n\t\turl: pathname,\n\t\tstartTime: start,\n\t\tuserAgent: req.headers[\"user-agent\"],\n\t});\n\n\tres.on(\"close\", () => {\n\t\trequestTracker.untrack(req);\n\t});\n\n\t// Await the context storage run to prevent unhandled promise rejections\n\tawait requestContextStorage.run(context, async () => {\n\t\t// Setup logging listener inside context to capture trace/span IDs in closure\n\t\tres.on(\"finish\", () => {\n\t\t\tconst duration = performance.now() - start;\n\t\t\tlogRequest(req, res.statusCode, start);\n\t\t\trecordApiRequest(\n\t\t\t\treq.method || \"UNKNOWN\",\n\t\t\t\tpathname,\n\t\t\t\tres.statusCode,\n\t\t\t\tduration,\n\t\t\t\t{ requestId, traceId, spanId },\n\t\t\t);\n\t\t});\n\n\t\tconst app = compose([\n\t\t\tcreateLoadSheddingMiddleware(CORS_HEADERS),\n\t\t\tcreateTieredRateLimitMiddleware(\n\t\t\t\trateLimiter,\n\t\t\t\tCORS_HEADERS,\n\t\t\t\tTRUST_PROXY,\n\t\t\t\tTRUST_PROXY_HOPS,\n\t\t\t),\n\t\t\tcreateCorsMiddleware(CORS_HEADERS),\n\t\t\tcreateAuthMiddleware(WEB_API_KEY, CORS_HEADERS, REQUIRE_WEB_API_KEY, {\n\t\t\t\texemptPaths: AUTH_BOUNDARY_EXEMPT_PATHS,\n\t\t\t}),\n\t\t\tcreateCsrfMiddleware(CSRF_TOKEN, CORS_HEADERS, REQUIRE_CSRF, {\n\t\t\t\texemptPaths: AUTH_BOUNDARY_EXEMPT_PATHS,\n\t\t\t}),\n\t\t\tcreateWorkspaceConfigMiddleware(CORS_HEADERS),\n\t\t\tcreateRouterMiddleware(router),\n\t\t]);\n\n\t\ttry {\n\t\t\tawait app(req, res, () => {\n\t\t\t\t// This fallback should rarely be reached as the router handles 404s\n\t\t\t\tif (!res.headersSent && !res.writableEnded) {\n\t\t\t\t\tsendJson(res, 404, { error: \"Not found\" }, CORS_HEADERS, req);\n\t\t\t\t}\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tlogError(error instanceof Error ? error : new Error(String(error)));\n\t\t\tif (!res.headersSent && !res.writableEnded) {\n\t\t\t\tres.writeHead(500, {\n\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\t...CORS_HEADERS,\n\t\t\t\t});\n\t\t\t\tres.end(JSON.stringify({ error: \"Internal server error\" }));\n\t\t\t}\n\t\t}\n\t});\n}\n\nexport async function startWebServer(\n\tport = 8080,\n\toptions: StartWebServerOptions = {},\n) {\n\tif (options.hostedRunner) {\n\t\tcontext.hostedRunner = options.hostedRunner;\n\t}\n\n\tregisterCrashHandlers();\n\tif (!options.skipStartupMigration) {\n\t\tconst { migrate } = await import(\"./db/migrate.js\");\n\t\tconst applied = await migrate();\n\t\tif (applied > 0) {\n\t\t\tlogger.info(\"Startup database migrations completed\", { count: applied });\n\t\t}\n\t}\n\tawait reloadModelConfig();\n\tawait initLifecycle();\n\tstartAutomationScheduler(context);\n\n\t// Initialize enterprise context for user/org tracking (optional, only if enterprise features enabled)\n\tconst { enterpriseContext } = await import(\"./enterprise/context.js\");\n\tawait enterpriseContext.initialize();\n\n\t// Initialize audit integration if enterprise features are available\n\tif (enterpriseContext.isEnterprise()) {\n\t\tconst { initializeAuditIntegration } = await import(\n\t\t\t\"./enterprise/audit-integration.js\"\n\t\t);\n\t\tinitializeAuditIntegration();\n\t}\n\n\t// Initialize enterprise features (RBAC, permissions, default roles) if database is configured\n\tconst { isDatabaseConfigured } = await import(\"./db/client.js\");\n\tif (isDatabaseConfigured()) {\n\t\ttry {\n\t\t\tconst { initializeEnterpriseFeatures } = await import(\n\t\t\t\t\"./api/enterprise-routes.js\"\n\t\t\t);\n\t\t\tawait initializeEnterpriseFeatures();\n\t\t\tlogger.info(\"Enterprise features initialized\");\n\t\t} catch (error) {\n\t\t\tlogger.warn(\"Failed to initialize enterprise features\", {\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t});\n\t\t}\n\t}\n\n\t// Configure safe mode settings (e.g., disabling certain tools in sandboxed environments)\n\tconfigureSafeMode(true);\n\n\t// Register shutdown hooks for background tasks to ensure clean cleanup\n\tregisterBackgroundTaskShutdownHooks();\n\n\t// Bootstrap LSP for IDE integration (enables diagnostics, hover, etc.)\n\tawait bootstrapLsp();\n\n\t// Initialize checkpoint service for undo/redo functionality\n\tinitCheckpointService(process.cwd());\n\n\t// Initialize MCP servers\n\ttry {\n\t\tconst mcpConfig = loadMcpConfig(process.cwd(), { includeEnvLimits: true });\n\t\tif (mcpConfig.servers.length > 0) {\n\t\t\tlogger.info(\"Initializing MCP servers...\");\n\t\t\tif (\n\t\t\t\tmcpConfig.servers.some(\n\t\t\t\t\t(server) => server.transport === \"http\" || server.transport === \"sse\",\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tvoid prefetchOfficialMcpRegistry();\n\t\t\t}\n\n\t\t\t// Listen for connection events\n\t\t\tmcpManager.on(\"connected\", (event) => {\n\t\t\t\tlogger.info(`MCP server connected: ${event.name}`);\n\t\t\t});\n\n\t\t\tmcpManager.on(\"disconnected\", (event) => {\n\t\t\t\tlogger.info(`MCP server disconnected: ${event.name}`);\n\t\t\t});\n\n\t\t\tawait mcpManager.configure(mcpConfig);\n\t\t}\n\t} catch (error) {\n\t\tlogger.warn(\"Failed to initialize MCP servers\", {\n\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t});\n\t}\n\n\tif (REQUIRE_WEB_API_KEY && !WEB_API_KEY) {\n\t\tthrow new Error(\n\t\t\t\"MAESTRO_WEB_API_KEY is required. Set MAESTRO_WEB_REQUIRE_KEY=0 to allow unauthenticated APIs for local-only testing.\",\n\t\t);\n\t}\n\n\tif (REQUIRE_REDIS && !process.env.MAESTRO_REDIS_URL) {\n\t\tthrow new Error(\n\t\t\t\"MAESTRO_REDIS_URL must be set for shared rate limiting. Set MAESTRO_WEB_REQUIRE_REDIS=0 to bypass in single-node dev only.\",\n\t\t);\n\t}\n\n\tconst server = createServer(handleRequest);\n\tconst wsMaxPayload =\n\t\tNumber.parseInt(process.env.MAESTRO_WS_MAX_PAYLOAD || \"1048576\", 10) ||\n\t\t1048576;\n\tconst wsServer = new WebSocketServer({\n\t\tnoServer: true,\n\t\tmaxPayload: wsMaxPayload,\n\t});\n\tconst sockets = new Set<Socket>();\n\tlet shuttingDown = false;\n\tlet drainTimeout: NodeJS.Timeout | null = null;\n\tlet drainInterval: NodeJS.Timeout | null = null;\n\n\tserver.on(\"connection\", (socket) => {\n\t\tsockets.add(socket);\n\t\tsocket.on(\"close\", () => {\n\t\t\tsockets.delete(socket);\n\t\t});\n\t});\n\n\tserver.on(\"upgrade\", async (req, socket, head) => {\n\t\tconst url = new URL(\n\t\t\treq.url || \"/\",\n\t\t\t`http://${req.headers.host || \"localhost\"}`,\n\t\t);\n\t\tif (url.pathname !== \"/api/chat/ws\" && url.pathname !== \"/api/runtime/ws\") {\n\t\t\tsocket.destroy();\n\t\t\treturn;\n\t\t}\n\n\t\tif (ALLOWED_ORIGIN !== \"*\" && req.headers.origin) {\n\t\t\tif (req.headers.origin !== ALLOWED_ORIGIN) {\n\t\t\t\tsocket.write(\"HTTP/1.1 403 Forbidden\\r\\n\\r\\n\");\n\t\t\t\tsocket.destroy();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tconst auth = await checkApiAuth(req);\n\t\tif (!auth.ok) {\n\t\t\tsocket.write(\"HTTP/1.1 401 Unauthorized\\r\\n\\r\\n\");\n\t\t\tsocket.destroy();\n\t\t\treturn;\n\t\t}\n\n\t\tlet runtimeSessionId: string | undefined;\n\t\tif (url.pathname === \"/api/runtime/ws\") {\n\t\t\tconst authorization = await authorizeRuntimeWebSocketSession({\n\t\t\t\treq,\n\t\t\t\tsocket,\n\t\t\t\trequestedSessionId: url.searchParams.get(\"sessionId\"),\n\t\t\t\tvalidateSessionAccess: validateRuntimeSessionAccess,\n\t\t\t\tlogAccessError: logError,\n\t\t\t});\n\t\t\tif (authorization === null) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\truntimeSessionId = authorization;\n\t\t}\n\n\t\twsServer.handleUpgrade(req, socket, head, (ws) => {\n\t\t\tif (url.pathname === \"/api/runtime/ws\") {\n\t\t\t\thandleRuntimeAppServerWebSocket(ws, {\n\t\t\t\t\tsessionId: runtimeSessionId,\n\t\t\t\t\tvalidateSessionAccess: (sessionId) =>\n\t\t\t\t\t\tvalidateRuntimeSessionAccess(req, sessionId),\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\thandleChatWebSocket(ws, req, context);\n\t\t});\n\t});\n\n\tconst onListening = () => {\n\t\tlogStartup(port);\n\t\tif (context.hostedRunner) {\n\t\t\tlogger.info(\"Hosted runner mode enabled\", {\n\t\t\t\trunnerSessionId: context.hostedRunner.runnerSessionId,\n\t\t\t\tworkspaceRoot: context.hostedRunner.workspaceRoot,\n\t\t\t\tsnapshotRoot: context.hostedRunner.snapshotRoot,\n\t\t\t\tworkspaceId: context.hostedRunner.workspaceId,\n\t\t\t\tagentRunId: context.hostedRunner.agentRunId,\n\t\t\t\tlistenHost: options.host,\n\t\t\t\tlistenPort: port,\n\t\t\t});\n\t\t}\n\t\tstartStatsCollection();\n\t};\n\tif (options.host) {\n\t\tserver.listen(port, options.host, onListening);\n\t} else {\n\t\tserver.listen(port, onListening);\n\t}\n\n\t// Don't register signal handlers in test mode - vitest manages process lifecycle\n\tconst isTestMode =\n\t\tprocess.env.VITEST === \"true\" || process.env.NODE_ENV === \"test\";\n\tif (!isTestMode) {\n\t\tconst beginShutdown = async (signal: NodeJS.Signals) => {\n\t\t\tif (shuttingDown) return;\n\t\t\tshuttingDown = true;\n\t\t\tif (context.hostedRunner) {\n\t\t\t\tif (context.hostedRunner.draining) {\n\t\t\t\t\tlogger.info(\"Hosted runner already draining before shutdown\", {\n\t\t\t\t\t\trunnerSessionId: context.hostedRunner.runnerSessionId,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst drainResult = await drainHostedRunnerForShutdown(context, {\n\t\t\t\t\t\t\treason: HostedRunnerDrainReasonValue.ProcessShutdown,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (drainResult) {\n\t\t\t\t\t\t\tconst log =\n\t\t\t\t\t\t\t\tdrainResult.status === HostedRunnerDrainStatusValue.Interrupted\n\t\t\t\t\t\t\t\t\t? logger.warn.bind(logger)\n\t\t\t\t\t\t\t\t\t: logger.info.bind(logger);\n\t\t\t\t\t\t\tlog(\"Hosted runner drained during graceful shutdown\", {\n\t\t\t\t\t\t\t\trunnerSessionId: drainResult.runner_session_id,\n\t\t\t\t\t\t\t\tstatus: drainResult.status,\n\t\t\t\t\t\t\t\tmanifestPath: drainResult.manifest_path,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tcontext.hostedRunner.draining = true;\n\t\t\t\t\t\tlogger.warn(\"Hosted runner shutdown drain failed\", {\n\t\t\t\t\t\t\trunnerSessionId: context.hostedRunner.runnerSessionId,\n\t\t\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tlogger.info(`${signal} received. Starting graceful shutdown...`);\n\t\t\tstopStatsCollection();\n\t\t\tdisposeCheckpointService();\n\t\t\t// End enterprise session if initialized\n\t\t\tconst { enterpriseContext } = await import(\"./enterprise/context.js\");\n\t\t\tif (enterpriseContext.isEnterprise()) {\n\t\t\t\tenterpriseContext.endSession();\n\t\t\t}\n\t\t\tawait shutdownLifecycle();\n\n\t\t\t// Stop accepting new connections\n\t\t\tserver.close();\n\n\t\t\t// Drain existing requests\n\t\t\tconst activeCount = requestTracker.getCount();\n\t\t\tif (activeCount > 0) {\n\t\t\t\tlogger.info(\"Waiting for active requests to complete...\", {\n\t\t\t\t\tactiveCount,\n\t\t\t\t});\n\t\t\t\tdrainTimeout = setTimeout(() => {\n\t\t\t\t\tlogger.warn(\"Drain timeout reached. Forcing shutdown...\");\n\t\t\t\t\tfor (const socket of sockets) {\n\t\t\t\t\t\tsocket.destroy();\n\t\t\t\t\t}\n\t\t\t\t\tprocess.exit(0);\n\t\t\t\t}, 10000); // 10s drain timeout\n\n\t\t\t\t// Poll for drain\n\t\t\t\tdrainInterval = setInterval(() => {\n\t\t\t\t\tif (requestTracker.getCount() === 0) {\n\t\t\t\t\t\tif (drainInterval) clearInterval(drainInterval);\n\t\t\t\t\t\tif (drainTimeout) clearTimeout(drainTimeout);\n\t\t\t\t\t\tlogger.info(\"All requests completed. Exiting.\");\n\t\t\t\t\t\tprocess.exit(0);\n\t\t\t\t\t}\n\t\t\t\t}, 100);\n\t\t\t} else {\n\t\t\t\tlogger.info(\"No active requests. Exiting.\");\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\t\t};\n\t\tprocess.on(\"SIGINT\", () => {\n\t\t\tvoid beginShutdown(\"SIGINT\");\n\t\t});\n\t\tprocess.on(\"SIGTERM\", () => {\n\t\t\tvoid beginShutdown(\"SIGTERM\");\n\t\t});\n\t}\n\n\treturn server;\n}\n\n// Run if called directly\nif (process.argv[1] && __filename === resolve(process.argv[1])) {\n\tconst port = Number.parseInt(process.env.PORT || \"8080\", 10);\n\tstartWebServer(port);\n}\n"]}
1
+ {"version":3,"file":"web-server.js","sourceRoot":"","sources":["../src/web-server.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Web server for Maestro - HTTP/SSE API used by the web UI\n */\n\nimport { randomBytes, randomUUID } from \"node:crypto\";\nimport {\n\ttype IncomingMessage,\n\ttype ServerResponse,\n\tcreateServer,\n} from \"node:http\";\nimport type { Socket } from \"node:net\";\nimport { dirname, resolve } from \"node:path\";\nimport { fileURLToPath, parse } from \"node:url\";\nimport { WebSocketServer } from \"ws\";\nimport type {\n\tActionApprovalService,\n\tApprovalMode,\n} from \"./agent/action-approval.js\";\nimport { createBackgroundTextAgent } from \"./agent/background-agent.js\";\nimport {\n\tBackgroundTaskContextSource,\n\tCurrentDateContextSource,\n\tFrameworkPreferenceContextSource,\n\tGitSnapshotContextSource,\n\tIDEContextSource,\n\tLspContextSource,\n\tTeamMemoryContextSource,\n\tTodoContextSource,\n} from \"./agent/context-providers.js\";\nimport { Agent, ProviderTransport } from \"./agent/index.js\";\nimport type { ToolRetryService } from \"./agent/tool-retry.js\";\nimport type { ClientToolExecutionService } from \"./agent/transport.js\";\nimport type { PlatformToolExecutionBridge } from \"./agent/transport/tool-execution-bridge.js\";\nimport type { AgentTool, ThinkingLevel } from \"./agent/types.js\";\nimport {\n\tdisposeCheckpointService,\n\tinitCheckpointService,\n} from \"./checkpoints/index.js\";\nimport { detectRuntimeConstraintContext } from \"./cli/system-prompt.js\";\nimport { composerManager } from \"./composers/index.js\";\nimport { resolveDefaultApprovalMode } from \"./config/default-approval-mode.js\";\nimport { loadUnifiedContextManifest } from \"./context/manifest.js\";\nimport { initLifecycle, shutdownLifecycle } from \"./lifecycle.js\";\nimport { loadEnv } from \"./load-env.js\";\nimport { bootstrapLsp } from \"./lsp/bootstrap.js\";\nimport { loadMcpConfig, mcpManager } from \"./mcp/index.js\";\nimport { prefetchOfficialMcpRegistry } from \"./mcp/official-registry.js\";\nimport { getAllMcpTools } from \"./mcp/tool-bridge.js\";\nimport { getMemoryExtractionSystemPrompt } from \"./memory/auto-extraction.js\";\nimport type { RegisteredModel } from \"./models/registry.js\";\nimport {\n\tgetFactoryDefaultModelSelection,\n\treloadModelConfig,\n} from \"./models/registry.js\";\nimport { initOpenTelemetry } from \"./opentelemetry.js\";\nimport { resolveMaestroSystemPrompt } from \"./prompts/system-prompt.js\";\nimport { getEnvVarsForProvider } from \"./providers/api-keys.js\";\nimport {\n\ttype AuthCredential,\n\ttype AuthMode,\n\tcreateAuthResolver,\n} from \"./providers/auth.js\";\nimport { registerBackgroundTaskShutdownHooks } from \"./runtime/background-task-hooks.js\";\nimport { configureSafeMode } from \"./safety/safe-mode.js\";\nimport type {\n\tHostedRunnerContext,\n\tWebServerContext,\n} from \"./server/app-context.js\";\nimport {\n\tHostedRunnerDrainReasonValue,\n\tHostedRunnerDrainStatusValue,\n\tdrainHostedRunnerForShutdown,\n} from \"./server/handlers/hosted-runner-drain.js\";\nimport { createWorkspaceConfigMiddleware } from \"./services/workspace-config/middleware.js\";\nimport { recordApiRequest } from \"./telemetry.js\";\nimport { artifactsClientTool } from \"./tools/artifacts-client.js\";\nimport { askUserClientTool } from \"./tools/ask-user-client.js\";\nimport {\n\tcodingTools,\n\tconductorClientTools,\n\tjetbrainsTools,\n\tvscodeTools,\n} from \"./tools/index.js\";\nimport { javascriptReplClientTool } from \"./tools/javascript-repl-client.js\";\nimport { createLogger } from \"./utils/logger.js\";\n\nconst logger = createLogger(\"web-server\");\n\ninterface StartWebServerOptions {\n\thost?: string;\n\thostedRunner?: HostedRunnerContext;\n\tskipStartupMigration?: boolean;\n}\n\nconst getAuditModule = (() => {\n\tlet promise: Promise<\n\t\ttypeof import(\"./enterprise/audit-integration.js\")\n\t> | null = null;\n\treturn () => {\n\t\tif (!promise) {\n\t\t\tpromise = import(\"./enterprise/audit-integration.js\");\n\t\t}\n\t\treturn promise;\n\t};\n})();\n\nconst getBillingModule = (() => {\n\tlet promise: Promise<typeof import(\"./billing/token-tracker.js\")> | null =\n\t\tnull;\n\treturn () => {\n\t\tif (!promise) {\n\t\t\tpromise = import(\"./billing/token-tracker.js\");\n\t\t}\n\t\treturn promise;\n\t};\n})();\n\nconst getDbModule = (() => {\n\tlet promise: Promise<typeof import(\"./db/client.js\")> | null = null;\n\treturn () => {\n\t\tif (!promise) {\n\t\t\tpromise = import(\"./db/client.js\");\n\t\t}\n\t\treturn promise;\n\t};\n})();\nimport { captureSentryException, flushSentry, initSentry } from \"./sentry.js\";\nimport { WebActionApprovalService } from \"./server/approval-service.js\";\nimport { checkApiAuth, getAuthSubject } from \"./server/authz.js\";\nimport { startAutomationScheduler } from \"./server/automations/scheduler.js\";\nimport { clientToolService } from \"./server/client-tools-service.js\";\nimport { handleChatWebSocket } from \"./server/handlers/chat-ws.js\";\nimport { platformA2APushAuthBoundaryExemptPaths } from \"./server/handlers/platform-a2a-push.js\";\nimport { handleRuntimeAppServerWebSocket } from \"./server/handlers/runtime-app-server-ws.js\";\nimport {\n\tsessionIdPattern,\n\tverifySessionOwnership,\n} from \"./server/handlers/sessions.js\";\nimport { HeadlessRuntimeService } from \"./server/headless-runtime-service.js\";\nimport {\n\tisOverloaded,\n\tlogError,\n\tlogRequest,\n\tlogStartup,\n\tstartStatsCollection,\n\tstopStatsCollection,\n} from \"./server/logger.js\";\nimport { compose } from \"./server/middleware.js\";\nimport {\n\tdetermineModelSelection,\n\tgetRegisteredModelOrThrow,\n} from \"./server/model-selection.js\";\nimport { TieredRateLimiter } from \"./server/rate-limiter.js\";\nimport {\n\ttype RequestContext,\n\tparseTraceParent,\n\trequestContextStorage,\n} from \"./server/request-context.js\";\nimport { requestTracker } from \"./server/request-tracker.js\";\nimport { createRequestHandler } from \"./server/router.js\";\nimport { createRoutes } from \"./server/routes.js\";\nimport { authorizeRuntimeWebSocketSession } from \"./server/runtime-ws-access.js\";\nimport {\n\tcreateAuthMiddleware,\n\tcreateCorsMiddleware,\n\tcreateCsrfMiddleware,\n\tcreateLoadSheddingMiddleware,\n\tcreateRouterMiddleware,\n\tcreateTieredRateLimitMiddleware,\n} from \"./server/server-middlewares.js\";\nimport {\n\tApiError,\n\tauthenticateRequest,\n\tcreateCorsHeaders,\n\tsendJson,\n} from \"./server/server-utils.js\";\nimport { createWebSessionManagerForRequest } from \"./server/session-scope.js\";\nimport { serveStatic } from \"./server/static-server.js\";\nimport { resolveWebRoot } from \"./server/web-root.js\";\n\n// Re-export for existing test imports\nexport { SseSession } from \"./server/sse-session.js\";\n\nloadEnv();\nvoid initOpenTelemetry(\"composer-web-server\");\ninitSentry(\"maestro-web-server\");\n\n// Global crash handlers\nfunction registerCrashHandlers() {\n\tprocess.on(\"uncaughtException\", (error) => {\n\t\tlogError(error);\n\t\tcaptureSentryException(error);\n\t\tlogger.error(\"FATAL: Uncaught Exception. Exiting...\");\n\t\tvoid flushSentry().finally(() => process.exit(1));\n\t});\n\n\tprocess.on(\"unhandledRejection\", (reason) => {\n\t\tconst error =\n\t\t\treason instanceof Error\n\t\t\t\t? reason\n\t\t\t\t: new Error(`Unhandled Rejection: ${String(reason)}`);\n\t\tlogError(error);\n\t\tcaptureSentryException(error);\n\t\tlogger.error(\"FATAL: Unhandled Rejection. Exiting...\");\n\t\tvoid flushSentry().finally(() => process.exit(1));\n\t});\n}\n\nasync function validateRuntimeSessionAccess(\n\treq: IncomingMessage,\n\tsessionId: string,\n): Promise<boolean> {\n\tif (!sessionIdPattern.test(sessionId)) {\n\t\treturn false;\n\t}\n\tconst sessionManager = createWebSessionManagerForRequest(req, false);\n\tconst session = await sessionManager.loadSession(sessionId);\n\tif (!session) {\n\t\treturn false;\n\t}\n\treturn verifySessionOwnership(session, getAuthSubject(req));\n}\n\nfunction normalizeAuthMode(value?: string | null): AuthMode {\n\tconst normalized = value?.trim().toLowerCase();\n\tif (normalized === \"auto\" || normalized === \"api-key\") {\n\t\treturn normalized;\n\t}\n\treturn \"auto\";\n}\n\nconst PROFILE = (\n\tprocess.env.MAESTRO_PROFILE ||\n\tprocess.env.MAESTRO_WEB_PROFILE ||\n\t\"\"\n)\n\t.trim()\n\t.toLowerCase();\nconst PROD_PROFILE =\n\tPROFILE === \"prod\" ||\n\tPROFILE === \"production\" ||\n\tPROFILE === \"secure\" ||\n\tPROFILE === \"hardened\";\n\nconst DEFAULT_APPROVAL_MODE = resolveDefaultApprovalMode({\n\tprofile: PROFILE,\n\texplicitApprovalMode: process.env.MAESTRO_APPROVAL_MODE,\n});\nconst AUTH_MODE = normalizeAuthMode(process.env.MAESTRO_AUTH_MODE);\nconst WEB_API_KEY = process.env.MAESTRO_WEB_API_KEY?.trim() || null;\nconst requireKeyEnv = process.env.MAESTRO_WEB_REQUIRE_KEY;\nconst requireRedisEnv = process.env.MAESTRO_WEB_REQUIRE_REDIS;\nconst CSRF_TOKEN = process.env.MAESTRO_WEB_CSRF_TOKEN?.trim() || null;\nconst AUTH_BOUNDARY_EXEMPT_PATHS = platformA2APushAuthBoundaryExemptPaths();\nconst REQUIRE_CSRF =\n\t(PROD_PROFILE && process.env.MAESTRO_WEB_REQUIRE_CSRF !== \"0\") ||\n\tBoolean(process.env.MAESTRO_WEB_CSRF_TOKEN);\n// Default: require in normal runtime, but don't break tests unless explicitly opted in.\nconst REQUIRE_WEB_API_KEY =\n\t(requireKeyEnv ?? (process.env.NODE_ENV === \"test\" ? \"0\" : \"1\")) !== \"0\";\nconst REQUIRE_REDIS =\n\t(requireRedisEnv ?? (process.env.NODE_ENV === \"test\" ? \"0\" : \"1\")) !== \"0\";\nconst DEFAULT_WEB_ORIGIN =\n\tprocess.env.MAESTRO_WEB_ORIGIN?.trim() || \"http://localhost:4173\";\nconst STATIC_MAX_AGE =\n\tNumber.parseInt(\n\t\tprocess.env.MAESTRO_STATIC_MAX_AGE ||\n\t\t\t(process.env.NODE_ENV === \"production\" ? \"86400\" : \"60\"),\n\t\t10,\n\t) || 60;\nconst MAX_SSE_CONNECTIONS =\n\tNumber.parseInt(process.env.MAESTRO_MAX_SSE_CONNECTIONS || \"100\", 10) || 100;\nconst REQUEST_TIMEOUT_MS =\n\tNumber.parseInt(process.env.MAESTRO_REQUEST_TIMEOUT_MS || \"60000\", 10) ||\n\t60000;\n\n// Harden defaults for hosted deployments.\nprocess.env.MAESTRO_WEB_SERVER = \"1\";\nif (!process.env.MAESTRO_SAFE_MODE) process.env.MAESTRO_SAFE_MODE = \"1\";\nif (!process.env.MAESTRO_SAFE_REQUIRE_PLAN)\n\tprocess.env.MAESTRO_SAFE_REQUIRE_PLAN = \"1\";\nif (PROD_PROFILE && !process.env.MAESTRO_FAIL_UNTAGGED_EGRESS) {\n\tprocess.env.MAESTRO_FAIL_UNTAGGED_EGRESS = \"1\";\n}\nif (PROD_PROFILE && !process.env.MAESTRO_BACKGROUND_SHELL_DISABLE) {\n\tprocess.env.MAESTRO_BACKGROUND_SHELL_DISABLE = \"1\";\n}\nif (REQUIRE_CSRF && !CSRF_TOKEN) {\n\tthrow new Error(\n\t\t\"MAESTRO_WEB_CSRF_TOKEN is required when CSRF enforcement is enabled (MAESTRO_PROFILE=prod or MAESTRO_WEB_REQUIRE_CSRF=1).\",\n\t);\n}\n\n// Parse and validate TRUST_PROXY setting\n// WARNING: Only enable if behind a trusted reverse proxy that sets X-Forwarded-For\nconst trustProxyEnv = process.env.MAESTRO_TRUST_PROXY?.toLowerCase();\nconst TRUST_PROXY = trustProxyEnv === \"true\";\n\n// Number of trusted proxy hops (default 1). Use this to extract the correct client IP\n// when behind multiple proxies (e.g., CDN -> nginx -> app). The IP is read from the\n// right side of X-Forwarded-For, skipping this many trusted proxy IPs.\nconst rawProxyHops = Number.parseInt(\n\tprocess.env.MAESTRO_TRUST_PROXY_HOPS || \"1\",\n\t10,\n);\nconst TRUST_PROXY_HOPS =\n\tNumber.isNaN(rawProxyHops) || rawProxyHops < 1 ? 1 : rawProxyHops;\n\nif (\n\tprocess.env.MAESTRO_TRUST_PROXY_HOPS &&\n\t(Number.isNaN(rawProxyHops) || rawProxyHops < 1)\n) {\n\tlogger.warn(\n\t\t\"Invalid MAESTRO_TRUST_PROXY_HOPS value. Must be a positive integer. Defaulting to 1.\",\n\t\t{ value: process.env.MAESTRO_TRUST_PROXY_HOPS },\n\t);\n}\n\nif (trustProxyEnv && trustProxyEnv !== \"true\" && trustProxyEnv !== \"false\") {\n\tlogger.warn(\n\t\t\"Invalid MAESTRO_TRUST_PROXY value. Must be 'true' or 'false'. Defaulting to false.\",\n\t\t{ value: process.env.MAESTRO_TRUST_PROXY },\n\t);\n}\n\nif (TRUST_PROXY) {\n\tlogger.warn(\n\t\t\"MAESTRO_TRUST_PROXY is enabled. Ensure this server is behind a trusted reverse proxy.\",\n\t);\n}\n\nconst sseLimiter = {\n\tactive: 0,\n\tmax: MAX_SSE_CONNECTIONS,\n\ttryAcquire(): symbol | null {\n\t\tif (this.active >= this.max) return null;\n\t\tthis.active += 1;\n\t\treturn Symbol(\"sse-lease\");\n\t},\n\trelease(token: symbol | null) {\n\t\tif (!token) return;\n\t\tif (this.active > 0) this.active -= 1;\n\t},\n};\n\nconst authResolver = createAuthResolver({\n\tmode: AUTH_MODE,\n});\n\nconst DEFAULT_PROVIDER = \"openai-codex\";\nconst DEFAULT_MODEL_ID = \"gpt-5.5\";\n\n/**\n * Process-local selection store (keeps last chosen model for convenience only).\n * This avoids cross-request mutations elsewhere and can be replaced with\n * per-session selection later without blocking concurrent requests.\n */\nconst modelSelectionStore = {\n\tcurrentKey: null as string | null,\n\tset(model: RegisteredModel) {\n\t\tthis.currentKey = `${model.provider}/${model.id}`;\n\t},\n\tget(): { provider: string; modelId: string } | null {\n\t\tif (!this.currentKey) return null;\n\t\tconst [provider, ...modelParts] = this.currentKey.split(\"/\");\n\t\tconst modelId = modelParts.join(\"/\");\n\t\treturn provider && modelId ? { provider, modelId } : null;\n\t},\n\treset() {\n\t\tthis.currentKey = null;\n\t},\n};\n\n// Exposed for testing/internal use only\nexport const __modelSelectionStore = {\n\tset: (model: RegisteredModel) => modelSelectionStore.set(model),\n\treset: () => modelSelectionStore.reset(),\n\tget: () => modelSelectionStore.get(),\n};\n\nfunction logMissingCredentialHints(provider: string): void {\n\tconst envVars = getEnvVarsForProvider(provider);\n\tconst hints: string[] = [`Missing credentials for provider \"${provider}\".`];\n\tif (envVars.length > 0) {\n\t\thints.push(\n\t\t\t`Populate ${envVars.join(\" or \")} or configure a custom provider secret before retrying.`,\n\t\t);\n\t}\n\tif (provider === \"anthropic\") {\n\t\thints.push(\"Set ANTHROPIC_API_KEY to use Anthropic models.\");\n\t} else if (provider === \"openai\") {\n\t\thints.push(\"Set OPENAI_API_KEY or run `maestro openai login`.\");\n\t} else if (provider === \"openai-codex\") {\n\t\thints.push(\"Run `maestro codex login` to sign in with ChatGPT.\");\n\t}\n\tlogger.warn(hints.join(\" \"), { provider });\n}\n\nfunction buildMissingCredentialMessage(provider: string): string {\n\tlogMissingCredentialHints(provider);\n\treturn `Credentials are required for provider \"${provider}\".`;\n}\n\nasync function ensureCredential(provider: string): Promise<AuthCredential> {\n\tconst credential = await authResolver(provider);\n\tif (credential) {\n\t\treturn credential;\n\t}\n\tthrow new ApiError(401, buildMissingCredentialMessage(provider));\n}\n\nasync function getRegisteredModel(input: string | null | undefined) {\n\tconst selection = determineModelSelection(\n\t\tinput,\n\t\tDEFAULT_PROVIDER,\n\t\tDEFAULT_MODEL_ID,\n\t);\n\tconst registeredModel = getRegisteredModelOrThrow(selection);\n\tif (registeredModel.api !== \"openai-codex-app-server\") {\n\t\tawait ensureCredential(registeredModel.provider);\n\t}\n\tmodelSelectionStore.set(registeredModel);\n\treturn registeredModel;\n}\n\nfunction getCurrentSelection(): { provider: string; modelId: string } {\n\tconst stored = modelSelectionStore.get();\n\tif (stored) return stored;\n\tconst factoryDefault = getFactoryDefaultModelSelection();\n\tif (factoryDefault) return factoryDefault;\n\treturn { provider: DEFAULT_PROVIDER, modelId: DEFAULT_MODEL_ID };\n}\n\nasync function createAgent(\n\tregisteredModel: RegisteredModel,\n\tthinkingLevel: ThinkingLevel = \"off\",\n\tapprovalMode: ApprovalMode = DEFAULT_APPROVAL_MODE,\n\toptions?: {\n\t\tcwd?: string;\n\t\tenableClientTools?: boolean;\n\t\tuseClientAskUser?: boolean;\n\t\tincludeVscodeTools?: boolean;\n\t\tincludeJetBrainsTools?: boolean;\n\t\tincludeConductorTools?: boolean;\n\t\tapprovalService?: ActionApprovalService;\n\t\tclientToolService?: ClientToolExecutionService;\n\t\ttoolRetryService?: ToolRetryService;\n\t\tplatformToolExecutionBridge?: PlatformToolExecutionBridge | false;\n\t},\n): Promise<Agent> {\n\tconst cwd = options?.cwd ?? process.cwd();\n\tconst sessionTokenCounter = async (sessionId: string) => {\n\t\ttry {\n\t\t\tconst { isDatabaseConfigured } = await getDbModule();\n\t\t\tif (!isDatabaseConfigured()) return null;\n\t\t\tconst { getSessionTokenCount } = await getBillingModule();\n\t\t\treturn await getSessionTokenCount(sessionId);\n\t\t} catch (error) {\n\t\t\tlogger.warn(\"Failed to get session token count\", {\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t});\n\t\t\treturn null;\n\t\t}\n\t};\n\n\tconst auditLogger = async (entry: {\n\t\ttoolName: string;\n\t\targs: Record<string, unknown>;\n\t\tstatus: \"success\" | \"failure\" | \"denied\";\n\t\tdurationMs: number;\n\t\terror?: string;\n\t}) => {\n\t\ttry {\n\t\t\tconst { logSensitiveToolExecution } = await getAuditModule();\n\t\t\tawait logSensitiveToolExecution(\n\t\t\t\tentry.toolName,\n\t\t\t\tentry.args,\n\t\t\t\tentry.status,\n\t\t\t\tentry.durationMs,\n\t\t\t\tentry.error,\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tlogger.warn(\"Failed to log tool execution\", {\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\ttoolName: entry.toolName,\n\t\t\t});\n\t\t}\n\t};\n\n\tconst transport = new ProviderTransport({\n\t\tgetAuthContext: async (provider: string) => authResolver(provider),\n\t\tcwd,\n\t\tapprovalService:\n\t\t\toptions?.approvalService ?? new WebActionApprovalService(approvalMode),\n\t\ttoolRetryService: options?.toolRetryService,\n\t\tclientToolService:\n\t\t\toptions?.clientToolService ??\n\t\t\t(options?.enableClientTools || options?.useClientAskUser\n\t\t\t\t? clientToolService\n\t\t\t\t: undefined),\n\t\tplatformToolExecutionBridge: options?.platformToolExecutionBridge,\n\t\tsessionTokenCounter,\n\t\tauditLogger,\n\t});\n\n\tconst runtimeConstraints = detectRuntimeConstraintContext({\n\t\tcwd,\n\t\tsandboxMode: process.env.MAESTRO_SANDBOX_MODE ?? null,\n\t});\n\tconst { systemPrompt, promptMetadata, promptContextManifest } =\n\t\tawait resolveMaestroSystemPrompt({\n\t\t\tcwd,\n\t\t\truntimeConstraints,\n\t\t});\n\tconst unifiedContextManifest = loadUnifiedContextManifest(cwd, {\n\t\tprojectDocs: promptContextManifest,\n\t});\n\n\t// Only include IDE client tools when a compatible client is connected.\n\t// Without a connected client, these tools will hang waiting for responses.\n\tconst mcpTools = getAllMcpTools();\n\tconst baseTools = options?.useClientAskUser\n\t\t? codingTools.map((tool) =>\n\t\t\t\ttool.name === \"ask_user\" ? askUserClientTool : tool,\n\t\t\t)\n\t\t: codingTools;\n\tconst tools: AgentTool[] = [...baseTools, ...mcpTools];\n\tif (options?.includeVscodeTools) {\n\t\ttools.push(...vscodeTools);\n\t}\n\tif (options?.includeJetBrainsTools) {\n\t\ttools.push(...jetbrainsTools);\n\t}\n\tif (options?.enableClientTools) {\n\t\ttools.push(artifactsClientTool);\n\t\ttools.push(javascriptReplClientTool);\n\t\tif (options?.includeConductorTools) {\n\t\t\ttools.push(...conductorClientTools);\n\t\t}\n\t}\n\n\tconst agent = new Agent({\n\t\ttransport,\n\t\tinitialState: {\n\t\t\tsystemPrompt,\n\t\t\tpromptMetadata,\n\t\t\tpromptContextManifest,\n\t\t\tunifiedContextManifest,\n\t\t\tmodel: registeredModel,\n\t\t\tthinkingLevel,\n\t\t\ttools,\n\t\t\tsandboxMode: process.env.MAESTRO_SANDBOX ?? null,\n\t\t\tsandboxEnabled: Boolean(process.env.MAESTRO_SANDBOX),\n\t\t},\n\t\tcontextSources: [\n\t\t\tnew TodoContextSource(),\n\t\t\tnew BackgroundTaskContextSource(),\n\t\t\tnew CurrentDateContextSource(),\n\t\t\tnew GitSnapshotContextSource(cwd),\n\t\t\tnew LspContextSource(cwd),\n\t\t\tnew FrameworkPreferenceContextSource(),\n\t\t\tnew TeamMemoryContextSource(cwd),\n\t\t\tnew IDEContextSource(),\n\t\t],\n\t});\n\n\t// Initialize composer manager for this agent (enables sub-agents/composers)\n\tcomposerManager.initialize(agent, systemPrompt, tools, cwd);\n\n\treturn agent;\n}\n\nasync function createBackgroundAgent(\n\tregisteredModel: RegisteredModel,\n\toptions?: {\n\t\tcwd?: string;\n\t\tsystemPrompt?: string;\n\t},\n): Promise<Agent> {\n\treturn createBackgroundTextAgent({\n\t\tmodel: registeredModel,\n\t\tsystemPrompt: options?.systemPrompt ?? getMemoryExtractionSystemPrompt(),\n\t\tcwd: options?.cwd ?? process.cwd(),\n\t\tgetAuthContext: async (provider: string) => authResolver(provider),\n\t});\n}\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst WEB_ROOT = resolveWebRoot({ baseDir: __dirname });\nconst ALLOWED_ORIGIN = DEFAULT_WEB_ORIGIN;\nconst CORS_HEADERS = createCorsHeaders(ALLOWED_ORIGIN);\nconst SECURITY_HEADERS: Record<string, string> =\n\tPROD_PROFILE || process.env.MAESTRO_WEB_CSP?.trim()\n\t\t? {\n\t\t\t\t\"Content-Security-Policy\":\n\t\t\t\t\tprocess.env.MAESTRO_WEB_CSP ||\n\t\t\t\t\t[\n\t\t\t\t\t\t\"default-src 'none'\",\n\t\t\t\t\t\t`connect-src 'self' ${ALLOWED_ORIGIN}`,\n\t\t\t\t\t\t\"img-src 'self' data:\",\n\t\t\t\t\t\t\"style-src 'self' 'unsafe-inline'\",\n\t\t\t\t\t\t\"script-src 'self'\",\n\t\t\t\t\t\t\"font-src 'self' data:\",\n\t\t\t\t\t\t\"frame-ancestors 'none'\",\n\t\t\t\t\t\t\"base-uri 'self'\",\n\t\t\t\t\t\t\"form-action 'self'\",\n\t\t\t\t\t].join(\"; \"),\n\t\t\t\t\"Referrer-Policy\": \"no-referrer\",\n\t\t\t\t\"X-Content-Type-Options\": \"nosniff\",\n\t\t\t\t\"Permissions-Policy\": \"geolocation=(), microphone=(self), camera=()\",\n\t\t\t}\n\t\t: {};\n\nconst headlessRuntimeService = new HeadlessRuntimeService();\n\nconst context: WebServerContext = {\n\tcorsHeaders: CORS_HEADERS,\n\tstaticMaxAge: STATIC_MAX_AGE,\n\tdefaultApprovalMode: DEFAULT_APPROVAL_MODE,\n\tdefaultProvider: DEFAULT_PROVIDER,\n\tdefaultModelId: DEFAULT_MODEL_ID,\n\tcreateAgent,\n\tcreateBackgroundAgent,\n\tgetRegisteredModel,\n\tgetCurrentSelection,\n\tensureCredential,\n\tsetModelSelection: (model) => modelSelectionStore.set(model),\n\tacquireSse: () => sseLimiter.tryAcquire(),\n\treleaseSse: (token) => sseLimiter.release(token),\n\theadlessRuntimeService,\n};\n\nconst routes = createRoutes(context);\n\nconst router = createRequestHandler(\n\troutes,\n\t(req, res, pathname) => {\n\t\tif (pathname.startsWith(\"/api\")) {\n\t\t\tsendJson(res, 404, { error: \"Not found\" }, CORS_HEADERS, req);\n\t\t\treturn;\n\t\t}\n\t\tserveStatic(pathname, req, res, {\n\t\t\twebRoot: WEB_ROOT,\n\t\t\tcorsHeaders: CORS_HEADERS,\n\t\t\tmaxAgeSeconds: STATIC_MAX_AGE,\n\t\t\tsecurityHeaders: SECURITY_HEADERS,\n\t\t\tspaFallback: true,\n\t\t});\n\t},\n\tCORS_HEADERS,\n);\n\n// Active request tracking for graceful shutdown and debugging\n// Tiered rate limiter with per-endpoint limits\n// Global: 1000/min, with stricter limits for expensive endpoints\nconst rateLimiter = new TieredRateLimiter();\n\nasync function handleRequest(req: IncomingMessage, res: ServerResponse) {\n\tconst start = performance.now();\n\tconst parsedUrl = parse(req.url || \"/\", true);\n\tconst pathname = parsedUrl.pathname || \"/\";\n\tconst requestId = randomUUID();\n\n\t// Parse W3C Trace Context\n\t// traceparent: 00-traceid-spanid-flags\n\tconst traceParent = req.headers.traceparent as string | undefined;\n\tconst { traceId, parentSpanId } = parseTraceParent(traceParent);\n\tconst spanId = randomBytes(8).toString(\"hex\"); // New span for this service\n\tconst responseTraceParent = `00-${traceId}-${spanId}-01`;\n\tres.setHeader(\"traceparent\", responseTraceParent);\n\tres.setHeader(\"server-timing\", `traceparent;desc=\"${responseTraceParent}\"`);\n\n\t// Attach request to response for easy access in helpers\n\t(res as ServerResponse & { req?: IncomingMessage }).req = req;\n\n\tconst context: RequestContext = {\n\t\trequestId,\n\t\ttraceId,\n\t\tspanId,\n\t\tstartTime: start,\n\t\tmethod: req.method || \"GET\",\n\t\turl: pathname,\n\t};\n\n\t// Set a hard timeout for processing\n\t// Skip for SSE endpoints which are meant to be long-lived\n\tif (!pathname.startsWith(\"/api/chat\")) {\n\t\tconst timeout = setTimeout(() => {\n\t\t\tif (!res.headersSent && !res.writableEnded) {\n\t\t\t\trequestContextStorage.run(context, () => {\n\t\t\t\t\tlogError(`Request timeout for ${pathname} [${requestId}]`);\n\t\t\t\t\tconst duration = performance.now() - start;\n\t\t\t\t\trecordApiRequest(req.method || \"UNKNOWN\", pathname, 504, duration, {\n\t\t\t\t\t\trequestId,\n\t\t\t\t\t\ttraceId,\n\t\t\t\t\t\tspanId,\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\tres.writeHead(504, {\n\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\t...CORS_HEADERS,\n\t\t\t\t});\n\t\t\t\tres.end(JSON.stringify({ error: \"Gateway Timeout\" }));\n\t\t\t}\n\t\t}, REQUEST_TIMEOUT_MS);\n\n\t\tconst cleanup = () => {\n\t\t\tclearTimeout(timeout);\n\t\t};\n\n\t\tres.on(\"finish\", cleanup);\n\t\tres.on(\"close\", cleanup);\n\t}\n\n\t// Track request for introspection (Channelz) and graceful shutdown\n\trequestTracker.track(req, {\n\t\tid: requestId,\n\t\tmethod: req.method || \"GET\",\n\t\turl: pathname,\n\t\tstartTime: start,\n\t\tuserAgent: req.headers[\"user-agent\"],\n\t});\n\n\tres.on(\"close\", () => {\n\t\trequestTracker.untrack(req);\n\t});\n\n\t// Await the context storage run to prevent unhandled promise rejections\n\tawait requestContextStorage.run(context, async () => {\n\t\t// Setup logging listener inside context to capture trace/span IDs in closure\n\t\tres.on(\"finish\", () => {\n\t\t\tconst duration = performance.now() - start;\n\t\t\tlogRequest(req, res.statusCode, start);\n\t\t\trecordApiRequest(\n\t\t\t\treq.method || \"UNKNOWN\",\n\t\t\t\tpathname,\n\t\t\t\tres.statusCode,\n\t\t\t\tduration,\n\t\t\t\t{ requestId, traceId, spanId },\n\t\t\t);\n\t\t});\n\n\t\tconst app = compose([\n\t\t\tcreateLoadSheddingMiddleware(CORS_HEADERS),\n\t\t\tcreateTieredRateLimitMiddleware(\n\t\t\t\trateLimiter,\n\t\t\t\tCORS_HEADERS,\n\t\t\t\tTRUST_PROXY,\n\t\t\t\tTRUST_PROXY_HOPS,\n\t\t\t),\n\t\t\tcreateCorsMiddleware(CORS_HEADERS),\n\t\t\tcreateAuthMiddleware(WEB_API_KEY, CORS_HEADERS, REQUIRE_WEB_API_KEY, {\n\t\t\t\texemptPaths: AUTH_BOUNDARY_EXEMPT_PATHS,\n\t\t\t}),\n\t\t\tcreateCsrfMiddleware(CSRF_TOKEN, CORS_HEADERS, REQUIRE_CSRF, {\n\t\t\t\texemptPaths: AUTH_BOUNDARY_EXEMPT_PATHS,\n\t\t\t}),\n\t\t\tcreateWorkspaceConfigMiddleware(CORS_HEADERS),\n\t\t\tcreateRouterMiddleware(router),\n\t\t]);\n\n\t\ttry {\n\t\t\tawait app(req, res, () => {\n\t\t\t\t// This fallback should rarely be reached as the router handles 404s\n\t\t\t\tif (!res.headersSent && !res.writableEnded) {\n\t\t\t\t\tsendJson(res, 404, { error: \"Not found\" }, CORS_HEADERS, req);\n\t\t\t\t}\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tlogError(error instanceof Error ? error : new Error(String(error)));\n\t\t\tif (!res.headersSent && !res.writableEnded) {\n\t\t\t\tres.writeHead(500, {\n\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\t...CORS_HEADERS,\n\t\t\t\t});\n\t\t\t\tres.end(JSON.stringify({ error: \"Internal server error\" }));\n\t\t\t}\n\t\t}\n\t});\n}\n\nexport async function startWebServer(\n\tport = 8080,\n\toptions: StartWebServerOptions = {},\n) {\n\tif (options.hostedRunner) {\n\t\tcontext.hostedRunner = options.hostedRunner;\n\t}\n\n\tregisterCrashHandlers();\n\tif (!options.skipStartupMigration) {\n\t\tconst { migrate } = await import(\"./db/migrate.js\");\n\t\tconst applied = await migrate();\n\t\tif (applied > 0) {\n\t\t\tlogger.info(\"Startup database migrations completed\", { count: applied });\n\t\t}\n\t}\n\tawait reloadModelConfig();\n\tawait initLifecycle();\n\tstartAutomationScheduler(context);\n\n\t// Initialize enterprise context for user/org tracking (optional, only if enterprise features enabled)\n\tconst { enterpriseContext } = await import(\"./enterprise/context.js\");\n\tawait enterpriseContext.initialize();\n\n\t// Initialize audit integration if enterprise features are available\n\tif (enterpriseContext.isEnterprise()) {\n\t\tconst { initializeAuditIntegration } = await import(\n\t\t\t\"./enterprise/audit-integration.js\"\n\t\t);\n\t\tinitializeAuditIntegration();\n\t}\n\n\t// Initialize enterprise features (RBAC, permissions, default roles) if database is configured\n\tconst { isDatabaseConfigured } = await import(\"./db/client.js\");\n\tif (isDatabaseConfigured()) {\n\t\ttry {\n\t\t\tconst { initializeEnterpriseFeatures } = await import(\n\t\t\t\t\"./api/enterprise-routes.js\"\n\t\t\t);\n\t\t\tawait initializeEnterpriseFeatures();\n\t\t\tlogger.info(\"Enterprise features initialized\");\n\t\t} catch (error) {\n\t\t\tlogger.warn(\"Failed to initialize enterprise features\", {\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t});\n\t\t}\n\t}\n\n\t// Configure safe mode settings (e.g., disabling certain tools in sandboxed environments)\n\tconfigureSafeMode(true);\n\n\t// Register shutdown hooks for background tasks to ensure clean cleanup\n\tregisterBackgroundTaskShutdownHooks();\n\n\t// Bootstrap LSP for IDE integration (enables diagnostics, hover, etc.)\n\tawait bootstrapLsp();\n\n\t// Initialize checkpoint service for undo/redo functionality\n\tinitCheckpointService(process.cwd());\n\n\t// Initialize MCP servers\n\ttry {\n\t\tconst mcpConfig = loadMcpConfig(process.cwd(), { includeEnvLimits: true });\n\t\tif (mcpConfig.servers.length > 0) {\n\t\t\tlogger.info(\"Initializing MCP servers...\");\n\t\t\tif (\n\t\t\t\tmcpConfig.servers.some(\n\t\t\t\t\t(server) => server.transport === \"http\" || server.transport === \"sse\",\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tvoid prefetchOfficialMcpRegistry();\n\t\t\t}\n\n\t\t\t// Listen for connection events\n\t\t\tmcpManager.on(\"connected\", (event) => {\n\t\t\t\tlogger.info(`MCP server connected: ${event.name}`);\n\t\t\t});\n\n\t\t\tmcpManager.on(\"disconnected\", (event) => {\n\t\t\t\tlogger.info(`MCP server disconnected: ${event.name}`);\n\t\t\t});\n\n\t\t\tawait mcpManager.configure(mcpConfig);\n\t\t}\n\t} catch (error) {\n\t\tlogger.warn(\"Failed to initialize MCP servers\", {\n\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t});\n\t}\n\n\tif (REQUIRE_WEB_API_KEY && !WEB_API_KEY) {\n\t\tthrow new Error(\n\t\t\t\"MAESTRO_WEB_API_KEY is required. Set MAESTRO_WEB_REQUIRE_KEY=0 to allow unauthenticated APIs for local-only testing.\",\n\t\t);\n\t}\n\n\tif (REQUIRE_REDIS && !process.env.MAESTRO_REDIS_URL) {\n\t\tthrow new Error(\n\t\t\t\"MAESTRO_REDIS_URL must be set for shared rate limiting. Set MAESTRO_WEB_REQUIRE_REDIS=0 to bypass in single-node dev only.\",\n\t\t);\n\t}\n\n\tconst server = createServer(handleRequest);\n\tconst wsMaxPayload =\n\t\tNumber.parseInt(process.env.MAESTRO_WS_MAX_PAYLOAD || \"1048576\", 10) ||\n\t\t1048576;\n\tconst wsServer = new WebSocketServer({\n\t\tnoServer: true,\n\t\tmaxPayload: wsMaxPayload,\n\t});\n\tconst sockets = new Set<Socket>();\n\tlet shuttingDown = false;\n\tlet drainTimeout: NodeJS.Timeout | null = null;\n\tlet drainInterval: NodeJS.Timeout | null = null;\n\n\tserver.on(\"connection\", (socket) => {\n\t\tsockets.add(socket);\n\t\tsocket.on(\"close\", () => {\n\t\t\tsockets.delete(socket);\n\t\t});\n\t});\n\n\tserver.on(\"upgrade\", async (req, socket, head) => {\n\t\tconst url = new URL(\n\t\t\treq.url || \"/\",\n\t\t\t`http://${req.headers.host || \"localhost\"}`,\n\t\t);\n\t\tif (url.pathname !== \"/api/chat/ws\" && url.pathname !== \"/api/runtime/ws\") {\n\t\t\tsocket.destroy();\n\t\t\treturn;\n\t\t}\n\n\t\tif (ALLOWED_ORIGIN !== \"*\" && req.headers.origin) {\n\t\t\tif (req.headers.origin !== ALLOWED_ORIGIN) {\n\t\t\t\tsocket.write(\"HTTP/1.1 403 Forbidden\\r\\n\\r\\n\");\n\t\t\t\tsocket.destroy();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tconst auth = await checkApiAuth(req);\n\t\tif (!auth.ok) {\n\t\t\tsocket.write(\"HTTP/1.1 401 Unauthorized\\r\\n\\r\\n\");\n\t\t\tsocket.destroy();\n\t\t\treturn;\n\t\t}\n\n\t\tlet runtimeSessionId: string | undefined;\n\t\tif (url.pathname === \"/api/runtime/ws\") {\n\t\t\tconst authorization = await authorizeRuntimeWebSocketSession({\n\t\t\t\treq,\n\t\t\t\tsocket,\n\t\t\t\trequestedSessionId: url.searchParams.get(\"sessionId\"),\n\t\t\t\tvalidateSessionAccess: validateRuntimeSessionAccess,\n\t\t\t\tlogAccessError: logError,\n\t\t\t});\n\t\t\tif (authorization === null) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\truntimeSessionId = authorization;\n\t\t}\n\n\t\twsServer.handleUpgrade(req, socket, head, (ws) => {\n\t\t\tif (url.pathname === \"/api/runtime/ws\") {\n\t\t\t\thandleRuntimeAppServerWebSocket(ws, {\n\t\t\t\t\tsessionId: runtimeSessionId,\n\t\t\t\t\tvalidateSessionAccess: (sessionId) =>\n\t\t\t\t\t\tvalidateRuntimeSessionAccess(req, sessionId),\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\thandleChatWebSocket(ws, req, context);\n\t\t});\n\t});\n\n\tconst onListening = () => {\n\t\tlogStartup(port);\n\t\tif (context.hostedRunner) {\n\t\t\tlogger.info(\"Hosted runner mode enabled\", {\n\t\t\t\trunnerSessionId: context.hostedRunner.runnerSessionId,\n\t\t\t\tworkspaceRoot: context.hostedRunner.workspaceRoot,\n\t\t\t\tsnapshotRoot: context.hostedRunner.snapshotRoot,\n\t\t\t\tworkspaceId: context.hostedRunner.workspaceId,\n\t\t\t\tagentRunId: context.hostedRunner.agentRunId,\n\t\t\t\tlistenHost: options.host,\n\t\t\t\tlistenPort: port,\n\t\t\t});\n\t\t}\n\t\tstartStatsCollection();\n\t};\n\tif (options.host) {\n\t\tserver.listen(port, options.host, onListening);\n\t} else {\n\t\tserver.listen(port, onListening);\n\t}\n\n\t// Don't register signal handlers in test mode - vitest manages process lifecycle\n\tconst isTestMode =\n\t\tprocess.env.VITEST === \"true\" || process.env.NODE_ENV === \"test\";\n\tif (!isTestMode) {\n\t\tconst beginShutdown = async (signal: NodeJS.Signals) => {\n\t\t\tif (shuttingDown) return;\n\t\t\tshuttingDown = true;\n\t\t\tif (context.hostedRunner) {\n\t\t\t\tif (context.hostedRunner.draining) {\n\t\t\t\t\tlogger.info(\"Hosted runner already draining before shutdown\", {\n\t\t\t\t\t\trunnerSessionId: context.hostedRunner.runnerSessionId,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst drainResult = await drainHostedRunnerForShutdown(context, {\n\t\t\t\t\t\t\treason: HostedRunnerDrainReasonValue.ProcessShutdown,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (drainResult) {\n\t\t\t\t\t\t\tconst log =\n\t\t\t\t\t\t\t\tdrainResult.status === HostedRunnerDrainStatusValue.Interrupted\n\t\t\t\t\t\t\t\t\t? logger.warn.bind(logger)\n\t\t\t\t\t\t\t\t\t: logger.info.bind(logger);\n\t\t\t\t\t\t\tlog(\"Hosted runner drained during graceful shutdown\", {\n\t\t\t\t\t\t\t\trunnerSessionId: drainResult.runner_session_id,\n\t\t\t\t\t\t\t\tstatus: drainResult.status,\n\t\t\t\t\t\t\t\tmanifestPath: drainResult.manifest_path,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tcontext.hostedRunner.draining = true;\n\t\t\t\t\t\tlogger.warn(\"Hosted runner shutdown drain failed\", {\n\t\t\t\t\t\t\trunnerSessionId: context.hostedRunner.runnerSessionId,\n\t\t\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tlogger.info(`${signal} received. Starting graceful shutdown...`);\n\t\t\tstopStatsCollection();\n\t\t\tdisposeCheckpointService();\n\t\t\t// End enterprise session if initialized\n\t\t\tconst { enterpriseContext } = await import(\"./enterprise/context.js\");\n\t\t\tif (enterpriseContext.isEnterprise()) {\n\t\t\t\tenterpriseContext.endSession();\n\t\t\t}\n\t\t\tawait shutdownLifecycle();\n\n\t\t\t// Stop accepting new connections\n\t\t\tserver.close();\n\n\t\t\t// Drain existing requests\n\t\t\tconst activeCount = requestTracker.getCount();\n\t\t\tif (activeCount > 0) {\n\t\t\t\tlogger.info(\"Waiting for active requests to complete...\", {\n\t\t\t\t\tactiveCount,\n\t\t\t\t});\n\t\t\t\tdrainTimeout = setTimeout(() => {\n\t\t\t\t\tlogger.warn(\"Drain timeout reached. Forcing shutdown...\");\n\t\t\t\t\tfor (const socket of sockets) {\n\t\t\t\t\t\tsocket.destroy();\n\t\t\t\t\t}\n\t\t\t\t\tprocess.exit(0);\n\t\t\t\t}, 10000); // 10s drain timeout\n\n\t\t\t\t// Poll for drain\n\t\t\t\tdrainInterval = setInterval(() => {\n\t\t\t\t\tif (requestTracker.getCount() === 0) {\n\t\t\t\t\t\tif (drainInterval) clearInterval(drainInterval);\n\t\t\t\t\t\tif (drainTimeout) clearTimeout(drainTimeout);\n\t\t\t\t\t\tlogger.info(\"All requests completed. Exiting.\");\n\t\t\t\t\t\tprocess.exit(0);\n\t\t\t\t\t}\n\t\t\t\t}, 100);\n\t\t\t} else {\n\t\t\t\tlogger.info(\"No active requests. Exiting.\");\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\t\t};\n\t\tprocess.on(\"SIGINT\", () => {\n\t\t\tvoid beginShutdown(\"SIGINT\");\n\t\t});\n\t\tprocess.on(\"SIGTERM\", () => {\n\t\t\tvoid beginShutdown(\"SIGTERM\");\n\t\t});\n\t}\n\n\treturn server;\n}\n\n// Run if called directly\nif (process.argv[1] && __filename === resolve(process.argv[1])) {\n\tconst port = Number.parseInt(process.env.PORT || \"8080\", 10);\n\tstartWebServer(port);\n}\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@evalops/maestro",
3
3
  "description": "Maestro by EvalOps - Deterministic coding agent with TUI/CLI and Web UI for AI-assisted development",
4
- "version": "0.10.22",
4
+ "version": "0.10.24",
5
5
  "private": false,
6
6
  "type": "module",
7
7
  "workspaces": [
@@ -54,7 +54,7 @@
54
54
  "check:scenario-replay-gate": "node scripts/run-scenario-replay-gate.mjs",
55
55
  "check:codex-parity": "node scripts/check-codex-parity-conformance.mjs",
56
56
  "check:codex-operating-layer": "node scripts/check-codex-operating-layer-conformance.mjs",
57
- "lint:evals": "bun run lint:headless-proto && node scripts/ensure-deps.js --no-install --workspace @evalops/contracts && node scripts/verify-evals.js && node scripts/verify-tool-versions.js && node scripts/validate-system-paths.js && node scripts/validate-package-boundaries.js && node scripts/validate-public-package-deps.js && node scripts/check-public-surface-boundary.mjs && npm run check:context-manifest && npm run check:session-wire-contract && npm run check:evidence-integrity && npm run check:session-replay-fixtures && npm run check:agent-trajectory-fixtures && npm run check:agent-trajectory-replay-fixtures && npm run check:agent-trajectory-score-fixtures && npm run check:agent-trajectory-inspection-fixtures && npm run check:agent-trajectory-scenario-fixtures && npm run check:slack-contract-lab-scenarios && npm run check:scripted-scenario-fixtures && node scripts/session-wire-format-codegen.mjs --check && node scripts/headless-protocol-codegen.mjs --check && npm run check:drift-surfaces && npm run check:staged-rollout && npm run check:codex-parity && npm run check:codex-operating-layer && npm run developer-surface:check",
57
+ "lint:evals": "bun run lint:headless-proto && node scripts/ensure-deps.js --no-install --workspace @evalops/contracts && node scripts/verify-evals.js && node scripts/verify-tool-versions.js && node scripts/validate-system-paths.js && node scripts/validate-package-boundaries.js && node scripts/validate-public-package-deps.js && node scripts/check-public-surface-boundary.mjs && npm run check:context-manifest && npm run check:session-wire-contract && npm run check:evidence-integrity && npm run check:session-replay-fixtures && npm run check:agent-trajectory-fixtures && npm run check:agent-trajectory-replay-fixtures && npm run check:agent-trajectory-score-fixtures && npm run check:agent-trajectory-inspection-fixtures && npm run check:agent-trajectory-scenario-fixtures && npm run check:slack-contract-lab-scenarios && npm run check:scripted-scenario-fixtures && node scripts/session-wire-format-codegen.mjs --check && node scripts/headless-protocol-codegen.mjs --check && npm run check:app-server-schema && npm run check:drift-surfaces && npm run check:staged-rollout && npm run check:codex-parity && npm run check:codex-operating-layer && npm run developer-surface:check",
58
58
  "platform:sdk-smoke": "tsx scripts/check-platform-sdk-contract.ts",
59
59
  "platform:agentruntime-e2e": "tsx scripts/smoke-platform-agentruntime-lifecycle.ts",
60
60
  "platform:timeline-e2e": "tsx scripts/smoke-platform-timeline-e2e.ts",
@@ -75,6 +75,8 @@
75
75
  "device-identity:harness": "MAESTRO_DEVICE_IDENTITY_ALLOW_TEST_HELPER=1 node ./scripts/run-vitest.js --run test/oauth-device-identity-harness.test.ts",
76
76
  "generate-models": "bun scripts/generate-models.ts",
77
77
  "generate:headless-protocol": "node scripts/headless-protocol-codegen.mjs",
78
+ "generate:app-server-schema": "tsx scripts/app-server-schema-codegen.ts",
79
+ "check:app-server-schema": "tsx scripts/app-server-schema-codegen.ts --check",
78
80
  "generate:session-wire-format": "node scripts/session-wire-format-codegen.mjs",
79
81
  "check:session-wire-format:generated": "node scripts/session-wire-format-codegen.mjs --check",
80
82
  "generate:headless-proto:buf": "buf generate --template buf.gen.yaml && bunx biome check --write --unsafe packages/contracts/src/proto/maestro/v1/headless_pb.ts",
@@ -1,17 +0,0 @@
1
- import { type AnthropicLoginMode } from "../providers/anthropic-auth.js";
2
- import { type OAuthCredentials } from "./storage.js";
3
- /**
4
- * Login to Anthropic via OAuth
5
- */
6
- export declare function loginAnthropic(mode: AnthropicLoginMode, onAuthUrl: (url: string) => void, onPromptCode: () => Promise<string>): Promise<void>;
7
- /**
8
- * Refresh Anthropic OAuth token
9
- */
10
- export declare function refreshAnthropicToken(refreshToken: string, metadata?: Record<string, unknown>): Promise<OAuthCredentials>;
11
- /**
12
- * Migrate old Anthropic OAuth credentials to new generic format
13
- * This reads from the old ~/.maestro/anthropic-oauth.json file
14
- * and migrates to the new ~/.maestro/oauth.json format
15
- */
16
- export declare function migrateAnthropicCredentials(): Promise<boolean>;
17
- //# sourceMappingURL=anthropic.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/oauth/anthropic.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,kBAAkB,EAKvB,MAAM,gCAAgC,CAAC;AAExC,OAAO,EAAE,KAAK,gBAAgB,EAAwB,MAAM,cAAc,CAAC;AAI3E;;GAEG;AACH,wBAAsB,cAAc,CACnC,IAAI,EAAE,kBAAkB,EACxB,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,EAChC,YAAY,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,GACjC,OAAO,CAAC,IAAI,CAAC,CAgCf;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAC1C,YAAY,EAAE,MAAM,EACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,gBAAgB,CAAC,CAc3B;AAED;;;;GAIG;AACH,wBAAsB,2BAA2B,IAAI,OAAO,CAAC,OAAO,CAAC,CAoCpE"}
@@ -1,81 +0,0 @@
1
- import { exchangeAnthropicAuthorizationCode, generateAnthropicLoginUrl, refreshAnthropicOAuthToken, } from "../providers/anthropic-auth.js";
2
- import { createLogger } from "../utils/logger.js";
3
- import { saveOAuthCredentials } from "./storage.js";
4
- const logger = createLogger("oauth:anthropic");
5
- /**
6
- * Login to Anthropic via OAuth
7
- */
8
- export async function loginAnthropic(mode, onAuthUrl, onPromptCode) {
9
- // Generate OAuth URL
10
- const { url, verifier } = await generateAnthropicLoginUrl(mode);
11
- // Show URL to user
12
- onAuthUrl(url);
13
- // Get authorization code from user
14
- const code = await onPromptCode();
15
- if (!code) {
16
- throw new Error("Authorization code is required");
17
- }
18
- // Exchange code for tokens
19
- const tokens = await exchangeAnthropicAuthorizationCode(code, verifier);
20
- if (!tokens) {
21
- throw new Error("Failed to exchange authorization code");
22
- }
23
- // Convert to generic OAuth credentials
24
- const credentials = {
25
- type: "oauth",
26
- access: tokens.accessToken,
27
- refresh: tokens.refreshToken,
28
- expires: tokens.expiresAt,
29
- metadata: { mode },
30
- };
31
- // Save to generic storage
32
- saveOAuthCredentials("anthropic", credentials);
33
- }
34
- /**
35
- * Refresh Anthropic OAuth token
36
- */
37
- export async function refreshAnthropicToken(refreshToken, metadata) {
38
- const refreshed = await refreshAnthropicOAuthToken(refreshToken);
39
- if (!refreshed) {
40
- throw new Error("Failed to refresh Anthropic OAuth token");
41
- }
42
- return {
43
- type: "oauth",
44
- access: refreshed.accessToken,
45
- refresh: refreshed.refreshToken ?? refreshToken,
46
- expires: refreshed.expiresAt,
47
- metadata,
48
- };
49
- }
50
- /**
51
- * Migrate old Anthropic OAuth credentials to new generic format
52
- * This reads from the old ~/.maestro/anthropic-oauth.json file
53
- * and migrates to the new ~/.maestro/oauth.json format
54
- */
55
- export async function migrateAnthropicCredentials() {
56
- try {
57
- const { getStoredAnthropicOAuthCredential, deleteAnthropicOAuthCredential, } = await import("../providers/anthropic-auth.js");
58
- const oldCreds = await getStoredAnthropicOAuthCredential();
59
- if (!oldCreds) {
60
- return false; // No credentials to migrate
61
- }
62
- // Convert to new format
63
- const credentials = {
64
- type: "oauth",
65
- access: oldCreds.accessToken,
66
- refresh: oldCreds.refreshToken,
67
- expires: oldCreds.expiresAt,
68
- metadata: { mode: oldCreds.mode },
69
- };
70
- // Save to new storage
71
- saveOAuthCredentials("anthropic", credentials);
72
- // Delete old file
73
- await deleteAnthropicOAuthCredential();
74
- return true;
75
- }
76
- catch (error) {
77
- logger.error("Failed to migrate Anthropic OAuth credentials", error instanceof Error ? error : new Error(String(error)));
78
- return false;
79
- }
80
- }
81
- //# sourceMappingURL=anthropic.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/oauth/anthropic.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\ttype AnthropicLoginMode,\n\ttype AnthropicOAuthCredential,\n\texchangeAnthropicAuthorizationCode,\n\tgenerateAnthropicLoginUrl,\n\trefreshAnthropicOAuthToken,\n} from \"../providers/anthropic-auth.js\";\nimport { createLogger } from \"../utils/logger.js\";\nimport { type OAuthCredentials, saveOAuthCredentials } from \"./storage.js\";\n\nconst logger = createLogger(\"oauth:anthropic\");\n\n/**\n * Login to Anthropic via OAuth\n */\nexport async function loginAnthropic(\n\tmode: AnthropicLoginMode,\n\tonAuthUrl: (url: string) => void,\n\tonPromptCode: () => Promise<string>,\n): Promise<void> {\n\t// Generate OAuth URL\n\tconst { url, verifier } = await generateAnthropicLoginUrl(mode);\n\n\t// Show URL to user\n\tonAuthUrl(url);\n\n\t// Get authorization code from user\n\tconst code = await onPromptCode();\n\n\tif (!code) {\n\t\tthrow new Error(\"Authorization code is required\");\n\t}\n\n\t// Exchange code for tokens\n\tconst tokens = await exchangeAnthropicAuthorizationCode(code, verifier);\n\n\tif (!tokens) {\n\t\tthrow new Error(\"Failed to exchange authorization code\");\n\t}\n\n\t// Convert to generic OAuth credentials\n\tconst credentials: OAuthCredentials = {\n\t\ttype: \"oauth\",\n\t\taccess: tokens.accessToken,\n\t\trefresh: tokens.refreshToken,\n\t\texpires: tokens.expiresAt,\n\t\tmetadata: { mode },\n\t};\n\n\t// Save to generic storage\n\tsaveOAuthCredentials(\"anthropic\", credentials);\n}\n\n/**\n * Refresh Anthropic OAuth token\n */\nexport async function refreshAnthropicToken(\n\trefreshToken: string,\n\tmetadata?: Record<string, unknown>,\n): Promise<OAuthCredentials> {\n\tconst refreshed = await refreshAnthropicOAuthToken(refreshToken);\n\n\tif (!refreshed) {\n\t\tthrow new Error(\"Failed to refresh Anthropic OAuth token\");\n\t}\n\n\treturn {\n\t\ttype: \"oauth\",\n\t\taccess: refreshed.accessToken,\n\t\trefresh: refreshed.refreshToken ?? refreshToken,\n\t\texpires: refreshed.expiresAt,\n\t\tmetadata,\n\t};\n}\n\n/**\n * Migrate old Anthropic OAuth credentials to new generic format\n * This reads from the old ~/.maestro/anthropic-oauth.json file\n * and migrates to the new ~/.maestro/oauth.json format\n */\nexport async function migrateAnthropicCredentials(): Promise<boolean> {\n\ttry {\n\t\tconst {\n\t\t\tgetStoredAnthropicOAuthCredential,\n\t\t\tdeleteAnthropicOAuthCredential,\n\t\t} = await import(\"../providers/anthropic-auth.js\");\n\n\t\tconst oldCreds = await getStoredAnthropicOAuthCredential();\n\n\t\tif (!oldCreds) {\n\t\t\treturn false; // No credentials to migrate\n\t\t}\n\n\t\t// Convert to new format\n\t\tconst credentials: OAuthCredentials = {\n\t\t\ttype: \"oauth\",\n\t\t\taccess: oldCreds.accessToken,\n\t\t\trefresh: oldCreds.refreshToken,\n\t\t\texpires: oldCreds.expiresAt,\n\t\t\tmetadata: { mode: oldCreds.mode },\n\t\t};\n\n\t\t// Save to new storage\n\t\tsaveOAuthCredentials(\"anthropic\", credentials);\n\n\t\t// Delete old file\n\t\tawait deleteAnthropicOAuthCredential();\n\n\t\treturn true;\n\t} catch (error) {\n\t\tlogger.error(\n\t\t\t\"Failed to migrate Anthropic OAuth credentials\",\n\t\t\terror instanceof Error ? error : new Error(String(error)),\n\t\t);\n\t\treturn false;\n\t}\n}\n"]}
@@ -1,75 +0,0 @@
1
- /**
2
- * Anthropic OAuth Authentication
3
- *
4
- * This module implements OAuth 2.0 with PKCE for authenticating with
5
- * Anthropic's Claude API. It supports both claude.ai (Pro) and
6
- * console.anthropic.com (Console) login modes.
7
- *
8
- * ## Authentication Flow
9
- *
10
- * ```
11
- * ┌─────────────────────────────────────────────────────────────┐
12
- * │ Anthropic OAuth Flow │
13
- * ├─────────────────────────────────────────────────────────────┤
14
- * │ 1. Generate PKCE challenge (verifier + challenge) │
15
- * │ 2. Generate login URL → User opens in browser │
16
- * │ 3. User authenticates at claude.ai or console.anthropic.com│
17
- * │ 4. Receive authorization code from redirect │
18
- * │ 5. Exchange code + verifier for access/refresh tokens │
19
- * │ 6. Store credentials in ~/.maestro/anthropic-oauth.json │
20
- * │ 7. Auto-refresh tokens when they expire │
21
- * └─────────────────────────────────────────────────────────────┘
22
- * ```
23
- *
24
- * ## Login Modes
25
- *
26
- * | Mode | Host | Description |
27
- * |---------|-------------------------|--------------------------|
28
- * | pro | claude.ai | Claude Pro subscriptions |
29
- * | console | console.anthropic.com | API Console access |
30
- *
31
- * ## Token Storage
32
- *
33
- * Credentials are stored at:
34
- * - Default: `~/.maestro/anthropic-oauth.json`
35
- * - Custom: `$ANTHROPIC_OAUTH_FILE`
36
- *
37
- * File is created with mode 0o600 (owner read/write only).
38
- *
39
- * ## Key Functions
40
- *
41
- * - `generateAnthropicLoginUrl()`: Create OAuth URL for browser
42
- * - `exchangeAnthropicAuthorizationCode()`: Exchange code for tokens
43
- * - `getFreshAnthropicOAuthCredential()`: Get valid token (auto-refresh)
44
- * - `fetchClaudeApiKey()`: Convert OAuth token to API key
45
- *
46
- * @module providers/anthropic-auth
47
- */
48
- export type AnthropicLoginMode = "pro" | "console";
49
- export interface AnthropicOAuthCredential {
50
- accessToken: string;
51
- refreshToken: string;
52
- expiresAt: number;
53
- mode: AnthropicLoginMode;
54
- }
55
- export declare const CLAUDE_CODE_BETA_HEADER = "oauth-2025-04-20,claude-code-20250219,interleaved-thinking-2025-05-14,fine-grained-tool-streaming-2025-05-14,advanced-tool-use-2025-11-20";
56
- export declare function getStoredAnthropicOAuthCredential(): Promise<AnthropicOAuthCredential | null>;
57
- export declare function saveAnthropicOAuthCredential(credential: AnthropicOAuthCredential): Promise<void>;
58
- export declare function deleteAnthropicOAuthCredential(): Promise<void>;
59
- export declare function getFreshAnthropicOAuthCredential(): Promise<AnthropicOAuthCredential | null>;
60
- export declare function generateAnthropicLoginUrl(mode?: AnthropicLoginMode): Promise<{
61
- url: string;
62
- verifier: string;
63
- }>;
64
- export declare function exchangeAnthropicAuthorizationCode(code: string, verifier: string): Promise<{
65
- accessToken: string;
66
- refreshToken: string;
67
- expiresAt: number;
68
- } | null>;
69
- export declare function refreshAnthropicOAuthToken(refreshToken: string): Promise<{
70
- accessToken: string;
71
- refreshToken?: string;
72
- expiresAt: number;
73
- } | null>;
74
- export declare function fetchClaudeApiKey(accessToken: string): Promise<string | null>;
75
- //# sourceMappingURL=anthropic-auth.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"anthropic-auth.d.ts","sourceRoot":"","sources":["../../src/providers/anthropic-auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AAYH,MAAM,MAAM,kBAAkB,GAAG,KAAK,GAAG,SAAS,CAAC;AAEnD,MAAM,WAAW,wBAAwB;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,kBAAkB,CAAC;CACzB;AA4BD,eAAO,MAAM,uBAAuB,8IACwG,CAAC;AAyB7I,wBAAsB,iCAAiC,IAAI,OAAO,CAAC,wBAAwB,GAAG,IAAI,CAAC,CA+BlG;AAED,wBAAsB,4BAA4B,CACjD,UAAU,EAAE,wBAAwB,GAClC,OAAO,CAAC,IAAI,CAAC,CAMf;AAED,wBAAsB,8BAA8B,IAAI,OAAO,CAAC,IAAI,CAAC,CAMpE;AAED,wBAAsB,gCAAgC,IAAI,OAAO,CAAC,wBAAwB,GAAG,IAAI,CAAC,CAqBjG;AAED,wBAAsB,yBAAyB,CAC9C,IAAI,GAAE,kBAA0B;;;GAsBhC;AAED,wBAAsB,kCAAkC,CACvD,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACd,OAAO,CAAC;IACV,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CAClB,GAAG,IAAI,CAAC,CAiCR;AAED,wBAAsB,0BAA0B,CAC/C,YAAY,EAAE,MAAM,GAClB,OAAO,CAAC;IACV,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CAClB,GAAG,IAAI,CAAC,CA0BR;AAED,wBAAsB,iBAAiB,CACtC,WAAW,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAiBxB"}