@soleri/core 9.0.4 → 9.2.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 (701) hide show
  1. package/dist/brain/intelligence.d.ts +27 -0
  2. package/dist/brain/intelligence.d.ts.map +1 -1
  3. package/dist/brain/intelligence.js +160 -14
  4. package/dist/brain/intelligence.js.map +1 -1
  5. package/dist/brain/learning-radar.d.ts +4 -0
  6. package/dist/brain/learning-radar.d.ts.map +1 -1
  7. package/dist/brain/learning-radar.js +20 -1
  8. package/dist/brain/learning-radar.js.map +1 -1
  9. package/dist/brain/strength-scorer.d.ts +31 -0
  10. package/dist/brain/strength-scorer.d.ts.map +1 -0
  11. package/dist/brain/strength-scorer.js +264 -0
  12. package/dist/brain/strength-scorer.js.map +1 -0
  13. package/dist/chat/agent-loop.d.ts.map +1 -1
  14. package/dist/chat/agent-loop.js +2 -0
  15. package/dist/chat/agent-loop.js.map +1 -1
  16. package/dist/chat/notifications.d.ts.map +1 -1
  17. package/dist/chat/notifications.js +2 -0
  18. package/dist/chat/notifications.js.map +1 -1
  19. package/dist/claudemd/compose.js +1 -1
  20. package/dist/claudemd/compose.js.map +1 -1
  21. package/dist/control/intent-router.d.ts.map +1 -1
  22. package/dist/control/intent-router.js +12 -4
  23. package/dist/control/intent-router.js.map +1 -1
  24. package/dist/curator/contradiction-detector.d.ts +27 -0
  25. package/dist/curator/contradiction-detector.d.ts.map +1 -0
  26. package/dist/curator/contradiction-detector.js +62 -0
  27. package/dist/curator/contradiction-detector.js.map +1 -0
  28. package/dist/curator/curator.d.ts +3 -4
  29. package/dist/curator/curator.d.ts.map +1 -1
  30. package/dist/curator/curator.js +90 -525
  31. package/dist/curator/curator.js.map +1 -1
  32. package/dist/curator/duplicate-detector.d.ts +14 -0
  33. package/dist/curator/duplicate-detector.d.ts.map +1 -0
  34. package/dist/curator/duplicate-detector.js +77 -0
  35. package/dist/curator/duplicate-detector.js.map +1 -0
  36. package/dist/curator/health-audit.d.ts +15 -0
  37. package/dist/curator/health-audit.d.ts.map +1 -0
  38. package/dist/curator/health-audit.js +97 -0
  39. package/dist/curator/health-audit.js.map +1 -0
  40. package/dist/curator/metadata-enricher.d.ts +17 -0
  41. package/dist/curator/metadata-enricher.d.ts.map +1 -0
  42. package/dist/curator/metadata-enricher.js +60 -0
  43. package/dist/curator/metadata-enricher.js.map +1 -0
  44. package/dist/curator/schema.d.ts +7 -0
  45. package/dist/curator/schema.d.ts.map +1 -0
  46. package/dist/curator/schema.js +62 -0
  47. package/dist/curator/schema.js.map +1 -0
  48. package/dist/curator/tag-manager.d.ts +36 -0
  49. package/dist/curator/tag-manager.d.ts.map +1 -0
  50. package/dist/curator/tag-manager.js +78 -0
  51. package/dist/curator/tag-manager.js.map +1 -0
  52. package/dist/engine/bin/soleri-engine.js +24 -3
  53. package/dist/engine/bin/soleri-engine.js.map +1 -1
  54. package/dist/engine/core-ops.d.ts.map +1 -1
  55. package/dist/engine/core-ops.js +23 -8
  56. package/dist/engine/core-ops.js.map +1 -1
  57. package/dist/engine/module-manifest.d.ts.map +1 -1
  58. package/dist/engine/module-manifest.js +22 -2
  59. package/dist/engine/module-manifest.js.map +1 -1
  60. package/dist/engine/register-engine.d.ts.map +1 -1
  61. package/dist/engine/register-engine.js +26 -2
  62. package/dist/engine/register-engine.js.map +1 -1
  63. package/dist/errors/retry.d.ts.map +1 -1
  64. package/dist/errors/retry.js +2 -0
  65. package/dist/errors/retry.js.map +1 -1
  66. package/dist/facades/types.d.ts +1 -1
  67. package/dist/flows/chain-types.d.ts +18 -18
  68. package/dist/flows/gate-evaluator.d.ts.map +1 -1
  69. package/dist/flows/gate-evaluator.js +22 -0
  70. package/dist/flows/gate-evaluator.js.map +1 -1
  71. package/dist/flows/types.d.ts +157 -28
  72. package/dist/flows/types.d.ts.map +1 -1
  73. package/dist/flows/types.js +4 -0
  74. package/dist/flows/types.js.map +1 -1
  75. package/dist/index.d.ts +10 -2
  76. package/dist/index.d.ts.map +1 -1
  77. package/dist/index.js +9 -1
  78. package/dist/index.js.map +1 -1
  79. package/dist/intake/intake-pipeline.d.ts.map +1 -1
  80. package/dist/intake/intake-pipeline.js +1 -0
  81. package/dist/intake/intake-pipeline.js.map +1 -1
  82. package/dist/intake/text-ingester.d.ts.map +1 -1
  83. package/dist/intake/text-ingester.js +2 -0
  84. package/dist/intake/text-ingester.js.map +1 -1
  85. package/dist/llm/key-pool.d.ts +1 -1
  86. package/dist/llm/key-pool.d.ts.map +1 -1
  87. package/dist/llm/key-pool.js +3 -4
  88. package/dist/llm/key-pool.js.map +1 -1
  89. package/dist/llm/utils.d.ts.map +1 -1
  90. package/dist/llm/utils.js +2 -0
  91. package/dist/llm/utils.js.map +1 -1
  92. package/dist/migrations/migration-runner.test-helpers.d.ts +13 -0
  93. package/dist/migrations/migration-runner.test-helpers.d.ts.map +1 -0
  94. package/dist/migrations/migration-runner.test-helpers.js +47 -0
  95. package/dist/migrations/migration-runner.test-helpers.js.map +1 -0
  96. package/dist/operator/operator-profile.d.ts +44 -0
  97. package/dist/operator/operator-profile.d.ts.map +1 -0
  98. package/dist/operator/operator-profile.js +377 -0
  99. package/dist/operator/operator-profile.js.map +1 -0
  100. package/dist/operator/operator-signals.d.ts +45 -0
  101. package/dist/operator/operator-signals.d.ts.map +1 -0
  102. package/dist/operator/operator-signals.js +228 -0
  103. package/dist/operator/operator-signals.js.map +1 -0
  104. package/dist/operator/operator-types.d.ts +360 -0
  105. package/dist/operator/operator-types.d.ts.map +1 -0
  106. package/dist/operator/operator-types.js +24 -0
  107. package/dist/operator/operator-types.js.map +1 -0
  108. package/dist/packs/types.d.ts +27 -27
  109. package/dist/paths.d.ts +40 -0
  110. package/dist/paths.d.ts.map +1 -0
  111. package/dist/paths.js +98 -0
  112. package/dist/paths.js.map +1 -0
  113. package/dist/persistence/index.d.ts +1 -1
  114. package/dist/persistence/index.d.ts.map +1 -1
  115. package/dist/persistence/index.js +1 -1
  116. package/dist/persistence/index.js.map +1 -1
  117. package/dist/persistence/sqlite-provider.d.ts +2 -0
  118. package/dist/persistence/sqlite-provider.d.ts.map +1 -1
  119. package/dist/persistence/sqlite-provider.js +8 -5
  120. package/dist/persistence/sqlite-provider.js.map +1 -1
  121. package/dist/planning/evidence-collector.d.ts +13 -1
  122. package/dist/planning/evidence-collector.d.ts.map +1 -1
  123. package/dist/planning/evidence-collector.js +33 -0
  124. package/dist/planning/evidence-collector.js.map +1 -1
  125. package/dist/planning/gap-analysis.d.ts +5 -4
  126. package/dist/planning/gap-analysis.d.ts.map +1 -1
  127. package/dist/planning/gap-analysis.js +7 -341
  128. package/dist/planning/gap-analysis.js.map +1 -1
  129. package/dist/planning/gap-passes.d.ts +19 -0
  130. package/dist/planning/gap-passes.d.ts.map +1 -0
  131. package/dist/planning/gap-passes.js +157 -0
  132. package/dist/planning/gap-passes.js.map +1 -0
  133. package/dist/planning/gap-patterns.d.ts +29 -0
  134. package/dist/planning/gap-patterns.d.ts.map +1 -0
  135. package/dist/planning/gap-patterns.js +129 -0
  136. package/dist/planning/gap-patterns.js.map +1 -0
  137. package/dist/planning/gap-types.d.ts +1 -1
  138. package/dist/planning/gap-types.d.ts.map +1 -1
  139. package/dist/planning/gap-types.js +1 -0
  140. package/dist/planning/gap-types.js.map +1 -1
  141. package/dist/planning/github-projection.d.ts +122 -0
  142. package/dist/planning/github-projection.d.ts.map +1 -0
  143. package/dist/planning/github-projection.js +294 -0
  144. package/dist/planning/github-projection.js.map +1 -0
  145. package/dist/planning/impact-analyzer.d.ts +26 -0
  146. package/dist/planning/impact-analyzer.d.ts.map +1 -0
  147. package/dist/planning/impact-analyzer.js +199 -0
  148. package/dist/planning/impact-analyzer.js.map +1 -0
  149. package/dist/planning/plan-lifecycle.d.ts +136 -0
  150. package/dist/planning/plan-lifecycle.d.ts.map +1 -0
  151. package/dist/planning/plan-lifecycle.js +296 -0
  152. package/dist/planning/plan-lifecycle.js.map +1 -0
  153. package/dist/planning/planner-types.d.ts +202 -0
  154. package/dist/planning/planner-types.d.ts.map +1 -0
  155. package/dist/planning/planner-types.js +6 -0
  156. package/dist/planning/planner-types.js.map +1 -0
  157. package/dist/planning/planner.d.ts +31 -383
  158. package/dist/planning/planner.d.ts.map +1 -1
  159. package/dist/planning/planner.js +154 -878
  160. package/dist/planning/planner.js.map +1 -1
  161. package/dist/planning/rationalization-detector.d.ts +32 -0
  162. package/dist/planning/rationalization-detector.d.ts.map +1 -0
  163. package/dist/planning/rationalization-detector.js +89 -0
  164. package/dist/planning/rationalization-detector.js.map +1 -0
  165. package/dist/planning/reconciliation-engine.d.ts +47 -0
  166. package/dist/planning/reconciliation-engine.d.ts.map +1 -0
  167. package/dist/planning/reconciliation-engine.js +128 -0
  168. package/dist/planning/reconciliation-engine.js.map +1 -0
  169. package/dist/planning/task-verifier.d.ts +85 -0
  170. package/dist/planning/task-verifier.d.ts.map +1 -0
  171. package/dist/planning/task-verifier.js +227 -0
  172. package/dist/planning/task-verifier.js.map +1 -0
  173. package/dist/plugins/types.d.ts +4 -4
  174. package/dist/runtime/admin-ops.d.ts +2 -2
  175. package/dist/runtime/admin-ops.d.ts.map +1 -1
  176. package/dist/runtime/admin-ops.js +44 -17
  177. package/dist/runtime/admin-ops.js.map +1 -1
  178. package/dist/runtime/admin-setup-ops.d.ts.map +1 -1
  179. package/dist/runtime/admin-setup-ops.js +21 -46
  180. package/dist/runtime/admin-setup-ops.js.map +1 -1
  181. package/dist/runtime/archive-ops.d.ts +10 -0
  182. package/dist/runtime/archive-ops.d.ts.map +1 -0
  183. package/dist/runtime/archive-ops.js +310 -0
  184. package/dist/runtime/archive-ops.js.map +1 -0
  185. package/dist/runtime/capture-ops.d.ts.map +1 -1
  186. package/dist/runtime/capture-ops.js +42 -7
  187. package/dist/runtime/capture-ops.js.map +1 -1
  188. package/dist/runtime/claude-md-helpers.js +1 -1
  189. package/dist/runtime/claude-md-helpers.js.map +1 -1
  190. package/dist/runtime/context-health.d.ts +31 -0
  191. package/dist/runtime/context-health.d.ts.map +1 -0
  192. package/dist/runtime/context-health.js +57 -0
  193. package/dist/runtime/context-health.js.map +1 -0
  194. package/dist/runtime/facades/archive-facade.d.ts +10 -0
  195. package/dist/runtime/facades/archive-facade.d.ts.map +1 -0
  196. package/dist/runtime/facades/archive-facade.js +11 -0
  197. package/dist/runtime/facades/archive-facade.js.map +1 -0
  198. package/dist/runtime/facades/brain-facade.d.ts.map +1 -1
  199. package/dist/runtime/facades/brain-facade.js +2 -0
  200. package/dist/runtime/facades/brain-facade.js.map +1 -1
  201. package/dist/runtime/facades/chat-facade.d.ts +7 -0
  202. package/dist/runtime/facades/chat-facade.d.ts.map +1 -1
  203. package/dist/runtime/facades/chat-facade.js +15 -800
  204. package/dist/runtime/facades/chat-facade.js.map +1 -1
  205. package/dist/runtime/facades/chat-service-ops.d.ts +9 -0
  206. package/dist/runtime/facades/chat-service-ops.d.ts.map +1 -0
  207. package/dist/runtime/facades/chat-service-ops.js +330 -0
  208. package/dist/runtime/facades/chat-service-ops.js.map +1 -0
  209. package/dist/runtime/facades/chat-session-ops.d.ts +8 -0
  210. package/dist/runtime/facades/chat-session-ops.d.ts.map +1 -0
  211. package/dist/runtime/facades/chat-session-ops.js +136 -0
  212. package/dist/runtime/facades/chat-session-ops.js.map +1 -0
  213. package/dist/runtime/facades/chat-state.d.ts +31 -0
  214. package/dist/runtime/facades/chat-state.d.ts.map +1 -0
  215. package/dist/runtime/facades/chat-state.js +32 -0
  216. package/dist/runtime/facades/chat-state.js.map +1 -0
  217. package/dist/runtime/facades/chat-transport-ops.d.ts +9 -0
  218. package/dist/runtime/facades/chat-transport-ops.d.ts.map +1 -0
  219. package/dist/runtime/facades/chat-transport-ops.js +337 -0
  220. package/dist/runtime/facades/chat-transport-ops.js.map +1 -0
  221. package/dist/runtime/facades/control-facade.d.ts.map +1 -1
  222. package/dist/runtime/facades/control-facade.js +4 -1
  223. package/dist/runtime/facades/control-facade.js.map +1 -1
  224. package/dist/runtime/facades/index.d.ts.map +1 -1
  225. package/dist/runtime/facades/index.js +6 -0
  226. package/dist/runtime/facades/index.js.map +1 -1
  227. package/dist/runtime/facades/memory-facade.d.ts.map +1 -1
  228. package/dist/runtime/facades/memory-facade.js +75 -6
  229. package/dist/runtime/facades/memory-facade.js.map +1 -1
  230. package/dist/runtime/facades/operator-facade.d.ts +8 -0
  231. package/dist/runtime/facades/operator-facade.d.ts.map +1 -0
  232. package/dist/runtime/facades/operator-facade.js +220 -0
  233. package/dist/runtime/facades/operator-facade.js.map +1 -0
  234. package/dist/runtime/facades/orchestrate-facade.js +3 -3
  235. package/dist/runtime/facades/orchestrate-facade.js.map +1 -1
  236. package/dist/runtime/facades/plan-facade.d.ts.map +1 -1
  237. package/dist/runtime/facades/plan-facade.js +39 -6
  238. package/dist/runtime/facades/plan-facade.js.map +1 -1
  239. package/dist/runtime/facades/review-facade.d.ts +7 -0
  240. package/dist/runtime/facades/review-facade.d.ts.map +1 -0
  241. package/dist/runtime/facades/review-facade.js +8 -0
  242. package/dist/runtime/facades/review-facade.js.map +1 -0
  243. package/dist/runtime/facades/sync-facade.d.ts +7 -0
  244. package/dist/runtime/facades/sync-facade.d.ts.map +1 -0
  245. package/dist/runtime/facades/sync-facade.js +8 -0
  246. package/dist/runtime/facades/sync-facade.js.map +1 -0
  247. package/dist/runtime/facades/vault-facade.d.ts +4 -1
  248. package/dist/runtime/facades/vault-facade.d.ts.map +1 -1
  249. package/dist/runtime/facades/vault-facade.js +13 -66
  250. package/dist/runtime/facades/vault-facade.js.map +1 -1
  251. package/dist/runtime/github-integration.d.ts +49 -0
  252. package/dist/runtime/github-integration.d.ts.map +1 -0
  253. package/dist/runtime/github-integration.js +113 -0
  254. package/dist/runtime/github-integration.js.map +1 -0
  255. package/dist/runtime/grading-ops.js +1 -1
  256. package/dist/runtime/grading-ops.js.map +1 -1
  257. package/dist/runtime/memory-extra-ops.d.ts.map +1 -1
  258. package/dist/runtime/memory-extra-ops.js +6 -2
  259. package/dist/runtime/memory-extra-ops.js.map +1 -1
  260. package/dist/runtime/orchestrate-ops.d.ts.map +1 -1
  261. package/dist/runtime/orchestrate-ops.js +367 -40
  262. package/dist/runtime/orchestrate-ops.js.map +1 -1
  263. package/dist/runtime/planning-extra-ops.d.ts.map +1 -1
  264. package/dist/runtime/planning-extra-ops.js +69 -4
  265. package/dist/runtime/planning-extra-ops.js.map +1 -1
  266. package/dist/runtime/review-ops.d.ts +10 -0
  267. package/dist/runtime/review-ops.d.ts.map +1 -0
  268. package/dist/runtime/review-ops.js +97 -0
  269. package/dist/runtime/review-ops.js.map +1 -0
  270. package/dist/runtime/runtime.d.ts.map +1 -1
  271. package/dist/runtime/runtime.js +27 -12
  272. package/dist/runtime/runtime.js.map +1 -1
  273. package/dist/runtime/session-briefing.d.ts +3 -0
  274. package/dist/runtime/session-briefing.d.ts.map +1 -1
  275. package/dist/runtime/session-briefing.js +68 -1
  276. package/dist/runtime/session-briefing.js.map +1 -1
  277. package/dist/runtime/sync-ops.d.ts +12 -0
  278. package/dist/runtime/sync-ops.d.ts.map +1 -0
  279. package/dist/runtime/sync-ops.js +288 -0
  280. package/dist/runtime/sync-ops.js.map +1 -0
  281. package/dist/runtime/types.d.ts +10 -4
  282. package/dist/runtime/types.d.ts.map +1 -1
  283. package/dist/runtime/vault-extra-ops.d.ts +5 -4
  284. package/dist/runtime/vault-extra-ops.d.ts.map +1 -1
  285. package/dist/runtime/vault-extra-ops.js +5 -300
  286. package/dist/runtime/vault-extra-ops.js.map +1 -1
  287. package/dist/runtime/vault-sharing-ops.d.ts +4 -4
  288. package/dist/runtime/vault-sharing-ops.d.ts.map +1 -1
  289. package/dist/runtime/vault-sharing-ops.js +5 -300
  290. package/dist/runtime/vault-sharing-ops.js.map +1 -1
  291. package/dist/skills/sync-skills.d.ts +27 -0
  292. package/dist/skills/sync-skills.d.ts.map +1 -0
  293. package/dist/skills/sync-skills.js +81 -0
  294. package/dist/skills/sync-skills.js.map +1 -0
  295. package/dist/update-check.d.ts +14 -0
  296. package/dist/update-check.d.ts.map +1 -0
  297. package/dist/update-check.js +96 -0
  298. package/dist/update-check.js.map +1 -0
  299. package/dist/vault/linking.d.ts +10 -12
  300. package/dist/vault/linking.d.ts.map +1 -1
  301. package/dist/vault/linking.js +104 -161
  302. package/dist/vault/linking.js.map +1 -1
  303. package/dist/vault/vault-entries.d.ts +69 -0
  304. package/dist/vault/vault-entries.d.ts.map +1 -0
  305. package/dist/vault/vault-entries.js +257 -0
  306. package/dist/vault/vault-entries.js.map +1 -0
  307. package/dist/vault/vault-interfaces.d.ts +153 -0
  308. package/dist/vault/vault-interfaces.d.ts.map +1 -0
  309. package/dist/vault/vault-interfaces.js +2 -0
  310. package/dist/vault/vault-interfaces.js.map +1 -0
  311. package/dist/vault/vault-maintenance.d.ts +40 -0
  312. package/dist/vault/vault-maintenance.d.ts.map +1 -0
  313. package/dist/vault/vault-maintenance.js +142 -0
  314. package/dist/vault/vault-maintenance.js.map +1 -0
  315. package/dist/vault/vault-markdown-sync.d.ts +22 -0
  316. package/dist/vault/vault-markdown-sync.d.ts.map +1 -0
  317. package/dist/vault/vault-markdown-sync.js +143 -0
  318. package/dist/vault/vault-markdown-sync.js.map +1 -0
  319. package/dist/vault/vault-memories.d.ts +61 -0
  320. package/dist/vault/vault-memories.d.ts.map +1 -0
  321. package/dist/vault/vault-memories.js +240 -0
  322. package/dist/vault/vault-memories.js.map +1 -0
  323. package/dist/vault/vault-schema.d.ts +9 -0
  324. package/dist/vault/vault-schema.d.ts.map +1 -0
  325. package/dist/vault/vault-schema.js +179 -0
  326. package/dist/vault/vault-schema.js.map +1 -0
  327. package/dist/vault/vault.d.ts +29 -81
  328. package/dist/vault/vault.d.ts.map +1 -1
  329. package/dist/vault/vault.js +78 -931
  330. package/dist/vault/vault.js.map +1 -1
  331. package/package.json +1 -1
  332. package/src/agency/agency-manager.test.ts +600 -0
  333. package/src/agency/default-rules.test.ts +228 -0
  334. package/src/{__tests__ → brain}/brain-intelligence.test.ts +37 -14
  335. package/src/{__tests__ → brain}/brain.test.ts +1 -1
  336. package/src/brain/intelligence.ts +196 -15
  337. package/src/brain/learning-radar.ts +22 -1
  338. package/src/{__tests__ → brain}/second-brain-features.test.ts +4 -4
  339. package/src/{__tests__ → brain}/session-lifecycle.test.ts +2 -2
  340. package/src/brain/strength-scorer.ts +404 -0
  341. package/src/capabilities/chain-mapping.test.ts +66 -0
  342. package/src/capabilities/registry.test.ts +369 -0
  343. package/src/chat/agent-loop.test.ts +394 -0
  344. package/src/chat/agent-loop.ts +2 -0
  345. package/src/{__tests__ → chat}/chat-differentiators.test.ts +3 -3
  346. package/src/{__tests__ → chat}/chat-enhanced.test.ts +4 -4
  347. package/src/{__tests__ → chat}/chat-transport.test.ts +6 -6
  348. package/src/chat/mcp-bridge.test.ts +173 -0
  349. package/src/chat/notifications.ts +2 -0
  350. package/src/chat/output-compressor.test.ts +164 -0
  351. package/src/claudemd/compose.test.ts +178 -0
  352. package/src/claudemd/compose.ts +1 -1
  353. package/src/claudemd/inject.test.ts +211 -0
  354. package/src/context/context-engine.test.ts +461 -0
  355. package/src/control/identity-manager.test.ts +305 -0
  356. package/src/control/intent-router.test.ts +360 -0
  357. package/src/control/intent-router.ts +13 -4
  358. package/src/curator/classifier.test.ts +104 -0
  359. package/src/curator/contradiction-detector.test.ts +180 -0
  360. package/src/curator/contradiction-detector.ts +87 -0
  361. package/src/{__tests__ → curator}/curator-pipeline-e2e.test.ts +10 -10
  362. package/src/{__tests__ → curator}/curator.test.ts +77 -1
  363. package/src/curator/curator.ts +115 -777
  364. package/src/curator/duplicate-detector.test.ts +183 -0
  365. package/src/curator/duplicate-detector.ts +103 -0
  366. package/src/curator/health-audit.ts +126 -0
  367. package/src/curator/metadata-enricher.ts +84 -0
  368. package/src/curator/quality-gate.test.ts +135 -0
  369. package/src/curator/schema.ts +65 -0
  370. package/src/curator/tag-manager.test.ts +165 -0
  371. package/src/curator/tag-manager.ts +109 -0
  372. package/src/domain-packs/inject-rules.test.ts +117 -0
  373. package/src/domain-packs/knowledge-installer.test.ts +171 -0
  374. package/src/domain-packs/loader.test.ts +86 -0
  375. package/src/domain-packs/pack-runtime.test.ts +140 -0
  376. package/src/domain-packs/skills-installer.test.ts +135 -0
  377. package/src/domain-packs/token-resolver.test.ts +150 -0
  378. package/src/domain-packs/types.test.ts +130 -0
  379. package/src/enforcement/adapters/claude-code.test.ts +216 -0
  380. package/src/enforcement/registry.test.ts +264 -0
  381. package/src/engine/bin/soleri-engine.ts +28 -4
  382. package/src/engine/core-ops.test.ts +254 -0
  383. package/src/engine/core-ops.ts +25 -8
  384. package/src/engine/module-manifest.test.ts +124 -0
  385. package/src/engine/module-manifest.ts +22 -2
  386. package/src/engine/register-engine.test.ts +230 -0
  387. package/src/engine/register-engine.ts +26 -2
  388. package/src/errors/classify.test.ts +199 -0
  389. package/src/errors/retry.test.ts +156 -0
  390. package/src/errors/retry.ts +2 -0
  391. package/src/errors/types.test.ts +108 -0
  392. package/src/events/event-bus.test.ts +149 -0
  393. package/src/extensions/middleware.test.ts +234 -0
  394. package/src/facades/facade-factory.test.ts +424 -0
  395. package/src/flows/chain-runner.test.ts +273 -0
  396. package/src/flows/context-router.test.ts +52 -0
  397. package/src/flows/dispatch-registry.test.ts +128 -0
  398. package/src/flows/epilogue.test.ts +107 -0
  399. package/src/flows/executor.test.ts +263 -0
  400. package/src/flows/gate-evaluator.test.ts +194 -0
  401. package/src/flows/gate-evaluator.ts +25 -0
  402. package/src/flows/types.ts +4 -0
  403. package/src/governance/governance.test.ts +726 -0
  404. package/src/health/health-registry.test.ts +186 -0
  405. package/src/health/vault-integrity.test.ts +110 -0
  406. package/src/index.ts +92 -0
  407. package/src/intake/content-classifier.test.ts +209 -0
  408. package/src/intake/dedup-gate.test.ts +131 -0
  409. package/src/intake/intake-pipeline.test.ts +506 -0
  410. package/src/intake/intake-pipeline.ts +1 -0
  411. package/src/intake/text-ingester.test.ts +194 -0
  412. package/src/intake/text-ingester.ts +2 -0
  413. package/src/llm/key-pool.test.ts +236 -0
  414. package/src/llm/key-pool.ts +3 -4
  415. package/src/llm/llm-client.test.ts +345 -0
  416. package/src/llm/oauth-discovery.test.ts +180 -0
  417. package/src/llm/utils.test.ts +327 -0
  418. package/src/llm/utils.ts +2 -0
  419. package/src/{__tests__ → logging}/logger.test.ts +41 -62
  420. package/src/loop/loop-manager.test.ts +519 -0
  421. package/src/migrations/migration-runner.edge-cases.test.ts +319 -0
  422. package/src/migrations/migration-runner.test-helpers.ts +64 -0
  423. package/src/migrations/migration-runner.test.ts +385 -0
  424. package/src/operator/auto-signal-pipeline.test.ts +207 -0
  425. package/src/operator/operator-profile-extended.test.ts +320 -0
  426. package/src/operator/operator-profile.test.ts +314 -0
  427. package/src/operator/operator-profile.ts +469 -0
  428. package/src/operator/operator-signals-extended.test.ts +245 -0
  429. package/src/operator/operator-signals.test.ts +281 -0
  430. package/src/operator/operator-signals.ts +261 -0
  431. package/src/operator/operator-types.ts +444 -0
  432. package/src/operator/prompts/hook-precompact-operator-dispatch.md +94 -0
  433. package/src/operator/prompts/subagent-soft-signal-extractor.md +125 -0
  434. package/src/operator/prompts/subagent-synthesis-cognition.md +181 -0
  435. package/src/operator/prompts/subagent-synthesis-communication.md +140 -0
  436. package/src/operator/prompts/subagent-synthesis-technical.md +160 -0
  437. package/src/operator/prompts/subagent-synthesis-trust.md +143 -0
  438. package/src/{__tests__ → packs}/pack-lockfile.test.ts +3 -3
  439. package/src/{__tests__ → packs}/pack-system.test.ts +2 -2
  440. package/src/paths.ts +115 -0
  441. package/src/persistence/index.ts +1 -1
  442. package/src/persistence/sqlite-provider.test.ts +540 -0
  443. package/src/persistence/sqlite-provider.ts +8 -5
  444. package/src/persona/defaults.test.ts +59 -0
  445. package/src/persona/loader.test.ts +67 -0
  446. package/src/persona/prompt-generator.test.ts +127 -0
  447. package/src/planning/evidence-collector.test.ts +406 -0
  448. package/src/planning/evidence-collector.ts +50 -0
  449. package/src/planning/gap-analysis-alternatives.test.ts +169 -0
  450. package/src/planning/gap-analysis.ts +21 -636
  451. package/src/planning/gap-passes.test.ts +372 -0
  452. package/src/planning/gap-passes.ts +298 -0
  453. package/src/planning/gap-patterns.test.ts +320 -0
  454. package/src/planning/gap-patterns.ts +234 -0
  455. package/src/planning/gap-types.ts +4 -1
  456. package/src/planning/github-projection.test.ts +177 -0
  457. package/src/planning/github-projection.ts +425 -0
  458. package/src/planning/impact-analyzer.test.ts +180 -0
  459. package/src/planning/impact-analyzer.ts +264 -0
  460. package/src/planning/plan-lifecycle.test.ts +312 -0
  461. package/src/planning/plan-lifecycle.ts +346 -0
  462. package/src/planning/planner-types.ts +215 -0
  463. package/src/{__tests__ → planning}/planner.test.ts +169 -15
  464. package/src/planning/planner.ts +197 -1228
  465. package/src/planning/rationalization-detector.test.ts +171 -0
  466. package/src/planning/rationalization-detector.ts +138 -0
  467. package/src/planning/reconciliation-engine.test.ts +141 -0
  468. package/src/planning/reconciliation-engine.ts +162 -0
  469. package/src/planning/task-verifier.test.ts +235 -0
  470. package/src/planning/task-verifier.ts +303 -0
  471. package/src/planning/verification-protocol.test.ts +201 -0
  472. package/src/playbooks/generic/generic-playbooks.test.ts +438 -0
  473. package/src/playbooks/index.test.ts +77 -0
  474. package/src/playbooks/playbook-executor.test.ts +255 -0
  475. package/src/playbooks/playbook-registry.test.ts +232 -0
  476. package/src/playbooks/playbook-seeder.test.ts +153 -0
  477. package/src/plugins/plugin-loader.test.ts +212 -0
  478. package/src/plugins/plugin-registry.test.ts +272 -0
  479. package/src/project/project-registry.test.ts +428 -0
  480. package/src/prompts/parser.test.ts +100 -0
  481. package/src/prompts/template-manager.test.ts +109 -0
  482. package/src/{__tests__ → queue}/async-infrastructure.test.ts +3 -3
  483. package/src/queue/job-queue.test.ts +331 -0
  484. package/src/queue/pipeline-runner.test.ts +209 -0
  485. package/src/runtime/admin-extra-ops.test.ts +527 -0
  486. package/src/runtime/admin-ops.test.ts +257 -0
  487. package/src/runtime/admin-ops.ts +45 -17
  488. package/src/runtime/admin-setup-ops.test.ts +328 -0
  489. package/src/runtime/admin-setup-ops.ts +20 -43
  490. package/src/runtime/archive-ops.test.ts +269 -0
  491. package/src/runtime/archive-ops.ts +347 -0
  492. package/src/runtime/capture-ops.test.ts +433 -0
  493. package/src/runtime/capture-ops.ts +50 -8
  494. package/src/runtime/chain-ops.test.ts +149 -0
  495. package/src/runtime/claude-md-helpers.test.ts +191 -0
  496. package/src/runtime/claude-md-helpers.ts +1 -1
  497. package/src/runtime/context-health.test.ts +78 -0
  498. package/src/runtime/context-health.ts +85 -0
  499. package/src/runtime/curator-extra-ops.test.ts +202 -0
  500. package/src/runtime/deprecation.test.ts +98 -0
  501. package/src/runtime/domain-ops.test.ts +268 -0
  502. package/src/runtime/facades/admin-facade.test.ts +333 -0
  503. package/src/runtime/facades/agency-facade.test.ts +278 -0
  504. package/src/runtime/facades/archive-facade.test.ts +294 -0
  505. package/src/runtime/facades/archive-facade.ts +14 -0
  506. package/src/runtime/facades/brain-facade.test.ts +714 -0
  507. package/src/runtime/facades/brain-facade.ts +2 -0
  508. package/src/runtime/facades/chat-facade.test.ts +166 -0
  509. package/src/runtime/facades/chat-facade.ts +15 -906
  510. package/src/runtime/facades/chat-service-ops.test.ts +276 -0
  511. package/src/runtime/facades/chat-service-ops.ts +374 -0
  512. package/src/runtime/facades/chat-session-ops.test.ts +197 -0
  513. package/src/runtime/facades/chat-session-ops.ts +146 -0
  514. package/src/runtime/facades/chat-state.ts +60 -0
  515. package/src/runtime/facades/chat-transport-ops.test.ts +269 -0
  516. package/src/runtime/facades/chat-transport-ops.ts +380 -0
  517. package/src/runtime/facades/context-facade.test.ts +108 -0
  518. package/src/runtime/facades/control-facade.test.ts +436 -0
  519. package/src/runtime/facades/control-facade.ts +6 -1
  520. package/src/runtime/facades/curator-facade.test.ts +303 -0
  521. package/src/runtime/facades/index.ts +6 -0
  522. package/src/runtime/facades/loop-facade.test.ts +245 -0
  523. package/src/runtime/facades/memory-facade.test.ts +269 -0
  524. package/src/runtime/facades/memory-facade.ts +78 -6
  525. package/src/runtime/facades/operator-facade.test.ts +208 -0
  526. package/src/runtime/facades/operator-facade.ts +236 -0
  527. package/src/runtime/facades/orchestrate-facade.test.ts +185 -0
  528. package/src/runtime/facades/orchestrate-facade.ts +3 -3
  529. package/src/runtime/facades/plan-facade.test.ts +266 -0
  530. package/src/runtime/facades/plan-facade.ts +42 -6
  531. package/src/runtime/facades/review-facade.test.ts +82 -0
  532. package/src/runtime/facades/review-facade.ts +11 -0
  533. package/src/runtime/facades/sync-facade.test.ts +113 -0
  534. package/src/runtime/facades/sync-facade.ts +11 -0
  535. package/src/runtime/facades/vault-facade.test.ts +631 -0
  536. package/src/runtime/facades/vault-facade.ts +15 -70
  537. package/src/runtime/feature-flags.test.ts +140 -0
  538. package/src/runtime/github-integration.test.ts +89 -0
  539. package/src/runtime/github-integration.ts +159 -0
  540. package/src/runtime/grading-ops.test.ts +141 -0
  541. package/src/runtime/grading-ops.ts +1 -1
  542. package/src/runtime/intake-ops.test.ts +208 -0
  543. package/src/runtime/loop-ops.test.ts +238 -0
  544. package/src/runtime/memory-cross-project-ops.test.ts +177 -0
  545. package/src/runtime/memory-extra-ops.test.ts +453 -0
  546. package/src/runtime/memory-extra-ops.ts +6 -2
  547. package/src/runtime/orchestrate-ops.test.ts +302 -0
  548. package/src/runtime/orchestrate-ops.ts +435 -46
  549. package/src/runtime/pack-ops.test.ts +158 -0
  550. package/src/runtime/planning-extra-ops.test.ts +583 -0
  551. package/src/runtime/planning-extra-ops.ts +72 -4
  552. package/src/{__tests__ → runtime}/playbook-ops-execution.test.ts +3 -3
  553. package/src/runtime/playbook-ops.test.ts +262 -0
  554. package/src/runtime/plugin-ops.test.ts +201 -0
  555. package/src/runtime/project-ops.test.ts +235 -0
  556. package/src/runtime/review-ops.test.ts +142 -0
  557. package/src/runtime/review-ops.ts +99 -0
  558. package/src/runtime/runtime.test.ts +363 -0
  559. package/src/runtime/runtime.ts +39 -12
  560. package/src/runtime/session-briefing.test.ts +302 -0
  561. package/src/runtime/session-briefing.ts +80 -1
  562. package/src/runtime/sync-ops.test.ts +221 -0
  563. package/src/runtime/sync-ops.ts +325 -0
  564. package/src/runtime/telemetry-ops.test.ts +132 -0
  565. package/src/runtime/types.ts +10 -4
  566. package/src/runtime/vault-extra-ops.test.ts +246 -0
  567. package/src/runtime/vault-extra-ops.ts +5 -332
  568. package/src/runtime/vault-linking-ops.test.ts +237 -0
  569. package/src/runtime/vault-sharing-ops.test.ts +130 -0
  570. package/src/runtime/vault-sharing-ops.ts +5 -329
  571. package/src/skills/sync-skills.ts +108 -0
  572. package/src/streams/normalize.test.ts +95 -0
  573. package/src/streams/replayable-stream.test.ts +166 -0
  574. package/src/telemetry/telemetry.test.ts +143 -0
  575. package/src/transport/http-server.test.ts +394 -0
  576. package/src/transport/lsp-server.test.ts +458 -0
  577. package/src/transport/rate-limiter.test.ts +126 -0
  578. package/src/transport/session-manager.test.ts +133 -0
  579. package/src/transport/token-auth.test.ts +136 -0
  580. package/src/transport/ws-server.test.ts +294 -0
  581. package/src/update-check.ts +111 -0
  582. package/src/vault/__tests__/vault-characterization.test.ts +168 -0
  583. package/src/vault/content-hash.test.ts +78 -0
  584. package/src/vault/git-vault-sync.test.ts +234 -0
  585. package/src/vault/knowledge-review.test.ts +269 -0
  586. package/src/vault/linking.test.ts +358 -0
  587. package/src/vault/linking.ts +149 -183
  588. package/src/vault/obsidian-sync.test.ts +342 -0
  589. package/src/vault/playbook.test.ts +152 -0
  590. package/src/vault/scope-detector.test.ts +187 -0
  591. package/src/vault/vault-branching.test.ts +250 -0
  592. package/src/{__tests__ → vault}/vault-connect.test.ts +1 -1
  593. package/src/vault/vault-entries.ts +282 -0
  594. package/src/vault/vault-interfaces.ts +56 -0
  595. package/src/vault/vault-maintenance.ts +205 -0
  596. package/src/vault/vault-manager.test.ts +206 -0
  597. package/src/vault/vault-markdown-sync.test.ts +203 -0
  598. package/src/vault/vault-markdown-sync.ts +160 -0
  599. package/src/vault/vault-memories.ts +339 -0
  600. package/src/{__tests__ → vault}/vault-scaling.test.ts +1 -1
  601. package/src/vault/vault-schema.ts +181 -0
  602. package/src/{__tests__ → vault}/vault-sharing.test.ts +4 -4
  603. package/src/{__tests__ → vault}/vault.test.ts +2 -2
  604. package/src/vault/vault.ts +89 -1171
  605. package/dist/cognee/client.d.ts +0 -43
  606. package/dist/cognee/client.d.ts.map +0 -1
  607. package/dist/cognee/client.js +0 -375
  608. package/dist/cognee/client.js.map +0 -1
  609. package/dist/cognee/sync-manager.d.ts +0 -153
  610. package/dist/cognee/sync-manager.d.ts.map +0 -1
  611. package/dist/cognee/sync-manager.js +0 -390
  612. package/dist/cognee/sync-manager.js.map +0 -1
  613. package/dist/cognee/types.d.ts +0 -62
  614. package/dist/cognee/types.d.ts.map +0 -1
  615. package/dist/cognee/types.js +0 -3
  616. package/dist/cognee/types.js.map +0 -1
  617. package/dist/governance/index.d.ts +0 -3
  618. package/dist/governance/index.d.ts.map +0 -1
  619. package/dist/governance/index.js +0 -2
  620. package/dist/governance/index.js.map +0 -1
  621. package/dist/health/doctor-checks.d.ts +0 -15
  622. package/dist/health/doctor-checks.d.ts.map +0 -1
  623. package/dist/health/doctor-checks.js +0 -98
  624. package/dist/health/doctor-checks.js.map +0 -1
  625. package/dist/persistence/postgres-provider.d.ts +0 -81
  626. package/dist/persistence/postgres-provider.d.ts.map +0 -1
  627. package/dist/persistence/postgres-provider.js +0 -256
  628. package/dist/persistence/postgres-provider.js.map +0 -1
  629. package/dist/runtime/cognee-sync-ops.d.ts +0 -12
  630. package/dist/runtime/cognee-sync-ops.d.ts.map +0 -1
  631. package/dist/runtime/cognee-sync-ops.js +0 -93
  632. package/dist/runtime/cognee-sync-ops.js.map +0 -1
  633. package/dist/runtime/core-ops.d.ts +0 -23
  634. package/dist/runtime/core-ops.d.ts.map +0 -1
  635. package/dist/runtime/core-ops.js +0 -1296
  636. package/dist/runtime/core-ops.js.map +0 -1
  637. package/dist/runtime/facades/cognee-facade.d.ts +0 -8
  638. package/dist/runtime/facades/cognee-facade.d.ts.map +0 -1
  639. package/dist/runtime/facades/cognee-facade.js +0 -156
  640. package/dist/runtime/facades/cognee-facade.js.map +0 -1
  641. package/src/__tests__/admin-extra-ops.test.ts +0 -484
  642. package/src/__tests__/admin-ops.test.ts +0 -268
  643. package/src/__tests__/admin-setup-ops.test.ts +0 -355
  644. package/src/__tests__/agency-manager.test.ts +0 -374
  645. package/src/__tests__/agent-loop.test.ts +0 -256
  646. package/src/__tests__/capture-ops.test.ts +0 -784
  647. package/src/__tests__/claudemd.test.ts +0 -282
  648. package/src/__tests__/content-hash.test.ts +0 -60
  649. package/src/__tests__/context-engine.test.ts +0 -251
  650. package/src/__tests__/core-ops.test.ts +0 -550
  651. package/src/__tests__/curator-extra-ops.test.ts +0 -383
  652. package/src/__tests__/deprecation.test.ts +0 -78
  653. package/src/__tests__/domain-ops.test.ts +0 -226
  654. package/src/__tests__/domain-packs.test.ts +0 -421
  655. package/src/__tests__/enforcement.test.ts +0 -153
  656. package/src/__tests__/errors.test.ts +0 -388
  657. package/src/__tests__/extensions.test.ts +0 -233
  658. package/src/__tests__/facade-factory.test.ts +0 -271
  659. package/src/__tests__/feature-flags.test.ts +0 -137
  660. package/src/__tests__/flows.test.ts +0 -604
  661. package/src/__tests__/git-vault-sync.test.ts +0 -230
  662. package/src/__tests__/governance.test.ts +0 -522
  663. package/src/__tests__/grading-ops.test.ts +0 -361
  664. package/src/__tests__/health-registry.test.ts +0 -173
  665. package/src/__tests__/identity-manager.test.ts +0 -243
  666. package/src/__tests__/intake-pipeline.test.ts +0 -162
  667. package/src/__tests__/intent-router.test.ts +0 -222
  668. package/src/__tests__/knowledge-review.test.ts +0 -104
  669. package/src/__tests__/llm-client.test.ts +0 -69
  670. package/src/__tests__/llm.test.ts +0 -556
  671. package/src/__tests__/loader.test.ts +0 -176
  672. package/src/__tests__/loop-ops.test.ts +0 -469
  673. package/src/__tests__/lsp-transport.test.ts +0 -442
  674. package/src/__tests__/memory-cross-project-ops.test.ts +0 -248
  675. package/src/__tests__/memory-extra-ops.test.ts +0 -352
  676. package/src/__tests__/migration-runner.test.ts +0 -170
  677. package/src/__tests__/module-manifest-drift.test.ts +0 -59
  678. package/src/__tests__/normalize.test.ts +0 -85
  679. package/src/__tests__/obsidian-sync.test.ts +0 -354
  680. package/src/__tests__/orchestrate-ops.test.ts +0 -289
  681. package/src/__tests__/pack-ops.test.ts +0 -146
  682. package/src/__tests__/persistence.test.ts +0 -291
  683. package/src/__tests__/planning-extra-ops.test.ts +0 -706
  684. package/src/__tests__/playbook-executor.test.ts +0 -249
  685. package/src/__tests__/playbook-registry.test.ts +0 -326
  686. package/src/__tests__/playbook-seeder.test.ts +0 -163
  687. package/src/__tests__/playbook.test.ts +0 -389
  688. package/src/__tests__/plugin-ops.test.ts +0 -411
  689. package/src/__tests__/plugin-system.test.ts +0 -509
  690. package/src/__tests__/project-ops.test.ts +0 -381
  691. package/src/__tests__/replayable-stream.test.ts +0 -177
  692. package/src/__tests__/runtime.test.ts +0 -95
  693. package/src/__tests__/scope-detector.test.ts +0 -121
  694. package/src/__tests__/template-manager.test.ts +0 -222
  695. package/src/__tests__/token-resolver.test.ts +0 -79
  696. package/src/__tests__/transport.test.ts +0 -758
  697. package/src/__tests__/vault-branching.test.ts +0 -274
  698. package/src/__tests__/vault-extra-ops.test.ts +0 -482
  699. package/src/__tests__/vault-integrity.test.ts +0 -71
  700. package/src/__tests__/vault-manager.test.ts +0 -238
  701. package/src/__tests__/ws-transport.test.ts +0 -479
