@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,312 @@
1
+ import { summarizeMissionContinuity } from "./mission-manifest.js";
2
+ import { sanitizeMissionId, } from "./mission-store.js";
3
+ export const AGENT_WORK_BOARD_SCHEMA = "evalops.maestro.agent-work-board.v1";
4
+ export function buildAgentWorkBoard(input, now = new Date()) {
5
+ const missionSnapshots = input.missionSnapshots ?? [];
6
+ const snapshotMissionIds = new Set(missionSnapshots.map((mission) => missionBoardDedupId(mission.missionId)));
7
+ const missions = input.missions?.filter((mission) => !snapshotMissionIds.has(missionBoardDedupId(mission.missionId))) ?? [];
8
+ const items = [
9
+ ...missionItems(missions),
10
+ ...missionSnapshotItems(missionSnapshots),
11
+ ...a2aItems(input.a2a),
12
+ ...todoItems(input.todos),
13
+ ...handoffItems(input.handoffs ?? [], input.openWork ?? []),
14
+ ...githubItems(input.githubTasks ?? []),
15
+ ].sort(compareWorkItems);
16
+ return {
17
+ schemaVersion: AGENT_WORK_BOARD_SCHEMA,
18
+ generatedAt: now.toISOString(),
19
+ counts: countItems(items),
20
+ items,
21
+ };
22
+ }
23
+ function missionBoardDedupId(missionId) {
24
+ try {
25
+ return sanitizeMissionId(missionId);
26
+ }
27
+ catch {
28
+ return missionId;
29
+ }
30
+ }
31
+ function missionSnapshotItems(snapshots) {
32
+ return snapshots.flatMap((mission) => {
33
+ const continuity = summarizeMissionContinuity({
34
+ version: 1,
35
+ missionId: mission.missionId,
36
+ milestones: [],
37
+ features: mission.features,
38
+ createdAt: mission.createdAt,
39
+ updatedAt: mission.updatedAt,
40
+ });
41
+ const features = mission.features.map((feature) => ({
42
+ id: `mission-store:${mission.missionId}:${feature.id}`,
43
+ source: "mission",
44
+ title: feature.description,
45
+ status: missionFeatureStatus(feature.status),
46
+ owner: feature.handoff?.workerId ?? feature.skillName,
47
+ priority: feature.status === "in-progress" || mission.state === "blocked"
48
+ ? "high"
49
+ : "medium",
50
+ updatedAt: feature.handoff?.handedOffAt ?? mission.updatedAt,
51
+ blockers: feature.handoff?.discoveredIssues
52
+ ?.filter((issue) => issue.severity === "blocking")
53
+ .map((issue) => issue.description) ?? [],
54
+ evidence: feature.handoff?.verification?.commandsRun?.map((command) => ({
55
+ kind: "verification-command",
56
+ label: command.command,
57
+ })) ?? [],
58
+ }));
59
+ const blocked = mission.state === "blocked"
60
+ ? [
61
+ {
62
+ id: `mission-store:${mission.missionId}:blocked`,
63
+ source: "mission",
64
+ title: mission.title ?? mission.missionId,
65
+ status: "blocked",
66
+ priority: "high",
67
+ updatedAt: mission.updatedAt,
68
+ blockers: [latestMissionBlocker(mission)],
69
+ nextAction: { label: "Inspect mission progress log" },
70
+ evidence: mission.workerSessionIds.map((workerSessionId) => ({
71
+ kind: "worker-session",
72
+ label: workerSessionId,
73
+ })),
74
+ },
75
+ ]
76
+ : [];
77
+ return [
78
+ ...blocked,
79
+ ...features,
80
+ ...missionContinuityItems("mission-store", mission.missionId, mission.updatedAt, continuity),
81
+ ];
82
+ });
83
+ }
84
+ function latestMissionBlocker(mission) {
85
+ for (let index = mission.progressLog.length - 1; index >= 0; index--) {
86
+ const entry = mission.progressLog[index];
87
+ if (entry?.type === "mission_blocked" && entry.message?.trim()) {
88
+ return entry.message;
89
+ }
90
+ }
91
+ return "Mission is blocked";
92
+ }
93
+ function missionItems(missions) {
94
+ return missions.flatMap((mission) => {
95
+ const continuity = summarizeMissionContinuity(mission);
96
+ const features = mission.features.map((feature) => ({
97
+ id: `mission:${mission.missionId}:${feature.id}`,
98
+ source: "mission",
99
+ title: feature.description,
100
+ status: missionFeatureStatus(feature.status),
101
+ owner: feature.handoff?.workerId ?? feature.skillName,
102
+ priority: feature.status === "in-progress" ? "high" : "medium",
103
+ updatedAt: feature.handoff?.handedOffAt ?? mission.updatedAt,
104
+ blockers: feature.handoff?.discoveredIssues
105
+ ?.filter((issue) => issue.severity === "blocking")
106
+ .map((issue) => issue.description) ?? [],
107
+ evidence: feature.handoff?.verification?.commandsRun?.map((command) => ({
108
+ kind: "verification-command",
109
+ label: command.command,
110
+ })) ?? [],
111
+ }));
112
+ return [
113
+ ...features,
114
+ ...missionContinuityItems("mission", mission.missionId, mission.updatedAt, continuity),
115
+ ];
116
+ });
117
+ }
118
+ function missionContinuityItems(prefix, missionId, updatedAt, continuity) {
119
+ return [
120
+ ...continuity.unresolved,
121
+ ...continuity.openFollowUps,
122
+ ...continuity.openTrackedItems,
123
+ ].map((item) => {
124
+ const key = "key" in item ? item.key : item.id;
125
+ return {
126
+ id: `${prefix}:${missionId}:handoff:${item.sourceFeatureId}:${item.kind}:${key}`,
127
+ source: "mission",
128
+ title: item.description,
129
+ status: "blocked",
130
+ priority: "high",
131
+ updatedAt,
132
+ blockers: ["Unresolved mission handoff item"],
133
+ nextAction: { label: "Track, requeue, or dismiss this handoff item" },
134
+ evidence: [],
135
+ };
136
+ });
137
+ }
138
+ function a2aItems(a2a) {
139
+ if (!a2a)
140
+ return [];
141
+ const nextActionsByTask = new Map(a2a.nextActions
142
+ .filter((action) => action.taskId)
143
+ .map((action) => [a2aTaskActionKey(action.peer, action.taskId), action]));
144
+ return a2a.tasks.map((task) => {
145
+ const action = nextActionsByTask.get(a2aTaskActionKey(task.peer, task.taskId));
146
+ return {
147
+ id: `a2a:${task.peer}:${task.taskId}`,
148
+ source: "a2a",
149
+ title: task.text,
150
+ status: a2aStatus(task.status),
151
+ owner: task.peerDisplayName ?? task.peer,
152
+ priority: task.requiresInput || task.status === "failed" ? "high" : "medium",
153
+ updatedAt: task.updatedAt,
154
+ blockers: task.requiresInput ? ["Waiting on operator input"] : [],
155
+ nextAction: action
156
+ ? { label: action.label, command: action.command }
157
+ : task.nextCommand
158
+ ? { label: "Resume A2A task", command: task.nextCommand }
159
+ : undefined,
160
+ evidence: task.workGraph
161
+ ? [{ kind: "work-graph", label: "A2A work graph captured" }]
162
+ : [],
163
+ };
164
+ });
165
+ }
166
+ function a2aTaskActionKey(peer, taskId) {
167
+ return `${peer ?? ""}:${taskId}`;
168
+ }
169
+ function todoItems(todos) {
170
+ if (!todos)
171
+ return [];
172
+ return Object.values(todos).flatMap((goal) => goal.items
173
+ .filter((item) => item.status !== "completed")
174
+ .map((item) => ({
175
+ id: `todo:${goal.goal}:${item.id}`,
176
+ source: "todo",
177
+ title: item.content,
178
+ status: item.status === "in_progress" ? "running" : "pending",
179
+ priority: item.priority,
180
+ updatedAt: goal.updatedAt,
181
+ blockers: item.blockedBy ?? [],
182
+ nextAction: { label: `Continue todo goal: ${goal.goal}` },
183
+ evidence: [],
184
+ })));
185
+ }
186
+ function handoffItems(handoffs, openWork) {
187
+ const fromHandoffs = handoffs
188
+ .filter((handoff) => handoff.status !== "delivered")
189
+ .map((handoff) => ({
190
+ id: `handoff:${handoff.sessionId}`,
191
+ source: "handoff",
192
+ title: handoff.title,
193
+ status: handoff.status === "blocked" ? "blocked" : "waiting",
194
+ priority: handoff.status === "blocked" ? "high" : "medium",
195
+ updatedAt: handoff.evidence.updatedAt,
196
+ blockers: handoff.blockers,
197
+ nextAction: { label: handoff.nextAction },
198
+ evidence: [
199
+ {
200
+ kind: "session",
201
+ label: "Session handoff",
202
+ path: handoff.evidence.sessionPath,
203
+ },
204
+ ],
205
+ }));
206
+ const fromOpenWork = openWork.map((item) => ({
207
+ id: `open-work:${item.goal}:${item.id}`,
208
+ source: "handoff",
209
+ title: item.content,
210
+ status: item.status === "in_progress" ? "running" : "pending",
211
+ priority: item.priority,
212
+ updatedAt: item.updatedAt,
213
+ blockers: item.blockers,
214
+ nextAction: { label: `Continue ${item.goal}` },
215
+ evidence: [],
216
+ }));
217
+ return [...fromHandoffs, ...fromOpenWork];
218
+ }
219
+ function githubItems(tasks) {
220
+ return tasks.map((task) => ({
221
+ id: `github:${task.id}`,
222
+ source: "github",
223
+ title: task.title,
224
+ status: task.status,
225
+ owner: task.branch,
226
+ priority: task.status === "failed" ? "high" : "medium",
227
+ updatedAt: task.updatedAt,
228
+ blockers: task.error ? [task.error] : [],
229
+ nextAction: task.prUrl
230
+ ? { label: "Review pull request", command: task.prUrl }
231
+ : undefined,
232
+ evidence: task.prUrl
233
+ ? [{ kind: "pull-request", label: "GitHub PR", url: task.prUrl }]
234
+ : [],
235
+ }));
236
+ }
237
+ function missionFeatureStatus(status) {
238
+ switch (status) {
239
+ case "passed":
240
+ return "completed";
241
+ case "failed":
242
+ return "failed";
243
+ case "in-progress":
244
+ return "running";
245
+ case "blocked":
246
+ return "blocked";
247
+ default:
248
+ return "pending";
249
+ }
250
+ }
251
+ function a2aStatus(status) {
252
+ switch (status) {
253
+ case "completed":
254
+ return "completed";
255
+ case "failed":
256
+ return "failed";
257
+ case "waiting":
258
+ return "waiting";
259
+ case "running":
260
+ return "running";
261
+ default:
262
+ return "pending";
263
+ }
264
+ }
265
+ function countItems(items) {
266
+ const counts = {
267
+ total: items.length,
268
+ pending: 0,
269
+ running: 0,
270
+ waiting: 0,
271
+ completed: 0,
272
+ failed: 0,
273
+ blocked: 0,
274
+ };
275
+ for (const item of items) {
276
+ counts[item.status] += 1;
277
+ }
278
+ return counts;
279
+ }
280
+ function compareWorkItems(left, right) {
281
+ return (statusWeight(right.status) - statusWeight(left.status) ||
282
+ priorityWeight(right.priority) - priorityWeight(left.priority) ||
283
+ (right.updatedAt ?? "").localeCompare(left.updatedAt ?? "") ||
284
+ left.id.localeCompare(right.id));
285
+ }
286
+ function statusWeight(status) {
287
+ switch (status) {
288
+ case "blocked":
289
+ return 6;
290
+ case "failed":
291
+ return 5;
292
+ case "waiting":
293
+ return 4;
294
+ case "running":
295
+ return 3;
296
+ case "pending":
297
+ return 2;
298
+ case "completed":
299
+ return 1;
300
+ }
301
+ }
302
+ function priorityWeight(priority) {
303
+ switch (priority) {
304
+ case "high":
305
+ return 3;
306
+ case "medium":
307
+ return 2;
308
+ case "low":
309
+ return 1;
310
+ }
311
+ }
312
+ //# sourceMappingURL=agent-work-board.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-work-board.js","sourceRoot":"","sources":["../../src/agent/agent-work-board.ts"],"names":[],"mappings":"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","sourcesContent":["import type { A2ACockpitSummary } from \"../platform/a2a-cockpit.js\";\nimport type { TodoStore } from \"../tools/todo.js\";\nimport type { MissionManifest } from \"./mission-manifest.js\";\nimport { summarizeMissionContinuity } from \"./mission-manifest.js\";\nimport {\n\ttype MissionStoreSnapshot,\n\tsanitizeMissionId,\n} from \"./mission-store.js\";\n\nexport const AGENT_WORK_BOARD_SCHEMA = \"evalops.maestro.agent-work-board.v1\";\n\nexport type AgentWorkItemSource =\n\t| \"mission\"\n\t| \"a2a\"\n\t| \"todo\"\n\t| \"handoff\"\n\t| \"github\";\n\nexport type AgentWorkItemStatus =\n\t| \"pending\"\n\t| \"running\"\n\t| \"waiting\"\n\t| \"completed\"\n\t| \"failed\"\n\t| \"blocked\";\n\nexport interface AgentWorkItemEvidence {\n\tkind: string;\n\tlabel: string;\n\tpath?: string;\n\turl?: string;\n}\n\nexport interface AgentWorkItem {\n\tid: string;\n\tsource: AgentWorkItemSource;\n\ttitle: string;\n\tstatus: AgentWorkItemStatus;\n\towner?: string;\n\tpriority: \"high\" | \"medium\" | \"low\";\n\tupdatedAt?: string;\n\tblockers: string[];\n\tnextAction?: {\n\t\tlabel: string;\n\t\tcommand?: string;\n\t};\n\tevidence: AgentWorkItemEvidence[];\n}\n\nexport interface GitHubAgentWorkProjection {\n\tid: string;\n\ttitle: string;\n\tstatus: AgentWorkItemStatus;\n\tbranch?: string;\n\tprUrl?: string;\n\tupdatedAt?: string;\n\terror?: string;\n}\n\nexport interface AgentWorkBoardHandoffProjection {\n\tsessionId: string;\n\ttitle: string;\n\tstatus: \"delivered\" | \"needs-followup\" | \"blocked\";\n\tnextAction: string;\n\tblockers: string[];\n\tevidence: {\n\t\tsessionPath: string;\n\t\tupdatedAt: string;\n\t};\n}\n\nexport interface AgentWorkBoardOpenWorkProjection {\n\tgoal: string;\n\tid: string;\n\tcontent: string;\n\tstatus: \"pending\" | \"in_progress\";\n\tpriority: \"high\" | \"medium\" | \"low\";\n\tupdatedAt: string;\n\tblockers: string[];\n}\n\nexport interface BuildAgentWorkBoardInput {\n\tmissions?: readonly MissionManifest[];\n\tmissionSnapshots?: readonly MissionStoreSnapshot[];\n\ta2a?: A2ACockpitSummary;\n\ttodos?: TodoStore;\n\thandoffs?: readonly AgentWorkBoardHandoffProjection[];\n\topenWork?: readonly AgentWorkBoardOpenWorkProjection[];\n\tgithubTasks?: readonly GitHubAgentWorkProjection[];\n}\n\nexport interface AgentWorkBoard {\n\tschemaVersion: typeof AGENT_WORK_BOARD_SCHEMA;\n\tgeneratedAt: string;\n\tcounts: {\n\t\ttotal: number;\n\t\tpending: number;\n\t\trunning: number;\n\t\twaiting: number;\n\t\tcompleted: number;\n\t\tfailed: number;\n\t\tblocked: number;\n\t};\n\titems: AgentWorkItem[];\n}\n\nexport function buildAgentWorkBoard(\n\tinput: BuildAgentWorkBoardInput,\n\tnow = new Date(),\n): AgentWorkBoard {\n\tconst missionSnapshots = input.missionSnapshots ?? [];\n\tconst snapshotMissionIds = new Set(\n\t\tmissionSnapshots.map((mission) => missionBoardDedupId(mission.missionId)),\n\t);\n\tconst missions =\n\t\tinput.missions?.filter(\n\t\t\t(mission) =>\n\t\t\t\t!snapshotMissionIds.has(missionBoardDedupId(mission.missionId)),\n\t\t) ?? [];\n\tconst items = [\n\t\t...missionItems(missions),\n\t\t...missionSnapshotItems(missionSnapshots),\n\t\t...a2aItems(input.a2a),\n\t\t...todoItems(input.todos),\n\t\t...handoffItems(input.handoffs ?? [], input.openWork ?? []),\n\t\t...githubItems(input.githubTasks ?? []),\n\t].sort(compareWorkItems);\n\treturn {\n\t\tschemaVersion: AGENT_WORK_BOARD_SCHEMA,\n\t\tgeneratedAt: now.toISOString(),\n\t\tcounts: countItems(items),\n\t\titems,\n\t};\n}\n\nfunction missionBoardDedupId(missionId: string): string {\n\ttry {\n\t\treturn sanitizeMissionId(missionId);\n\t} catch {\n\t\treturn missionId;\n\t}\n}\n\nfunction missionSnapshotItems(\n\tsnapshots: readonly MissionStoreSnapshot[],\n): AgentWorkItem[] {\n\treturn snapshots.flatMap((mission) => {\n\t\tconst continuity = summarizeMissionContinuity({\n\t\t\tversion: 1,\n\t\t\tmissionId: mission.missionId,\n\t\t\tmilestones: [],\n\t\t\tfeatures: mission.features,\n\t\t\tcreatedAt: mission.createdAt,\n\t\t\tupdatedAt: mission.updatedAt,\n\t\t});\n\t\tconst features: AgentWorkItem[] = mission.features.map((feature) => ({\n\t\t\tid: `mission-store:${mission.missionId}:${feature.id}`,\n\t\t\tsource: \"mission\" as const,\n\t\t\ttitle: feature.description,\n\t\t\tstatus: missionFeatureStatus(feature.status),\n\t\t\towner: feature.handoff?.workerId ?? feature.skillName,\n\t\t\tpriority:\n\t\t\t\tfeature.status === \"in-progress\" || mission.state === \"blocked\"\n\t\t\t\t\t? \"high\"\n\t\t\t\t\t: \"medium\",\n\t\t\tupdatedAt: feature.handoff?.handedOffAt ?? mission.updatedAt,\n\t\t\tblockers:\n\t\t\t\tfeature.handoff?.discoveredIssues\n\t\t\t\t\t?.filter((issue) => issue.severity === \"blocking\")\n\t\t\t\t\t.map((issue) => issue.description) ?? [],\n\t\t\tevidence:\n\t\t\t\tfeature.handoff?.verification?.commandsRun?.map((command) => ({\n\t\t\t\t\tkind: \"verification-command\",\n\t\t\t\t\tlabel: command.command,\n\t\t\t\t})) ?? [],\n\t\t}));\n\t\tconst blocked: AgentWorkItem[] =\n\t\t\tmission.state === \"blocked\"\n\t\t\t\t? [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: `mission-store:${mission.missionId}:blocked`,\n\t\t\t\t\t\t\tsource: \"mission\",\n\t\t\t\t\t\t\ttitle: mission.title ?? mission.missionId,\n\t\t\t\t\t\t\tstatus: \"blocked\",\n\t\t\t\t\t\t\tpriority: \"high\",\n\t\t\t\t\t\t\tupdatedAt: mission.updatedAt,\n\t\t\t\t\t\t\tblockers: [latestMissionBlocker(mission)],\n\t\t\t\t\t\t\tnextAction: { label: \"Inspect mission progress log\" },\n\t\t\t\t\t\t\tevidence: mission.workerSessionIds.map((workerSessionId) => ({\n\t\t\t\t\t\t\t\tkind: \"worker-session\",\n\t\t\t\t\t\t\t\tlabel: workerSessionId,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t},\n\t\t\t\t\t]\n\t\t\t\t: [];\n\t\treturn [\n\t\t\t...blocked,\n\t\t\t...features,\n\t\t\t...missionContinuityItems(\n\t\t\t\t\"mission-store\",\n\t\t\t\tmission.missionId,\n\t\t\t\tmission.updatedAt,\n\t\t\t\tcontinuity,\n\t\t\t),\n\t\t];\n\t});\n}\n\nfunction latestMissionBlocker(mission: MissionStoreSnapshot): string {\n\tfor (let index = mission.progressLog.length - 1; index >= 0; index--) {\n\t\tconst entry = mission.progressLog[index];\n\t\tif (entry?.type === \"mission_blocked\" && entry.message?.trim()) {\n\t\t\treturn entry.message;\n\t\t}\n\t}\n\treturn \"Mission is blocked\";\n}\n\nfunction missionItems(missions: readonly MissionManifest[]): AgentWorkItem[] {\n\treturn missions.flatMap((mission) => {\n\t\tconst continuity = summarizeMissionContinuity(mission);\n\t\tconst features: AgentWorkItem[] = mission.features.map((feature) => ({\n\t\t\tid: `mission:${mission.missionId}:${feature.id}`,\n\t\t\tsource: \"mission\" as const,\n\t\t\ttitle: feature.description,\n\t\t\tstatus: missionFeatureStatus(feature.status),\n\t\t\towner: feature.handoff?.workerId ?? feature.skillName,\n\t\t\tpriority: feature.status === \"in-progress\" ? \"high\" : \"medium\",\n\t\t\tupdatedAt: feature.handoff?.handedOffAt ?? mission.updatedAt,\n\t\t\tblockers:\n\t\t\t\tfeature.handoff?.discoveredIssues\n\t\t\t\t\t?.filter((issue) => issue.severity === \"blocking\")\n\t\t\t\t\t.map((issue) => issue.description) ?? [],\n\t\t\tevidence:\n\t\t\t\tfeature.handoff?.verification?.commandsRun?.map((command) => ({\n\t\t\t\t\tkind: \"verification-command\",\n\t\t\t\t\tlabel: command.command,\n\t\t\t\t})) ?? [],\n\t\t}));\n\t\treturn [\n\t\t\t...features,\n\t\t\t...missionContinuityItems(\n\t\t\t\t\"mission\",\n\t\t\t\tmission.missionId,\n\t\t\t\tmission.updatedAt,\n\t\t\t\tcontinuity,\n\t\t\t),\n\t\t];\n\t});\n}\n\nfunction missionContinuityItems(\n\tprefix: \"mission\" | \"mission-store\",\n\tmissionId: string,\n\tupdatedAt: string,\n\tcontinuity: ReturnType<typeof summarizeMissionContinuity>,\n): AgentWorkItem[] {\n\treturn [\n\t\t...continuity.unresolved,\n\t\t...continuity.openFollowUps,\n\t\t...continuity.openTrackedItems,\n\t].map((item) => {\n\t\tconst key = \"key\" in item ? item.key : item.id;\n\t\treturn {\n\t\t\tid: `${prefix}:${missionId}:handoff:${item.sourceFeatureId}:${item.kind}:${key}`,\n\t\t\tsource: \"mission\" as const,\n\t\t\ttitle: item.description,\n\t\t\tstatus: \"blocked\" as const,\n\t\t\tpriority: \"high\" as const,\n\t\t\tupdatedAt,\n\t\t\tblockers: [\"Unresolved mission handoff item\"],\n\t\t\tnextAction: { label: \"Track, requeue, or dismiss this handoff item\" },\n\t\t\tevidence: [],\n\t\t};\n\t});\n}\n\nfunction a2aItems(a2a: A2ACockpitSummary | undefined): AgentWorkItem[] {\n\tif (!a2a) return [];\n\tconst nextActionsByTask = new Map(\n\t\ta2a.nextActions\n\t\t\t.filter((action) => action.taskId)\n\t\t\t.map(\n\t\t\t\t(action) =>\n\t\t\t\t\t[a2aTaskActionKey(action.peer, action.taskId!), action] as const,\n\t\t\t),\n\t);\n\treturn a2a.tasks.map((task) => {\n\t\tconst action = nextActionsByTask.get(\n\t\t\ta2aTaskActionKey(task.peer, task.taskId),\n\t\t);\n\t\treturn {\n\t\t\tid: `a2a:${task.peer}:${task.taskId}`,\n\t\t\tsource: \"a2a\",\n\t\t\ttitle: task.text,\n\t\t\tstatus: a2aStatus(task.status),\n\t\t\towner: task.peerDisplayName ?? task.peer,\n\t\t\tpriority:\n\t\t\t\ttask.requiresInput || task.status === \"failed\" ? \"high\" : \"medium\",\n\t\t\tupdatedAt: task.updatedAt,\n\t\t\tblockers: task.requiresInput ? [\"Waiting on operator input\"] : [],\n\t\t\tnextAction: action\n\t\t\t\t? { label: action.label, command: action.command }\n\t\t\t\t: task.nextCommand\n\t\t\t\t\t? { label: \"Resume A2A task\", command: task.nextCommand }\n\t\t\t\t\t: undefined,\n\t\t\tevidence: task.workGraph\n\t\t\t\t? [{ kind: \"work-graph\", label: \"A2A work graph captured\" }]\n\t\t\t\t: [],\n\t\t};\n\t});\n}\n\nfunction a2aTaskActionKey(peer: string | undefined, taskId: string): string {\n\treturn `${peer ?? \"\"}:${taskId}`;\n}\n\nfunction todoItems(todos: TodoStore | undefined): AgentWorkItem[] {\n\tif (!todos) return [];\n\treturn Object.values(todos).flatMap((goal) =>\n\t\tgoal.items\n\t\t\t.filter((item) => item.status !== \"completed\")\n\t\t\t.map((item) => ({\n\t\t\t\tid: `todo:${goal.goal}:${item.id}`,\n\t\t\t\tsource: \"todo\" as const,\n\t\t\t\ttitle: item.content,\n\t\t\t\tstatus: item.status === \"in_progress\" ? \"running\" : \"pending\",\n\t\t\t\tpriority: item.priority,\n\t\t\t\tupdatedAt: goal.updatedAt,\n\t\t\t\tblockers: item.blockedBy ?? [],\n\t\t\t\tnextAction: { label: `Continue todo goal: ${goal.goal}` },\n\t\t\t\tevidence: [],\n\t\t\t})),\n\t);\n}\n\nfunction handoffItems(\n\thandoffs: readonly AgentWorkBoardHandoffProjection[],\n\topenWork: readonly AgentWorkBoardOpenWorkProjection[],\n): AgentWorkItem[] {\n\tconst fromHandoffs: AgentWorkItem[] = handoffs\n\t\t.filter((handoff) => handoff.status !== \"delivered\")\n\t\t.map((handoff) => ({\n\t\t\tid: `handoff:${handoff.sessionId}`,\n\t\t\tsource: \"handoff\" as const,\n\t\t\ttitle: handoff.title,\n\t\t\tstatus: handoff.status === \"blocked\" ? \"blocked\" : \"waiting\",\n\t\t\tpriority: handoff.status === \"blocked\" ? \"high\" : \"medium\",\n\t\t\tupdatedAt: handoff.evidence.updatedAt,\n\t\t\tblockers: handoff.blockers,\n\t\t\tnextAction: { label: handoff.nextAction },\n\t\t\tevidence: [\n\t\t\t\t{\n\t\t\t\t\tkind: \"session\",\n\t\t\t\t\tlabel: \"Session handoff\",\n\t\t\t\t\tpath: handoff.evidence.sessionPath,\n\t\t\t\t},\n\t\t\t],\n\t\t}));\n\tconst fromOpenWork: AgentWorkItem[] = openWork.map((item) => ({\n\t\tid: `open-work:${item.goal}:${item.id}`,\n\t\tsource: \"handoff\" as const,\n\t\ttitle: item.content,\n\t\tstatus: item.status === \"in_progress\" ? \"running\" : \"pending\",\n\t\tpriority: item.priority,\n\t\tupdatedAt: item.updatedAt,\n\t\tblockers: item.blockers,\n\t\tnextAction: { label: `Continue ${item.goal}` },\n\t\tevidence: [],\n\t}));\n\treturn [...fromHandoffs, ...fromOpenWork];\n}\n\nfunction githubItems(\n\ttasks: readonly GitHubAgentWorkProjection[],\n): AgentWorkItem[] {\n\treturn tasks.map((task) => ({\n\t\tid: `github:${task.id}`,\n\t\tsource: \"github\",\n\t\ttitle: task.title,\n\t\tstatus: task.status,\n\t\towner: task.branch,\n\t\tpriority: task.status === \"failed\" ? \"high\" : \"medium\",\n\t\tupdatedAt: task.updatedAt,\n\t\tblockers: task.error ? [task.error] : [],\n\t\tnextAction: task.prUrl\n\t\t\t? { label: \"Review pull request\", command: task.prUrl }\n\t\t\t: undefined,\n\t\tevidence: task.prUrl\n\t\t\t? [{ kind: \"pull-request\", label: \"GitHub PR\", url: task.prUrl }]\n\t\t\t: [],\n\t}));\n}\n\nfunction missionFeatureStatus(status: string): AgentWorkItemStatus {\n\tswitch (status) {\n\t\tcase \"passed\":\n\t\t\treturn \"completed\";\n\t\tcase \"failed\":\n\t\t\treturn \"failed\";\n\t\tcase \"in-progress\":\n\t\t\treturn \"running\";\n\t\tcase \"blocked\":\n\t\t\treturn \"blocked\";\n\t\tdefault:\n\t\t\treturn \"pending\";\n\t}\n}\n\nfunction a2aStatus(status: string): AgentWorkItemStatus {\n\tswitch (status) {\n\t\tcase \"completed\":\n\t\t\treturn \"completed\";\n\t\tcase \"failed\":\n\t\t\treturn \"failed\";\n\t\tcase \"waiting\":\n\t\t\treturn \"waiting\";\n\t\tcase \"running\":\n\t\t\treturn \"running\";\n\t\tdefault:\n\t\t\treturn \"pending\";\n\t}\n}\n\nfunction countItems(items: readonly AgentWorkItem[]): AgentWorkBoard[\"counts\"] {\n\tconst counts = {\n\t\ttotal: items.length,\n\t\tpending: 0,\n\t\trunning: 0,\n\t\twaiting: 0,\n\t\tcompleted: 0,\n\t\tfailed: 0,\n\t\tblocked: 0,\n\t};\n\tfor (const item of items) {\n\t\tcounts[item.status] += 1;\n\t}\n\treturn counts;\n}\n\nfunction compareWorkItems(left: AgentWorkItem, right: AgentWorkItem): number {\n\treturn (\n\t\tstatusWeight(right.status) - statusWeight(left.status) ||\n\t\tpriorityWeight(right.priority) - priorityWeight(left.priority) ||\n\t\t(right.updatedAt ?? \"\").localeCompare(left.updatedAt ?? \"\") ||\n\t\tleft.id.localeCompare(right.id)\n\t);\n}\n\nfunction statusWeight(status: AgentWorkItemStatus): number {\n\tswitch (status) {\n\t\tcase \"blocked\":\n\t\t\treturn 6;\n\t\tcase \"failed\":\n\t\t\treturn 5;\n\t\tcase \"waiting\":\n\t\t\treturn 4;\n\t\tcase \"running\":\n\t\t\treturn 3;\n\t\tcase \"pending\":\n\t\t\treturn 2;\n\t\tcase \"completed\":\n\t\t\treturn 1;\n\t}\n}\n\nfunction priorityWeight(priority: AgentWorkItem[\"priority\"]): number {\n\tswitch (priority) {\n\t\tcase \"high\":\n\t\t\treturn 3;\n\t\tcase \"medium\":\n\t\t\treturn 2;\n\t\tcase \"low\":\n\t\t\treturn 1;\n\t}\n}\n"]}
@@ -9,6 +9,7 @@
9
9
  * - MAESTRO_AUTOCOMPACT_ENABLED: Enable/disable auto-compaction (default: true)
