@evalops/maestro 0.10.49 → 0.10.51

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 (422) hide show
  1. package/dist/agent/agent-outcome.d.ts +54 -0
  2. package/dist/agent/agent-outcome.d.ts.map +1 -0
  3. package/dist/agent/agent-outcome.js +142 -0
  4. package/dist/agent/agent-outcome.js.map +1 -0
  5. package/dist/agent/agent-resume.d.ts.map +1 -1
  6. package/dist/agent/agent-resume.js +3 -3
  7. package/dist/agent/agent-resume.js.map +1 -1
  8. package/dist/agent/agent-run-summary.d.ts +37 -0
  9. package/dist/agent/agent-run-summary.d.ts.map +1 -0
  10. package/dist/agent/agent-run-summary.js +15 -0
  11. package/dist/agent/agent-run-summary.js.map +1 -0
  12. package/dist/agent/agent-work-board.d.ts +82 -0
  13. package/dist/agent/agent-work-board.d.ts.map +1 -0
  14. package/dist/agent/agent-work-board.js +312 -0
  15. package/dist/agent/agent-work-board.js.map +1 -0
  16. package/dist/agent/auto-compaction.d.ts +7 -2
  17. package/dist/agent/auto-compaction.d.ts.map +1 -1
  18. package/dist/agent/auto-compaction.js +23 -10
  19. package/dist/agent/auto-compaction.js.map +1 -1
  20. package/dist/agent/mission-artifacts.d.ts +62 -0
  21. package/dist/agent/mission-artifacts.d.ts.map +1 -0
  22. package/dist/agent/mission-artifacts.js +438 -0
  23. package/dist/agent/mission-artifacts.js.map +1 -0
  24. package/dist/agent/mission-manifest.d.ts +139 -3
  25. package/dist/agent/mission-manifest.d.ts.map +1 -1
  26. package/dist/agent/mission-manifest.js +549 -3
  27. package/dist/agent/mission-manifest.js.map +1 -1
  28. package/dist/agent/mission-store.d.ts +80 -0
  29. package/dist/agent/mission-store.d.ts.map +1 -0
  30. package/dist/agent/mission-store.js +603 -0
  31. package/dist/agent/mission-store.js.map +1 -0
  32. package/dist/agent/modes.d.ts +2 -2
  33. package/dist/agent/modes.d.ts.map +1 -1
  34. package/dist/agent/modes.js +10 -3
  35. package/dist/agent/modes.js.map +1 -1
  36. package/dist/agent/providers/codex-app-server.d.ts.map +1 -1
  37. package/dist/agent/providers/codex-app-server.js +1 -3
  38. package/dist/agent/providers/codex-app-server.js.map +1 -1
  39. package/dist/agent/providers/google-gemini-cli.js +203 -107
  40. package/dist/agent/providers/google.js +100 -41
  41. package/dist/agent/providers/scripted.d.ts.map +1 -1
  42. package/dist/agent/providers/scripted.js +1 -3
  43. package/dist/agent/providers/scripted.js.map +1 -1
  44. package/dist/agent/providers/validation.d.ts.map +1 -1
  45. package/dist/agent/providers/validation.js +1 -3
  46. package/dist/agent/providers/validation.js.map +1 -1
  47. package/dist/agent/providers/vertex.js +203 -107
  48. package/dist/agent/snapshot-store.d.ts +32 -0
  49. package/dist/agent/snapshot-store.d.ts.map +1 -0
  50. package/dist/agent/snapshot-store.js +195 -0
  51. package/dist/agent/snapshot-store.js.map +1 -0
  52. package/dist/agent/specialist-profiles.d.ts +36 -0
  53. package/dist/agent/specialist-profiles.d.ts.map +1 -0
  54. package/dist/agent/specialist-profiles.js +159 -0
  55. package/dist/agent/specialist-profiles.js.map +1 -0
  56. package/dist/agent/subagent-specs.d.ts +4 -1
  57. package/dist/agent/subagent-specs.d.ts.map +1 -1
  58. package/dist/agent/subagent-specs.js +81 -8
  59. package/dist/agent/subagent-specs.js.map +1 -1
  60. package/dist/agent/swarm/coverage-gate.d.ts +37 -0
  61. package/dist/agent/swarm/coverage-gate.d.ts.map +1 -0
  62. package/dist/agent/swarm/coverage-gate.js +48 -0
  63. package/dist/agent/swarm/coverage-gate.js.map +1 -0
  64. package/dist/agent/swarm/executor.d.ts +1 -0
  65. package/dist/agent/swarm/executor.d.ts.map +1 -1
  66. package/dist/agent/swarm/executor.js +151 -15
  67. package/dist/agent/swarm/executor.js.map +1 -1
  68. package/dist/agent/swarm/orchestrator-prompt.d.ts +25 -0
  69. package/dist/agent/swarm/orchestrator-prompt.d.ts.map +1 -0
  70. package/dist/agent/swarm/orchestrator-prompt.js +48 -0
  71. package/dist/agent/swarm/orchestrator-prompt.js.map +1 -0
  72. package/dist/agent/swarm/plan-parser.d.ts.map +1 -1
  73. package/dist/agent/swarm/plan-parser.js +27 -2
  74. package/dist/agent/swarm/plan-parser.js.map +1 -1
  75. package/dist/agent/swarm/types.d.ts +17 -0
  76. package/dist/agent/swarm/types.d.ts.map +1 -1
  77. package/dist/agent/swarm/types.js.map +1 -1
  78. package/dist/agent/swarm/validation-directive.d.ts +21 -0
  79. package/dist/agent/swarm/validation-directive.d.ts.map +1 -0
  80. package/dist/agent/swarm/validation-directive.js +25 -0
  81. package/dist/agent/swarm/validation-directive.js.map +1 -0
  82. package/dist/agent/transport/tool-execution-bridge.d.ts.map +1 -1
  83. package/dist/agent/transport/tool-execution-bridge.js +4 -1
  84. package/dist/agent/transport/tool-execution-bridge.js.map +1 -1
  85. package/dist/api/enterprise-routes.d.ts.map +1 -1
  86. package/dist/api/enterprise-routes.js +87 -10
  87. package/dist/api/enterprise-routes.js.map +1 -1
  88. package/dist/api/org-settings-merge.d.ts +12 -0
  89. package/dist/api/org-settings-merge.d.ts.map +1 -0
  90. package/dist/api/org-settings-merge.js +38 -0
  91. package/dist/api/org-settings-merge.js.map +1 -0
  92. package/dist/api/user-settings-merge.d.ts +16 -0
  93. package/dist/api/user-settings-merge.d.ts.map +1 -0
  94. package/dist/api/user-settings-merge.js +37 -0
  95. package/dist/api/user-settings-merge.js.map +1 -0
  96. package/dist/app-server/daemon-lifecycle-api.d.ts.map +1 -1
  97. package/dist/app-server/daemon-lifecycle-api.js +1 -3
  98. package/dist/app-server/daemon-lifecycle-api.js.map +1 -1
  99. package/dist/app-server/external-agent-import-api.d.ts.map +1 -1
  100. package/dist/app-server/external-agent-import-api.js +1 -3
  101. package/dist/app-server/external-agent-import-api.js.map +1 -1
  102. package/dist/app-server/network-governance-api.d.ts.map +1 -1
  103. package/dist/app-server/network-governance-api.js +1 -3
  104. package/dist/app-server/network-governance-api.js.map +1 -1
  105. package/dist/app-server/plugin-bundle-api.d.ts.map +1 -1
  106. package/dist/app-server/plugin-bundle-api.js +1 -3
  107. package/dist/app-server/plugin-bundle-api.js.map +1 -1
  108. package/dist/app-server/policy-control-api.d.ts.map +1 -1
  109. package/dist/app-server/policy-control-api.js +1 -3
  110. package/dist/app-server/policy-control-api.js.map +1 -1
  111. package/dist/app-server/protocol-modes-api.d.ts.map +1 -1
  112. package/dist/app-server/protocol-modes-api.js +1 -3
  113. package/dist/app-server/protocol-modes-api.js.map +1 -1
  114. package/dist/cli/args.d.ts +2 -0
  115. package/dist/cli/args.d.ts.map +1 -1
  116. package/dist/cli/args.js +15 -0
  117. package/dist/cli/args.js.map +1 -1
  118. package/dist/cli/commands/a2a.d.ts.map +1 -1
  119. package/dist/cli/commands/a2a.js +1 -3
  120. package/dist/cli/commands/a2a.js.map +1 -1
  121. package/dist/cli/commands/agents.d.ts +4 -0
  122. package/dist/cli/commands/agents.d.ts.map +1 -1
  123. package/dist/cli/commands/agents.js +149 -0
  124. package/dist/cli/commands/agents.js.map +1 -1
  125. package/dist/cli/commands/mission.d.ts +4 -0
  126. package/dist/cli/commands/mission.d.ts.map +1 -0
  127. package/dist/cli/commands/mission.js +196 -0
  128. package/dist/cli/commands/mission.js.map +1 -0
  129. package/dist/cli/commands/value.d.ts +10 -0
  130. package/dist/cli/commands/value.d.ts.map +1 -0
  131. package/dist/cli/commands/value.js +33 -0
  132. package/dist/cli/commands/value.js.map +1 -0
  133. package/dist/cli/headless-protocol.d.ts.map +1 -1
  134. package/dist/cli/headless-protocol.js +1 -3
  135. package/dist/cli/headless-protocol.js.map +1 -1
  136. package/dist/cli/help.d.ts.map +1 -1
  137. package/dist/cli/help.js +10 -0
  138. package/dist/cli/help.js.map +1 -1
  139. package/dist/cli/system-prompt.d.ts.map +1 -1
  140. package/dist/cli/system-prompt.js +38 -7
  141. package/dist/cli/system-prompt.js.map +1 -1
  142. package/dist/cli-command-runtime.js +2 -2
  143. package/dist/cli-command-runtime.js.map +1 -1
  144. package/dist/cli-runtime.js +7798 -2805
  145. package/dist/cli-tui/client-tools/client-tool-controller.d.ts.map +1 -1
  146. package/dist/cli-tui/client-tools/client-tool-controller.js +1 -3
  147. package/dist/cli-tui/client-tools/client-tool-controller.js.map +1 -1
  148. package/dist/cli-tui/commands/undo-handlers.d.ts.map +1 -1
  149. package/dist/cli-tui/commands/undo-handlers.js +7 -2
  150. package/dist/cli-tui/commands/undo-handlers.js.map +1 -1
  151. package/dist/cli-tui/tui-renderer/skills-controller.d.ts +3 -0
  152. package/dist/cli-tui/tui-renderer/skills-controller.d.ts.map +1 -1
  153. package/dist/cli-tui/tui-renderer/skills-controller.js +77 -33
  154. package/dist/cli-tui/tui-renderer/skills-controller.js.map +1 -1
  155. package/dist/cli.js +4 -6
  156. package/dist/cli.js.map +1 -1
  157. package/dist/codex/app-server-client.d.ts.map +1 -1
  158. package/dist/codex/app-server-client.js +1 -3
  159. package/dist/codex/app-server-client.js.map +1 -1
  160. package/dist/codex/compatibility.d.ts.map +1 -1
  161. package/dist/codex/compatibility.js +1 -3
  162. package/dist/codex/compatibility.js.map +1 -1
  163. package/dist/codex/subagent-dispatch-table.d.ts +8 -0
  164. package/dist/codex/subagent-dispatch-table.d.ts.map +1 -1
  165. package/dist/codex/subagent-dispatch-table.js +23 -0
  166. package/dist/codex/subagent-dispatch-table.js.map +1 -1
  167. package/dist/context/manifest.d.ts.map +1 -1
  168. package/dist/context/manifest.js +1 -3
  169. package/dist/context/manifest.js.map +1 -1
  170. package/dist/conversation/render-model.d.ts +0 -36
  171. package/dist/conversation/render-model.d.ts.map +1 -1
  172. package/dist/conversation/render-model.js +1 -3
  173. package/dist/conversation/render-model.js.map +1 -1
  174. package/dist/customer-value/ambient-learning.d.ts +75 -0
  175. package/dist/customer-value/ambient-learning.d.ts.map +1 -0
  176. package/dist/customer-value/ambient-learning.js +472 -0
  177. package/dist/customer-value/ambient-learning.js.map +1 -0
  178. package/dist/customer-value/internal-helpers.d.ts +13 -0
  179. package/dist/customer-value/internal-helpers.d.ts.map +1 -0
  180. package/dist/customer-value/internal-helpers.js +70 -0
  181. package/dist/customer-value/internal-helpers.js.map +1 -0
  182. package/dist/customer-value/report.d.ts +282 -0
  183. package/dist/customer-value/report.d.ts.map +1 -0
  184. package/dist/customer-value/report.js +2085 -0
  185. package/dist/customer-value/report.js.map +1 -0
  186. package/dist/db/health.d.ts +1 -1
  187. package/dist/db/health.d.ts.map +1 -1
  188. package/dist/db/health.js +10 -0
  189. package/dist/db/health.js.map +1 -1
  190. package/dist/db/migrations/0009_operating_layer_evidence.sql +30 -0
  191. package/dist/db/migrations/meta/_journal.json +7 -0
  192. package/dist/db/schema.d.ts +268 -1
  193. package/dist/db/schema.d.ts.map +1 -1
  194. package/dist/db/schema.js +28 -0
  195. package/dist/db/schema.js.map +1 -1
  196. package/dist/evalops/agent-bootstrap.d.ts.map +1 -1
  197. package/dist/evalops/agent-bootstrap.js +1 -3
  198. package/dist/evalops/agent-bootstrap.js.map +1 -1
  199. package/dist/evalops/agent-mcp-metadata.d.ts.map +1 -1
  200. package/dist/evalops/agent-mcp-metadata.js +1 -3
  201. package/dist/evalops/agent-mcp-metadata.js.map +1 -1
  202. package/dist/index.d.ts +1 -0
  203. package/dist/index.d.ts.map +1 -1
  204. package/dist/index.js +1 -0
  205. package/dist/index.js.map +1 -1
  206. package/dist/installers/maestro-review-workflow.d.ts +38 -0
  207. package/dist/installers/maestro-review-workflow.d.ts.map +1 -0
  208. package/dist/installers/maestro-review-workflow.js +163 -0
  209. package/dist/installers/maestro-review-workflow.js.map +1 -0
  210. package/dist/load-env.d.ts +13 -0
  211. package/dist/load-env.d.ts.map +1 -1
  212. package/dist/load-env.js +17 -0
  213. package/dist/load-env.js.map +1 -1
  214. package/dist/main.d.ts.map +1 -1
  215. package/dist/main.js +96 -7
  216. package/dist/main.js.map +1 -1
  217. package/dist/mcp/config.d.ts.map +1 -1
  218. package/dist/mcp/config.js +1 -3
  219. package/dist/mcp/config.js.map +1 -1
  220. package/dist/mcp/elicitation.d.ts.map +1 -1
  221. package/dist/mcp/elicitation.js +1 -3
  222. package/dist/mcp/elicitation.js.map +1 -1
  223. package/dist/mcp/official-registry.d.ts.map +1 -1
  224. package/dist/mcp/official-registry.js +1 -3
  225. package/dist/mcp/official-registry.js.map +1 -1
  226. package/dist/mcp/workspace-trust.d.ts.map +1 -1
  227. package/dist/mcp/workspace-trust.js +1 -3
  228. package/dist/mcp/workspace-trust.js.map +1 -1
  229. package/dist/memory/service-client.d.ts.map +1 -1
  230. package/dist/memory/service-client.js +1 -3
  231. package/dist/memory/service-client.js.map +1 -1
  232. package/dist/models/config-loader.d.ts.map +1 -1
  233. package/dist/models/config-loader.js +1 -3
  234. package/dist/models/config-loader.js.map +1 -1
  235. package/dist/node_modules/@evalops/contracts/dist/index.d.ts +1 -0
  236. package/dist/node_modules/@evalops/contracts/dist/index.d.ts.map +1 -1
  237. package/dist/node_modules/@evalops/contracts/dist/index.js +1 -0
  238. package/dist/node_modules/@evalops/contracts/dist/index.js.map +1 -1
  239. package/dist/node_modules/@evalops/contracts/dist/maestro-settings.d.ts +61 -0
  240. package/dist/node_modules/@evalops/contracts/dist/maestro-settings.d.ts.map +1 -0
  241. package/dist/node_modules/@evalops/contracts/dist/maestro-settings.js +183 -0
  242. package/dist/node_modules/@evalops/contracts/dist/maestro-settings.js.map +1 -0
  243. package/dist/node_modules/@evalops/contracts/package.json +1 -1
  244. package/dist/node_modules/@evalops/tui/package.json +1 -1
  245. package/dist/oauth/connectors.d.ts.map +1 -1
  246. package/dist/oauth/connectors.js +1 -3
  247. package/dist/oauth/connectors.js.map +1 -1
  248. package/dist/oauth/evalops.d.ts.map +1 -1
  249. package/dist/oauth/evalops.js +1 -3
  250. package/dist/oauth/evalops.js.map +1 -1
  251. package/dist/platform/a2a-client.d.ts.map +1 -1
  252. package/dist/platform/a2a-client.js +1 -3
  253. package/dist/platform/a2a-client.js.map +1 -1
  254. package/dist/platform/a2a-cockpit.d.ts +1 -0
  255. package/dist/platform/a2a-cockpit.d.ts.map +1 -1
  256. package/dist/platform/a2a-cockpit.js +42 -11
  257. package/dist/platform/a2a-cockpit.js.map +1 -1
  258. package/dist/platform/a2a-completion-audit.d.ts +1 -1
  259. package/dist/platform/a2a-completion-audit.d.ts.map +1 -1
  260. package/dist/platform/a2a-completion-audit.js +7 -11
  261. package/dist/platform/a2a-completion-audit.js.map +1 -1
  262. package/dist/platform/a2a-maestro-peer.js +16 -0
  263. package/dist/platform/a2a-maestro-peer.js.map +1 -1
  264. package/dist/platform/a2a-peer-pairing.d.ts.map +1 -1
  265. package/dist/platform/a2a-peer-pairing.js +1 -3
  266. package/dist/platform/a2a-peer-pairing.js.map +1 -1
  267. package/dist/platform/a2a-peer-registry.d.ts.map +1 -1
  268. package/dist/platform/a2a-peer-registry.js +1 -3
  269. package/dist/platform/a2a-peer-registry.js.map +1 -1
  270. package/dist/platform/a2a-task-ledger.d.ts +20 -0
  271. package/dist/platform/a2a-task-ledger.d.ts.map +1 -1
  272. package/dist/platform/a2a-task-ledger.js +207 -11
  273. package/dist/platform/a2a-task-ledger.js.map +1 -1
  274. package/dist/platform/a2a-work-graph.d.ts.map +1 -1
  275. package/dist/platform/a2a-work-graph.js +1 -3
  276. package/dist/platform/a2a-work-graph.js.map +1 -1
  277. package/dist/platform/operating-layer.d.ts +127 -0
  278. package/dist/platform/operating-layer.d.ts.map +1 -0
  279. package/dist/platform/operating-layer.js +360 -0
  280. package/dist/platform/operating-layer.js.map +1 -0
  281. package/dist/platform/tool-execution-client.d.ts.map +1 -1
  282. package/dist/platform/tool-execution-client.js +19 -2
  283. package/dist/platform/tool-execution-client.js.map +1 -1
  284. package/dist/providers/auth.d.ts.map +1 -1
  285. package/dist/providers/auth.js +1 -3
  286. package/dist/providers/auth.js.map +1 -1
  287. package/dist/runtime/env.d.ts +9 -1
  288. package/dist/runtime/env.d.ts.map +1 -1
  289. package/dist/runtime/env.js +63 -1
  290. package/dist/runtime/env.js.map +1 -1
  291. package/dist/safety/policy.d.ts.map +1 -1
  292. package/dist/safety/policy.js +1 -4
  293. package/dist/safety/policy.js.map +1 -1
  294. package/dist/sandbox/docker-sandbox.d.ts.map +1 -1
  295. package/dist/sandbox/docker-sandbox.js +6 -1
  296. package/dist/sandbox/docker-sandbox.js.map +1 -1
  297. package/dist/server/handlers/hosted-runner-drain.d.ts.map +1 -1
  298. package/dist/server/handlers/hosted-runner-drain.js +1 -3
  299. package/dist/server/handlers/hosted-runner-drain.js.map +1 -1
  300. package/dist/server/handlers/platform-a2a-push.d.ts.map +1 -1
  301. package/dist/server/handlers/platform-a2a-push.js +53 -2
  302. package/dist/server/handlers/platform-a2a-push.js.map +1 -1
  303. package/dist/server/handlers/runtime-app-server-ws.d.ts.map +1 -1
  304. package/dist/server/handlers/runtime-app-server-ws.js +1 -3
  305. package/dist/server/handlers/runtime-app-server-ws.js.map +1 -1
  306. package/dist/server/headless-runtime-service.d.ts +16 -0
  307. package/dist/server/headless-runtime-service.d.ts.map +1 -1
  308. package/dist/server/headless-runtime-service.js +232 -206
  309. package/dist/server/headless-runtime-service.js.map +1 -1
  310. package/dist/server/hosted-agent-runtime-progress.d.ts.map +1 -1
  311. package/dist/server/hosted-agent-runtime-progress.js +12 -3
  312. package/dist/server/hosted-agent-runtime-progress.js.map +1 -1
  313. package/dist/server/pending-request-payload.d.ts.map +1 -1
  314. package/dist/server/pending-request-payload.js +1 -3
  315. package/dist/server/pending-request-payload.js.map +1 -1
  316. package/dist/server/route-auth.d.ts.map +1 -1
  317. package/dist/server/route-auth.js +2 -0
  318. package/dist/server/route-auth.js.map +1 -1
  319. package/dist/server/session-serialization.d.ts.map +1 -1
  320. package/dist/server/session-serialization.js +1 -3
  321. package/dist/server/session-serialization.js.map +1 -1
  322. package/dist/services/compliance/normalize.d.ts.map +1 -1
  323. package/dist/services/compliance/normalize.js +1 -3
  324. package/dist/services/compliance/normalize.js.map +1 -1
  325. package/dist/services/intelligent-router/normalize.d.ts.map +1 -1
  326. package/dist/services/intelligent-router/normalize.js +1 -3
  327. package/dist/services/intelligent-router/normalize.js.map +1 -1
  328. package/dist/services/revenue-attribution/normalize.d.ts.map +1 -1
  329. package/dist/services/revenue-attribution/normalize.js +1 -3
  330. package/dist/services/revenue-attribution/normalize.js.map +1 -1
  331. package/dist/services/traces/normalize.d.ts.map +1 -1
  332. package/dist/services/traces/normalize.js +1 -3
  333. package/dist/services/traces/normalize.js.map +1 -1
  334. package/dist/services/workspace-config/normalize.d.ts.map +1 -1
  335. package/dist/services/workspace-config/normalize.js +1 -3
  336. package/dist/services/workspace-config/normalize.js.map +1 -1
  337. package/dist/skills/composer.d.ts.map +1 -1
  338. package/dist/skills/composer.js +13 -1
  339. package/dist/skills/composer.js.map +1 -1
  340. package/dist/skills/index.d.ts +1 -0
  341. package/dist/skills/index.d.ts.map +1 -1
  342. package/dist/skills/index.js +1 -0
  343. package/dist/skills/index.js.map +1 -1
  344. package/dist/skills/learned-guidelines.d.ts +33 -0
  345. package/dist/skills/learned-guidelines.d.ts.map +1 -0
  346. package/dist/skills/learned-guidelines.js +291 -0
  347. package/dist/skills/learned-guidelines.js.map +1 -0
  348. package/dist/skills/linter.d.ts.map +1 -1
  349. package/dist/skills/linter.js +1 -3
  350. package/dist/skills/linter.js.map +1 -1
  351. package/dist/skills/runtime-activation.d.ts +1 -0
  352. package/dist/skills/runtime-activation.d.ts.map +1 -1
  353. package/dist/skills/runtime-activation.js +2 -3
  354. package/dist/skills/runtime-activation.js.map +1 -1
  355. package/dist/skills/tool.d.ts.map +1 -1
  356. package/dist/skills/tool.js +26 -21
  357. package/dist/skills/tool.js.map +1 -1
  358. package/dist/skills/trust-cache.d.ts +7 -0
  359. package/dist/skills/trust-cache.d.ts.map +1 -1
  360. package/dist/skills/trust-cache.js +16 -0
  361. package/dist/skills/trust-cache.js.map +1 -1
  362. package/dist/telemetry/agent-workforce-native-event.d.ts.map +1 -1
  363. package/dist/telemetry/agent-workforce-native-event.js +1 -3
  364. package/dist/telemetry/agent-workforce-native-event.js.map +1 -1
  365. package/dist/telemetry/maestro-event-bus.d.ts.map +1 -1
  366. package/dist/telemetry/maestro-event-bus.js +42 -81
  367. package/dist/telemetry/maestro-event-bus.js.map +1 -1
  368. package/dist/telemetry/maestro-platform-replay-fixture.d.ts.map +1 -1
  369. package/dist/telemetry/maestro-platform-replay-fixture.js +1 -3
  370. package/dist/telemetry/maestro-platform-replay-fixture.js.map +1 -1
  371. package/dist/telemetry.d.ts.map +1 -1
  372. package/dist/telemetry.js +54 -43
  373. package/dist/telemetry.js.map +1 -1
  374. package/dist/theme/theme-loader.d.ts.map +1 -1
  375. package/dist/theme/theme-loader.js +1 -3
  376. package/dist/theme/theme-loader.js.map +1 -1
  377. package/dist/tools/apply-patch.d.ts.map +1 -1
  378. package/dist/tools/apply-patch.js +76 -8
  379. package/dist/tools/apply-patch.js.map +1 -1
  380. package/dist/tools/diff-preview.d.ts.map +1 -1
  381. package/dist/tools/diff-preview.js +10 -1
  382. package/dist/tools/diff-preview.js.map +1 -1
  383. package/dist/tools/edit.d.ts.map +1 -1
  384. package/dist/tools/edit.js +17 -0
  385. package/dist/tools/edit.js.map +1 -1
  386. package/dist/tools/write.d.ts.map +1 -1
  387. package/dist/tools/write.js +9 -0
  388. package/dist/tools/write.js.map +1 -1
  389. package/dist/undo/tracker.d.ts +5 -0
  390. package/dist/undo/tracker.d.ts.map +1 -1
  391. package/dist/undo/tracker.js +13 -0
  392. package/dist/undo/tracker.js.map +1 -1
  393. package/dist/utils/fs.d.ts +1 -1
  394. package/dist/utils/fs.d.ts.map +1 -1
  395. package/dist/utils/fs.js +29 -2
  396. package/dist/utils/fs.js.map +1 -1
  397. package/dist/utils/git-stash.d.ts.map +1 -1
  398. package/dist/utils/git-stash.js +15 -8
  399. package/dist/utils/git-stash.js.map +1 -1
  400. package/dist/utils/json.d.ts +11 -0
  401. package/dist/utils/json.d.ts.map +1 -1
  402. package/dist/utils/json.js +9 -0
  403. package/dist/utils/json.js.map +1 -1
  404. package/dist/utils/shell-env.d.ts.map +1 -1
  405. package/dist/utils/shell-env.js +2 -0
  406. package/dist/utils/shell-env.js.map +1 -1
  407. package/dist/utils/url-extractor-git.d.ts +26 -0
  408. package/dist/utils/url-extractor-git.d.ts.map +1 -0
  409. package/dist/utils/url-extractor-git.js +259 -0
  410. package/dist/utils/url-extractor-git.js.map +1 -0
  411. package/dist/utils/url-extractor.d.ts.map +1 -1
  412. package/dist/utils/url-extractor.js +23 -251
  413. package/dist/utils/url-extractor.js.map +1 -1
  414. package/dist/version.json +2 -2
  415. package/dist/web-server.d.ts.map +1 -1
  416. package/dist/web-server.js +2 -5
  417. package/dist/web-server.js.map +1 -1
  418. package/package.json +310 -306
  419. package/skills/incident-triage/SKILL.md +19 -1
  420. package/skills/install-code-review/SKILL.md +69 -0
  421. package/skills/security-review/SKILL.md +68 -0
  422. package/skills/security-review/reference/rubric.md +85 -0
