@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,816 @@
1
+ "use strict";
2
+ /**
3
+ * cmos_session_complete Tool
4
+ *
5
+ * MCP tool for completing an active session.
6
+ * Captures are aggregated into master context when session completes.
7
+ *
8
+ * @module tools/cmos/cmos-session-complete
9
+ */
10
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ var desc = Object.getOwnPropertyDescriptor(m, k);
13
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
14
+ desc = { enumerable: true, get: function() { return m[k]; } };
15
+ }
16
+ Object.defineProperty(o, k2, desc);
17
+ }) : (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ o[k2] = m[k];
20
+ }));
21
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
22
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
23
+ }) : function(o, v) {
24
+ o["default"] = v;
25
+ });
26
+ var __importStar = (this && this.__importStar) || (function () {
27
+ var ownKeys = function(o) {
28
+ ownKeys = Object.getOwnPropertyNames || function (o) {
29
+ var ar = [];
30
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
31
+ return ar;
32
+ };
33
+ return ownKeys(o);
34
+ };
35
+ return function (mod) {
36
+ if (mod && mod.__esModule) return mod;
37
+ var result = {};
38
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
39
+ __setModuleDefault(result, mod);
40
+ return result;
41
+ };
42
+ })();
43
+ Object.defineProperty(exports, "__esModule", { value: true });
44
+ exports.cmosSessionCompleteToolDefinition = exports.cmosSessionCompleteSchema = void 0;
45
+ exports.cmosSessionComplete = cmosSessionComplete;
46
+ exports.formatSessionCompleteForLLM = formatSessionCompleteForLLM;
47
+ const zod_1 = require("zod");
48
+ const crypto = __importStar(require("crypto"));
49
+ const client_1 = require("./client");
50
+ const errors_1 = require("./errors");
51
+ const content_sanitizer_1 = require("../../intelligence/content-sanitizer");
52
+ const agent_feedback_1 = require("./agent-feedback");
53
+ const context_retention_1 = require("./context-retention");
54
+ const schema_migrations_1 = require("./schema-migrations");
55
+ const learning_reaffirm_1 = require("./learning-reaffirm");
56
+ /**
57
+ * Input parameters schema for cmos_session_complete tool.
58
+ */
59
+ exports.cmosSessionCompleteSchema = zod_1.z.object({
60
+ /** Session ID to complete (optional - uses active session if not provided) */
61
+ sessionId: zod_1.z
62
+ .string()
63
+ .optional()
64
+ .describe('Session ID to complete (uses active session if not provided)'),
65
+ /** Completion summary */
66
+ summary: zod_1.z.string().min(1).max(2000).describe('Summary of what was accomplished in the session'),
67
+ /** Optional next steps */
68
+ nextSteps: zod_1.z.array(zod_1.z.string()).optional().describe('Optional list of next steps or action items'),
69
+ /**
70
+ * Optional decisions captured at session close. Each entry becomes a
71
+ * strategic_decisions row with sprint_id derived from the session.
72
+ */
73
+ decisions: zod_1.z
74
+ .array(zod_1.z.string())
75
+ .optional()
76
+ .describe('Optional list of strategic decisions to materialize into strategic_decisions rows'),
77
+ /** Optional agent name */
78
+ agent: zod_1.z
79
+ .string()
80
+ .default('assistant')
81
+ .optional()
82
+ .describe('Agent completing the session (default: "assistant")'),
83
+ /** Optional free-text UX feedback from the agent (Sprint 56 m03). */
84
+ agentFeedback: zod_1.z
85
+ .string()
86
+ .max(2000)
87
+ .optional()
88
+ .describe('Optional free-text UX feedback. Use this to report rough edges, improvement ideas, or surprising tool behavior you hit during this session. Reviewed periodically via cmos_feedback(action="list").'),
89
+ /**
90
+ * Optional explicit list of learning IDs the session's decisions cite.
91
+ * Bumps `last_reviewed_at` on each — keeps still-true institutional rules
92
+ * out of the staleness pile (Sprint 61 m01).
93
+ */
94
+ citesLearningIds: zod_1.z
95
+ .array(zod_1.z.number().int().positive())
96
+ .optional()
97
+ .describe('Learning IDs the session decisions cite. Bumps last_reviewed_at on each — applies to the decisions[] write path.'),
98
+ /** Optional project root */
99
+ projectRoot: zod_1.z
100
+ .string()
101
+ .optional()
102
+ .describe('Project root directory to search for CMOS database (defaults to cwd)'),
103
+ });
104
+ /**
105
+ * MCP Tool Definition for cmos_session_complete.
106
+ */
107
+ exports.cmosSessionCompleteToolDefinition = {
108
+ name: 'cmos_session_complete',
109
+ description: 'Complete an active session with a summary. Captures are aggregated into master context. Only active sessions can be completed.',
110
+ inputSchema: {
111
+ type: 'object',
112
+ properties: {
113
+ sessionId: {
114
+ type: 'string',
115
+ description: 'Session ID to complete (uses active session if not provided)',
116
+ },
117
+ summary: {
118
+ type: 'string',
119
+ description: 'Summary of what was accomplished in the session',
120
+ minLength: 1,
121
+ maxLength: 2000,
122
+ },
123
+ nextSteps: {
124
+ type: 'array',
125
+ items: { type: 'string' },
126
+ description: 'Optional list of next steps or action items',
127
+ },
128
+ decisions: {
129
+ type: 'array',
130
+ items: { type: 'string' },
131
+ description: 'Optional list of strategic decisions to materialize into strategic_decisions rows',
132
+ },
133
+ agent: {
134
+ type: 'string',
135
+ description: 'Agent completing the session (default: "assistant")',
136
+ },
137
+ agentFeedback: {
138
+ type: 'string',
139
+ maxLength: 2000,
140
+ description: 'Optional free-text UX feedback. Use this to report rough edges, improvement ideas, or surprising tool behavior you hit during this session. Reviewed periodically via cmos_feedback(action="list").',
141
+ },
142
+ citesLearningIds: {
143
+ type: 'array',
144
+ items: { type: 'integer', minimum: 1 },
145
+ description: 'Learning IDs the session decisions cite. Bumps last_reviewed_at on each — applies to the decisions[] write path.',
146
+ },
147
+ projectRoot: {
148
+ type: 'string',
149
+ description: 'Project root directory to search for CMOS database (defaults to cwd)',
150
+ },
151
+ },
152
+ required: ['summary'],
153
+ additionalProperties: false,
154
+ },
155
+ };
156
+ /**
157
+ * Execute the cmos_session_complete tool.
158
+ *
159
+ * Completes an active session and marks it as completed.
160
+ *
161
+ * @param params - Tool parameters
162
+ * @returns CmosToolResult with completion info or actionable error
163
+ */
164
+ async function cmosSessionComplete(params) {
165
+ // Validate parameters
166
+ if (!params.summary || params.summary.trim() === '') {
167
+ return (0, errors_1.createError)(errors_1.CmosErrors.missingParameter('summary'));
168
+ }
169
+ const sanitizedFields = [];
170
+ const summarySan = (0, content_sanitizer_1.sanitizeContentField)(params.summary.trim());
171
+ if (summarySan.wasModified) {
172
+ sanitizedFields.push({ field: 'summary', reason: summarySan.reason ?? '' });
173
+ }
174
+ const summary = summarySan.cleaned;
175
+ const trimmedNextSteps = params.nextSteps?.filter((s) => s && s.trim()) ?? null;
176
+ const nextStepsSan = (0, content_sanitizer_1.sanitizeStringArray)('nextSteps', trimmedNextSteps ?? undefined);
177
+ sanitizedFields.push(...nextStepsSan.sanitizedFields);
178
+ const nextSteps = trimmedNextSteps === null ? null : nextStepsSan.cleaned;
179
+ const trimmedDecisions = params.decisions?.map((d) => d.trim()).filter((d) => d.length > 0) ?? [];
180
+ const decisionsSan = (0, content_sanitizer_1.sanitizeStringArray)('decisions', trimmedDecisions);
181
+ sanitizedFields.push(...decisionsSan.sanitizedFields);
182
+ const decisions = decisionsSan.cleaned;
183
+ const citesLearningIdsSan = (0, learning_reaffirm_1.sanitizeLearningIds)('citesLearningIds', params.citesLearningIds);
184
+ sanitizedFields.push(...citesLearningIdsSan.sanitizedFields);
185
+ const citesLearningIds = citesLearningIdsSan.cleaned;
186
+ const agent = params.agent ?? 'assistant';
187
+ return (0, client_1.withClientValidated)((client) => {
188
+ // Find the session to complete
189
+ let sessionId = params.sessionId;
190
+ if (!sessionId) {
191
+ // Find the active session
192
+ const activeResult = client.getOne('SELECT id FROM sessions WHERE status = ?', [
193
+ 'active',
194
+ ]);
195
+ if (!activeResult.success) {
196
+ return (0, errors_1.createError)(activeResult.error ?? {
197
+ code: 'DB_QUERY_FAILED',
198
+ message: 'Failed to find active session',
199
+ });
200
+ }
201
+ if (!activeResult.data) {
202
+ return (0, errors_1.createError)({
203
+ code: errors_1.CMOS_ERROR_CODES.SESSION_NOT_ACTIVE,
204
+ message: 'No active session found',
205
+ suggestion: 'Start a session first with cmos_session_start, or provide a sessionId',
206
+ });
207
+ }
208
+ sessionId = activeResult.data.id;
209
+ }
210
+ // Get the session and verify it's active
211
+ const sessionResult = client.getOne('SELECT id, type, title, sprint_id, status, captures, started_at FROM sessions WHERE id = ?', [sessionId]);
212
+ if (!sessionResult.success) {
213
+ return (0, errors_1.createError)(sessionResult.error ?? { code: 'DB_QUERY_FAILED', message: 'Failed to query session' });
214
+ }
215
+ if (!sessionResult.data) {
216
+ return (0, errors_1.createError)(errors_1.CmosErrors.sessionNotFound(sessionId));
217
+ }
218
+ const session = sessionResult.data;
219
+ if (session.status !== 'active') {
220
+ return (0, errors_1.createError)({
221
+ code: errors_1.CMOS_ERROR_CODES.SESSION_NOT_ACTIVE,
222
+ message: `Session '${sessionId}' is not active (status: ${session.status})`,
223
+ suggestion: 'Only active sessions can be completed',
224
+ currentState: session.status,
225
+ });
226
+ }
227
+ // Parse captures and count by category
228
+ let captures = [];
229
+ try {
230
+ captures = session.captures ? JSON.parse(session.captures) : [];
231
+ }
232
+ catch {
233
+ captures = [];
234
+ }
235
+ const capturesByCategory = {};
236
+ for (const capture of captures) {
237
+ const cat = capture.category;
238
+ capturesByCategory[cat] = (capturesByCategory[cat] ?? 0) + 1;
239
+ }
240
+ // Calculate duration
241
+ const startedAt = new Date(session.started_at);
242
+ const completedAt = new Date();
243
+ const durationMs = completedAt.getTime() - startedAt.getTime();
244
+ const durationMinutes = Math.round(durationMs / 60000);
245
+ const now = completedAt.toISOString();
246
+ // Update the session
247
+ const updateResult = client.execute(`UPDATE sessions
248
+ SET status = 'completed',
249
+ completed_at = ?,
250
+ summary = ?,
251
+ next_steps = ?
252
+ WHERE id = ?`, [
253
+ now,
254
+ summary,
255
+ nextSteps && nextSteps.length > 0 ? JSON.stringify(nextSteps) : null,
256
+ sessionId,
257
+ ]);
258
+ if (!updateResult.success) {
259
+ return (0, errors_1.createError)({
260
+ code: errors_1.CMOS_ERROR_CODES.DB_QUERY_FAILED,
261
+ message: `Failed to complete session: ${updateResult.error?.message ?? 'Unknown error'}`,
262
+ suggestion: 'Check database permissions',
263
+ });
264
+ }
265
+ // Insert session event
266
+ const rawEvent = JSON.stringify({
267
+ ts: now,
268
+ agent,
269
+ session: sessionId,
270
+ action: 'complete',
271
+ status: 'completed',
272
+ summary,
273
+ nextSteps,
274
+ });
275
+ client.execute(`INSERT INTO session_events (ts, agent, mission, action, status, summary, next_hint, raw_event)
276
+ VALUES (?, ?, ?, 'complete', 'completed', ?, ?, ?)`, [now, agent, sessionId, summary, nextSteps?.join('; ') ?? null, rawEvent]);
277
+ // ============================================================
278
+ // Extract next-steps to structured next_steps table
279
+ // ============================================================
280
+ let nextStepsExtracted = 0;
281
+ if (nextSteps && nextSteps.length > 0) {
282
+ (0, schema_migrations_1.ensureNextStepsTable)(client);
283
+ for (const step of nextSteps) {
284
+ const trimmed = step.trim();
285
+ if (!trimmed)
286
+ continue;
287
+ const hash = (0, schema_migrations_1.computeContentHash)(trimmed, 'next-step');
288
+ // Dedup: skip if same content already exists as pending for this session
289
+ const existing = client.getOne(`SELECT id FROM next_steps WHERE content_hash = ? AND session_id = ?`, [hash, sessionId]);
290
+ if (existing.success && existing.data)
291
+ continue;
292
+ const insertResult = client.execute(`INSERT INTO next_steps (content, status, session_id, sprint_id, created_at, content_hash)
293
+ VALUES (?, 'pending', ?, ?, ?, ?)`, [trimmed, sessionId, session.sprint_id ?? null, now, hash]);
294
+ if (insertResult.success)
295
+ nextStepsExtracted++;
296
+ }
297
+ }
298
+ // Also extract next-step captures from session captures
299
+ for (const capture of captures) {
300
+ if (capture.category === 'next-step' && capture.content) {
301
+ const trimmed = capture.content.trim();
302
+ if (!trimmed)
303
+ continue;
304
+ (0, schema_migrations_1.ensureNextStepsTable)(client);
305
+ const hash = (0, schema_migrations_1.computeContentHash)(trimmed, 'next-step');
306
+ const existing = client.getOne(`SELECT id FROM next_steps WHERE content_hash = ? AND session_id = ?`, [hash, sessionId]);
307
+ if (existing.success && existing.data)
308
+ continue;
309
+ const missionId = capture.missionId ?? null;
310
+ const insertResult = client.execute(`INSERT INTO next_steps (content, status, session_id, sprint_id, mission_id, created_at, content_hash)
311
+ VALUES (?, 'pending', ?, ?, ?, ?, ?)`, [trimmed, sessionId, session.sprint_id ?? null, missionId, now, hash]);
312
+ if (insertResult.success)
313
+ nextStepsExtracted++;
314
+ }
315
+ }
316
+ // ============================================================
317
+ // Extract constraints to structured constraints table
318
+ // ============================================================
319
+ let constraintsExtracted = 0;
320
+ for (const capture of captures) {
321
+ if (capture.category === 'constraint' && capture.content) {
322
+ const trimmed = capture.content.trim();
323
+ if (!trimmed)
324
+ continue;
325
+ (0, schema_migrations_1.ensureConstraintsTable)(client);
326
+ const hash = (0, schema_migrations_1.computeContentHash)(trimmed, 'constraint');
327
+ // Dedup: skip if same content already active
328
+ const existing = client.getOne(`SELECT id FROM constraints WHERE content_hash = ? AND status = 'active'`, [hash]);
329
+ if (existing.success && existing.data)
330
+ continue;
331
+ const expiresAt = capture.expiresAt ?? null;
332
+ const insertResult = client.execute(`INSERT INTO constraints (content, status, session_id, sprint_id, created_at, expires_at, content_hash)
333
+ VALUES (?, 'active', ?, ?, ?, ?, ?)`, [trimmed, sessionId, session.sprint_id ?? null, now, expiresAt, hash]);
334
+ if (insertResult.success)
335
+ constraintsExtracted++;
336
+ }
337
+ }
338
+ // ============================================================
339
+ // Sprint 55 m02: Extract decisions to strategic_decisions
340
+ // ============================================================
341
+ // Two sources feed this block:
342
+ // (1) The `decisions[]` parameter passed to session-complete — the
343
+ // primary use case. These had no persistence path before the
344
+ // fix; OODS-Foundry-MCP retros lost entire decision corpora
345
+ // because cmos_decisions(list) couldn't surface them.
346
+ // (2) Decision-category captures already on the session. The
347
+ // capture path eagerly promotes these so the dedup SELECT will
348
+ // skip them, but the defensive second pass protects against
349
+ // captures that landed in session.captures without going
350
+ // through cmos_session_capture (e.g., future synthetic paths).
351
+ //
352
+ // Sprint_id is inherited from the session. project_domain is pulled
353
+ // from the metadata table. Dedup is (decision_text, session_id) —
354
+ // the same key cmos_session_capture uses. FTS5 is maintained by the
355
+ // decisions_fts_insert trigger, so no explicit index work is needed.
356
+ let decisionsExtracted = 0;
357
+ const decisionSources = [...decisions];
358
+ for (const capture of captures) {
359
+ if (capture.category === 'decision' && typeof capture.content === 'string') {
360
+ const trimmed = capture.content.trim();
361
+ if (trimmed && !decisionSources.includes(trimmed))
362
+ decisionSources.push(trimmed);
363
+ }
364
+ }
365
+ if (decisionSources.length > 0) {
366
+ const domainResult = client.getOne("SELECT value FROM metadata WHERE key = 'project_domain'", []);
367
+ const projectDomain = domainResult.success ? (domainResult.data?.value ?? null) : null;
368
+ for (const decisionText of decisionSources) {
369
+ const existing = client.getOne('SELECT id FROM strategic_decisions WHERE decision_text = ? AND session_id = ?', [decisionText, sessionId]);
370
+ if (existing.success && existing.data)
371
+ continue;
372
+ const insertResult = client.execute(`INSERT INTO strategic_decisions
373
+ (decision_text, created_at, sprint_id, project_domain, session_id)
374
+ VALUES (?, ?, ?, ?, ?)`, [decisionText, now, session.sprint_id ?? null, projectDomain, sessionId]);
375
+ if (insertResult.success)
376
+ decisionsExtracted++;
377
+ }
378
+ }
379
+ // ============================================================
380
+ // Sprint 61 m01 — auto-reaffirm cited learnings.
381
+ // Explicit IDs from `citesLearningIds[]` always bump. Implicit overlap
382
+ // runs once per decision text; matches are merged before applying so
383
+ // each learning is touched at most once per session-complete call.
384
+ // ============================================================
385
+ const explicitlyReaffirmedSet = new Set();
386
+ const implicitlyReaffirmedSet = new Set();
387
+ const missingCitedSet = new Set();
388
+ if (citesLearningIds.length > 0 || decisionSources.length > 0) {
389
+ for (let i = 0; i < Math.max(decisionSources.length, 1); i++) {
390
+ const decisionText = decisionSources[i] ?? '';
391
+ // Apply explicit IDs only on the first pass; later passes use [] so
392
+ // we don't repeatedly bump the same explicit set.
393
+ const explicitForThisPass = i === 0 ? citesLearningIds : [];
394
+ const reaffirm = (0, learning_reaffirm_1.applyLearningReaffirm)(client, {
395
+ explicitIds: explicitForThisPass,
396
+ newContent: decisionText,
397
+ reaffirmedAt: now,
398
+ });
399
+ for (const id of reaffirm.explicitlyReaffirmedIds) {
400
+ explicitlyReaffirmedSet.add(id);
401
+ }
402
+ for (const id of reaffirm.implicitlyReaffirmedIds) {
403
+ // An ID already explicitly bumped this call should not also count as implicit.
404
+ if (!explicitlyReaffirmedSet.has(id)) {
405
+ implicitlyReaffirmedSet.add(id);
406
+ }
407
+ }
408
+ for (const id of reaffirm.missingIds) {
409
+ missingCitedSet.add(id);
410
+ }
411
+ }
412
+ }
413
+ // ============================================================
414
+ // Context Aggregation (matches Python SessionRuntime behavior)
415
+ // ============================================================
416
+ const aggregation = aggregateSessionIntoContexts(client, {
417
+ sessionId,
418
+ sprintId: session.sprint_id,
419
+ sessionType: session.type,
420
+ sessionTitle: session.title,
421
+ captures: captures,
422
+ summary,
423
+ completedAt: now,
424
+ agent,
425
+ nextSteps: nextSteps && nextSteps.length > 0 ? nextSteps : null,
426
+ });
427
+ // Sprint closeout guardrail
428
+ const warnings = [];
429
+ if (session.sprint_id) {
430
+ const totalResult = client.getOne('SELECT COUNT(*) as count FROM missions WHERE sprint_id = ?', [session.sprint_id]);
431
+ const remainingResult = client.getOne("SELECT COUNT(*) as count FROM missions WHERE sprint_id = ? AND status != 'Completed'", [session.sprint_id]);
432
+ if (totalResult.success &&
433
+ remainingResult.success &&
434
+ totalResult.data &&
435
+ remainingResult.data &&
436
+ totalResult.data.count > 0 &&
437
+ remainingResult.data.count === 0) {
438
+ warnings.push(`All sprint missions are complete. Consider closing the sprint with cmos_sprint(action="complete").`);
439
+ }
440
+ }
441
+ let feedbackId;
442
+ if (params.agentFeedback && params.agentFeedback.trim().length > 0) {
443
+ const fbResult = (0, agent_feedback_1.recordAgentFeedback)(client, params.agentFeedback, {
444
+ toolName: 'cmos_session_complete',
445
+ sessionId,
446
+ sprintId: session.sprint_id ?? null,
447
+ });
448
+ if (fbResult.feedbackId !== null) {
449
+ feedbackId = fbResult.feedbackId;
450
+ }
451
+ if (fbResult.sanitizedFields.length > 0) {
452
+ sanitizedFields.push(...fbResult.sanitizedFields);
453
+ }
454
+ }
455
+ const explicitlyReaffirmedLearningIds = explicitlyReaffirmedSet.size > 0
456
+ ? Array.from(explicitlyReaffirmedSet).sort((a, b) => a - b)
457
+ : undefined;
458
+ const implicitlyReaffirmedLearningIds = implicitlyReaffirmedSet.size > 0
459
+ ? Array.from(implicitlyReaffirmedSet).sort((a, b) => a - b)
460
+ : undefined;
461
+ const missingCitedLearningIds = missingCitedSet.size > 0 ? Array.from(missingCitedSet).sort((a, b) => a - b) : undefined;
462
+ return (0, errors_1.createSuccess)({
463
+ sessionId,
464
+ type: session.type,
465
+ title: session.title,
466
+ summary,
467
+ completedAt: now,
468
+ durationMinutes,
469
+ captureCount: captures.length,
470
+ capturesByCategory,
471
+ nextSteps: nextSteps && nextSteps.length > 0 ? nextSteps : null,
472
+ nextStepsExtracted,
473
+ decisionsExtracted,
474
+ constraintsExtracted,
475
+ aggregation,
476
+ message: `Session '${sessionId}' completed (${captures.length} captures, ${durationMinutes}min, ${nextStepsExtracted} next-steps extracted, ${decisionsExtracted} decisions extracted, ${constraintsExtracted} constraints extracted)`,
477
+ ...(feedbackId !== undefined ? { feedbackId } : {}),
478
+ ...(explicitlyReaffirmedLearningIds ? { explicitlyReaffirmedLearningIds } : {}),
479
+ ...(implicitlyReaffirmedLearningIds ? { implicitlyReaffirmedLearningIds } : {}),
480
+ ...(missingCitedLearningIds ? { missingCitedLearningIds } : {}),
481
+ }, warnings, sanitizedFields);
482
+ }, { projectRoot: params.projectRoot });
483
+ }
484
+ /**
485
+ * Format session complete result for LLM readability.
486
+ */
487
+ function formatSessionCompleteForLLM(result) {
488
+ if (!result.success || !result.data) {
489
+ const error = result.error;
490
+ const lines = [
491
+ '❌ Failed to complete session',
492
+ '',
493
+ `Error: ${error?.message ?? 'Unknown error'}`,
494
+ ];
495
+ if (error?.suggestion) {
496
+ lines.push('');
497
+ lines.push(`Suggestion: ${error.suggestion}`);
498
+ }
499
+ return lines.join('\n');
500
+ }
501
+ const data = result.data;
502
+ const lines = [
503
+ `✅ **Session Completed**`,
504
+ '',
505
+ `**Session**: ${data.sessionId}`,
506
+ `**Type**: ${data.type}`,
507
+ `**Title**: ${data.title}`,
508
+ `**Duration**: ${data.durationMinutes} minutes`,
509
+ `**Captures**: ${data.captureCount}`,
510
+ ];
511
+ // Add capture breakdown if any
512
+ const categories = Object.entries(data.capturesByCategory);
513
+ if (categories.length > 0) {
514
+ lines.push('');
515
+ lines.push('**Capture Breakdown**:');
516
+ for (const [cat, count] of categories) {
517
+ lines.push(` - ${cat}: ${count}`);
518
+ }
519
+ }
520
+ lines.push('');
521
+ lines.push(`**Summary**: ${data.summary}`);
522
+ if (data.nextSteps && data.nextSteps.length > 0) {
523
+ lines.push('');
524
+ lines.push('**Next Steps**:');
525
+ for (const step of data.nextSteps) {
526
+ lines.push(` - ${step}`);
527
+ }
528
+ }
529
+ // Aggregation info
530
+ if (data.aggregation?.contextsUpdated) {
531
+ lines.push('');
532
+ lines.push('**Context Aggregation**:');
533
+ const routed = data.aggregation.capturesRouted;
534
+ const routedEntries = Object.entries(routed).filter(([, v]) => v > 0);
535
+ if (routedEntries.length > 0) {
536
+ for (const [cat, count] of routedEntries) {
537
+ lines.push(` - ${cat}: ${count} routed to master_context`);
538
+ }
539
+ }
540
+ else {
541
+ lines.push(' - No captures to route');
542
+ }
543
+ }
544
+ return lines.join('\n');
545
+ }
546
+ const VALID_CAPTURE_CATEGORIES = ['decision', 'learning', 'constraint', 'context', 'next-step'];
547
+ /**
548
+ * Aggregate session captures into both contexts on session completion.
549
+ * Matches Python SessionRuntime.complete_session() behavior.
550
+ */
551
+ function aggregateSessionIntoContexts(client, params) {
552
+ const { sessionId, sprintId, sessionType, sessionTitle, captures, summary, completedAt, agent, nextSteps, } = params;
553
+ // Load both contexts
554
+ const projectContext = loadContext(client, 'project_context');
555
+ const masterContext = loadContext(client, 'master_context');
556
+ const retentionPolicy = (0, context_retention_1.getContextRetentionPolicy)();
557
+ // Step 1: Apply captures to master_context
558
+ const capturesRouted = applyCapturesToMaster(masterContext, captures, sessionId);
559
+ // Step 2: Record session history in project_context
560
+ recordSessionHistory(projectContext, {
561
+ sessionId,
562
+ sprintId,
563
+ sessionType,
564
+ ts: completedAt,
565
+ agent,
566
+ summary,
567
+ });
568
+ // Step 3: Append recent session to both contexts
569
+ appendRecentSession(projectContext, {
570
+ id: sessionId,
571
+ sprintId,
572
+ type: sessionType,
573
+ title: sessionTitle,
574
+ summary,
575
+ completedAt,
576
+ capturesRouted,
577
+ underWorkingMemory: true,
578
+ limit: 25,
579
+ });
580
+ // recent_sessions no longer stored in master_context blob.
581
+ // Sessions are queryable from the sessions table (Sprint 51 blob reduction).
582
+ // Step 4: Record next steps in both contexts
583
+ if (nextSteps && nextSteps.length > 0) {
584
+ recordNextSteps(projectContext, masterContext, sessionId, nextSteps);
585
+ }
586
+ // Step 5: Condense detail for completed sprints
587
+ const projectCondensation = (0, context_retention_1.condenseContextForRetention)(client, 'project_context', projectContext, {
588
+ source: `session_complete:${sessionId}`,
589
+ policy: retentionPolicy,
590
+ });
591
+ const masterCondensation = (0, context_retention_1.condenseContextForRetention)(client, 'master_context', masterContext, {
592
+ source: `session_complete:${sessionId}`,
593
+ policy: retentionPolicy,
594
+ });
595
+ // Step 6: Update context health after condensation
596
+ updateContextHealth(projectContext, completedAt, retentionPolicy);
597
+ updateContextHealth(masterContext, completedAt, retentionPolicy);
598
+ // Step 7: Persist both contexts with snapshots
599
+ const projectSnapshotId = persistContext(client, 'project_context', projectContext, sessionId, `session_complete:${sessionId}`);
600
+ const masterSnapshotId = persistContext(client, 'master_context', masterContext, sessionId, `session_complete:${sessionId}`);
601
+ return {
602
+ capturesRouted,
603
+ contextsUpdated: true,
604
+ projectSnapshotId,
605
+ masterSnapshotId,
606
+ condensation: {
607
+ projectArchivedSprints: projectCondensation.archivedSprintIds,
608
+ masterArchivedSprints: masterCondensation.archivedSprintIds,
609
+ projectArchiveSnapshotId: projectCondensation.archiveSnapshotId,
610
+ masterArchiveSnapshotId: masterCondensation.archiveSnapshotId,
611
+ },
612
+ };
613
+ }
614
+ /**
615
+ * Load and parse a context from the database.
616
+ */
617
+ function loadContext(client, contextId) {
618
+ const result = client.getOne('SELECT id, content FROM contexts WHERE id = ?', [
619
+ contextId,
620
+ ]);
621
+ if (result.success && result.data?.content) {
622
+ try {
623
+ return JSON.parse(result.data.content);
624
+ }
625
+ catch {
626
+ return {};
627
+ }
628
+ }
629
+ return {};
630
+ }
631
+ /**
632
+ * Route session captures to appropriate master_context arrays.
633
+ * Matches Python _apply_captures_to_master().
634
+ */
635
+ function applyCapturesToMaster(masterContext, captures, sessionId) {
636
+ if (!captures.length)
637
+ return {};
638
+ const counts = {};
639
+ // decisions_made and learnings are no longer stored in the blob.
640
+ // They are queryable from strategic_decisions and learnings tables (Sprint 51 blob reduction).
641
+ const constraints = ensureArray(masterContext, 'constraints');
642
+ const notes = ensureArray(masterContext, 'context_notes');
643
+ const nextSession = ensureObject(masterContext, 'next_session_context');
644
+ const resume = ensureArray(nextSession, 'when_we_resume');
645
+ for (const capture of captures) {
646
+ const category = (capture.category || '').trim().toLowerCase();
647
+ const content = (capture.content || '').trim();
648
+ if (!content || !VALID_CAPTURE_CATEGORIES.includes(category))
649
+ continue;
650
+ counts[category] = (counts[category] ?? 0) + 1;
651
+ if (category === 'constraint') {
652
+ if (!constraintExists(constraints, content)) {
653
+ constraints.push(content);
654
+ }
655
+ }
656
+ else if (category === 'context') {
657
+ notes.push(content);
658
+ }
659
+ else if (category === 'next-step') {
660
+ const entry = `${sessionId}: ${content}`;
661
+ if (!resume.includes(entry)) {
662
+ resume.push(entry);
663
+ if (resume.length > 25)
664
+ resume.splice(0, resume.length - 25);
665
+ }
666
+ }
667
+ }
668
+ return counts;
669
+ }
670
+ /**
671
+ * Record session in project_context.working_memory.session_history.
672
+ * Matches Python _record_session_history().
673
+ */
674
+ function recordSessionHistory(projectContext, opts) {
675
+ const working = ensureObject(projectContext, 'working_memory');
676
+ const history = ensureArray(working, 'session_history');
677
+ history.push({
678
+ session: opts.sessionId,
679
+ sprint_id: opts.sprintId,
680
+ session_type: opts.sessionType,
681
+ agent: opts.agent,
682
+ summary: opts.summary,
683
+ action: 'complete',
684
+ ts: opts.ts,
685
+ });
686
+ if (history.length > 50)
687
+ history.splice(0, history.length - 50);
688
+ working['last_session'] = opts.ts;
689
+ }
690
+ /**
691
+ * Append session metadata to context.
692
+ * Matches Python _append_recent_session().
693
+ */
694
+ function appendRecentSession(context, opts) {
695
+ const parent = opts.underWorkingMemory ? ensureObject(context, 'working_memory') : context;
696
+ const key = opts.targetKey ?? 'recent_sessions';
697
+ const container = ensureArray(parent, key);
698
+ const captureCount = Object.values(opts.capturesRouted).reduce((a, b) => a + b, 0);
699
+ const sanitizedCaptures = {};
700
+ for (const [k, v] of Object.entries(opts.capturesRouted)) {
701
+ if (v > 0)
702
+ sanitizedCaptures[k] = v;
703
+ }
704
+ const entry = {
705
+ id: opts.id,
706
+ sprint_id: opts.sprintId,
707
+ session_type: opts.type,
708
+ type: opts.type,
709
+ title: opts.title,
710
+ summary: opts.summary,
711
+ completed_at: opts.completedAt,
712
+ capture_count: captureCount,
713
+ };
714
+ if (Object.keys(sanitizedCaptures).length > 0) {
715
+ entry['captures'] = sanitizedCaptures;
716
+ }
717
+ container.push(entry);
718
+ if (container.length > opts.limit)
719
+ container.splice(0, container.length - opts.limit);
720
+ }
721
+ /**
722
+ * Record next steps in both contexts.
723
+ * Matches Python _record_next_steps().
724
+ */
725
+ function recordNextSteps(projectContext, masterContext, sessionId, nextSteps) {
726
+ const cleaned = nextSteps.map((s) => s.trim()).filter(Boolean);
727
+ if (!cleaned.length)
728
+ return;
729
+ // Project context: working_memory.next_steps
730
+ const working = ensureObject(projectContext, 'working_memory');
731
+ const todo = ensureArray(working, 'next_steps');
732
+ for (const note of cleaned) {
733
+ const entry = `${sessionId}: ${note}`;
734
+ if (!todo.includes(entry))
735
+ todo.push(entry);
736
+ }
737
+ if (todo.length > 25)
738
+ todo.splice(0, todo.length - 25);
739
+ // Master context: next_session_context.when_we_resume
740
+ const nextSession = ensureObject(masterContext, 'next_session_context');
741
+ const resume = ensureArray(nextSession, 'when_we_resume');
742
+ for (const note of cleaned) {
743
+ const entry = `${sessionId}: ${note}`;
744
+ if (!resume.includes(entry))
745
+ resume.push(entry);
746
+ }
747
+ if (resume.length > 25)
748
+ resume.splice(0, resume.length - 25);
749
+ }
750
+ /**
751
+ * Update context health metrics.
752
+ * Matches Python _update_context_health().
753
+ */
754
+ function updateContextHealth(context, ts, policy) {
755
+ const health = ensureObject(context, 'context_health');
756
+ health['sessions_since_reset'] = (Number(health['sessions_since_reset']) || 0) + 1;
757
+ health['last_update'] = ts;
758
+ const serialized = JSON.stringify(context);
759
+ health['size_kb'] =
760
+ Math.round((new TextEncoder().encode(serialized).byteLength / 1024) * 100) / 100;
761
+ health['size_limit_kb'] = Number(health['size_limit_kb']) || policy.sizeLimitKb;
762
+ health['warning_threshold_percent'] =
763
+ Number(health['warning_threshold_percent']) || policy.warningThresholdPercent;
764
+ health['retention_keep_sprints'] =
765
+ Number(health['retention_keep_sprints']) || policy.keepDetailSprints;
766
+ }
767
+ /**
768
+ * Persist a context to the database and create a snapshot.
769
+ */
770
+ function persistContext(client, contextId, content, sessionId, snapshotSource) {
771
+ const now = new Date().toISOString();
772
+ const contentStr = JSON.stringify(content);
773
+ // Check if context exists
774
+ const existing = client.getOne('SELECT id FROM contexts WHERE id = ?', [
775
+ contextId,
776
+ ]);
777
+ if (existing.success && existing.data) {
778
+ client.execute('UPDATE contexts SET content = ?, updated_at = ? WHERE id = ?', [
779
+ contentStr,
780
+ now,
781
+ contextId,
782
+ ]);
783
+ }
784
+ else {
785
+ const sourcePath = contextId === 'master_context'
786
+ ? 'context/MASTER_CONTEXT.json'
787
+ : 'context/PROJECT_CONTEXT.json';
788
+ client.execute('INSERT INTO contexts (id, source_path, content, updated_at) VALUES (?, ?, ?, ?)', [contextId, sourcePath, contentStr, now]);
789
+ }
790
+ // Create snapshot with dedup
791
+ const contentHash = crypto.createHash('sha256').update(contentStr).digest('hex').substring(0, 16);
792
+ const existingSnapshot = client.getOne('SELECT id FROM context_snapshots WHERE context_id = ? AND content_hash = ?', [contextId, contentHash]);
793
+ if (existingSnapshot.success && existingSnapshot.data) {
794
+ return existingSnapshot.data.id;
795
+ }
796
+ const insertResult = client.execute(`INSERT INTO context_snapshots (context_id, session_id, source, content_hash, content, created_at)
797
+ VALUES (?, ?, ?, ?, ?, ?)`, [contextId, sessionId, snapshotSource, contentHash, contentStr, now]);
798
+ return insertResult.success ? Number(insertResult.data?.lastInsertRowid) : null;
799
+ }
800
+ // ---- Utility helpers ----
801
+ function ensureArray(obj, key) {
802
+ if (!Array.isArray(obj[key]))
803
+ obj[key] = [];
804
+ return obj[key];
805
+ }
806
+ function ensureObject(obj, key) {
807
+ if (!obj[key] || typeof obj[key] !== 'object' || Array.isArray(obj[key])) {
808
+ obj[key] = {};
809
+ }
810
+ return obj[key];
811
+ }
812
+ function constraintExists(existing, candidate) {
813
+ const normalized = candidate.trim().toLowerCase();
814
+ return existing.some((item) => typeof item === 'string' && item.trim().toLowerCase() === normalized);
815
+ }
816
+ //# sourceMappingURL=cmos-session-complete.js.map