@aquex/cmos-mcp 1.0.0

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 (854) hide show
  1. package/CHANGELOG.md +99 -0
  2. package/LICENSE +15 -0
  3. package/README.md +250 -0
  4. package/cmos-seed/README.md +153 -0
  5. package/cmos-seed/context/master_context.json +27 -0
  6. package/cmos-seed/context/project_context.json +12 -0
  7. package/cmos-seed/db/schema.sql +334 -0
  8. package/cmos-seed/docs/README.md +128 -0
  9. package/cmos-seed/docs/agents-md-guide.md +253 -0
  10. package/cmos-seed/docs/build-session-prompt.md +137 -0
  11. package/cmos-seed/docs/getting-started.md +150 -0
  12. package/cmos-seed/docs/session-management-guide.md +163 -0
  13. package/cmos-seed/docs/sqlite-schema-reference.md +188 -0
  14. package/cmos-seed/foundational-docs/roadmap_template.md +365 -0
  15. package/cmos-seed/foundational-docs/tech_arch_template.md +331 -0
  16. package/cmos-seed/templates/PROJECT-README-template.md +110 -0
  17. package/cmos-seed/templates/agents.md +306 -0
  18. package/cmos-seed/tiers/build.md +110 -0
  19. package/cmos-seed/tiers/general.md +112 -0
  20. package/cmos-seed/tiers/managed.md +118 -0
  21. package/dist/.build-manifest.json +5 -0
  22. package/dist/auth/auth-state.d.ts +96 -0
  23. package/dist/auth/auth-state.d.ts.map +1 -0
  24. package/dist/auth/auth-state.js +115 -0
  25. package/dist/auth/auth-state.js.map +1 -0
  26. package/dist/auth/delivery-ack-cache.d.ts +27 -0
  27. package/dist/auth/delivery-ack-cache.d.ts.map +1 -0
  28. package/dist/auth/delivery-ack-cache.js +21 -0
  29. package/dist/auth/delivery-ack-cache.js.map +1 -0
  30. package/dist/auth/device-code.d.ts +136 -0
  31. package/dist/auth/device-code.d.ts.map +1 -0
  32. package/dist/auth/device-code.js +334 -0
  33. package/dist/auth/device-code.js.map +1 -0
  34. package/dist/auth/project-key-capture.d.ts +124 -0
  35. package/dist/auth/project-key-capture.d.ts.map +1 -0
  36. package/dist/auth/project-key-capture.js +218 -0
  37. package/dist/auth/project-key-capture.js.map +1 -0
  38. package/dist/combination/dependency-resolver.d.ts +69 -0
  39. package/dist/combination/dependency-resolver.d.ts.map +1 -0
  40. package/dist/combination/dependency-resolver.js +303 -0
  41. package/dist/combination/dependency-resolver.js.map +1 -0
  42. package/dist/combination/merge-strategies.d.ts +87 -0
  43. package/dist/combination/merge-strategies.d.ts.map +1 -0
  44. package/dist/combination/merge-strategies.js +210 -0
  45. package/dist/combination/merge-strategies.js.map +1 -0
  46. package/dist/combination/pack-combiner.d.ts +84 -0
  47. package/dist/combination/pack-combiner.d.ts.map +1 -0
  48. package/dist/combination/pack-combiner.js +288 -0
  49. package/dist/combination/pack-combiner.js.map +1 -0
  50. package/dist/combination/types.d.ts +112 -0
  51. package/dist/combination/types.d.ts.map +1 -0
  52. package/dist/combination/types.js +39 -0
  53. package/dist/combination/types.js.map +1 -0
  54. package/dist/domains/domain-pack-loader.d.ts +148 -0
  55. package/dist/domains/domain-pack-loader.d.ts.map +1 -0
  56. package/dist/domains/domain-pack-loader.js +501 -0
  57. package/dist/domains/domain-pack-loader.js.map +1 -0
  58. package/dist/domains/types.d.ts +64 -0
  59. package/dist/domains/types.d.ts.map +1 -0
  60. package/dist/domains/types.js +10 -0
  61. package/dist/domains/types.js.map +1 -0
  62. package/dist/errors/config-error.d.ts +13 -0
  63. package/dist/errors/config-error.d.ts.map +1 -0
  64. package/dist/errors/config-error.js +19 -0
  65. package/dist/errors/config-error.js.map +1 -0
  66. package/dist/errors/domain-error.d.ts +13 -0
  67. package/dist/errors/domain-error.d.ts.map +1 -0
  68. package/dist/errors/domain-error.js +19 -0
  69. package/dist/errors/domain-error.js.map +1 -0
  70. package/dist/errors/handler.d.ts +30 -0
  71. package/dist/errors/handler.d.ts.map +1 -0
  72. package/dist/errors/handler.js +63 -0
  73. package/dist/errors/handler.js.map +1 -0
  74. package/dist/errors/index.d.ts +9 -0
  75. package/dist/errors/index.d.ts.map +1 -0
  76. package/dist/errors/index.js +25 -0
  77. package/dist/errors/index.js.map +1 -0
  78. package/dist/errors/io-error.d.ts +13 -0
  79. package/dist/errors/io-error.d.ts.map +1 -0
  80. package/dist/errors/io-error.js +19 -0
  81. package/dist/errors/io-error.js.map +1 -0
  82. package/dist/errors/logger.d.ts +21 -0
  83. package/dist/errors/logger.d.ts.map +1 -0
  84. package/dist/errors/logger.js +88 -0
  85. package/dist/errors/logger.js.map +1 -0
  86. package/dist/errors/mission-error.d.ts +27 -0
  87. package/dist/errors/mission-error.d.ts.map +1 -0
  88. package/dist/errors/mission-error.js +76 -0
  89. package/dist/errors/mission-error.js.map +1 -0
  90. package/dist/errors/types.d.ts +52 -0
  91. package/dist/errors/types.d.ts.map +1 -0
  92. package/dist/errors/types.js +3 -0
  93. package/dist/errors/types.js.map +1 -0
  94. package/dist/errors/utils.d.ts +24 -0
  95. package/dist/errors/utils.d.ts.map +1 -0
  96. package/dist/errors/utils.js +64 -0
  97. package/dist/errors/utils.js.map +1 -0
  98. package/dist/errors/validation-error.d.ts +13 -0
  99. package/dist/errors/validation-error.d.ts.map +1 -0
  100. package/dist/errors/validation-error.js +19 -0
  101. package/dist/errors/validation-error.js.map +1 -0
  102. package/dist/extraction/template-extractor.d.ts +59 -0
  103. package/dist/extraction/template-extractor.d.ts.map +1 -0
  104. package/dist/extraction/template-extractor.js +553 -0
  105. package/dist/extraction/template-extractor.js.map +1 -0
  106. package/dist/extraction/types.d.ts +160 -0
  107. package/dist/extraction/types.d.ts.map +1 -0
  108. package/dist/extraction/types.js +7 -0
  109. package/dist/extraction/types.js.map +1 -0
  110. package/dist/http-server.d.ts +18 -0
  111. package/dist/http-server.d.ts.map +1 -0
  112. package/dist/http-server.js +326 -0
  113. package/dist/http-server.js.map +1 -0
  114. package/dist/import-export/hybrid-template-parser.d.ts +44 -0
  115. package/dist/import-export/hybrid-template-parser.d.ts.map +1 -0
  116. package/dist/import-export/hybrid-template-parser.js +373 -0
  117. package/dist/import-export/hybrid-template-parser.js.map +1 -0
  118. package/dist/import-export/security-validator.d.ts +93 -0
  119. package/dist/import-export/security-validator.d.ts.map +1 -0
  120. package/dist/import-export/security-validator.js +441 -0
  121. package/dist/import-export/security-validator.js.map +1 -0
  122. package/dist/import-export/template-exporter.d.ts +106 -0
  123. package/dist/import-export/template-exporter.d.ts.map +1 -0
  124. package/dist/import-export/template-exporter.js +247 -0
  125. package/dist/import-export/template-exporter.js.map +1 -0
  126. package/dist/import-export/template-importer.d.ts +97 -0
  127. package/dist/import-export/template-importer.d.ts.map +1 -0
  128. package/dist/import-export/template-importer.js +308 -0
  129. package/dist/import-export/template-importer.js.map +1 -0
  130. package/dist/import-export/types.d.ts +118 -0
  131. package/dist/import-export/types.d.ts.map +1 -0
  132. package/dist/import-export/types.js +41 -0
  133. package/dist/import-export/types.js.map +1 -0
  134. package/dist/index.d.ts +157 -0
  135. package/dist/index.d.ts.map +1 -0
  136. package/dist/index.js +972 -0
  137. package/dist/index.js.map +1 -0
  138. package/dist/intelligence/agentic-controller.d.ts +345 -0
  139. package/dist/intelligence/agentic-controller.d.ts.map +1 -0
  140. package/dist/intelligence/agentic-controller.js +1376 -0
  141. package/dist/intelligence/agentic-controller.js.map +1 -0
  142. package/dist/intelligence/agentic-observability.d.ts +43 -0
  143. package/dist/intelligence/agentic-observability.d.ts.map +1 -0
  144. package/dist/intelligence/agentic-observability.js +62 -0
  145. package/dist/intelligence/agentic-observability.js.map +1 -0
  146. package/dist/intelligence/agents-md-loader.d.ts +81 -0
  147. package/dist/intelligence/agents-md-loader.d.ts.map +1 -0
  148. package/dist/intelligence/agents-md-loader.js +298 -0
  149. package/dist/intelligence/agents-md-loader.js.map +1 -0
  150. package/dist/intelligence/attribution-verification.d.ts +58 -0
  151. package/dist/intelligence/attribution-verification.d.ts.map +1 -0
  152. package/dist/intelligence/attribution-verification.js +133 -0
  153. package/dist/intelligence/attribution-verification.js.map +1 -0
  154. package/dist/intelligence/boomerang-workflow.d.ts +87 -0
  155. package/dist/intelligence/boomerang-workflow.d.ts.map +1 -0
  156. package/dist/intelligence/boomerang-workflow.js +311 -0
  157. package/dist/intelligence/boomerang-workflow.js.map +1 -0
  158. package/dist/intelligence/cmos-detector.d.ts +42 -0
  159. package/dist/intelligence/cmos-detector.d.ts.map +1 -0
  160. package/dist/intelligence/cmos-detector.js +94 -0
  161. package/dist/intelligence/cmos-detector.js.map +1 -0
  162. package/dist/intelligence/cmos-sync.d.ts +101 -0
  163. package/dist/intelligence/cmos-sync.d.ts.map +1 -0
  164. package/dist/intelligence/cmos-sync.js +435 -0
  165. package/dist/intelligence/cmos-sync.js.map +1 -0
  166. package/dist/intelligence/complexity-scorer.d.ts +111 -0
  167. package/dist/intelligence/complexity-scorer.d.ts.map +1 -0
  168. package/dist/intelligence/complexity-scorer.js +299 -0
  169. package/dist/intelligence/complexity-scorer.js.map +1 -0
  170. package/dist/intelligence/compression-rules.d.ts +62 -0
  171. package/dist/intelligence/compression-rules.d.ts.map +1 -0
  172. package/dist/intelligence/compression-rules.js +303 -0
  173. package/dist/intelligence/compression-rules.js.map +1 -0
  174. package/dist/intelligence/content-sanitizer.d.ts +61 -0
  175. package/dist/intelligence/content-sanitizer.d.ts.map +1 -0
  176. package/dist/intelligence/content-sanitizer.js +170 -0
  177. package/dist/intelligence/content-sanitizer.js.map +1 -0
  178. package/dist/intelligence/context-propagator-v2.d.ts +23 -0
  179. package/dist/intelligence/context-propagator-v2.d.ts.map +1 -0
  180. package/dist/intelligence/context-propagator-v2.js +37 -0
  181. package/dist/intelligence/context-propagator-v2.js.map +1 -0
  182. package/dist/intelligence/context-propagator-v3.d.ts +46 -0
  183. package/dist/intelligence/context-propagator-v3.d.ts.map +1 -0
  184. package/dist/intelligence/context-propagator-v3.js +266 -0
  185. package/dist/intelligence/context-propagator-v3.js.map +1 -0
  186. package/dist/intelligence/context-propagator.d.ts +108 -0
  187. package/dist/intelligence/context-propagator.d.ts.map +1 -0
  188. package/dist/intelligence/context-propagator.js +283 -0
  189. package/dist/intelligence/context-propagator.js.map +1 -0
  190. package/dist/intelligence/context-windows.d.ts +5 -0
  191. package/dist/intelligence/context-windows.d.ts.map +1 -0
  192. package/dist/intelligence/context-windows.js +18 -0
  193. package/dist/intelligence/context-windows.js.map +1 -0
  194. package/dist/intelligence/credential-store.d.ts +145 -0
  195. package/dist/intelligence/credential-store.d.ts.map +1 -0
  196. package/dist/intelligence/credential-store.js +243 -0
  197. package/dist/intelligence/credential-store.js.map +1 -0
  198. package/dist/intelligence/dependency-analyzer.d.ts +117 -0
  199. package/dist/intelligence/dependency-analyzer.d.ts.map +1 -0
  200. package/dist/intelligence/dependency-analyzer.js +398 -0
  201. package/dist/intelligence/dependency-analyzer.js.map +1 -0
  202. package/dist/intelligence/dependency-inferrer.d.ts +68 -0
  203. package/dist/intelligence/dependency-inferrer.d.ts.map +1 -0
  204. package/dist/intelligence/dependency-inferrer.js +281 -0
  205. package/dist/intelligence/dependency-inferrer.js.map +1 -0
  206. package/dist/intelligence/enhanced-dependency-analyzer.d.ts +25 -0
  207. package/dist/intelligence/enhanced-dependency-analyzer.d.ts.map +1 -0
  208. package/dist/intelligence/enhanced-dependency-analyzer.js +207 -0
  209. package/dist/intelligence/enhanced-dependency-analyzer.js.map +1 -0
  210. package/dist/intelligence/graph-validator.d.ts +61 -0
  211. package/dist/intelligence/graph-validator.d.ts.map +1 -0
  212. package/dist/intelligence/graph-validator.js +212 -0
  213. package/dist/intelligence/graph-validator.js.map +1 -0
  214. package/dist/intelligence/lifecycle-analyzer.d.ts +64 -0
  215. package/dist/intelligence/lifecycle-analyzer.d.ts.map +1 -0
  216. package/dist/intelligence/lifecycle-analyzer.js +587 -0
  217. package/dist/intelligence/lifecycle-analyzer.js.map +1 -0
  218. package/dist/intelligence/mission-history.d.ts +56 -0
  219. package/dist/intelligence/mission-history.d.ts.map +1 -0
  220. package/dist/intelligence/mission-history.js +145 -0
  221. package/dist/intelligence/mission-history.js.map +1 -0
  222. package/dist/intelligence/mission-outcome-analytics.d.ts +84 -0
  223. package/dist/intelligence/mission-outcome-analytics.d.ts.map +1 -0
  224. package/dist/intelligence/mission-outcome-analytics.js +499 -0
  225. package/dist/intelligence/mission-outcome-analytics.js.map +1 -0
  226. package/dist/intelligence/mission-splitter.d.ts +148 -0
  227. package/dist/intelligence/mission-splitter.d.ts.map +1 -0
  228. package/dist/intelligence/mission-splitter.js +461 -0
  229. package/dist/intelligence/mission-splitter.js.map +1 -0
  230. package/dist/intelligence/model-transpilers.d.ts +59 -0
  231. package/dist/intelligence/model-transpilers.d.ts.map +1 -0
  232. package/dist/intelligence/model-transpilers.js +185 -0
  233. package/dist/intelligence/model-transpilers.js.map +1 -0
  234. package/dist/intelligence/project-registry.d.ts +265 -0
  235. package/dist/intelligence/project-registry.d.ts.map +1 -0
  236. package/dist/intelligence/project-registry.js +484 -0
  237. package/dist/intelligence/project-registry.js.map +1 -0
  238. package/dist/intelligence/rsip-loop.d.ts +52 -0
  239. package/dist/intelligence/rsip-loop.d.ts.map +1 -0
  240. package/dist/intelligence/rsip-loop.js +139 -0
  241. package/dist/intelligence/rsip-loop.js.map +1 -0
  242. package/dist/intelligence/sender-context.d.ts +114 -0
  243. package/dist/intelligence/sender-context.d.ts.map +1 -0
  244. package/dist/intelligence/sender-context.js +275 -0
  245. package/dist/intelligence/sender-context.js.map +1 -0
  246. package/dist/intelligence/sqlite-client.d.ts +144 -0
  247. package/dist/intelligence/sqlite-client.d.ts.map +1 -0
  248. package/dist/intelligence/sqlite-client.js +568 -0
  249. package/dist/intelligence/sqlite-client.js.map +1 -0
  250. package/dist/intelligence/telemetry.d.ts +44 -0
  251. package/dist/intelligence/telemetry.d.ts.map +1 -0
  252. package/dist/intelligence/telemetry.js +106 -0
  253. package/dist/intelligence/telemetry.js.map +1 -0
  254. package/dist/intelligence/token-counters.d.ts +69 -0
  255. package/dist/intelligence/token-counters.d.ts.map +1 -0
  256. package/dist/intelligence/token-counters.js +197 -0
  257. package/dist/intelligence/token-counters.js.map +1 -0
  258. package/dist/intelligence/token-optimizer.d.ts +52 -0
  259. package/dist/intelligence/token-optimizer.d.ts.map +1 -0
  260. package/dist/intelligence/token-optimizer.js +205 -0
  261. package/dist/intelligence/token-optimizer.js.map +1 -0
  262. package/dist/intelligence/tokenizer-bootstrap.d.ts +54 -0
  263. package/dist/intelligence/tokenizer-bootstrap.d.ts.map +1 -0
  264. package/dist/intelligence/tokenizer-bootstrap.js +238 -0
  265. package/dist/intelligence/tokenizer-bootstrap.js.map +1 -0
  266. package/dist/intelligence/types.d.ts +117 -0
  267. package/dist/intelligence/types.d.ts.map +1 -0
  268. package/dist/intelligence/types.js +8 -0
  269. package/dist/intelligence/types.js.map +1 -0
  270. package/dist/intelligence/worker-manifest-loader.d.ts +70 -0
  271. package/dist/intelligence/worker-manifest-loader.d.ts.map +1 -0
  272. package/dist/intelligence/worker-manifest-loader.js +387 -0
  273. package/dist/intelligence/worker-manifest-loader.js.map +1 -0
  274. package/dist/loaders/yaml-loader.d.ts +99 -0
  275. package/dist/loaders/yaml-loader.d.ts.map +1 -0
  276. package/dist/loaders/yaml-loader.js +236 -0
  277. package/dist/loaders/yaml-loader.js.map +1 -0
  278. package/dist/merge/deep-merge.d.ts +93 -0
  279. package/dist/merge/deep-merge.d.ts.map +1 -0
  280. package/dist/merge/deep-merge.js +168 -0
  281. package/dist/merge/deep-merge.js.map +1 -0
  282. package/dist/quality/analyzers/ai-readiness-analyzer.d.ts +35 -0
  283. package/dist/quality/analyzers/ai-readiness-analyzer.d.ts.map +1 -0
  284. package/dist/quality/analyzers/ai-readiness-analyzer.js +357 -0
  285. package/dist/quality/analyzers/ai-readiness-analyzer.js.map +1 -0
  286. package/dist/quality/analyzers/clarity-analyzer.d.ts +52 -0
  287. package/dist/quality/analyzers/clarity-analyzer.d.ts.map +1 -0
  288. package/dist/quality/analyzers/clarity-analyzer.js +405 -0
  289. package/dist/quality/analyzers/clarity-analyzer.js.map +1 -0
  290. package/dist/quality/analyzers/completeness-analyzer.d.ts +45 -0
  291. package/dist/quality/analyzers/completeness-analyzer.d.ts.map +1 -0
  292. package/dist/quality/analyzers/completeness-analyzer.js +331 -0
  293. package/dist/quality/analyzers/completeness-analyzer.js.map +1 -0
  294. package/dist/quality/improvement-engine.d.ts +37 -0
  295. package/dist/quality/improvement-engine.d.ts.map +1 -0
  296. package/dist/quality/improvement-engine.js +260 -0
  297. package/dist/quality/improvement-engine.js.map +1 -0
  298. package/dist/quality/quality-scorer.d.ts +36 -0
  299. package/dist/quality/quality-scorer.d.ts.map +1 -0
  300. package/dist/quality/quality-scorer.js +95 -0
  301. package/dist/quality/quality-scorer.js.map +1 -0
  302. package/dist/quality/types.d.ts +92 -0
  303. package/dist/quality/types.d.ts.map +1 -0
  304. package/dist/quality/types.js +33 -0
  305. package/dist/quality/types.js.map +1 -0
  306. package/dist/registry/registry-parser.d.ts +59 -0
  307. package/dist/registry/registry-parser.d.ts.map +1 -0
  308. package/dist/registry/registry-parser.js +161 -0
  309. package/dist/registry/registry-parser.js.map +1 -0
  310. package/dist/registry/semver-validator.d.ts +48 -0
  311. package/dist/registry/semver-validator.d.ts.map +1 -0
  312. package/dist/registry/semver-validator.js +115 -0
  313. package/dist/registry/semver-validator.js.map +1 -0
  314. package/dist/schemas/generic-mission.d.ts +120 -0
  315. package/dist/schemas/generic-mission.d.ts.map +1 -0
  316. package/dist/schemas/generic-mission.js +118 -0
  317. package/dist/schemas/generic-mission.js.map +1 -0
  318. package/dist/security/workspace-guard.d.ts +10 -0
  319. package/dist/security/workspace-guard.d.ts.map +1 -0
  320. package/dist/security/workspace-guard.js +116 -0
  321. package/dist/security/workspace-guard.js.map +1 -0
  322. package/dist/server-health.d.ts +73 -0
  323. package/dist/server-health.d.ts.map +1 -0
  324. package/dist/server-health.js +181 -0
  325. package/dist/server-health.js.map +1 -0
  326. package/dist/tools/analyze-dependencies.d.ts +99 -0
  327. package/dist/tools/analyze-dependencies.d.ts.map +1 -0
  328. package/dist/tools/analyze-dependencies.js +329 -0
  329. package/dist/tools/analyze-dependencies.js.map +1 -0
  330. package/dist/tools/cmos/agent-feedback.d.ts +25 -0
  331. package/dist/tools/cmos/agent-feedback.d.ts.map +1 -0
  332. package/dist/tools/cmos/agent-feedback.js +50 -0
  333. package/dist/tools/cmos/agent-feedback.js.map +1 -0
  334. package/dist/tools/cmos/blob-migrations.d.ts +77 -0
  335. package/dist/tools/cmos/blob-migrations.d.ts.map +1 -0
  336. package/dist/tools/cmos/blob-migrations.js +210 -0
  337. package/dist/tools/cmos/blob-migrations.js.map +1 -0
  338. package/dist/tools/cmos/checkpoint-backfill.d.ts +33 -0
  339. package/dist/tools/cmos/checkpoint-backfill.d.ts.map +1 -0
  340. package/dist/tools/cmos/checkpoint-backfill.js +186 -0
  341. package/dist/tools/cmos/checkpoint-backfill.js.map +1 -0
  342. package/dist/tools/cmos/client.d.ts +293 -0
  343. package/dist/tools/cmos/client.d.ts.map +1 -0
  344. package/dist/tools/cmos/client.js +669 -0
  345. package/dist/tools/cmos/client.js.map +1 -0
  346. package/dist/tools/cmos/cmos-agent-onboard.d.ts +344 -0
  347. package/dist/tools/cmos/cmos-agent-onboard.d.ts.map +1 -0
  348. package/dist/tools/cmos/cmos-agent-onboard.js +1533 -0
  349. package/dist/tools/cmos/cmos-agent-onboard.js.map +1 -0
  350. package/dist/tools/cmos/cmos-auth.d.ts +283 -0
  351. package/dist/tools/cmos/cmos-auth.d.ts.map +1 -0
  352. package/dist/tools/cmos/cmos-auth.js +687 -0
  353. package/dist/tools/cmos/cmos-auth.js.map +1 -0
  354. package/dist/tools/cmos/cmos-backlog-export.d.ts +142 -0
  355. package/dist/tools/cmos/cmos-backlog-export.d.ts.map +1 -0
  356. package/dist/tools/cmos/cmos-backlog-export.js +340 -0
  357. package/dist/tools/cmos/cmos-backlog-export.js.map +1 -0
  358. package/dist/tools/cmos/cmos-constraints.d.ts +58 -0
  359. package/dist/tools/cmos/cmos-constraints.d.ts.map +1 -0
  360. package/dist/tools/cmos/cmos-constraints.js +227 -0
  361. package/dist/tools/cmos/cmos-constraints.js.map +1 -0
  362. package/dist/tools/cmos/cmos-context-condense.d.ts +129 -0
  363. package/dist/tools/cmos/cmos-context-condense.d.ts.map +1 -0
  364. package/dist/tools/cmos/cmos-context-condense.js +649 -0
  365. package/dist/tools/cmos/cmos-context-condense.js.map +1 -0
  366. package/dist/tools/cmos/cmos-context-history.d.ts +145 -0
  367. package/dist/tools/cmos/cmos-context-history.d.ts.map +1 -0
  368. package/dist/tools/cmos/cmos-context-history.js +235 -0
  369. package/dist/tools/cmos/cmos-context-history.js.map +1 -0
  370. package/dist/tools/cmos/cmos-context-project-identity.d.ts +34 -0
  371. package/dist/tools/cmos/cmos-context-project-identity.d.ts.map +1 -0
  372. package/dist/tools/cmos/cmos-context-project-identity.js +145 -0
  373. package/dist/tools/cmos/cmos-context-project-identity.js.map +1 -0
  374. package/dist/tools/cmos/cmos-context-search.d.ts +44 -0
  375. package/dist/tools/cmos/cmos-context-search.d.ts.map +1 -0
  376. package/dist/tools/cmos/cmos-context-search.js +79 -0
  377. package/dist/tools/cmos/cmos-context-search.js.map +1 -0
  378. package/dist/tools/cmos/cmos-context-snapshot.d.ts +105 -0
  379. package/dist/tools/cmos/cmos-context-snapshot.d.ts.map +1 -0
  380. package/dist/tools/cmos/cmos-context-snapshot.js +213 -0
  381. package/dist/tools/cmos/cmos-context-snapshot.js.map +1 -0
  382. package/dist/tools/cmos/cmos-context-update.d.ts +193 -0
  383. package/dist/tools/cmos/cmos-context-update.d.ts.map +1 -0
  384. package/dist/tools/cmos/cmos-context-update.js +710 -0
  385. package/dist/tools/cmos/cmos-context-update.js.map +1 -0
  386. package/dist/tools/cmos/cmos-context-view.d.ts +159 -0
  387. package/dist/tools/cmos/cmos-context-view.d.ts.map +1 -0
  388. package/dist/tools/cmos/cmos-context-view.js +531 -0
  389. package/dist/tools/cmos/cmos-context-view.js.map +1 -0
  390. package/dist/tools/cmos/cmos-context.d.ts +325 -0
  391. package/dist/tools/cmos/cmos-context.d.ts.map +1 -0
  392. package/dist/tools/cmos/cmos-context.js +424 -0
  393. package/dist/tools/cmos/cmos-context.js.map +1 -0
  394. package/dist/tools/cmos/cmos-db-backfill.d.ts +119 -0
  395. package/dist/tools/cmos/cmos-db-backfill.d.ts.map +1 -0
  396. package/dist/tools/cmos/cmos-db-backfill.js +889 -0
  397. package/dist/tools/cmos/cmos-db-backfill.js.map +1 -0
  398. package/dist/tools/cmos/cmos-db-health.d.ts +76 -0
  399. package/dist/tools/cmos/cmos-db-health.d.ts.map +1 -0
  400. package/dist/tools/cmos/cmos-db-health.js +226 -0
  401. package/dist/tools/cmos/cmos-db-health.js.map +1 -0
  402. package/dist/tools/cmos/cmos-db-restore.d.ts +92 -0
  403. package/dist/tools/cmos/cmos-db-restore.d.ts.map +1 -0
  404. package/dist/tools/cmos/cmos-db-restore.js +359 -0
  405. package/dist/tools/cmos/cmos-db-restore.js.map +1 -0
  406. package/dist/tools/cmos/cmos-db-snapshot.d.ts +108 -0
  407. package/dist/tools/cmos/cmos-db-snapshot.d.ts.map +1 -0
  408. package/dist/tools/cmos/cmos-db-snapshot.js +359 -0
  409. package/dist/tools/cmos/cmos-db-snapshot.js.map +1 -0
  410. package/dist/tools/cmos/cmos-db.d.ts +103 -0
  411. package/dist/tools/cmos/cmos-db.d.ts.map +1 -0
  412. package/dist/tools/cmos/cmos-db.js +182 -0
  413. package/dist/tools/cmos/cmos-db.js.map +1 -0
  414. package/dist/tools/cmos/cmos-decisions-batch-update.d.ts +34 -0
  415. package/dist/tools/cmos/cmos-decisions-batch-update.d.ts.map +1 -0
  416. package/dist/tools/cmos/cmos-decisions-batch-update.js +90 -0
  417. package/dist/tools/cmos/cmos-decisions-batch-update.js.map +1 -0
  418. package/dist/tools/cmos/cmos-decisions-list.d.ts +134 -0
  419. package/dist/tools/cmos/cmos-decisions-list.d.ts.map +1 -0
  420. package/dist/tools/cmos/cmos-decisions-list.js +153 -0
  421. package/dist/tools/cmos/cmos-decisions-list.js.map +1 -0
  422. package/dist/tools/cmos/cmos-decisions-review.d.ts +21 -0
  423. package/dist/tools/cmos/cmos-decisions-review.d.ts.map +1 -0
  424. package/dist/tools/cmos/cmos-decisions-review.js +83 -0
  425. package/dist/tools/cmos/cmos-decisions-review.js.map +1 -0
  426. package/dist/tools/cmos/cmos-decisions-search.d.ts +119 -0
  427. package/dist/tools/cmos/cmos-decisions-search.d.ts.map +1 -0
  428. package/dist/tools/cmos/cmos-decisions-search.js +219 -0
  429. package/dist/tools/cmos/cmos-decisions-search.js.map +1 -0
  430. package/dist/tools/cmos/cmos-decisions-update.d.ts +34 -0
  431. package/dist/tools/cmos/cmos-decisions-update.d.ts.map +1 -0
  432. package/dist/tools/cmos/cmos-decisions-update.js +121 -0
  433. package/dist/tools/cmos/cmos-decisions-update.js.map +1 -0
  434. package/dist/tools/cmos/cmos-decisions.d.ts +156 -0
  435. package/dist/tools/cmos/cmos-decisions.d.ts.map +1 -0
  436. package/dist/tools/cmos/cmos-decisions.js +223 -0
  437. package/dist/tools/cmos/cmos-decisions.js.map +1 -0
  438. package/dist/tools/cmos/cmos-feedback.d.ts +127 -0
  439. package/dist/tools/cmos/cmos-feedback.d.ts.map +1 -0
  440. package/dist/tools/cmos/cmos-feedback.js +259 -0
  441. package/dist/tools/cmos/cmos-feedback.js.map +1 -0
  442. package/dist/tools/cmos/cmos-learnings-list.d.ts +81 -0
  443. package/dist/tools/cmos/cmos-learnings-list.d.ts.map +1 -0
  444. package/dist/tools/cmos/cmos-learnings-list.js +120 -0
  445. package/dist/tools/cmos/cmos-learnings-list.js.map +1 -0
  446. package/dist/tools/cmos/cmos-learnings-reaffirm.d.ts +27 -0
  447. package/dist/tools/cmos/cmos-learnings-reaffirm.d.ts.map +1 -0
  448. package/dist/tools/cmos/cmos-learnings-reaffirm.js +69 -0
  449. package/dist/tools/cmos/cmos-learnings-reaffirm.js.map +1 -0
  450. package/dist/tools/cmos/cmos-learnings-search.d.ts +69 -0
  451. package/dist/tools/cmos/cmos-learnings-search.d.ts.map +1 -0
  452. package/dist/tools/cmos/cmos-learnings-search.js +130 -0
  453. package/dist/tools/cmos/cmos-learnings-search.js.map +1 -0
  454. package/dist/tools/cmos/cmos-learnings-update.d.ts +52 -0
  455. package/dist/tools/cmos/cmos-learnings-update.d.ts.map +1 -0
  456. package/dist/tools/cmos/cmos-learnings-update.js +122 -0
  457. package/dist/tools/cmos/cmos-learnings-update.js.map +1 -0
  458. package/dist/tools/cmos/cmos-learnings.d.ts +137 -0
  459. package/dist/tools/cmos/cmos-learnings.d.ts.map +1 -0
  460. package/dist/tools/cmos/cmos-learnings.js +197 -0
  461. package/dist/tools/cmos/cmos-learnings.js.map +1 -0
  462. package/dist/tools/cmos/cmos-message.d.ts +257 -0
  463. package/dist/tools/cmos/cmos-message.d.ts.map +1 -0
  464. package/dist/tools/cmos/cmos-message.js +729 -0
  465. package/dist/tools/cmos/cmos-message.js.map +1 -0
  466. package/dist/tools/cmos/cmos-mission-add.d.ts +186 -0
  467. package/dist/tools/cmos/cmos-mission-add.d.ts.map +1 -0
  468. package/dist/tools/cmos/cmos-mission-add.js +328 -0
  469. package/dist/tools/cmos/cmos-mission-add.js.map +1 -0
  470. package/dist/tools/cmos/cmos-mission-block.d.ts +104 -0
  471. package/dist/tools/cmos/cmos-mission-block.d.ts.map +1 -0
  472. package/dist/tools/cmos/cmos-mission-block.js +248 -0
  473. package/dist/tools/cmos/cmos-mission-block.js.map +1 -0
  474. package/dist/tools/cmos/cmos-mission-complete.d.ts +127 -0
  475. package/dist/tools/cmos/cmos-mission-complete.d.ts.map +1 -0
  476. package/dist/tools/cmos/cmos-mission-complete.js +529 -0
  477. package/dist/tools/cmos/cmos-mission-complete.js.map +1 -0
  478. package/dist/tools/cmos/cmos-mission-defer.d.ts +41 -0
  479. package/dist/tools/cmos/cmos-mission-defer.d.ts.map +1 -0
  480. package/dist/tools/cmos/cmos-mission-defer.js +169 -0
  481. package/dist/tools/cmos/cmos-mission-defer.js.map +1 -0
  482. package/dist/tools/cmos/cmos-mission-depends.d.ts +98 -0
  483. package/dist/tools/cmos/cmos-mission-depends.d.ts.map +1 -0
  484. package/dist/tools/cmos/cmos-mission-depends.js +221 -0
  485. package/dist/tools/cmos/cmos-mission-depends.js.map +1 -0
  486. package/dist/tools/cmos/cmos-mission-drop.d.ts +36 -0
  487. package/dist/tools/cmos/cmos-mission-drop.d.ts.map +1 -0
  488. package/dist/tools/cmos/cmos-mission-drop.js +139 -0
  489. package/dist/tools/cmos/cmos-mission-drop.js.map +1 -0
  490. package/dist/tools/cmos/cmos-mission-list.d.ts +127 -0
  491. package/dist/tools/cmos/cmos-mission-list.d.ts.map +1 -0
  492. package/dist/tools/cmos/cmos-mission-list.js +277 -0
  493. package/dist/tools/cmos/cmos-mission-list.js.map +1 -0
  494. package/dist/tools/cmos/cmos-mission-show.d.ts +115 -0
  495. package/dist/tools/cmos/cmos-mission-show.d.ts.map +1 -0
  496. package/dist/tools/cmos/cmos-mission-show.js +278 -0
  497. package/dist/tools/cmos/cmos-mission-show.js.map +1 -0
  498. package/dist/tools/cmos/cmos-mission-start.d.ts +94 -0
  499. package/dist/tools/cmos/cmos-mission-start.d.ts.map +1 -0
  500. package/dist/tools/cmos/cmos-mission-start.js +347 -0
  501. package/dist/tools/cmos/cmos-mission-start.js.map +1 -0
  502. package/dist/tools/cmos/cmos-mission-status.d.ts +152 -0
  503. package/dist/tools/cmos/cmos-mission-status.d.ts.map +1 -0
  504. package/dist/tools/cmos/cmos-mission-status.js +420 -0
  505. package/dist/tools/cmos/cmos-mission-status.js.map +1 -0
  506. package/dist/tools/cmos/cmos-mission-transition.d.ts +126 -0
  507. package/dist/tools/cmos/cmos-mission-transition.d.ts.map +1 -0
  508. package/dist/tools/cmos/cmos-mission-transition.js +222 -0
  509. package/dist/tools/cmos/cmos-mission-transition.js.map +1 -0
  510. package/dist/tools/cmos/cmos-mission-unblock.d.ts +102 -0
  511. package/dist/tools/cmos/cmos-mission-unblock.d.ts.map +1 -0
  512. package/dist/tools/cmos/cmos-mission-unblock.js +242 -0
  513. package/dist/tools/cmos/cmos-mission-unblock.js.map +1 -0
  514. package/dist/tools/cmos/cmos-mission-undepends.d.ts +39 -0
  515. package/dist/tools/cmos/cmos-mission-undepends.d.ts.map +1 -0
  516. package/dist/tools/cmos/cmos-mission-undepends.js +94 -0
  517. package/dist/tools/cmos/cmos-mission-undepends.js.map +1 -0
  518. package/dist/tools/cmos/cmos-mission-update.d.ts +225 -0
  519. package/dist/tools/cmos/cmos-mission-update.d.ts.map +1 -0
  520. package/dist/tools/cmos/cmos-mission-update.js +350 -0
  521. package/dist/tools/cmos/cmos-mission-update.js.map +1 -0
  522. package/dist/tools/cmos/cmos-mission.d.ts +300 -0
  523. package/dist/tools/cmos/cmos-mission.d.ts.map +1 -0
  524. package/dist/tools/cmos/cmos-mission.js +318 -0
  525. package/dist/tools/cmos/cmos-mission.js.map +1 -0
  526. package/dist/tools/cmos/cmos-next-steps.d.ts +57 -0
  527. package/dist/tools/cmos/cmos-next-steps.d.ts.map +1 -0
  528. package/dist/tools/cmos/cmos-next-steps.js +154 -0
  529. package/dist/tools/cmos/cmos-next-steps.js.map +1 -0
  530. package/dist/tools/cmos/cmos-project-init.d.ts +283 -0
  531. package/dist/tools/cmos/cmos-project-init.d.ts.map +1 -0
  532. package/dist/tools/cmos/cmos-project-init.js +502 -0
  533. package/dist/tools/cmos/cmos-project-init.js.map +1 -0
  534. package/dist/tools/cmos/cmos-project-list.d.ts +79 -0
  535. package/dist/tools/cmos/cmos-project-list.d.ts.map +1 -0
  536. package/dist/tools/cmos/cmos-project-list.js +150 -0
  537. package/dist/tools/cmos/cmos-project-list.js.map +1 -0
  538. package/dist/tools/cmos/cmos-project-register.d.ts +90 -0
  539. package/dist/tools/cmos/cmos-project-register.d.ts.map +1 -0
  540. package/dist/tools/cmos/cmos-project-register.js +199 -0
  541. package/dist/tools/cmos/cmos-project-register.js.map +1 -0
  542. package/dist/tools/cmos/cmos-project-sweep.d.ts +34 -0
  543. package/dist/tools/cmos/cmos-project-sweep.d.ts.map +1 -0
  544. package/dist/tools/cmos/cmos-project-sweep.js +210 -0
  545. package/dist/tools/cmos/cmos-project-sweep.js.map +1 -0
  546. package/dist/tools/cmos/cmos-project-unregister.d.ts +66 -0
  547. package/dist/tools/cmos/cmos-project-unregister.d.ts.map +1 -0
  548. package/dist/tools/cmos/cmos-project-unregister.js +108 -0
  549. package/dist/tools/cmos/cmos-project-unregister.js.map +1 -0
  550. package/dist/tools/cmos/cmos-project-update.d.ts +21 -0
  551. package/dist/tools/cmos/cmos-project-update.d.ts.map +1 -0
  552. package/dist/tools/cmos/cmos-project-update.js +46 -0
  553. package/dist/tools/cmos/cmos-project-update.js.map +1 -0
  554. package/dist/tools/cmos/cmos-project-validate.d.ts +89 -0
  555. package/dist/tools/cmos/cmos-project-validate.d.ts.map +1 -0
  556. package/dist/tools/cmos/cmos-project-validate.js +155 -0
  557. package/dist/tools/cmos/cmos-project-validate.js.map +1 -0
  558. package/dist/tools/cmos/cmos-project.d.ts +225 -0
  559. package/dist/tools/cmos/cmos-project.d.ts.map +1 -0
  560. package/dist/tools/cmos/cmos-project.js +255 -0
  561. package/dist/tools/cmos/cmos-project.js.map +1 -0
  562. package/dist/tools/cmos/cmos-resolve-references.d.ts +145 -0
  563. package/dist/tools/cmos/cmos-resolve-references.d.ts.map +1 -0
  564. package/dist/tools/cmos/cmos-resolve-references.js +273 -0
  565. package/dist/tools/cmos/cmos-resolve-references.js.map +1 -0
  566. package/dist/tools/cmos/cmos-session-capture.d.ts +228 -0
  567. package/dist/tools/cmos/cmos-session-capture.d.ts.map +1 -0
  568. package/dist/tools/cmos/cmos-session-capture.js +552 -0
  569. package/dist/tools/cmos/cmos-session-capture.js.map +1 -0
  570. package/dist/tools/cmos/cmos-session-complete.d.ts +201 -0
  571. package/dist/tools/cmos/cmos-session-complete.d.ts.map +1 -0
  572. package/dist/tools/cmos/cmos-session-complete.js +816 -0
  573. package/dist/tools/cmos/cmos-session-complete.js.map +1 -0
  574. package/dist/tools/cmos/cmos-session-list.d.ts +150 -0
  575. package/dist/tools/cmos/cmos-session-list.d.ts.map +1 -0
  576. package/dist/tools/cmos/cmos-session-list.js +234 -0
  577. package/dist/tools/cmos/cmos-session-list.js.map +1 -0
  578. package/dist/tools/cmos/cmos-session-search.d.ts +176 -0
  579. package/dist/tools/cmos/cmos-session-search.d.ts.map +1 -0
  580. package/dist/tools/cmos/cmos-session-search.js +374 -0
  581. package/dist/tools/cmos/cmos-session-search.js.map +1 -0
  582. package/dist/tools/cmos/cmos-session-start.d.ts +136 -0
  583. package/dist/tools/cmos/cmos-session-start.d.ts.map +1 -0
  584. package/dist/tools/cmos/cmos-session-start.js +305 -0
  585. package/dist/tools/cmos/cmos-session-start.js.map +1 -0
  586. package/dist/tools/cmos/cmos-session.d.ts +223 -0
  587. package/dist/tools/cmos/cmos-session.d.ts.map +1 -0
  588. package/dist/tools/cmos/cmos-session.js +255 -0
  589. package/dist/tools/cmos/cmos-session.js.map +1 -0
  590. package/dist/tools/cmos/cmos-sprint-add.d.ts +114 -0
  591. package/dist/tools/cmos/cmos-sprint-add.d.ts.map +1 -0
  592. package/dist/tools/cmos/cmos-sprint-add.js +164 -0
  593. package/dist/tools/cmos/cmos-sprint-add.js.map +1 -0
  594. package/dist/tools/cmos/cmos-sprint-analytics.d.ts +66 -0
  595. package/dist/tools/cmos/cmos-sprint-analytics.d.ts.map +1 -0
  596. package/dist/tools/cmos/cmos-sprint-analytics.js +289 -0
  597. package/dist/tools/cmos/cmos-sprint-analytics.js.map +1 -0
  598. package/dist/tools/cmos/cmos-sprint-carry-forward.d.ts +55 -0
  599. package/dist/tools/cmos/cmos-sprint-carry-forward.d.ts.map +1 -0
  600. package/dist/tools/cmos/cmos-sprint-carry-forward.js +271 -0
  601. package/dist/tools/cmos/cmos-sprint-carry-forward.js.map +1 -0
  602. package/dist/tools/cmos/cmos-sprint-complete.d.ts +155 -0
  603. package/dist/tools/cmos/cmos-sprint-complete.d.ts.map +1 -0
  604. package/dist/tools/cmos/cmos-sprint-complete.js +768 -0
  605. package/dist/tools/cmos/cmos-sprint-complete.js.map +1 -0
  606. package/dist/tools/cmos/cmos-sprint-list.d.ts +115 -0
  607. package/dist/tools/cmos/cmos-sprint-list.d.ts.map +1 -0
  608. package/dist/tools/cmos/cmos-sprint-list.js +225 -0
  609. package/dist/tools/cmos/cmos-sprint-list.js.map +1 -0
  610. package/dist/tools/cmos/cmos-sprint-retro.d.ts +114 -0
  611. package/dist/tools/cmos/cmos-sprint-retro.d.ts.map +1 -0
  612. package/dist/tools/cmos/cmos-sprint-retro.js +331 -0
  613. package/dist/tools/cmos/cmos-sprint-retro.js.map +1 -0
  614. package/dist/tools/cmos/cmos-sprint-show.d.ts +109 -0
  615. package/dist/tools/cmos/cmos-sprint-show.d.ts.map +1 -0
  616. package/dist/tools/cmos/cmos-sprint-show.js +238 -0
  617. package/dist/tools/cmos/cmos-sprint-show.js.map +1 -0
  618. package/dist/tools/cmos/cmos-sprint-update.d.ts +150 -0
  619. package/dist/tools/cmos/cmos-sprint-update.d.ts.map +1 -0
  620. package/dist/tools/cmos/cmos-sprint-update.js +191 -0
  621. package/dist/tools/cmos/cmos-sprint-update.js.map +1 -0
  622. package/dist/tools/cmos/cmos-sprint.d.ts +219 -0
  623. package/dist/tools/cmos/cmos-sprint.d.ts.map +1 -0
  624. package/dist/tools/cmos/cmos-sprint.js +304 -0
  625. package/dist/tools/cmos/cmos-sprint.js.map +1 -0
  626. package/dist/tools/cmos/cmos-status.d.ts +69 -0
  627. package/dist/tools/cmos/cmos-status.d.ts.map +1 -0
  628. package/dist/tools/cmos/cmos-status.js +136 -0
  629. package/dist/tools/cmos/cmos-status.js.map +1 -0
  630. package/dist/tools/cmos/context-freshness.d.ts +67 -0
  631. package/dist/tools/cmos/context-freshness.d.ts.map +1 -0
  632. package/dist/tools/cmos/context-freshness.js +352 -0
  633. package/dist/tools/cmos/context-freshness.js.map +1 -0
  634. package/dist/tools/cmos/context-retention.d.ts +58 -0
  635. package/dist/tools/cmos/context-retention.d.ts.map +1 -0
  636. package/dist/tools/cmos/context-retention.js +507 -0
  637. package/dist/tools/cmos/context-retention.js.map +1 -0
  638. package/dist/tools/cmos/dashboard-client.d.ts +513 -0
  639. package/dist/tools/cmos/dashboard-client.d.ts.map +1 -0
  640. package/dist/tools/cmos/dashboard-client.js +800 -0
  641. package/dist/tools/cmos/dashboard-client.js.map +1 -0
  642. package/dist/tools/cmos/decision-memory.d.ts +39 -0
  643. package/dist/tools/cmos/decision-memory.d.ts.map +1 -0
  644. package/dist/tools/cmos/decision-memory.js +263 -0
  645. package/dist/tools/cmos/decision-memory.js.map +1 -0
  646. package/dist/tools/cmos/errors.d.ts +113 -0
  647. package/dist/tools/cmos/errors.d.ts.map +1 -0
  648. package/dist/tools/cmos/errors.js +315 -0
  649. package/dist/tools/cmos/errors.js.map +1 -0
  650. package/dist/tools/cmos/fts5-retriever.d.ts +101 -0
  651. package/dist/tools/cmos/fts5-retriever.d.ts.map +1 -0
  652. package/dist/tools/cmos/fts5-retriever.js +210 -0
  653. package/dist/tools/cmos/fts5-retriever.js.map +1 -0
  654. package/dist/tools/cmos/index.d.ts +1238 -0
  655. package/dist/tools/cmos/index.d.ts.map +1 -0
  656. package/dist/tools/cmos/index.js +359 -0
  657. package/dist/tools/cmos/index.js.map +1 -0
  658. package/dist/tools/cmos/learning-reaffirm.d.ts +74 -0
  659. package/dist/tools/cmos/learning-reaffirm.d.ts.map +1 -0
  660. package/dist/tools/cmos/learning-reaffirm.js +145 -0
  661. package/dist/tools/cmos/learning-reaffirm.js.map +1 -0
  662. package/dist/tools/cmos/orphan-detection.d.ts +55 -0
  663. package/dist/tools/cmos/orphan-detection.d.ts.map +1 -0
  664. package/dist/tools/cmos/orphan-detection.js +139 -0
  665. package/dist/tools/cmos/orphan-detection.js.map +1 -0
  666. package/dist/tools/cmos/owner-resolution.d.ts +21 -0
  667. package/dist/tools/cmos/owner-resolution.d.ts.map +1 -0
  668. package/dist/tools/cmos/owner-resolution.js +162 -0
  669. package/dist/tools/cmos/owner-resolution.js.map +1 -0
  670. package/dist/tools/cmos/project-identity.d.ts +112 -0
  671. package/dist/tools/cmos/project-identity.d.ts.map +1 -0
  672. package/dist/tools/cmos/project-identity.js +261 -0
  673. package/dist/tools/cmos/project-identity.js.map +1 -0
  674. package/dist/tools/cmos/relevance-surfacing.d.ts +40 -0
  675. package/dist/tools/cmos/relevance-surfacing.d.ts.map +1 -0
  676. package/dist/tools/cmos/relevance-surfacing.js +153 -0
  677. package/dist/tools/cmos/relevance-surfacing.js.map +1 -0
  678. package/dist/tools/cmos/schema-migrations.d.ts +157 -0
  679. package/dist/tools/cmos/schema-migrations.d.ts.map +1 -0
  680. package/dist/tools/cmos/schema-migrations.js +678 -0
  681. package/dist/tools/cmos/schema-migrations.js.map +1 -0
  682. package/dist/tools/cmos/schema.d.ts +76 -0
  683. package/dist/tools/cmos/schema.d.ts.map +1 -0
  684. package/dist/tools/cmos/schema.js +462 -0
  685. package/dist/tools/cmos/schema.js.map +1 -0
  686. package/dist/tools/cmos/sender-identity.d.ts +87 -0
  687. package/dist/tools/cmos/sender-identity.d.ts.map +1 -0
  688. package/dist/tools/cmos/sender-identity.js +207 -0
  689. package/dist/tools/cmos/sender-identity.js.map +1 -0
  690. package/dist/tools/cmos/staleness-detection.d.ts +128 -0
  691. package/dist/tools/cmos/staleness-detection.d.ts.map +1 -0
  692. package/dist/tools/cmos/staleness-detection.js +381 -0
  693. package/dist/tools/cmos/staleness-detection.js.map +1 -0
  694. package/dist/tools/cmos/supersession-detection.d.ts +46 -0
  695. package/dist/tools/cmos/supersession-detection.d.ts.map +1 -0
  696. package/dist/tools/cmos/supersession-detection.js +235 -0
  697. package/dist/tools/cmos/supersession-detection.js.map +1 -0
  698. package/dist/tools/cmos/sync-event-payloads.d.ts +576 -0
  699. package/dist/tools/cmos/sync-event-payloads.d.ts.map +1 -0
  700. package/dist/tools/cmos/sync-event-payloads.js +521 -0
  701. package/dist/tools/cmos/sync-event-payloads.js.map +1 -0
  702. package/dist/tools/cmos/sync-health-check.d.ts +43 -0
  703. package/dist/tools/cmos/sync-health-check.d.ts.map +1 -0
  704. package/dist/tools/cmos/sync-health-check.js +93 -0
  705. package/dist/tools/cmos/sync-health-check.js.map +1 -0
  706. package/dist/tools/cmos/sync-hooks.d.ts +82 -0
  707. package/dist/tools/cmos/sync-hooks.d.ts.map +1 -0
  708. package/dist/tools/cmos/sync-hooks.js +162 -0
  709. package/dist/tools/cmos/sync-hooks.js.map +1 -0
  710. package/dist/tools/cmos/sync-pusher.d.ts +128 -0
  711. package/dist/tools/cmos/sync-pusher.d.ts.map +1 -0
  712. package/dist/tools/cmos/sync-pusher.js +248 -0
  713. package/dist/tools/cmos/sync-pusher.js.map +1 -0
  714. package/dist/tools/cmos/sync-queue.d.ts +87 -0
  715. package/dist/tools/cmos/sync-queue.d.ts.map +1 -0
  716. package/dist/tools/cmos/sync-queue.js +208 -0
  717. package/dist/tools/cmos/sync-queue.js.map +1 -0
  718. package/dist/tools/cmos/tier-config.d.ts +32 -0
  719. package/dist/tools/cmos/tier-config.d.ts.map +1 -0
  720. package/dist/tools/cmos/tier-config.js +123 -0
  721. package/dist/tools/cmos/tier-config.js.map +1 -0
  722. package/dist/tools/cmos/types.d.ts +164 -0
  723. package/dist/tools/cmos/types.d.ts.map +1 -0
  724. package/dist/tools/cmos/types.js +11 -0
  725. package/dist/tools/cmos/types.js.map +1 -0
  726. package/dist/tools/combine-packs.d.ts +194 -0
  727. package/dist/tools/combine-packs.d.ts.map +1 -0
  728. package/dist/tools/combine-packs.js +283 -0
  729. package/dist/tools/combine-packs.js.map +1 -0
  730. package/dist/tools/create-mission.d.ts +192 -0
  731. package/dist/tools/create-mission.d.ts.map +1 -0
  732. package/dist/tools/create-mission.js +453 -0
  733. package/dist/tools/create-mission.js.map +1 -0
  734. package/dist/tools/export-template.d.ts +175 -0
  735. package/dist/tools/export-template.d.ts.map +1 -0
  736. package/dist/tools/export-template.js +212 -0
  737. package/dist/tools/export-template.js.map +1 -0
  738. package/dist/tools/extract-template.d.ts +106 -0
  739. package/dist/tools/extract-template.d.ts.map +1 -0
  740. package/dist/tools/extract-template.js +322 -0
  741. package/dist/tools/extract-template.js.map +1 -0
  742. package/dist/tools/formatters/mission-protocol-json.d.ts +122 -0
  743. package/dist/tools/formatters/mission-protocol-json.d.ts.map +1 -0
  744. package/dist/tools/formatters/mission-protocol-json.js +155 -0
  745. package/dist/tools/formatters/mission-protocol-json.js.map +1 -0
  746. package/dist/tools/import-template.d.ts +170 -0
  747. package/dist/tools/import-template.d.ts.map +1 -0
  748. package/dist/tools/import-template.js +203 -0
  749. package/dist/tools/import-template.js.map +1 -0
  750. package/dist/tools/list-domains.d.ts +70 -0
  751. package/dist/tools/list-domains.d.ts.map +1 -0
  752. package/dist/tools/list-domains.js +110 -0
  753. package/dist/tools/list-domains.js.map +1 -0
  754. package/dist/tools/optimize-tokens.d.ts +190 -0
  755. package/dist/tools/optimize-tokens.d.ts.map +1 -0
  756. package/dist/tools/optimize-tokens.js +193 -0
  757. package/dist/tools/optimize-tokens.js.map +1 -0
  758. package/dist/tools/score-quality.d.ts +76 -0
  759. package/dist/tools/score-quality.d.ts.map +1 -0
  760. package/dist/tools/score-quality.js +191 -0
  761. package/dist/tools/score-quality.js.map +1 -0
  762. package/dist/tools/split-mission.d.ts +181 -0
  763. package/dist/tools/split-mission.d.ts.map +1 -0
  764. package/dist/tools/split-mission.js +416 -0
  765. package/dist/tools/split-mission.js.map +1 -0
  766. package/dist/tools/suggest-splits.d.ts +162 -0
  767. package/dist/tools/suggest-splits.d.ts.map +1 -0
  768. package/dist/tools/suggest-splits.js +344 -0
  769. package/dist/tools/suggest-splits.js.map +1 -0
  770. package/dist/tools/tool-execution.d.ts +4 -0
  771. package/dist/tools/tool-execution.d.ts.map +1 -0
  772. package/dist/tools/tool-execution.js +3 -0
  773. package/dist/tools/tool-execution.js.map +1 -0
  774. package/dist/tools/version-template.d.ts +515 -0
  775. package/dist/tools/version-template.d.ts.map +1 -0
  776. package/dist/tools/version-template.js +338 -0
  777. package/dist/tools/version-template.js.map +1 -0
  778. package/dist/types/errors.d.ts +19 -0
  779. package/dist/types/errors.d.ts.map +1 -0
  780. package/dist/types/errors.js +52 -0
  781. package/dist/types/errors.js.map +1 -0
  782. package/dist/types/mission-types.d.ts +8 -0
  783. package/dist/types/mission-types.d.ts.map +1 -0
  784. package/dist/types/mission-types.js +12 -0
  785. package/dist/types/mission-types.js.map +1 -0
  786. package/dist/types/registry.d.ts +55 -0
  787. package/dist/types/registry.d.ts.map +1 -0
  788. package/dist/types/registry.js +10 -0
  789. package/dist/types/registry.js.map +1 -0
  790. package/dist/types/schemas.d.ts +25 -0
  791. package/dist/types/schemas.d.ts.map +1 -0
  792. package/dist/types/schemas.js +6 -0
  793. package/dist/types/schemas.js.map +1 -0
  794. package/dist/types/tools.d.ts +22 -0
  795. package/dist/types/tools.d.ts.map +1 -0
  796. package/dist/types/tools.js +10 -0
  797. package/dist/types/tools.js.map +1 -0
  798. package/dist/utils/abort.d.ts +16 -0
  799. package/dist/utils/abort.d.ts.map +1 -0
  800. package/dist/utils/abort.js +89 -0
  801. package/dist/utils/abort.js.map +1 -0
  802. package/dist/utils/fs.d.ts +14 -0
  803. package/dist/utils/fs.d.ts.map +1 -0
  804. package/dist/utils/fs.js +114 -0
  805. package/dist/utils/fs.js.map +1 -0
  806. package/dist/utils/workspace-io.d.ts +18 -0
  807. package/dist/utils/workspace-io.d.ts.map +1 -0
  808. package/dist/utils/workspace-io.js +40 -0
  809. package/dist/utils/workspace-io.js.map +1 -0
  810. package/dist/validation/common.d.ts +21 -0
  811. package/dist/validation/common.d.ts.map +1 -0
  812. package/dist/validation/common.js +241 -0
  813. package/dist/validation/common.js.map +1 -0
  814. package/dist/validation/errors.d.ts +21 -0
  815. package/dist/validation/errors.d.ts.map +1 -0
  816. package/dist/validation/errors.js +122 -0
  817. package/dist/validation/errors.js.map +1 -0
  818. package/dist/validation/middleware.d.ts +6 -0
  819. package/dist/validation/middleware.d.ts.map +1 -0
  820. package/dist/validation/middleware.js +26 -0
  821. package/dist/validation/middleware.js.map +1 -0
  822. package/dist/validation/schemas/config-schema.d.ts +25 -0
  823. package/dist/validation/schemas/config-schema.d.ts.map +1 -0
  824. package/dist/validation/schemas/config-schema.js +22 -0
  825. package/dist/validation/schemas/config-schema.js.map +1 -0
  826. package/dist/validation/schemas/domain-schema.d.ts +129 -0
  827. package/dist/validation/schemas/domain-schema.d.ts.map +1 -0
  828. package/dist/validation/schemas/domain-schema.js +28 -0
  829. package/dist/validation/schemas/domain-schema.js.map +1 -0
  830. package/dist/validation/schemas/file-path-schema.d.ts +10 -0
  831. package/dist/validation/schemas/file-path-schema.d.ts.map +1 -0
  832. package/dist/validation/schemas/file-path-schema.js +29 -0
  833. package/dist/validation/schemas/file-path-schema.js.map +1 -0
  834. package/dist/validation/schemas/mission-schema.d.ts +65 -0
  835. package/dist/validation/schemas/mission-schema.d.ts.map +1 -0
  836. package/dist/validation/schemas/mission-schema.js +24 -0
  837. package/dist/validation/schemas/mission-schema.js.map +1 -0
  838. package/dist/validation/schemas/template-schema.d.ts +364 -0
  839. package/dist/validation/schemas/template-schema.d.ts.map +1 -0
  840. package/dist/validation/schemas/template-schema.js +64 -0
  841. package/dist/validation/schemas/template-schema.js.map +1 -0
  842. package/dist/versioning/migration-engine.d.ts +82 -0
  843. package/dist/versioning/migration-engine.d.ts.map +1 -0
  844. package/dist/versioning/migration-engine.js +352 -0
  845. package/dist/versioning/migration-engine.js.map +1 -0
  846. package/dist/versioning/types.d.ts +236 -0
  847. package/dist/versioning/types.d.ts.map +1 -0
  848. package/dist/versioning/types.js +57 -0
  849. package/dist/versioning/types.js.map +1 -0
  850. package/dist/versioning/version-manager.d.ts +76 -0
  851. package/dist/versioning/version-manager.d.ts.map +1 -0
  852. package/dist/versioning/version-manager.js +386 -0
  853. package/dist/versioning/version-manager.js.map +1 -0
  854. package/package.json +117 -0