@@ -17,6 +17,24 @@ import { FlowExecutor } from '../flows/executor.js';
17
17
  import { createDispatcher } from '../flows/dispatch-registry.js';
18
18
  import { runEpilogue } from '../flows/epilogue.js';
19
19
  import type { OrchestrationPlan, ExecutionResult } from '../flows/types.js';
20
+ import type { ContextHealthStatus } from './context-health.js';
21
+ import {
22
+ detectGitHubContext,
23
+ findMatchingMilestone,
24
+ findDuplicateIssue,
25
+ formatIssueBody,
26
+ createGitHubIssue,
27
+ updateGitHubIssueBody,
28
+ } from '../planning/github-projection.js';
29
+ import type { PlanMetadataForIssue, GitHubProjection } from '../planning/github-projection.js';
30
+ import {
31
+ extractIssueNumber,
32
+ detectGitHubRemote as detectGitHubRemoteAsync,
33
+ getIssueDetails,
34
+ } from './github-integration.js';
35
+ import { detectRationalizations } from '../planning/rationalization-detector.js';
36
+ import { ImpactAnalyzer } from '../planning/impact-analyzer.js';
37
+ import type { ImpactReport } from '../planning/impact-analyzer.js';
20
38
 
21
39
  // ---------------------------------------------------------------------------
