@evalops/maestro 0.10.50 → 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 (406) 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-runtime.js +7756 -2800
  143. package/dist/cli-tui/client-tools/client-tool-controller.d.ts.map +1 -1
  144. package/dist/cli-tui/client-tools/client-tool-controller.js +1 -3
  145. package/dist/cli-tui/client-tools/client-tool-controller.js.map +1 -1
  146. package/dist/cli-tui/commands/undo-handlers.d.ts.map +1 -1
  147. package/dist/cli-tui/commands/undo-handlers.js +7 -2
  148. package/dist/cli-tui/commands/undo-handlers.js.map +1 -1
  149. package/dist/cli-tui/tui-renderer/skills-controller.d.ts +3 -0
  150. package/dist/cli-tui/tui-renderer/skills-controller.d.ts.map +1 -1
  151. package/dist/cli-tui/tui-renderer/skills-controller.js +77 -33
  152. package/dist/cli-tui/tui-renderer/skills-controller.js.map +1 -1
  153. package/dist/codex/app-server-client.d.ts.map +1 -1
  154. package/dist/codex/app-server-client.js +1 -3
  155. package/dist/codex/app-server-client.js.map +1 -1
  156. package/dist/codex/compatibility.d.ts.map +1 -1
  157. package/dist/codex/compatibility.js +1 -3
  158. package/dist/codex/compatibility.js.map +1 -1
  159. package/dist/codex/subagent-dispatch-table.d.ts +8 -0
  160. package/dist/codex/subagent-dispatch-table.d.ts.map +1 -1
  161. package/dist/codex/subagent-dispatch-table.js +23 -0
  162. package/dist/codex/subagent-dispatch-table.js.map +1 -1
  163. package/dist/context/manifest.d.ts.map +1 -1
  164. package/dist/context/manifest.js +1 -3
  165. package/dist/context/manifest.js.map +1 -1
  166. package/dist/conversation/render-model.d.ts +0 -36
  167. package/dist/conversation/render-model.d.ts.map +1 -1
  168. package/dist/conversation/render-model.js +1 -3
  169. package/dist/conversation/render-model.js.map +1 -1
  170. package/dist/customer-value/ambient-learning.d.ts +75 -0
  171. package/dist/customer-value/ambient-learning.d.ts.map +1 -0
  172. package/dist/customer-value/ambient-learning.js +472 -0
  173. package/dist/customer-value/ambient-learning.js.map +1 -0
  174. package/dist/customer-value/internal-helpers.d.ts +13 -0
  175. package/dist/customer-value/internal-helpers.d.ts.map +1 -0
  176. package/dist/customer-value/internal-helpers.js +70 -0
  177. package/dist/customer-value/internal-helpers.js.map +1 -0
  178. package/dist/customer-value/report.d.ts +282 -0
  179. package/dist/customer-value/report.d.ts.map +1 -0
  180. package/dist/customer-value/report.js +2085 -0
  181. package/dist/customer-value/report.js.map +1 -0
  182. package/dist/db/schema.d.ts +5 -1
  183. package/dist/db/schema.d.ts.map +1 -1
  184. package/dist/db/schema.js.map +1 -1
  185. package/dist/evalops/agent-bootstrap.d.ts.map +1 -1
  186. package/dist/evalops/agent-bootstrap.js +1 -3
  187. package/dist/evalops/agent-bootstrap.js.map +1 -1
  188. package/dist/evalops/agent-mcp-metadata.d.ts.map +1 -1
  189. package/dist/evalops/agent-mcp-metadata.js +1 -3
  190. package/dist/evalops/agent-mcp-metadata.js.map +1 -1
  191. package/dist/index.d.ts +1 -0
  192. package/dist/index.d.ts.map +1 -1
  193. package/dist/index.js +1 -0
  194. package/dist/index.js.map +1 -1
  195. package/dist/installers/maestro-review-workflow.d.ts +38 -0
  196. package/dist/installers/maestro-review-workflow.d.ts.map +1 -0
  197. package/dist/installers/maestro-review-workflow.js +163 -0
  198. package/dist/installers/maestro-review-workflow.js.map +1 -0
  199. package/dist/load-env.d.ts.map +1 -1
  200. package/dist/load-env.js +2 -1
  201. package/dist/load-env.js.map +1 -1
  202. package/dist/main.d.ts.map +1 -1
  203. package/dist/main.js +92 -3
  204. package/dist/main.js.map +1 -1
  205. package/dist/mcp/config.d.ts.map +1 -1
  206. package/dist/mcp/config.js +1 -3
  207. package/dist/mcp/config.js.map +1 -1
  208. package/dist/mcp/elicitation.d.ts.map +1 -1
  209. package/dist/mcp/elicitation.js +1 -3
  210. package/dist/mcp/elicitation.js.map +1 -1
  211. package/dist/mcp/official-registry.d.ts.map +1 -1
  212. package/dist/mcp/official-registry.js +1 -3
  213. package/dist/mcp/official-registry.js.map +1 -1
  214. package/dist/mcp/workspace-trust.d.ts.map +1 -1
  215. package/dist/mcp/workspace-trust.js +1 -3
  216. package/dist/mcp/workspace-trust.js.map +1 -1
  217. package/dist/memory/service-client.d.ts.map +1 -1
  218. package/dist/memory/service-client.js +1 -3
  219. package/dist/memory/service-client.js.map +1 -1
  220. package/dist/models/config-loader.d.ts.map +1 -1
  221. package/dist/models/config-loader.js +1 -3
  222. package/dist/models/config-loader.js.map +1 -1
  223. package/dist/node_modules/@evalops/contracts/dist/index.d.ts +1 -0
  224. package/dist/node_modules/@evalops/contracts/dist/index.d.ts.map +1 -1
  225. package/dist/node_modules/@evalops/contracts/dist/index.js +1 -0
  226. package/dist/node_modules/@evalops/contracts/dist/index.js.map +1 -1
  227. package/dist/node_modules/@evalops/contracts/dist/maestro-settings.d.ts +61 -0
  228. package/dist/node_modules/@evalops/contracts/dist/maestro-settings.d.ts.map +1 -0
  229. package/dist/node_modules/@evalops/contracts/dist/maestro-settings.js +183 -0
  230. package/dist/node_modules/@evalops/contracts/dist/maestro-settings.js.map +1 -0
  231. package/dist/node_modules/@evalops/contracts/package.json +1 -1
  232. package/dist/node_modules/@evalops/tui/package.json +1 -1
  233. package/dist/oauth/connectors.d.ts.map +1 -1
  234. package/dist/oauth/connectors.js +1 -3
  235. package/dist/oauth/connectors.js.map +1 -1
  236. package/dist/oauth/evalops.d.ts.map +1 -1
  237. package/dist/oauth/evalops.js +1 -3
  238. package/dist/oauth/evalops.js.map +1 -1
  239. package/dist/platform/a2a-client.d.ts.map +1 -1
  240. package/dist/platform/a2a-client.js +1 -3
  241. package/dist/platform/a2a-client.js.map +1 -1
  242. package/dist/platform/a2a-cockpit.d.ts +1 -0
  243. package/dist/platform/a2a-cockpit.d.ts.map +1 -1
  244. package/dist/platform/a2a-cockpit.js +42 -11
  245. package/dist/platform/a2a-cockpit.js.map +1 -1
  246. package/dist/platform/a2a-completion-audit.d.ts +1 -1
  247. package/dist/platform/a2a-completion-audit.d.ts.map +1 -1
  248. package/dist/platform/a2a-completion-audit.js +7 -11
  249. package/dist/platform/a2a-completion-audit.js.map +1 -1
  250. package/dist/platform/a2a-maestro-peer.js +16 -0
  251. package/dist/platform/a2a-maestro-peer.js.map +1 -1
  252. package/dist/platform/a2a-peer-pairing.d.ts.map +1 -1
  253. package/dist/platform/a2a-peer-pairing.js +1 -3
  254. package/dist/platform/a2a-peer-pairing.js.map +1 -1
  255. package/dist/platform/a2a-peer-registry.d.ts.map +1 -1
  256. package/dist/platform/a2a-peer-registry.js +1 -3
  257. package/dist/platform/a2a-peer-registry.js.map +1 -1
  258. package/dist/platform/a2a-task-ledger.d.ts +20 -0
  259. package/dist/platform/a2a-task-ledger.d.ts.map +1 -1
  260. package/dist/platform/a2a-task-ledger.js +207 -11
  261. package/dist/platform/a2a-task-ledger.js.map +1 -1
  262. package/dist/platform/a2a-work-graph.d.ts.map +1 -1
  263. package/dist/platform/a2a-work-graph.js +1 -3
  264. package/dist/platform/a2a-work-graph.js.map +1 -1
  265. package/dist/platform/operating-layer.d.ts.map +1 -1
  266. package/dist/platform/operating-layer.js +14 -8
  267. package/dist/platform/operating-layer.js.map +1 -1
  268. package/dist/platform/tool-execution-client.d.ts.map +1 -1
  269. package/dist/platform/tool-execution-client.js +19 -2
  270. package/dist/platform/tool-execution-client.js.map +1 -1
  271. package/dist/providers/auth.d.ts.map +1 -1
  272. package/dist/providers/auth.js +1 -3
  273. package/dist/providers/auth.js.map +1 -1
  274. package/dist/runtime/env.d.ts +9 -1
  275. package/dist/runtime/env.d.ts.map +1 -1
  276. package/dist/runtime/env.js +63 -1
  277. package/dist/runtime/env.js.map +1 -1
  278. package/dist/safety/policy.d.ts.map +1 -1
  279. package/dist/safety/policy.js +1 -4
  280. package/dist/safety/policy.js.map +1 -1
  281. package/dist/sandbox/docker-sandbox.d.ts.map +1 -1
  282. package/dist/sandbox/docker-sandbox.js +6 -1
  283. package/dist/sandbox/docker-sandbox.js.map +1 -1
  284. package/dist/server/handlers/hosted-runner-drain.d.ts.map +1 -1
  285. package/dist/server/handlers/hosted-runner-drain.js +1 -3
  286. package/dist/server/handlers/hosted-runner-drain.js.map +1 -1
  287. package/dist/server/handlers/platform-a2a-push.d.ts.map +1 -1
  288. package/dist/server/handlers/platform-a2a-push.js +53 -2
  289. package/dist/server/handlers/platform-a2a-push.js.map +1 -1
  290. package/dist/server/handlers/runtime-app-server-ws.d.ts.map +1 -1
  291. package/dist/server/handlers/runtime-app-server-ws.js +1 -3
  292. package/dist/server/handlers/runtime-app-server-ws.js.map +1 -1
  293. package/dist/server/headless-runtime-service.d.ts +16 -0
  294. package/dist/server/headless-runtime-service.d.ts.map +1 -1
  295. package/dist/server/headless-runtime-service.js +232 -206
  296. package/dist/server/headless-runtime-service.js.map +1 -1
  297. package/dist/server/hosted-agent-runtime-progress.d.ts.map +1 -1
  298. package/dist/server/hosted-agent-runtime-progress.js +12 -3
  299. package/dist/server/hosted-agent-runtime-progress.js.map +1 -1
  300. package/dist/server/pending-request-payload.d.ts.map +1 -1
  301. package/dist/server/pending-request-payload.js +1 -3
  302. package/dist/server/pending-request-payload.js.map +1 -1
  303. package/dist/server/route-auth.d.ts.map +1 -1
  304. package/dist/server/route-auth.js +2 -0
  305. package/dist/server/route-auth.js.map +1 -1
  306. package/dist/server/session-serialization.d.ts.map +1 -1
  307. package/dist/server/session-serialization.js +1 -3
  308. package/dist/server/session-serialization.js.map +1 -1
  309. package/dist/services/compliance/normalize.d.ts.map +1 -1
  310. package/dist/services/compliance/normalize.js +1 -3
  311. package/dist/services/compliance/normalize.js.map +1 -1
  312. package/dist/services/intelligent-router/normalize.d.ts.map +1 -1
  313. package/dist/services/intelligent-router/normalize.js +1 -3
  314. package/dist/services/intelligent-router/normalize.js.map +1 -1
  315. package/dist/services/revenue-attribution/normalize.d.ts.map +1 -1
  316. package/dist/services/revenue-attribution/normalize.js +1 -3
  317. package/dist/services/revenue-attribution/normalize.js.map +1 -1
  318. package/dist/services/traces/normalize.d.ts.map +1 -1
  319. package/dist/services/traces/normalize.js +1 -3
  320. package/dist/services/traces/normalize.js.map +1 -1
  321. package/dist/services/workspace-config/normalize.d.ts.map +1 -1
  322. package/dist/services/workspace-config/normalize.js +1 -3
  323. package/dist/services/workspace-config/normalize.js.map +1 -1
  324. package/dist/skills/composer.d.ts.map +1 -1
  325. package/dist/skills/composer.js +13 -1
  326. package/dist/skills/composer.js.map +1 -1
  327. package/dist/skills/index.d.ts +1 -0
  328. package/dist/skills/index.d.ts.map +1 -1
  329. package/dist/skills/index.js +1 -0
  330. package/dist/skills/index.js.map +1 -1
  331. package/dist/skills/learned-guidelines.d.ts +33 -0
  332. package/dist/skills/learned-guidelines.d.ts.map +1 -0
  333. package/dist/skills/learned-guidelines.js +291 -0
  334. package/dist/skills/learned-guidelines.js.map +1 -0
  335. package/dist/skills/linter.d.ts.map +1 -1
  336. package/dist/skills/linter.js +1 -3
  337. package/dist/skills/linter.js.map +1 -1
  338. package/dist/skills/runtime-activation.d.ts +1 -0
  339. package/dist/skills/runtime-activation.d.ts.map +1 -1
  340. package/dist/skills/runtime-activation.js +2 -3
  341. package/dist/skills/runtime-activation.js.map +1 -1
  342. package/dist/skills/tool.d.ts.map +1 -1
  343. package/dist/skills/tool.js +26 -21
  344. package/dist/skills/tool.js.map +1 -1
  345. package/dist/skills/trust-cache.d.ts +7 -0
  346. package/dist/skills/trust-cache.d.ts.map +1 -1
  347. package/dist/skills/trust-cache.js +16 -0
  348. package/dist/skills/trust-cache.js.map +1 -1
  349. package/dist/telemetry/agent-workforce-native-event.d.ts.map +1 -1
  350. package/dist/telemetry/agent-workforce-native-event.js +1 -3
  351. package/dist/telemetry/agent-workforce-native-event.js.map +1 -1
  352. package/dist/telemetry/maestro-event-bus.d.ts.map +1 -1
  353. package/dist/telemetry/maestro-event-bus.js +42 -81
  354. package/dist/telemetry/maestro-event-bus.js.map +1 -1
  355. package/dist/telemetry/maestro-platform-replay-fixture.d.ts.map +1 -1
  356. package/dist/telemetry/maestro-platform-replay-fixture.js +1 -3
  357. package/dist/telemetry/maestro-platform-replay-fixture.js.map +1 -1
  358. package/dist/telemetry.d.ts.map +1 -1
  359. package/dist/telemetry.js +54 -43
  360. package/dist/telemetry.js.map +1 -1
  361. package/dist/theme/theme-loader.d.ts.map +1 -1
  362. package/dist/theme/theme-loader.js +1 -3
  363. package/dist/theme/theme-loader.js.map +1 -1
  364. package/dist/tools/apply-patch.d.ts.map +1 -1
  365. package/dist/tools/apply-patch.js +76 -8
  366. package/dist/tools/apply-patch.js.map +1 -1
  367. package/dist/tools/diff-preview.d.ts.map +1 -1
  368. package/dist/tools/diff-preview.js +10 -1
  369. package/dist/tools/diff-preview.js.map +1 -1
  370. package/dist/tools/edit.d.ts.map +1 -1
  371. package/dist/tools/edit.js +17 -0
  372. package/dist/tools/edit.js.map +1 -1
  373. package/dist/tools/write.d.ts.map +1 -1
  374. package/dist/tools/write.js +9 -0
  375. package/dist/tools/write.js.map +1 -1
  376. package/dist/undo/tracker.d.ts +5 -0
  377. package/dist/undo/tracker.d.ts.map +1 -1
  378. package/dist/undo/tracker.js +13 -0
  379. package/dist/undo/tracker.js.map +1 -1
  380. package/dist/utils/fs.d.ts +1 -1
  381. package/dist/utils/fs.d.ts.map +1 -1
  382. package/dist/utils/fs.js +29 -2
  383. package/dist/utils/fs.js.map +1 -1
  384. package/dist/utils/git-stash.d.ts.map +1 -1
  385. package/dist/utils/git-stash.js +15 -8
  386. package/dist/utils/git-stash.js.map +1 -1
  387. package/dist/utils/json.d.ts +11 -0
  388. package/dist/utils/json.d.ts.map +1 -1
  389. package/dist/utils/json.js +9 -0
  390. package/dist/utils/json.js.map +1 -1
  391. package/dist/utils/shell-env.d.ts.map +1 -1
  392. package/dist/utils/shell-env.js +2 -0
  393. package/dist/utils/shell-env.js.map +1 -1
  394. package/dist/utils/url-extractor-git.d.ts +26 -0
  395. package/dist/utils/url-extractor-git.d.ts.map +1 -0
  396. package/dist/utils/url-extractor-git.js +259 -0
  397. package/dist/utils/url-extractor-git.js.map +1 -0
  398. package/dist/utils/url-extractor.d.ts.map +1 -1
  399. package/dist/utils/url-extractor.js +23 -251
  400. package/dist/utils/url-extractor.js.map +1 -1
  401. package/dist/version.json +2 -2
  402. package/package.json +310 -306
  403. package/skills/incident-triage/SKILL.md +19 -1
  404. package/skills/install-code-review/SKILL.md +69 -0
  405. package/skills/security-review/SKILL.md +68 -0
  406. package/skills/security-review/reference/rubric.md +85 -0