@@ -1 +1 @@
1
- {"version":3,"file":"workspace-trust.js","sourceRoot":"","sources":["../../src/mcp/workspace-trust.ts"],"names":[],"mappings":"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","sourcesContent":["import { execFile } from \"node:child_process\";\nimport { createHash, randomUUID } from \"node:crypto\";\nimport { resolve } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport type { ClientToolExecutionService } from \"../agent/transport.js\";\nimport type { TextContent } from \"../agent/types.js\";\nimport { PATHS } from \"../config/constants.js\";\nimport { readJsonFile, writeJsonFile } from \"../utils/fs.js\";\nimport type {\n\tMcpConfig,\n\tMcpServerConfig,\n\tMcpWorkspaceTrustEntry,\n\tMcpWorkspaceTrustMode,\n} from \"./types.js\";\n\ntype StoredMcpWorkspaceTrust = {\n\tversion: 1;\n\tservers: Record<string, McpWorkspaceTrustEntry[]>;\n};\n\ntype TrustDecision = \"trust_once\" | \"trust_always\" | \"block\" | \"cancel\";\n\nconst execFileAsync = promisify(execFile);\n\nfunction emptyStore(): StoredMcpWorkspaceTrust {\n\treturn {\n\t\tversion: 1,\n\t\tservers: {},\n\t};\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction normalizeTrustEntry(value: unknown): McpWorkspaceTrustEntry | null {\n\tif (!isRecord(value)) {\n\t\treturn null;\n\t}\n\tconst workspaceUri = value.workspaceUri;\n\tconst mode = value.mode;\n\tif (\n\t\ttypeof workspaceUri !== \"string\" ||\n\t\tworkspaceUri.trim().length === 0 ||\n\t\t(mode !== \"trusted\" && mode !== \"ask\" && mode !== \"blocked\")\n\t) {\n\t\treturn null;\n\t}\n\treturn {\n\t\tworkspaceUri: canonicalizeWorkspaceUri(workspaceUri),\n\t\tmode,\n\t\tserverFingerprint:\n\t\t\ttypeof value.serverFingerprint === \"string\"\n\t\t\t\t? value.serverFingerprint\n\t\t\t\t: undefined,\n\t\tgrantedBy:\n\t\t\ttypeof value.grantedBy === \"string\" ? value.grantedBy : undefined,\n\t\tgrantedAt:\n\t\t\ttypeof value.grantedAt === \"string\" ? value.grantedAt : undefined,\n\t\texpiresAt:\n\t\t\ttypeof value.expiresAt === \"string\" ? value.expiresAt : undefined,\n\t\treason: typeof value.reason === \"string\" ? value.reason : undefined,\n\t};\n}\n\nfunction normalizeStore(value: unknown): StoredMcpWorkspaceTrust {\n\tif (!isRecord(value) || value.version !== 1 || !isRecord(value.servers)) {\n\t\treturn emptyStore();\n\t}\n\tconst servers: Record<string, McpWorkspaceTrustEntry[]> = {};\n\tfor (const [serverName, entries] of Object.entries(value.servers)) {\n\t\tif (!Array.isArray(entries)) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst normalized = entries\n\t\t\t.map(normalizeTrustEntry)\n\t\t\t.filter((entry): entry is McpWorkspaceTrustEntry => !!entry);\n\t\tif (normalized.length > 0) {\n\t\t\tservers[serverName] = normalized;\n\t\t}\n\t}\n\treturn { version: 1, servers };\n}\n\nfunction readStore(): StoredMcpWorkspaceTrust {\n\treturn normalizeStore(\n\t\treadJsonFile<unknown>(PATHS.MCP_WORKSPACE_TRUST_FILE, {\n\t\t\tfallback: emptyStore(),\n\t\t}),\n\t);\n}\n\nfunction writeStore(store: StoredMcpWorkspaceTrust): void {\n\twriteJsonFile(PATHS.MCP_WORKSPACE_TRUST_FILE, store);\n}\n\nfunction isExpired(entry: McpWorkspaceTrustEntry, now = Date.now()): boolean {\n\tif (!entry.expiresAt) {\n\t\treturn false;\n\t}\n\tconst expiresAt = Date.parse(entry.expiresAt);\n\treturn !Number.isFinite(expiresAt) || expiresAt <= now;\n}\n\nfunction latestMatchingEntry(\n\tentries: readonly McpWorkspaceTrustEntry[] | undefined,\n\tworkspaceUri: string,\n\toptions: { serverFingerprint?: string } = {},\n): McpWorkspaceTrustEntry | undefined {\n\tif (!entries) {\n\t\treturn undefined;\n\t}\n\tconst canonicalWorkspaceUri = canonicalizeWorkspaceUri(workspaceUri);\n\tfor (let index = entries.length - 1; index >= 0; index -= 1) {\n\t\tconst entry = entries[index];\n\t\tif (!entry || isExpired(entry)) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (\n\t\t\tcanonicalizeWorkspaceUri(entry.workspaceUri) !== canonicalWorkspaceUri\n\t\t) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (\n\t\t\toptions.serverFingerprint &&\n\t\t\tentry.serverFingerprint !== options.serverFingerprint\n\t\t) {\n\t\t\tif (entry.serverFingerprint || entry.mode !== \"blocked\") {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\treturn entry;\n\t}\n\treturn undefined;\n}\n\nfunction resolveConfiguredMcpWorkspaceTrust(options: {\n\tconfig: Pick<McpConfig, \"trustedWorkspaces\" | \"workspaceTrustDefault\">;\n\tserverName: string;\n\tworkspaceUri: string;\n\tserverFingerprint?: string;\n\tstoredTrust?: Record<string, McpWorkspaceTrustEntry[]>;\n}): McpWorkspaceTrustMode {\n\tconst configuredEntries =\n\t\toptions.config.trustedWorkspaces?.[options.serverName];\n\tconst configured = latestMatchingEntry(\n\t\tconfiguredEntries,\n\t\toptions.workspaceUri,\n\t);\n\tif (configured) {\n\t\treturn configured.mode;\n\t}\n\tif (options.config.workspaceTrustDefault === \"untrusted\") {\n\t\treturn \"untrusted\";\n\t}\n\tconst stored = latestMatchingEntry(\n\t\toptions.storedTrust?.[options.serverName],\n\t\toptions.workspaceUri,\n\t\t{ serverFingerprint: options.serverFingerprint },\n\t);\n\tif (stored) {\n\t\treturn stored.mode;\n\t}\n\treturn options.config.workspaceTrustDefault ?? \"ask\";\n}\n\nfunction canonicalizeWorkspaceUri(workspaceUri: string): string {\n\tconst trimmed = workspaceUri.trim();\n\tif (trimmed.startsWith(\"git:\")) {\n\t\treturn `git:${sanitizeGitRemote(trimmed.slice(\"git:\".length))}`;\n\t}\n\treturn trimmed;\n}\n\nfunction sanitizeGitRemote(remote: string): string {\n\tconst trimmed = remote.trim();\n\ttry {\n\t\tconst url = new URL(trimmed);\n\t\turl.username = \"\";\n\t\turl.password = \"\";\n\t\turl.search = \"\";\n\t\turl.hash = \"\";\n\t\treturn url.toString();\n\t} catch {\n\t\treturn trimmed\n\t\t\t.replace(/^[^/@\\s]+@(?=[^/:]+[:/])/, \"\")\n\t\t\t.replace(/[?#].*$/, \"\");\n\t}\n}\n\nfunction normalizeFingerprintValue(value: unknown): unknown {\n\tif (Array.isArray(value)) {\n\t\treturn value.map(normalizeFingerprintValue);\n\t}\n\tif (isRecord(value)) {\n\t\treturn Object.fromEntries(\n\t\t\tObject.entries(value)\n\t\t\t\t.filter(([, entryValue]) => entryValue !== undefined)\n\t\t\t\t.sort(([left], [right]) => left.localeCompare(right))\n\t\t\t\t.map(([key, entryValue]) => [\n\t\t\t\t\tkey,\n\t\t\t\t\tnormalizeFingerprintValue(entryValue),\n\t\t\t\t]),\n\t\t);\n\t}\n\treturn value;\n}\n\nfunction fingerprintMcpServer(server: McpServerConfig): string {\n\tconst identity: McpServerConfig = { ...server };\n\tdelete identity.disabled;\n\tdelete identity.enabled;\n\tdelete identity.scope;\n\treturn createHash(\"sha256\")\n\t\t.update(JSON.stringify(normalizeFingerprintValue(identity)))\n\t\t.digest(\"hex\");\n}\n\nexport async function resolveMcpWorkspaceUri(\n\tworkspaceRoot = process.cwd(),\n): Promise<string> {\n\tconst root = resolve(workspaceRoot);\n\ttry {\n\t\tconst { stdout } = await execFileAsync(\n\t\t\t\"git\",\n\t\t\t[\"-C\", root, \"config\", \"--get\", \"remote.origin.url\"],\n\t\t\t{\n\t\t\t\ttimeout: 1000,\n\t\t\t\twindowsHide: true,\n\t\t\t\tencoding: \"utf8\",\n\t\t\t},\n\t\t);\n\t\tconst remote = stdout.trim();\n\t\tif (remote.length > 0) {\n\t\t\treturn `git:${sanitizeGitRemote(remote)}`;\n\t\t}\n\t} catch {\n\t\t// Non-git workspaces fall back to a canonical local path.\n\t}\n\treturn `file:${root}`;\n}\n\nfunction setMcpWorkspaceTrust(options: {\n\tserverName: string;\n\tworkspaceUri: string;\n\tmode: Exclude<McpWorkspaceTrustMode, \"untrusted\">;\n\tserverFingerprint?: string;\n\tgrantedBy?: string;\n\treason?: string;\n}): void {\n\tconst store = readStore();\n\tconst workspaceUri = canonicalizeWorkspaceUri(options.workspaceUri);\n\tconst entries = (store.servers[options.serverName] ?? []).filter(\n\t\t(entry) =>\n\t\t\tcanonicalizeWorkspaceUri(entry.workspaceUri) !== workspaceUri ||\n\t\t\tentry.serverFingerprint !== options.serverFingerprint,\n\t);\n\tentries.push({\n\t\tworkspaceUri,\n\t\tmode: options.mode,\n\t\tserverFingerprint: options.serverFingerprint,\n\t\tgrantedBy: options.grantedBy,\n\t\tgrantedAt: new Date().toISOString(),\n\t\treason: options.reason,\n\t});\n\tstore.servers[options.serverName] = entries;\n\twriteStore(store);\n}\n\nfunction getDecision(content: TextContent[]): TrustDecision {\n\tconst text = content.find(\n\t\t(item): item is TextContent =>\n\t\t\titem.type === \"text\" && typeof item.text === \"string\",\n\t)?.text;\n\tif (!text) {\n\t\treturn \"cancel\";\n\t}\n\ttry {\n\t\tconst parsed = JSON.parse(text) as unknown;\n\t\tif (!isRecord(parsed)) {\n\t\t\treturn \"cancel\";\n\t\t}\n\t\tif (parsed.action === \"decline\" || parsed.action === \"cancel\") {\n\t\t\treturn \"cancel\";\n\t\t}\n\t\tconst payload = isRecord(parsed.content) ? parsed.content : parsed;\n\t\tconst candidate = payload.decision ?? payload.choice ?? payload.action;\n\t\tif (\n\t\t\tcandidate === \"trust_once\" ||\n\t\t\tcandidate === \"trust_always\" ||\n\t\t\tcandidate === \"block\" ||\n\t\t\tcandidate === \"cancel\"\n\t\t) {\n\t\t\treturn candidate;\n\t\t}\n\t} catch {\n\t\treturn \"cancel\";\n\t}\n\treturn \"cancel\";\n}\n\nexport async function ensureMcpWorkspaceTrusted(options: {\n\tconfig: McpConfig;\n\tserver: McpServerConfig;\n\ttoolName: string;\n\tclientToolService?: ClientToolExecutionService;\n}): Promise<void> {\n\tconst storedTrust = readStore().servers;\n\tconst workspaceUri = await resolveMcpWorkspaceUri(options.config.projectRoot);\n\tconst serverFingerprint = fingerprintMcpServer(options.server);\n\tconst mode = resolveConfiguredMcpWorkspaceTrust({\n\t\tconfig: options.config,\n\t\tserverName: options.server.name,\n\t\tworkspaceUri,\n\t\tserverFingerprint,\n\t\tstoredTrust,\n\t});\n\n\tif (mode === \"trusted\") {\n\t\treturn;\n\t}\n\tif (mode === \"blocked\" || mode === \"untrusted\") {\n\t\tthrow new Error(\n\t\t\t`MCP server \"${options.server.name}\" is not trusted for workspace ${workspaceUri}.`,\n\t\t);\n\t}\n\tif (!options.clientToolService) {\n\t\tthrow new Error(\n\t\t\t`MCP server \"${options.server.name}\" requires workspace trust before invoking \"${options.toolName}\", but no MCP elicitation client is connected.`,\n\t\t);\n\t}\n\n\tconst requestId = `mcp_trust:${options.server.name}:${options.toolName}:${randomUUID()}`;\n\tconst result = await options.clientToolService.requestExecution(\n\t\trequestId,\n\t\t\"mcp_elicitation\",\n\t\t{\n\t\t\tserverName: options.server.name,\n\t\t\trequestId,\n\t\t\tmode: \"form\",\n\t\t\tmessage: `Trust MCP server \"${options.server.name}\" for workspace ${workspaceUri} before calling tool \"${options.toolName}\"?`,\n\t\t\trequestedSchema: {\n\t\t\t\ttype: \"object\",\n\t\t\t\tproperties: {\n\t\t\t\t\tdecision: {\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\ttitle: \"Decision\",\n\t\t\t\t\t\tenum: [\"trust_once\", \"trust_always\", \"block\", \"cancel\"],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\trequired: [\"decision\"],\n\t\t\t},\n\t\t},\n\t);\n\n\tif (result.isError) {\n\t\tthrow new Error(\n\t\t\t`MCP trust prompt failed for server \"${options.server.name}\".`,\n\t\t);\n\t}\n\n\tconst decision = getDecision(result.content as TextContent[]);\n\tif (decision === \"trust_once\") {\n\t\treturn;\n\t}\n\tif (decision === \"trust_always\") {\n\t\tsetMcpWorkspaceTrust({\n\t\t\tserverName: options.server.name,\n\t\t\tworkspaceUri,\n\t\t\tmode: \"trusted\",\n\t\t\tserverFingerprint,\n\t\t\tgrantedBy: \"user\",\n\t\t\treason: `Accepted MCP tool invocation for ${options.toolName}`,\n\t\t});\n\t\treturn;\n\t}\n\tif (decision === \"block\") {\n\t\tsetMcpWorkspaceTrust({\n\t\t\tserverName: options.server.name,\n\t\t\tworkspaceUri,\n\t\t\tmode: \"blocked\",\n\t\t\tserverFingerprint,\n\t\t\tgrantedBy: \"user\",\n\t\t\treason: `Blocked MCP tool invocation for ${options.toolName}`,\n\t\t});\n\t}\n\tthrow new Error(\n\t\t`MCP server \"${options.server.name}\" was not trusted for workspace ${workspaceUri}.`,\n\t);\n}\n"]}
1
+ {"version":3,"file":"workspace-trust.js","sourceRoot":"","sources":["../../src/mcp/workspace-trust.ts"],"names":[],"mappings":"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","sourcesContent":["import { execFile } from \"node:child_process\";\nimport { createHash, randomUUID } from \"node:crypto\";\nimport { resolve } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport type { ClientToolExecutionService } from \"../agent/transport.js\";\nimport type { TextContent } from \"../agent/types.js\";\nimport { PATHS } from \"../config/constants.js\";\nimport { readJsonFile, writeJsonFile } from \"../utils/fs.js\";\nimport { isRecord } from \"../utils/json.js\";\nimport type {\n\tMcpConfig,\n\tMcpServerConfig,\n\tMcpWorkspaceTrustEntry,\n\tMcpWorkspaceTrustMode,\n} from \"./types.js\";\n\ntype StoredMcpWorkspaceTrust = {\n\tversion: 1;\n\tservers: Record<string, McpWorkspaceTrustEntry[]>;\n};\n\ntype TrustDecision = \"trust_once\" | \"trust_always\" | \"block\" | \"cancel\";\n\nconst execFileAsync = promisify(execFile);\n\nfunction emptyStore(): StoredMcpWorkspaceTrust {\n\treturn {\n\t\tversion: 1,\n\t\tservers: {},\n\t};\n}\n\nfunction normalizeTrustEntry(value: unknown): McpWorkspaceTrustEntry | null {\n\tif (!isRecord(value)) {\n\t\treturn null;\n\t}\n\tconst workspaceUri = value.workspaceUri;\n\tconst mode = value.mode;\n\tif (\n\t\ttypeof workspaceUri !== \"string\" ||\n\t\tworkspaceUri.trim().length === 0 ||\n\t\t(mode !== \"trusted\" && mode !== \"ask\" && mode !== \"blocked\")\n\t) {\n\t\treturn null;\n\t}\n\treturn {\n\t\tworkspaceUri: canonicalizeWorkspaceUri(workspaceUri),\n\t\tmode,\n\t\tserverFingerprint:\n\t\t\ttypeof value.serverFingerprint === \"string\"\n\t\t\t\t? value.serverFingerprint\n\t\t\t\t: undefined,\n\t\tgrantedBy:\n\t\t\ttypeof value.grantedBy === \"string\" ? value.grantedBy : undefined,\n\t\tgrantedAt:\n\t\t\ttypeof value.grantedAt === \"string\" ? value.grantedAt : undefined,\n\t\texpiresAt:\n\t\t\ttypeof value.expiresAt === \"string\" ? value.expiresAt : undefined,\n\t\treason: typeof value.reason === \"string\" ? value.reason : undefined,\n\t};\n}\n\nfunction normalizeStore(value: unknown): StoredMcpWorkspaceTrust {\n\tif (!isRecord(value) || value.version !== 1 || !isRecord(value.servers)) {\n\t\treturn emptyStore();\n\t}\n\tconst servers: Record<string, McpWorkspaceTrustEntry[]> = {};\n\tfor (const [serverName, entries] of Object.entries(value.servers)) {\n\t\tif (!Array.isArray(entries)) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst normalized = entries\n\t\t\t.map(normalizeTrustEntry)\n\t\t\t.filter((entry): entry is McpWorkspaceTrustEntry => !!entry);\n\t\tif (normalized.length > 0) {\n\t\t\tservers[serverName] = normalized;\n\t\t}\n\t}\n\treturn { version: 1, servers };\n}\n\nfunction readStore(): StoredMcpWorkspaceTrust {\n\treturn normalizeStore(\n\t\treadJsonFile<unknown>(PATHS.MCP_WORKSPACE_TRUST_FILE, {\n\t\t\tfallback: emptyStore(),\n\t\t}),\n\t);\n}\n\nfunction writeStore(store: StoredMcpWorkspaceTrust): void {\n\twriteJsonFile(PATHS.MCP_WORKSPACE_TRUST_FILE, store);\n}\n\nfunction isExpired(entry: McpWorkspaceTrustEntry, now = Date.now()): boolean {\n\tif (!entry.expiresAt) {\n\t\treturn false;\n\t}\n\tconst expiresAt = Date.parse(entry.expiresAt);\n\treturn !Number.isFinite(expiresAt) || expiresAt <= now;\n}\n\nfunction latestMatchingEntry(\n\tentries: readonly McpWorkspaceTrustEntry[] | undefined,\n\tworkspaceUri: string,\n\toptions: { serverFingerprint?: string } = {},\n): McpWorkspaceTrustEntry | undefined {\n\tif (!entries) {\n\t\treturn undefined;\n\t}\n\tconst canonicalWorkspaceUri = canonicalizeWorkspaceUri(workspaceUri);\n\tfor (let index = entries.length - 1; index >= 0; index -= 1) {\n\t\tconst entry = entries[index];\n\t\tif (!entry || isExpired(entry)) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (\n\t\t\tcanonicalizeWorkspaceUri(entry.workspaceUri) !== canonicalWorkspaceUri\n\t\t) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (\n\t\t\toptions.serverFingerprint &&\n\t\t\tentry.serverFingerprint !== options.serverFingerprint\n\t\t) {\n\t\t\tif (entry.serverFingerprint || entry.mode !== \"blocked\") {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\treturn entry;\n\t}\n\treturn undefined;\n}\n\nfunction resolveConfiguredMcpWorkspaceTrust(options: {\n\tconfig: Pick<McpConfig, \"trustedWorkspaces\" | \"workspaceTrustDefault\">;\n\tserverName: string;\n\tworkspaceUri: string;\n\tserverFingerprint?: string;\n\tstoredTrust?: Record<string, McpWorkspaceTrustEntry[]>;\n}): McpWorkspaceTrustMode {\n\tconst configuredEntries =\n\t\toptions.config.trustedWorkspaces?.[options.serverName];\n\tconst configured = latestMatchingEntry(\n\t\tconfiguredEntries,\n\t\toptions.workspaceUri,\n\t);\n\tif (configured) {\n\t\treturn configured.mode;\n\t}\n\tif (options.config.workspaceTrustDefault === \"untrusted\") {\n\t\treturn \"untrusted\";\n\t}\n\tconst stored = latestMatchingEntry(\n\t\toptions.storedTrust?.[options.serverName],\n\t\toptions.workspaceUri,\n\t\t{ serverFingerprint: options.serverFingerprint },\n\t);\n\tif (stored) {\n\t\treturn stored.mode;\n\t}\n\treturn options.config.workspaceTrustDefault ?? \"ask\";\n}\n\nfunction canonicalizeWorkspaceUri(workspaceUri: string): string {\n\tconst trimmed = workspaceUri.trim();\n\tif (trimmed.startsWith(\"git:\")) {\n\t\treturn `git:${sanitizeGitRemote(trimmed.slice(\"git:\".length))}`;\n\t}\n\treturn trimmed;\n}\n\nfunction sanitizeGitRemote(remote: string): string {\n\tconst trimmed = remote.trim();\n\ttry {\n\t\tconst url = new URL(trimmed);\n\t\turl.username = \"\";\n\t\turl.password = \"\";\n\t\turl.search = \"\";\n\t\turl.hash = \"\";\n\t\treturn url.toString();\n\t} catch {\n\t\treturn trimmed\n\t\t\t.replace(/^[^/@\\s]+@(?=[^/:]+[:/])/, \"\")\n\t\t\t.replace(/[?#].*$/, \"\");\n\t}\n}\n\nfunction normalizeFingerprintValue(value: unknown): unknown {\n\tif (Array.isArray(value)) {\n\t\treturn value.map(normalizeFingerprintValue);\n\t}\n\tif (isRecord(value)) {\n\t\treturn Object.fromEntries(\n\t\t\tObject.entries(value)\n\t\t\t\t.filter(([, entryValue]) => entryValue !== undefined)\n\t\t\t\t.sort(([left], [right]) => left.localeCompare(right))\n\t\t\t\t.map(([key, entryValue]) => [\n\t\t\t\t\tkey,\n\t\t\t\t\tnormalizeFingerprintValue(entryValue),\n\t\t\t\t]),\n\t\t);\n\t}\n\treturn value;\n}\n\nfunction fingerprintMcpServer(server: McpServerConfig): string {\n\tconst identity: McpServerConfig = { ...server };\n\tdelete identity.disabled;\n\tdelete identity.enabled;\n\tdelete identity.scope;\n\treturn createHash(\"sha256\")\n\t\t.update(JSON.stringify(normalizeFingerprintValue(identity)))\n\t\t.digest(\"hex\");\n}\n\nexport async function resolveMcpWorkspaceUri(\n\tworkspaceRoot = process.cwd(),\n): Promise<string> {\n\tconst root = resolve(workspaceRoot);\n\ttry {\n\t\tconst { stdout } = await execFileAsync(\n\t\t\t\"git\",\n\t\t\t[\"-C\", root, \"config\", \"--get\", \"remote.origin.url\"],\n\t\t\t{\n\t\t\t\ttimeout: 1000,\n\t\t\t\twindowsHide: true,\n\t\t\t\tencoding: \"utf8\",\n\t\t\t},\n\t\t);\n\t\tconst remote = stdout.trim();\n\t\tif (remote.length > 0) {\n\t\t\treturn `git:${sanitizeGitRemote(remote)}`;\n\t\t}\n\t} catch {\n\t\t// Non-git workspaces fall back to a canonical local path.\n\t}\n\treturn `file:${root}`;\n}\n\nfunction setMcpWorkspaceTrust(options: {\n\tserverName: string;\n\tworkspaceUri: string;\n\tmode: Exclude<McpWorkspaceTrustMode, \"untrusted\">;\n\tserverFingerprint?: string;\n\tgrantedBy?: string;\n\treason?: string;\n}): void {\n\tconst store = readStore();\n\tconst workspaceUri = canonicalizeWorkspaceUri(options.workspaceUri);\n\tconst entries = (store.servers[options.serverName] ?? []).filter(\n\t\t(entry) =>\n\t\t\tcanonicalizeWorkspaceUri(entry.workspaceUri) !== workspaceUri ||\n\t\t\tentry.serverFingerprint !== options.serverFingerprint,\n\t);\n\tentries.push({\n\t\tworkspaceUri,\n\t\tmode: options.mode,\n\t\tserverFingerprint: options.serverFingerprint,\n\t\tgrantedBy: options.grantedBy,\n\t\tgrantedAt: new Date().toISOString(),\n\t\treason: options.reason,\n\t});\n\tstore.servers[options.serverName] = entries;\n\twriteStore(store);\n}\n\nfunction getDecision(content: TextContent[]): TrustDecision {\n\tconst text = content.find(\n\t\t(item): item is TextContent =>\n\t\t\titem.type === \"text\" && typeof item.text === \"string\",\n\t)?.text;\n\tif (!text) {\n\t\treturn \"cancel\";\n\t}\n\ttry {\n\t\tconst parsed = JSON.parse(text) as unknown;\n\t\tif (!isRecord(parsed)) {\n\t\t\treturn \"cancel\";\n\t\t}\n\t\tif (parsed.action === \"decline\" || parsed.action === \"cancel\") {\n\t\t\treturn \"cancel\";\n\t\t}\n\t\tconst payload = isRecord(parsed.content) ? parsed.content : parsed;\n\t\tconst candidate = payload.decision ?? payload.choice ?? payload.action;\n\t\tif (\n\t\t\tcandidate === \"trust_once\" ||\n\t\t\tcandidate === \"trust_always\" ||\n\t\t\tcandidate === \"block\" ||\n\t\t\tcandidate === \"cancel\"\n\t\t) {\n\t\t\treturn candidate;\n\t\t}\n\t} catch {\n\t\treturn \"cancel\";\n\t}\n\treturn \"cancel\";\n}\n\nexport async function ensureMcpWorkspaceTrusted(options: {\n\tconfig: McpConfig;\n\tserver: McpServerConfig;\n\ttoolName: string;\n\tclientToolService?: ClientToolExecutionService;\n}): Promise<void> {\n\tconst storedTrust = readStore().servers;\n\tconst workspaceUri = await resolveMcpWorkspaceUri(options.config.projectRoot);\n\tconst serverFingerprint = fingerprintMcpServer(options.server);\n\tconst mode = resolveConfiguredMcpWorkspaceTrust({\n\t\tconfig: options.config,\n\t\tserverName: options.server.name,\n\t\tworkspaceUri,\n\t\tserverFingerprint,\n\t\tstoredTrust,\n\t});\n\n\tif (mode === \"trusted\") {\n\t\treturn;\n\t}\n\tif (mode === \"blocked\" || mode === \"untrusted\") {\n\t\tthrow new Error(\n\t\t\t`MCP server \"${options.server.name}\" is not trusted for workspace ${workspaceUri}.`,\n\t\t);\n\t}\n\tif (!options.clientToolService) {\n\t\tthrow new Error(\n\t\t\t`MCP server \"${options.server.name}\" requires workspace trust before invoking \"${options.toolName}\", but no MCP elicitation client is connected.`,\n\t\t);\n\t}\n\n\tconst requestId = `mcp_trust:${options.server.name}:${options.toolName}:${randomUUID()}`;\n\tconst result = await options.clientToolService.requestExecution(\n\t\trequestId,\n\t\t\"mcp_elicitation\",\n\t\t{\n\t\t\tserverName: options.server.name,\n\t\t\trequestId,\n\t\t\tmode: \"form\",\n\t\t\tmessage: `Trust MCP server \"${options.server.name}\" for workspace ${workspaceUri} before calling tool \"${options.toolName}\"?`,\n\t\t\trequestedSchema: {\n\t\t\t\ttype: \"object\",\n\t\t\t\tproperties: {\n\t\t\t\t\tdecision: {\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\ttitle: \"Decision\",\n\t\t\t\t\t\tenum: [\"trust_once\", \"trust_always\", \"block\", \"cancel\"],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\trequired: [\"decision\"],\n\t\t\t},\n\t\t},\n\t);\n\n\tif (result.isError) {\n\t\tthrow new Error(\n\t\t\t`MCP trust prompt failed for server \"${options.server.name}\".`,\n\t\t);\n\t}\n\n\tconst decision = getDecision(result.content as TextContent[]);\n\tif (decision === \"trust_once\") {\n\t\treturn;\n\t}\n\tif (decision === \"trust_always\") {\n\t\tsetMcpWorkspaceTrust({\n\t\t\tserverName: options.server.name,\n\t\t\tworkspaceUri,\n\t\t\tmode: \"trusted\",\n\t\t\tserverFingerprint,\n\t\t\tgrantedBy: \"user\",\n\t\t\treason: `Accepted MCP tool invocation for ${options.toolName}`,\n\t\t});\n\t\treturn;\n\t}\n\tif (decision === \"block\") {\n\t\tsetMcpWorkspaceTrust({\n\t\t\tserverName: options.server.name,\n\t\t\tworkspaceUri,\n\t\t\tmode: \"blocked\",\n\t\t\tserverFingerprint,\n\t\t\tgrantedBy: \"user\",\n\t\t\treason: `Blocked MCP tool invocation for ${options.toolName}`,\n\t\t});\n\t}\n\tthrow new Error(\n\t\t`MCP server \"${options.server.name}\" was not trusted for workspace ${workspaceUri}.`,\n\t);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"service-client.d.ts","sourceRoot":"","sources":["../../src/memory/service-client.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAkZlE,wBAAgB,oCAAoC,IAAI,IAAI,CAE3D;AA0SD,wBAAsB,yBAAyB,CAC9C,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;IACT,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CAChB,GACC,OAAO,CAAC;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAAC,CAa5E;AAED,wBAAsB,2BAA2B,CAChD,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;IACT,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CACf,GACC,OAAO,CAAC,kBAAkB,EAAE,GAAG,IAAI,CAAC,CAmCtC;AAED,wBAAsB,kCAAkC,CAAC,MAAM,EAAE;IAChE,OAAO,CAAC,EAAE;QACT,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,aAAa,EAAE,WAAW,EAAE,CAAC;IAC7B,OAAO,EAAE,KAAK,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;KACd,CAAC,CAAC;CACH,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CA4CtE"}
1
+ {"version":3,"file":"service-client.d.ts","sourceRoot":"","sources":["../../src/memory/service-client.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AA8YlE,wBAAgB,oCAAoC,IAAI,IAAI,CAE3D;AA0SD,wBAAsB,yBAAyB,CAC9C,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;IACT,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CAChB,GACC,OAAO,CAAC;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAAC,CAa5E;AAED,wBAAsB,2BAA2B,CAChD,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;IACT,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CACf,GACC,OAAO,CAAC,kBAAkB,EAAE,GAAG,IAAI,CAAC,CAmCtC;AAED,wBAAsB,kCAAkC,CAAC,MAAM,EAAE;IAChE,OAAO,CAAC,EAAE;QACT,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,aAAa,EAAE,WAAW,EAAE,CAAC;IAC7B,OAAO,EAAE,KAAK,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;KACd,CAAC,CAAC;CACH,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CA4CtE"}
@@ -2,6 +2,7 @@ import { readFileSync } from "node:fs";
2
2
  import { request as httpsRequest, } from "node:https";
3
3
  import { EVALOPS_ACCESS_TOKEN_ENV_VARS, EVALOPS_ORGANIZATION_ID_ENV_VARS, } from "../evalops/env-aliases.js";
4
4
  import { getEnvValue, parsePositiveInt, resolveOrganizationId, resolvePlatformToken, resolveTeamId, } from "../platform/client.js";
5
+ import { isRecord } from "../utils/json.js";
5
6
  import { createLogger } from "../utils/logger.js";
6
7
  import { sanitizeWithStaticMask } from "../utils/secret-redactor.js";
7
8
  import { MemoryClient, MemoryType } from "./platform-memory-client.js";
@@ -105,9 +106,6 @@ function parseServiceTokenExpiresAt(payload, ttlSeconds) {
105
106
  }
106
107
  return Date.now() + ttlSeconds * 1000;
107
108
  }
108
- function isRecord(value) {
109
- return typeof value === "object" && value !== null && !Array.isArray(value);
110
- }
111
109
  function parseServiceTokenResponseBody(value) {
112
110
  if (!isRecord(value)) {
113
111
  return {};
@@ -1 +1 @@
1
- {"version":3,"file":"service-client.js","sourceRoot":"","sources":["../../src/memory/service-client.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFileSync } from \"node:fs\";\nimport type { IncomingMessage } from \"node:http\";\nimport {\n\ttype RequestOptions as HttpsRequestOptions,\n\trequest as httpsRequest,\n} from \"node:https\";\nimport {\n\tEVALOPS_ACCESS_TOKEN_ENV_VARS,\n\tEVALOPS_ORGANIZATION_ID_ENV_VARS,\n} from \"../evalops/env-aliases.js\";\nimport {\n\tgetEnvValue,\n\tparsePositiveInt,\n\tresolveOrganizationId,\n\tresolvePlatformToken,\n\tresolveTeamId,\n} from \"../platform/client.js\";\nimport { createLogger } from \"../utils/logger.js\";\nimport { sanitizeWithStaticMask } from \"../utils/secret-redactor.js\";\nimport { MemoryClient, MemoryType } from \"./platform-memory-client.js\";\nimport { getMemoryProjectScope } from \"./team-memory.js\";\nimport type { MemoryEntry, MemorySearchResult } from \"./types.js\";\n\nconst logger = createLogger(\"memory:service\");\n\nconst MAESTRO_AGENT = \"maestro\";\nconst DURABLE_MEMORY_TAG = \"maestro-kind:durable-memory\";\nconst SOURCE_TAG = \"source:maestro\";\nconst TOPIC_TAG_PREFIX = \"maestro-topic:\";\nconst PROJECT_NAME_TAG_PREFIX = \"maestro-project-name:\";\nconst SESSION_TAG_PREFIX = \"maestro-session:\";\nconst MEMORY_SERVICE_TOKEN_SCOPES = [\n\t\"memories:read\",\n\t\"memories:write\",\n] as const;\nconst DEFAULT_MEMORY_SERVICE_TOKEN_TTL_SECONDS = 300;\nconst SERVICE_TOKEN_EXPIRY_SKEW_MS = 30_000;\n\ntype RemoteMemoryConfig = {\n\tagentId: string;\n\tclient: MemoryClient;\n\tteamId?: string;\n};\n\ntype RemoteMemoryScope = {\n\tprojectId?: string;\n\tprojectName?: string;\n\trepository?: string;\n};\n\ntype ClientMemory = Awaited<\n\tReturnType<MemoryClient[\"list\"]>\n>[\"memories\"][number];\n\ntype TimestampLike = {\n\tnanos?: number;\n\tseconds?: bigint | number | string;\n};\n\ntype MemorySourceReference = {\n\turi: string;\n\ttitle: string;\n\ttype: string;\n\tmetadata?: Record<string, string>;\n};\n\ntype RemoteStoreRequest = Parameters<MemoryClient[\"store\"]>[0] & {\n\tagentId?: string;\n\treviewStatus?: string;\n\tsourceReferences?: MemorySourceReference[];\n};\n\ntype RemoteListRequest = Parameters<MemoryClient[\"list\"]>[0] & {\n\tagentId?: string;\n\treviewStatus?: string;\n};\n\ntype RemoteRecallRequest = Parameters<MemoryClient[\"recall\"]>[0] & {\n\tagentId?: string;\n\treviewStatus?: string;\n};\n\ntype CachedServiceToken = {\n\texpiresAtMs: number;\n\ttoken: string;\n};\n\ntype ServiceTokenResponseBody = {\n\tclaims?: {\n\t\texpires_at?: string;\n\t\texpiresAt?: string;\n\t};\n\texpires_at?: string;\n\texpiresAt?: string;\n\ttoken?: string;\n};\n\nconst memoryServiceTokenCache = new Map<string, CachedServiceToken>();\n\nfunction normalizeTopic(topic: string): string {\n\treturn topic.toLowerCase().trim();\n}\n\nfunction normalizeContent(content: string): string {\n\treturn content.replace(/\\s+/g, \" \").trim();\n}\n\nfunction normalizeTag(tag: string): string {\n\treturn tag.trim().toLowerCase();\n}\n\nfunction mergeTags(\n\tcurrent?: readonly string[],\n\tnext?: readonly string[],\n): string[] | undefined {\n\tconst values = [...(current ?? []), ...(next ?? [])]\n\t\t.map(normalizeTag)\n\t\t.filter(Boolean);\n\tif (values.length === 0) {\n\t\treturn undefined;\n\t}\n\treturn Array.from(new Set(values)).sort();\n}\n\nfunction firstNonEmptyString(\n\t...values: Array<string | undefined>\n): string | undefined {\n\tfor (const value of values) {\n\t\tif (typeof value === \"string\" && value.trim().length > 0) {\n\t\t\treturn value.trim();\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction resolveMemoryAgentId(): string {\n\treturn (\n\t\tgetEnvValue([\"MAESTRO_MEMORY_AGENT_ID\", \"MAESTRO_AGENT_ID\"]) ??\n\t\tMAESTRO_AGENT\n\t);\n}\n\nfunction resolveMemoryServiceTokenUrl(): string | undefined {\n\treturn getEnvValue([\n\t\t\"MAESTRO_MEMORY_IDENTITY_SERVICE_TOKENS_URL\",\n\t\t\"IDENTITY_SERVICE_TOKENS_URL\",\n\t]);\n}\n\nfunction resolveMemoryServiceTokenTtlSeconds(): number {\n\treturn parsePositiveInt(\n\t\tgetEnvValue([\"MAESTRO_MEMORY_SERVICE_TOKEN_TTL_SECONDS\"]),\n\t\tDEFAULT_MEMORY_SERVICE_TOKEN_TTL_SECONDS,\n\t);\n}\n\nfunction resolveMemoryServiceTokenBootstrapKey(): string | undefined {\n\treturn getEnvValue([\n\t\t\"MAESTRO_MEMORY_IDENTITY_BOOTSTRAP_KEY\",\n\t\t\"IDENTITY_BOOTSTRAP_KEY\",\n\t]);\n}\n\nfunction resolveMemoryIdentityTlsOptions(): HttpsRequestOptions {\n\tconst caFile = getEnvValue([\n\t\t\"MAESTRO_MEMORY_IDENTITY_TLS_CA_FILE\",\n\t\t\"IDENTITY_CLIENT_TLS_CA_FILE\",\n\t]);\n\tconst certFile = getEnvValue([\n\t\t\"MAESTRO_MEMORY_IDENTITY_TLS_CERT_FILE\",\n\t\t\"IDENTITY_CLIENT_TLS_CERT_FILE\",\n\t]);\n\tconst keyFile = getEnvValue([\n\t\t\"MAESTRO_MEMORY_IDENTITY_TLS_KEY_FILE\",\n\t\t\"IDENTITY_CLIENT_TLS_KEY_FILE\",\n\t]);\n\tconst servername = getEnvValue([\n\t\t\"MAESTRO_MEMORY_IDENTITY_TLS_SERVER_NAME\",\n\t\t\"IDENTITY_CLIENT_TLS_SERVER_NAME\",\n\t]);\n\n\treturn {\n\t\t...(caFile ? { ca: readFileSync(caFile, \"utf8\") } : {}),\n\t\t...(certFile ? { cert: readFileSync(certFile, \"utf8\") } : {}),\n\t\t...(keyFile ? { key: readFileSync(keyFile, \"utf8\") } : {}),\n\t\t...(servername ? { servername } : {}),\n\t};\n}\n\nfunction serviceTokenCacheValid(\n\tcached: CachedServiceToken | undefined,\n): boolean {\n\treturn Boolean(\n\t\tcached && cached.expiresAtMs - SERVICE_TOKEN_EXPIRY_SKEW_MS > Date.now(),\n\t);\n}\n\nfunction parseServiceTokenExpiresAt(\n\tpayload: ServiceTokenResponseBody,\n\tttlSeconds: number,\n): number {\n\tconst value =\n\t\tpayload.expires_at ??\n\t\tpayload.expiresAt ??\n\t\tpayload.claims?.expires_at ??\n\t\tpayload.claims?.expiresAt;\n\tif (value) {\n\t\tconst parsed = Date.parse(value);\n\t\tif (Number.isFinite(parsed)) {\n\t\t\treturn parsed;\n\t\t}\n\t}\n\treturn Date.now() + ttlSeconds * 1000;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction parseServiceTokenResponseBody(\n\tvalue: unknown,\n): ServiceTokenResponseBody {\n\tif (!isRecord(value)) {\n\t\treturn {};\n\t}\n\tconst claims = isRecord(value.claims) ? value.claims : undefined;\n\treturn {\n\t\ttoken: typeof value.token === \"string\" ? value.token.trim() : undefined,\n\t\texpires_at:\n\t\t\ttypeof value.expires_at === \"string\" ? value.expires_at : undefined,\n\t\texpiresAt:\n\t\t\ttypeof value.expiresAt === \"string\" ? value.expiresAt : undefined,\n\t\tclaims: claims\n\t\t\t? {\n\t\t\t\t\texpires_at:\n\t\t\t\t\t\ttypeof claims.expires_at === \"string\"\n\t\t\t\t\t\t\t? claims.expires_at\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\texpiresAt:\n\t\t\t\t\t\ttypeof claims.expiresAt === \"string\" ? claims.expiresAt : undefined,\n\t\t\t\t}\n\t\t\t: undefined,\n\t};\n}\n\nfunction readResponseBody(response: IncomingMessage): Promise<string> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst chunks: Buffer[] = [];\n\t\tresponse.on(\"data\", (chunk: Buffer | string) => {\n\t\t\tchunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n\t\t});\n\t\tresponse.on(\"end\", () => {\n\t\t\tresolve(Buffer.concat(chunks).toString(\"utf8\"));\n\t\t});\n\t\tresponse.on(\"error\", reject);\n\t});\n}\n\nfunction issueMemoryServiceTokenRequest(\n\turl: string,\n\torganizationId: string,\n\tttlSeconds: number,\n): Promise<string> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst body = JSON.stringify({\n\t\t\tservice: MAESTRO_AGENT,\n\t\t\torganization_id: organizationId,\n\t\t\tscopes: MEMORY_SERVICE_TOKEN_SCOPES,\n\t\t\tttl_seconds: ttlSeconds,\n\t\t});\n\t\tconst parsedUrl = new URL(url);\n\t\tconst bootstrapKey = resolveMemoryServiceTokenBootstrapKey();\n\t\tconst request = httpsRequest(\n\t\t\tparsedUrl,\n\t\t\t{\n\t\t\t\t...resolveMemoryIdentityTlsOptions(),\n\t\t\t\theaders: {\n\t\t\t\t\tAccept: \"application/json\",\n\t\t\t\t\t\"Connect-Protocol-Version\": \"1\",\n\t\t\t\t\t\"Content-Length\": Buffer.byteLength(body).toString(),\n\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\t...(bootstrapKey ? { \"X-Identity-Bootstrap-Key\": bootstrapKey } : {}),\n\t\t\t\t},\n\t\t\t\tmethod: \"POST\",\n\t\t\t},\n\t\t\tasync (response) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst responseBody = await readResponseBody(response);\n\t\t\t\t\tif (response.statusCode !== 200 && response.statusCode !== 201) {\n\t\t\t\t\t\treject(\n\t\t\t\t\t\t\tnew Error(\n\t\t\t\t\t\t\t\t`identity service token request failed with status ${response.statusCode ?? \"unknown\"}`,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tconst parsed = parseServiceTokenResponseBody(\n\t\t\t\t\t\tJSON.parse(responseBody),\n\t\t\t\t\t);\n\t\t\t\t\tif (!parsed.token) {\n\t\t\t\t\t\treject(new Error(\"identity service token response missing token\"));\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tmemoryServiceTokenCache.set(organizationId, {\n\t\t\t\t\t\ttoken: parsed.token,\n\t\t\t\t\t\texpiresAtMs: parseServiceTokenExpiresAt(parsed, ttlSeconds),\n\t\t\t\t\t});\n\t\t\t\t\tresolve(parsed.token);\n\t\t\t\t} catch (error) {\n\t\t\t\t\treject(error);\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t\trequest.on(\"error\", reject);\n\t\trequest.write(body);\n\t\trequest.end();\n\t});\n}\n\nasync function resolveMemoryServiceToken(\n\torganizationId: string,\n): Promise<string | undefined> {\n\tconst url = resolveMemoryServiceTokenUrl();\n\tif (!url) {\n\t\treturn undefined;\n\t}\n\tconst cached = memoryServiceTokenCache.get(organizationId);\n\tif (serviceTokenCacheValid(cached)) {\n\t\treturn cached?.token;\n\t}\n\n\tconst bootstrapKey = resolveMemoryServiceTokenBootstrapKey();\n\tconst certFile = getEnvValue([\n\t\t\"MAESTRO_MEMORY_IDENTITY_TLS_CERT_FILE\",\n\t\t\"IDENTITY_CLIENT_TLS_CERT_FILE\",\n\t]);\n\tconst keyFile = getEnvValue([\n\t\t\"MAESTRO_MEMORY_IDENTITY_TLS_KEY_FILE\",\n\t\t\"IDENTITY_CLIENT_TLS_KEY_FILE\",\n\t]);\n\tif (!bootstrapKey && (!certFile || !keyFile)) {\n\t\treturn undefined;\n\t}\n\n\treturn issueMemoryServiceTokenRequest(\n\t\turl,\n\t\torganizationId,\n\t\tresolveMemoryServiceTokenTtlSeconds(),\n\t);\n}\n\nasync function resolveMemoryAccessToken(\n\torganizationId: string,\n): Promise<string | undefined> {\n\tconst configuredToken = getEnvValue([\n\t\t\"MAESTRO_MEMORY_ACCESS_TOKEN\",\n\t\t...EVALOPS_ACCESS_TOKEN_ENV_VARS,\n\t]);\n\tif (configuredToken) {\n\t\treturn configuredToken;\n\t}\n\n\ttry {\n\t\tconst serviceToken = await resolveMemoryServiceToken(organizationId);\n\t\tif (serviceToken) {\n\t\t\treturn serviceToken;\n\t\t}\n\t} catch (error) {\n\t\tlogger.warn(\n\t\t\t\"Failed to issue identity service token for remote memory; trying OAuth fallback\",\n\t\t\t{ error },\n\t\t);\n\t}\n\n\treturn resolvePlatformToken([]);\n}\n\nasync function resolveRemoteMemoryConfig(): Promise<RemoteMemoryConfig | null> {\n\tconst baseUrl = getEnvValue([\n\t\t\"MAESTRO_MEMORY_BASE\",\n\t\t\"MAESTRO_MEMORY_SERVICE_URL\",\n\t\t\"MAESTRO_PLATFORM_BASE_URL\",\n\t\t\"MAESTRO_EVALOPS_BASE_URL\",\n\t\t\"EVALOPS_BASE_URL\",\n\t]);\n\tif (!baseUrl) {\n\t\treturn null;\n\t}\n\n\tconst organizationId = resolveOrganizationId([\n\t\t\"MAESTRO_MEMORY_ORGANIZATION_ID\",\n\t\t...EVALOPS_ORGANIZATION_ID_ENV_VARS,\n\t]);\n\tif (!organizationId) {\n\t\tlogger.warn(\n\t\t\t\"Remote memory configured without organization id; falling back to local memory store\",\n\t\t);\n\t\treturn null;\n\t}\n\n\tconst token = await resolveMemoryAccessToken(organizationId);\n\tif (!token) {\n\t\tlogger.warn(\n\t\t\t\"Remote memory configured without access token; falling back to local memory store\",\n\t\t);\n\t\treturn null;\n\t}\n\n\treturn {\n\t\tagentId: resolveMemoryAgentId(),\n\t\tclient: new MemoryClient({\n\t\t\tbaseUrl,\n\t\t\taccessToken: token,\n\t\t\torganizationId,\n\t\t}),\n\t\tteamId: resolveTeamId([\n\t\t\t\"MAESTRO_MEMORY_TEAM_ID\",\n\t\t\t\"MAESTRO_EVALOPS_TEAM_ID\",\n\t\t\t\"MAESTRO_LLM_GATEWAY_TEAM_ID\",\n\t\t]),\n\t};\n}\n\nexport function resetMemoryServiceTokenCacheForTests(): void {\n\tmemoryServiceTokenCache.clear();\n}\n\nfunction resolveRemoteScope(options?: {\n\tcwd?: string;\n\tprojectId?: string;\n\tprojectName?: string;\n}): RemoteMemoryScope {\n\tif (options?.projectId !== undefined) {\n\t\treturn {\n\t\t\tprojectId: options.projectId,\n\t\t\tprojectName: options.projectName,\n\t\t\trepository: options.projectId,\n\t\t};\n\t}\n\n\tif (!options?.cwd) {\n\t\treturn {};\n\t}\n\n\tconst scope = getMemoryProjectScope(options.cwd);\n\tif (!scope) {\n\t\treturn {};\n\t}\n\n\treturn {\n\t\tprojectId: scope.projectId,\n\t\tprojectName: scope.projectName,\n\t\trepository: scope.projectId,\n\t};\n}\n\nfunction buildRemoteMemoryTags(\n\ttopic: string,\n\ttags?: readonly string[],\n\tprojectName?: string,\n\tsessionId?: string,\n): string[] {\n\treturn (\n\t\tmergeTags(\n\t\t\t[\n\t\t\t\tSOURCE_TAG,\n\t\t\t\tDURABLE_MEMORY_TAG,\n\t\t\t\t`${TOPIC_TAG_PREFIX}${normalizeTopic(topic)}`,\n\t\t\t\t...(projectName\n\t\t\t\t\t? [`${PROJECT_NAME_TAG_PREFIX}${projectName.trim().toLowerCase()}`]\n\t\t\t\t\t: []),\n\t\t\t\t...(sessionId ? [`${SESSION_TAG_PREFIX}${sessionId.trim()}`] : []),\n\t\t\t],\n\t\t\ttags,\n\t\t) ?? []\n\t);\n}\n\nfunction buildSourceReferences(\n\ttopic: string,\n\tscope: RemoteMemoryScope,\n\toptions?: {\n\t\tsessionId?: string;\n\t},\n): MemorySourceReference[] {\n\tconst references: MemorySourceReference[] = [\n\t\t{\n\t\t\turi: scope.repository\n\t\t\t\t? `repo:${scope.repository}`\n\t\t\t\t: \"maestro://durable-memory\",\n\t\t\ttitle: `Maestro durable memory: ${normalizeTopic(topic)}`,\n\t\t\ttype: \"maestro-durable-memory\",\n\t\t\tmetadata: {\n\t\t\t\tsource: \"maestro\",\n\t\t\t\ttopic: normalizeTopic(topic),\n\t\t\t\t...(scope.projectId ? { projectId: scope.projectId } : {}),\n\t\t\t\t...(scope.projectName ? { projectName: scope.projectName } : {}),\n\t\t\t\t...(scope.repository ? { repository: scope.repository } : {}),\n\t\t\t},\n\t\t},\n\t];\n\tconst sessionId = options?.sessionId?.trim();\n\tif (sessionId) {\n\t\treferences.push({\n\t\t\turi: `maestro://sessions/${sessionId}`,\n\t\t\ttitle: `Maestro session ${sessionId}`,\n\t\t\ttype: \"maestro-session\",\n\t\t\tmetadata: {\n\t\t\t\tsource: \"maestro\",\n\t\t\t\tsessionId,\n\t\t\t\ttopic: normalizeTopic(topic),\n\t\t\t\t...(scope.projectId ? { projectId: scope.projectId } : {}),\n\t\t\t\t...(scope.projectName ? { projectName: scope.projectName } : {}),\n\t\t\t\t...(scope.repository ? { repository: scope.repository } : {}),\n\t\t\t},\n\t\t});\n\t}\n\treturn references;\n}\n\nfunction extractTopicFromTags(tags?: readonly string[]): string | undefined {\n\treturn tags\n\t\t?.find((tag) => normalizeTag(tag).startsWith(TOPIC_TAG_PREFIX))\n\t\t?.slice(TOPIC_TAG_PREFIX.length)\n\t\t.trim();\n}\n\nfunction extractProjectNameFromTags(\n\ttags?: readonly string[],\n): string | undefined {\n\treturn tags\n\t\t?.find((tag) => normalizeTag(tag).startsWith(PROJECT_NAME_TAG_PREFIX))\n\t\t?.slice(PROJECT_NAME_TAG_PREFIX.length)\n\t\t.trim();\n}\n\nfunction isManagedDurableMemory(record: ClientMemory): boolean {\n\treturn (record.tags ?? []).map(normalizeTag).includes(DURABLE_MEMORY_TAG);\n}\n\nfunction timestampToMillis(value: TimestampLike | undefined): number {\n\tif (!value) {\n\t\treturn Date.now();\n\t}\n\n\tlet seconds = 0;\n\tif (typeof value.seconds === \"bigint\") {\n\t\tif (value.seconds > BigInt(Number.MAX_SAFE_INTEGER)) {\n\t\t\treturn Date.now();\n\t\t}\n\t\tseconds = Number(value.seconds);\n\t} else if (typeof value.seconds === \"number\") {\n\t\tseconds = value.seconds;\n\t} else if (typeof value.seconds === \"string\") {\n\t\tseconds = Number.parseInt(value.seconds, 10);\n\t}\n\n\tconst nanos = typeof value.nanos === \"number\" ? value.nanos : 0;\n\tconst millis = seconds * 1000 + Math.floor(nanos / 1_000_000);\n\treturn Number.isFinite(millis) && millis > 0 ? millis : Date.now();\n}\n\nfunction toLocalMemoryEntry(\n\trecord: ClientMemory,\n\tscope: RemoteMemoryScope,\n): MemoryEntry {\n\tconst tags = (record.tags ?? [])\n\t\t.map(normalizeTag)\n\t\t.filter(\n\t\t\t(tag) =>\n\t\t\t\ttag !== SOURCE_TAG &&\n\t\t\t\ttag !== DURABLE_MEMORY_TAG &&\n\t\t\t\t!tag.startsWith(TOPIC_TAG_PREFIX) &&\n\t\t\t\t!tag.startsWith(PROJECT_NAME_TAG_PREFIX) &&\n\t\t\t\t!tag.startsWith(SESSION_TAG_PREFIX),\n\t\t);\n\n\treturn {\n\t\tid: record.id,\n\t\ttopic: extractTopicFromTags(record.tags) ?? \"memory\",\n\t\tcontent: record.content,\n\t\ttags: tags.length > 0 ? tags : undefined,\n\t\tprojectId: firstNonEmptyString(\n\t\t\tscope.projectId,\n\t\t\trecord.projectId,\n\t\t\trecord.repository,\n\t\t),\n\t\tprojectName: firstNonEmptyString(\n\t\t\tscope.projectName,\n\t\t\textractProjectNameFromTags(record.tags),\n\t\t),\n\t\tcreatedAt: timestampToMillis(record.createdAt as TimestampLike | undefined),\n\t\tupdatedAt: timestampToMillis(record.updatedAt as TimestampLike | undefined),\n\t};\n}\n\nfunction requireMemory(\n\tvalue: ClientMemory | undefined,\n\toperation: string,\n): ClientMemory {\n\tif (!value) {\n\t\tthrow new Error(`${operation} returned no memory payload`);\n\t}\n\treturn value;\n}\n\nasync function listRemoteRecordsForScope(\n\tconfig: RemoteMemoryConfig,\n\tscope: RemoteMemoryScope,\n): Promise<ClientMemory[]> {\n\tconst request: RemoteListRequest = {\n\t\ttype: MemoryType.PROJECT,\n\t\tteamId: config.teamId,\n\t\trepository: scope.repository,\n\t\tagent: MAESTRO_AGENT,\n\t\tagentId: config.agentId,\n\t\treviewStatus: \"approved\",\n\t};\n\tconst response = await config.client.list(request);\n\treturn (response.memories ?? []).filter(isManagedDurableMemory);\n}\n\nfunction findMatchingRemoteRecord(\n\trecords: ClientMemory[],\n\ttopic: string,\n\tcontent: string,\n): ClientMemory | undefined {\n\tconst normalizedTopic = normalizeTopic(topic);\n\tconst normalizedContent = normalizeContent(content).toLowerCase();\n\treturn records.find(\n\t\t(record) =>\n\t\t\textractTopicFromTags(record.tags) === normalizedTopic &&\n\t\t\tnormalizeContent(record.content).toLowerCase() === normalizedContent,\n\t);\n}\n\nasync function upsertRemoteDurableMemoryWithConfig(\n\tconfig: RemoteMemoryConfig,\n\tscope: RemoteMemoryScope,\n\ttopic: string,\n\tcontent: string,\n\toptions?: {\n\t\texistingRecords?: ClientMemory[];\n\t\tsessionId?: string;\n\t\ttags?: string[];\n\t},\n): Promise<{ entry: MemoryEntry; created: boolean; updated: boolean }> {\n\tconst nextContent = normalizeContent(content);\n\tconst nextTags = buildRemoteMemoryTags(\n\t\ttopic,\n\t\toptions?.tags,\n\t\tscope.projectName,\n\t\toptions?.sessionId,\n\t);\n\tconst existingRecords =\n\t\toptions?.existingRecords ??\n\t\t(await listRemoteRecordsForScope(config, scope));\n\tconst existing = findMatchingRemoteRecord(\n\t\texistingRecords,\n\t\ttopic,\n\t\tnextContent,\n\t);\n\n\tif (!existing) {\n\t\tconst request: RemoteStoreRequest = {\n\t\t\ttype: MemoryType.PROJECT,\n\t\t\tcontent: nextContent,\n\t\t\tteamId: config.teamId,\n\t\t\trepository: scope.repository,\n\t\t\tagent: MAESTRO_AGENT,\n\t\t\tagentId: config.agentId,\n\t\t\ttags: nextTags,\n\t\t\treviewStatus: \"approved\",\n\t\t\tsourceReferences: buildSourceReferences(topic, scope, {\n\t\t\t\tsessionId: options?.sessionId,\n\t\t\t}),\n\t\t};\n\t\tconst created = requireMemory(\n\t\t\t(await config.client.store(request)).memory,\n\t\t\t\"store memory\",\n\t\t);\n\t\treturn {\n\t\t\tentry: toLocalMemoryEntry(created, scope),\n\t\t\tcreated: true,\n\t\t\tupdated: false,\n\t\t};\n\t}\n\n\tconst mergedTags = mergeTags(existing.tags, nextTags);\n\tconst nextTagsStable = mergedTags ?? [];\n\tconst currentTagsStable = mergeTags(existing.tags) ?? [];\n\tconst tagsChanged =\n\t\tnextTagsStable.length !== currentTagsStable.length ||\n\t\tnextTagsStable.some((tag, index) => currentTagsStable[index] !== tag);\n\tif (!tagsChanged && normalizeContent(existing.content) === nextContent) {\n\t\treturn {\n\t\t\tentry: toLocalMemoryEntry(existing, scope),\n\t\t\tcreated: false,\n\t\t\tupdated: false,\n\t\t};\n\t}\n\n\tconst updated = requireMemory(\n\t\t(\n\t\t\tawait config.client.update({\n\t\t\t\tid: existing.id,\n\t\t\t\tcontent: nextContent,\n\t\t\t\treviewStatus: \"approved\",\n\t\t\t\tsourceReferences: buildSourceReferences(topic, scope, {\n\t\t\t\t\tsessionId: options?.sessionId,\n\t\t\t\t}),\n\t\t\t\ttags: mergedTags ?? [],\n\t\t\t})\n\t\t).memory,\n\t\t\"update memory\",\n\t);\n\treturn {\n\t\tentry: toLocalMemoryEntry(updated, scope),\n\t\tcreated: false,\n\t\tupdated: true,\n\t};\n}\n\nexport async function upsertRemoteDurableMemory(\n\ttopic: string,\n\tcontent: string,\n\toptions?: {\n\t\tcwd?: string;\n\t\tprojectId?: string;\n\t\tprojectName?: string;\n\t\tsessionId?: string;\n\t\ttags?: string[];\n\t},\n): Promise<{ entry: MemoryEntry; created: boolean; updated: boolean } | null> {\n\tconst config = await resolveRemoteMemoryConfig();\n\tif (!config) {\n\t\treturn null;\n\t}\n\n\treturn upsertRemoteDurableMemoryWithConfig(\n\t\tconfig,\n\t\tresolveRemoteScope(options),\n\t\ttopic,\n\t\tcontent,\n\t\t{ sessionId: options?.sessionId, tags: options?.tags },\n\t);\n}\n\nexport async function recallRemoteDurableMemories(\n\tquery: string,\n\toptions?: {\n\t\tcwd?: string;\n\t\tlimit?: number;\n\t},\n): Promise<MemorySearchResult[] | null> {\n\tconst config = await resolveRemoteMemoryConfig();\n\tif (!config) {\n\t\treturn null;\n\t}\n\n\tconst scope = resolveRemoteScope(options);\n\ttry {\n\t\tconst request: RemoteRecallRequest = {\n\t\t\tquery,\n\t\t\tlimit: options?.limit ?? 10,\n\t\t\ttype: MemoryType.PROJECT,\n\t\t\tteamId: config.teamId,\n\t\t\trepository: scope.repository,\n\t\t\tagent: MAESTRO_AGENT,\n\t\t\tagentId: config.agentId,\n\t\t\treviewStatus: \"approved\",\n\t\t};\n\t\tconst response = await config.client.recall(request);\n\t\treturn (response.memories ?? [])\n\t\t\t.filter(isManagedDurableMemory)\n\t\t\t.map((memory) => ({\n\t\t\t\tentry: toLocalMemoryEntry(memory, scope),\n\t\t\t\tscore: Number(memory.score ?? 0),\n\t\t\t\tmatchedOn: \"content\" as const,\n\t\t\t}));\n\t} catch (error) {\n\t\tlogger.warn(\"Remote memory recall failed; using local fallback\", {\n\t\t\terror: sanitizeWithStaticMask(\n\t\t\t\terror instanceof Error ? error.message : String(error),\n\t\t\t),\n\t\t\tprojectId: scope.projectId,\n\t\t});\n\t\treturn null;\n\t}\n}\n\nexport async function applyRemoteAutoMemoryConsolidation(params: {\n\toptions?: {\n\t\tcwd?: string;\n\t\tprojectId?: string;\n\t\tprojectName?: string;\n\t};\n\tremoveEntries: MemoryEntry[];\n\tupserts: Array<{\n\t\tcontent: string;\n\t\ttags?: string[];\n\t\ttopic: string;\n\t}>;\n}): Promise<{ removed: number; added: number; updated: number } | null> {\n\tconst config = await resolveRemoteMemoryConfig();\n\tif (!config) {\n\t\treturn null;\n\t}\n\n\tconst scope = resolveRemoteScope(params.options);\n\tconst existingRecords = await listRemoteRecordsForScope(config, scope);\n\n\tlet removed = 0;\n\tfor (const entry of params.removeEntries) {\n\t\tconst existing = findMatchingRemoteRecord(\n\t\t\texistingRecords,\n\t\t\tentry.topic,\n\t\t\tentry.content,\n\t\t);\n\t\tif (!existing) {\n\t\t\tcontinue;\n\t\t}\n\t\tawait config.client.delete({ id: existing.id });\n\t\tremoved += 1;\n\t}\n\n\tlet added = 0;\n\tlet updated = 0;\n\tfor (const upsert of params.upserts) {\n\t\tconst result = await upsertRemoteDurableMemoryWithConfig(\n\t\t\tconfig,\n\t\t\tscope,\n\t\t\tupsert.topic,\n\t\t\tupsert.content,\n\t\t\t{\n\t\t\t\ttags: [\"auto\", \"durable\", \"consolidated\", ...(upsert.tags ?? [])],\n\t\t\t\texistingRecords,\n\t\t\t},\n\t\t);\n\t\tif (result.created) {\n\t\t\tadded += 1;\n\t\t} else if (result.updated) {\n\t\t\tupdated += 1;\n\t\t}\n\t}\n\n\treturn { removed, added, updated };\n}\n"]}
1
+ {"version":3,"file":"service-client.js","sourceRoot":"","sources":["../../src/memory/service-client.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFileSync } from \"node:fs\";\nimport type { IncomingMessage } from \"node:http\";\nimport {\n\ttype RequestOptions as HttpsRequestOptions,\n\trequest as httpsRequest,\n} from \"node:https\";\nimport {\n\tEVALOPS_ACCESS_TOKEN_ENV_VARS,\n\tEVALOPS_ORGANIZATION_ID_ENV_VARS,\n} from \"../evalops/env-aliases.js\";\nimport {\n\tgetEnvValue,\n\tparsePositiveInt,\n\tresolveOrganizationId,\n\tresolvePlatformToken,\n\tresolveTeamId,\n} from \"../platform/client.js\";\nimport { isRecord } from \"../utils/json.js\";\nimport { createLogger } from \"../utils/logger.js\";\nimport { sanitizeWithStaticMask } from \"../utils/secret-redactor.js\";\nimport { MemoryClient, MemoryType } from \"./platform-memory-client.js\";\nimport { getMemoryProjectScope } from \"./team-memory.js\";\nimport type { MemoryEntry, MemorySearchResult } from \"./types.js\";\n\nconst logger = createLogger(\"memory:service\");\n\nconst MAESTRO_AGENT = \"maestro\";\nconst DURABLE_MEMORY_TAG = \"maestro-kind:durable-memory\";\nconst SOURCE_TAG = \"source:maestro\";\nconst TOPIC_TAG_PREFIX = \"maestro-topic:\";\nconst PROJECT_NAME_TAG_PREFIX = \"maestro-project-name:\";\nconst SESSION_TAG_PREFIX = \"maestro-session:\";\nconst MEMORY_SERVICE_TOKEN_SCOPES = [\n\t\"memories:read\",\n\t\"memories:write\",\n] as const;\nconst DEFAULT_MEMORY_SERVICE_TOKEN_TTL_SECONDS = 300;\nconst SERVICE_TOKEN_EXPIRY_SKEW_MS = 30_000;\n\ntype RemoteMemoryConfig = {\n\tagentId: string;\n\tclient: MemoryClient;\n\tteamId?: string;\n};\n\ntype RemoteMemoryScope = {\n\tprojectId?: string;\n\tprojectName?: string;\n\trepository?: string;\n};\n\ntype ClientMemory = Awaited<\n\tReturnType<MemoryClient[\"list\"]>\n>[\"memories\"][number];\n\ntype TimestampLike = {\n\tnanos?: number;\n\tseconds?: bigint | number | string;\n};\n\ntype MemorySourceReference = {\n\turi: string;\n\ttitle: string;\n\ttype: string;\n\tmetadata?: Record<string, string>;\n};\n\ntype RemoteStoreRequest = Parameters<MemoryClient[\"store\"]>[0] & {\n\tagentId?: string;\n\treviewStatus?: string;\n\tsourceReferences?: MemorySourceReference[];\n};\n\ntype RemoteListRequest = Parameters<MemoryClient[\"list\"]>[0] & {\n\tagentId?: string;\n\treviewStatus?: string;\n};\n\ntype RemoteRecallRequest = Parameters<MemoryClient[\"recall\"]>[0] & {\n\tagentId?: string;\n\treviewStatus?: string;\n};\n\ntype CachedServiceToken = {\n\texpiresAtMs: number;\n\ttoken: string;\n};\n\ntype ServiceTokenResponseBody = {\n\tclaims?: {\n\t\texpires_at?: string;\n\t\texpiresAt?: string;\n\t};\n\texpires_at?: string;\n\texpiresAt?: string;\n\ttoken?: string;\n};\n\nconst memoryServiceTokenCache = new Map<string, CachedServiceToken>();\n\nfunction normalizeTopic(topic: string): string {\n\treturn topic.toLowerCase().trim();\n}\n\nfunction normalizeContent(content: string): string {\n\treturn content.replace(/\\s+/g, \" \").trim();\n}\n\nfunction normalizeTag(tag: string): string {\n\treturn tag.trim().toLowerCase();\n}\n\nfunction mergeTags(\n\tcurrent?: readonly string[],\n\tnext?: readonly string[],\n): string[] | undefined {\n\tconst values = [...(current ?? []), ...(next ?? [])]\n\t\t.map(normalizeTag)\n\t\t.filter(Boolean);\n\tif (values.length === 0) {\n\t\treturn undefined;\n\t}\n\treturn Array.from(new Set(values)).sort();\n}\n\nfunction firstNonEmptyString(\n\t...values: Array<string | undefined>\n): string | undefined {\n\tfor (const value of values) {\n\t\tif (typeof value === \"string\" && value.trim().length > 0) {\n\t\t\treturn value.trim();\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction resolveMemoryAgentId(): string {\n\treturn (\n\t\tgetEnvValue([\"MAESTRO_MEMORY_AGENT_ID\", \"MAESTRO_AGENT_ID\"]) ??\n\t\tMAESTRO_AGENT\n\t);\n}\n\nfunction resolveMemoryServiceTokenUrl(): string | undefined {\n\treturn getEnvValue([\n\t\t\"MAESTRO_MEMORY_IDENTITY_SERVICE_TOKENS_URL\",\n\t\t\"IDENTITY_SERVICE_TOKENS_URL\",\n\t]);\n}\n\nfunction resolveMemoryServiceTokenTtlSeconds(): number {\n\treturn parsePositiveInt(\n\t\tgetEnvValue([\"MAESTRO_MEMORY_SERVICE_TOKEN_TTL_SECONDS\"]),\n\t\tDEFAULT_MEMORY_SERVICE_TOKEN_TTL_SECONDS,\n\t);\n}\n\nfunction resolveMemoryServiceTokenBootstrapKey(): string | undefined {\n\treturn getEnvValue([\n\t\t\"MAESTRO_MEMORY_IDENTITY_BOOTSTRAP_KEY\",\n\t\t\"IDENTITY_BOOTSTRAP_KEY\",\n\t]);\n}\n\nfunction resolveMemoryIdentityTlsOptions(): HttpsRequestOptions {\n\tconst caFile = getEnvValue([\n\t\t\"MAESTRO_MEMORY_IDENTITY_TLS_CA_FILE\",\n\t\t\"IDENTITY_CLIENT_TLS_CA_FILE\",\n\t]);\n\tconst certFile = getEnvValue([\n\t\t\"MAESTRO_MEMORY_IDENTITY_TLS_CERT_FILE\",\n\t\t\"IDENTITY_CLIENT_TLS_CERT_FILE\",\n\t]);\n\tconst keyFile = getEnvValue([\n\t\t\"MAESTRO_MEMORY_IDENTITY_TLS_KEY_FILE\",\n\t\t\"IDENTITY_CLIENT_TLS_KEY_FILE\",\n\t]);\n\tconst servername = getEnvValue([\n\t\t\"MAESTRO_MEMORY_IDENTITY_TLS_SERVER_NAME\",\n\t\t\"IDENTITY_CLIENT_TLS_SERVER_NAME\",\n\t]);\n\n\treturn {\n\t\t...(caFile ? { ca: readFileSync(caFile, \"utf8\") } : {}),\n\t\t...(certFile ? { cert: readFileSync(certFile, \"utf8\") } : {}),\n\t\t...(keyFile ? { key: readFileSync(keyFile, \"utf8\") } : {}),\n\t\t...(servername ? { servername } : {}),\n\t};\n}\n\nfunction serviceTokenCacheValid(\n\tcached: CachedServiceToken | undefined,\n): boolean {\n\treturn Boolean(\n\t\tcached && cached.expiresAtMs - SERVICE_TOKEN_EXPIRY_SKEW_MS > Date.now(),\n\t);\n}\n\nfunction parseServiceTokenExpiresAt(\n\tpayload: ServiceTokenResponseBody,\n\tttlSeconds: number,\n): number {\n\tconst value =\n\t\tpayload.expires_at ??\n\t\tpayload.expiresAt ??\n\t\tpayload.claims?.expires_at ??\n\t\tpayload.claims?.expiresAt;\n\tif (value) {\n\t\tconst parsed = Date.parse(value);\n\t\tif (Number.isFinite(parsed)) {\n\t\t\treturn parsed;\n\t\t}\n\t}\n\treturn Date.now() + ttlSeconds * 1000;\n}\n\nfunction parseServiceTokenResponseBody(\n\tvalue: unknown,\n): ServiceTokenResponseBody {\n\tif (!isRecord(value)) {\n\t\treturn {};\n\t}\n\tconst claims = isRecord(value.claims) ? value.claims : undefined;\n\treturn {\n\t\ttoken: typeof value.token === \"string\" ? value.token.trim() : undefined,\n\t\texpires_at:\n\t\t\ttypeof value.expires_at === \"string\" ? value.expires_at : undefined,\n\t\texpiresAt:\n\t\t\ttypeof value.expiresAt === \"string\" ? value.expiresAt : undefined,\n\t\tclaims: claims\n\t\t\t? {\n\t\t\t\t\texpires_at:\n\t\t\t\t\t\ttypeof claims.expires_at === \"string\"\n\t\t\t\t\t\t\t? claims.expires_at\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\texpiresAt:\n\t\t\t\t\t\ttypeof claims.expiresAt === \"string\" ? claims.expiresAt : undefined,\n\t\t\t\t}\n\t\t\t: undefined,\n\t};\n}\n\nfunction readResponseBody(response: IncomingMessage): Promise<string> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst chunks: Buffer[] = [];\n\t\tresponse.on(\"data\", (chunk: Buffer | string) => {\n\t\t\tchunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n\t\t});\n\t\tresponse.on(\"end\", () => {\n\t\t\tresolve(Buffer.concat(chunks).toString(\"utf8\"));\n\t\t});\n\t\tresponse.on(\"error\", reject);\n\t});\n}\n\nfunction issueMemoryServiceTokenRequest(\n\turl: string,\n\torganizationId: string,\n\tttlSeconds: number,\n): Promise<string> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst body = JSON.stringify({\n\t\t\tservice: MAESTRO_AGENT,\n\t\t\torganization_id: organizationId,\n\t\t\tscopes: MEMORY_SERVICE_TOKEN_SCOPES,\n\t\t\tttl_seconds: ttlSeconds,\n\t\t});\n\t\tconst parsedUrl = new URL(url);\n\t\tconst bootstrapKey = resolveMemoryServiceTokenBootstrapKey();\n\t\tconst request = httpsRequest(\n\t\t\tparsedUrl,\n\t\t\t{\n\t\t\t\t...resolveMemoryIdentityTlsOptions(),\n\t\t\t\theaders: {\n\t\t\t\t\tAccept: \"application/json\",\n\t\t\t\t\t\"Connect-Protocol-Version\": \"1\",\n\t\t\t\t\t\"Content-Length\": Buffer.byteLength(body).toString(),\n\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\t...(bootstrapKey ? { \"X-Identity-Bootstrap-Key\": bootstrapKey } : {}),\n\t\t\t\t},\n\t\t\t\tmethod: \"POST\",\n\t\t\t},\n\t\t\tasync (response) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst responseBody = await readResponseBody(response);\n\t\t\t\t\tif (response.statusCode !== 200 && response.statusCode !== 201) {\n\t\t\t\t\t\treject(\n\t\t\t\t\t\t\tnew Error(\n\t\t\t\t\t\t\t\t`identity service token request failed with status ${response.statusCode ?? \"unknown\"}`,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tconst parsed = parseServiceTokenResponseBody(\n\t\t\t\t\t\tJSON.parse(responseBody),\n\t\t\t\t\t);\n\t\t\t\t\tif (!parsed.token) {\n\t\t\t\t\t\treject(new Error(\"identity service token response missing token\"));\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tmemoryServiceTokenCache.set(organizationId, {\n\t\t\t\t\t\ttoken: parsed.token,\n\t\t\t\t\t\texpiresAtMs: parseServiceTokenExpiresAt(parsed, ttlSeconds),\n\t\t\t\t\t});\n\t\t\t\t\tresolve(parsed.token);\n\t\t\t\t} catch (error) {\n\t\t\t\t\treject(error);\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t\trequest.on(\"error\", reject);\n\t\trequest.write(body);\n\t\trequest.end();\n\t});\n}\n\nasync function resolveMemoryServiceToken(\n\torganizationId: string,\n): Promise<string | undefined> {\n\tconst url = resolveMemoryServiceTokenUrl();\n\tif (!url) {\n\t\treturn undefined;\n\t}\n\tconst cached = memoryServiceTokenCache.get(organizationId);\n\tif (serviceTokenCacheValid(cached)) {\n\t\treturn cached?.token;\n\t}\n\n\tconst bootstrapKey = resolveMemoryServiceTokenBootstrapKey();\n\tconst certFile = getEnvValue([\n\t\t\"MAESTRO_MEMORY_IDENTITY_TLS_CERT_FILE\",\n\t\t\"IDENTITY_CLIENT_TLS_CERT_FILE\",\n\t]);\n\tconst keyFile = getEnvValue([\n\t\t\"MAESTRO_MEMORY_IDENTITY_TLS_KEY_FILE\",\n\t\t\"IDENTITY_CLIENT_TLS_KEY_FILE\",\n\t]);\n\tif (!bootstrapKey && (!certFile || !keyFile)) {\n\t\treturn undefined;\n\t}\n\n\treturn issueMemoryServiceTokenRequest(\n\t\turl,\n\t\torganizationId,\n\t\tresolveMemoryServiceTokenTtlSeconds(),\n\t);\n}\n\nasync function resolveMemoryAccessToken(\n\torganizationId: string,\n): Promise<string | undefined> {\n\tconst configuredToken = getEnvValue([\n\t\t\"MAESTRO_MEMORY_ACCESS_TOKEN\",\n\t\t...EVALOPS_ACCESS_TOKEN_ENV_VARS,\n\t]);\n\tif (configuredToken) {\n\t\treturn configuredToken;\n\t}\n\n\ttry {\n\t\tconst serviceToken = await resolveMemoryServiceToken(organizationId);\n\t\tif (serviceToken) {\n\t\t\treturn serviceToken;\n\t\t}\n\t} catch (error) {\n\t\tlogger.warn(\n\t\t\t\"Failed to issue identity service token for remote memory; trying OAuth fallback\",\n\t\t\t{ error },\n\t\t);\n\t}\n\n\treturn resolvePlatformToken([]);\n}\n\nasync function resolveRemoteMemoryConfig(): Promise<RemoteMemoryConfig | null> {\n\tconst baseUrl = getEnvValue([\n\t\t\"MAESTRO_MEMORY_BASE\",\n\t\t\"MAESTRO_MEMORY_SERVICE_URL\",\n\t\t\"MAESTRO_PLATFORM_BASE_URL\",\n\t\t\"MAESTRO_EVALOPS_BASE_URL\",\n\t\t\"EVALOPS_BASE_URL\",\n\t]);\n\tif (!baseUrl) {\n\t\treturn null;\n\t}\n\n\tconst organizationId = resolveOrganizationId([\n\t\t\"MAESTRO_MEMORY_ORGANIZATION_ID\",\n\t\t...EVALOPS_ORGANIZATION_ID_ENV_VARS,\n\t]);\n\tif (!organizationId) {\n\t\tlogger.warn(\n\t\t\t\"Remote memory configured without organization id; falling back to local memory store\",\n\t\t);\n\t\treturn null;\n\t}\n\n\tconst token = await resolveMemoryAccessToken(organizationId);\n\tif (!token) {\n\t\tlogger.warn(\n\t\t\t\"Remote memory configured without access token; falling back to local memory store\",\n\t\t);\n\t\treturn null;\n\t}\n\n\treturn {\n\t\tagentId: resolveMemoryAgentId(),\n\t\tclient: new MemoryClient({\n\t\t\tbaseUrl,\n\t\t\taccessToken: token,\n\t\t\torganizationId,\n\t\t}),\n\t\tteamId: resolveTeamId([\n\t\t\t\"MAESTRO_MEMORY_TEAM_ID\",\n\t\t\t\"MAESTRO_EVALOPS_TEAM_ID\",\n\t\t\t\"MAESTRO_LLM_GATEWAY_TEAM_ID\",\n\t\t]),\n\t};\n}\n\nexport function resetMemoryServiceTokenCacheForTests(): void {\n\tmemoryServiceTokenCache.clear();\n}\n\nfunction resolveRemoteScope(options?: {\n\tcwd?: string;\n\tprojectId?: string;\n\tprojectName?: string;\n}): RemoteMemoryScope {\n\tif (options?.projectId !== undefined) {\n\t\treturn {\n\t\t\tprojectId: options.projectId,\n\t\t\tprojectName: options.projectName,\n\t\t\trepository: options.projectId,\n\t\t};\n\t}\n\n\tif (!options?.cwd) {\n\t\treturn {};\n\t}\n\n\tconst scope = getMemoryProjectScope(options.cwd);\n\tif (!scope) {\n\t\treturn {};\n\t}\n\n\treturn {\n\t\tprojectId: scope.projectId,\n\t\tprojectName: scope.projectName,\n\t\trepository: scope.projectId,\n\t};\n}\n\nfunction buildRemoteMemoryTags(\n\ttopic: string,\n\ttags?: readonly string[],\n\tprojectName?: string,\n\tsessionId?: string,\n): string[] {\n\treturn (\n\t\tmergeTags(\n\t\t\t[\n\t\t\t\tSOURCE_TAG,\n\t\t\t\tDURABLE_MEMORY_TAG,\n\t\t\t\t`${TOPIC_TAG_PREFIX}${normalizeTopic(topic)}`,\n\t\t\t\t...(projectName\n\t\t\t\t\t? [`${PROJECT_NAME_TAG_PREFIX}${projectName.trim().toLowerCase()}`]\n\t\t\t\t\t: []),\n\t\t\t\t...(sessionId ? [`${SESSION_TAG_PREFIX}${sessionId.trim()}`] : []),\n\t\t\t],\n\t\t\ttags,\n\t\t) ?? []\n\t);\n}\n\nfunction buildSourceReferences(\n\ttopic: string,\n\tscope: RemoteMemoryScope,\n\toptions?: {\n\t\tsessionId?: string;\n\t},\n): MemorySourceReference[] {\n\tconst references: MemorySourceReference[] = [\n\t\t{\n\t\t\turi: scope.repository\n\t\t\t\t? `repo:${scope.repository}`\n\t\t\t\t: \"maestro://durable-memory\",\n\t\t\ttitle: `Maestro durable memory: ${normalizeTopic(topic)}`,\n\t\t\ttype: \"maestro-durable-memory\",\n\t\t\tmetadata: {\n\t\t\t\tsource: \"maestro\",\n\t\t\t\ttopic: normalizeTopic(topic),\n\t\t\t\t...(scope.projectId ? { projectId: scope.projectId } : {}),\n\t\t\t\t...(scope.projectName ? { projectName: scope.projectName } : {}),\n\t\t\t\t...(scope.repository ? { repository: scope.repository } : {}),\n\t\t\t},\n\t\t},\n\t];\n\tconst sessionId = options?.sessionId?.trim();\n\tif (sessionId) {\n\t\treferences.push({\n\t\t\turi: `maestro://sessions/${sessionId}`,\n\t\t\ttitle: `Maestro session ${sessionId}`,\n\t\t\ttype: \"maestro-session\",\n\t\t\tmetadata: {\n\t\t\t\tsource: \"maestro\",\n\t\t\t\tsessionId,\n\t\t\t\ttopic: normalizeTopic(topic),\n\t\t\t\t...(scope.projectId ? { projectId: scope.projectId } : {}),\n\t\t\t\t...(scope.projectName ? { projectName: scope.projectName } : {}),\n\t\t\t\t...(scope.repository ? { repository: scope.repository } : {}),\n\t\t\t},\n\t\t});\n\t}\n\treturn references;\n}\n\nfunction extractTopicFromTags(tags?: readonly string[]): string | undefined {\n\treturn tags\n\t\t?.find((tag) => normalizeTag(tag).startsWith(TOPIC_TAG_PREFIX))\n\t\t?.slice(TOPIC_TAG_PREFIX.length)\n\t\t.trim();\n}\n\nfunction extractProjectNameFromTags(\n\ttags?: readonly string[],\n): string | undefined {\n\treturn tags\n\t\t?.find((tag) => normalizeTag(tag).startsWith(PROJECT_NAME_TAG_PREFIX))\n\t\t?.slice(PROJECT_NAME_TAG_PREFIX.length)\n\t\t.trim();\n}\n\nfunction isManagedDurableMemory(record: ClientMemory): boolean {\n\treturn (record.tags ?? []).map(normalizeTag).includes(DURABLE_MEMORY_TAG);\n}\n\nfunction timestampToMillis(value: TimestampLike | undefined): number {\n\tif (!value) {\n\t\treturn Date.now();\n\t}\n\n\tlet seconds = 0;\n\tif (typeof value.seconds === \"bigint\") {\n\t\tif (value.seconds > BigInt(Number.MAX_SAFE_INTEGER)) {\n\t\t\treturn Date.now();\n\t\t}\n\t\tseconds = Number(value.seconds);\n\t} else if (typeof value.seconds === \"number\") {\n\t\tseconds = value.seconds;\n\t} else if (typeof value.seconds === \"string\") {\n\t\tseconds = Number.parseInt(value.seconds, 10);\n\t}\n\n\tconst nanos = typeof value.nanos === \"number\" ? value.nanos : 0;\n\tconst millis = seconds * 1000 + Math.floor(nanos / 1_000_000);\n\treturn Number.isFinite(millis) && millis > 0 ? millis : Date.now();\n}\n\nfunction toLocalMemoryEntry(\n\trecord: ClientMemory,\n\tscope: RemoteMemoryScope,\n): MemoryEntry {\n\tconst tags = (record.tags ?? [])\n\t\t.map(normalizeTag)\n\t\t.filter(\n\t\t\t(tag) =>\n\t\t\t\ttag !== SOURCE_TAG &&\n\t\t\t\ttag !== DURABLE_MEMORY_TAG &&\n\t\t\t\t!tag.startsWith(TOPIC_TAG_PREFIX) &&\n\t\t\t\t!tag.startsWith(PROJECT_NAME_TAG_PREFIX) &&\n\t\t\t\t!tag.startsWith(SESSION_TAG_PREFIX),\n\t\t);\n\n\treturn {\n\t\tid: record.id,\n\t\ttopic: extractTopicFromTags(record.tags) ?? \"memory\",\n\t\tcontent: record.content,\n\t\ttags: tags.length > 0 ? tags : undefined,\n\t\tprojectId: firstNonEmptyString(\n\t\t\tscope.projectId,\n\t\t\trecord.projectId,\n\t\t\trecord.repository,\n\t\t),\n\t\tprojectName: firstNonEmptyString(\n\t\t\tscope.projectName,\n\t\t\textractProjectNameFromTags(record.tags),\n\t\t),\n\t\tcreatedAt: timestampToMillis(record.createdAt as TimestampLike | undefined),\n\t\tupdatedAt: timestampToMillis(record.updatedAt as TimestampLike | undefined),\n\t};\n}\n\nfunction requireMemory(\n\tvalue: ClientMemory | undefined,\n\toperation: string,\n): ClientMemory {\n\tif (!value) {\n\t\tthrow new Error(`${operation} returned no memory payload`);\n\t}\n\treturn value;\n}\n\nasync function listRemoteRecordsForScope(\n\tconfig: RemoteMemoryConfig,\n\tscope: RemoteMemoryScope,\n): Promise<ClientMemory[]> {\n\tconst request: RemoteListRequest = {\n\t\ttype: MemoryType.PROJECT,\n\t\tteamId: config.teamId,\n\t\trepository: scope.repository,\n\t\tagent: MAESTRO_AGENT,\n\t\tagentId: config.agentId,\n\t\treviewStatus: \"approved\",\n\t};\n\tconst response = await config.client.list(request);\n\treturn (response.memories ?? []).filter(isManagedDurableMemory);\n}\n\nfunction findMatchingRemoteRecord(\n\trecords: ClientMemory[],\n\ttopic: string,\n\tcontent: string,\n): ClientMemory | undefined {\n\tconst normalizedTopic = normalizeTopic(topic);\n\tconst normalizedContent = normalizeContent(content).toLowerCase();\n\treturn records.find(\n\t\t(record) =>\n\t\t\textractTopicFromTags(record.tags) === normalizedTopic &&\n\t\t\tnormalizeContent(record.content).toLowerCase() === normalizedContent,\n\t);\n}\n\nasync function upsertRemoteDurableMemoryWithConfig(\n\tconfig: RemoteMemoryConfig,\n\tscope: RemoteMemoryScope,\n\ttopic: string,\n\tcontent: string,\n\toptions?: {\n\t\texistingRecords?: ClientMemory[];\n\t\tsessionId?: string;\n\t\ttags?: string[];\n\t},\n): Promise<{ entry: MemoryEntry; created: boolean; updated: boolean }> {\n\tconst nextContent = normalizeContent(content);\n\tconst nextTags = buildRemoteMemoryTags(\n\t\ttopic,\n\t\toptions?.tags,\n\t\tscope.projectName,\n\t\toptions?.sessionId,\n\t);\n\tconst existingRecords =\n\t\toptions?.existingRecords ??\n\t\t(await listRemoteRecordsForScope(config, scope));\n\tconst existing = findMatchingRemoteRecord(\n\t\texistingRecords,\n\t\ttopic,\n\t\tnextContent,\n\t);\n\n\tif (!existing) {\n\t\tconst request: RemoteStoreRequest = {\n\t\t\ttype: MemoryType.PROJECT,\n\t\t\tcontent: nextContent,\n\t\t\tteamId: config.teamId,\n\t\t\trepository: scope.repository,\n\t\t\tagent: MAESTRO_AGENT,\n\t\t\tagentId: config.agentId,\n\t\t\ttags: nextTags,\n\t\t\treviewStatus: \"approved\",\n\t\t\tsourceReferences: buildSourceReferences(topic, scope, {\n\t\t\t\tsessionId: options?.sessionId,\n\t\t\t}),\n\t\t};\n\t\tconst created = requireMemory(\n\t\t\t(await config.client.store(request)).memory,\n\t\t\t\"store memory\",\n\t\t);\n\t\treturn {\n\t\t\tentry: toLocalMemoryEntry(created, scope),\n\t\t\tcreated: true,\n\t\t\tupdated: false,\n\t\t};\n\t}\n\n\tconst mergedTags = mergeTags(existing.tags, nextTags);\n\tconst nextTagsStable = mergedTags ?? [];\n\tconst currentTagsStable = mergeTags(existing.tags) ?? [];\n\tconst tagsChanged =\n\t\tnextTagsStable.length !== currentTagsStable.length ||\n\t\tnextTagsStable.some((tag, index) => currentTagsStable[index] !== tag);\n\tif (!tagsChanged && normalizeContent(existing.content) === nextContent) {\n\t\treturn {\n\t\t\tentry: toLocalMemoryEntry(existing, scope),\n\t\t\tcreated: false,\n\t\t\tupdated: false,\n\t\t};\n\t}\n\n\tconst updated = requireMemory(\n\t\t(\n\t\t\tawait config.client.update({\n\t\t\t\tid: existing.id,\n\t\t\t\tcontent: nextContent,\n\t\t\t\treviewStatus: \"approved\",\n\t\t\t\tsourceReferences: buildSourceReferences(topic, scope, {\n\t\t\t\t\tsessionId: options?.sessionId,\n\t\t\t\t}),\n\t\t\t\ttags: mergedTags ?? [],\n\t\t\t})\n\t\t).memory,\n\t\t\"update memory\",\n\t);\n\treturn {\n\t\tentry: toLocalMemoryEntry(updated, scope),\n\t\tcreated: false,\n\t\tupdated: true,\n\t};\n}\n\nexport async function upsertRemoteDurableMemory(\n\ttopic: string,\n\tcontent: string,\n\toptions?: {\n\t\tcwd?: string;\n\t\tprojectId?: string;\n\t\tprojectName?: string;\n\t\tsessionId?: string;\n\t\ttags?: string[];\n\t},\n): Promise<{ entry: MemoryEntry; created: boolean; updated: boolean } | null> {\n\tconst config = await resolveRemoteMemoryConfig();\n\tif (!config) {\n\t\treturn null;\n\t}\n\n\treturn upsertRemoteDurableMemoryWithConfig(\n\t\tconfig,\n\t\tresolveRemoteScope(options),\n\t\ttopic,\n\t\tcontent,\n\t\t{ sessionId: options?.sessionId, tags: options?.tags },\n\t);\n}\n\nexport async function recallRemoteDurableMemories(\n\tquery: string,\n\toptions?: {\n\t\tcwd?: string;\n\t\tlimit?: number;\n\t},\n): Promise<MemorySearchResult[] | null> {\n\tconst config = await resolveRemoteMemoryConfig();\n\tif (!config) {\n\t\treturn null;\n\t}\n\n\tconst scope = resolveRemoteScope(options);\n\ttry {\n\t\tconst request: RemoteRecallRequest = {\n\t\t\tquery,\n\t\t\tlimit: options?.limit ?? 10,\n\t\t\ttype: MemoryType.PROJECT,\n\t\t\tteamId: config.teamId,\n\t\t\trepository: scope.repository,\n\t\t\tagent: MAESTRO_AGENT,\n\t\t\tagentId: config.agentId,\n\t\t\treviewStatus: \"approved\",\n\t\t};\n\t\tconst response = await config.client.recall(request);\n\t\treturn (response.memories ?? [])\n\t\t\t.filter(isManagedDurableMemory)\n\t\t\t.map((memory) => ({\n\t\t\t\tentry: toLocalMemoryEntry(memory, scope),\n\t\t\t\tscore: Number(memory.score ?? 0),\n\t\t\t\tmatchedOn: \"content\" as const,\n\t\t\t}));\n\t} catch (error) {\n\t\tlogger.warn(\"Remote memory recall failed; using local fallback\", {\n\t\t\terror: sanitizeWithStaticMask(\n\t\t\t\terror instanceof Error ? error.message : String(error),\n\t\t\t),\n\t\t\tprojectId: scope.projectId,\n\t\t});\n\t\treturn null;\n\t}\n}\n\nexport async function applyRemoteAutoMemoryConsolidation(params: {\n\toptions?: {\n\t\tcwd?: string;\n\t\tprojectId?: string;\n\t\tprojectName?: string;\n\t};\n\tremoveEntries: MemoryEntry[];\n\tupserts: Array<{\n\t\tcontent: string;\n\t\ttags?: string[];\n\t\ttopic: string;\n\t}>;\n}): Promise<{ removed: number; added: number; updated: number } | null> {\n\tconst config = await resolveRemoteMemoryConfig();\n\tif (!config) {\n\t\treturn null;\n\t}\n\n\tconst scope = resolveRemoteScope(params.options);\n\tconst existingRecords = await listRemoteRecordsForScope(config, scope);\n\n\tlet removed = 0;\n\tfor (const entry of params.removeEntries) {\n\t\tconst existing = findMatchingRemoteRecord(\n\t\t\texistingRecords,\n\t\t\tentry.topic,\n\t\t\tentry.content,\n\t\t);\n\t\tif (!existing) {\n\t\t\tcontinue;\n\t\t}\n\t\tawait config.client.delete({ id: existing.id });\n\t\tremoved += 1;\n\t}\n\n\tlet added = 0;\n\tlet updated = 0;\n\tfor (const upsert of params.upserts) {\n\t\tconst result = await upsertRemoteDurableMemoryWithConfig(\n\t\t\tconfig,\n\t\t\tscope,\n\t\t\tupsert.topic,\n\t\t\tupsert.content,\n\t\t\t{\n\t\t\t\ttags: [\"auto\", \"durable\", \"consolidated\", ...(upsert.tags ?? [])],\n\t\t\t\texistingRecords,\n\t\t\t},\n\t\t);\n\t\tif (result.created) {\n\t\t\tadded += 1;\n\t\t} else if (result.updated) {\n\t\t\tupdated += 1;\n\t\t}\n\t}\n\n\treturn { removed, added, updated };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/models/config-loader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/models/config-loader.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,7 @@ import { Type } from "@sinclair/typebox";
8
8
  import { PATHS } from "../config/constants.js";
9
9
  import { hasAwsCredentials } from "../providers/aws-auth.js";
10
10
  import { substituteEnvVars, substituteFileRefs, } from "../utils/config-substitution.js";
11
+ import { isRecord } from "../utils/json.js";
11
12
  import { parseJsonc, printParseErrorCode, } from "../utils/jsonc-umd.js";
12
13
  import { createLogger } from "../utils/logger.js";
13
14
  import { resolveEnvPath } from "../utils/path-expansion.js";
@@ -90,9 +91,6 @@ export const configSchema = Type.Object({
90
91
  export const configValidator = compileTypeboxSchema(configSchema);
91
92
  const TRUST_PROJECT_MODEL_CONFIG_ENV = "MAESTRO_TRUST_PROJECT_MODEL_CONFIG";
92
93
  const TRUE_ENV_VALUES = new Set(["1", "true", "yes", "on"]);
93
- function isRecord(value) {
94
- return typeof value === "object" && value !== null && !Array.isArray(value);
95
- }
96
94
  function isProjectModelConfigTrusted() {
97
95
  const value = process.env[TRUST_PROJECT_MODEL_CONFIG_ENV];
98
96
  return value !== undefined && TRUE_ENV_VALUES.has(value.toLowerCase());
@@ -1 +1 @@
1
- {"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/models/config-loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAGzC,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EACN,iBAAiB,EACjB,kBAAkB,GAClB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAEN,UAAU,EACV,mBAAmB,GACnB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAEN,sBAAsB,EACtB,6BAA6B,GAC7B,MAAM,iBAAiB,CAAC;AAEzB,MAAM,MAAM,GAAG,YAAY,CAAC,iBAAiB,CAAC,CAAC;AAE/C,gFAAgF;AAChF,kCAAkC;AAClC,gFAAgF;AAEhF,wDAAwD;AACxD,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAC/E,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CACjC,IAAI,CAAC,MAAM,CAAC;IACX,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IAC5C,qBAAqB,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IACpD,uBAAuB,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IACtD,oBAAoB,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IACnD,cAAc,EAAE,IAAI,CAAC,QAAQ,CAC5B,IAAI,CAAC,KAAK,CAAC;QACV,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;QAC1B,IAAI,CAAC,OAAO,CAAC,uBAAuB,CAAC;KACrC,CAAC,CACF;IACD,sBAAsB,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IACrD,gCAAgC,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IAC/D,sBAAsB,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IACrD,sBAAsB,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;CACrD,CAAC,CACF,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC;IACtC,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IACjC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IACnC,GAAG,EAAE,IAAI,CAAC,QAAQ,CACjB,IAAI,CAAC,KAAK,CAAC;QACV,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC;QAClC,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC;QAChC,IAAI,CAAC,OAAO,CAAC,wBAAwB,CAAC;QACtC,IAAI,CAAC,OAAO,CAAC,yBAAyB,CAAC;QACvC,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC;QAClC,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC;QACpC,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC;QACjC,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC;QAChC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;QACzB,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC;KAC/B,CAAC,CACF;IACD,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;IACrD,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IACxC,KAAK,EAAE,IAAI,CAAC,QAAQ,CACnB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CACrE;IACD,IAAI,EAAE,IAAI,CAAC,QAAQ,CAClB,IAAI,CAAC,MAAM,CAAC;QACX,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;QAClC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;QACnC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;QACtC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;KACvC,CAAC,CACF;IACD,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IAC1C,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IACtC,OAAO,EAAE,aAAa;IACtB,MAAM,EAAE,YAAY;CACpB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC;IACzC,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IACjC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IACnC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC;IAC9C,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;IACrD,OAAO,EAAE,aAAa;IACtB,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;IACvD,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;IACpD,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAClE,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;CAC9C,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC;IACvC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;IACrC,eAAe,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACzE,wBAAwB,EAAE,IAAI,CAAC,QAAQ,CACtC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC,CACzC;IACD,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACtD,OAAO,EAAE,IAAI,CAAC,QAAQ,CACrB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE;QACzC,WAAW,EACV,wEAAwE;KACzE,CAAC,CACF;CACD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG,oBAAoB,CAAC,YAAY,CAAC,CAAC;AAclE,MAAM,8BAA8B,GAAG,oCAAoC,CAAC;AAC5E,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;AAE5D,SAAS,QAAQ,CAAC,KAAc;IAC/B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,2BAA2B;IACnC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAC1D,OAAO,KAAK,KAAK,SAAS,IAAI,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;AACxE,CAAC;AAeD,MAAM,CAAC,MAAM,gBAAgB,GAAmC;IAC/D,SAAS,EAAE,CAAC,WAAmB,EAAE,EAAE,CAAC,CAAC;QACpC,OAAO,EAAE;YACR,gBAAgB,EAAE,2BAA2B;SAC7C;KACD,CAAC;IAEF,OAAO,EAAE,CAAC,WAAmB,EAAE,EAAE;QAChC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,WAAW,CAAC;QAErD,OAAO;YACN,OAAO,EAAE,2BAA2B,MAAM,gBAAgB;YAC1D,OAAO,EAAE,iBAAiB,EAAE;YAC5B,OAAO,EAAE,EAAE,MAAM,EAAE;SACnB,CAAC;IACH,CAAC;IAED,WAAW,EAAE,CAAC,WAAmB,EAAE,EAAE;QACpC,MAAM,OAAO,GACZ,OAAO,CAAC,GAAG,CAAC,oBAAoB;YAChC,OAAO,CAAC,GAAG,CAAC,WAAW;YACvB,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;QAC5B,MAAM,QAAQ,GACb,OAAO,CAAC,GAAG,CAAC,qBAAqB;YACjC,OAAO,CAAC,GAAG,CAAC,eAAe;YAC3B,UAAU,CAAC;QAEZ,IAAI,CAAC,OAAO,EAAE,CAAC;YACd,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAC3B,CAAC;QAED,OAAO;YACN,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE;SAC9B,CAAC;IACH,CAAC;CACD,CAAC;AAEF,gFAAgF;AAChF,oBAAoB;AACpB,gFAAgF;AAEhF,MAAM,UAAU,SAAS,CAAI,MAAS,EAAE,MAAkB;IACzD,MAAM,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;IAE7B,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1C,MAAM,YAAY,GAAG,MAAiC,CAAC;QACvD,MAAM,YAAY,GAAG,MAAiC,CAAC;QACvD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;YAC7C,uEAAuE;YACvE,qDAAqD;YACrD,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,aAAa,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;gBACzE,SAAS;YACV,CAAC;YACD,MAAM,WAAW,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;YACtC,MAAM,WAAW,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;YAEtC,IAAI,QAAQ,CAAC,WAAW,CAAC,IAAI,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;gBACpD,YAAY,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;YACzD,CAAC;iBAAM,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;gBACrE,IAAI,GAAG,KAAK,iBAAiB,IAAI,GAAG,KAAK,0BAA0B,EAAE,CAAC;oBACrE,YAAY,CAAC,GAAG,CAAC,GAAG,wBAAwB,CAC3C,WAAW,EACX,WAAW,CACA,CAAC;oBACb,SAAS;gBACV,CAAC;gBACD,uEAAuE;gBACvE,MAAM,MAAM,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC;gBAChC,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;oBAChC,MAAM,MAAM,GACX,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI;wBAC7B,CAAC,CAAE,IAAyB,CAAC,EAAE;wBAC/B,CAAC,CAAC,SAAS,CAAC;oBACd,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;wBAC1B,MAAM,aAAa,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;4BAChD,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,KAAK,EAAE,CAAC;gCACtC,OAAQ,KAA0B,CAAC,EAAE,KAAK,MAAM,CAAC;4BAClD,CAAC;4BACD,OAAO,KAAK,CAAC;wBACd,CAAC,CAAC,CAAC;wBACH,IAAI,aAAa,IAAI,CAAC,EAAE,CAAC;4BACxB,sBAAsB;4BACtB,MAAM,CAAC,aAAa,CAAC,GAAG,SAAS,CAChC,MAAM,CAAC,aAAa,CAAW,EAC/B,IAAc,CACkB,CAAC;wBACnC,CAAC;6BAAM,CAAC;4BACP,MAAM,CAAC,IAAI,CAAC,IAAoC,CAAC,CAAC;wBACnD,CAAC;oBACF,CAAC;yBAAM,CAAC;wBACP,MAAM,CAAC,IAAI,CAAC,IAAoC,CAAC,CAAC;oBACnD,CAAC;gBACF,CAAC;gBACD,YAAY,CAAC,GAAG,CAAC,GAAG,MAAiB,CAAC;YACvC,CAAC;iBAAM,CAAC;gBACP,YAAY,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC;YACjC,CAAC;QACF,CAAC;IACF,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC;AAED,SAAS,wBAAwB,CAChC,WAAsB,EACtB,WAAsB;IAEtB,MAAM,aAAa,GAAG,WAAW,CAAC,MAAM,CACvC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CACrD,CAAC;IACF,MAAM,aAAa,GAAG,WAAW,CAAC,MAAM,CACvC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CACrD,CAAC;IACF,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,MAAM,cAAc,GAAa,EAAE,CAAC;IACpC,KAAK,MAAM,WAAW,IAAI,aAAa,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,sBAAsB,CAAC,WAAW,CAAC,CAAC;QACtD,IAAI,CAAC,SAAS,EAAE,CAAC;YAChB,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACjC,SAAS;QACV,CAAC;QACD,KAAK,MAAM,WAAW,IAAI,aAAa,EAAE,CAAC;YACzC,MAAM,SAAS,GAAG,sBAAsB,CAAC,WAAW,CAAC,CAAC;YACtD,IAAI,CAAC,SAAS,EAAE,CAAC;gBAChB,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBACjC,SAAS;YACV,CAAC;YACD,IAAI,sBAAsB,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC;gBAClD,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,WAAW,CAAC,CAAC;YAC/C,CAAC;iBAAM,IAAI,sBAAsB,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC;gBACzD,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,WAAW,CAAC,CAAC;YAC/C,CAAC;QACF,CAAC;IACF,CAAC;IACD,MAAM,YAAY,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1C,MAAM,YAAY,GACjB,YAAY,CAAC,MAAM,GAAG,CAAC;QACtB,CAAC,CAAC,YAAY;QACd,CAAC,CAAC,WAAW,CAAC,MAAM,CAClB,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CACrD,CAAC;IACL,MAAM,MAAM,GAAG,CAAC,GAAG,YAAY,CAAC,CAAC;IACjC,KAAK,MAAM,YAAY,IAAI,cAAc,EAAE,CAAC;QAC3C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YACpC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC3B,CAAC;IACF,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAa;IAC5C,IAAI,CAAC;QACJ,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC;AAED,MAAM,UAAU,YAAY,CAC3B,IAA6B,EAC7B,SAAkC;IAElC,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACzB,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,OAAO,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC,EAAE,CAAC;AAClD,CAAC;AAED,SAAS,QAAQ,CAAC,IAAa;IAC9B,OAAO,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAA6B;IACnE,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpC,OAAO,uBAAuB,CAAC;IAChC,CAAC;IACD,OAAO,MAAM;SACX,GAAG,CACH,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,YAAY,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,IAAI,eAAe,EAAE,CACvE;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;AACd,CAAC;AAED,gFAAgF;AAChF,sBAAsB;AACtB,gFAAgF;AAEhF,yCAAyC;AACzC,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,GAAG,EAGjC,CAAC;AAEJ,2BAA2B;AAC3B,MAAM,CAAC,IAAI,YAAY,GAA6B,IAAI,CAAC;AACzD,IAAI,kCAAkC,GAAG,KAAK,CAAC;AAE/C,MAAM,UAAU,iBAAiB;IAChC,YAAY,GAAG,IAAI,CAAC;IACpB,kCAAkC,GAAG,KAAK,CAAC;IAC3C,aAAa,CAAC,KAAK,EAAE,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAyB;IACxD,YAAY,GAAG,MAAM,CAAC;IACtB,kCAAkC,GAAG,IAAI,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB;IACnC,MAAM,KAAK,GAAsB,EAAE,CAAC;IAEpC,mBAAmB;IACnB,KAAK,CAAC,IAAI,CAAC;QACV,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,aAAa,CAAC;QAC7C,KAAK,EAAE,QAAQ;QACf,OAAO,EAAE,IAAI;KACb,CAAC,CAAC;IACH,KAAK,CAAC,IAAI,CAAC;QACV,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,YAAY,CAAC;QAC5C,KAAK,EAAE,QAAQ;QACf,OAAO,EAAE,IAAI;KACb,CAAC,CAAC;IAEH,wCAAwC;IACxC,MAAM,cAAc,GAAG,2BAA2B,EAAE,CAAC;IACrD,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;IACrE,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,aAAa;YACnB,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE,cAAc;SACvB,CAAC,CAAC;IACJ,CAAC;IACD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;IACnE,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,YAAY;YAClB,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE,cAAc;SACvB,CAAC,CAAC;IACJ,CAAC;IAED,4CAA4C;IAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;IAC3D,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,QAAQ;YACf,OAAO,EAAE,IAAI;SACb,CAAC,CAAC;IACJ,CAAC;IAED,mCAAmC;IACnC,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QACjE,IAAI,QAAQ;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC5D,IAAI,QAAQ;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,OAAO,KAAK,CAAC;AACd,CAAC;AAED,MAAM,UAAU,cAAc;IAC7B,OAAO,oBAAoB,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,UAAU;IACzB,OAAO,CACN,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;QAC/C,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,aAAa,CAAC,CACvC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAY,EAAE,QAAgB;IAClE,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE;QACrC,kBAAkB,EAAE,IAAI;QACxB,gBAAgB,EAAE,KAAK;KACvB,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,YAAY,GAAG,MAAM;aACzB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACV,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7D,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC;YACjC,MAAM,QAAQ,GAAG,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACvD,MAAM,MAAM,GAAG,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YAC3C,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;YAEpC,MAAM,KAAK,GAAG,GAAG,mBAAmB,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,IAAI,YAAY,MAAM,EAAE,CAAC;YAClF,IAAI,CAAC,WAAW;gBAAE,OAAO,KAAK,CAAC;YAE/B,OAAO,GAAG,KAAK,aAAa,IAAI,KAAK,WAAW,KAAK,EAAE,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC;QACjF,CAAC,CAAC;aACD,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,MAAM,IAAI,KAAK,CACd,mCAAmC,QAAQ,MAAM,YAAY,EAAE,CAC/D,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACb,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC5C,IAAI,CAAC;QACJ,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACjC,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC3C,IAAI,MAAM,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;YAChD,OAAO,MAAM,CAAC,IAAI,CAAC;QACpB,CAAC;QACD,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC7C,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9D,OAAO,IAAI,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACR,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/B,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC;AAED;;GAEG;AACH,SAAS,yBAAyB,CACjC,IAAY,EACZ,OAAwC;IAExC,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACzD,IAAI,CAAC,GAAG,EAAE,CAAC;QACV,OAAO,IAAI,CAAC;IACb,CAAC;IAED,IAAI,CAAC;QACJ,IAAI,SAAS,GAAG,GAAG,CAAC;QACpB,IAAI,OAAO,EAAE,gBAAgB,KAAK,KAAK,EAAE,CAAC;YACzC,sFAAsF;YACtF,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;YAChC,SAAS,GAAG,kBAAkB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YAErD,4CAA4C;YAC5C,SAAS,GAAG,iBAAiB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAClD,CAAC;QAED,sDAAsD;QACtD,MAAM,IAAI,GAAG,oBAAoB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAEnD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,MAAM,GAAG,IAAyB,CAAC;QACzC,OAAO,MAAM,CAAC;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CACd,6BAA6B,IAAI,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC9F,CAAC;IACH,CAAC;AACF,CAAC;AAED,MAAM,UAAU,cAAc,CAC7B,IAAY,EACZ,OAAwC;IAExC,OAAO,yBAAyB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC7C,IAAY;IAEZ,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACzD,IAAI,CAAC,GAAG,EAAE,CAAC;QACV,OAAO,IAAI,CAAC;IACb,CAAC;IAED,IAAI,CAAC;QACJ,MAAM,IAAI,GAAG,oBAAoB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC7C,OAAO,8BAA8B,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,iDAAiD,EAAE;YAC9D,IAAI;YACJ,QAAQ,EAAE,8BAA8B;YACxC,KAAK,EAAE,sBAAsB,CAC5B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACtD;SACD,CAAC,CAAC;QACH,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAC1B,CAAC;AACF,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC7C,MAAe,EACf,IAAY;IAEZ,MAAM,SAAS,GAAqB,EAAE,CAAC;IACvC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACvB,MAAM,CAAC,IAAI,CAAC,iDAAiD,EAAE;YAC9D,IAAI;YACJ,QAAQ,EAAE,8BAA8B;SACxC,CAAC,CAAC;QACH,OAAO,EAAE,SAAS,EAAE,CAAC;IACtB,CAAC;IAED,MAAM,SAAS,GACd,WAAW,IAAI,MAAM;QACrB,SAAS,IAAI,MAAM;QACnB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC;IAEtD,IAAI,SAAS,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,gDAAgD,EAAE;YAC7D,IAAI;YACJ,QAAQ,EAAE,8BAA8B;SACxC,CAAC,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAClC,QAAwB,EACxB,OAAuC;IAEvC,MAAM,QAAQ,GAAG,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,EAAE,CAAC;IAC1D,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC3E,MAAM,QAAQ,GAAmB,EAAE,GAAG,QAAQ,EAAE,CAAC;IACjD,IAAI,OAAO,GAAG,QAAQ,CAAC,OAAO,IAAI,IAAI,CAAC;IAEvC,IAAI,MAAM,EAAE,CAAC;QACZ,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAEnC,4CAA4C;QAC5C,IAAI,MAAM,EAAE,CAAC;YACZ,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,QAAQ,CAAC,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;YACnE,CAAC;YAED,IAAI,MAAM,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACzC,QAAQ,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;YACnC,CAAC;YAED,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;gBAClC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;YAC1B,CAAC;YAED,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,QAAQ,CAAC,OAAO,GAAG,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;YAC/D,CAAC;QACF,CAAC;QAED,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC;IAC5B,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,IAAI,CAAC,OAAO,EAAE,eAAe,EAAE,CAAC;QACpD,OAAO,IAAI,CAAC;IACb,CAAC;IAED,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CACzB,eAAe,GAAG,KAAK,EACvB,aAGQ,EACR,OAEC;IAED,MAAM,uBAAuB,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACvD,MAAM,kBAAkB,GAAG,OAAO,EAAE,YAAY,IAAI,IAAI,CAAC;IACzD,IACC,YAAY;QACZ,CAAC,eAAe;QAChB,CAAC,CAAC,uBAAuB,IAAI,kCAAkC,CAAC,EAC/D,CAAC;QACF,OAAO,YAAY,CAAC;IACrB,CAAC;IAED,6BAA6B;IAC7B,MAAM,KAAK,GAAG,oBAAoB,EAAE,CAAC;IACrC,IAAI,YAAY,GAAsB,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAExD,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;QAC3B,MAAM,gBAAgB,GAAG,KAAK,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;QACrE,MAAM,MAAM,GAAG,gBAAgB;YAC9B,CAAC,CAAC,8BAA8B,CAAC,KAAK,CAAC,IAAI,CAAC;YAC5C,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,MAAM,EAAE,CAAC;YACZ,YAAY,GAAG,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QAChD,CAAC;IACF,CAAC;IACD,MAAM,sBAAsB,GAAG,YAAY,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IAEjE,4CAA4C;IAC5C,IAAI,YAAY,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,aAAa,EAAE,CAAC;QAC1D,MAAM,eAAe,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;QACpD,IAAI,eAAe,EAAE,CAAC;YACrB,MAAM,cAAc,GAAsB;gBACzC,GAAG,eAAe,CAAC,MAAM;gBACzB,GAAG,CAAC,YAAY,CAAC,eAAe;oBAC/B,CAAC,CAAC,EAAE,eAAe,EAAE,YAAY,CAAC,eAAe,EAAE;oBACnD,CAAC,CAAC,EAAE,CAAC;gBACN,GAAG,CAAC,YAAY,CAAC,wBAAwB;oBACxC,CAAC,CAAC;wBACA,wBAAwB,EAAE,YAAY,CAAC,wBAAwB;qBAC/D;oBACF,CAAC,CAAC,EAAE,CAAC;aACN,CAAC;YACF,IAAI,kBAAkB,EAAE,CAAC;gBACxB,6BAA6B,CAC5B,cAAc,EACd,4BAA4B,CAC5B,CAAC;YACH,CAAC;YACD,IAAI,CAAC,eAAe,EAAE,CAAC;gBACtB,YAAY,GAAG,cAAc,CAAC;gBAC9B,kCAAkC,GAAG,IAAI,CAAC;YAC3C,CAAC;YACD,OAAO,cAAc,CAAC;QACvB,CAAC;IACF,CAAC;IAED,kCAAkC;IAClC,YAAY,CAAC,SAAS,GAAG,YAAY,CAAC,SAAS;SAC7C,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,mBAAmB,CAAC,QAAQ,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC;SACrE,MAAM,CAAC,CAAC,QAAQ,EAA8B,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEtE,IAAI,kBAAkB,EAAE,CAAC;QACxB,6BAA6B,CAAC,YAAY,EAAE,4BAA4B,CAAC,CAAC;IAC3E,CAAC;IAED,IAAI,CAAC,eAAe,EAAE,CAAC;QACtB,YAAY,GAAG,YAAY,CAAC;QAC5B,kCAAkC;YACjC,OAAO,CAAC,aAAa,CAAC,IAAI,sBAAsB,CAAC;IACnD,CAAC;IACD,OAAO,YAAY,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,mCAAmC;IAClD,6EAA6E;IAC7E,6EAA6E;IAC7E,+EAA+E;IAC/E,+CAA+C;IAC/C,MAAM,EAAE,eAAe,EAAE,wBAAwB,EAAE,GAClD,YAAY,IAAI,UAAU,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;IACtE,OAAO;QACN,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/C,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE,wBAAwB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACjE,CAAC;AACH,CAAC","sourcesContent":["/**\n * Model Configuration Loader\n * Schema definitions, file loading, parsing, and merging for model configs.\n */\n\nimport { existsSync, readFileSync, statSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { Type } from \"@sinclair/typebox\";\nimport type { Static } from \"@sinclair/typebox\";\nimport type { ErrorObject } from \"ajv\";\nimport { PATHS } from \"../config/constants.js\";\nimport { hasAwsCredentials } from \"../providers/aws-auth.js\";\nimport {\n\tsubstituteEnvVars,\n\tsubstituteFileRefs,\n} from \"../utils/config-substitution.js\";\nimport {\n\ttype ParseError as JsoncParseError,\n\tparseJsonc,\n\tprintParseErrorCode,\n} from \"../utils/jsonc-umd.js\";\nimport { createLogger } from \"../utils/logger.js\";\nimport { resolveEnvPath } from \"../utils/path-expansion.js\";\nimport { sanitizeWithStaticMask } from \"../utils/secret-redactor.js\";\nimport { compileTypeboxSchema } from \"../utils/typebox-ajv.js\";\nimport {\n\ttype CustomModelUrlPolicyConfig,\n\turlMatchesStrictPrefix,\n\tvalidateCustomModelConfigUrls,\n} from \"./url-policy.js\";\n\nconst logger = createLogger(\"models:registry\");\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Configuration Schemas (TypeBox)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** Optional custom headers to send with API requests */\nconst headersSchema = Type.Optional(Type.Record(Type.String(), Type.String()));\nconst compatSchema = Type.Optional(\n\tType.Object({\n\t\tsupportsStore: Type.Optional(Type.Boolean()),\n\t\tsupportsDeveloperRole: Type.Optional(Type.Boolean()),\n\t\tsupportsReasoningEffort: Type.Optional(Type.Boolean()),\n\t\tsupportsResponsesApi: Type.Optional(Type.Boolean()),\n\t\tmaxTokensField: Type.Optional(\n\t\t\tType.Union([\n\t\t\t\tType.Literal(\"max_tokens\"),\n\t\t\t\tType.Literal(\"max_completion_tokens\"),\n\t\t\t]),\n\t\t),\n\t\trequiresToolResultName: Type.Optional(Type.Boolean()),\n\t\trequiresAssistantAfterToolResult: Type.Optional(Type.Boolean()),\n\t\trequiresThinkingAsText: Type.Optional(Type.Boolean()),\n\t\trequiresMistralToolIds: Type.Optional(Type.Boolean()),\n\t}),\n);\n\n/**\n * Schema for individual model configuration within a provider.\n */\nexport const modelSchema = Type.Object({\n\tid: Type.String({ minLength: 1 }),\n\tname: Type.String({ minLength: 1 }),\n\tapi: Type.Optional(\n\t\tType.Union([\n\t\t\tType.Literal(\"openai-completions\"),\n\t\t\tType.Literal(\"openai-responses\"),\n\t\t\tType.Literal(\"openai-codex-responses\"),\n\t\t\tType.Literal(\"openai-codex-app-server\"),\n\t\t\tType.Literal(\"anthropic-messages\"),\n\t\t\tType.Literal(\"google-generative-ai\"),\n\t\t\tType.Literal(\"google-gemini-cli\"),\n\t\t\tType.Literal(\"bedrock-converse\"),\n\t\t\tType.Literal(\"vertex-ai\"),\n\t\t\tType.Literal(\"scripted-replay\"),\n\t\t]),\n\t),\n\tbaseUrl: Type.Optional(Type.String({ minLength: 1 })),\n\treasoning: Type.Optional(Type.Boolean()),\n\tinput: Type.Optional(\n\t\tType.Array(Type.Union([Type.Literal(\"text\"), Type.Literal(\"image\")])),\n\t),\n\tcost: Type.Optional(\n\t\tType.Object({\n\t\t\tinput: Type.Number({ minimum: 0 }),\n\t\t\toutput: Type.Number({ minimum: 0 }),\n\t\t\tcacheRead: Type.Number({ minimum: 0 }),\n\t\t\tcacheWrite: Type.Number({ minimum: 0 }),\n\t\t}),\n\t),\n\tcontextWindow: Type.Number({ minimum: 1 }),\n\tmaxTokens: Type.Number({ minimum: 1 }),\n\theaders: headersSchema,\n\tcompat: compatSchema,\n});\n\nexport const providerSchema = Type.Object({\n\tid: Type.String({ minLength: 1 }),\n\tname: Type.String({ minLength: 1 }),\n\tapi: Type.Optional(modelSchema.properties.api),\n\tbaseUrl: Type.Optional(Type.String({ minLength: 1 })),\n\theaders: headersSchema,\n\tapiKeyEnv: Type.Optional(Type.String({ minLength: 1 })),\n\tapiKey: Type.Optional(Type.String({ minLength: 1 })),\n\tenabled: Type.Optional(Type.Boolean({ default: true })),\n\toptions: Type.Optional(Type.Record(Type.String(), Type.Unknown())),\n\tmodels: Type.Optional(Type.Array(modelSchema)),\n});\n\nexport const configSchema = Type.Object({\n\t$schema: Type.Optional(Type.String()),\n\tallowedBaseUrls: Type.Optional(Type.Array(Type.String({ minLength: 1 }))),\n\tinternalBaseUrlAllowList: Type.Optional(\n\t\tType.Array(Type.String({ minLength: 1 })),\n\t),\n\tproviders: Type.Array(providerSchema, { default: [] }),\n\taliases: Type.Optional(\n\t\tType.Record(Type.String(), Type.String(), {\n\t\t\tdescription:\n\t\t\t\t\"Model aliases for convenience (e.g., 'fast': 'anthropic/claude-haiku')\",\n\t\t}),\n\t),\n});\n\nexport const configValidator = compileTypeboxSchema(configSchema);\n\nexport type CustomModelConfig = Static<typeof configSchema>;\nexport type CustomProvider = Static<typeof providerSchema>;\nexport type CustomModel = Static<typeof modelSchema>;\n\nexport type ConfigPathScope = \"global\" | \"project\" | \"legacy\" | \"env\";\n\nexport interface ConfigPathEntry {\n\tpath: string;\n\tscope: ConfigPathScope;\n\ttrusted: boolean;\n}\n\nconst TRUST_PROJECT_MODEL_CONFIG_ENV = \"MAESTRO_TRUST_PROJECT_MODEL_CONFIG\";\nconst TRUE_ENV_VALUES = new Set([\"1\", \"true\", \"yes\", \"on\"]);\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isProjectModelConfigTrusted(): boolean {\n\tconst value = process.env[TRUST_PROJECT_MODEL_CONFIG_ENV];\n\treturn value !== undefined && TRUE_ENV_VALUES.has(value.toLowerCase());\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Provider Loaders\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface ProviderLoaderResult {\n\theaders?: Record<string, string>;\n\tbaseUrl?: string;\n\tenabled?: boolean;\n\toptions?: Record<string, unknown>;\n}\n\ntype ProviderLoader = (providerId: string) => ProviderLoaderResult | null;\n\nexport const PROVIDER_LOADERS: Record<string, ProviderLoader> = {\n\tanthropic: (_providerId: string) => ({\n\t\theaders: {\n\t\t\t\"anthropic-beta\": \"prompt-caching-2024-07-31\",\n\t\t},\n\t}),\n\n\tbedrock: (_providerId: string) => {\n\t\tconst region = process.env.AWS_REGION ?? \"us-east-1\";\n\n\t\treturn {\n\t\t\tbaseUrl: `https://bedrock-runtime.${region}.amazonaws.com`,\n\t\t\tenabled: hasAwsCredentials(),\n\t\t\toptions: { region },\n\t\t};\n\t},\n\n\t\"vertex-ai\": (_providerId: string) => {\n\t\tconst project =\n\t\t\tprocess.env.GOOGLE_CLOUD_PROJECT ??\n\t\t\tprocess.env.GCP_PROJECT ??\n\t\t\tprocess.env.GCLOUD_PROJECT;\n\t\tconst location =\n\t\t\tprocess.env.GOOGLE_CLOUD_LOCATION ??\n\t\t\tprocess.env.VERTEX_LOCATION ??\n\t\t\t\"us-east5\";\n\n\t\tif (!project) {\n\t\t\treturn { enabled: false };\n\t\t}\n\n\t\treturn {\n\t\t\tenabled: true,\n\t\t\toptions: { project, location },\n\t\t};\n\t},\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Utility Functions\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function mergeDeep<T>(target: T, source: Partial<T>): T {\n\tconst output = { ...target };\n\n\tif (isObject(target) && isObject(source)) {\n\t\tconst sourceRecord = source as Record<string, unknown>;\n\t\tconst outputRecord = output as Record<string, unknown>;\n\t\tfor (const key of Object.keys(sourceRecord)) {\n\t\t\t// Skip prototype-polluting keys to guard against __proto__/constructor\n\t\t\t// injection via untrusted JSON config (fixes #2542).\n\t\t\tif (key === \"__proto__\" || key === \"constructor\" || key === \"prototype\") {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst sourceValue = sourceRecord[key];\n\t\t\tconst targetValue = outputRecord[key];\n\n\t\t\tif (isObject(sourceValue) && isObject(targetValue)) {\n\t\t\t\toutputRecord[key] = mergeDeep(targetValue, sourceValue);\n\t\t\t} else if (Array.isArray(sourceValue) && Array.isArray(targetValue)) {\n\t\t\t\tif (key === \"allowedBaseUrls\" || key === \"internalBaseUrlAllowList\") {\n\t\t\t\t\toutputRecord[key] = intersectAllowedBaseUrls(\n\t\t\t\t\t\ttargetValue,\n\t\t\t\t\t\tsourceValue,\n\t\t\t\t\t) as unknown;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t// For arrays, concatenate and dedupe by id if objects have id property\n\t\t\t\tconst merged = [...targetValue];\n\t\t\t\tfor (const item of sourceValue) {\n\t\t\t\t\tconst itemId =\n\t\t\t\t\t\tisObject(item) && \"id\" in item\n\t\t\t\t\t\t\t? (item as { id?: unknown }).id\n\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\tif (itemId !== undefined) {\n\t\t\t\t\t\tconst existingIndex = merged.findIndex((entry) => {\n\t\t\t\t\t\t\tif (isObject(entry) && \"id\" in entry) {\n\t\t\t\t\t\t\t\treturn (entry as { id?: unknown }).id === itemId;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (existingIndex >= 0) {\n\t\t\t\t\t\t\t// Merge existing item\n\t\t\t\t\t\t\tmerged[existingIndex] = mergeDeep(\n\t\t\t\t\t\t\t\tmerged[existingIndex] as object,\n\t\t\t\t\t\t\t\titem as object,\n\t\t\t\t\t\t\t) as (typeof targetValue)[number];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tmerged.push(item as (typeof targetValue)[number]);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmerged.push(item as (typeof targetValue)[number]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\toutputRecord[key] = merged as unknown;\n\t\t\t} else {\n\t\t\t\toutputRecord[key] = sourceValue;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn output;\n}\n\nfunction intersectAllowedBaseUrls(\n\ttargetValue: unknown[],\n\tsourceValue: unknown[],\n): string[] {\n\tconst targetEntries = targetValue.filter(\n\t\t(entry): entry is string => typeof entry === \"string\",\n\t);\n\tconst sourceEntries = sourceValue.filter(\n\t\t(entry): entry is string => typeof entry === \"string\",\n\t);\n\tconst merged = new Map<string, string>();\n\tconst invalidEntries: string[] = [];\n\tfor (const targetEntry of targetEntries) {\n\t\tconst targetUrl = parsePolicyUrlForMerge(targetEntry);\n\t\tif (!targetUrl) {\n\t\t\tinvalidEntries.push(targetEntry);\n\t\t\tcontinue;\n\t\t}\n\t\tfor (const sourceEntry of sourceEntries) {\n\t\t\tconst sourceUrl = parsePolicyUrlForMerge(sourceEntry);\n\t\t\tif (!sourceUrl) {\n\t\t\t\tinvalidEntries.push(sourceEntry);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (urlMatchesStrictPrefix(sourceUrl, targetUrl)) {\n\t\t\t\tmerged.set(sourceUrl.toString(), sourceEntry);\n\t\t\t} else if (urlMatchesStrictPrefix(targetUrl, sourceUrl)) {\n\t\t\t\tmerged.set(targetUrl.toString(), targetEntry);\n\t\t\t}\n\t\t}\n\t}\n\tconst intersection = [...merged.values()];\n\tconst validEntries =\n\t\tintersection.length > 0\n\t\t\t? intersection\n\t\t\t: targetValue.filter(\n\t\t\t\t\t(entry): entry is string => typeof entry === \"string\",\n\t\t\t\t);\n\tconst result = [...validEntries];\n\tfor (const invalidEntry of invalidEntries) {\n\t\tif (!result.includes(invalidEntry)) {\n\t\t\tresult.push(invalidEntry);\n\t\t}\n\t}\n\treturn result;\n}\n\nfunction parsePolicyUrlForMerge(value: string): URL | null {\n\ttry {\n\t\treturn new URL(value);\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nexport function mergeHeaders(\n\tbase?: Record<string, string>,\n\toverrides?: Record<string, string>,\n): Record<string, string> | undefined {\n\tif (!base && !overrides) {\n\t\treturn undefined;\n\t}\n\treturn { ...(base ?? {}), ...(overrides ?? {}) };\n}\n\nfunction isObject(item: unknown): item is Record<string, unknown> {\n\treturn item !== null && typeof item === \"object\" && !Array.isArray(item);\n}\n\nexport function formatValidationErrors(errors?: ErrorObject[] | null): string {\n\tif (!errors || errors.length === 0) {\n\t\treturn \"Invalid configuration\";\n\t}\n\treturn errors\n\t\t.map(\n\t\t\t(err) => `${err.instancePath || \"/\"} ${err.message ?? \"invalid value\"}`,\n\t\t)\n\t\t.join(\"; \");\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Config File Loading\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** Cached file contents keyed by path */\nexport const fileSnapshots = new Map<\n\tstring,\n\t{ mtimeMs: number; data: string }\n>();\n\n/** Cached merged config */\nexport let cachedConfig: CustomModelConfig | null = null;\nlet cachedConfigCheckedFactoryFallback = false;\n\nexport function clearCachedConfig(): void {\n\tcachedConfig = null;\n\tcachedConfigCheckedFactoryFallback = false;\n\tfileSnapshots.clear();\n}\n\nexport function setCachedConfig(config: CustomModelConfig): void {\n\tcachedConfig = config;\n\tcachedConfigCheckedFactoryFallback = true;\n}\n\n/**\n * Config file paths in order of precedence (last wins)\n */\nexport function getConfigPathEntries(): ConfigPathEntry[] {\n\tconst paths: ConfigPathEntry[] = [];\n\n\t// 1. Global config\n\tpaths.push({\n\t\tpath: join(PATHS.MAESTRO_HOME, \"config.json\"),\n\t\tscope: \"global\",\n\t\ttrusted: true,\n\t});\n\tpaths.push({\n\t\tpath: join(PATHS.MAESTRO_HOME, \"local.json\"),\n\t\tscope: \"global\",\n\t\ttrusted: true,\n\t});\n\n\t// 2. Project config (current directory)\n\tconst projectTrusted = isProjectModelConfigTrusted();\n\tconst projectConfig = join(process.cwd(), \".maestro\", \"config.json\");\n\tif (existsSync(projectConfig)) {\n\t\tpaths.push({\n\t\t\tpath: projectConfig,\n\t\t\tscope: \"project\",\n\t\t\ttrusted: projectTrusted,\n\t\t});\n\t}\n\tconst projectLocal = join(process.cwd(), \".maestro\", \"local.json\");\n\tif (existsSync(projectLocal)) {\n\t\tpaths.push({\n\t\t\tpath: projectLocal,\n\t\t\tscope: \"project\",\n\t\t\ttrusted: projectTrusted,\n\t\t});\n\t}\n\n\t// 3. Legacy path for backward compatibility\n\tconst legacyPath = join(PATHS.MAESTRO_HOME, \"models.json\");\n\tif (existsSync(legacyPath)) {\n\t\tpaths.push({\n\t\t\tpath: legacyPath,\n\t\t\tscope: \"legacy\",\n\t\t\ttrusted: true,\n\t\t});\n\t}\n\n\t// 4. Environment variable override\n\tif (process.env.MAESTRO_MODELS_FILE) {\n\t\tconst override = resolveEnvPath(process.env.MAESTRO_MODELS_FILE);\n\t\tif (override) paths.push({ path: override, scope: \"env\", trusted: true });\n\t}\n\n\tif (process.env.MAESTRO_CONFIG) {\n\t\tconst override = resolveEnvPath(process.env.MAESTRO_CONFIG);\n\t\tif (override) paths.push({ path: override, scope: \"env\", trusted: true });\n\t}\n\n\treturn paths;\n}\n\nexport function getConfigPaths(): string[] {\n\treturn getConfigPathEntries().map((entry) => entry.path);\n}\n\nexport function configPath(): string {\n\treturn (\n\t\tresolveEnvPath(process.env.MAESTRO_MODELS_FILE) ??\n\t\tjoin(PATHS.MAESTRO_HOME, \"models.json\")\n\t);\n}\n\n/**\n * Parse JSONC (JSON with comments) with helpful error messages\n */\nexport function parseJsoncWithErrors(text: string, filePath: string): unknown {\n\tconst errors: JsoncParseError[] = [];\n\tconst data = parseJsonc(text, errors, {\n\t\tallowTrailingComma: true,\n\t\tdisallowComments: false,\n\t});\n\n\tif (errors.length > 0) {\n\t\tconst lines = text.split(\"\\n\");\n\t\tconst errorDetails = errors\n\t\t\t.map((e) => {\n\t\t\t\tconst beforeOffset = text.substring(0, e.offset).split(\"\\n\");\n\t\t\t\tconst line = beforeOffset.length;\n\t\t\t\tconst lastLine = beforeOffset[beforeOffset.length - 1];\n\t\t\t\tconst column = (lastLine?.length ?? 0) + 1;\n\t\t\t\tconst problemLine = lines[line - 1];\n\n\t\t\t\tconst error = `${printParseErrorCode(e.error)} at line ${line}, column ${column}`;\n\t\t\t\tif (!problemLine) return error;\n\n\t\t\t\treturn `${error}\\n Line ${line}: ${problemLine}\\n${\"\".padStart(column + 9)}^`;\n\t\t\t})\n\t\t\t.join(\"\\n\");\n\n\t\tthrow new Error(\n\t\t\t`Failed to parse JSONC config at ${filePath}:\\n${errorDetails}`,\n\t\t);\n\t}\n\n\treturn data;\n}\n\nexport function readJsonFile(filePath: string): string | null {\n\ttry {\n\t\tconst stats = statSync(filePath);\n\t\tconst cached = fileSnapshots.get(filePath);\n\t\tif (cached && cached.mtimeMs === stats.mtimeMs) {\n\t\t\treturn cached.data;\n\t\t}\n\t\tconst data = readFileSync(filePath, \"utf-8\");\n\t\tfileSnapshots.set(filePath, { mtimeMs: stats.mtimeMs, data });\n\t\treturn data;\n\t} catch {\n\t\tfileSnapshots.delete(filePath);\n\t\treturn null;\n\t}\n}\n\n/**\n * Load and parse a single config file\n */\nfunction loadConfigFileWithOptions(\n\tpath: string,\n\toptions?: { expandReferences?: boolean },\n): CustomModelConfig | null {\n\tconst raw = existsSync(path) ? readJsonFile(path) : null;\n\tif (!raw) {\n\t\treturn null;\n\t}\n\n\ttry {\n\t\tlet processed = raw;\n\t\tif (options?.expandReferences !== false) {\n\t\t\t// Process file references first (before env vars, so file contents can have env vars)\n\t\t\tconst configDir = dirname(path);\n\t\t\tprocessed = substituteFileRefs(processed, configDir);\n\n\t\t\t// Process environment variable substitution\n\t\t\tprocessed = substituteEnvVars(processed, logger);\n\t\t}\n\n\t\t// Parse JSONC (supports comments and trailing commas)\n\t\tconst data = parseJsoncWithErrors(processed, path);\n\n\t\tif (!configValidator(data)) {\n\t\t\tthrow new Error(formatValidationErrors(configValidator.errors));\n\t\t}\n\n\t\tconst config = data as CustomModelConfig;\n\t\treturn config;\n\t} catch (error) {\n\t\tthrow new Error(\n\t\t\t`Failed to parse config at ${path}: ${error instanceof Error ? error.message : String(error)}`,\n\t\t);\n\t}\n}\n\nexport function loadConfigFile(\n\tpath: string,\n\toptions?: { expandReferences?: boolean },\n): CustomModelConfig | null {\n\treturn loadConfigFileWithOptions(path, options);\n}\n\nexport function loadUntrustedProjectConfigFile(\n\tpath: string,\n): CustomModelConfig | null {\n\tconst raw = existsSync(path) ? readJsonFile(path) : null;\n\tif (!raw) {\n\t\treturn null;\n\t}\n\n\ttry {\n\t\tconst data = parseJsoncWithErrors(raw, path);\n\t\treturn sanitizeUntrustedProjectConfig(data, path);\n\t} catch (error) {\n\t\tlogger.warn(\"Ignoring invalid untrusted project model config\", {\n\t\t\tpath,\n\t\t\ttrustEnv: TRUST_PROJECT_MODEL_CONFIG_ENV,\n\t\t\terror: sanitizeWithStaticMask(\n\t\t\t\terror instanceof Error ? error.message : String(error),\n\t\t\t),\n\t\t});\n\t\treturn { providers: [] };\n\t}\n}\n\nexport function sanitizeUntrustedProjectConfig(\n\tconfig: unknown,\n\tpath: string,\n): CustomModelConfig {\n\tconst providers: CustomProvider[] = [];\n\tif (!isRecord(config)) {\n\t\tlogger.warn(\"Ignoring invalid untrusted project model config\", {\n\t\t\tpath,\n\t\t\ttrustEnv: TRUST_PROJECT_MODEL_CONFIG_ENV,\n\t\t});\n\t\treturn { providers };\n\t}\n\n\tconst sanitized =\n\t\t\"providers\" in config ||\n\t\t\"aliases\" in config ||\n\t\tObject.keys(config).some((key) => key !== \"$schema\");\n\n\tif (sanitized) {\n\t\tlogger.warn(\"Ignoring sensitive project model config fields\", {\n\t\t\tpath,\n\t\t\ttrustEnv: TRUST_PROJECT_MODEL_CONFIG_ENV,\n\t\t});\n\t}\n\n\treturn { providers };\n}\n\n/**\n * Apply provider-specific configurations\n */\nexport function applyProviderLoader(\n\tprovider: CustomProvider,\n\toptions?: { includeDisabled?: boolean },\n): CustomProvider | null {\n\tconst baseName = provider.id.split(\"-\")[0] ?? provider.id;\n\tconst loader = PROVIDER_LOADERS[provider.id] ?? PROVIDER_LOADERS[baseName];\n\tconst enhanced: CustomProvider = { ...provider };\n\tlet enabled = provider.enabled ?? true;\n\n\tif (loader) {\n\t\tconst result = loader(provider.id);\n\n\t\t// Merge loader results with provider config\n\t\tif (result) {\n\t\t\tif (result.headers) {\n\t\t\t\tenhanced.headers = mergeHeaders(result.headers, enhanced.headers);\n\t\t\t}\n\n\t\t\tif (result.baseUrl && !provider.baseUrl) {\n\t\t\t\tenhanced.baseUrl = result.baseUrl;\n\t\t\t}\n\n\t\t\tif (result.enabled !== undefined) {\n\t\t\t\tenabled = result.enabled;\n\t\t\t}\n\n\t\t\tif (result.options) {\n\t\t\t\tenhanced.options = { ...result.options, ...enhanced.options };\n\t\t\t}\n\t\t}\n\n\t\tenhanced.enabled = enabled;\n\t}\n\n\tif (enabled === false && !options?.includeDisabled) {\n\t\treturn null;\n\t}\n\n\treturn enhanced;\n}\n\n/**\n * Load config with hierarchy (global -> project -> env)\n */\nexport function loadConfig(\n\tincludeDisabled = false,\n\tensureFactory?: (policy: CustomModelUrlPolicyConfig) => {\n\t\tconfig: CustomModelConfig;\n\t\tmodelProviderMap: Map<string, string>;\n\t} | null,\n\toptions?: {\n\t\tvalidateUrls?: boolean;\n\t},\n): CustomModelConfig {\n\tconst needsFactoryAwareConfig = Boolean(ensureFactory);\n\tconst shouldValidateUrls = options?.validateUrls ?? true;\n\tif (\n\t\tcachedConfig &&\n\t\t!includeDisabled &&\n\t\t(!needsFactoryAwareConfig || cachedConfigCheckedFactoryFallback)\n\t) {\n\t\treturn cachedConfig;\n\t}\n\n\t// Try loading from hierarchy\n\tconst paths = getConfigPathEntries();\n\tlet mergedConfig: CustomModelConfig = { providers: [] };\n\n\tfor (const entry of paths) {\n\t\tconst untrustedProject = entry.scope === \"project\" && !entry.trusted;\n\t\tconst config = untrustedProject\n\t\t\t? loadUntrustedProjectConfigFile(entry.path)\n\t\t\t: loadConfigFile(entry.path);\n\t\tif (config) {\n\t\t\tmergedConfig = mergeDeep(mergedConfig, config);\n\t\t}\n\t}\n\tconst hadConfiguredProviders = mergedConfig.providers.length > 0;\n\n\t// If no configs found, try Factory fallback\n\tif (mergedConfig.providers.length === 0 && ensureFactory) {\n\t\tconst factoryFallback = ensureFactory(mergedConfig);\n\t\tif (factoryFallback) {\n\t\t\tconst fallbackConfig: CustomModelConfig = {\n\t\t\t\t...factoryFallback.config,\n\t\t\t\t...(mergedConfig.allowedBaseUrls\n\t\t\t\t\t? { allowedBaseUrls: mergedConfig.allowedBaseUrls }\n\t\t\t\t\t: {}),\n\t\t\t\t...(mergedConfig.internalBaseUrlAllowList\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tinternalBaseUrlAllowList: mergedConfig.internalBaseUrlAllowList,\n\t\t\t\t\t\t}\n\t\t\t\t\t: {}),\n\t\t\t};\n\t\t\tif (shouldValidateUrls) {\n\t\t\t\tvalidateCustomModelConfigUrls(\n\t\t\t\t\tfallbackConfig,\n\t\t\t\t\t\"merged model configuration\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (!includeDisabled) {\n\t\t\t\tcachedConfig = fallbackConfig;\n\t\t\t\tcachedConfigCheckedFactoryFallback = true;\n\t\t\t}\n\t\t\treturn fallbackConfig;\n\t\t}\n\t}\n\n\t// Apply provider-specific loaders\n\tmergedConfig.providers = mergedConfig.providers\n\t\t.map((provider) => applyProviderLoader(provider, { includeDisabled }))\n\t\t.filter((provider): provider is CustomProvider => Boolean(provider));\n\n\tif (shouldValidateUrls) {\n\t\tvalidateCustomModelConfigUrls(mergedConfig, \"merged model configuration\");\n\t}\n\n\tif (!includeDisabled) {\n\t\tcachedConfig = mergedConfig;\n\t\tcachedConfigCheckedFactoryFallback =\n\t\t\tBoolean(ensureFactory) || hadConfiguredProviders;\n\t}\n\treturn mergedConfig;\n}\n\nexport function getMergedCustomModelUrlPolicyConfig(): CustomModelUrlPolicyConfig {\n\t// Avoid priming the shared config cache before registry loading has a chance\n\t// to apply Factory fallback providers. We only need the allow-lists here, so\n\t// skip merged URL validation to keep the last registered registry usable after\n\t// validation rejects an edited config on disk.\n\tconst { allowedBaseUrls, internalBaseUrlAllowList } =\n\t\tcachedConfig ?? loadConfig(true, undefined, { validateUrls: false });\n\treturn {\n\t\t...(allowedBaseUrls ? { allowedBaseUrls } : {}),\n\t\t...(internalBaseUrlAllowList ? { internalBaseUrlAllowList } : {}),\n\t};\n}\n"]}
1
+ {"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/models/config-loader.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Model Configuration Loader\n * Schema definitions, file loading, parsing, and merging for model configs.\n */\n\nimport { existsSync, readFileSync, statSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { Type } from \"@sinclair/typebox\";\nimport type { Static } from \"@sinclair/typebox\";\nimport type { ErrorObject } from \"ajv\";\nimport { PATHS } from \"../config/constants.js\";\nimport { hasAwsCredentials } from \"../providers/aws-auth.js\";\nimport {\n\tsubstituteEnvVars,\n\tsubstituteFileRefs,\n} from \"../utils/config-substitution.js\";\nimport { isRecord } from \"../utils/json.js\";\nimport {\n\ttype ParseError as JsoncParseError,\n\tparseJsonc,\n\tprintParseErrorCode,\n} from \"../utils/jsonc-umd.js\";\nimport { createLogger } from \"../utils/logger.js\";\nimport { resolveEnvPath } from \"../utils/path-expansion.js\";\nimport { sanitizeWithStaticMask } from \"../utils/secret-redactor.js\";\nimport { compileTypeboxSchema } from \"../utils/typebox-ajv.js\";\nimport {\n\ttype CustomModelUrlPolicyConfig,\n\turlMatchesStrictPrefix,\n\tvalidateCustomModelConfigUrls,\n} from \"./url-policy.js\";\n\nconst logger = createLogger(\"models:registry\");\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Configuration Schemas (TypeBox)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** Optional custom headers to send with API requests */\nconst headersSchema = Type.Optional(Type.Record(Type.String(), Type.String()));\nconst compatSchema = Type.Optional(\n\tType.Object({\n\t\tsupportsStore: Type.Optional(Type.Boolean()),\n\t\tsupportsDeveloperRole: Type.Optional(Type.Boolean()),\n\t\tsupportsReasoningEffort: Type.Optional(Type.Boolean()),\n\t\tsupportsResponsesApi: Type.Optional(Type.Boolean()),\n\t\tmaxTokensField: Type.Optional(\n\t\t\tType.Union([\n\t\t\t\tType.Literal(\"max_tokens\"),\n\t\t\t\tType.Literal(\"max_completion_tokens\"),\n\t\t\t]),\n\t\t),\n\t\trequiresToolResultName: Type.Optional(Type.Boolean()),\n\t\trequiresAssistantAfterToolResult: Type.Optional(Type.Boolean()),\n\t\trequiresThinkingAsText: Type.Optional(Type.Boolean()),\n\t\trequiresMistralToolIds: Type.Optional(Type.Boolean()),\n\t}),\n);\n\n/**\n * Schema for individual model configuration within a provider.\n */\nexport const modelSchema = Type.Object({\n\tid: Type.String({ minLength: 1 }),\n\tname: Type.String({ minLength: 1 }),\n\tapi: Type.Optional(\n\t\tType.Union([\n\t\t\tType.Literal(\"openai-completions\"),\n\t\t\tType.Literal(\"openai-responses\"),\n\t\t\tType.Literal(\"openai-codex-responses\"),\n\t\t\tType.Literal(\"openai-codex-app-server\"),\n\t\t\tType.Literal(\"anthropic-messages\"),\n\t\t\tType.Literal(\"google-generative-ai\"),\n\t\t\tType.Literal(\"google-gemini-cli\"),\n\t\t\tType.Literal(\"bedrock-converse\"),\n\t\t\tType.Literal(\"vertex-ai\"),\n\t\t\tType.Literal(\"scripted-replay\"),\n\t\t]),\n\t),\n\tbaseUrl: Type.Optional(Type.String({ minLength: 1 })),\n\treasoning: Type.Optional(Type.Boolean()),\n\tinput: Type.Optional(\n\t\tType.Array(Type.Union([Type.Literal(\"text\"), Type.Literal(\"image\")])),\n\t),\n\tcost: Type.Optional(\n\t\tType.Object({\n\t\t\tinput: Type.Number({ minimum: 0 }),\n\t\t\toutput: Type.Number({ minimum: 0 }),\n\t\t\tcacheRead: Type.Number({ minimum: 0 }),\n\t\t\tcacheWrite: Type.Number({ minimum: 0 }),\n\t\t}),\n\t),\n\tcontextWindow: Type.Number({ minimum: 1 }),\n\tmaxTokens: Type.Number({ minimum: 1 }),\n\theaders: headersSchema,\n\tcompat: compatSchema,\n});\n\nexport const providerSchema = Type.Object({\n\tid: Type.String({ minLength: 1 }),\n\tname: Type.String({ minLength: 1 }),\n\tapi: Type.Optional(modelSchema.properties.api),\n\tbaseUrl: Type.Optional(Type.String({ minLength: 1 })),\n\theaders: headersSchema,\n\tapiKeyEnv: Type.Optional(Type.String({ minLength: 1 })),\n\tapiKey: Type.Optional(Type.String({ minLength: 1 })),\n\tenabled: Type.Optional(Type.Boolean({ default: true })),\n\toptions: Type.Optional(Type.Record(Type.String(), Type.Unknown())),\n\tmodels: Type.Optional(Type.Array(modelSchema)),\n});\n\nexport const configSchema = Type.Object({\n\t$schema: Type.Optional(Type.String()),\n\tallowedBaseUrls: Type.Optional(Type.Array(Type.String({ minLength: 1 }))),\n\tinternalBaseUrlAllowList: Type.Optional(\n\t\tType.Array(Type.String({ minLength: 1 })),\n\t),\n\tproviders: Type.Array(providerSchema, { default: [] }),\n\taliases: Type.Optional(\n\t\tType.Record(Type.String(), Type.String(), {\n\t\t\tdescription:\n\t\t\t\t\"Model aliases for convenience (e.g., 'fast': 'anthropic/claude-haiku')\",\n\t\t}),\n\t),\n});\n\nexport const configValidator = compileTypeboxSchema(configSchema);\n\nexport type CustomModelConfig = Static<typeof configSchema>;\nexport type CustomProvider = Static<typeof providerSchema>;\nexport type CustomModel = Static<typeof modelSchema>;\n\nexport type ConfigPathScope = \"global\" | \"project\" | \"legacy\" | \"env\";\n\nexport interface ConfigPathEntry {\n\tpath: string;\n\tscope: ConfigPathScope;\n\ttrusted: boolean;\n}\n\nconst TRUST_PROJECT_MODEL_CONFIG_ENV = \"MAESTRO_TRUST_PROJECT_MODEL_CONFIG\";\nconst TRUE_ENV_VALUES = new Set([\"1\", \"true\", \"yes\", \"on\"]);\n\nfunction isProjectModelConfigTrusted(): boolean {\n\tconst value = process.env[TRUST_PROJECT_MODEL_CONFIG_ENV];\n\treturn value !== undefined && TRUE_ENV_VALUES.has(value.toLowerCase());\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Provider Loaders\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface ProviderLoaderResult {\n\theaders?: Record<string, string>;\n\tbaseUrl?: string;\n\tenabled?: boolean;\n\toptions?: Record<string, unknown>;\n}\n\ntype ProviderLoader = (providerId: string) => ProviderLoaderResult | null;\n\nexport const PROVIDER_LOADERS: Record<string, ProviderLoader> = {\n\tanthropic: (_providerId: string) => ({\n\t\theaders: {\n\t\t\t\"anthropic-beta\": \"prompt-caching-2024-07-31\",\n\t\t},\n\t}),\n\n\tbedrock: (_providerId: string) => {\n\t\tconst region = process.env.AWS_REGION ?? \"us-east-1\";\n\n\t\treturn {\n\t\t\tbaseUrl: `https://bedrock-runtime.${region}.amazonaws.com`,\n\t\t\tenabled: hasAwsCredentials(),\n\t\t\toptions: { region },\n\t\t};\n\t},\n\n\t\"vertex-ai\": (_providerId: string) => {\n\t\tconst project =\n\t\t\tprocess.env.GOOGLE_CLOUD_PROJECT ??\n\t\t\tprocess.env.GCP_PROJECT ??\n\t\t\tprocess.env.GCLOUD_PROJECT;\n\t\tconst location =\n\t\t\tprocess.env.GOOGLE_CLOUD_LOCATION ??\n\t\t\tprocess.env.VERTEX_LOCATION ??\n\t\t\t\"us-east5\";\n\n\t\tif (!project) {\n\t\t\treturn { enabled: false };\n\t\t}\n\n\t\treturn {\n\t\t\tenabled: true,\n\t\t\toptions: { project, location },\n\t\t};\n\t},\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Utility Functions\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function mergeDeep<T>(target: T, source: Partial<T>): T {\n\tconst output = { ...target };\n\n\tif (isObject(target) && isObject(source)) {\n\t\tconst sourceRecord = source as Record<string, unknown>;\n\t\tconst outputRecord = output as Record<string, unknown>;\n\t\tfor (const key of Object.keys(sourceRecord)) {\n\t\t\t// Skip prototype-polluting keys to guard against __proto__/constructor\n\t\t\t// injection via untrusted JSON config (fixes #2542).\n\t\t\tif (key === \"__proto__\" || key === \"constructor\" || key === \"prototype\") {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst sourceValue = sourceRecord[key];\n\t\t\tconst targetValue = outputRecord[key];\n\n\t\t\tif (isObject(sourceValue) && isObject(targetValue)) {\n\t\t\t\toutputRecord[key] = mergeDeep(targetValue, sourceValue);\n\t\t\t} else if (Array.isArray(sourceValue) && Array.isArray(targetValue)) {\n\t\t\t\tif (key === \"allowedBaseUrls\" || key === \"internalBaseUrlAllowList\") {\n\t\t\t\t\toutputRecord[key] = intersectAllowedBaseUrls(\n\t\t\t\t\t\ttargetValue,\n\t\t\t\t\t\tsourceValue,\n\t\t\t\t\t) as unknown;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t// For arrays, concatenate and dedupe by id if objects have id property\n\t\t\t\tconst merged = [...targetValue];\n\t\t\t\tfor (const item of sourceValue) {\n\t\t\t\t\tconst itemId =\n\t\t\t\t\t\tisObject(item) && \"id\" in item\n\t\t\t\t\t\t\t? (item as { id?: unknown }).id\n\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\tif (itemId !== undefined) {\n\t\t\t\t\t\tconst existingIndex = merged.findIndex((entry) => {\n\t\t\t\t\t\t\tif (isObject(entry) && \"id\" in entry) {\n\t\t\t\t\t\t\t\treturn (entry as { id?: unknown }).id === itemId;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (existingIndex >= 0) {\n\t\t\t\t\t\t\t// Merge existing item\n\t\t\t\t\t\t\tmerged[existingIndex] = mergeDeep(\n\t\t\t\t\t\t\t\tmerged[existingIndex] as object,\n\t\t\t\t\t\t\t\titem as object,\n\t\t\t\t\t\t\t) as (typeof targetValue)[number];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tmerged.push(item as (typeof targetValue)[number]);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmerged.push(item as (typeof targetValue)[number]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\toutputRecord[key] = merged as unknown;\n\t\t\t} else {\n\t\t\t\toutputRecord[key] = sourceValue;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn output;\n}\n\nfunction intersectAllowedBaseUrls(\n\ttargetValue: unknown[],\n\tsourceValue: unknown[],\n): string[] {\n\tconst targetEntries = targetValue.filter(\n\t\t(entry): entry is string => typeof entry === \"string\",\n\t);\n\tconst sourceEntries = sourceValue.filter(\n\t\t(entry): entry is string => typeof entry === \"string\",\n\t);\n\tconst merged = new Map<string, string>();\n\tconst invalidEntries: string[] = [];\n\tfor (const targetEntry of targetEntries) {\n\t\tconst targetUrl = parsePolicyUrlForMerge(targetEntry);\n\t\tif (!targetUrl) {\n\t\t\tinvalidEntries.push(targetEntry);\n\t\t\tcontinue;\n\t\t}\n\t\tfor (const sourceEntry of sourceEntries) {\n\t\t\tconst sourceUrl = parsePolicyUrlForMerge(sourceEntry);\n\t\t\tif (!sourceUrl) {\n\t\t\t\tinvalidEntries.push(sourceEntry);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (urlMatchesStrictPrefix(sourceUrl, targetUrl)) {\n\t\t\t\tmerged.set(sourceUrl.toString(), sourceEntry);\n\t\t\t} else if (urlMatchesStrictPrefix(targetUrl, sourceUrl)) {\n\t\t\t\tmerged.set(targetUrl.toString(), targetEntry);\n\t\t\t}\n\t\t}\n\t}\n\tconst intersection = [...merged.values()];\n\tconst validEntries =\n\t\tintersection.length > 0\n\t\t\t? intersection\n\t\t\t: targetValue.filter(\n\t\t\t\t\t(entry): entry is string => typeof entry === \"string\",\n\t\t\t\t);\n\tconst result = [...validEntries];\n\tfor (const invalidEntry of invalidEntries) {\n\t\tif (!result.includes(invalidEntry)) {\n\t\t\tresult.push(invalidEntry);\n\t\t}\n\t}\n\treturn result;\n}\n\nfunction parsePolicyUrlForMerge(value: string): URL | null {\n\ttry {\n\t\treturn new URL(value);\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nexport function mergeHeaders(\n\tbase?: Record<string, string>,\n\toverrides?: Record<string, string>,\n): Record<string, string> | undefined {\n\tif (!base && !overrides) {\n\t\treturn undefined;\n\t}\n\treturn { ...(base ?? {}), ...(overrides ?? {}) };\n}\n\nfunction isObject(item: unknown): item is Record<string, unknown> {\n\treturn item !== null && typeof item === \"object\" && !Array.isArray(item);\n}\n\nexport function formatValidationErrors(errors?: ErrorObject[] | null): string {\n\tif (!errors || errors.length === 0) {\n\t\treturn \"Invalid configuration\";\n\t}\n\treturn errors\n\t\t.map(\n\t\t\t(err) => `${err.instancePath || \"/\"} ${err.message ?? \"invalid value\"}`,\n\t\t)\n\t\t.join(\"; \");\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Config File Loading\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** Cached file contents keyed by path */\nexport const fileSnapshots = new Map<\n\tstring,\n\t{ mtimeMs: number; data: string }\n>();\n\n/** Cached merged config */\nexport let cachedConfig: CustomModelConfig | null = null;\nlet cachedConfigCheckedFactoryFallback = false;\n\nexport function clearCachedConfig(): void {\n\tcachedConfig = null;\n\tcachedConfigCheckedFactoryFallback = false;\n\tfileSnapshots.clear();\n}\n\nexport function setCachedConfig(config: CustomModelConfig): void {\n\tcachedConfig = config;\n\tcachedConfigCheckedFactoryFallback = true;\n}\n\n/**\n * Config file paths in order of precedence (last wins)\n */\nexport function getConfigPathEntries(): ConfigPathEntry[] {\n\tconst paths: ConfigPathEntry[] = [];\n\n\t// 1. Global config\n\tpaths.push({\n\t\tpath: join(PATHS.MAESTRO_HOME, \"config.json\"),\n\t\tscope: \"global\",\n\t\ttrusted: true,\n\t});\n\tpaths.push({\n\t\tpath: join(PATHS.MAESTRO_HOME, \"local.json\"),\n\t\tscope: \"global\",\n\t\ttrusted: true,\n\t});\n\n\t// 2. Project config (current directory)\n\tconst projectTrusted = isProjectModelConfigTrusted();\n\tconst projectConfig = join(process.cwd(), \".maestro\", \"config.json\");\n\tif (existsSync(projectConfig)) {\n\t\tpaths.push({\n\t\t\tpath: projectConfig,\n\t\t\tscope: \"project\",\n\t\t\ttrusted: projectTrusted,\n\t\t});\n\t}\n\tconst projectLocal = join(process.cwd(), \".maestro\", \"local.json\");\n\tif (existsSync(projectLocal)) {\n\t\tpaths.push({\n\t\t\tpath: projectLocal,\n\t\t\tscope: \"project\",\n\t\t\ttrusted: projectTrusted,\n\t\t});\n\t}\n\n\t// 3. Legacy path for backward compatibility\n\tconst legacyPath = join(PATHS.MAESTRO_HOME, \"models.json\");\n\tif (existsSync(legacyPath)) {\n\t\tpaths.push({\n\t\t\tpath: legacyPath,\n\t\t\tscope: \"legacy\",\n\t\t\ttrusted: true,\n\t\t});\n\t}\n\n\t// 4. Environment variable override\n\tif (process.env.MAESTRO_MODELS_FILE) {\n\t\tconst override = resolveEnvPath(process.env.MAESTRO_MODELS_FILE);\n\t\tif (override) paths.push({ path: override, scope: \"env\", trusted: true });\n\t}\n\n\tif (process.env.MAESTRO_CONFIG) {\n\t\tconst override = resolveEnvPath(process.env.MAESTRO_CONFIG);\n\t\tif (override) paths.push({ path: override, scope: \"env\", trusted: true });\n\t}\n\n\treturn paths;\n}\n\nexport function getConfigPaths(): string[] {\n\treturn getConfigPathEntries().map((entry) => entry.path);\n}\n\nexport function configPath(): string {\n\treturn (\n\t\tresolveEnvPath(process.env.MAESTRO_MODELS_FILE) ??\n\t\tjoin(PATHS.MAESTRO_HOME, \"models.json\")\n\t);\n}\n\n/**\n * Parse JSONC (JSON with comments) with helpful error messages\n */\nexport function parseJsoncWithErrors(text: string, filePath: string): unknown {\n\tconst errors: JsoncParseError[] = [];\n\tconst data = parseJsonc(text, errors, {\n\t\tallowTrailingComma: true,\n\t\tdisallowComments: false,\n\t});\n\n\tif (errors.length > 0) {\n\t\tconst lines = text.split(\"\\n\");\n\t\tconst errorDetails = errors\n\t\t\t.map((e) => {\n\t\t\t\tconst beforeOffset = text.substring(0, e.offset).split(\"\\n\");\n\t\t\t\tconst line = beforeOffset.length;\n\t\t\t\tconst lastLine = beforeOffset[beforeOffset.length - 1];\n\t\t\t\tconst column = (lastLine?.length ?? 0) + 1;\n\t\t\t\tconst problemLine = lines[line - 1];\n\n\t\t\t\tconst error = `${printParseErrorCode(e.error)} at line ${line}, column ${column}`;\n\t\t\t\tif (!problemLine) return error;\n\n\t\t\t\treturn `${error}\\n Line ${line}: ${problemLine}\\n${\"\".padStart(column + 9)}^`;\n\t\t\t})\n\t\t\t.join(\"\\n\");\n\n\t\tthrow new Error(\n\t\t\t`Failed to parse JSONC config at ${filePath}:\\n${errorDetails}`,\n\t\t);\n\t}\n\n\treturn data;\n}\n\nexport function readJsonFile(filePath: string): string | null {\n\ttry {\n\t\tconst stats = statSync(filePath);\n\t\tconst cached = fileSnapshots.get(filePath);\n\t\tif (cached && cached.mtimeMs === stats.mtimeMs) {\n\t\t\treturn cached.data;\n\t\t}\n\t\tconst data = readFileSync(filePath, \"utf-8\");\n\t\tfileSnapshots.set(filePath, { mtimeMs: stats.mtimeMs, data });\n\t\treturn data;\n\t} catch {\n\t\tfileSnapshots.delete(filePath);\n\t\treturn null;\n\t}\n}\n\n/**\n * Load and parse a single config file\n */\nfunction loadConfigFileWithOptions(\n\tpath: string,\n\toptions?: { expandReferences?: boolean },\n): CustomModelConfig | null {\n\tconst raw = existsSync(path) ? readJsonFile(path) : null;\n\tif (!raw) {\n\t\treturn null;\n\t}\n\n\ttry {\n\t\tlet processed = raw;\n\t\tif (options?.expandReferences !== false) {\n\t\t\t// Process file references first (before env vars, so file contents can have env vars)\n\t\t\tconst configDir = dirname(path);\n\t\t\tprocessed = substituteFileRefs(processed, configDir);\n\n\t\t\t// Process environment variable substitution\n\t\t\tprocessed = substituteEnvVars(processed, logger);\n\t\t}\n\n\t\t// Parse JSONC (supports comments and trailing commas)\n\t\tconst data = parseJsoncWithErrors(processed, path);\n\n\t\tif (!configValidator(data)) {\n\t\t\tthrow new Error(formatValidationErrors(configValidator.errors));\n\t\t}\n\n\t\tconst config = data as CustomModelConfig;\n\t\treturn config;\n\t} catch (error) {\n\t\tthrow new Error(\n\t\t\t`Failed to parse config at ${path}: ${error instanceof Error ? error.message : String(error)}`,\n\t\t);\n\t}\n}\n\nexport function loadConfigFile(\n\tpath: string,\n\toptions?: { expandReferences?: boolean },\n): CustomModelConfig | null {\n\treturn loadConfigFileWithOptions(path, options);\n}\n\nexport function loadUntrustedProjectConfigFile(\n\tpath: string,\n): CustomModelConfig | null {\n\tconst raw = existsSync(path) ? readJsonFile(path) : null;\n\tif (!raw) {\n\t\treturn null;\n\t}\n\n\ttry {\n\t\tconst data = parseJsoncWithErrors(raw, path);\n\t\treturn sanitizeUntrustedProjectConfig(data, path);\n\t} catch (error) {\n\t\tlogger.warn(\"Ignoring invalid untrusted project model config\", {\n\t\t\tpath,\n\t\t\ttrustEnv: TRUST_PROJECT_MODEL_CONFIG_ENV,\n\t\t\terror: sanitizeWithStaticMask(\n\t\t\t\terror instanceof Error ? error.message : String(error),\n\t\t\t),\n\t\t});\n\t\treturn { providers: [] };\n\t}\n}\n\nexport function sanitizeUntrustedProjectConfig(\n\tconfig: unknown,\n\tpath: string,\n): CustomModelConfig {\n\tconst providers: CustomProvider[] = [];\n\tif (!isRecord(config)) {\n\t\tlogger.warn(\"Ignoring invalid untrusted project model config\", {\n\t\t\tpath,\n\t\t\ttrustEnv: TRUST_PROJECT_MODEL_CONFIG_ENV,\n\t\t});\n\t\treturn { providers };\n\t}\n\n\tconst sanitized =\n\t\t\"providers\" in config ||\n\t\t\"aliases\" in config ||\n\t\tObject.keys(config).some((key) => key !== \"$schema\");\n\n\tif (sanitized) {\n\t\tlogger.warn(\"Ignoring sensitive project model config fields\", {\n\t\t\tpath,\n\t\t\ttrustEnv: TRUST_PROJECT_MODEL_CONFIG_ENV,\n\t\t});\n\t}\n\n\treturn { providers };\n}\n\n/**\n * Apply provider-specific configurations\n */\nexport function applyProviderLoader(\n\tprovider: CustomProvider,\n\toptions?: { includeDisabled?: boolean },\n): CustomProvider | null {\n\tconst baseName = provider.id.split(\"-\")[0] ?? provider.id;\n\tconst loader = PROVIDER_LOADERS[provider.id] ?? PROVIDER_LOADERS[baseName];\n\tconst enhanced: CustomProvider = { ...provider };\n\tlet enabled = provider.enabled ?? true;\n\n\tif (loader) {\n\t\tconst result = loader(provider.id);\n\n\t\t// Merge loader results with provider config\n\t\tif (result) {\n\t\t\tif (result.headers) {\n\t\t\t\tenhanced.headers = mergeHeaders(result.headers, enhanced.headers);\n\t\t\t}\n\n\t\t\tif (result.baseUrl && !provider.baseUrl) {\n\t\t\t\tenhanced.baseUrl = result.baseUrl;\n\t\t\t}\n\n\t\t\tif (result.enabled !== undefined) {\n\t\t\t\tenabled = result.enabled;\n\t\t\t}\n\n\t\t\tif (result.options) {\n\t\t\t\tenhanced.options = { ...result.options, ...enhanced.options };\n\t\t\t}\n\t\t}\n\n\t\tenhanced.enabled = enabled;\n\t}\n\n\tif (enabled === false && !options?.includeDisabled) {\n\t\treturn null;\n\t}\n\n\treturn enhanced;\n}\n\n/**\n * Load config with hierarchy (global -> project -> env)\n */\nexport function loadConfig(\n\tincludeDisabled = false,\n\tensureFactory?: (policy: CustomModelUrlPolicyConfig) => {\n\t\tconfig: CustomModelConfig;\n\t\tmodelProviderMap: Map<string, string>;\n\t} | null,\n\toptions?: {\n\t\tvalidateUrls?: boolean;\n\t},\n): CustomModelConfig {\n\tconst needsFactoryAwareConfig = Boolean(ensureFactory);\n\tconst shouldValidateUrls = options?.validateUrls ?? true;\n\tif (\n\t\tcachedConfig &&\n\t\t!includeDisabled &&\n\t\t(!needsFactoryAwareConfig || cachedConfigCheckedFactoryFallback)\n\t) {\n\t\treturn cachedConfig;\n\t}\n\n\t// Try loading from hierarchy\n\tconst paths = getConfigPathEntries();\n\tlet mergedConfig: CustomModelConfig = { providers: [] };\n\n\tfor (const entry of paths) {\n\t\tconst untrustedProject = entry.scope === \"project\" && !entry.trusted;\n\t\tconst config = untrustedProject\n\t\t\t? loadUntrustedProjectConfigFile(entry.path)\n\t\t\t: loadConfigFile(entry.path);\n\t\tif (config) {\n\t\t\tmergedConfig = mergeDeep(mergedConfig, config);\n\t\t}\n\t}\n\tconst hadConfiguredProviders = mergedConfig.providers.length > 0;\n\n\t// If no configs found, try Factory fallback\n\tif (mergedConfig.providers.length === 0 && ensureFactory) {\n\t\tconst factoryFallback = ensureFactory(mergedConfig);\n\t\tif (factoryFallback) {\n\t\t\tconst fallbackConfig: CustomModelConfig = {\n\t\t\t\t...factoryFallback.config,\n\t\t\t\t...(mergedConfig.allowedBaseUrls\n\t\t\t\t\t? { allowedBaseUrls: mergedConfig.allowedBaseUrls }\n\t\t\t\t\t: {}),\n\t\t\t\t...(mergedConfig.internalBaseUrlAllowList\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tinternalBaseUrlAllowList: mergedConfig.internalBaseUrlAllowList,\n\t\t\t\t\t\t}\n\t\t\t\t\t: {}),\n\t\t\t};\n\t\t\tif (shouldValidateUrls) {\n\t\t\t\tvalidateCustomModelConfigUrls(\n\t\t\t\t\tfallbackConfig,\n\t\t\t\t\t\"merged model configuration\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (!includeDisabled) {\n\t\t\t\tcachedConfig = fallbackConfig;\n\t\t\t\tcachedConfigCheckedFactoryFallback = true;\n\t\t\t}\n\t\t\treturn fallbackConfig;\n\t\t}\n\t}\n\n\t// Apply provider-specific loaders\n\tmergedConfig.providers = mergedConfig.providers\n\t\t.map((provider) => applyProviderLoader(provider, { includeDisabled }))\n\t\t.filter((provider): provider is CustomProvider => Boolean(provider));\n\n\tif (shouldValidateUrls) {\n\t\tvalidateCustomModelConfigUrls(mergedConfig, \"merged model configuration\");\n\t}\n\n\tif (!includeDisabled) {\n\t\tcachedConfig = mergedConfig;\n\t\tcachedConfigCheckedFactoryFallback =\n\t\t\tBoolean(ensureFactory) || hadConfiguredProviders;\n\t}\n\treturn mergedConfig;\n}\n\nexport function getMergedCustomModelUrlPolicyConfig(): CustomModelUrlPolicyConfig {\n\t// Avoid priming the shared config cache before registry loading has a chance\n\t// to apply Factory fallback providers. We only need the allow-lists here, so\n\t// skip merged URL validation to keep the last registered registry usable after\n\t// validation rejects an edited config on disk.\n\tconst { allowedBaseUrls, internalBaseUrlAllowList } =\n\t\tcachedConfig ?? loadConfig(true, undefined, { validateUrls: false });\n\treturn {\n\t\t...(allowedBaseUrls ? { allowedBaseUrls } : {}),\n\t\t...(internalBaseUrlAllowList ? { internalBaseUrlAllowList } : {}),\n\t};\n}\n"]}
@@ -54,6 +54,7 @@ export * from "./mcp-settings.js";
54
54
  export * from "./memory.js";
55
55
  export * from "./memory-utils.js";
56
56
  export * from "./maestro-app-server.js";
57
+ export * from "./maestro-settings.js";
57
58
  export * from "./onboarding-utils.js";
58
59
  export * from "./proto/maestro/v1/headless_pb.js";
59
60
  export * from "./runtime-constraints.js";