10
10
  * - MAESTRO_AUTOCOMPACT_MIN_MESSAGES: Minimum messages before compacting (default: 10)
11
11
  */
12
+ import type { MaestroCompactionSettings } from "@evalops/contracts";
12
13
  import type { Api, AppMessage, Model } from "./types.js";
13
14
  /**
14
15
  * Configuration for auto-compaction behavior.
@@ -43,9 +44,13 @@ export interface CompactionStats {
43
44
  reason?: string;
44
45
  }
45
46
  /**
46
- * Parse configuration from environment variables.
47
+ * Parse configuration from resolved Maestro settings with env-var fallback.
48
+ *
49
+ * Resolution order: `compaction` settings (org -> user merged by the caller) ->
50
+ * legacy `MAESTRO_AUTOCOMPACT_*` env vars -> built-in defaults. Env vars keep
51
+ * working for callers that have no org/user settings.
47
52
  */
48
- export declare function getAutoCompactionConfig(): AutoCompactionConfig;
53
+ export declare function getAutoCompactionConfig(compaction?: MaestroCompactionSettings | null): AutoCompactionConfig;
49
54
  /**
50
55
  * Calculate context window usage statistics.
51
56
  */
@@ -1 +1 @@
1
- {"version":3,"file":"auto-compaction.d.ts","sourceRoot":"","sources":["../../src/agent/auto-compaction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAIzD;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACpC,yCAAyC;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,iEAAiE;IACjE,gBAAgB,EAAE,MAAM,CAAC;IACzB,iEAAiE;IACjE,WAAW,EAAE,MAAM,CAAC;IACpB,+CAA+C;IAC/C,eAAe,EAAE,MAAM,CAAC;IACxB,8CAA8C;IAC9C,uBAAuB,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;CAC3D;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC/B,2CAA2C;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,wCAAwC;IACxC,YAAY,EAAE,MAAM,CAAC;IACrB,yCAAyC;IACzC,YAAY,EAAE,MAAM,CAAC;IACrB,wCAAwC;IACxC,aAAa,EAAE,OAAO,CAAC;IACvB,gCAAgC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AASD;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,oBAAoB,CAqB9D;AA+BD;;GAEG;AACH,wBAAgB,qBAAqB,CACpC,QAAQ,EAAE,UAAU,EAAE,EACtB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EACjB,kBAAkB,SAAI,GACpB,eAAe,CAuBjB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAChC,QAAQ,EAAE,UAAU,EAAE,EACtB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EACjB,MAAM,GAAE,oBAAgD,EACxD,kBAAkB,SAAI,GACpB,eAAe,CAwCjB;AAED;;GAEG;AACH,qBAAa,qBAAqB;IACjC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,SAAS,CAAgC;IACjD,OAAO,CAAC,eAAe,CAAK;gBAEhB,MAAM,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC;IAIlD;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,oBAAoB,CAAC,GAAG,IAAI;IAItD;;OAEG;IACH,SAAS,IAAI,oBAAoB;IAIjC;;;OAGG;IACH,KAAK,CACJ,QAAQ,EAAE,UAAU,EAAE,EACtB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EACjB,kBAAkB,SAAI,GACpB,eAAe;IAwBlB;;OAEG;IACH,gBAAgB,IAAI,IAAI;IAQxB;;OAEG;IACH,QAAQ,IAAI;QAAE,eAAe,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,eAAe,GAAG,IAAI,CAAA;KAAE;IAO1E;;OAEG;IACH,oBAAoB,IAAI;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;CAM7D;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAC1C,MAAM,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,GACpC,qBAAqB,CAEvB"}
1
+ {"version":3,"file":"auto-compaction.d.ts","sourceRoot":"","sources":["../../src/agent/auto-compaction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAGpE,OAAO,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAIzD;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACpC,yCAAyC;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,iEAAiE;IACjE,gBAAgB,EAAE,MAAM,CAAC;IACzB,iEAAiE;IACjE,WAAW,EAAE,MAAM,CAAC;IACpB,+CAA+C;IAC/C,eAAe,EAAE,MAAM,CAAC;IACxB,8CAA8C;IAC9C,uBAAuB,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;CAC3D;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC/B,2CAA2C;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,wCAAwC;IACxC,YAAY,EAAE,MAAM,CAAC;IACrB,yCAAyC;IACzC,YAAY,EAAE,MAAM,CAAC;IACrB,wCAAwC;IACxC,aAAa,EAAE,OAAO,CAAC;IACvB,gCAAgC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AASD;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACtC,UAAU,CAAC,EAAE,yBAAyB,GAAG,IAAI,GAC3C,oBAAoB,CAmCtB;AA+BD;;GAEG;AACH,wBAAgB,qBAAqB,CACpC,QAAQ,EAAE,UAAU,EAAE,EACtB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EACjB,kBAAkB,SAAI,GACpB,eAAe,CAuBjB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAChC,QAAQ,EAAE,UAAU,EAAE,EACtB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EACjB,MAAM,GAAE,oBAAgD,EACxD,kBAAkB,SAAI,GACpB,eAAe,CAwCjB;AAED;;GAEG;AACH,qBAAa,qBAAqB;IACjC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,SAAS,CAAgC;IACjD,OAAO,CAAC,eAAe,CAAK;gBAEhB,MAAM,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC;IAIlD;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,oBAAoB,CAAC,GAAG,IAAI;IAItD;;OAEG;IACH,SAAS,IAAI,oBAAoB;IAIjC;;;OAGG;IACH,KAAK,CACJ,QAAQ,EAAE,UAAU,EAAE,EACtB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EACjB,kBAAkB,SAAI,GACpB,eAAe;IAwBlB;;OAEG;IACH,gBAAgB,IAAI,IAAI;IAQxB;;OAEG;IACH,QAAQ,IAAI;QAAE,eAAe,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,eAAe,GAAG,IAAI,CAAA;KAAE;IAO1E;;OAEG;IACH,oBAAoB,IAAI;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;CAM7D;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAC1C,MAAM,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,GACpC,qBAAqB,CAEvB"}
@@ -19,21 +19,34 @@ const DEFAULT_CONFIG = {
19
19
  keepRecentCount: 6,
20
20
  };
21
21
  /**
22
- * Parse configuration from environment variables.
22
+ * Parse configuration from resolved Maestro settings with env-var fallback.
23
+ *
24
+ * Resolution order: `compaction` settings (org -> user merged by the caller) ->
25
+ * legacy `MAESTRO_AUTOCOMPACT_*` env vars -> built-in defaults. Env vars keep
26
+ * working for callers that have no org/user settings.
23
27
  */
24
- export function getAutoCompactionConfig() {
25
- const enabled = process.env.MAESTRO_AUTOCOMPACT_ENABLED !== "false";
26
- const thresholdPercent = Number.parseInt(process.env.MAESTRO_AUTOCOMPACT_PCT || "85", 10);
27
- const minMessages = Number.parseInt(process.env.MAESTRO_AUTOCOMPACT_MIN_MESSAGES || "10", 10);
28
+ export function getAutoCompactionConfig(compaction) {
29
+ const envThreshold = Number.parseInt(process.env.MAESTRO_AUTOCOMPACT_PCT || "85", 10);
30
+ const envMinMessages = Number.parseInt(process.env.MAESTRO_AUTOCOMPACT_MIN_MESSAGES || "10", 10);
31
+ const enabled = compaction?.enabled ?? process.env.MAESTRO_AUTOCOMPACT_ENABLED !== "false";
32
+ const thresholdPercent = compaction?.thresholdPercent ??
33
+ (Number.isNaN(envThreshold)
34
+ ? DEFAULT_CONFIG.thresholdPercent
35
+ : envThreshold);
36
+ const minMessages = compaction?.minMessages ??
37
+ (Number.isNaN(envMinMessages)
38
+ ? DEFAULT_CONFIG.minMessages
39
+ : envMinMessages);
40
+ const keepRecentCount = compaction?.keepRecentMessages ?? DEFAULT_CONFIG.keepRecentCount;
41
+ const hasSettingsMinMessages = compaction?.minMessages !== undefined;
28
42
  return {
29
43
  ...DEFAULT_CONFIG,
30
44
  enabled,
31
- thresholdPercent: Number.isNaN(thresholdPercent)
32
- ? DEFAULT_CONFIG.thresholdPercent
33
- : Math.min(100, Math.max(50, thresholdPercent)),
34
- minMessages: Number.isNaN(minMessages)
35
- ? DEFAULT_CONFIG.minMessages
45
+ thresholdPercent: Math.min(100, Math.max(50, thresholdPercent)),
46
+ minMessages: hasSettingsMinMessages
47
+ ? Math.max(0, minMessages)
36
48
  : Math.max(5, minMessages),
49
+ keepRecentCount,
37
50
  };
38
51
  }
39
52
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"auto-compaction.js","sourceRoot":"","sources":["../../src/agent/auto-compaction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAG9D,MAAM,MAAM,GAAG,YAAY,CAAC,iBAAiB,CAAC,CAAC;AAoC/C,MAAM,cAAc,GAAyB;IAC5C,OAAO,EAAE,IAAI;IACb,gBAAgB,EAAE,EAAE;IACpB,WAAW,EAAE,EAAE;IACf,eAAe,EAAE,CAAC;CAClB,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,uBAAuB;IACtC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,KAAK,OAAO,CAAC;IACpE,MAAM,gBAAgB,GAAG,MAAM,CAAC,QAAQ,CACvC,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,IAAI,EAC3C,EAAE,CACF,CAAC;IACF,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAClC,OAAO,CAAC,GAAG,CAAC,gCAAgC,IAAI,IAAI,EACpD,EAAE,CACF,CAAC;IAEF,OAAO;QACN,GAAG,cAAc;QACjB,OAAO;QACP,gBAAgB,EAAE,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC;YAC/C,CAAC,CAAC,cAAc,CAAC,gBAAgB;YACjC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;QAChD,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC;YACrC,CAAC,CAAC,cAAc,CAAC,WAAW;YAC5B,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC;KAC3B,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,qBAAqB,CAAC,OAAmB;IACjD,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,MAAM,UAAU,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;IACnD,IAAI,CAAC,UAAU,EAAE,CAAC;QACjB,OAAO,CAAC,CAAC;IACV,CAAC;IAED,IAAI,OAAO,UAAU,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC5C,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC;IACvC,CAAC;SAAM,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9C,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;YACvC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC1B,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;YAC/B,CAAC;iBAAM,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBACrC,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;YACnC,CAAC;iBAAM,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBACrC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;YACvE,CAAC;QACF,CAAC;IACF,CAAC;IAED,yCAAyC;IACzC,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACpC,QAAsB,EACtB,KAAiB,EACjB,kBAAkB,GAAG,CAAC;IAEtB,IAAI,WAAW,GAAG,kBAAkB,CAAC;IAErC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAChC,0DAA0D;QAC1D,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACnD,WAAW,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;QAC3D,CAAC;aAAM,CAAC;YACP,WAAW,IAAI,qBAAqB,CAAC,OAAO,CAAC,CAAC;QAC/C,CAAC;IACF,CAAC;IAED,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,IAAI,MAAM,CAAC;IACpD,MAAM,YAAY,GAAG,CAAC,WAAW,GAAG,aAAa,CAAC,GAAG,GAAG,CAAC;IAEzD,OAAO;QACN,WAAW;QACX,aAAa;QACb,YAAY;QACZ,YAAY,EAAE,QAAQ,CAAC,MAAM;QAC7B,aAAa,EAAE,KAAK;QACpB,MAAM,EAAE,SAAS;KACjB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAChC,QAAsB,EACtB,KAAiB,EACjB,SAA+B,uBAAuB,EAAE,EACxD,kBAAkB,GAAG,CAAC;IAEtB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACrB,OAAO;YACN,GAAG,qBAAqB,CAAC,QAAQ,EAAE,KAAK,EAAE,kBAAkB,CAAC;YAC7D,aAAa,EAAE,KAAK;YACpB,MAAM,EAAE,0BAA0B;SAClC,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,qBAAqB,CAAC,QAAQ,EAAE,KAAK,EAAE,kBAAkB,CAAC,CAAC;IAEzE,gCAAgC;IAChC,IAAI,KAAK,CAAC,YAAY,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;QAC7C,OAAO;YACN,GAAG,KAAK;YACR,aAAa,EAAE,KAAK;YACpB,MAAM,EAAE,wBAAwB,KAAK,CAAC,YAAY,MAAM,MAAM,CAAC,WAAW,GAAG;SAC7E,CAAC;IACH,CAAC;IAED,iCAAiC;IACjC,IAAI,KAAK,CAAC,YAAY,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;QACnD,MAAM,CAAC,IAAI,CAAC,mCAAmC,EAAE;YAChD,YAAY,EAAE,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;YAC3C,SAAS,EAAE,MAAM,CAAC,gBAAgB;YAClC,YAAY,EAAE,KAAK,CAAC,YAAY;SAChC,CAAC,CAAC;QAEH,OAAO;YACN,GAAG,KAAK;YACR,aAAa,EAAE,IAAI;YACnB,MAAM,EAAE,iBAAiB,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,MAAM,CAAC,gBAAgB,aAAa;SACvG,CAAC;IACH,CAAC;IAED,OAAO;QACN,GAAG,KAAK;QACR,aAAa,EAAE,KAAK;QACpB,MAAM,EAAE,iBAAiB,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,MAAM,CAAC,gBAAgB,aAAa;KACrG,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,qBAAqB;IAMjC,YAAY,MAAsC;QAJ1C,kBAAa,GAAG,CAAC,CAAC;QAClB,cAAS,GAA2B,IAAI,CAAC;QACzC,oBAAe,GAAG,CAAC,CAAC;QAG3B,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,uBAAuB,EAAE,EAAE,GAAG,MAAM,EAAE,CAAC;IAC3D,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,MAAqC;QAC9C,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,SAAS;QACR,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAC3B,CAAC;IAED;;;OAGG;IACH,KAAK,CACJ,QAAsB,EACtB,KAAiB,EACjB,kBAAkB,GAAG,CAAC;QAEtB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC,gCAAgC;QAE1D,oBAAoB;QACpB,IAAI,IAAI,CAAC,SAAS,IAAI,GAAG,GAAG,IAAI,CAAC,aAAa,GAAG,WAAW,EAAE,CAAC;YAC9D,OAAO,IAAI,CAAC,SAAS,CAAC;QACvB,CAAC;QAED,IAAI,CAAC,aAAa,GAAG,GAAG,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,iBAAiB,CACjC,QAAQ,EACR,KAAK,EACL,IAAI,CAAC,MAAM,EACX,kBAAkB,CAClB,CAAC;QAEF,IAAI,IAAI,CAAC,SAAS,CAAC,aAAa,IAAI,IAAI,CAAC,MAAM,CAAC,uBAAuB,EAAE,CAAC;YACzE,IAAI,CAAC,MAAM,CAAC,uBAAuB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACrD,CAAC;QAED,OAAO,IAAI,CAAC,SAAS,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,gBAAgB;QACf,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,iCAAiC;QACxD,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE;YAClC,gBAAgB,EAAE,IAAI,CAAC,eAAe;SACtC,CAAC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,QAAQ;QACP,OAAO;YACN,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,SAAS,EAAE,IAAI,CAAC,SAAS;SACzB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,oBAAoB;QACnB,OAAO;YACN,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB,GAAG,EAAE,EAAE,6BAA6B;YACzE,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB;SACtC,CAAC;IACH,CAAC;CACD;AAED;;GAEG;AACH,MAAM,UAAU,2BAA2B,CAC1C,MAAsC;IAEtC,OAAO,IAAI,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAC1C,CAAC","sourcesContent":["/**\n * Auto-Compaction System\n *\n * Automatically triggers conversation compaction when context window usage\n * exceeds configured thresholds. Inspired by Claude Code's auto-compaction.\n *\n * Environment variables:\n * - MAESTRO_AUTOCOMPACT_PCT: Percentage threshold to trigger (default: 85)\n * - MAESTRO_AUTOCOMPACT_ENABLED: Enable/disable auto-compaction (default: true)\n * - MAESTRO_AUTOCOMPACT_MIN_MESSAGES: Minimum messages before compacting (default: 10)\n */\n\nimport { createLogger } from \"../utils/logger.js\";\nimport { convertAppMessageToLlm } from \"./custom-messages.js\";\nimport type { Api, AppMessage, Model } from \"./types.js\";\n\nconst logger = createLogger(\"auto-compaction\");\n\n/**\n * Configuration for auto-compaction behavior.\n */\nexport interface AutoCompactionConfig {\n\t/** Whether auto-compaction is enabled */\n\tenabled: boolean;\n\t/** Percentage of context window to trigger compaction (0-100) */\n\tthresholdPercent: number;\n\t/** Minimum number of messages before compaction is considered */\n\tminMessages: number;\n\t/** Number of recent messages to always keep */\n\tkeepRecentCount: number;\n\t/** Callback when compaction is recommended */\n\tonCompactionRecommended?: (stats: CompactionStats) => void;\n}\n\n/**\n * Statistics about context window usage.\n */\nexport interface CompactionStats {\n\t/** Total tokens used in current context */\n\ttotalTokens: number;\n\t/** Model's context window size */\n\tcontextWindow: number;\n\t/** Percentage of context window used */\n\tusagePercent: number;\n\t/** Number of messages in conversation */\n\tmessageCount: number;\n\t/** Whether compaction is recommended */\n\tshouldCompact: boolean;\n\t/** Reason for recommendation */\n\treason?: string;\n}\n\nconst DEFAULT_CONFIG: AutoCompactionConfig = {\n\tenabled: true,\n\tthresholdPercent: 85,\n\tminMessages: 10,\n\tkeepRecentCount: 6,\n};\n\n/**\n * Parse configuration from environment variables.\n */\nexport function getAutoCompactionConfig(): AutoCompactionConfig {\n\tconst enabled = process.env.MAESTRO_AUTOCOMPACT_ENABLED !== \"false\";\n\tconst thresholdPercent = Number.parseInt(\n\t\tprocess.env.MAESTRO_AUTOCOMPACT_PCT || \"85\",\n\t\t10,\n\t);\n\tconst minMessages = Number.parseInt(\n\t\tprocess.env.MAESTRO_AUTOCOMPACT_MIN_MESSAGES || \"10\",\n\t\t10,\n\t);\n\n\treturn {\n\t\t...DEFAULT_CONFIG,\n\t\tenabled,\n\t\tthresholdPercent: Number.isNaN(thresholdPercent)\n\t\t\t? DEFAULT_CONFIG.thresholdPercent\n\t\t\t: Math.min(100, Math.max(50, thresholdPercent)),\n\t\tminMessages: Number.isNaN(minMessages)\n\t\t\t? DEFAULT_CONFIG.minMessages\n\t\t\t: Math.max(5, minMessages),\n\t};\n}\n\n/**\n * Estimate token count for a message.\n * Uses a simple heuristic: ~4 characters per token.\n */\nfunction estimateMessageTokens(message: AppMessage): number {\n\tlet charCount = 0;\n\tconst llmMessage = convertAppMessageToLlm(message);\n\tif (!llmMessage) {\n\t\treturn 0;\n\t}\n\n\tif (typeof llmMessage.content === \"string\") {\n\t\tcharCount = llmMessage.content.length;\n\t} else if (Array.isArray(llmMessage.content)) {\n\t\tfor (const part of llmMessage.content) {\n\t\t\tif (part.type === \"text\") {\n\t\t\t\tcharCount += part.text.length;\n\t\t\t} else if (part.type === \"thinking\") {\n\t\t\t\tcharCount += part.thinking.length;\n\t\t\t} else if (part.type === \"toolCall\") {\n\t\t\t\tcharCount += JSON.stringify(part.arguments).length + part.name.length;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Rough estimate: 4 characters per token\n\treturn Math.ceil(charCount / 4);\n}\n\n/**\n * Calculate context window usage statistics.\n */\nexport function calculateContextUsage(\n\tmessages: AppMessage[],\n\tmodel: Model<Api>,\n\tsystemPromptTokens = 0,\n): CompactionStats {\n\tlet totalTokens = systemPromptTokens;\n\n\tfor (const message of messages) {\n\t\t// Use actual usage if available (from assistant messages)\n\t\tif (message.role === \"assistant\" && message.usage) {\n\t\t\ttotalTokens += message.usage.input + message.usage.output;\n\t\t} else {\n\t\t\ttotalTokens += estimateMessageTokens(message);\n\t\t}\n\t}\n\n\tconst contextWindow = model.contextWindow || 128000;\n\tconst usagePercent = (totalTokens / contextWindow) * 100;\n\n\treturn {\n\t\ttotalTokens,\n\t\tcontextWindow,\n\t\tusagePercent,\n\t\tmessageCount: messages.length,\n\t\tshouldCompact: false,\n\t\treason: undefined,\n\t};\n}\n\n/**\n * Check if auto-compaction should be triggered.\n */\nexport function shouldAutoCompact(\n\tmessages: AppMessage[],\n\tmodel: Model<Api>,\n\tconfig: AutoCompactionConfig = getAutoCompactionConfig(),\n\tsystemPromptTokens = 0,\n): CompactionStats {\n\tif (!config.enabled) {\n\t\treturn {\n\t\t\t...calculateContextUsage(messages, model, systemPromptTokens),\n\t\t\tshouldCompact: false,\n\t\t\treason: \"Auto-compaction disabled\",\n\t\t};\n\t}\n\n\tconst stats = calculateContextUsage(messages, model, systemPromptTokens);\n\n\t// Check message count threshold\n\tif (stats.messageCount < config.minMessages) {\n\t\treturn {\n\t\t\t...stats,\n\t\t\tshouldCompact: false,\n\t\t\treason: `Not enough messages (${stats.messageCount} < ${config.minMessages})`,\n\t\t};\n\t}\n\n\t// Check context window threshold\n\tif (stats.usagePercent >= config.thresholdPercent) {\n\t\tlogger.info(\"Auto-compaction threshold reached\", {\n\t\t\tusagePercent: stats.usagePercent.toFixed(1),\n\t\t\tthreshold: config.thresholdPercent,\n\t\t\tmessageCount: stats.messageCount,\n\t\t});\n\n\t\treturn {\n\t\t\t...stats,\n\t\t\tshouldCompact: true,\n\t\t\treason: `Context usage ${stats.usagePercent.toFixed(1)}% exceeds ${config.thresholdPercent}% threshold`,\n\t\t};\n\t}\n\n\treturn {\n\t\t...stats,\n\t\tshouldCompact: false,\n\t\treason: `Context usage ${stats.usagePercent.toFixed(1)}% below ${config.thresholdPercent}% threshold`,\n\t};\n}\n\n/**\n * Auto-compaction monitor that tracks context usage over time.\n */\nexport class AutoCompactionMonitor {\n\tprivate config: AutoCompactionConfig;\n\tprivate lastCheckTime = 0;\n\tprivate lastStats: CompactionStats | null = null;\n\tprivate compactionCount = 0;\n\n\tconstructor(config?: Partial<AutoCompactionConfig>) {\n\t\tthis.config = { ...getAutoCompactionConfig(), ...config };\n\t}\n\n\t/**\n\t * Update configuration.\n\t */\n\tsetConfig(config: Partial<AutoCompactionConfig>): void {\n\t\tthis.config = { ...this.config, ...config };\n\t}\n\n\t/**\n\t * Get current configuration.\n\t */\n\tgetConfig(): AutoCompactionConfig {\n\t\treturn { ...this.config };\n\t}\n\n\t/**\n\t * Check context usage and determine if compaction is needed.\n\t * Rate-limited to avoid excessive checks.\n\t */\n\tcheck(\n\t\tmessages: AppMessage[],\n\t\tmodel: Model<Api>,\n\t\tsystemPromptTokens = 0,\n\t): CompactionStats {\n\t\tconst now = Date.now();\n\t\tconst minInterval = 5000; // Check at most every 5 seconds\n\n\t\t// Rate limit checks\n\t\tif (this.lastStats && now - this.lastCheckTime < minInterval) {\n\t\t\treturn this.lastStats;\n\t\t}\n\n\t\tthis.lastCheckTime = now;\n\t\tthis.lastStats = shouldAutoCompact(\n\t\t\tmessages,\n\t\t\tmodel,\n\t\t\tthis.config,\n\t\t\tsystemPromptTokens,\n\t\t);\n\n\t\tif (this.lastStats.shouldCompact && this.config.onCompactionRecommended) {\n\t\t\tthis.config.onCompactionRecommended(this.lastStats);\n\t\t}\n\n\t\treturn this.lastStats;\n\t}\n\n\t/**\n\t * Record that a compaction was performed.\n\t */\n\trecordCompaction(): void {\n\t\tthis.compactionCount++;\n\t\tthis.lastStats = null; // Force recheck after compaction\n\t\tlogger.info(\"Compaction recorded\", {\n\t\t\ttotalCompactions: this.compactionCount,\n\t\t});\n\t}\n\n\t/**\n\t * Get compaction statistics.\n\t */\n\tgetStats(): { compactionCount: number; lastStats: CompactionStats | null } {\n\t\treturn {\n\t\t\tcompactionCount: this.compactionCount,\n\t\t\tlastStats: this.lastStats,\n\t\t};\n\t}\n\n\t/**\n\t * Get warning thresholds for UI display.\n\t */\n\tgetWarningThresholds(): { warning: number; critical: number } {\n\t\treturn {\n\t\t\twarning: this.config.thresholdPercent - 10, // Warning at threshold - 10%\n\t\t\tcritical: this.config.thresholdPercent,\n\t\t};\n\t}\n}\n\n/**\n * Create a default auto-compaction monitor.\n */\nexport function createAutoCompactionMonitor(\n\tconfig?: Partial<AutoCompactionConfig>,\n): AutoCompactionMonitor {\n\treturn new AutoCompactionMonitor(config);\n}\n"]}
1
+ {"version":3,"file":"auto-compaction.js","sourceRoot":"","sources":["../../src/agent/auto-compaction.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Auto-Compaction System\n *\n * Automatically triggers conversation compaction when context window usage\n * exceeds configured thresholds. Inspired by Claude Code's auto-compaction.\n *\n * Environment variables:\n * - MAESTRO_AUTOCOMPACT_PCT: Percentage threshold to trigger (default: 85)\n * - MAESTRO_AUTOCOMPACT_ENABLED: Enable/disable auto-compaction (default: true)\n * - MAESTRO_AUTOCOMPACT_MIN_MESSAGES: Minimum messages before compacting (default: 10)\n */\n\nimport type { MaestroCompactionSettings } from \"@evalops/contracts\";\nimport { createLogger } from \"../utils/logger.js\";\nimport { convertAppMessageToLlm } from \"./custom-messages.js\";\nimport type { Api, AppMessage, Model } from \"./types.js\";\n\nconst logger = createLogger(\"auto-compaction\");\n\n/**\n * Configuration for auto-compaction behavior.\n */\nexport interface AutoCompactionConfig {\n\t/** Whether auto-compaction is enabled */\n\tenabled: boolean;\n\t/** Percentage of context window to trigger compaction (0-100) */\n\tthresholdPercent: number;\n\t/** Minimum number of messages before compaction is considered */\n\tminMessages: number;\n\t/** Number of recent messages to always keep */\n\tkeepRecentCount: number;\n\t/** Callback when compaction is recommended */\n\tonCompactionRecommended?: (stats: CompactionStats) => void;\n}\n\n/**\n * Statistics about context window usage.\n */\nexport interface CompactionStats {\n\t/** Total tokens used in current context */\n\ttotalTokens: number;\n\t/** Model's context window size */\n\tcontextWindow: number;\n\t/** Percentage of context window used */\n\tusagePercent: number;\n\t/** Number of messages in conversation */\n\tmessageCount: number;\n\t/** Whether compaction is recommended */\n\tshouldCompact: boolean;\n\t/** Reason for recommendation */\n\treason?: string;\n}\n\nconst DEFAULT_CONFIG: AutoCompactionConfig = {\n\tenabled: true,\n\tthresholdPercent: 85,\n\tminMessages: 10,\n\tkeepRecentCount: 6,\n};\n\n/**\n * Parse configuration from resolved Maestro settings with env-var fallback.\n *\n * Resolution order: `compaction` settings (org -> user merged by the caller) ->\n * legacy `MAESTRO_AUTOCOMPACT_*` env vars -> built-in defaults. Env vars keep\n * working for callers that have no org/user settings.\n */\nexport function getAutoCompactionConfig(\n\tcompaction?: MaestroCompactionSettings | null,\n): AutoCompactionConfig {\n\tconst envThreshold = Number.parseInt(\n\t\tprocess.env.MAESTRO_AUTOCOMPACT_PCT || \"85\",\n\t\t10,\n\t);\n\tconst envMinMessages = Number.parseInt(\n\t\tprocess.env.MAESTRO_AUTOCOMPACT_MIN_MESSAGES || \"10\",\n\t\t10,\n\t);\n\n\tconst enabled =\n\t\tcompaction?.enabled ?? process.env.MAESTRO_AUTOCOMPACT_ENABLED !== \"false\";\n\tconst thresholdPercent =\n\t\tcompaction?.thresholdPercent ??\n\t\t(Number.isNaN(envThreshold)\n\t\t\t? DEFAULT_CONFIG.thresholdPercent\n\t\t\t: envThreshold);\n\tconst minMessages =\n\t\tcompaction?.minMessages ??\n\t\t(Number.isNaN(envMinMessages)\n\t\t\t? DEFAULT_CONFIG.minMessages\n\t\t\t: envMinMessages);\n\tconst keepRecentCount =\n\t\tcompaction?.keepRecentMessages ?? DEFAULT_CONFIG.keepRecentCount;\n\tconst hasSettingsMinMessages = compaction?.minMessages !== undefined;\n\n\treturn {\n\t\t...DEFAULT_CONFIG,\n\t\tenabled,\n\t\tthresholdPercent: Math.min(100, Math.max(50, thresholdPercent)),\n\t\tminMessages: hasSettingsMinMessages\n\t\t\t? Math.max(0, minMessages)\n\t\t\t: Math.max(5, minMessages),\n\t\tkeepRecentCount,\n\t};\n}\n\n/**\n * Estimate token count for a message.\n * Uses a simple heuristic: ~4 characters per token.\n */\nfunction estimateMessageTokens(message: AppMessage): number {\n\tlet charCount = 0;\n\tconst llmMessage = convertAppMessageToLlm(message);\n\tif (!llmMessage) {\n\t\treturn 0;\n\t}\n\n\tif (typeof llmMessage.content === \"string\") {\n\t\tcharCount = llmMessage.content.length;\n\t} else if (Array.isArray(llmMessage.content)) {\n\t\tfor (const part of llmMessage.content) {\n\t\t\tif (part.type === \"text\") {\n\t\t\t\tcharCount += part.text.length;\n\t\t\t} else if (part.type === \"thinking\") {\n\t\t\t\tcharCount += part.thinking.length;\n\t\t\t} else if (part.type === \"toolCall\") {\n\t\t\t\tcharCount += JSON.stringify(part.arguments).length + part.name.length;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Rough estimate: 4 characters per token\n\treturn Math.ceil(charCount / 4);\n}\n\n/**\n * Calculate context window usage statistics.\n */\nexport function calculateContextUsage(\n\tmessages: AppMessage[],\n\tmodel: Model<Api>,\n\tsystemPromptTokens = 0,\n): CompactionStats {\n\tlet totalTokens = systemPromptTokens;\n\n\tfor (const message of messages) {\n\t\t// Use actual usage if available (from assistant messages)\n\t\tif (message.role === \"assistant\" && message.usage) {\n\t\t\ttotalTokens += message.usage.input + message.usage.output;\n\t\t} else {\n\t\t\ttotalTokens += estimateMessageTokens(message);\n\t\t}\n\t}\n\n\tconst contextWindow = model.contextWindow || 128000;\n\tconst usagePercent = (totalTokens / contextWindow) * 100;\n\n\treturn {\n\t\ttotalTokens,\n\t\tcontextWindow,\n\t\tusagePercent,\n\t\tmessageCount: messages.length,\n\t\tshouldCompact: false,\n\t\treason: undefined,\n\t};\n}\n\n/**\n * Check if auto-compaction should be triggered.\n */\nexport function shouldAutoCompact(\n\tmessages: AppMessage[],\n\tmodel: Model<Api>,\n\tconfig: AutoCompactionConfig = getAutoCompactionConfig(),\n\tsystemPromptTokens = 0,\n): CompactionStats {\n\tif (!config.enabled) {\n\t\treturn {\n\t\t\t...calculateContextUsage(messages, model, systemPromptTokens),\n\t\t\tshouldCompact: false,\n\t\t\treason: \"Auto-compaction disabled\",\n\t\t};\n\t}\n\n\tconst stats = calculateContextUsage(messages, model, systemPromptTokens);\n\n\t// Check message count threshold\n\tif (stats.messageCount < config.minMessages) {\n\t\treturn {\n\t\t\t...stats,\n\t\t\tshouldCompact: false,\n\t\t\treason: `Not enough messages (${stats.messageCount} < ${config.minMessages})`,\n\t\t};\n\t}\n\n\t// Check context window threshold\n\tif (stats.usagePercent >= config.thresholdPercent) {\n\t\tlogger.info(\"Auto-compaction threshold reached\", {\n\t\t\tusagePercent: stats.usagePercent.toFixed(1),\n\t\t\tthreshold: config.thresholdPercent,\n\t\t\tmessageCount: stats.messageCount,\n\t\t});\n\n\t\treturn {\n\t\t\t...stats,\n\t\t\tshouldCompact: true,\n\t\t\treason: `Context usage ${stats.usagePercent.toFixed(1)}% exceeds ${config.thresholdPercent}% threshold`,\n\t\t};\n\t}\n\n\treturn {\n\t\t...stats,\n\t\tshouldCompact: false,\n\t\treason: `Context usage ${stats.usagePercent.toFixed(1)}% below ${config.thresholdPercent}% threshold`,\n\t};\n}\n\n/**\n * Auto-compaction monitor that tracks context usage over time.\n */\nexport class AutoCompactionMonitor {\n\tprivate config: AutoCompactionConfig;\n\tprivate lastCheckTime = 0;\n\tprivate lastStats: CompactionStats | null = null;\n\tprivate compactionCount = 0;\n\n\tconstructor(config?: Partial<AutoCompactionConfig>) {\n\t\tthis.config = { ...getAutoCompactionConfig(), ...config };\n\t}\n\n\t/**\n\t * Update configuration.\n\t */\n\tsetConfig(config: Partial<AutoCompactionConfig>): void {\n\t\tthis.config = { ...this.config, ...config };\n\t}\n\n\t/**\n\t * Get current configuration.\n\t */\n\tgetConfig(): AutoCompactionConfig {\n\t\treturn { ...this.config };\n\t}\n\n\t/**\n\t * Check context usage and determine if compaction is needed.\n\t * Rate-limited to avoid excessive checks.\n\t */\n\tcheck(\n\t\tmessages: AppMessage[],\n\t\tmodel: Model<Api>,\n\t\tsystemPromptTokens = 0,\n\t): CompactionStats {\n\t\tconst now = Date.now();\n\t\tconst minInterval = 5000; // Check at most every 5 seconds\n\n\t\t// Rate limit checks\n\t\tif (this.lastStats && now - this.lastCheckTime < minInterval) {\n\t\t\treturn this.lastStats;\n\t\t}\n\n\t\tthis.lastCheckTime = now;\n\t\tthis.lastStats = shouldAutoCompact(\n\t\t\tmessages,\n\t\t\tmodel,\n\t\t\tthis.config,\n\t\t\tsystemPromptTokens,\n\t\t);\n\n\t\tif (this.lastStats.shouldCompact && this.config.onCompactionRecommended) {\n\t\t\tthis.config.onCompactionRecommended(this.lastStats);\n\t\t}\n\n\t\treturn this.lastStats;\n\t}\n\n\t/**\n\t * Record that a compaction was performed.\n\t */\n\trecordCompaction(): void {\n\t\tthis.compactionCount++;\n\t\tthis.lastStats = null; // Force recheck after compaction\n\t\tlogger.info(\"Compaction recorded\", {\n\t\t\ttotalCompactions: this.compactionCount,\n\t\t});\n\t}\n\n\t/**\n\t * Get compaction statistics.\n\t */\n\tgetStats(): { compactionCount: number; lastStats: CompactionStats | null } {\n\t\treturn {\n\t\t\tcompactionCount: this.compactionCount,\n\t\t\tlastStats: this.lastStats,\n\t\t};\n\t}\n\n\t/**\n\t * Get warning thresholds for UI display.\n\t */\n\tgetWarningThresholds(): { warning: number; critical: number } {\n\t\treturn {\n\t\t\twarning: this.config.thresholdPercent - 10, // Warning at threshold - 10%\n\t\t\tcritical: this.config.thresholdPercent,\n\t\t};\n\t}\n}\n\n/**\n * Create a default auto-compaction monitor.\n */\nexport function createAutoCompactionMonitor(\n\tconfig?: Partial<AutoCompactionConfig>,\n): AutoCompactionMonitor {\n\treturn new AutoCompactionMonitor(config);\n}\n"]}
@@ -0,0 +1,62 @@
1
+ import { type MissionStoreSnapshot } from "./mission-store.js";
2
+ export declare const MISSION_ARTIFACT_VERSION = 1;
3
+ export type MissionSessionRole = "orchestrator" | "worker" | "validator";
4
+ export interface MissionArtifactLayout {
5
+ missionDir: string;
6
+ missionMarkdown: string;
7
+ architectureMarkdown: string;
8
+ validationContractMarkdown: string;
9
+ validationStateJson: string;
10
+ featuresJson: string;
11
+ agentsMarkdown: string;
12
+ servicesYaml: string;
13
+ handoffsDir: string;
14
+ libraryDir: string;
15
+ skillsDir: string;
16
+ stateJson: string;
17
+ progressLogJsonl: string;
18
+ modelSettingsJson: string;
19
+ }
20
+ export type MissionArtifactKind = "mission" | "architecture" | "validation-contract" | "validation-state" | "features" | "agents" | "services" | "state" | "progress-log" | "model-settings" | "handoff" | "library" | "skill";
21
+ export interface MissionArtifactClassification {
22
+ kind: MissionArtifactKind;
23
+ path: string;
24
+ missionDir: string;
25
+ }
26
+ export declare function getMissionArtifactLayout(missionId: string, rootDir?: string): MissionArtifactLayout;
27
+ export declare function initializeMissionArtifacts(options: {
28
+ missionId: string;
29
+ title?: string;
30
+ rootDir?: string;
31
+ now?: string;
32
+ }): MissionArtifactLayout;
33
+ export declare function classifyMissionArtifactPath(filePath: string, rootDir?: string): MissionArtifactClassification | null;
34
+ export declare function validateMissionArtifactContent(filePath: string, content: string, rootDir?: string): {
35
+ ok: true;
36
+ } | {
37
+ ok: false;
38
+ message: string;
39
+ };
40
+ export declare function validateMissionArtifactWrite(options: {
41
+ filePath: string;
42
+ content: string;
43
+ role?: MissionSessionRole;
44
+ rootDir?: string;
45
+ }): {
46
+ ok: true;
47
+ } | {
48
+ ok: false;
49
+ message: string;
50
+ };
51
+ export declare function validateMissionArtifactDelete(options: {
52
+ filePath: string;
53
+ rootDir?: string;
54
+ }): {
55
+ ok: true;
56
+ } | {
57
+ ok: false;
58
+ message: string;
59
+ };
60
+ export declare function detectMissionSessionRole(env?: NodeJS.ProcessEnv): MissionSessionRole | undefined;
61
+ export declare function summarizeMissionSnapshot(snapshot: MissionStoreSnapshot): string;
62
+ //# sourceMappingURL=mission-artifacts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mission-artifacts.d.ts","sourceRoot":"","sources":["../../src/agent/mission-artifacts.ts"],"names":[],"mappings":"AAMA,OAAO,EAEN,KAAK,oBAAoB,EAIzB,MAAM,oBAAoB,CAAC;AAE5B,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAE1C,MAAM,MAAM,kBAAkB,GAAG,cAAc,GAAG,QAAQ,GAAG,WAAW,CAAC;AAEzE,MAAM,WAAW,qBAAqB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,0BAA0B,EAAE,MAAM,CAAC;IACnC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,MAAM,mBAAmB,GAC5B,SAAS,GACT,cAAc,GACd,qBAAqB,GACrB,kBAAkB,GAClB,UAAU,GACV,QAAQ,GACR,UAAU,GACV,OAAO,GACP,cAAc,GACd,gBAAgB,GAChB,SAAS,GACT,SAAS,GACT,OAAO,CAAC;AAEX,MAAM,WAAW,6BAA6B;IAC7C,IAAI,EAAE,mBAAmB,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACnB;AAKD,wBAAgB,wBAAwB,CACvC,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,MAAM,GACd,qBAAqB,CAkBvB;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;CACb,GAAG,qBAAqB,CAuDxB;AAED,wBAAgB,2BAA2B,CAC1C,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,GACd,6BAA6B,GAAG,IAAI,CA8CtC;AAED,wBAAgB,8BAA8B,CAC7C,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,GACd;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAsD/C;AAED,wBAAgB,4BAA4B,CAAC,OAAO,EAAE;IACrD,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,kBAAkB,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAuChD;AAED,wBAAgB,6BAA6B,CAAC,OAAO,EAAE;IACtD,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAwBhD;AAED,wBAAgB,wBAAwB,CACvC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAClC,kBAAkB,GAAG,SAAS,CAQhC;AAED,wBAAgB,wBAAwB,CACvC,QAAQ,EAAE,oBAAoB,GAC5B,MAAM,CAcR"}