@@ -0,0 +1,1533 @@
1
+ "use strict";
2
+ // ABOUTME: Aggregates CMOS project state into the cold-start onboarding payload.
3
+ // ABOUTME: Also surfaces sender-attribution ambiguity so agents can verify whoami early.
4
+ var __importDefault = (this && this.__importDefault) || function (mod) {
5
+ return (mod && mod.__esModule) ? mod : { "default": mod };
6
+ };
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.cmosAgentOnboardToolDefinition = exports.cmosAgentOnboardSchema = void 0;
9
+ exports.cmosAgentOnboard = cmosAgentOnboard;
10
+ exports.getProjectType = getProjectType;
11
+ exports.formatAgentOnboardForLLM = formatAgentOnboardForLLM;
12
+ /**
13
+ * cmos_agent_onboard Tool
14
+ *
15
+ * MCP tool for agent onboarding/context initialization.
16
+ * Returns an aggregated payload optimized for agent context windows (<4KB).
17
+ * Combines data from contexts, missions, sessions, and decisions.
18
+ *
19
+ * @module tools/cmos/cmos-agent-onboard
20
+ */
21
+ const zod_1 = require("zod");
22
+ const path_1 = __importDefault(require("path"));
23
+ const client_1 = require("./client");
24
+ const client_2 = require("./client");
25
+ const errors_1 = require("./errors");
26
+ const agent_feedback_1 = require("./agent-feedback");
27
+ const dashboard_client_1 = require("./dashboard-client");
28
+ const context_freshness_1 = require("./context-freshness");
29
+ const project_identity_1 = require("./project-identity");
30
+ const project_registry_1 = require("../../intelligence/project-registry");
31
+ const sender_context_1 = require("../../intelligence/sender-context");
32
+ const owner_resolution_1 = require("./owner-resolution");
33
+ const context_retention_1 = require("./context-retention");
34
+ const staleness_detection_1 = require("./staleness-detection");
35
+ const orphan_detection_1 = require("./orphan-detection");
36
+ const server_health_1 = require("../../server-health");
37
+ const auth_state_1 = require("../../auth/auth-state");
38
+ const cmos_constraints_1 = require("./cmos-constraints");
39
+ const tier_config_1 = require("./tier-config");
40
+ /**
41
+ * Input parameters schema for cmos_agent_onboard tool.
42
+ */
43
+ exports.cmosAgentOnboardSchema = zod_1.z.object({
44
+ /** Optional free-text UX feedback from the agent (Sprint 56 m03). */
45
+ agentFeedback: zod_1.z
46
+ .string()
47
+ .max(2000)
48
+ .optional()
49
+ .describe('Optional free-text UX feedback. Use this to report rough edges, improvement ideas, or surprising tool behavior you hit during the prior session. Reviewed periodically via cmos_feedback(action="list").'),
50
+ /** Optional: explicit project root to search from */
51
+ projectRoot: zod_1.z
52
+ .string()
53
+ .optional()
54
+ .describe('Project root directory to search for CMOS database (defaults to cwd)'),
55
+ });
56
+ /**
57
+ * MCP Tool Definition for cmos_agent_onboard.
58
+ */
59
+ exports.cmosAgentOnboardToolDefinition = {
60
+ name: 'cmos_agent_onboard',
61
+ description: 'Get aggregated onboarding payload for agent cold-start. Returns project identity, active session, pending missions, recent decisions, and suggested actions. Optimized for context windows (<4KB).',
62
+ inputSchema: {
63
+ type: 'object',
64
+ properties: {
65
+ agentFeedback: {
66
+ type: 'string',
67
+ maxLength: 2000,
68
+ description: 'Optional free-text UX feedback. Use this to report rough edges, improvement ideas, or surprising tool behavior you hit during the prior session. Reviewed periodically via cmos_feedback(action="list").',
69
+ },
70
+ projectRoot: {
71
+ type: 'string',
72
+ description: 'Project root directory to search for CMOS database (defaults to cwd)',
73
+ },
74
+ },
75
+ additionalProperties: false,
76
+ },
77
+ };
78
+ /**
79
+ * Execute the cmos_agent_onboard tool.
80
+ *
81
+ * Aggregates data from multiple sources into a single optimized payload
82
+ * for agent context initialization.
83
+ *
84
+ * @param params - Tool parameters
85
+ * @returns CmosToolResult with onboarding data
86
+ */
87
+ async function cmosAgentOnboard(params = {}) {
88
+ return (0, client_1.withClientAsync)(async (client) => {
89
+ const warnings = [];
90
+ // Sprint 52 m01: seed metadata.owner from dashboard identity if absent, then
91
+ // rewrite any legacy `cmos://unknown/*` address before project_identity is read.
92
+ // Best-effort — failure is silent; the identity row keeps an empty cmos_address
93
+ // until a later checkpoint resolves the owner.
94
+ try {
95
+ await (0, owner_resolution_1.resolveAndPersistOwner)(client);
96
+ (0, project_identity_1.backfillUnknownCmosAddress)(client);
97
+ }
98
+ catch {
99
+ // never block onboard on identity resolution
100
+ }
101
+ // Get project identity from master_context + metadata
102
+ const project = getProjectIdentity(client);
103
+ // Load tier config from cmos/tiers/{projectType}.md
104
+ const tierConfig = (0, tier_config_1.loadTierConfig)(project.projectType, params.projectRoot);
105
+ const hiddenFields = new Set(tierConfig?.onboardFieldsHide ?? []);
106
+ // Conditionally fetch sprint/mission data based on tier
107
+ const currentSprint = hiddenFields.has('currentSprint') ? null : getCurrentSprint(client);
108
+ // Get active session
109
+ const activeSession = getActiveSession(client);
110
+ // Get pending missions (suppressed for tiers that hide them)
111
+ const pendingMissions = hiddenFields.has('pendingMissions')
112
+ ? []
113
+ : getPendingMissions(client, currentSprint?.id ?? null);
114
+ // Get blocked missions (suppressed for tiers that hide them)
115
+ const blockedMissions = hiddenFields.has('blockedMissions') ? [] : getBlockedMissions(client);
116
+ // Get recent decisions
117
+ const recentDecisions = getRecentDecisions(client);
118
+ // Get next steps from project_context
119
+ const nextSteps = getNextSteps(client);
120
+ // Get session statistics
121
+ const sessionStats = getSessionStats(client);
122
+ // Get context size telemetry
123
+ const contextSizes = getContextSizes(client);
124
+ const masterSizeWarning = contextSizes.masterContext
125
+ ? (0, context_retention_1.buildContextSizeWarning)('master_context', contextSizes.masterContext)
126
+ : null;
127
+ const projectSizeWarning = contextSizes.projectContext
128
+ ? (0, context_retention_1.buildContextSizeWarning)('project_context', contextSizes.projectContext)
129
+ : null;
130
+ if (masterSizeWarning) {
131
+ warnings.push(masterSizeWarning);
132
+ }
133
+ if (projectSizeWarning) {
134
+ warnings.push(projectSizeWarning);
135
+ }
136
+ // Calculate context freshness
137
+ const freshnessResult = (0, context_freshness_1.calculateContextFreshness)(client, {
138
+ contextId: 'master_context',
139
+ });
140
+ warnings.push(...freshnessResult.warnings);
141
+ const staleWarning = (0, context_freshness_1.buildContextStalenessWarning)(freshnessResult.freshness);
142
+ if (staleWarning) {
143
+ warnings.push(staleWarning);
144
+ }
145
+ // Detect and flag stale decisions/learnings
146
+ const stalenessResult = (0, staleness_detection_1.detectAndFlagStaleness)(client);
147
+ if (stalenessResult.totalStaleDecisions > 0 || stalenessResult.totalStaleLearnings > 0) {
148
+ warnings.push(`${stalenessResult.totalStaleDecisions} stale decision(s) and ${stalenessResult.totalStaleLearnings} stale learning(s) detected (threshold: ${stalenessResult.threshold} sprints). ` +
149
+ `Run cmos_decisions(action="review") for per-decision triage with suggested actions.`);
150
+ }
151
+ // Detect orphaned entities (sprints with no missions, missions with no sprint, stale sessions)
152
+ const orphans = (0, orphan_detection_1.detectOrphans)(client);
153
+ const orphanWarnings = (0, orphan_detection_1.buildOrphanWarnings)(orphans);
154
+ warnings.push(...orphanWarnings);
155
+ // Layer 0: Full project identity from the project_identity contexts row
156
+ const fullProjectIdentity = getFullProjectIdentity(client);
157
+ // Layer 2: Tier-aware last session memory
158
+ const tier = project.projectType;
159
+ const lastSession = getLastSession(client, tier);
160
+ // Detect fresh project: zero active missions AND no PROJECT BRIEF in master_context
161
+ const freshProject = detectFreshProject(client);
162
+ const tierSelectionPrompt = freshProject
163
+ ? buildTierSelectionPrompt(project.projectType)
164
+ : undefined;
165
+ // Managed Sprint Zero trigger: fresh project + managed tier
166
+ const sprintZeroReady = freshProject && project.projectType === 'managed' ? true : undefined;
167
+ const sprintZeroContext = sprintZeroReady ? buildSprintZeroContext() : undefined;
168
+ // General tier first-session prompt: fresh project + general tier
169
+ const firstSessionPrompt = freshProject && project.projectType === 'general' ? buildFirstSessionPrompt() : undefined;
170
+ // Fetch messaging context and sync health (non-blocking — gracefully degrades)
171
+ // Skip syncHealth fetch if tier config hides it (avoids unnecessary network calls)
172
+ const [messaging, syncHealth] = await Promise.all([
173
+ fetchMessagingContext(warnings),
174
+ hiddenFields.has('syncHealth') ? Promise.resolve(null) : fetchSyncHealth(client, warnings),
175
+ ]);
176
+ // Get server health (build staleness detection)
177
+ const serverHealth = (0, server_health_1.getServerHealth)();
178
+ if (!serverHealth.codeIsCurrent && serverHealth.stalenessMessage) {
179
+ warnings.push(serverHealth.stalenessMessage);
180
+ }
181
+ // Detect stale next-steps (pending from >1 sprint ago)
182
+ const staleNextStepsCount = getStaleNextStepsCount(client, currentSprint?.id ?? null);
183
+ // Detect stale/expired constraints
184
+ const staleConstraintCount = getStaleConstraintCountForOnboard(client);
185
+ const senderAttributionAmbiguity = await detectSenderAttributionAmbiguity(params, params.projectRoot ?? process.cwd());
186
+ // Sprint 57 m04: pull authState so the agent sees it on first turn.
187
+ // Best-effort — never block onboard on credential-store I/O hiccups.
188
+ let authState;
189
+ try {
190
+ const authProjectRoot = params.projectRoot ?? undefined;
191
+ authState = await (0, auth_state_1.computeAuthState)(authProjectRoot ? { projectRoot: authProjectRoot } : {});
192
+ }
193
+ catch {
194
+ authState = undefined;
195
+ }
196
+ // Generate suggested actions based on current state (filtered by tier)
197
+ const suggestedActions = generateSuggestedActions({
198
+ activeSession,
199
+ pendingMissions,
200
+ blockedMissions,
201
+ currentSprint,
202
+ contextFreshness: freshnessResult.freshness,
203
+ messaging,
204
+ syncHealth,
205
+ orphans,
206
+ serverHealth,
207
+ staleCounts: {
208
+ decisions: stalenessResult.totalStaleDecisions,
209
+ learnings: stalenessResult.totalStaleLearnings,
210
+ },
211
+ staleNextStepsCount,
212
+ staleConstraintCount,
213
+ contextSizes,
214
+ senderAttributionAmbiguity,
215
+ toolsSkip: tierConfig?.toolsSkip ?? [],
216
+ freshProject,
217
+ authState,
218
+ projectRootSupplied: !!params.projectRoot,
219
+ });
220
+ const result = {
221
+ project,
222
+ currentSprint,
223
+ activeSession,
224
+ pendingMissions,
225
+ blockedMissions,
226
+ recentDecisions,
227
+ nextSteps,
228
+ suggestedActions,
229
+ sessionStats,
230
+ contextSizes,
231
+ contextFreshness: freshnessResult.freshness,
232
+ staleness: {
233
+ staleDecisions: stalenessResult.totalStaleDecisions,
234
+ staleLearnings: stalenessResult.totalStaleLearnings,
235
+ threshold: stalenessResult.threshold,
236
+ },
237
+ messaging,
238
+ syncHealth,
239
+ orphans,
240
+ serverHealth,
241
+ tierConfig,
242
+ freshProject,
243
+ ...(authState ? { authState } : {}),
244
+ };
245
+ if (tierSelectionPrompt !== undefined) {
246
+ result.tierSelectionPrompt = tierSelectionPrompt;
247
+ }
248
+ if (sprintZeroReady !== undefined) {
249
+ result.sprintZeroReady = sprintZeroReady;
250
+ }
251
+ if (sprintZeroContext !== undefined) {
252
+ result.sprintZeroContext = sprintZeroContext;
253
+ }
254
+ if (firstSessionPrompt !== undefined) {
255
+ result.firstSessionPrompt = firstSessionPrompt;
256
+ }
257
+ // Context v2 Sprint 50: Layer 0 + Layer 2
258
+ result.projectIdentity = fullProjectIdentity;
259
+ result.lastSession = lastSession;
260
+ // Sprint 56 m03: persist optional agent UX feedback if supplied.
261
+ const feedbackSanitized = [];
262
+ if (params.agentFeedback && params.agentFeedback.trim().length > 0) {
263
+ const fb = (0, agent_feedback_1.recordAgentFeedback)(client, params.agentFeedback, {
264
+ toolName: 'cmos_agent_onboard',
265
+ sessionId: activeSession?.id ?? null,
266
+ sprintId: currentSprint?.id ?? null,
267
+ });
268
+ if (fb.feedbackId !== null) {
269
+ result.feedbackId = fb.feedbackId;
270
+ }
271
+ feedbackSanitized.push(...fb.sanitizedFields);
272
+ }
273
+ return (0, errors_1.createSuccess)(result, warnings, feedbackSanitized);
274
+ }, { projectRoot: params.projectRoot });
275
+ }
276
+ /**
277
+ * Read project_type from metadata table. Defaults to 'build' for backward compatibility.
278
+ */
279
+ function getProjectType(client) {
280
+ const result = client.getOne('SELECT value FROM metadata WHERE key = ?', [
281
+ 'project_type',
282
+ ]);
283
+ if (result.success && result.data?.value) {
284
+ const normalized = result.data.value.trim();
285
+ if (normalized.length > 0)
286
+ return normalized;
287
+ }
288
+ return 'build';
289
+ }
290
+ /**
291
+ * Extract project identity from master_context + metadata.
292
+ */
293
+ function getProjectIdentity(client) {
294
+ const projectType = getProjectType(client);
295
+ const result = client.getOne('SELECT content FROM contexts WHERE id = ?', [
296
+ 'master_context',
297
+ ]);
298
+ if (!result.success || !result.data) {
299
+ return { name: 'CMOS Project', description: null, status: null, projectType };
300
+ }
301
+ try {
302
+ const content = JSON.parse(result.data.content);
303
+ const projectIdentity = content.project_identity || content.project || {};
304
+ return {
305
+ name: projectIdentity.name || content.project?.name || 'CMOS Project',
306
+ description: projectIdentity.description || content.project?.description || null,
307
+ status: projectIdentity.status || content.project?.status || null,
308
+ projectType,
309
+ };
310
+ }
311
+ catch {
312
+ return { name: 'CMOS Project', description: null, status: null, projectType };
313
+ }
314
+ }
315
+ /**
316
+ * Get the full project identity from the project_identity contexts row (Layer 0).
317
+ * Auto-seeds the row if absent. Returns null on failure.
318
+ */
319
+ function getFullProjectIdentity(client) {
320
+ try {
321
+ return (0, project_identity_1.getProjectIdentity)(client);
322
+ }
323
+ catch {
324
+ return null;
325
+ }
326
+ }
327
+ /**
328
+ * Build tier-aware last session memory (Layer 2).
329
+ *
330
+ * Depth by tier:
331
+ * - general: {title, summary, openItems}
332
+ * - managed: {title, summary, decisions, nextSteps}
333
+ * - build: {title, summary, decisions, nextSteps, openItems}
334
+ */
335
+ function getLastSession(client, tier) {
336
+ const result = client.getOne(`SELECT id, title, type, summary, captures, completed_at
337
+ FROM sessions
338
+ WHERE status = 'completed'
339
+ ORDER BY completed_at DESC
340
+ LIMIT 1`, []);
341
+ if (!result.success || !result.data)
342
+ return null;
343
+ const session = result.data;
344
+ const base = {
345
+ id: session.id,
346
+ title: session.title,
347
+ summary: session.summary,
348
+ completedAt: session.completed_at,
349
+ };
350
+ // Parse captures for decisions and next-steps
351
+ let decisions = [];
352
+ let nextSteps = [];
353
+ if (session.captures) {
354
+ try {
355
+ const captures = JSON.parse(session.captures);
356
+ if (Array.isArray(captures)) {
357
+ decisions = captures
358
+ .filter((c) => c.category === 'decision' && typeof c.content === 'string')
359
+ .map((c) => c.content);
360
+ nextSteps = captures
361
+ .filter((c) => c.category === 'next-step' && typeof c.content === 'string')
362
+ .map((c) => c.content);
363
+ }
364
+ }
365
+ catch {
366
+ // ignore parse errors
367
+ }
368
+ }
369
+ // Fetch open items from next_steps table (table may not exist on older DBs)
370
+ const nextStepsTableExists = client.getOne(`SELECT name FROM sqlite_master WHERE type='table' AND name='next_steps'`, []);
371
+ const openItems = [];
372
+ if (nextStepsTableExists.success && nextStepsTableExists.data) {
373
+ const openItemsResult = client.getMany(`SELECT content FROM next_steps WHERE status = 'pending' ORDER BY id DESC LIMIT 10`, []);
374
+ if (openItemsResult.success && openItemsResult.data) {
375
+ openItems.push(...openItemsResult.data.map((r) => r.content));
376
+ }
377
+ }
378
+ // Apply tier-aware depth
379
+ if (tier === 'general') {
380
+ return { ...base, openItems };
381
+ }
382
+ else if (tier === 'managed') {
383
+ return { ...base, decisions, nextSteps };
384
+ }
385
+ else {
386
+ // build (default) — all fields
387
+ return { ...base, decisions, nextSteps, openItems };
388
+ }
389
+ }
390
+ /**
391
+ * Get current sprint context using mission-aware detection.
392
+ *
393
+ * Strategy:
394
+ * 1. Sprint with In Progress or Current missions (active work)
395
+ * 2. Explicit In Progress/Current/Active sprint that still has open work or no missions yet
396
+ * 3. Most recently active sprint when status fields drift behind reality
397
+ * 4. Earliest non-completed sprint with Queued missions (next work)
398
+ * 5. Fall back to status-based ordering
399
+ */
400
+ function getCurrentSprint(client) {
401
+ // Sprint 55 m03: Archived sprints must never surface as currentSprint, even
402
+ // if an Archived sprint has recent mission/session activity. Each step below
403
+ // filters Archived explicitly (Step 2 is already scoped to open statuses).
404
+ // Step 1: Find sprint with active work (In Progress or Current missions) on
405
+ // a non-Archived sprint.
406
+ const activeWorkResult = client.getOne(`SELECT m.sprint_id FROM missions m
407
+ JOIN sprints s ON s.id = m.sprint_id
408
+ WHERE m.status IN ('In Progress', 'Current')
409
+ AND m.sprint_id IS NOT NULL
410
+ AND COALESCE(s.status, 'Planned') != 'Archived'
411
+ LIMIT 1`, []);
412
+ if (activeWorkResult.success && activeWorkResult.data?.sprint_id) {
413
+ return getSprintContextById(client, activeWorkResult.data.sprint_id);
414
+ }
415
+ // Step 2: Prefer an explicitly active sprint unless it already looks fully completed.
416
+ const explicitOpenSprintId = getExplicitOpenSprintId(client);
417
+ if (explicitOpenSprintId) {
418
+ return getSprintContextById(client, explicitOpenSprintId);
419
+ }
420
+ // Step 3: Most recently active sprint with mission/session activity, even if the
421
+ // sprint status was never advanced beyond Planned.
422
+ const recentActivitySprintId = getMostRecentlyActiveSprintId(client);
423
+ if (recentActivitySprintId) {
424
+ return getSprintContextById(client, recentActivitySprintId);
425
+ }
426
+ // Step 4: Earliest non-completed, non-archived sprint with Queued missions
427
+ const queuedWorkResult = client.getOne(`SELECT m.sprint_id FROM missions m
428
+ JOIN sprints s ON m.sprint_id = s.id
429
+ WHERE m.status = 'Queued' AND m.sprint_id IS NOT NULL
430
+ AND COALESCE(s.status, 'Planned') NOT IN ('Completed', 'Archived')
431
+ ORDER BY CASE COALESCE(s.status, 'Planned')
432
+ WHEN 'In Progress' THEN 0
433
+ WHEN 'Current' THEN 1
434
+ WHEN 'Active' THEN 2
435
+ WHEN 'Planned' THEN 3
436
+ ELSE 4
437
+ END, COALESCE(s.start_date, '9999-12-31') ASC, s.rowid ASC
438
+ LIMIT 1`, []);
439
+ if (queuedWorkResult.success && queuedWorkResult.data?.sprint_id) {
440
+ return getSprintContextById(client, queuedWorkResult.data.sprint_id);
441
+ }
442
+ // Step 5: Fall back to status-based ordering, with Archived sprints excluded
443
+ // entirely. When no Active/In Progress/Planned sprint exists, prefer the
444
+ // latest Completed sprint over silently returning an Archived record.
445
+ const result = client.getOne(`SELECT id, title, status, focus
446
+ FROM sprints
447
+ WHERE COALESCE(status, 'Planned') != 'Archived'
448
+ ORDER BY CASE status
449
+ WHEN 'In Progress' THEN 0
450
+ WHEN 'Current' THEN 1
451
+ WHEN 'Active' THEN 2
452
+ WHEN 'Planned' THEN 3
453
+ WHEN 'Completed' THEN 4
454
+ ELSE 5
455
+ END, COALESCE(end_date, start_date, '') DESC, rowid DESC
456
+ LIMIT 1`, []);
457
+ if (!result.success || !result.data) {
458
+ return null;
459
+ }
460
+ return {
461
+ id: result.data.id,
462
+ title: result.data.title,
463
+ status: result.data.status,
464
+ focus: result.data.focus,
465
+ };
466
+ }
467
+ function getExplicitOpenSprintId(client) {
468
+ const result = client.getOne(`SELECT s.id
469
+ FROM sprints s
470
+ WHERE COALESCE(s.status, 'Planned') IN ('In Progress', 'Current', 'Active')
471
+ AND (
472
+ NOT EXISTS (
473
+ SELECT 1
474
+ FROM missions m
475
+ WHERE m.sprint_id = s.id
476
+ )
477
+ OR EXISTS (
478
+ SELECT 1
479
+ FROM missions m
480
+ WHERE m.sprint_id = s.id
481
+ AND COALESCE(m.status, '') != 'Completed'
482
+ )
483
+ )
484
+ ORDER BY CASE COALESCE(s.status, 'Planned')
485
+ WHEN 'In Progress' THEN 0
486
+ WHEN 'Current' THEN 1
487
+ WHEN 'Active' THEN 2
488
+ ELSE 3
489
+ END, COALESCE(s.start_date, '') DESC, s.rowid DESC
490
+ LIMIT 1`, []);
491
+ return result.success ? (result.data?.id ?? null) : null;
492
+ }
493
+ function getMostRecentlyActiveSprintId(client) {
494
+ // Sprint 55 m03: Archived sprints had historically-recent mission/session
495
+ // timestamps on mature projects like OODS-Foundry-MCP (74 sprints, 458
496
+ // missions), so this step was returning the latest Archived sprint instead
497
+ // of falling through to the Completed sprint in Step 5. Exclude Archived
498
+ // alongside Completed so only genuinely-active parent sprints bubble up.
499
+ const result = client.getOne(`SELECT activity.sprint_id
500
+ FROM (
501
+ SELECT m.sprint_id, m.completed_at AS activity_at
502
+ FROM missions m
503
+ JOIN sprints s ON s.id = m.sprint_id
504
+ WHERE m.sprint_id IS NOT NULL
505
+ AND m.completed_at IS NOT NULL
506
+ AND COALESCE(s.status, 'Planned') NOT IN ('Completed', 'Archived')
507
+ UNION ALL
508
+ SELECT sess.sprint_id, COALESCE(sess.completed_at, sess.started_at) AS activity_at
509
+ FROM sessions sess
510
+ JOIN sprints s ON s.id = sess.sprint_id
511
+ WHERE sess.sprint_id IS NOT NULL
512
+ AND COALESCE(s.status, 'Planned') NOT IN ('Completed', 'Archived')
513
+ ) AS activity
514
+ WHERE activity.activity_at IS NOT NULL
515
+ GROUP BY activity.sprint_id
516
+ ORDER BY MAX(activity.activity_at) DESC, activity.sprint_id DESC
517
+ LIMIT 1`, []);
518
+ return result.success ? (result.data?.sprint_id ?? null) : null;
519
+ }
520
+ /**
521
+ * Get sprint context by ID.
522
+ */
523
+ function getSprintContextById(client, sprintId) {
524
+ const result = client.getOne(`SELECT id, title, status, focus FROM sprints WHERE id = ?`, [sprintId]);
525
+ if (!result.success || !result.data) {
526
+ return null;
527
+ }
528
+ return {
529
+ id: result.data.id,
530
+ title: result.data.title,
531
+ status: result.data.status,
532
+ focus: result.data.focus,
533
+ };
534
+ }
535
+ /**
536
+ * Get active session if any.
537
+ */
538
+ function getActiveSession(client) {
539
+ const result = client.getOne(`SELECT id, type, title, started_at, captures
540
+ FROM sessions
541
+ WHERE status = 'active'
542
+ ORDER BY started_at DESC
543
+ LIMIT 1`, []);
544
+ if (!result.success || !result.data) {
545
+ return null;
546
+ }
547
+ const session = result.data;
548
+ let captureCount = 0;
549
+ try {
550
+ const captures = JSON.parse(session.captures || '[]');
551
+ captureCount = Array.isArray(captures) ? captures.length : 0;
552
+ }
553
+ catch {
554
+ captureCount = 0;
555
+ }
556
+ return {
557
+ id: session.id,
558
+ type: session.type,
559
+ title: session.title,
560
+ startedAt: session.started_at,
561
+ captureCount,
562
+ };
563
+ }
564
+ /**
565
+ * Get pending missions (In Progress, Current, Queued).
566
+ * Queued missions are scoped to the active sprint when identified.
567
+ */
568
+ function getPendingMissions(client, activeSprintId) {
569
+ // Show In Progress/Current from any sprint, but scope Queued to active sprint
570
+ const query = activeSprintId
571
+ ? `SELECT id, name, status, sprint_id
572
+ FROM missions
573
+ WHERE status IN ('In Progress', 'Current')
574
+ OR (status = 'Queued' AND sprint_id = ?)
575
+ ORDER BY CASE status
576
+ WHEN 'In Progress' THEN 0
577
+ WHEN 'Current' THEN 1
578
+ ELSE 2
579
+ END, rowid
580
+ LIMIT 5`
581
+ : `SELECT id, name, status, sprint_id
582
+ FROM missions
583
+ WHERE status IN ('In Progress', 'Current', 'Queued')
584
+ ORDER BY CASE status
585
+ WHEN 'In Progress' THEN 0
586
+ WHEN 'Current' THEN 1
587
+ ELSE 2
588
+ END, rowid
589
+ LIMIT 5`;
590
+ const params = activeSprintId ? [activeSprintId] : [];
591
+ const result = client.getMany(query, params);
592
+ if (!result.success || !result.data) {
593
+ return [];
594
+ }
595
+ return result.data.map((m) => ({
596
+ id: m.id,
597
+ name: m.name,
598
+ status: m.status,
599
+ sprintId: m.sprint_id,
600
+ }));
601
+ }
602
+ /**
603
+ * Get blocked missions.
604
+ */
605
+ function getBlockedMissions(client) {
606
+ const result = client.getMany(`SELECT id, name, status, sprint_id
607
+ FROM missions
608
+ WHERE status = 'Blocked'
609
+ ORDER BY rowid
610
+ LIMIT 3`, []);
611
+ if (!result.success || !result.data) {
612
+ return [];
613
+ }
614
+ return result.data.map((m) => ({
615
+ id: m.id,
616
+ name: m.name,
617
+ status: m.status,
618
+ sprintId: m.sprint_id,
619
+ }));
620
+ }
621
+ /**
622
+ * Get recent strategic decisions.
623
+ */
624
+ function getRecentDecisions(client) {
625
+ const result = client.getMany(`SELECT decision_text, project_domain, created_at
626
+ FROM strategic_decisions
627
+ ORDER BY created_at DESC
628
+ LIMIT 10`, []);
629
+ if (!result.success || !result.data) {
630
+ return [];
631
+ }
632
+ return result.data.map((d) => ({
633
+ decision: d.decision_text,
634
+ domain: d.project_domain,
635
+ createdAt: d.created_at,
636
+ }));
637
+ }
638
+ /**
639
+ * Count stale next-steps: pending next-steps from sprints older than the current one.
640
+ * Returns 0 if the next_steps table doesn't exist.
641
+ */
642
+ function getStaleNextStepsCount(client, currentSprintId) {
643
+ // Check if next_steps table exists
644
+ const tableCheck = client.getOne(`SELECT name FROM sqlite_master WHERE type='table' AND name='next_steps'`);
645
+ if (!tableCheck.success || !tableCheck.data)
646
+ return 0;
647
+ if (!currentSprintId) {
648
+ // No active sprint — all pending next-steps are stale
649
+ const result = client.getOne(`SELECT COUNT(*) AS count FROM next_steps WHERE status = 'pending'`);
650
+ return result.success && result.data ? result.data.count : 0;
651
+ }
652
+ // Pending next-steps from sprints other than the current one
653
+ const result = client.getOne(`SELECT COUNT(*) AS count FROM next_steps
654
+ WHERE status = 'pending'
655
+ AND (sprint_id IS NOT NULL AND sprint_id != ?)`, [currentSprintId]);
656
+ return result.success && result.data ? result.data.count : 0;
657
+ }
658
+ /**
659
+ * Count stale/expired constraints using the constraints module.
660
+ */
661
+ function getStaleConstraintCountForOnboard(client) {
662
+ return (0, cmos_constraints_1.getStaleConstraintCount)(client);
663
+ }
664
+ /**
665
+ * Get next steps from project_context.
666
+ */
667
+ function getNextSteps(client) {
668
+ const result = client.getOne('SELECT content FROM contexts WHERE id = ?', [
669
+ 'project_context',
670
+ ]);
671
+ if (!result.success || !result.data) {
672
+ return [];
673
+ }
674
+ try {
675
+ const content = JSON.parse(result.data.content);
676
+ const workingMemory = content.working_memory || {};
677
+ const nextSessionContext = content.next_session_context || {};
678
+ const candidateSteps = [
679
+ ...readOnboardSteps(workingMemory.next_steps),
680
+ ...readOnboardSteps(nextSessionContext.when_we_resume),
681
+ ...readOnboardSteps(content.next_steps),
682
+ ];
683
+ const completedMissionIds = loadCompletedMissionIds(client);
684
+ const completedSprintIds = loadCompletedSprintIds(client);
685
+ const sessionReferenceIndex = loadSessionReferenceIndex(client);
686
+ const nextSteps = [];
687
+ const seen = new Set();
688
+ for (const step of candidateSteps) {
689
+ if (referencesCompletedMission(step, completedMissionIds)) {
690
+ continue;
691
+ }
692
+ if (referencesCompletedSprint(step, completedSprintIds)) {
693
+ continue;
694
+ }
695
+ const sessionReference = extractValidSessionReference(step, sessionReferenceIndex.all);
696
+ if (sessionReference &&
697
+ sessionReferenceIndex.recent.size > 0 &&
698
+ !sessionReferenceIndex.recent.has(sessionReference)) {
699
+ continue;
700
+ }
701
+ const dedupeKey = stripSessionReference(step, sessionReferenceIndex.all).toLowerCase();
702
+ if (seen.has(dedupeKey)) {
703
+ continue;
704
+ }
705
+ seen.add(dedupeKey);
706
+ nextSteps.push(step);
707
+ if (nextSteps.length >= 5) {
708
+ break;
709
+ }
710
+ }
711
+ return nextSteps;
712
+ }
713
+ catch {
714
+ return [];
715
+ }
716
+ }
717
+ function readOnboardSteps(value) {
718
+ if (!Array.isArray(value)) {
719
+ return [];
720
+ }
721
+ return value
722
+ .filter((entry) => typeof entry === 'string')
723
+ .map((entry) => entry.trim())
724
+ .filter((entry) => entry.length > 0);
725
+ }
726
+ function loadCompletedMissionIds(client) {
727
+ const result = client.getMany(`SELECT id
728
+ FROM missions
729
+ WHERE status = 'Completed'`, []);
730
+ return new Set(result.success && result.data ? result.data.map((row) => row.id) : []);
731
+ }
732
+ function loadCompletedSprintIds(client) {
733
+ const result = client.getMany(`SELECT id
734
+ FROM sprints
735
+ WHERE status = 'Completed'`, []);
736
+ return new Set(result.success && result.data ? result.data.map((row) => row.id) : []);
737
+ }
738
+ function loadSessionReferenceIndex(client) {
739
+ const result = client.getMany(`SELECT id
740
+ FROM sessions
741
+ ORDER BY COALESCE(completed_at, started_at) DESC, rowid DESC`, []);
742
+ if (!result.success || !result.data) {
743
+ return { all: new Set(), recent: new Set() };
744
+ }
745
+ const orderedIds = result.data.map((row) => row.id).filter(Boolean);
746
+ return {
747
+ all: new Set(orderedIds),
748
+ recent: new Set(orderedIds.slice(0, 2)),
749
+ };
750
+ }
751
+ function extractValidSessionReference(step, knownSessionIds) {
752
+ const separatorIndex = step.indexOf(':');
753
+ if (separatorIndex <= 0) {
754
+ return null;
755
+ }
756
+ const candidate = step.slice(0, separatorIndex).trim();
757
+ return knownSessionIds.has(candidate) ? candidate : null;
758
+ }
759
+ function stripSessionReference(step, knownSessionIds) {
760
+ const reference = extractValidSessionReference(step, knownSessionIds);
761
+ if (!reference) {
762
+ return step.trim();
763
+ }
764
+ return step.slice(step.indexOf(':') + 1).trim();
765
+ }
766
+ function referencesCompletedMission(step, completedMissionIds) {
767
+ const normalizedStep = step.toLowerCase();
768
+ for (const missionId of completedMissionIds) {
769
+ if (normalizedStep.includes(missionId.toLowerCase())) {
770
+ return true;
771
+ }
772
+ }
773
+ return false;
774
+ }
775
+ function referencesCompletedSprint(step, completedSprintIds) {
776
+ const normalizedStep = step.toLowerCase();
777
+ for (const sprintId of completedSprintIds) {
778
+ const tokens = [sprintId.toLowerCase(), sprintId.toLowerCase().replace(/-/g, ' ')];
779
+ const numericMatch = sprintId.toLowerCase().match(/^sprint-(\d+)$/);
780
+ if (numericMatch) {
781
+ const normalizedNumber = String(Number.parseInt(numericMatch[1], 10));
782
+ tokens.push(`sprint ${normalizedNumber}`);
783
+ tokens.push(`sprint-${numericMatch[1]}`);
784
+ }
785
+ if (tokens.some((token) => normalizedStep.includes(token))) {
786
+ return true;
787
+ }
788
+ }
789
+ return false;
790
+ }
791
+ /**
792
+ * Get session statistics.
793
+ */
794
+ function getSessionStats(client) {
795
+ const result = client.getOne(`SELECT COUNT(*) AS total_sessions,
796
+ MAX(COALESCE(completed_at, started_at)) AS last_activity
797
+ FROM sessions`, []);
798
+ if (!result.success || !result.data) {
799
+ return { totalSessions: 0, lastActivity: null };
800
+ }
801
+ return {
802
+ totalSessions: result.data.total_sessions,
803
+ lastActivity: result.data.last_activity,
804
+ };
805
+ }
806
+ function getContextSizes(client) {
807
+ const contexts = client.getMany(`SELECT id, content
808
+ FROM contexts
809
+ WHERE id IN ('master_context', 'project_context')`, []);
810
+ if (!contexts.success || !contexts.data) {
811
+ return {
812
+ masterContext: null,
813
+ projectContext: null,
814
+ totalSizeKb: 0,
815
+ totalSizeBytes: 0,
816
+ };
817
+ }
818
+ let masterContext = null;
819
+ let projectContext = null;
820
+ for (const row of contexts.data) {
821
+ let parsed = {};
822
+ try {
823
+ parsed = JSON.parse(row.content);
824
+ }
825
+ catch {
826
+ parsed = {};
827
+ }
828
+ const settings = (0, context_retention_1.resolveContextSizeSettings)(parsed);
829
+ const metrics = (0, context_retention_1.calculateContextSizeMetrics)(row.content, settings);
830
+ if (row.id === 'master_context') {
831
+ masterContext = metrics;
832
+ }
833
+ else if (row.id === 'project_context') {
834
+ projectContext = metrics;
835
+ }
836
+ }
837
+ return {
838
+ masterContext,
839
+ projectContext,
840
+ totalSizeKb: (masterContext?.sizeKb ?? 0) + (projectContext?.sizeKb ?? 0),
841
+ totalSizeBytes: (masterContext?.sizeBytes ?? 0) + (projectContext?.sizeBytes ?? 0),
842
+ };
843
+ }
844
+ /**
845
+ * Fetch messaging context from the dashboard.
846
+ * Non-blocking: if dashboard is unreachable or not configured,
847
+ * returns null and adds a warning.
848
+ */
849
+ async function fetchMessagingContext(warnings) {
850
+ const clientResult = dashboard_client_1.DashboardClient.fromEnv();
851
+ if (!clientResult.success) {
852
+ // Dashboard not configured — this is normal, don't warn
853
+ return null;
854
+ }
855
+ try {
856
+ const client = clientResult.data;
857
+ const result = await client.listMessages({
858
+ tab: 'inbox',
859
+ status: 'pending',
860
+ limit: 5,
861
+ });
862
+ if (!result.success) {
863
+ warnings.push(`Dashboard messaging unavailable: ${result.error?.message ?? 'unknown error'}`);
864
+ return null;
865
+ }
866
+ return {
867
+ unreadCount: result.data.unreadCount,
868
+ recentMessages: result.data.messages.map((msg) => ({
869
+ id: msg.id,
870
+ type: msg.type,
871
+ summary: msg.summary,
872
+ from: msg.from ?? null,
873
+ status: msg.status,
874
+ createdAt: msg.createdAt,
875
+ })),
876
+ };
877
+ }
878
+ catch {
879
+ warnings.push('Dashboard messaging unavailable: unexpected error during fetch');
880
+ return null;
881
+ }
882
+ }
883
+ /** PG table → SQLite table name mapping for reconciliation (global fallback) */
884
+ const PG_TO_SQLITE_TABLE = {
885
+ cmos_sprints: 'sprints',
886
+ cmos_missions: 'missions',
887
+ cmos_sessions: 'sessions',
888
+ cmos_decisions: 'strategic_decisions',
889
+ cmos_learnings: 'learnings',
890
+ cmos_mission_dependencies: 'mission_dependencies',
891
+ };
892
+ /** Project state entity field → SQLite table name mapping (project-scoped) */
893
+ const PROJECT_STATE_TO_SQLITE = {
894
+ sprints: 'sprints',
895
+ missions: 'missions',
896
+ sessions: 'sessions',
897
+ decisions: 'strategic_decisions',
898
+ learnings: 'learnings',
899
+ dependencies: 'mission_dependencies',
900
+ };
901
+ /**
902
+ * Fetch sync health by comparing SQLite counts with PG mirror counts.
903
+ * Uses project-scoped endpoint for accurate per-project comparison.
904
+ * Falls back to global endpoint if project-scoped is unavailable.
905
+ * Non-blocking — returns null if dashboard is unreachable.
906
+ */
907
+ async function fetchSyncHealth(db, warnings) {
908
+ const clientResult = dashboard_client_1.DashboardClient.fromEnv();
909
+ if (!clientResult.success) {
910
+ return null;
911
+ }
912
+ try {
913
+ const client = clientResult.data;
914
+ // Resolve project slug from metadata
915
+ const nameResult = db.getOne(`SELECT value FROM metadata WHERE key = 'project_name'`);
916
+ const projectName = nameResult.success && nameResult.data ? nameResult.data.value : null;
917
+ // Try project-scoped endpoint first
918
+ if (projectName) {
919
+ const slug = projectName.toLowerCase().replace(/\s+/g, '-');
920
+ const stateResult = await client.getSyncProjectState(slug);
921
+ if (stateResult.success && stateResult.data) {
922
+ return buildSyncHealthFromProjectState(db, stateResult.data, client);
923
+ }
924
+ }
925
+ // Fallback to global endpoint
926
+ return buildSyncHealthFromGlobalStatus(db, client, warnings);
927
+ }
928
+ catch {
929
+ warnings.push('Sync health unavailable: unexpected error during fetch');
930
+ return null;
931
+ }
932
+ }
933
+ /** Build sync health from project-scoped state (accurate per-project counts) */
934
+ async function buildSyncHealthFromProjectState(db, projectState, client) {
935
+ const mismatches = [];
936
+ for (const [entityField, sqliteTable] of Object.entries(PROJECT_STATE_TO_SQLITE)) {
937
+ const pgEntities = projectState[entityField];
938
+ const pgCount = Array.isArray(pgEntities) ? pgEntities.length : 0;
939
+ const countResult = db.getOne(`SELECT COUNT(*) AS cnt FROM ${sqliteTable}`);
940
+ const sqliteCount = countResult.success && countResult.data ? countResult.data.cnt : 0;
941
+ if (sqliteCount !== pgCount) {
942
+ mismatches.push({
943
+ table: sqliteTable,
944
+ sqliteCount,
945
+ pgCount,
946
+ delta: sqliteCount - pgCount,
947
+ });
948
+ }
949
+ }
950
+ // Get sync log stats from global endpoint
951
+ let failedEntries = 0;
952
+ let lastSyncAt = null;
953
+ try {
954
+ const statusResult = await client.getSyncStatus();
955
+ if (statusResult.success && statusResult.data) {
956
+ failedEntries = statusResult.data.failedSyncLogEntries;
957
+ lastSyncAt = statusResult.data.lastSyncAt;
958
+ }
959
+ }
960
+ catch {
961
+ // Non-critical
962
+ }
963
+ return {
964
+ allMatch: mismatches.length === 0,
965
+ totalMismatches: mismatches.length,
966
+ mismatches,
967
+ failedEntries,
968
+ lastSyncAt,
969
+ };
970
+ }
971
+ /** Build sync health from global status endpoint (fallback) */
972
+ async function buildSyncHealthFromGlobalStatus(db, client, warnings) {
973
+ const statusResult = await client.getSyncStatus();
974
+ if (!statusResult.success || !statusResult.data) {
975
+ warnings.push(`Sync health unavailable: ${statusResult.error?.message ?? 'unknown error'}`);
976
+ return null;
977
+ }
978
+ const pgStatus = statusResult.data;
979
+ const mismatches = [];
980
+ for (const pgTable of pgStatus.tables) {
981
+ const sqliteTable = PG_TO_SQLITE_TABLE[pgTable.table];
982
+ if (!sqliteTable)
983
+ continue;
984
+ const countResult = db.getOne(`SELECT COUNT(*) AS cnt FROM ${sqliteTable}`);
985
+ const sqliteCount = countResult.success && countResult.data ? countResult.data.cnt : 0;
986
+ if (sqliteCount !== pgTable.count) {
987
+ mismatches.push({
988
+ table: sqliteTable,
989
+ sqliteCount,
990
+ pgCount: pgTable.count,
991
+ delta: sqliteCount - pgTable.count,
992
+ });
993
+ }
994
+ }
995
+ return {
996
+ allMatch: mismatches.length === 0,
997
+ totalMismatches: mismatches.length,
998
+ mismatches,
999
+ failedEntries: pgStatus.failedSyncLogEntries,
1000
+ lastSyncAt: pgStatus.lastSyncAt,
1001
+ };
1002
+ }
1003
+ /**
1004
+ * Detect whether this is a fresh project — one that has not accumulated any
1005
+ * history yet.
1006
+ *
1007
+ * Sprint 55 m03: row counts across sprints, missions, and sessions are now the
1008
+ * authoritative signal. Any persisted sprint / mission / session means the
1009
+ * project is past the tabula-rasa state and must not be flagged fresh, even if
1010
+ * every mission has since been completed and no "PROJECT BRIEF" marker was
1011
+ * ever written to master_context. Previously this function only checked for
1012
+ * active missions + the brief marker, which misreported mature projects
1013
+ * (OODS-Foundry-MCP: 74 sprints / 458 missions / 127 sessions) as fresh and
1014
+ * surfaced the new-project tierSelectionPrompt on every onboard.
1015
+ *
1016
+ * Falls back to the PROJECT BRIEF heuristic only when the database has zero
1017
+ * rows in all three tables, so the first-session prompt still fires for
1018
+ * genuinely-new projects that import context via master_context without ever
1019
+ * persisting a sprint row.
1020
+ */
1021
+ function detectFreshProject(client) {
1022
+ const rowsResult = client.getOne(`SELECT
1023
+ (SELECT COUNT(*) FROM sprints) AS sprint_count,
1024
+ (SELECT COUNT(*) FROM missions) AS mission_count,
1025
+ (SELECT COUNT(*) FROM sessions) AS session_count`, []);
1026
+ if (rowsResult.success && rowsResult.data) {
1027
+ const { sprint_count, mission_count, session_count } = rowsResult.data;
1028
+ if (sprint_count > 0 || mission_count > 0 || session_count > 0) {
1029
+ return false;
1030
+ }
1031
+ }
1032
+ const contextResult = client.getOne('SELECT content FROM contexts WHERE id = ?', ['master_context']);
1033
+ if (!contextResult.success || !contextResult.data)
1034
+ return true; // No context → fresh
1035
+ const content = contextResult.data.content.toLowerCase();
1036
+ const hasBrief = content.includes('project brief') || content.includes('project_brief');
1037
+ return !hasBrief;
1038
+ }
1039
+ /**
1040
+ * Build a tier-appropriate first-session prompt for fresh projects.
1041
+ * The agent uses this to kick off the opening conversation.
1042
+ */
1043
+ function buildTierSelectionPrompt(tier) {
1044
+ switch (tier) {
1045
+ case 'general':
1046
+ return ('New project detected. This is a fresh CMOS General workspace — a thinking partner ' +
1047
+ 'with memory. Start by introducing the project: what are you working on, and what ' +
1048
+ 'would be most useful to capture and remember across conversations?');
1049
+ case 'managed':
1050
+ return ('New project detected. This is a fresh CMOS Managed workspace. ' +
1051
+ "Let's capture the project brief to get started: what's the goal, who are the " +
1052
+ "stakeholders, and what's the target timeline?");
1053
+ case 'build':
1054
+ default:
1055
+ return ('New project detected. This is a fresh CMOS Build workspace with no active missions. ' +
1056
+ 'Start with sprint planning to define the first sprint and its missions: ' +
1057
+ 'cmos_session(action="start", type="planning", title="Sprint 1 Planning").');
1058
+ }
1059
+ }
1060
+ /**
1061
+ * Build the Sprint Zero entry context for managed-tier fresh projects.
1062
+ * Contains everything the agent needs to run the intake interview without
1063
+ * reading the sprint-zero-managed.md snippet file.
1064
+ */
1065
+ function buildSprintZeroContext() {
1066
+ return {
1067
+ description: 'Sprint Zero is a short intake interview that produces a populated project brief ' +
1068
+ 'and identifies the first milestone. It adapts to what the user arrives with and ' +
1069
+ 'may span more than one session.',
1070
+ entryModes: [
1071
+ {
1072
+ situation: 'Has a client and a deadline',
1073
+ entry: 'Stage 2 — stakeholders and context',
1074
+ openingQuestion: "Great, let's get your project set up. Tell me about the client and what the deadline is.",
1075
+ },
1076
+ {
1077
+ situation: 'Has a problem or goal but no strategy yet',
1078
+ entry: 'Stage 1 — project identity',
1079
+ openingQuestion: "What's the project in one sentence? And who is it for?",
1080
+ },
1081
+ {
1082
+ situation: 'Has an idea but nothing concrete',
1083
+ entry: 'Stage 0 — exploration',
1084
+ openingQuestion: "What's on your mind? Tell me about it — even rough is fine.",
1085
+ },
1086
+ ],
1087
+ routingQuestion: 'Before we dive in — do you already have a client or deadline in mind, ' +
1088
+ 'or are you still figuring out what this project is?',
1089
+ };
1090
+ }
1091
+ /**
1092
+ * Build the first-session conversation guide for general-tier fresh projects.
1093
+ * Tells the agent what to ask, what to capture, and what the user should leave with.
1094
+ */
1095
+ function buildFirstSessionPrompt() {
1096
+ return ('First session — General tier. Memory and thinking partner; no missions, no tasks, no structured intake.\n\n' +
1097
+ "Open: One warm question about what they're working on. Do not mention CMOS, tiers, or setup.\n" +
1098
+ 'Example: "What are you working on? I\'ll hold onto the things worth remembering as we go."\n\n' +
1099
+ 'During the session:\n' +
1100
+ '- Start a session silently: cmos_session(action="start", type="custom", title="<topic>")\n' +
1101
+ '- Capture decisions as they surface: cmos_decisions(action="capture", ...)\n' +
1102
+ '- Write key context to master_context: cmos_context(action="write", contextType="master_context")\n' +
1103
+ '- Do not interrupt to announce what you are saving\n\n' +
1104
+ 'End state: user has project context written, key decisions and open threads captured, ' +
1105
+ 'agent ready to resume naturally next session.');
1106
+ }
1107
+ async function detectSenderAttributionAmbiguity(params, resolvedProjectRoot) {
1108
+ const reasons = [];
1109
+ const advertisedRoots = (params.advertisedRoots ?? []).map((root) => path_1.default.resolve(root));
1110
+ if ((process.env[client_2.CMOS_PROJECT_ROOT_ENV] ?? '').trim().length > 0) {
1111
+ reasons.push(`${client_2.CMOS_PROJECT_ROOT_ENV} is set`);
1112
+ }
1113
+ if (advertisedRoots.length === 0) {
1114
+ reasons.push('no MCP roots advertised');
1115
+ }
1116
+ if (!params.callerProvidedProjectRoot && advertisedRoots.length === 0) {
1117
+ try {
1118
+ const registry = await project_registry_1.ProjectRegistry.create();
1119
+ const projects = await registry.list();
1120
+ const cwd = path_1.default.resolve(process.cwd());
1121
+ const currentRoot = path_1.default.resolve(resolvedProjectRoot);
1122
+ if (projects.length > 1 && (cwd === sender_context_1.SERVER_INSTALL_ROOT || cwd !== currentRoot)) {
1123
+ reasons.push('multiple registered projects with no clear current root');
1124
+ }
1125
+ }
1126
+ catch {
1127
+ // Registry ambiguity is best-effort; onboard should never fail because of it.
1128
+ }
1129
+ }
1130
+ return {
1131
+ ambiguous: reasons.length > 0,
1132
+ reasons,
1133
+ };
1134
+ }
1135
+ /**
1136
+ * Generate suggested actions based on current state.
1137
+ */
1138
+ function generateSuggestedActions(state) {
1139
+ const skippedTools = new Set(state.toolsSkip);
1140
+ const actions = [];
1141
+ // If this is a fresh project, suggest starting the first-session flow immediately
1142
+ if (state.freshProject) {
1143
+ actions.push({
1144
+ action: 'Fresh project detected — no active missions. Begin first-session setup.',
1145
+ command: 'Follow the tierSelectionPrompt in this payload to start the opening conversation.',
1146
+ priority: 0,
1147
+ });
1148
+ }
1149
+ // If server is running stale code, top priority action
1150
+ if (!state.serverHealth.codeIsCurrent) {
1151
+ actions.push({
1152
+ action: 'MCP server is running stale code — restart required to pick up latest build',
1153
+ command: 'Restart MCP server process (e.g., reload Claude Desktop config or restart PM2)',
1154
+ priority: 0,
1155
+ });
1156
+ }
1157
+ if (state.senderAttributionAmbiguity.ambiguous && !skippedTools.has('cmos_message')) {
1158
+ actions.push({
1159
+ action: 'Run whoami to confirm sender attribution',
1160
+ command: 'cmos_message(action="whoami")',
1161
+ priority: 1,
1162
+ });
1163
+ }
1164
+ // Sprint 57 m04 + Sprint 58 m02: surface auth-state issues so agents can self-heal credentials.
1165
+ if (state.authState && !skippedTools.has('cmos_auth')) {
1166
+ if (state.authState.identitySource === 'request-body') {
1167
+ actions.push({
1168
+ action: 'Sends are being attributed via the legacy user-scoped + body-level path — rotate to a project-scoped key.',
1169
+ command: 'cmos_auth(action="reissue", projectRoot="<current project root>")',
1170
+ priority: 1,
1171
+ });
1172
+ }
1173
+ else if (state.projectRootSupplied &&
1174
+ state.authState.identitySource !== 'none' &&
1175
+ state.authState.projectKey === null &&
1176
+ state.authState.userScopedKey !== null) {
1177
+ actions.push({
1178
+ action: 'No project-scoped key for this project root yet — register or reissue to mint one.',
1179
+ command: 'cmos_auth(action="reissue", projectRoot="<current project root>") (after registration completes)',
1180
+ priority: 2,
1181
+ });
1182
+ }
1183
+ else if (state.authState.authTier === 'none') {
1184
+ // Sprint 58 m02 — replaces the Sprint 57 m04 "identitySource === none"
1185
+ // branch with a cmos_auth(action="login") command (now that m01 ships
1186
+ // the reachable entrypoint). Same trigger condition because authTier
1187
+ // is 'none' iff no user-scoped keys AND no legacy env vars.
1188
+ actions.push({
1189
+ action: 'No dashboard credentials configured — run login before any send/init.',
1190
+ command: 'cmos_auth(action="login")',
1191
+ priority: 1,
1192
+ });
1193
+ }
1194
+ else if (state.authState.authTier === 'legacy-env' ||
1195
+ state.authState.authTier === 'password-fallback') {
1196
+ // Sprint 58 m02 — authTier is non-none but not device-code: the user
1197
+ // has auth configured but via a deprecated arm. Nudge toward login
1198
+ // without blocking work (priority 2, not 1).
1199
+ actions.push({
1200
+ action: `Authenticating via ${state.authState.authTier} — migrate to device-code credentials.`,
1201
+ command: 'cmos_auth(action="login")',
1202
+ priority: 2,
1203
+ });
1204
+ }
1205
+ }
1206
+ // Sprint closeout guardrail: all missions done but sprint still Active
1207
+ if (state.currentSprint &&
1208
+ state.currentSprint.status === 'Active' &&
1209
+ state.pendingMissions.length === 0 &&
1210
+ state.blockedMissions.length === 0 &&
1211
+ !skippedTools.has('cmos_sprint')) {
1212
+ actions.push({
1213
+ action: `All missions complete — close out ${state.currentSprint.id} with sprint complete`,
1214
+ command: `cmos_sprint(action="complete", sprintId="${state.currentSprint.id}", summary="Sprint summary here")`,
1215
+ priority: 1,
1216
+ });
1217
+ }
1218
+ // If stale decisions exist, suggest automated review
1219
+ if (state.staleCounts.decisions > 0) {
1220
+ actions.push({
1221
+ action: `${state.staleCounts.decisions} stale decision(s) — run automated review for triage`,
1222
+ command: 'cmos_decisions(action="review") for per-decision scores and batch archive suggestions',
1223
+ priority: 2,
1224
+ });
1225
+ }
1226
+ // If stale next-steps exist, suggest review
1227
+ if (state.staleNextStepsCount > 0) {
1228
+ actions.push({
1229
+ action: `${state.staleNextStepsCount} stale next-step(s) from older sprints still pending — review and resolve`,
1230
+ command: 'cmos_context(action="next_steps", nextStepAction="list") to review, then complete/carry/drop',
1231
+ priority: 3,
1232
+ });
1233
+ }
1234
+ // If stale/expired constraints exist, suggest review
1235
+ if (state.staleConstraintCount > 0) {
1236
+ actions.push({
1237
+ action: `${state.staleConstraintCount} stale/expired constraint(s) — review and archive outdated ones`,
1238
+ command: 'cmos_context(action="constraints", constraintAction="review") to see scores, then archive',
1239
+ priority: 3,
1240
+ });
1241
+ }
1242
+ // If context is near size limit, suggest proactive condensation
1243
+ const masterUsage = state.contextSizes.masterContext?.usagePercent ?? 0;
1244
+ const projectUsage = state.contextSizes.projectContext?.usagePercent ?? 0;
1245
+ if (masterUsage >= 75 || projectUsage >= 75) {
1246
+ const which = masterUsage >= 75 && projectUsage >= 75
1247
+ ? 'both contexts'
1248
+ : masterUsage >= 75
1249
+ ? 'master_context'
1250
+ : 'project_context';
1251
+ const maxUsage = Math.max(masterUsage, projectUsage);
1252
+ actions.push({
1253
+ action: `Context at ${maxUsage.toFixed(0)}% capacity (${which}) — condense proactively to avoid hitting limits`,
1254
+ command: 'cmos_context(action="condense", strategy="auto") or strategy="aggressive" for deeper reduction',
1255
+ priority: 2,
1256
+ });
1257
+ }
1258
+ // If sync health shows mismatches, warn (skip if cmos_db is hidden)
1259
+ if (state.syncHealth && !state.syncHealth.allMatch && !skippedTools.has('cmos_db')) {
1260
+ actions.push({
1261
+ action: `Sync health: ${state.syncHealth.totalMismatches} table(s) have count mismatches between SQLite and PG mirror`,
1262
+ command: 'cmos_db(action="reconcile") for details, cmos_db(action="backfill", force=true) to re-sync',
1263
+ priority: 3,
1264
+ });
1265
+ }
1266
+ // Surface each stale session as an individual high-priority action
1267
+ for (const session of state.orphans.staleSessions) {
1268
+ actions.push({
1269
+ action: `Stale session ${session.id} ("${session.title}") active for ${Math.round(session.hoursActive)}h — complete or discard`,
1270
+ command: `cmos_session(action="complete", sessionId="${session.id}", summary="Auto-closed: abandoned session")`,
1271
+ priority: 1,
1272
+ });
1273
+ }
1274
+ // Surface orphaned sprints/missions at lower priority
1275
+ const nonSessionOrphans = state.orphans.orphanedSprints.length + state.orphans.orphanedMissions.length;
1276
+ if (nonSessionOrphans > 0) {
1277
+ actions.push({
1278
+ action: `${nonSessionOrphans} orphaned entit${nonSessionOrphans === 1 ? 'y' : 'ies'} detected — review warnings for details`,
1279
+ command: 'Review orphan warnings above. Archive unused sprints/missions.',
1280
+ priority: 3,
1281
+ });
1282
+ }
1283
+ // If strategic context is stale, recommend refresh immediately.
1284
+ if (state.contextFreshness.isStale) {
1285
+ actions.push({
1286
+ action: `Refresh stale master context (lag ~${state.contextFreshness.lagDays?.toFixed(1) ?? 'unknown'} days)`,
1287
+ command: 'cmos_context_update()',
1288
+ priority: 1,
1289
+ });
1290
+ }
1291
+ // If there are unread messages, suggest checking inbox
1292
+ if (state.messaging && state.messaging.unreadCount > 0) {
1293
+ actions.push({
1294
+ action: `Review ${state.messaging.unreadCount} unread message(s) in inbox`,
1295
+ command: 'cmos_message(action="list", status="pending")',
1296
+ priority: 2,
1297
+ });
1298
+ }
1299
+ // If there are blocked missions, suggest unblocking (skip if missions hidden)
1300
+ if (state.blockedMissions.length > 0 && !skippedTools.has('cmos_mission')) {
1301
+ const blocked = state.blockedMissions[0];
1302
+ actions.push({
1303
+ action: `Resolve blocked mission: ${blocked.id} (${blocked.name})`,
1304
+ command: `cmos_mission_show(missionId="${blocked.id}")`,
1305
+ priority: 3,
1306
+ });
1307
+ }
1308
+ // If there's an In Progress mission, suggest continuing it (skip if missions hidden)
1309
+ const inProgress = state.pendingMissions.find((m) => m.status === 'In Progress');
1310
+ if (inProgress && !skippedTools.has('cmos_mission')) {
1311
+ actions.push({
1312
+ action: `Continue in-progress mission: ${inProgress.id} (${inProgress.name})`,
1313
+ command: `cmos_mission_show(missionId="${inProgress.id}")`,
1314
+ priority: 4,
1315
+ });
1316
+ }
1317
+ // If there's a Current mission (not In Progress), suggest starting it (skip if missions hidden)
1318
+ const current = state.pendingMissions.find((m) => m.status === 'Current');
1319
+ if (current && !inProgress && !skippedTools.has('cmos_mission_transition')) {
1320
+ actions.push({
1321
+ action: `Start current mission: ${current.id} (${current.name})`,
1322
+ command: `cmos_mission_start(missionId="${current.id}")`,
1323
+ priority: 5,
1324
+ });
1325
+ }
1326
+ // If no active session, suggest starting one
1327
+ if (!state.activeSession) {
1328
+ actions.push({
1329
+ action: 'Start a planning or review session',
1330
+ command: 'cmos_session_start(type="planning", title="Session title")',
1331
+ priority: 6,
1332
+ });
1333
+ }
1334
+ // If there's an active session, remind to complete it
1335
+ if (state.activeSession) {
1336
+ actions.push({
1337
+ action: `Complete active session: ${state.activeSession.title}`,
1338
+ command: `cmos_session_complete(summary="Session summary")`,
1339
+ priority: 7,
1340
+ });
1341
+ }
1342
+ // If there's a current sprint with completed sprints in history, suggest analytics (skip if sprints hidden)
1343
+ if (state.currentSprint && !skippedTools.has('cmos_sprint')) {
1344
+ actions.push({
1345
+ action: 'View cross-sprint trend analytics (velocity, completion rate, decision volume)',
1346
+ command: 'cmos_sprint(action="analytics")',
1347
+ priority: 8,
1348
+ });
1349
+ }
1350
+ // Suggest viewing mission status if no other actions (skip if missions hidden)
1351
+ if (actions.length === 0 && !skippedTools.has('cmos_mission')) {
1352
+ actions.push({
1353
+ action: 'View mission queue',
1354
+ command: 'cmos_mission_status()',
1355
+ priority: 1,
1356
+ });
1357
+ }
1358
+ return actions.sort((a, b) => a.priority - b.priority);
1359
+ }
1360
+ /**
1361
+ * Format agent onboard result for LLM readability.
1362
+ *
1363
+ * @param result - Agent onboard result
1364
+ * @returns Human-readable summary
1365
+ */
1366
+ function formatAgentOnboardForLLM(result) {
1367
+ if (!result.success || !result.data) {
1368
+ const error = result.error;
1369
+ return [
1370
+ '❌ Failed to retrieve onboarding data',
1371
+ '',
1372
+ `Error: ${error?.message ?? 'Unknown error'}`,
1373
+ error?.suggestion ? `Suggestion: ${error.suggestion}` : '',
1374
+ ]
1375
+ .filter(Boolean)
1376
+ .join('\n');
1377
+ }
1378
+ const data = result.data;
1379
+ const lines = [];
1380
+ // Header
1381
+ lines.push('🚀 **Agent Onboarding**');
1382
+ lines.push('');
1383
+ // Project identity
1384
+ lines.push(`**Project**: ${data.project.name}`);
1385
+ if (data.project.description) {
1386
+ lines.push(` ${data.project.description}`);
1387
+ }
1388
+ if (data.project.status) {
1389
+ lines.push(` Status: ${data.project.status}`);
1390
+ }
1391
+ if (data.tierConfig) {
1392
+ lines.push(` Tier: ${data.tierConfig.label} (${data.tierConfig.tier})`);
1393
+ }
1394
+ // Sprint context
1395
+ if (data.currentSprint) {
1396
+ lines.push('');
1397
+ lines.push(`**Sprint**: ${data.currentSprint.id} - ${data.currentSprint.title}`);
1398
+ if (data.currentSprint.focus) {
1399
+ lines.push(` Focus: ${data.currentSprint.focus}`);
1400
+ }
1401
+ }
1402
+ // Session stats
1403
+ lines.push('');
1404
+ lines.push(`**Sessions**: ${data.sessionStats.totalSessions} total${data.sessionStats.lastActivity ? `, last: ${data.sessionStats.lastActivity}` : ''}`);
1405
+ lines.push('');
1406
+ lines.push(`**Context Size**: ${data.contextSizes.totalSizeKb.toFixed(2)}KB (${data.contextSizes.totalSizeBytes} bytes total)`);
1407
+ if (data.contextSizes.masterContext) {
1408
+ lines.push(` master_context: ${data.contextSizes.masterContext.sizeKb.toFixed(2)}KB (${data.contextSizes.masterContext.usagePercent.toFixed(1)}%)`);
1409
+ }
1410
+ if (data.contextSizes.projectContext) {
1411
+ lines.push(` project_context: ${data.contextSizes.projectContext.sizeKb.toFixed(2)}KB (${data.contextSizes.projectContext.usagePercent.toFixed(1)}%)`);
1412
+ }
1413
+ // Context freshness
1414
+ lines.push('');
1415
+ lines.push(`**Context Freshness**: ${data.contextFreshness.isStale ? 'stale' : 'fresh'}${data.contextFreshness.lagDays !== null
1416
+ ? ` (${data.contextFreshness.lagDays.toFixed(1)} day lag)`
1417
+ : ''}`);
1418
+ lines.push(` master_context.updated_at: ${data.contextFreshness.contextUpdatedAt ?? 'unknown'}`);
1419
+ lines.push(` latest completed activity: ${data.contextFreshness.latestActivityAt ?? 'none'}`);
1420
+ // Sync health (reconciliation)
1421
+ if (data.syncHealth) {
1422
+ lines.push('');
1423
+ if (data.syncHealth.allMatch) {
1424
+ lines.push('**Sync Health**: all tables match');
1425
+ }
1426
+ else {
1427
+ lines.push(`**Sync Health**: ${data.syncHealth.totalMismatches} table(s) mismatched`);
1428
+ for (const m of data.syncHealth.mismatches) {
1429
+ const sign = m.delta > 0 ? '+' : '';
1430
+ lines.push(` ${m.table}: SQLite=${m.sqliteCount} PG=${m.pgCount} (${sign}${m.delta})`);
1431
+ }
1432
+ }
1433
+ if (data.syncHealth.failedEntries > 0) {
1434
+ lines.push(` Failed sync entries: ${data.syncHealth.failedEntries}`);
1435
+ }
1436
+ }
1437
+ // Server health
1438
+ if (data.serverHealth) {
1439
+ lines.push('');
1440
+ const sh = data.serverHealth;
1441
+ const uptimeStr = sh.uptimeSeconds < 60
1442
+ ? `${sh.uptimeSeconds}s`
1443
+ : sh.uptimeSeconds < 3600
1444
+ ? `${Math.floor(sh.uptimeSeconds / 60)}m`
1445
+ : `${Math.floor(sh.uptimeSeconds / 3600)}h ${Math.floor((sh.uptimeSeconds % 3600) / 60)}m`;
1446
+ const buildHash = sh.startupBuild?.buildHash.slice(0, 12) ?? 'unknown';
1447
+ const staleTag = sh.codeIsCurrent ? 'current' : '⚠️ STALE';
1448
+ lines.push(`**Server Health**: pid=${sh.pid} uptime=${uptimeStr} mem=${sh.memoryUsageMb}MB build=${buildHash}… (${staleTag})`);
1449
+ if (sh.stalenessMessage) {
1450
+ lines.push(` ${sh.stalenessMessage}`);
1451
+ }
1452
+ }
1453
+ // Orphan detection
1454
+ if (data.orphans && data.orphans.totalOrphans > 0) {
1455
+ lines.push('');
1456
+ lines.push(`**Orphans**: ${data.orphans.totalOrphans} detected (${data.orphans.orphanedSprints.length} sprint(s), ${data.orphans.orphanedMissions.length} mission(s), ${data.orphans.staleSessions.length} stale session(s))`);
1457
+ }
1458
+ // Messaging
1459
+ if (data.messaging) {
1460
+ lines.push('');
1461
+ lines.push(`**Messaging**: ${data.messaging.unreadCount} unread`);
1462
+ if (data.messaging.recentMessages.length > 0) {
1463
+ for (const msg of data.messaging.recentMessages) {
1464
+ const from = msg.from ? ` from ${msg.from}` : '';
1465
+ lines.push(` • [${msg.type}] ${msg.summary}${from}`);
1466
+ }
1467
+ }
1468
+ }
1469
+ // Active session
1470
+ if (data.activeSession) {
1471
+ lines.push('');
1472
+ lines.push('⚡ **Active Session**');
1473
+ lines.push(` ${data.activeSession.type}: ${data.activeSession.title}`);
1474
+ lines.push(` Captures: ${data.activeSession.captureCount}`);
1475
+ }
1476
+ // Pending missions
1477
+ if (data.pendingMissions.length > 0) {
1478
+ lines.push('');
1479
+ lines.push('📋 **Pending Work**');
1480
+ for (const m of data.pendingMissions) {
1481
+ lines.push(` • ${m.id} (${m.status}): ${m.name}`);
1482
+ }
1483
+ }
1484
+ // Blocked missions
1485
+ if (data.blockedMissions.length > 0) {
1486
+ lines.push('');
1487
+ lines.push('🚫 **Blocked**');
1488
+ for (const m of data.blockedMissions) {
1489
+ lines.push(` • ${m.id}: ${m.name}`);
1490
+ }
1491
+ }
1492
+ // Recent decisions
1493
+ if (data.recentDecisions.length > 0) {
1494
+ lines.push('');
1495
+ lines.push('📝 **Recent Decisions**');
1496
+ for (const d of data.recentDecisions.slice(0, 5)) {
1497
+ const domain = d.domain ? ` [${d.domain}]` : '';
1498
+ lines.push(` • ${d.decision}${domain}`);
1499
+ }
1500
+ }
1501
+ // Next steps
1502
+ if (data.nextSteps.length > 0) {
1503
+ lines.push('');
1504
+ lines.push('➡️ **Next Steps**');
1505
+ for (const step of data.nextSteps) {
1506
+ lines.push(` • ${step}`);
1507
+ }
1508
+ }
1509
+ // Suggested actions
1510
+ if (data.suggestedActions.length > 0) {
1511
+ lines.push('');
1512
+ lines.push('💡 **Suggested Actions**');
1513
+ for (const action of data.suggestedActions.slice(0, 3)) {
1514
+ lines.push(` ${action.priority}. ${action.action}`);
1515
+ lines.push(` → ${action.command}`);
1516
+ }
1517
+ }
1518
+ // Tier behavioral guide
1519
+ if (data.tierConfig?.guide) {
1520
+ lines.push('');
1521
+ lines.push('📖 **Behavioral Guide**');
1522
+ lines.push(data.tierConfig.guide);
1523
+ }
1524
+ if (result.warnings && result.warnings.length > 0) {
1525
+ lines.push('');
1526
+ lines.push('⚠️ **Warnings**');
1527
+ for (const warning of result.warnings) {
1528
+ lines.push(` • ${warning}`);
1529
+ }
1530
+ }
1531
+ return lines.join('\n');
1532
+ }
1533
+ //# sourceMappingURL=cmos-agent-onboard.js.map