22
40
  // Intent detection — keyword-based mapping from prompt to intent
@@ -61,11 +79,7 @@ const planStore = new Map<string, PlanEntry>();
61
79
  * If facades are provided, uses the full dispatch registry.
62
80
  * Otherwise, falls back to a simple runtime-based dispatcher.
63
81
  */
64
- function buildDispatch(
65
- agentId: string,
66
- runtime: AgentRuntime,
67
- facades?: FacadeConfig[],
68
- ) {
82
+ function buildDispatch(agentId: string, runtime: AgentRuntime, facades?: FacadeConfig[]) {
69
83
  if (facades && facades.length > 0) {
70
84
  return createDispatcher(agentId, facades);
71
85
  }
@@ -110,6 +124,104 @@ function buildDispatch(
110
124
  };
111
125
  }
112
126
 
127
+ // ---------------------------------------------------------------------------
128
+ // Context health warning builder
129
+ // ---------------------------------------------------------------------------
130
+
131
+ interface HealthWarning {
132
+ level: string;
133
+ recommendation: string;
134
+ sessionCaptured?: boolean;
135
+ }
136
+
137
+ /**
138
+ * Build a context health warning if level is yellow or red.
139
+ * On red: auto-triggers a session capture to vault memory.
140
+ */
141
+ function buildHealthWarning(
142
+ status: ContextHealthStatus,
143
+ vault: AgentRuntime['vault'],
144
+ ): HealthWarning | null {
145
+ if (status.level === 'green') return null;
146
+
147
+ const warning: HealthWarning = {
148
+ level: status.level,
149
+ recommendation: status.recommendation,
150
+ };
151
+
152
+ if (status.level === 'red') {
153
+ try {
154
+ vault.captureMemory({
155
+ projectPath: '.',
156
+ type: 'session',
157
+ context: 'Auto-captured by context health monitor (red level)',
158
+ summary: `Context fill at ${(status.estimatedFill * 100).toFixed(0)}% (${status.toolCallCount} tool calls, ~${status.estimatedTokens} tokens). Session capture recommended.`,
159
+ topics: ['context-health'],
160
+ filesModified: [],
161
+ toolsUsed: [],
162
+ intent: null,
163
+ decisions: [],
164
+ currentState: `Context health: ${status.level}`,
165
+ nextSteps: ['Compact context or start a new session'],
166
+ vaultEntriesReferenced: [],
167
+ });
168
+ warning.sessionCaptured = true;
169
+ } catch {
170
+ warning.sessionCaptured = false;
171
+ }
172
+ }
173
+
174
+ return warning;
175
+ }
176
+
177
+ // ---------------------------------------------------------------------------
178
+ // Anti-rationalization helpers
179
+ // ---------------------------------------------------------------------------
180
+
181
+ /**
182
+ * Collect all acceptance criteria from a plan's tasks.
183
+ * Returns empty array if plan not found or has no criteria (graceful skip).
184
+ */
185
+ function collectAcceptanceCriteria(
186
+ plannerRef: AgentRuntime['planner'],
187
+ planId: string,
188
+ ): string[] {
189
+ const plan = plannerRef.get(planId);
190
+ if (!plan) return [];
191
+ const criteria: string[] = [];
192
+ for (const task of plan.tasks) {
193
+ if (task.acceptanceCriteria) {
194
+ criteria.push(...task.acceptanceCriteria);
195
+ }
196
+ }
197
+ return criteria;
198
+ }
199
+
200
+ /**
201
+ * Capture detected rationalization as an anti-pattern in vault.
202
+ * Best-effort — never throws.
203
+ */
204
+ function captureRationalizationAntiPattern(
205
+ vaultRef: AgentRuntime['vault'],
206
+ report: import('../planning/rationalization-detector.js').RationalizationReport,
207
+ ): void {
208
+ try {
209
+ const patterns = report.items.map((i) => i.pattern).join(', ');
210
+ vaultRef.add({
211
+ id: `antipattern-rationalization-${Date.now()}`,
212
+ title: 'Rationalization detected in completion claim',
213
+ description: `Detected rationalization patterns: ${patterns}. ` +
214
+ `Items: ${report.items.map((i) => `"${i.phrase}" (${i.pattern})`).join('; ')}.`,
215
+ type: 'anti-pattern',
216
+ domain: 'planning',
217
+ severity: 'warning',
218
+ tags: ['rationalization', 'anti-pattern', 'completion-gate'],
219
+ });
220
+ } catch {
221
+ // Vault capture is best-effort
222
+ }
223
+ }
224
+
113
225
  // ---------------------------------------------------------------------------
114
226
  // Op factory
115
227
  // ---------------------------------------------------------------------------
@@ -122,7 +234,7 @@ export function createOrchestrateOps(
122
234
  runtime: AgentRuntime,
123
235
  facades?: FacadeConfig[],
124
236
  ): OpDefinition[] {
125
- const { planner, brainIntelligence, vault } = runtime;
237
+ const { planner, brainIntelligence, vault, contextHealth } = runtime;
126
238
  const agentId = runtime.config.agentId;
127
239
 
128
240
  return [
@@ -135,27 +247,12 @@ export function createOrchestrateOps(
135
247
  'a pruned orchestration plan with gate-guarded steps.',
136
248
  auth: 'write',
137
249
  schema: z.object({
138
- prompt: z
139
- .string()
140
- .describe('Natural language description of what to do'),
141
- projectPath: z
142
- .string()
143
- .optional()
144
- .default('.')
145
- .describe('Project root path'),
250
+ prompt: z.string().optional().describe('Natural language description of what to do (or use objective)'),
251
+ projectPath: z.string().optional().default('.').describe('Project root path'),
146
252
  // Legacy params — still accepted for backward compat
147
- objective: z
148
- .string()
149
- .optional()
150
- .describe('(Legacy) Plan objective — use prompt instead'),
151
- scope: z
152
- .string()
153
- .optional()
154
- .describe('(Legacy) Plan scope'),
155
- domain: z
156
- .string()
157
- .optional()
158
- .describe('Domain hint for brain recommendations'),
253
+ objective: z.string().optional().describe('(Legacy) Plan objective — use prompt instead'),
254
+ scope: z.string().optional().describe('(Legacy) Plan scope'),
255
+ domain: z.string().optional().describe('Domain hint for brain recommendations'),
159
256
  tasks: z
160
257
  .array(z.object({ title: z.string(), description: z.string() }))
161
258
  .optional()
@@ -170,17 +267,21 @@ export function createOrchestrateOps(
170
267
  const intent = detectIntent(prompt);
171
268
 
172
269
  // 2. Get brain recommendations — graceful degradation
173
- let recommendations: Array<{ pattern: string; strength: number }> = [];
270
+ let recommendations: Array<{ pattern: string; strength: number; entryId?: string }> = [];
174
271
  try {
175
272
  const raw = brainIntelligence.recommend({
176
273
  domain,
177
274
  task: prompt,
178
275
  limit: 5,
179
276
  });
180
- recommendations = raw.map((r) => ({
181
- pattern: r.pattern,
182
- strength: r.strength,
183
- }));
277
+ recommendations = raw.map((r) => {
278
+ // Look up vault entry ID by title for feedback tracking
279
+ const entries = vault.search(r.pattern, { limit: 1 });
280
+ const entryId = entries.length > 0 && entries[0].entry.title === r.pattern
281
+ ? entries[0].entry.id
282
+ : undefined;
283
+ return { pattern: r.pattern, strength: r.strength, entryId };
284
+ });
184
285
  } catch {
185
286
  // Brain has no data yet
186
287
  }
@@ -192,6 +293,7 @@ export function createOrchestrateOps(
192
293
  recommendations = vaultResults.map((r) => ({
193
294
  pattern: r.entry.title,
194
295
  strength: 50,
296
+ entryId: r.entry.id,
195
297
  }));
196
298
  } catch {
197
299
  // Vault search failed
@@ -206,18 +308,44 @@ export function createOrchestrateOps(
206
308
 
207
309
  // 5. Also create a planner plan for lifecycle tracking (backward compat)
208
310
  const decisions = recommendations.map(
209
- (r) => `Brain pattern: ${r.pattern} (strength: ${r.strength.toFixed(1)})`,
311
+ (r) => {
312
+ const base = `Brain pattern: ${r.pattern} (strength: ${r.strength.toFixed(1)})`;
313
+ return r.entryId ? `${base} [entryId:${r.entryId}]` : base;
314
+ },
210
315
  );
211
316
  const tasks = (params.tasks as Array<{ title: string; description: string }>) ?? [];
212
317
 
318
+ // 5b. Extract GitHub issue context if prompt references #NNN
319
+ let githubIssue: { owner: string; repo: string; number: number } | undefined;
320
+ const issueNum = extractIssueNumber(prompt);
321
+ if (issueNum) {
322
+ const remote = await detectGitHubRemoteAsync(projectPath);
323
+ if (remote) {
324
+ githubIssue = { owner: remote.owner, repo: remote.repo, number: issueNum };
325
+ const details = await getIssueDetails(remote.owner, remote.repo, issueNum);
326
+ if (details) {
327
+ // Enrich objective with issue context
328
+ const enriched = `${prompt}\n\n--- GitHub Issue #${issueNum}: ${details.title} ---\n${details.body}`;
329
+ decisions.unshift(`Source: GitHub issue #${issueNum} — ${details.title}`);
330
+ // Replace prompt for plan creation
331
+ Object.assign(params, { _enrichedObjective: enriched });
332
+ }
333
+ }
334
+ }
335
+
336
+ const planObjective = (params as Record<string, unknown>)._enrichedObjective as string | undefined ?? prompt;
337
+
213
338
  let legacyPlan;
214
339
  try {
215
340
  legacyPlan = planner.create({
216
- objective: prompt,
341
+ objective: planObjective,
217
342
  scope: (params.scope as string) ?? `${intent} workflow`,
218
343
  decisions,
219
344
  tasks,
220
345
  });
346
+ if (legacyPlan && githubIssue) {
347
+ legacyPlan.githubIssue = githubIssue;
348
+ }
221
349
  } catch {
222
350
  // Planner creation failed — flow plan still valid
223
351
  }
@@ -271,13 +399,25 @@ export function createOrchestrateOps(
271
399
  // Store result
272
400
  entry.executionResult = executionResult;
273
401
 
274
- // Start brain session
275
- const session = brainIntelligence.lifecycle({
276
- action: 'start',
277
- domain,
278
- context,
279
- planId,
402
+ // Reuse brain session from plan_split if one exists, otherwise start new
403
+ const existingSession = brainIntelligence.getSessionByPlanId(planId);
404
+ const session =
405
+ existingSession && !existingSession.endedAt
406
+ ? existingSession
407
+ : brainIntelligence.lifecycle({
408
+ action: 'start',
409
+ domain,
410
+ context,
411
+ planId,
412
+ });
413
+
414
+ // Track execution in context health monitor
415
+ contextHealth.track({
416
+ type: 'orchestrate_execute',
417
+ payloadSize: JSON.stringify(executionResult).length,
280
418
  });
419
+ const healthStatus = contextHealth.check();
420
+ const healthWarning = buildHealthWarning(healthStatus, vault);
281
421
 
282
422
  return {
283
423
  plan: { id: planId, status: 'executing' },
@@ -289,19 +429,37 @@ export function createOrchestrateOps(
289
429
  toolsCalled: executionResult.toolsCalled,
290
430
  durationMs: executionResult.durationMs,
291
431
  },
432
+ ...(healthWarning ? { contextHealth: healthWarning } : {}),
292
433
  };
293
434
  }
294
435
 
295
436
  // Legacy path: no flow plan found, use planner directly
296
437
  const plan = planner.startExecution(planId);
297
- const session = brainIntelligence.lifecycle({
298
- action: 'start',
299
- domain,
300
- context,
301
- planId,
438
+ // Reuse brain session from plan_split if one exists, otherwise start new
439
+ const existingSession = brainIntelligence.getSessionByPlanId(planId);
440
+ const session =
441
+ existingSession && !existingSession.endedAt
442
+ ? existingSession
443
+ : brainIntelligence.lifecycle({
444
+ action: 'start',
445
+ domain,
446
+ context,
447
+ planId,
448
+ });
449
+
450
+ // Track legacy execution in context health monitor
451
+ contextHealth.track({
452
+ type: 'orchestrate_execute_legacy',
453
+ payloadSize: JSON.stringify(plan).length,
302
454
  });
455
+ const healthStatus = contextHealth.check();
456
+ const healthWarning = buildHealthWarning(healthStatus, vault);
303
457
 
304
- return { plan, session };
458
+ return {
459
+ plan,
460
+ session,
461
+ ...(healthWarning ? { contextHealth: healthWarning } : {}),
462
+ };
305
463
  },
306
464
  },
307
465
 
@@ -320,15 +478,67 @@ export function createOrchestrateOps(
320
478
  .optional()
321
479
  .default('completed')
322
480
  .describe('Plan outcome'),
481
+ summary: z.string().optional().describe('Completion summary — checked for rationalization language'),
323
482
  toolsUsed: z.array(z.string()).optional().describe('Tools used during execution'),
324
483
  filesModified: z.array(z.string()).optional().describe('Files modified during execution'),
484
+ projectPath: z.string().optional().default('.').describe('Project root path for impact analysis'),
485
+ overrideRationalization: z.boolean().optional().default(false)
486
+ .describe('Set true to bypass rationalization gate and impact warnings after review'),
325
487
  }),
326
488
  handler: async (params) => {
327
489
  const planId = params.planId as string;
328
490
  const sessionId = params.sessionId as string;
329
491
  const outcome = (params.outcome as string) ?? 'completed';
492
+ const completionSummary = (params.summary as string) ?? '';
330
493
  const toolsUsed = (params.toolsUsed as string[]) ?? [];
331
494
  const filesModified = (params.filesModified as string[]) ?? [];
495
+ const overrideRationalization = (params.overrideRationalization as boolean) ?? false;
496
+
497
+ // Anti-rationalization gate: check completion summary before completing
498
+ if (outcome === 'completed' && !overrideRationalization) {
499
+ const criteria = collectAcceptanceCriteria(planner, planId);
500
+ if (criteria.length > 0 && completionSummary) {
501
+ const report = detectRationalizations(criteria, completionSummary);
502
+ if (report.detected) {
503
+ captureRationalizationAntiPattern(vault, report);
504
+ return {
505
+ blocked: true,
506
+ reason: 'Rationalization language detected in completion summary',
507
+ rationalization: report,
508
+ hint: 'Address the unmet criteria, or set overrideRationalization: true to bypass this gate.',
509
+ };
510
+ }
511
+ }
512
+ }
513
+
514
+ // Impact analysis gate: assess downstream impact of modified files
515
+ let impactReport: ImpactReport | null = null;
516
+ if (filesModified.length > 0) {
517
+ try {
518
+ const analyzer = new ImpactAnalyzer();
519
+ const planObj = planner.get(planId);
520
+ const scopeHints = planObj?.scope
521
+ ? [planObj.scope]
522
+ : undefined;
523
+ impactReport = analyzer.analyzeImpact(
524
+ filesModified,
525
+ (params.projectPath as string) ?? '.',
526
+ scopeHints,
527
+ );
528
+
529
+ // If high risk and not overridden, warn the user
530
+ if (impactReport.riskLevel === 'high' && !overrideRationalization) {
531
+ return {
532
+ warning: true,
533
+ reason: 'High impact detected — review before completing',
534
+ impactReport,
535
+ hint: 'Review affected consumers and re-run with overrideRationalization: true or address the issues.',
536
+ };
537
+ }
538
+ } catch {
539
+ // Impact analysis is best-effort — never blocks
540
+ }
541
+ }
332
542
 
333
543
  // Complete the planner plan (legacy lifecycle)
334
544
  const plan = planner.complete(planId);
@@ -372,7 +582,13 @@ export function createOrchestrateOps(
372
582
  planStore.delete(planId);
373
583
  }
374
584
 
375
- return { plan, session, extraction, epilogue: epilogueResult };
585
+ return {
586
+ plan,
587
+ session,
588
+ extraction,
589
+ epilogue: epilogueResult,
590
+ ...(impactReport ? { impactAnalysis: impactReport } : {}),
591
+ };
376
592
  },
377
593
  },
378
594
 
@@ -483,5 +699,178 @@ export function createOrchestrateOps(
483
699
  return { session: endedSession, extraction };
484
700
  },
485
701
  },
702
+
703
+ // ─── orchestrate_project_to_github ─────────────────────────────
704
+ {
705
+ name: 'orchestrate_project_to_github',
706
+ description:
707
+ 'Project plan tasks as GitHub issues. Detects the GitHub remote, checks milestones ' +
708
+ 'and existing issues for duplicates, creates issues with plan metadata linked, and ' +
709
+ 'stores the projection on the plan. Opt-in: the agent suggests, user confirms.',
710
+ auth: 'write',
711
+ schema: z.object({
712
+ planId: z.string().describe('ID of the plan to project to GitHub'),
713
+ projectPath: z.string().optional().default('.').describe('Project root path for git detection'),
714
+ milestone: z.number().optional().describe('GitHub milestone number to assign issues to'),
715
+ labels: z.array(z.string()).optional().describe('Labels to apply to created issues'),
716
+ linkToIssue: z.number().optional().describe('Existing issue number to link plan to instead of creating new issues'),
717
+ dryRun: z.boolean().optional().default(false).describe('Preview what would be created without actually creating issues'),
718
+ }),
719
+ handler: async (params) => {
720
+ const planId = params.planId as string;
721
+ const projectPath = (params.projectPath as string) ?? '.';
722
+ const milestone = params.milestone as number | undefined;
723
+ const labels = (params.labels as string[]) ?? [];
724
+ const linkToIssue = params.linkToIssue as number | undefined;
725
+ const dryRun = (params.dryRun as boolean) ?? false;
726
+
727
+ // 1. Find the plan
728
+ const plan = planner.get(planId);
729
+ if (!plan) throw new Error(`Plan not found: ${planId}`);
730
+
731
+ if (plan.tasks.length === 0) {
732
+ throw new Error('Plan has no tasks — run plan_split first to define tasks before projecting to GitHub');
733
+ }
734
+
735
+ // 2. Detect GitHub context
736
+ const ctx = detectGitHubContext(projectPath);
737
+ if (!ctx) {
738
+ return {
739
+ status: 'skipped',
740
+ reason: 'No GitHub remote detected or gh CLI not authenticated',
741
+ };
742
+ }
743
+
744
+ const repoSlug = `${ctx.repo.owner}/${ctx.repo.repo}`;
745
+
746
+ // 3. Build plan metadata for issue body
747
+ const planMeta: PlanMetadataForIssue = {
748
+ planId: plan.id,
749
+ grade: plan.latestCheck?.grade ?? 'N/A',
750
+ score: plan.latestCheck?.score ?? 0,
751
+ objective: plan.objective,
752
+ decisions: plan.decisions,
753
+ tasks: plan.tasks.map((t) => ({
754
+ id: t.id,
755
+ title: t.title,
756
+ description: t.description,
757
+ dependsOn: t.dependsOn,
758
+ })),
759
+ };
760
+
761
+ // 4. Handle "link to existing issue" flow
762
+ if (linkToIssue) {
763
+ const body = formatIssueBody(planMeta, plan.objective, plan.scope);
764
+ if (dryRun) {
765
+ return {
766
+ status: 'dry_run',
767
+ action: 'update_existing',
768
+ repo: repoSlug,
769
+ issueNumber: linkToIssue,
770
+ bodyPreview: body.slice(0, 500),
771
+ };
772
+ }
773
+
774
+ const updated = updateGitHubIssueBody(ctx.repo, linkToIssue, body);
775
+ if (!updated) {
776
+ return {
777
+ status: 'error',
778
+ reason: `Failed to update issue #${linkToIssue}`,
779
+ };
780
+ }
781
+
782
+ const projection: GitHubProjection = {
783
+ repo: repoSlug,
784
+ issues: [{ taskId: 'all', issueNumber: linkToIssue }],
785
+ projectedAt: Date.now(),
786
+ };
787
+ planner.setGitHubProjection(planId, projection);
788
+
789
+ return {
790
+ status: 'linked',
791
+ repo: repoSlug,
792
+ issueNumber: linkToIssue,
793
+ message: `Plan linked to existing issue #${linkToIssue}`,
794
+ };
795
+ }
796
+
797
+ // 5. Milestone matching
798
+ let milestoneNumber = milestone;
799
+ let milestoneMatch: string | undefined;
800
+ if (!milestoneNumber && ctx.milestones.length > 0 && plan.scope) {
801
+ const match = findMatchingMilestone(plan.scope, ctx.milestones);
802
+ if (match) {
803
+ milestoneNumber = match.number;
804
+ milestoneMatch = match.title;
805
+ }
806
+ }
807
+
808
+ // 6. Create issues per task (with duplicate detection)
809
+ const created: Array<{ taskId: string; issueNumber: number; title: string }> = [];
810
+ const skipped: Array<{ taskId: string; title: string; existingIssue: number; reason: string }> = [];
811
+ const failed: Array<{ taskId: string; title: string; reason: string }> = [];
812
+
813
+ for (const task of plan.tasks) {
814
+ // Duplicate detection
815
+ const dup = findDuplicateIssue(task.title, ctx.existingIssues);
816
+ if (dup) {
817
+ skipped.push({
818
+ taskId: task.id,
819
+ title: task.title,
820
+ existingIssue: dup.number,
821
+ reason: `Existing issue #${dup.number} "${dup.title}" looks like it covers this task`,
822
+ });
823
+ continue;
824
+ }
825
+
826
+ const body = formatIssueBody(planMeta, task.title, task.description);
827
+
828
+ if (dryRun) {
829
+ created.push({ taskId: task.id, issueNumber: 0, title: task.title });
830
+ continue;
831
+ }
832
+
833
+ const issueNumber = createGitHubIssue(ctx.repo, task.title, body, {
834
+ milestone: milestoneNumber,
835
+ labels: labels.length > 0 ? labels : undefined,
836
+ });
837
+
838
+ if (issueNumber) {
839
+ created.push({ taskId: task.id, issueNumber, title: task.title });
840
+ } else {
841
+ failed.push({ taskId: task.id, title: task.title, reason: 'gh issue create failed' });
842
+ }
843
+ }
844
+
845
+ // 7. Store projection on the plan (unless dry run)
846
+ if (!dryRun && created.length > 0) {
847
+ const projection: GitHubProjection = {
848
+ repo: repoSlug,
849
+ milestone: milestoneNumber,
850
+ issues: created.map((c) => ({ taskId: c.taskId, issueNumber: c.issueNumber })),
851
+ projectedAt: Date.now(),
852
+ };
853
+ planner.setGitHubProjection(planId, projection);
854
+ }
855
+
856
+ return {
857
+ status: dryRun ? 'dry_run' : 'projected',
858
+ repo: repoSlug,
859
+ milestone: milestoneMatch
860
+ ? { number: milestoneNumber, title: milestoneMatch }
861
+ : milestoneNumber
862
+ ? { number: milestoneNumber }
863
+ : null,
864
+ created,
865
+ skipped,
866
+ failed,
867
+ context: {
868
+ milestonesFound: ctx.milestones.length,
869
+ existingIssuesChecked: ctx.existingIssues.length,
870
+ labelsAvailable: ctx.labels.length,
871
+ },
872
+ };
873
+ },
874
+ },
486
875
  ];
487
876
  }