@@ -0,0 +1,438 @@
1
+ import { existsSync, mkdirSync, realpathSync } from "node:fs";
2
+ import { basename, dirname, join, normalize, resolve, sep } from "node:path";
3
+ import YAML from "yaml";
4
+ import { writeJsonFile, writeTextFileAtomic } from "../utils/fs.js";
5
+ import { isRecord } from "../utils/json.js";
6
+ import { isMissionFeature } from "./mission-manifest.js";
7
+ import { MISSION_STORE_SCHEMA, getMissionDir, getMissionStoreRoot, sanitizeMissionId, } from "./mission-store.js";
8
+ export const MISSION_ARTIFACT_VERSION = 1;
9
+ const MISSION_ARTIFACT_ESCAPE_MESSAGE = "Mission artifact path resolves outside the mission store.";
10
+ export function getMissionArtifactLayout(missionId, rootDir) {
11
+ const missionDir = getMissionDir(missionId, rootDir);
12
+ return {
13
+ missionDir,
14
+ missionMarkdown: join(missionDir, "mission.md"),
15
+ architectureMarkdown: join(missionDir, "architecture.md"),
16
+ validationContractMarkdown: join(missionDir, "validation-contract.md"),
17
+ validationStateJson: join(missionDir, "validation-state.json"),
18
+ featuresJson: join(missionDir, "features.json"),
19
+ agentsMarkdown: join(missionDir, "AGENTS.md"),
20
+ servicesYaml: join(missionDir, "services.yaml"),
21
+ handoffsDir: join(missionDir, "handoffs"),
22
+ libraryDir: join(missionDir, "library"),
23
+ skillsDir: join(missionDir, "skills"),
24
+ stateJson: join(missionDir, "state.json"),
25
+ progressLogJsonl: join(missionDir, "progress_log.jsonl"),
26
+ modelSettingsJson: join(missionDir, "model-settings.json"),
27
+ };
28
+ }
29
+ export function initializeMissionArtifacts(options) {
30
+ const now = options.now ?? new Date().toISOString();
31
+ const missionId = sanitizeMissionId(options.missionId);
32
+ const layout = getMissionArtifactLayout(missionId, options.rootDir);
33
+ mkdirSync(layout.handoffsDir, { recursive: true });
34
+ mkdirSync(layout.libraryDir, { recursive: true });
35
+ mkdirSync(layout.skillsDir, { recursive: true });
36
+ if (!existsSync(layout.missionMarkdown)) {
37
+ writeTextFileAtomic(layout.missionMarkdown, `# ${options.title ?? missionId}\n\nCreated: ${now}\n\n## Objective\n\nTBD\n`);
38
+ }
39
+ if (!existsSync(layout.architectureMarkdown)) {
40
+ writeTextFileAtomic(layout.architectureMarkdown, "# Architecture\n\nDocument system boundaries, responsibilities, and invariants here.\n");
41
+ }
42
+ if (!existsSync(layout.validationContractMarkdown)) {
43
+ writeTextFileAtomic(layout.validationContractMarkdown, "# Validation Contract\n\nAdd durable behavioral assertions before decomposing features.\n");
44
+ }
45
+ if (!existsSync(layout.validationStateJson)) {
46
+ writeJsonFile(layout.validationStateJson, {
47
+ version: MISSION_ARTIFACT_VERSION,
48
+ assertions: {},
49
+ updatedAt: now,
50
+ });
51
+ }
52
+ if (!existsSync(layout.featuresJson)) {
53
+ writeJsonFile(layout.featuresJson, {
54
+ version: MISSION_ARTIFACT_VERSION,
55
+ missionId,
56
+ milestones: [],
57
+ features: [],
58
+ createdAt: now,
59
+ updatedAt: now,
60
+ });
61
+ }
62
+ if (!existsSync(layout.agentsMarkdown)) {
63
+ writeTextFileAtomic(layout.agentsMarkdown, "# Mission Agent Guidance\n\nKeep worker guidance, known constraints, and validation notes here.\n");
64
+ }
65
+ if (!existsSync(layout.servicesYaml)) {
66
+ writeTextFileAtomic(layout.servicesYaml, "version: 1\ncommands: {}\nservices: {}\n");
67
+ }
68
+ return layout;
69
+ }
70
+ export function classifyMissionArtifactPath(filePath, rootDir) {
71
+ const resolved = resolveMissionArtifactPath(filePath, rootDir);
72
+ if (!resolved.isWithinMissionStore || resolved.escapesMissionStore) {
73
+ return null;
74
+ }
75
+ const afterRoot = resolved.realArtifactPath.slice(resolved.realMissionStoreRoot.length + 1);
76
+ const missionId = afterRoot.split(sep)[0];
77
+ if (!missionId)
78
+ return null;
79
+ const missionDir = join(resolved.realMissionStoreRoot, missionId);
80
+ const rel = resolved.realArtifactPath.slice(missionDir.length + 1);
81
+ const file = basename(resolved.realArtifactPath);
82
+ const nestedKind = rel.startsWith(`handoffs${sep}`)
83
+ ? "handoff"
84
+ : rel.startsWith(`library${sep}`)
85
+ ? "library"
86
+ : rel.startsWith(`skills${sep}`)
87
+ ? "skill"
88
+ : null;
89
+ if (nestedKind) {
90
+ return { kind: nestedKind, path: resolved.absolutePath, missionDir };
91
+ }
92
+ const kind = file === "mission.md"
93
+ ? "mission"
94
+ : file === "architecture.md"
95
+ ? "architecture"
96
+ : file === "validation-contract.md"
97
+ ? "validation-contract"
98
+ : file === "validation-state.json"
99
+ ? "validation-state"
100
+ : file === "features.json"
101
+ ? "features"
102
+ : file === "AGENTS.md"
103
+ ? "agents"
104
+ : file === "services.yaml" || file === "services.yml"
105
+ ? "services"
106
+ : file === "state.json"
107
+ ? "state"
108
+ : file === "progress_log.jsonl"
109
+ ? "progress-log"
110
+ : file === "model-settings.json"
111
+ ? "model-settings"
112
+ : null;
113
+ return kind ? { kind, path: resolved.absolutePath, missionDir } : null;
114
+ }
115
+ export function validateMissionArtifactContent(filePath, content, rootDir) {
116
+ const resolved = resolveMissionArtifactPath(filePath, rootDir);
117
+ if (resolved.escapesMissionStore) {
118
+ return { ok: false, message: MISSION_ARTIFACT_ESCAPE_MESSAGE };
119
+ }
120
+ const classified = classifyMissionArtifactPath(filePath, rootDir);
121
+ if (!classified)
122
+ return { ok: true };
123
+ try {
124
+ switch (classified.kind) {
125
+ case "features":
126
+ validateFeaturesJson(JSON.parse(content), basename(classified.missionDir));
127
+ return { ok: true };
128
+ case "validation-state":
129
+ case "model-settings":
130
+ case "handoff":
131
+ JSON.parse(content);
132
+ return { ok: true };
133
+ case "state":
134
+ validateMissionStateJson(JSON.parse(content), basename(classified.missionDir));
135
+ return { ok: true };
136
+ case "progress-log":
137
+ for (const [index, line] of content.split(/\r?\n/u).entries()) {
138
+ if (!line.trim())
139
+ continue;
140
+ try {
141
+ JSON.parse(line);
142
+ }
143
+ catch {
144
+ return {
145
+ ok: false,
146
+ message: `Invalid JSONL at line ${index + 1}`,
147
+ };
148
+ }
149
+ }
150
+ return { ok: true };
151
+ case "services":
152
+ YAML.parse(content);
153
+ return { ok: true };
154
+ default:
155
+ return { ok: true };
156
+ }
157
+ }
158
+ catch (error) {
159
+ return {
160
+ ok: false,
161
+ message: error instanceof Error
162
+ ? error.message
163
+ : `Invalid mission artifact ${classified.kind}`,
164
+ };
165
+ }
166
+ }
167
+ export function validateMissionArtifactWrite(options) {
168
+ const resolved = resolveMissionArtifactPath(options.filePath, options.rootDir);
169
+ if (resolved.escapesMissionStore) {
170
+ return { ok: false, message: MISSION_ARTIFACT_ESCAPE_MESSAGE };
171
+ }
172
+ const classified = classifyMissionArtifactPath(options.filePath, options.rootDir);
173
+ if (!classified)
174
+ return { ok: true };
175
+ if (classified.kind === "state" ||
176
+ classified.kind === "progress-log" ||
177
+ classified.kind === "model-settings") {
178
+ return {
179
+ ok: false,
180
+ message: "Cannot write mission system files directly; use MissionStore APIs.",
181
+ };
182
+ }
183
+ if ((options.role === "worker" || options.role === "validator") &&
184
+ classified.kind === "features") {
185
+ return {
186
+ ok: false,
187
+ message: "Mission workers and validators cannot write features.json; return a handoff to the orchestrator.",
188
+ };
189
+ }
190
+ return validateMissionArtifactContent(options.filePath, options.content, options.rootDir);
191
+ }
192
+ export function validateMissionArtifactDelete(options) {
193
+ const resolved = resolveMissionArtifactPath(options.filePath, options.rootDir);
194
+ if (resolved.escapesMissionStore) {
195
+ return { ok: false, message: MISSION_ARTIFACT_ESCAPE_MESSAGE };
196
+ }
197
+ const classified = classifyMissionArtifactPath(options.filePath, options.rootDir);
198
+ if (!classified)
199
+ return { ok: true };
200
+ if (classified.kind === "handoff" ||
201
+ classified.kind === "library" ||
202
+ classified.kind === "skill") {
203
+ return { ok: true };
204
+ }
205
+ return {
206
+ ok: false,
207
+ message: `Cannot delete required mission artifact ${basename(classified.path)}.`,
208
+ };
209
+ }
210
+ export function detectMissionSessionRole(env = process.env) {
211
+ const raw = env.MAESTRO_MISSION_ROLE?.trim().toLowerCase();
212
+ if (raw === "orchestrator" || raw === "worker" || raw === "validator") {
213
+ return raw;
214
+ }
215
+ if (env.MAESTRO_MISSION_WORKER === "1")
216
+ return "worker";
217
+ if (env.MAESTRO_MISSION_VALIDATOR === "1")
218
+ return "validator";
219
+ return undefined;
220
+ }
221
+ export function summarizeMissionSnapshot(snapshot) {
222
+ const counts = snapshot.features.reduce((acc, feature) => {
223
+ acc.total += 1;
224
+ acc[feature.status] = (acc[feature.status] ?? 0) + 1;
225
+ return acc;
226
+ }, { total: 0 });
227
+ return [
228
+ `${snapshot.title ?? snapshot.missionId} (${snapshot.state})`,
229
+ `features: ${counts.total} total, ${counts.pending ?? 0} pending, ${counts["in-progress"] ?? 0} running, ${counts.passed ?? 0} passed, ${counts.failed ?? 0} failed`,
230
+ `workers: ${snapshot.workerSessionIds.length}`,
231
+ ].join("\n");
232
+ }
233
+ function validateFeaturesJson(value, expectedMissionId) {
234
+ if (!value || typeof value !== "object") {
235
+ throw new Error("features.json must be a JSON object");
236
+ }
237
+ const record = value;
238
+ if (typeof record.version !== "number") {
239
+ throw new Error("features.json requires numeric version");
240
+ }
241
+ if (typeof record.missionId !== "string" || !record.missionId.trim()) {
242
+ throw new Error("features.json requires missionId");
243
+ }
244
+ if (sanitizeMissionId(record.missionId) !== expectedMissionId) {
245
+ throw new Error(`features.json missionId ${record.missionId} does not match mission directory ${expectedMissionId}`);
246
+ }
247
+ if (typeof record.updatedAt !== "string" ||
248
+ Number.isNaN(Date.parse(record.updatedAt))) {
249
+ throw new Error("features.json requires valid updatedAt");
250
+ }
251
+ if (!Array.isArray(record.features)) {
252
+ throw new Error("features.json requires features array");
253
+ }
254
+ const featureIds = new Set();
255
+ for (const [index, feature] of record.features.entries()) {
256
+ if (!feature || typeof feature !== "object") {
257
+ throw new Error(`feature ${index} must be an object`);
258
+ }
259
+ if (!isMissionFeature(feature)) {
260
+ throw new Error(`feature ${index} must match MissionFeature schema`);
261
+ }
262
+ const featureId = feature.id;
263
+ if (featureIds.has(featureId)) {
264
+ throw new Error(`features.json contains duplicate feature id ${featureId}`);
265
+ }
266
+ featureIds.add(featureId);
267
+ }
268
+ }
269
+ function validateMissionStateJson(value, expectedMissionId) {
270
+ if (!value || typeof value !== "object") {
271
+ throw new Error("state.json must be a JSON object");
272
+ }
273
+ const record = value;
274
+ if (record.schemaVersion !== MISSION_STORE_SCHEMA) {
275
+ throw new Error("state.json requires mission store schemaVersion");
276
+ }
277
+ if (typeof record.missionId !== "string" || !record.missionId.trim()) {
278
+ throw new Error("state.json requires missionId");
279
+ }
280
+ if (sanitizeMissionId(record.missionId) !== expectedMissionId) {
281
+ throw new Error(`state.json missionId ${record.missionId} does not match mission directory ${expectedMissionId}`);
282
+ }
283
+ if (!isMissionState(record.state)) {
284
+ throw new Error("state.json requires valid state");
285
+ }
286
+ if (!Array.isArray(record.features) ||
287
+ !record.features.every(isMissionFeature)) {
288
+ throw new Error("state.json requires valid features array");
289
+ }
290
+ const featureIds = new Set();
291
+ for (const feature of record.features) {
292
+ const featureId = feature.id;
293
+ if (featureIds.has(featureId)) {
294
+ throw new Error(`state.json contains duplicate feature id ${featureId}`);
295
+ }
296
+ featureIds.add(featureId);
297
+ }
298
+ if (!Array.isArray(record.progressLog)) {
299
+ throw new Error("state.json requires progressLog array");
300
+ }
301
+ for (const [index, entry] of record.progressLog.entries()) {
302
+ if (!isMissionProgressEntry(entry)) {
303
+ throw new Error(`state.json progressLog ${index} must be valid`);
304
+ }
305
+ }
306
+ if (!Array.isArray(record.workerSessionIds)) {
307
+ throw new Error("state.json requires workerSessionIds array");
308
+ }
309
+ if (!isRecord(record.workerStates)) {
310
+ throw new Error("state.json requires workerStates object");
311
+ }
312
+ if (!isRecord(record.tokenUsageBySessionId)) {
313
+ throw new Error("state.json requires tokenUsageBySessionId object");
314
+ }
315
+ for (const [sessionId, usage] of Object.entries(record.tokenUsageBySessionId)) {
316
+ if (!isMissionTokenUsage(usage)) {
317
+ throw new Error(`state.json tokenUsageBySessionId ${sessionId} must be valid`);
318
+ }
319
+ }
320
+ if (record.tokenUsage !== undefined &&
321
+ !isMissionTokenUsage(record.tokenUsage)) {
322
+ throw new Error("state.json tokenUsage must be valid");
323
+ }
324
+ if (typeof record.createdAt !== "string" ||
325
+ Number.isNaN(Date.parse(record.createdAt)) ||
326
+ typeof record.updatedAt !== "string" ||
327
+ Number.isNaN(Date.parse(record.updatedAt))) {
328
+ throw new Error("state.json requires valid timestamps");
329
+ }
330
+ }
331
+ function isMissionState(value) {
332
+ return (value === "awaiting-input" ||
333
+ value === "ready" ||
334
+ value === "running" ||
335
+ value === "blocked" ||
336
+ value === "completed" ||
337
+ value === "failed");
338
+ }
339
+ function isMissionProgressEntry(value) {
340
+ if (!isRecord(value))
341
+ return false;
342
+ if (value.type !== "mission_created" &&
343
+ value.type !== "mission_started" &&
344
+ value.type !== "mission_blocked" &&
345
+ value.type !== "mission_completed" &&
346
+ value.type !== "worker_started" &&
347
+ value.type !== "worker_completed" &&
348
+ value.type !== "worker_failed" &&
349
+ value.type !== "note") {
350
+ return false;
351
+ }
352
+ if (typeof value.timestamp !== "string" ||
353
+ Number.isNaN(Date.parse(value.timestamp))) {
354
+ return false;
355
+ }
356
+ if (value.message !== undefined && typeof value.message !== "string") {
357
+ return false;
358
+ }
359
+ if (value.featureId !== undefined && typeof value.featureId !== "string") {
360
+ return false;
361
+ }
362
+ if (value.workerSessionId !== undefined &&
363
+ typeof value.workerSessionId !== "string") {
364
+ return false;
365
+ }
366
+ if (value.exitCode !== undefined && typeof value.exitCode !== "number") {
367
+ return false;
368
+ }
369
+ return true;
370
+ }
371
+ function isMissionTokenUsage(value) {
372
+ if (!isRecord(value))
373
+ return false;
374
+ if (typeof value.inputTokens !== "number" ||
375
+ typeof value.outputTokens !== "number") {
376
+ return false;
377
+ }
378
+ if (value.cacheCreationTokens !== undefined &&
379
+ typeof value.cacheCreationTokens !== "number") {
380
+ return false;
381
+ }
382
+ if (value.cacheReadTokens !== undefined &&
383
+ typeof value.cacheReadTokens !== "number") {
384
+ return false;
385
+ }
386
+ if (value.thinkingTokens !== undefined &&
387
+ typeof value.thinkingTokens !== "number") {
388
+ return false;
389
+ }
390
+ if (value.credits !== undefined && typeof value.credits !== "number") {
391
+ return false;
392
+ }
393
+ return true;
394
+ }
395
+ function resolveMissionArtifactPath(filePath, rootDir) {
396
+ const absolutePath = normalize(resolve(filePath));
397
+ const missionStoreRoot = normalize(resolve(getMissionStoreRoot(rootDir)));
398
+ const realMissionStoreRoot = resolveRealPathThroughExistingParents(missionStoreRoot) ?? missionStoreRoot;
399
+ const realArtifactPath = resolveRealPathThroughExistingParents(absolutePath) ?? absolutePath;
400
+ const isLexicallyWithinMissionStore = isPathInside(missionStoreRoot, absolutePath);
401
+ const isReallyWithinMissionStore = isPathInside(realMissionStoreRoot, realArtifactPath);
402
+ const isWithinMissionStore = isLexicallyWithinMissionStore || isReallyWithinMissionStore;
403
+ return {
404
+ absolutePath,
405
+ missionStoreRoot,
406
+ realMissionStoreRoot,
407
+ realArtifactPath,
408
+ isWithinMissionStore,
409
+ escapesMissionStore: isLexicallyWithinMissionStore && !isReallyWithinMissionStore,
410
+ };
411
+ }
412
+ function resolveRealPathThroughExistingParents(absolutePath) {
413
+ const suffix = [];
414
+ let current = absolutePath;
415
+ while (true) {
416
+ if (existsSync(current)) {
417
+ try {
418
+ const realCurrent = realpathSync(current);
419
+ return suffix.length === 0
420
+ ? realCurrent
421
+ : join(realCurrent, ...suffix.reverse());
422
+ }
423
+ catch {
424
+ return null;
425
+ }
426
+ }
427
+ const parent = dirname(current);
428
+ if (parent === current) {
429
+ return null;
430
+ }
431
+ suffix.push(basename(current));
432
+ current = parent;
433
+ }
434
+ }
435
+ function isPathInside(root, target) {
436
+ return target === root || target.startsWith(`${root}${sep}`);
437
+ }
438
+ //# sourceMappingURL=mission-artifacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mission-artifacts.js","sourceRoot":"","sources":["../../src/agent/mission-artifacts.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, mkdirSync, realpathSync } from \"node:fs\";\nimport { basename, dirname, join, normalize, resolve, sep } from \"node:path\";\nimport YAML from \"yaml\";\nimport { writeJsonFile, writeTextFileAtomic } from \"../utils/fs.js\";\nimport { isRecord } from \"../utils/json.js\";\nimport { isMissionFeature } from \"./mission-manifest.js\";\nimport {\n\tMISSION_STORE_SCHEMA,\n\ttype MissionStoreSnapshot,\n\tgetMissionDir,\n\tgetMissionStoreRoot,\n\tsanitizeMissionId,\n} from \"./mission-store.js\";\n\nexport const MISSION_ARTIFACT_VERSION = 1;\n\nexport type MissionSessionRole = \"orchestrator\" | \"worker\" | \"validator\";\n\nexport interface MissionArtifactLayout {\n\tmissionDir: string;\n\tmissionMarkdown: string;\n\tarchitectureMarkdown: string;\n\tvalidationContractMarkdown: string;\n\tvalidationStateJson: string;\n\tfeaturesJson: string;\n\tagentsMarkdown: string;\n\tservicesYaml: string;\n\thandoffsDir: string;\n\tlibraryDir: string;\n\tskillsDir: string;\n\tstateJson: string;\n\tprogressLogJsonl: string;\n\tmodelSettingsJson: string;\n}\n\nexport type MissionArtifactKind =\n\t| \"mission\"\n\t| \"architecture\"\n\t| \"validation-contract\"\n\t| \"validation-state\"\n\t| \"features\"\n\t| \"agents\"\n\t| \"services\"\n\t| \"state\"\n\t| \"progress-log\"\n\t| \"model-settings\"\n\t| \"handoff\"\n\t| \"library\"\n\t| \"skill\";\n\nexport interface MissionArtifactClassification {\n\tkind: MissionArtifactKind;\n\tpath: string;\n\tmissionDir: string;\n}\n\nconst MISSION_ARTIFACT_ESCAPE_MESSAGE =\n\t\"Mission artifact path resolves outside the mission store.\";\n\nexport function getMissionArtifactLayout(\n\tmissionId: string,\n\trootDir?: string,\n): MissionArtifactLayout {\n\tconst missionDir = getMissionDir(missionId, rootDir);\n\treturn {\n\t\tmissionDir,\n\t\tmissionMarkdown: join(missionDir, \"mission.md\"),\n\t\tarchitectureMarkdown: join(missionDir, \"architecture.md\"),\n\t\tvalidationContractMarkdown: join(missionDir, \"validation-contract.md\"),\n\t\tvalidationStateJson: join(missionDir, \"validation-state.json\"),\n\t\tfeaturesJson: join(missionDir, \"features.json\"),\n\t\tagentsMarkdown: join(missionDir, \"AGENTS.md\"),\n\t\tservicesYaml: join(missionDir, \"services.yaml\"),\n\t\thandoffsDir: join(missionDir, \"handoffs\"),\n\t\tlibraryDir: join(missionDir, \"library\"),\n\t\tskillsDir: join(missionDir, \"skills\"),\n\t\tstateJson: join(missionDir, \"state.json\"),\n\t\tprogressLogJsonl: join(missionDir, \"progress_log.jsonl\"),\n\t\tmodelSettingsJson: join(missionDir, \"model-settings.json\"),\n\t};\n}\n\nexport function initializeMissionArtifacts(options: {\n\tmissionId: string;\n\ttitle?: string;\n\trootDir?: string;\n\tnow?: string;\n}): MissionArtifactLayout {\n\tconst now = options.now ?? new Date().toISOString();\n\tconst missionId = sanitizeMissionId(options.missionId);\n\tconst layout = getMissionArtifactLayout(missionId, options.rootDir);\n\tmkdirSync(layout.handoffsDir, { recursive: true });\n\tmkdirSync(layout.libraryDir, { recursive: true });\n\tmkdirSync(layout.skillsDir, { recursive: true });\n\tif (!existsSync(layout.missionMarkdown)) {\n\t\twriteTextFileAtomic(\n\t\t\tlayout.missionMarkdown,\n\t\t\t`# ${options.title ?? missionId}\\n\\nCreated: ${now}\\n\\n## Objective\\n\\nTBD\\n`,\n\t\t);\n\t}\n\tif (!existsSync(layout.architectureMarkdown)) {\n\t\twriteTextFileAtomic(\n\t\t\tlayout.architectureMarkdown,\n\t\t\t\"# Architecture\\n\\nDocument system boundaries, responsibilities, and invariants here.\\n\",\n\t\t);\n\t}\n\tif (!existsSync(layout.validationContractMarkdown)) {\n\t\twriteTextFileAtomic(\n\t\t\tlayout.validationContractMarkdown,\n\t\t\t\"# Validation Contract\\n\\nAdd durable behavioral assertions before decomposing features.\\n\",\n\t\t);\n\t}\n\tif (!existsSync(layout.validationStateJson)) {\n\t\twriteJsonFile(layout.validationStateJson, {\n\t\t\tversion: MISSION_ARTIFACT_VERSION,\n\t\t\tassertions: {},\n\t\t\tupdatedAt: now,\n\t\t});\n\t}\n\tif (!existsSync(layout.featuresJson)) {\n\t\twriteJsonFile(layout.featuresJson, {\n\t\t\tversion: MISSION_ARTIFACT_VERSION,\n\t\t\tmissionId,\n\t\t\tmilestones: [],\n\t\t\tfeatures: [],\n\t\t\tcreatedAt: now,\n\t\t\tupdatedAt: now,\n\t\t});\n\t}\n\tif (!existsSync(layout.agentsMarkdown)) {\n\t\twriteTextFileAtomic(\n\t\t\tlayout.agentsMarkdown,\n\t\t\t\"# Mission Agent Guidance\\n\\nKeep worker guidance, known constraints, and validation notes here.\\n\",\n\t\t);\n\t}\n\tif (!existsSync(layout.servicesYaml)) {\n\t\twriteTextFileAtomic(\n\t\t\tlayout.servicesYaml,\n\t\t\t\"version: 1\\ncommands: {}\\nservices: {}\\n\",\n\t\t);\n\t}\n\treturn layout;\n}\n\nexport function classifyMissionArtifactPath(\n\tfilePath: string,\n\trootDir?: string,\n): MissionArtifactClassification | null {\n\tconst resolved = resolveMissionArtifactPath(filePath, rootDir);\n\tif (!resolved.isWithinMissionStore || resolved.escapesMissionStore) {\n\t\treturn null;\n\t}\n\tconst afterRoot = resolved.realArtifactPath.slice(\n\t\tresolved.realMissionStoreRoot.length + 1,\n\t);\n\tconst missionId = afterRoot.split(sep)[0];\n\tif (!missionId) return null;\n\tconst missionDir = join(resolved.realMissionStoreRoot, missionId);\n\tconst rel = resolved.realArtifactPath.slice(missionDir.length + 1);\n\tconst file = basename(resolved.realArtifactPath);\n\tconst nestedKind = rel.startsWith(`handoffs${sep}`)\n\t\t? \"handoff\"\n\t\t: rel.startsWith(`library${sep}`)\n\t\t\t? \"library\"\n\t\t\t: rel.startsWith(`skills${sep}`)\n\t\t\t\t? \"skill\"\n\t\t\t\t: null;\n\tif (nestedKind) {\n\t\treturn { kind: nestedKind, path: resolved.absolutePath, missionDir };\n\t}\n\tconst kind =\n\t\tfile === \"mission.md\"\n\t\t\t? \"mission\"\n\t\t\t: file === \"architecture.md\"\n\t\t\t\t? \"architecture\"\n\t\t\t\t: file === \"validation-contract.md\"\n\t\t\t\t\t? \"validation-contract\"\n\t\t\t\t\t: file === \"validation-state.json\"\n\t\t\t\t\t\t? \"validation-state\"\n\t\t\t\t\t\t: file === \"features.json\"\n\t\t\t\t\t\t\t? \"features\"\n\t\t\t\t\t\t\t: file === \"AGENTS.md\"\n\t\t\t\t\t\t\t\t? \"agents\"\n\t\t\t\t\t\t\t\t: file === \"services.yaml\" || file === \"services.yml\"\n\t\t\t\t\t\t\t\t\t? \"services\"\n\t\t\t\t\t\t\t\t\t: file === \"state.json\"\n\t\t\t\t\t\t\t\t\t\t? \"state\"\n\t\t\t\t\t\t\t\t\t\t: file === \"progress_log.jsonl\"\n\t\t\t\t\t\t\t\t\t\t\t? \"progress-log\"\n\t\t\t\t\t\t\t\t\t\t\t: file === \"model-settings.json\"\n\t\t\t\t\t\t\t\t\t\t\t\t? \"model-settings\"\n\t\t\t\t\t\t\t\t\t\t\t\t: null;\n\treturn kind ? { kind, path: resolved.absolutePath, missionDir } : null;\n}\n\nexport function validateMissionArtifactContent(\n\tfilePath: string,\n\tcontent: string,\n\trootDir?: string,\n): { ok: true } | { ok: false; message: string } {\n\tconst resolved = resolveMissionArtifactPath(filePath, rootDir);\n\tif (resolved.escapesMissionStore) {\n\t\treturn { ok: false, message: MISSION_ARTIFACT_ESCAPE_MESSAGE };\n\t}\n\tconst classified = classifyMissionArtifactPath(filePath, rootDir);\n\tif (!classified) return { ok: true };\n\ttry {\n\t\tswitch (classified.kind) {\n\t\t\tcase \"features\":\n\t\t\t\tvalidateFeaturesJson(\n\t\t\t\t\tJSON.parse(content),\n\t\t\t\t\tbasename(classified.missionDir),\n\t\t\t\t);\n\t\t\t\treturn { ok: true };\n\t\t\tcase \"validation-state\":\n\t\t\tcase \"model-settings\":\n\t\t\tcase \"handoff\":\n\t\t\t\tJSON.parse(content);\n\t\t\t\treturn { ok: true };\n\t\t\tcase \"state\":\n\t\t\t\tvalidateMissionStateJson(\n\t\t\t\t\tJSON.parse(content),\n\t\t\t\t\tbasename(classified.missionDir),\n\t\t\t\t);\n\t\t\t\treturn { ok: true };\n\t\t\tcase \"progress-log\":\n\t\t\t\tfor (const [index, line] of content.split(/\\r?\\n/u).entries()) {\n\t\t\t\t\tif (!line.trim()) continue;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tJSON.parse(line);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tok: false,\n\t\t\t\t\t\t\tmessage: `Invalid JSONL at line ${index + 1}`,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn { ok: true };\n\t\t\tcase \"services\":\n\t\t\t\tYAML.parse(content);\n\t\t\t\treturn { ok: true };\n\t\t\tdefault:\n\t\t\t\treturn { ok: true };\n\t\t}\n\t} catch (error) {\n\t\treturn {\n\t\t\tok: false,\n\t\t\tmessage:\n\t\t\t\terror instanceof Error\n\t\t\t\t\t? error.message\n\t\t\t\t\t: `Invalid mission artifact ${classified.kind}`,\n\t\t};\n\t}\n}\n\nexport function validateMissionArtifactWrite(options: {\n\tfilePath: string;\n\tcontent: string;\n\trole?: MissionSessionRole;\n\trootDir?: string;\n}): { ok: true } | { ok: false; message: string } {\n\tconst resolved = resolveMissionArtifactPath(\n\t\toptions.filePath,\n\t\toptions.rootDir,\n\t);\n\tif (resolved.escapesMissionStore) {\n\t\treturn { ok: false, message: MISSION_ARTIFACT_ESCAPE_MESSAGE };\n\t}\n\tconst classified = classifyMissionArtifactPath(\n\t\toptions.filePath,\n\t\toptions.rootDir,\n\t);\n\tif (!classified) return { ok: true };\n\tif (\n\t\tclassified.kind === \"state\" ||\n\t\tclassified.kind === \"progress-log\" ||\n\t\tclassified.kind === \"model-settings\"\n\t) {\n\t\treturn {\n\t\t\tok: false,\n\t\t\tmessage:\n\t\t\t\t\"Cannot write mission system files directly; use MissionStore APIs.\",\n\t\t};\n\t}\n\tif (\n\t\t(options.role === \"worker\" || options.role === \"validator\") &&\n\t\tclassified.kind === \"features\"\n\t) {\n\t\treturn {\n\t\t\tok: false,\n\t\t\tmessage:\n\t\t\t\t\"Mission workers and validators cannot write features.json; return a handoff to the orchestrator.\",\n\t\t};\n\t}\n\treturn validateMissionArtifactContent(\n\t\toptions.filePath,\n\t\toptions.content,\n\t\toptions.rootDir,\n\t);\n}\n\nexport function validateMissionArtifactDelete(options: {\n\tfilePath: string;\n\trootDir?: string;\n}): { ok: true } | { ok: false; message: string } {\n\tconst resolved = resolveMissionArtifactPath(\n\t\toptions.filePath,\n\t\toptions.rootDir,\n\t);\n\tif (resolved.escapesMissionStore) {\n\t\treturn { ok: false, message: MISSION_ARTIFACT_ESCAPE_MESSAGE };\n\t}\n\tconst classified = classifyMissionArtifactPath(\n\t\toptions.filePath,\n\t\toptions.rootDir,\n\t);\n\tif (!classified) return { ok: true };\n\tif (\n\t\tclassified.kind === \"handoff\" ||\n\t\tclassified.kind === \"library\" ||\n\t\tclassified.kind === \"skill\"\n\t) {\n\t\treturn { ok: true };\n\t}\n\treturn {\n\t\tok: false,\n\t\tmessage: `Cannot delete required mission artifact ${basename(classified.path)}.`,\n\t};\n}\n\nexport function detectMissionSessionRole(\n\tenv: NodeJS.ProcessEnv = process.env,\n): MissionSessionRole | undefined {\n\tconst raw = env.MAESTRO_MISSION_ROLE?.trim().toLowerCase();\n\tif (raw === \"orchestrator\" || raw === \"worker\" || raw === \"validator\") {\n\t\treturn raw;\n\t}\n\tif (env.MAESTRO_MISSION_WORKER === \"1\") return \"worker\";\n\tif (env.MAESTRO_MISSION_VALIDATOR === \"1\") return \"validator\";\n\treturn undefined;\n}\n\nexport function summarizeMissionSnapshot(\n\tsnapshot: MissionStoreSnapshot,\n): string {\n\tconst counts = snapshot.features.reduce(\n\t\t(acc, feature) => {\n\t\t\tacc.total += 1;\n\t\t\tacc[feature.status] = (acc[feature.status] ?? 0) + 1;\n\t\t\treturn acc;\n\t\t},\n\t\t{ total: 0 } as { total: number } & Record<string, number>,\n\t);\n\treturn [\n\t\t`${snapshot.title ?? snapshot.missionId} (${snapshot.state})`,\n\t\t`features: ${counts.total} total, ${counts.pending ?? 0} pending, ${counts[\"in-progress\"] ?? 0} running, ${counts.passed ?? 0} passed, ${counts.failed ?? 0} failed`,\n\t\t`workers: ${snapshot.workerSessionIds.length}`,\n\t].join(\"\\n\");\n}\n\nfunction validateFeaturesJson(value: unknown, expectedMissionId: string): void {\n\tif (!value || typeof value !== \"object\") {\n\t\tthrow new Error(\"features.json must be a JSON object\");\n\t}\n\tconst record = value as Record<string, unknown>;\n\tif (typeof record.version !== \"number\") {\n\t\tthrow new Error(\"features.json requires numeric version\");\n\t}\n\tif (typeof record.missionId !== \"string\" || !record.missionId.trim()) {\n\t\tthrow new Error(\"features.json requires missionId\");\n\t}\n\tif (sanitizeMissionId(record.missionId) !== expectedMissionId) {\n\t\tthrow new Error(\n\t\t\t`features.json missionId ${record.missionId} does not match mission directory ${expectedMissionId}`,\n\t\t);\n\t}\n\tif (\n\t\ttypeof record.updatedAt !== \"string\" ||\n\t\tNumber.isNaN(Date.parse(record.updatedAt))\n\t) {\n\t\tthrow new Error(\"features.json requires valid updatedAt\");\n\t}\n\tif (!Array.isArray(record.features)) {\n\t\tthrow new Error(\"features.json requires features array\");\n\t}\n\tconst featureIds = new Set<string>();\n\tfor (const [index, feature] of record.features.entries()) {\n\t\tif (!feature || typeof feature !== \"object\") {\n\t\t\tthrow new Error(`feature ${index} must be an object`);\n\t\t}\n\t\tif (!isMissionFeature(feature)) {\n\t\t\tthrow new Error(`feature ${index} must match MissionFeature schema`);\n\t\t}\n\t\tconst featureId = (feature as { id: string }).id;\n\t\tif (featureIds.has(featureId)) {\n\t\t\tthrow new Error(\n\t\t\t\t`features.json contains duplicate feature id ${featureId}`,\n\t\t\t);\n\t\t}\n\t\tfeatureIds.add(featureId);\n\t}\n}\n\nfunction validateMissionStateJson(\n\tvalue: unknown,\n\texpectedMissionId: string,\n): void {\n\tif (!value || typeof value !== \"object\") {\n\t\tthrow new Error(\"state.json must be a JSON object\");\n\t}\n\tconst record = value as Record<string, unknown>;\n\tif (record.schemaVersion !== MISSION_STORE_SCHEMA) {\n\t\tthrow new Error(\"state.json requires mission store schemaVersion\");\n\t}\n\tif (typeof record.missionId !== \"string\" || !record.missionId.trim()) {\n\t\tthrow new Error(\"state.json requires missionId\");\n\t}\n\tif (sanitizeMissionId(record.missionId) !== expectedMissionId) {\n\t\tthrow new Error(\n\t\t\t`state.json missionId ${record.missionId} does not match mission directory ${expectedMissionId}`,\n\t\t);\n\t}\n\tif (!isMissionState(record.state)) {\n\t\tthrow new Error(\"state.json requires valid state\");\n\t}\n\tif (\n\t\t!Array.isArray(record.features) ||\n\t\t!record.features.every(isMissionFeature)\n\t) {\n\t\tthrow new Error(\"state.json requires valid features array\");\n\t}\n\tconst featureIds = new Set<string>();\n\tfor (const feature of record.features) {\n\t\tconst featureId = (feature as { id: string }).id;\n\t\tif (featureIds.has(featureId)) {\n\t\t\tthrow new Error(`state.json contains duplicate feature id ${featureId}`);\n\t\t}\n\t\tfeatureIds.add(featureId);\n\t}\n\tif (!Array.isArray(record.progressLog)) {\n\t\tthrow new Error(\"state.json requires progressLog array\");\n\t}\n\tfor (const [index, entry] of record.progressLog.entries()) {\n\t\tif (!isMissionProgressEntry(entry)) {\n\t\t\tthrow new Error(`state.json progressLog ${index} must be valid`);\n\t\t}\n\t}\n\tif (!Array.isArray(record.workerSessionIds)) {\n\t\tthrow new Error(\"state.json requires workerSessionIds array\");\n\t}\n\tif (!isRecord(record.workerStates)) {\n\t\tthrow new Error(\"state.json requires workerStates object\");\n\t}\n\tif (!isRecord(record.tokenUsageBySessionId)) {\n\t\tthrow new Error(\"state.json requires tokenUsageBySessionId object\");\n\t}\n\tfor (const [sessionId, usage] of Object.entries(\n\t\trecord.tokenUsageBySessionId,\n\t)) {\n\t\tif (!isMissionTokenUsage(usage)) {\n\t\t\tthrow new Error(\n\t\t\t\t`state.json tokenUsageBySessionId ${sessionId} must be valid`,\n\t\t\t);\n\t\t}\n\t}\n\tif (\n\t\trecord.tokenUsage !== undefined &&\n\t\t!isMissionTokenUsage(record.tokenUsage)\n\t) {\n\t\tthrow new Error(\"state.json tokenUsage must be valid\");\n\t}\n\tif (\n\t\ttypeof record.createdAt !== \"string\" ||\n\t\tNumber.isNaN(Date.parse(record.createdAt)) ||\n\t\ttypeof record.updatedAt !== \"string\" ||\n\t\tNumber.isNaN(Date.parse(record.updatedAt))\n\t) {\n\t\tthrow new Error(\"state.json requires valid timestamps\");\n\t}\n}\n\nfunction isMissionState(value: unknown): boolean {\n\treturn (\n\t\tvalue === \"awaiting-input\" ||\n\t\tvalue === \"ready\" ||\n\t\tvalue === \"running\" ||\n\t\tvalue === \"blocked\" ||\n\t\tvalue === \"completed\" ||\n\t\tvalue === \"failed\"\n\t);\n}\n\nfunction isMissionProgressEntry(value: unknown): boolean {\n\tif (!isRecord(value)) return false;\n\tif (\n\t\tvalue.type !== \"mission_created\" &&\n\t\tvalue.type !== \"mission_started\" &&\n\t\tvalue.type !== \"mission_blocked\" &&\n\t\tvalue.type !== \"mission_completed\" &&\n\t\tvalue.type !== \"worker_started\" &&\n\t\tvalue.type !== \"worker_completed\" &&\n\t\tvalue.type !== \"worker_failed\" &&\n\t\tvalue.type !== \"note\"\n\t) {\n\t\treturn false;\n\t}\n\tif (\n\t\ttypeof value.timestamp !== \"string\" ||\n\t\tNumber.isNaN(Date.parse(value.timestamp))\n\t) {\n\t\treturn false;\n\t}\n\tif (value.message !== undefined && typeof value.message !== \"string\") {\n\t\treturn false;\n\t}\n\tif (value.featureId !== undefined && typeof value.featureId !== \"string\") {\n\t\treturn false;\n\t}\n\tif (\n\t\tvalue.workerSessionId !== undefined &&\n\t\ttypeof value.workerSessionId !== \"string\"\n\t) {\n\t\treturn false;\n\t}\n\tif (value.exitCode !== undefined && typeof value.exitCode !== \"number\") {\n\t\treturn false;\n\t}\n\treturn true;\n}\n\nfunction isMissionTokenUsage(value: unknown): boolean {\n\tif (!isRecord(value)) return false;\n\tif (\n\t\ttypeof value.inputTokens !== \"number\" ||\n\t\ttypeof value.outputTokens !== \"number\"\n\t) {\n\t\treturn false;\n\t}\n\tif (\n\t\tvalue.cacheCreationTokens !== undefined &&\n\t\ttypeof value.cacheCreationTokens !== \"number\"\n\t) {\n\t\treturn false;\n\t}\n\tif (\n\t\tvalue.cacheReadTokens !== undefined &&\n\t\ttypeof value.cacheReadTokens !== \"number\"\n\t) {\n\t\treturn false;\n\t}\n\tif (\n\t\tvalue.thinkingTokens !== undefined &&\n\t\ttypeof value.thinkingTokens !== \"number\"\n\t) {\n\t\treturn false;\n\t}\n\tif (value.credits !== undefined && typeof value.credits !== \"number\") {\n\t\treturn false;\n\t}\n\treturn true;\n}\n\nfunction resolveMissionArtifactPath(\n\tfilePath: string,\n\trootDir?: string,\n): {\n\tabsolutePath: string;\n\tmissionStoreRoot: string;\n\trealMissionStoreRoot: string;\n\trealArtifactPath: string;\n\tisWithinMissionStore: boolean;\n\tescapesMissionStore: boolean;\n} {\n\tconst absolutePath = normalize(resolve(filePath));\n\tconst missionStoreRoot = normalize(resolve(getMissionStoreRoot(rootDir)));\n\tconst realMissionStoreRoot =\n\t\tresolveRealPathThroughExistingParents(missionStoreRoot) ?? missionStoreRoot;\n\tconst realArtifactPath =\n\t\tresolveRealPathThroughExistingParents(absolutePath) ?? absolutePath;\n\tconst isLexicallyWithinMissionStore = isPathInside(\n\t\tmissionStoreRoot,\n\t\tabsolutePath,\n\t);\n\tconst isReallyWithinMissionStore = isPathInside(\n\t\trealMissionStoreRoot,\n\t\trealArtifactPath,\n\t);\n\tconst isWithinMissionStore =\n\t\tisLexicallyWithinMissionStore || isReallyWithinMissionStore;\n\treturn {\n\t\tabsolutePath,\n\t\tmissionStoreRoot,\n\t\trealMissionStoreRoot,\n\t\trealArtifactPath,\n\t\tisWithinMissionStore,\n\t\tescapesMissionStore:\n\t\t\tisLexicallyWithinMissionStore && !isReallyWithinMissionStore,\n\t};\n}\n\nfunction resolveRealPathThroughExistingParents(\n\tabsolutePath: string,\n): string | null {\n\tconst suffix: string[] = [];\n\tlet current = absolutePath;\n\twhile (true) {\n\t\tif (existsSync(current)) {\n\t\t\ttry {\n\t\t\t\tconst realCurrent = realpathSync(current);\n\t\t\t\treturn suffix.length === 0\n\t\t\t\t\t? realCurrent\n\t\t\t\t\t: join(realCurrent, ...suffix.reverse());\n\t\t\t} catch {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t\tconst parent = dirname(current);\n\t\tif (parent === current) {\n\t\t\treturn null;\n\t\t}\n\t\tsuffix.push(basename(current));\n\t\tcurrent = parent;\n\t}\n}\n\nfunction isPathInside(root: string, target: string): boolean {\n\treturn target === root || target.startsWith(`${root}${sep}`);\n}\n"]}