@cleocode/core 2026.4.31 → 2026.4.36

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 (1024) hide show
  1. package/dist/adapters/adapter-registry.js +64 -0
  2. package/dist/adapters/adapter-registry.js.map +1 -0
  3. package/dist/adapters/discovery.js +83 -0
  4. package/dist/adapters/discovery.js.map +1 -0
  5. package/dist/adapters/index.js +9 -0
  6. package/dist/adapters/index.js.map +1 -0
  7. package/dist/adapters/manager.js +260 -0
  8. package/dist/adapters/manager.js.map +1 -0
  9. package/dist/admin/export-tasks.js +171 -0
  10. package/dist/admin/export-tasks.js.map +1 -0
  11. package/dist/admin/export.js +103 -0
  12. package/dist/admin/export.js.map +1 -0
  13. package/dist/admin/help.js +106 -0
  14. package/dist/admin/help.js.map +1 -0
  15. package/dist/admin/import-tasks.js +182 -0
  16. package/dist/admin/import-tasks.js.map +1 -0
  17. package/dist/admin/import.js +129 -0
  18. package/dist/admin/import.js.map +1 -0
  19. package/dist/admin/index.js +13 -0
  20. package/dist/admin/index.js.map +1 -0
  21. package/dist/adrs/find.js +134 -0
  22. package/dist/adrs/find.js.map +1 -0
  23. package/dist/adrs/index.js +15 -0
  24. package/dist/adrs/index.js.map +1 -0
  25. package/dist/adrs/link-pipeline.js +160 -0
  26. package/dist/adrs/link-pipeline.js.map +1 -0
  27. package/dist/adrs/list.js +43 -0
  28. package/dist/adrs/list.js.map +1 -0
  29. package/dist/adrs/parse.js +51 -0
  30. package/dist/adrs/parse.js.map +1 -0
  31. package/dist/adrs/show.js +22 -0
  32. package/dist/adrs/show.js.map +1 -0
  33. package/dist/adrs/sync.js +232 -0
  34. package/dist/adrs/sync.js.map +1 -0
  35. package/dist/adrs/types.js +9 -0
  36. package/dist/adrs/types.js.map +1 -0
  37. package/dist/adrs/validate.js +57 -0
  38. package/dist/adrs/validate.js.map +1 -0
  39. package/dist/agents/agent-registry.js +288 -0
  40. package/dist/agents/agent-registry.js.map +1 -0
  41. package/dist/agents/agent-schema.js +82 -0
  42. package/dist/agents/agent-schema.js.map +1 -0
  43. package/dist/agents/capacity.js +116 -0
  44. package/dist/agents/capacity.js.map +1 -0
  45. package/dist/agents/execution-learning.js +474 -0
  46. package/dist/agents/execution-learning.js.map +1 -0
  47. package/dist/agents/health-monitor.js +217 -0
  48. package/dist/agents/health-monitor.js.map +1 -0
  49. package/dist/agents/index.js +29 -0
  50. package/dist/agents/index.js.map +1 -0
  51. package/dist/agents/registry.js +314 -0
  52. package/dist/agents/registry.js.map +1 -0
  53. package/dist/agents/retry.js +215 -0
  54. package/dist/agents/retry.js.map +1 -0
  55. package/dist/audit-prune.js +94 -0
  56. package/dist/audit-prune.js.map +1 -0
  57. package/dist/audit.js +68 -0
  58. package/dist/audit.js.map +1 -0
  59. package/dist/backfill/index.js +229 -0
  60. package/dist/backfill/index.js.map +1 -0
  61. package/dist/bootstrap.js +435 -0
  62. package/dist/bootstrap.js.map +1 -0
  63. package/dist/caamp/adapter.js +259 -0
  64. package/dist/caamp/adapter.js.map +1 -0
  65. package/dist/caamp/capability-check.js +38 -0
  66. package/dist/caamp/capability-check.js.map +1 -0
  67. package/dist/caamp/index.js +21 -0
  68. package/dist/caamp/index.js.map +1 -0
  69. package/dist/caamp-init.js +16 -0
  70. package/dist/caamp-init.js.map +1 -0
  71. package/dist/cleo.js +322 -0
  72. package/dist/cleo.js.map +1 -0
  73. package/dist/code/index.js +14 -0
  74. package/dist/code/index.js.map +1 -0
  75. package/dist/code/outline.js +165 -0
  76. package/dist/code/outline.js.map +1 -0
  77. package/dist/code/parser.js +420 -0
  78. package/dist/code/parser.js.map +1 -0
  79. package/dist/code/search.js +135 -0
  80. package/dist/code/search.js.map +1 -0
  81. package/dist/code/unfold.js +155 -0
  82. package/dist/code/unfold.js.map +1 -0
  83. package/dist/codebase-map/analyzers/architecture.js +129 -0
  84. package/dist/codebase-map/analyzers/architecture.js.map +1 -0
  85. package/dist/codebase-map/analyzers/concerns.js +122 -0
  86. package/dist/codebase-map/analyzers/concerns.js.map +1 -0
  87. package/dist/codebase-map/analyzers/conventions.js +149 -0
  88. package/dist/codebase-map/analyzers/conventions.js.map +1 -0
  89. package/dist/codebase-map/analyzers/integrations.js +108 -0
  90. package/dist/codebase-map/analyzers/integrations.js.map +1 -0
  91. package/dist/codebase-map/analyzers/stack.js +117 -0
  92. package/dist/codebase-map/analyzers/stack.js.map +1 -0
  93. package/dist/codebase-map/analyzers/structure.js +137 -0
  94. package/dist/codebase-map/analyzers/structure.js.map +1 -0
  95. package/dist/codebase-map/analyzers/testing.js +118 -0
  96. package/dist/codebase-map/analyzers/testing.js.map +1 -0
  97. package/dist/codebase-map/index.js +57 -0
  98. package/dist/codebase-map/index.js.map +1 -0
  99. package/dist/codebase-map/store.js +122 -0
  100. package/dist/codebase-map/store.js.map +1 -0
  101. package/dist/codebase-map/summary.js +152 -0
  102. package/dist/codebase-map/summary.js.map +1 -0
  103. package/dist/compliance/index.js +288 -0
  104. package/dist/compliance/index.js.map +1 -0
  105. package/dist/compliance/protocol-enforcement.js +332 -0
  106. package/dist/compliance/protocol-enforcement.js.map +1 -0
  107. package/dist/compliance/protocol-rules.js +786 -0
  108. package/dist/compliance/protocol-rules.js.map +1 -0
  109. package/dist/compliance/protocol-types.js +79 -0
  110. package/dist/compliance/protocol-types.js.map +1 -0
  111. package/dist/compliance/store.js +53 -0
  112. package/dist/compliance/store.js.map +1 -0
  113. package/dist/conduit/conduit-client.js +107 -0
  114. package/dist/conduit/conduit-client.js.map +1 -0
  115. package/dist/conduit/factory.js +52 -0
  116. package/dist/conduit/factory.js.map +1 -0
  117. package/dist/conduit/http-transport.js +155 -0
  118. package/dist/conduit/http-transport.js.map +1 -0
  119. package/dist/conduit/index.js +15 -0
  120. package/dist/conduit/index.js.map +1 -0
  121. package/dist/conduit/local-transport.js +255 -0
  122. package/dist/conduit/local-transport.js.map +1 -0
  123. package/dist/conduit/sse-transport.js +299 -0
  124. package/dist/conduit/sse-transport.js.map +1 -0
  125. package/dist/config/build-config.js +29 -0
  126. package/dist/config/build-config.js.map +1 -0
  127. package/dist/config.d.ts.map +1 -1
  128. package/dist/config.js +407 -0
  129. package/dist/config.js.map +1 -0
  130. package/dist/constants.js +18 -0
  131. package/dist/constants.js.map +1 -0
  132. package/dist/context/index.js +137 -0
  133. package/dist/context/index.js.map +1 -0
  134. package/dist/crypto/credentials.js +219 -0
  135. package/dist/crypto/credentials.js.map +1 -0
  136. package/dist/discovery.js +182 -0
  137. package/dist/discovery.js.map +1 -0
  138. package/dist/engine-result.js +12 -0
  139. package/dist/engine-result.js.map +1 -0
  140. package/dist/error-catalog.js +404 -0
  141. package/dist/error-catalog.js.map +1 -0
  142. package/dist/error-registry.js +393 -0
  143. package/dist/error-registry.js.map +1 -0
  144. package/dist/errors.js +173 -0
  145. package/dist/errors.js.map +1 -0
  146. package/dist/hooks/handlers/agent-hooks.js +106 -0
  147. package/dist/hooks/handlers/agent-hooks.js.map +1 -0
  148. package/dist/hooks/handlers/conduit-hooks.d.ts +72 -0
  149. package/dist/hooks/handlers/conduit-hooks.d.ts.map +1 -0
  150. package/dist/hooks/handlers/conduit-hooks.js +229 -0
  151. package/dist/hooks/handlers/conduit-hooks.js.map +1 -0
  152. package/dist/hooks/handlers/context-hooks.js +111 -0
  153. package/dist/hooks/handlers/context-hooks.js.map +1 -0
  154. package/dist/hooks/handlers/error-hooks.js +52 -0
  155. package/dist/hooks/handlers/error-hooks.js.map +1 -0
  156. package/dist/hooks/handlers/file-hooks.js +104 -0
  157. package/dist/hooks/handlers/file-hooks.js.map +1 -0
  158. package/dist/hooks/handlers/handler-helpers.js +61 -0
  159. package/dist/hooks/handlers/handler-helpers.js.map +1 -0
  160. package/dist/hooks/handlers/index.d.ts +6 -0
  161. package/dist/hooks/handlers/index.d.ts.map +1 -1
  162. package/dist/hooks/handlers/index.js +37 -0
  163. package/dist/hooks/handlers/index.js.map +1 -0
  164. package/dist/hooks/handlers/intelligence-hooks.d.ts +26 -0
  165. package/dist/hooks/handlers/intelligence-hooks.d.ts.map +1 -0
  166. package/dist/hooks/handlers/intelligence-hooks.js +69 -0
  167. package/dist/hooks/handlers/intelligence-hooks.js.map +1 -0
  168. package/dist/hooks/handlers/memory-bridge-refresh.js +42 -0
  169. package/dist/hooks/handlers/memory-bridge-refresh.js.map +1 -0
  170. package/dist/hooks/handlers/notification-hooks.js +62 -0
  171. package/dist/hooks/handlers/notification-hooks.js.map +1 -0
  172. package/dist/hooks/handlers/session-hooks.d.ts +30 -0
  173. package/dist/hooks/handlers/session-hooks.d.ts.map +1 -1
  174. package/dist/hooks/handlers/session-hooks.js +190 -0
  175. package/dist/hooks/handlers/session-hooks.js.map +1 -0
  176. package/dist/hooks/handlers/task-hooks.d.ts +2 -0
  177. package/dist/hooks/handlers/task-hooks.d.ts.map +1 -1
  178. package/dist/hooks/handlers/task-hooks.js +79 -0
  179. package/dist/hooks/handlers/task-hooks.js.map +1 -0
  180. package/dist/hooks/handlers/watchdog-hooks.d.ts +49 -0
  181. package/dist/hooks/handlers/watchdog-hooks.d.ts.map +1 -0
  182. package/dist/hooks/handlers/watchdog-hooks.js +162 -0
  183. package/dist/hooks/handlers/watchdog-hooks.js.map +1 -0
  184. package/dist/hooks/handlers/work-capture-hooks.js +165 -0
  185. package/dist/hooks/handlers/work-capture-hooks.js.map +1 -0
  186. package/dist/hooks/index.js +13 -0
  187. package/dist/hooks/index.js.map +1 -0
  188. package/dist/hooks/payload-schemas.js +220 -0
  189. package/dist/hooks/payload-schemas.js.map +1 -0
  190. package/dist/hooks/provider-hooks.js +66 -0
  191. package/dist/hooks/provider-hooks.js.map +1 -0
  192. package/dist/hooks/registry.js +229 -0
  193. package/dist/hooks/registry.js.map +1 -0
  194. package/dist/hooks/types.js +66 -0
  195. package/dist/hooks/types.js.map +1 -0
  196. package/dist/hooks.js +136 -0
  197. package/dist/hooks.js.map +1 -0
  198. package/dist/index.js +56736 -47002
  199. package/dist/index.js.map +4 -4
  200. package/dist/init.js +920 -0
  201. package/dist/init.js.map +1 -0
  202. package/dist/inject/index.js +82 -0
  203. package/dist/inject/index.js.map +1 -0
  204. package/dist/injection.d.ts +13 -1
  205. package/dist/injection.d.ts.map +1 -1
  206. package/dist/injection.js +377 -0
  207. package/dist/injection.js.map +1 -0
  208. package/dist/intelligence/adaptive-validation.js +497 -0
  209. package/dist/intelligence/adaptive-validation.js.map +1 -0
  210. package/dist/intelligence/impact.js +675 -0
  211. package/dist/intelligence/impact.js.map +1 -0
  212. package/dist/intelligence/index.js +22 -0
  213. package/dist/intelligence/index.js.map +1 -0
  214. package/dist/intelligence/patterns.js +492 -0
  215. package/dist/intelligence/patterns.js.map +1 -0
  216. package/dist/intelligence/prediction.js +499 -0
  217. package/dist/intelligence/prediction.js.map +1 -0
  218. package/dist/intelligence/types.js +13 -0
  219. package/dist/intelligence/types.js.map +1 -0
  220. package/dist/internal.d.ts +10 -3
  221. package/dist/internal.d.ts.map +1 -1
  222. package/dist/internal.js +321 -0
  223. package/dist/internal.js.map +1 -0
  224. package/dist/issue/create.js +121 -0
  225. package/dist/issue/create.js.map +1 -0
  226. package/dist/issue/diagnostics.js +59 -0
  227. package/dist/issue/diagnostics.js.map +1 -0
  228. package/dist/issue/index.js +10 -0
  229. package/dist/issue/index.js.map +1 -0
  230. package/dist/issue/template-parser.js +267 -0
  231. package/dist/issue/template-parser.js.map +1 -0
  232. package/dist/json-schema-validator.js +76 -0
  233. package/dist/json-schema-validator.js.map +1 -0
  234. package/dist/lib/index.js +11 -0
  235. package/dist/lib/index.js.map +1 -0
  236. package/dist/lib/retry.js +152 -0
  237. package/dist/lib/retry.js.map +1 -0
  238. package/dist/lib/tree-sitter-languages.js +75 -0
  239. package/dist/lib/tree-sitter-languages.js.map +1 -0
  240. package/dist/lifecycle/chain-composition.js +152 -0
  241. package/dist/lifecycle/chain-composition.js.map +1 -0
  242. package/dist/lifecycle/chain-store.js +246 -0
  243. package/dist/lifecycle/chain-store.js.map +1 -0
  244. package/dist/lifecycle/consolidate-rcasd.js +352 -0
  245. package/dist/lifecycle/consolidate-rcasd.js.map +1 -0
  246. package/dist/lifecycle/default-chain.js +176 -0
  247. package/dist/lifecycle/default-chain.js.map +1 -0
  248. package/dist/lifecycle/evidence.js +180 -0
  249. package/dist/lifecycle/evidence.js.map +1 -0
  250. package/dist/lifecycle/frontmatter.js +363 -0
  251. package/dist/lifecycle/frontmatter.js.map +1 -0
  252. package/dist/lifecycle/index.js +756 -0
  253. package/dist/lifecycle/index.js.map +1 -0
  254. package/dist/lifecycle/pipeline.js +656 -0
  255. package/dist/lifecycle/pipeline.js.map +1 -0
  256. package/dist/lifecycle/rcasd-index.js +326 -0
  257. package/dist/lifecycle/rcasd-index.js.map +1 -0
  258. package/dist/lifecycle/rcasd-paths.js +220 -0
  259. package/dist/lifecycle/rcasd-paths.js.map +1 -0
  260. package/dist/lifecycle/resume.js +864 -0
  261. package/dist/lifecycle/resume.js.map +1 -0
  262. package/dist/lifecycle/stage-artifacts.js +94 -0
  263. package/dist/lifecycle/stage-artifacts.js.map +1 -0
  264. package/dist/lifecycle/stage-guidance.js +234 -0
  265. package/dist/lifecycle/stage-guidance.js.map +1 -0
  266. package/dist/lifecycle/stages.js +534 -0
  267. package/dist/lifecycle/stages.js.map +1 -0
  268. package/dist/lifecycle/state-machine.js +516 -0
  269. package/dist/lifecycle/state-machine.js.map +1 -0
  270. package/dist/lifecycle/tessera-engine.js +249 -0
  271. package/dist/lifecycle/tessera-engine.js.map +1 -0
  272. package/dist/logger.js +140 -0
  273. package/dist/logger.js.map +1 -0
  274. package/dist/memory/anthropic-key-resolver.d.ts +35 -0
  275. package/dist/memory/anthropic-key-resolver.d.ts.map +1 -0
  276. package/dist/memory/anthropic-key-resolver.js +105 -0
  277. package/dist/memory/anthropic-key-resolver.js.map +1 -0
  278. package/dist/memory/auto-extract.d.ts +38 -42
  279. package/dist/memory/auto-extract.d.ts.map +1 -1
  280. package/dist/memory/auto-extract.js +77 -0
  281. package/dist/memory/auto-extract.js.map +1 -0
  282. package/dist/memory/brain-backfill.js +389 -0
  283. package/dist/memory/brain-backfill.js.map +1 -0
  284. package/dist/memory/brain-consolidator.d.ts +48 -0
  285. package/dist/memory/brain-consolidator.d.ts.map +1 -0
  286. package/dist/memory/brain-consolidator.js +294 -0
  287. package/dist/memory/brain-consolidator.js.map +1 -0
  288. package/dist/memory/brain-embedding.js +66 -0
  289. package/dist/memory/brain-embedding.js.map +1 -0
  290. package/dist/memory/brain-lifecycle.d.ts +83 -2
  291. package/dist/memory/brain-lifecycle.d.ts.map +1 -1
  292. package/dist/memory/brain-lifecycle.js +807 -0
  293. package/dist/memory/brain-lifecycle.js.map +1 -0
  294. package/dist/memory/brain-links.js +161 -0
  295. package/dist/memory/brain-links.js.map +1 -0
  296. package/dist/memory/brain-maintenance.js +114 -0
  297. package/dist/memory/brain-maintenance.js.map +1 -0
  298. package/dist/memory/brain-migration.js +149 -0
  299. package/dist/memory/brain-migration.js.map +1 -0
  300. package/dist/memory/brain-purge.js +243 -0
  301. package/dist/memory/brain-purge.js.map +1 -0
  302. package/dist/memory/brain-reasoning.js +215 -0
  303. package/dist/memory/brain-reasoning.js.map +1 -0
  304. package/dist/memory/brain-retrieval.d.ts +75 -1
  305. package/dist/memory/brain-retrieval.d.ts.map +1 -1
  306. package/dist/memory/brain-retrieval.js +1044 -0
  307. package/dist/memory/brain-retrieval.js.map +1 -0
  308. package/dist/memory/brain-row-types.js +10 -0
  309. package/dist/memory/brain-row-types.js.map +1 -0
  310. package/dist/memory/brain-search.d.ts +82 -15
  311. package/dist/memory/brain-search.d.ts.map +1 -1
  312. package/dist/memory/brain-search.js +613 -0
  313. package/dist/memory/brain-search.js.map +1 -0
  314. package/dist/memory/brain-similarity.js +145 -0
  315. package/dist/memory/brain-similarity.js.map +1 -0
  316. package/dist/memory/claude-mem-migration.js +277 -0
  317. package/dist/memory/claude-mem-migration.js.map +1 -0
  318. package/dist/memory/decisions.d.ts.map +1 -1
  319. package/dist/memory/decisions.js +218 -0
  320. package/dist/memory/decisions.js.map +1 -0
  321. package/dist/memory/embedding-local.js +102 -0
  322. package/dist/memory/embedding-local.js.map +1 -0
  323. package/dist/memory/embedding-queue.js +271 -0
  324. package/dist/memory/embedding-queue.js.map +1 -0
  325. package/dist/memory/embedding-worker.js +58 -0
  326. package/dist/memory/embedding-worker.js.map +1 -0
  327. package/dist/memory/engine-compat.d.ts +16 -1
  328. package/dist/memory/engine-compat.d.ts.map +1 -1
  329. package/dist/memory/engine-compat.js +1561 -0
  330. package/dist/memory/engine-compat.js.map +1 -0
  331. package/dist/memory/extraction-gate.d.ts +139 -0
  332. package/dist/memory/extraction-gate.d.ts.map +1 -0
  333. package/dist/memory/extraction-gate.js +459 -0
  334. package/dist/memory/extraction-gate.js.map +1 -0
  335. package/dist/memory/graph-auto-populate.js +148 -0
  336. package/dist/memory/graph-auto-populate.js.map +1 -0
  337. package/dist/memory/graph-queries.js +290 -0
  338. package/dist/memory/graph-queries.js.map +1 -0
  339. package/dist/memory/index.d.ts +2 -0
  340. package/dist/memory/index.d.ts.map +1 -1
  341. package/dist/memory/index.js +1144 -0
  342. package/dist/memory/index.js.map +1 -0
  343. package/dist/memory/learnings.d.ts +14 -0
  344. package/dist/memory/learnings.d.ts.map +1 -1
  345. package/dist/memory/learnings.js +179 -0
  346. package/dist/memory/learnings.js.map +1 -0
  347. package/dist/memory/llm-extraction.d.ts +107 -0
  348. package/dist/memory/llm-extraction.d.ts.map +1 -0
  349. package/dist/memory/llm-extraction.js +425 -0
  350. package/dist/memory/llm-extraction.js.map +1 -0
  351. package/dist/memory/memory-bridge.js +382 -0
  352. package/dist/memory/memory-bridge.js.map +1 -0
  353. package/dist/memory/mental-model-injection.js +61 -0
  354. package/dist/memory/mental-model-injection.js.map +1 -0
  355. package/dist/memory/mental-model-queue.js +211 -0
  356. package/dist/memory/mental-model-queue.js.map +1 -0
  357. package/dist/memory/observer-reflector.d.ts +157 -0
  358. package/dist/memory/observer-reflector.d.ts.map +1 -0
  359. package/dist/memory/observer-reflector.js +626 -0
  360. package/dist/memory/observer-reflector.js.map +1 -0
  361. package/dist/memory/patterns.d.ts +24 -4
  362. package/dist/memory/patterns.d.ts.map +1 -1
  363. package/dist/memory/patterns.js +174 -0
  364. package/dist/memory/patterns.js.map +1 -0
  365. package/dist/memory/pipeline-manifest-sqlite.js +975 -0
  366. package/dist/memory/pipeline-manifest-sqlite.js.map +1 -0
  367. package/dist/memory/quality-scoring.d.ts +42 -5
  368. package/dist/memory/quality-scoring.d.ts.map +1 -1
  369. package/dist/memory/quality-scoring.js +182 -0
  370. package/dist/memory/quality-scoring.js.map +1 -0
  371. package/dist/memory/session-memory.js +331 -0
  372. package/dist/memory/session-memory.js.map +1 -0
  373. package/dist/metrics/ab-test.js +260 -0
  374. package/dist/metrics/ab-test.js.map +1 -0
  375. package/dist/metrics/aggregation.js +363 -0
  376. package/dist/metrics/aggregation.js.map +1 -0
  377. package/dist/metrics/common.js +64 -0
  378. package/dist/metrics/common.js.map +1 -0
  379. package/dist/metrics/enums.js +78 -0
  380. package/dist/metrics/enums.js.map +1 -0
  381. package/dist/metrics/index.js +19 -0
  382. package/dist/metrics/index.js.map +1 -0
  383. package/dist/metrics/model-provider-registry.js +88 -0
  384. package/dist/metrics/model-provider-registry.js.map +1 -0
  385. package/dist/metrics/otel-integration.js +263 -0
  386. package/dist/metrics/otel-integration.js.map +1 -0
  387. package/dist/metrics/provider-detection.js +103 -0
  388. package/dist/metrics/provider-detection.js.map +1 -0
  389. package/dist/metrics/token-estimation.js +253 -0
  390. package/dist/metrics/token-estimation.js.map +1 -0
  391. package/dist/metrics/token-service.js +450 -0
  392. package/dist/metrics/token-service.js.map +1 -0
  393. package/dist/migration/agent-outputs.js +316 -0
  394. package/dist/migration/agent-outputs.js.map +1 -0
  395. package/dist/migration/checksum.js +92 -0
  396. package/dist/migration/checksum.js.map +1 -0
  397. package/dist/migration/index.js +282 -0
  398. package/dist/migration/index.js.map +1 -0
  399. package/dist/migration/logger.js +360 -0
  400. package/dist/migration/logger.js.map +1 -0
  401. package/dist/migration/preflight.js +9 -0
  402. package/dist/migration/preflight.js.map +1 -0
  403. package/dist/migration/state.js +421 -0
  404. package/dist/migration/state.js.map +1 -0
  405. package/dist/migration/validate.js +241 -0
  406. package/dist/migration/validate.js.map +1 -0
  407. package/dist/mvi-helpers.js +73 -0
  408. package/dist/mvi-helpers.js.map +1 -0
  409. package/dist/nexus/deps.js +375 -0
  410. package/dist/nexus/deps.js.map +1 -0
  411. package/dist/nexus/discover.js +288 -0
  412. package/dist/nexus/discover.js.map +1 -0
  413. package/dist/nexus/hash.js +10 -0
  414. package/dist/nexus/hash.js.map +1 -0
  415. package/dist/nexus/index.js +40 -0
  416. package/dist/nexus/index.js.map +1 -0
  417. package/dist/nexus/migrate-json-to-sqlite.js +115 -0
  418. package/dist/nexus/migrate-json-to-sqlite.js.map +1 -0
  419. package/dist/nexus/nexus-bridge.d.ts +51 -0
  420. package/dist/nexus/nexus-bridge.d.ts.map +1 -0
  421. package/dist/nexus/nexus-bridge.js +321 -0
  422. package/dist/nexus/nexus-bridge.js.map +1 -0
  423. package/dist/nexus/permissions.js +105 -0
  424. package/dist/nexus/permissions.js.map +1 -0
  425. package/dist/nexus/query.js +175 -0
  426. package/dist/nexus/query.js.map +1 -0
  427. package/dist/nexus/registry.js +584 -0
  428. package/dist/nexus/registry.js.map +1 -0
  429. package/dist/nexus/sharing/index.js +288 -0
  430. package/dist/nexus/sharing/index.js.map +1 -0
  431. package/dist/nexus/transfer-types.js +8 -0
  432. package/dist/nexus/transfer-types.js.map +1 -0
  433. package/dist/nexus/transfer.js +271 -0
  434. package/dist/nexus/transfer.js.map +1 -0
  435. package/dist/nexus/workspace.js +355 -0
  436. package/dist/nexus/workspace.js.map +1 -0
  437. package/dist/observability/index.js +103 -0
  438. package/dist/observability/index.js.map +1 -0
  439. package/dist/observability/log-filter.js +63 -0
  440. package/dist/observability/log-filter.js.map +1 -0
  441. package/dist/observability/log-parser.js +99 -0
  442. package/dist/observability/log-parser.js.map +1 -0
  443. package/dist/observability/log-reader.js +139 -0
  444. package/dist/observability/log-reader.js.map +1 -0
  445. package/dist/observability/types.js +19 -0
  446. package/dist/observability/types.js.map +1 -0
  447. package/dist/orchestration/analyze.js +107 -0
  448. package/dist/orchestration/analyze.js.map +1 -0
  449. package/dist/orchestration/bootstrap.js +132 -0
  450. package/dist/orchestration/bootstrap.js.map +1 -0
  451. package/dist/orchestration/context.js +56 -0
  452. package/dist/orchestration/context.js.map +1 -0
  453. package/dist/orchestration/critical-path.js +100 -0
  454. package/dist/orchestration/critical-path.js.map +1 -0
  455. package/dist/orchestration/hierarchy.js +183 -0
  456. package/dist/orchestration/hierarchy.js.map +1 -0
  457. package/dist/orchestration/index.js +287 -0
  458. package/dist/orchestration/index.js.map +1 -0
  459. package/dist/orchestration/parallel.js +89 -0
  460. package/dist/orchestration/parallel.js.map +1 -0
  461. package/dist/orchestration/protocol-validators.js +815 -0
  462. package/dist/orchestration/protocol-validators.js.map +1 -0
  463. package/dist/orchestration/skill-ops.js +98 -0
  464. package/dist/orchestration/skill-ops.js.map +1 -0
  465. package/dist/orchestration/status.js +107 -0
  466. package/dist/orchestration/status.js.map +1 -0
  467. package/dist/orchestration/unblock.js +103 -0
  468. package/dist/orchestration/unblock.js.map +1 -0
  469. package/dist/orchestration/validate-spawn.js +67 -0
  470. package/dist/orchestration/validate-spawn.js.map +1 -0
  471. package/dist/orchestration/waves.js +86 -0
  472. package/dist/orchestration/waves.js.map +1 -0
  473. package/dist/otel/index.js +163 -0
  474. package/dist/otel/index.js.map +1 -0
  475. package/dist/output.js +164 -0
  476. package/dist/output.js.map +1 -0
  477. package/dist/pagination.js +64 -0
  478. package/dist/pagination.js.map +1 -0
  479. package/dist/paths.js +882 -0
  480. package/dist/paths.js.map +1 -0
  481. package/dist/phases/deps.js +372 -0
  482. package/dist/phases/deps.js.map +1 -0
  483. package/dist/phases/index.js +349 -0
  484. package/dist/phases/index.js.map +1 -0
  485. package/dist/pipeline/index.js +10 -0
  486. package/dist/pipeline/index.js.map +1 -0
  487. package/dist/pipeline/phase.js +45 -0
  488. package/dist/pipeline/phase.js.map +1 -0
  489. package/dist/platform.js +211 -0
  490. package/dist/platform.js.map +1 -0
  491. package/dist/project-info.js +84 -0
  492. package/dist/project-info.js.map +1 -0
  493. package/dist/reconciliation/index.js +10 -0
  494. package/dist/reconciliation/index.js.map +1 -0
  495. package/dist/reconciliation/link-store.js +175 -0
  496. package/dist/reconciliation/link-store.js.map +1 -0
  497. package/dist/reconciliation/reconciliation-engine.js +298 -0
  498. package/dist/reconciliation/reconciliation-engine.js.map +1 -0
  499. package/dist/release/artifacts.js +427 -0
  500. package/dist/release/artifacts.js.map +1 -0
  501. package/dist/release/changelog-writer.js +151 -0
  502. package/dist/release/changelog-writer.js.map +1 -0
  503. package/dist/release/channel.js +144 -0
  504. package/dist/release/channel.js.map +1 -0
  505. package/dist/release/ci.js +166 -0
  506. package/dist/release/ci.js.map +1 -0
  507. package/dist/release/github-pr.js +225 -0
  508. package/dist/release/github-pr.js.map +1 -0
  509. package/dist/release/guards.js +116 -0
  510. package/dist/release/guards.js.map +1 -0
  511. package/dist/release/index.js +22 -0
  512. package/dist/release/index.js.map +1 -0
  513. package/dist/release/release-config.js +158 -0
  514. package/dist/release/release-config.js.map +1 -0
  515. package/dist/release/release-manifest.js +1019 -0
  516. package/dist/release/release-manifest.js.map +1 -0
  517. package/dist/release/version-bump.js +255 -0
  518. package/dist/release/version-bump.js.map +1 -0
  519. package/dist/remote/index.js +257 -0
  520. package/dist/remote/index.js.map +1 -0
  521. package/dist/repair.js +130 -0
  522. package/dist/repair.js.map +1 -0
  523. package/dist/research/index.js +2 -0
  524. package/dist/research/index.js.map +1 -0
  525. package/dist/roadmap/index.js +59 -0
  526. package/dist/roadmap/index.js.map +1 -0
  527. package/dist/routing/capability-matrix.js +1556 -0
  528. package/dist/routing/capability-matrix.js.map +1 -0
  529. package/dist/routing/index.js +9 -0
  530. package/dist/routing/index.js.map +1 -0
  531. package/dist/scaffold.d.ts +18 -0
  532. package/dist/scaffold.d.ts.map +1 -1
  533. package/dist/scaffold.js +1798 -0
  534. package/dist/scaffold.js.map +1 -0
  535. package/dist/schema-management.js +295 -0
  536. package/dist/schema-management.js.map +1 -0
  537. package/dist/security/index.js +9 -0
  538. package/dist/security/index.js.map +1 -0
  539. package/dist/security/input-sanitization.js +326 -0
  540. package/dist/security/input-sanitization.js.map +1 -0
  541. package/dist/sequence/index.js +295 -0
  542. package/dist/sequence/index.js.map +1 -0
  543. package/dist/sessions/assumptions.js +54 -0
  544. package/dist/sessions/assumptions.js.map +1 -0
  545. package/dist/sessions/briefing.js +377 -0
  546. package/dist/sessions/briefing.js.map +1 -0
  547. package/dist/sessions/context-alert.js +222 -0
  548. package/dist/sessions/context-alert.js.map +1 -0
  549. package/dist/sessions/context-inject.js +61 -0
  550. package/dist/sessions/context-inject.js.map +1 -0
  551. package/dist/sessions/context-monitor.js +98 -0
  552. package/dist/sessions/context-monitor.js.map +1 -0
  553. package/dist/sessions/decisions.js +65 -0
  554. package/dist/sessions/decisions.js.map +1 -0
  555. package/dist/sessions/find.js +65 -0
  556. package/dist/sessions/find.js.map +1 -0
  557. package/dist/sessions/handoff.js +328 -0
  558. package/dist/sessions/handoff.js.map +1 -0
  559. package/dist/sessions/hitl-warnings.js +254 -0
  560. package/dist/sessions/hitl-warnings.js.map +1 -0
  561. package/dist/sessions/index.js +327 -0
  562. package/dist/sessions/index.js.map +1 -0
  563. package/dist/sessions/session-archive.js +40 -0
  564. package/dist/sessions/session-archive.js.map +1 -0
  565. package/dist/sessions/session-cleanup.js +59 -0
  566. package/dist/sessions/session-cleanup.js.map +1 -0
  567. package/dist/sessions/session-drift.js +134 -0
  568. package/dist/sessions/session-drift.js.map +1 -0
  569. package/dist/sessions/session-enforcement.js +144 -0
  570. package/dist/sessions/session-enforcement.js.map +1 -0
  571. package/dist/sessions/session-grade.js +253 -0
  572. package/dist/sessions/session-grade.js.map +1 -0
  573. package/dist/sessions/session-history.js +42 -0
  574. package/dist/sessions/session-history.js.map +1 -0
  575. package/dist/sessions/session-id.js +81 -0
  576. package/dist/sessions/session-id.js.map +1 -0
  577. package/dist/sessions/session-memory-bridge.js +30 -0
  578. package/dist/sessions/session-memory-bridge.js.map +1 -0
  579. package/dist/sessions/session-show.js +24 -0
  580. package/dist/sessions/session-show.js.map +1 -0
  581. package/dist/sessions/session-stats.js +69 -0
  582. package/dist/sessions/session-stats.js.map +1 -0
  583. package/dist/sessions/session-suspend.js +39 -0
  584. package/dist/sessions/session-suspend.js.map +1 -0
  585. package/dist/sessions/session-switch.js +51 -0
  586. package/dist/sessions/session-switch.js.map +1 -0
  587. package/dist/sessions/session-view.js +76 -0
  588. package/dist/sessions/session-view.js.map +1 -0
  589. package/dist/sessions/snapshot.js +213 -0
  590. package/dist/sessions/snapshot.js.map +1 -0
  591. package/dist/sessions/statusline-setup.js +85 -0
  592. package/dist/sessions/statusline-setup.js.map +1 -0
  593. package/dist/sessions/types.js +8 -0
  594. package/dist/sessions/types.js.map +1 -0
  595. package/dist/skills/agents/config.js +94 -0
  596. package/dist/skills/agents/config.js.map +1 -0
  597. package/dist/skills/agents/install.js +116 -0
  598. package/dist/skills/agents/install.js.map +1 -0
  599. package/dist/skills/agents/registry.js +161 -0
  600. package/dist/skills/agents/registry.js.map +1 -0
  601. package/dist/skills/discovery.js +333 -0
  602. package/dist/skills/discovery.js.map +1 -0
  603. package/dist/skills/dispatch.js +347 -0
  604. package/dist/skills/dispatch.js.map +1 -0
  605. package/dist/skills/dynamic-skill-generator.js +87 -0
  606. package/dist/skills/dynamic-skill-generator.js.map +1 -0
  607. package/dist/skills/index.js +44 -0
  608. package/dist/skills/index.js.map +1 -0
  609. package/dist/skills/injection/subagent.js +195 -0
  610. package/dist/skills/injection/subagent.js.map +1 -0
  611. package/dist/skills/injection/token.js +260 -0
  612. package/dist/skills/injection/token.js.map +1 -0
  613. package/dist/skills/install.js +40 -0
  614. package/dist/skills/install.js.map +1 -0
  615. package/dist/skills/manifests/contribution.js +175 -0
  616. package/dist/skills/manifests/contribution.js.map +1 -0
  617. package/dist/skills/manifests/research.js +281 -0
  618. package/dist/skills/manifests/research.js.map +1 -0
  619. package/dist/skills/manifests/resolver.js +146 -0
  620. package/dist/skills/manifests/resolver.js.map +1 -0
  621. package/dist/skills/marketplace.js +90 -0
  622. package/dist/skills/marketplace.js.map +1 -0
  623. package/dist/skills/orchestrator/spawn.js +178 -0
  624. package/dist/skills/orchestrator/spawn.js.map +1 -0
  625. package/dist/skills/orchestrator/startup.js +451 -0
  626. package/dist/skills/orchestrator/startup.js.map +1 -0
  627. package/dist/skills/orchestrator/validator.js +301 -0
  628. package/dist/skills/orchestrator/validator.js.map +1 -0
  629. package/dist/skills/precedence-integration.js +73 -0
  630. package/dist/skills/precedence-integration.js.map +1 -0
  631. package/dist/skills/precedence-types.js +16 -0
  632. package/dist/skills/precedence-types.js.map +1 -0
  633. package/dist/skills/routing-table.js +63 -0
  634. package/dist/skills/routing-table.js.map +1 -0
  635. package/dist/skills/skill-paths.js +217 -0
  636. package/dist/skills/skill-paths.js.map +1 -0
  637. package/dist/skills/test-utility.js +55 -0
  638. package/dist/skills/test-utility.js.map +1 -0
  639. package/dist/skills/types.js +118 -0
  640. package/dist/skills/types.js.map +1 -0
  641. package/dist/skills/validation.js +183 -0
  642. package/dist/skills/validation.js.map +1 -0
  643. package/dist/skills/version.js +57 -0
  644. package/dist/skills/version.js.map +1 -0
  645. package/dist/snapshot/index.js +188 -0
  646. package/dist/snapshot/index.js.map +1 -0
  647. package/dist/spawn/adapter-registry.js +246 -0
  648. package/dist/spawn/adapter-registry.js.map +1 -0
  649. package/dist/spawn/index.js +10 -0
  650. package/dist/spawn/index.js.map +1 -0
  651. package/dist/stats/index.d.ts.map +1 -1
  652. package/dist/stats/index.js +350 -0
  653. package/dist/stats/index.js.map +1 -0
  654. package/dist/stats/workflow-telemetry.js +400 -0
  655. package/dist/stats/workflow-telemetry.js.map +1 -0
  656. package/dist/sticky/archive.js +47 -0
  657. package/dist/sticky/archive.js.map +1 -0
  658. package/dist/sticky/convert.js +235 -0
  659. package/dist/sticky/convert.js.map +1 -0
  660. package/dist/sticky/create.js +48 -0
  661. package/dist/sticky/create.js.map +1 -0
  662. package/dist/sticky/id.js +35 -0
  663. package/dist/sticky/id.js.map +1 -0
  664. package/dist/sticky/index.js +16 -0
  665. package/dist/sticky/index.js.map +1 -0
  666. package/dist/sticky/list.js +57 -0
  667. package/dist/sticky/list.js.map +1 -0
  668. package/dist/sticky/purge.js +45 -0
  669. package/dist/sticky/purge.js.map +1 -0
  670. package/dist/sticky/show.js +42 -0
  671. package/dist/sticky/show.js.map +1 -0
  672. package/dist/sticky/types.js +10 -0
  673. package/dist/sticky/types.js.map +1 -0
  674. package/dist/store/agent-registry-accessor.js +886 -0
  675. package/dist/store/agent-registry-accessor.js.map +1 -0
  676. package/dist/store/api-key-kdf.js +84 -0
  677. package/dist/store/api-key-kdf.js.map +1 -0
  678. package/dist/store/atomic.js +167 -0
  679. package/dist/store/atomic.js.map +1 -0
  680. package/dist/store/backup-crypto.js +184 -0
  681. package/dist/store/backup-crypto.js.map +1 -0
  682. package/dist/store/backup-pack.js +581 -0
  683. package/dist/store/backup-pack.js.map +1 -0
  684. package/dist/store/backup-unpack.js +449 -0
  685. package/dist/store/backup-unpack.js.map +1 -0
  686. package/dist/store/backup.js +94 -0
  687. package/dist/store/backup.js.map +1 -0
  688. package/dist/store/brain-accessor.js +429 -0
  689. package/dist/store/brain-accessor.js.map +1 -0
  690. package/dist/store/brain-schema.d.ts +663 -39
  691. package/dist/store/brain-schema.d.ts.map +1 -1
  692. package/dist/store/brain-schema.js +579 -0
  693. package/dist/store/brain-schema.js.map +1 -0
  694. package/dist/store/brain-sqlite.d.ts.map +1 -1
  695. package/dist/store/brain-sqlite.js +297 -0
  696. package/dist/store/brain-sqlite.js.map +1 -0
  697. package/dist/store/cache.js +168 -0
  698. package/dist/store/cache.js.map +1 -0
  699. package/dist/store/chain-schema.js +51 -0
  700. package/dist/store/chain-schema.js.map +1 -0
  701. package/dist/store/cleanup-legacy.js +171 -0
  702. package/dist/store/cleanup-legacy.js.map +1 -0
  703. package/dist/store/conduit-sqlite.js +570 -0
  704. package/dist/store/conduit-sqlite.js.map +1 -0
  705. package/dist/store/converters.js +124 -0
  706. package/dist/store/converters.js.map +1 -0
  707. package/dist/store/cross-db-cleanup.js +319 -0
  708. package/dist/store/cross-db-cleanup.js.map +1 -0
  709. package/dist/store/data-accessor.js +26 -0
  710. package/dist/store/data-accessor.js.map +1 -0
  711. package/dist/store/data-safety-central.js +269 -0
  712. package/dist/store/data-safety-central.js.map +1 -0
  713. package/dist/store/data-safety.js +274 -0
  714. package/dist/store/data-safety.js.map +1 -0
  715. package/dist/store/db-helpers.js +224 -0
  716. package/dist/store/db-helpers.js.map +1 -0
  717. package/dist/store/export.js +155 -0
  718. package/dist/store/export.js.map +1 -0
  719. package/dist/store/file-utils.js +270 -0
  720. package/dist/store/file-utils.js.map +1 -0
  721. package/dist/store/git-checkpoint.js +365 -0
  722. package/dist/store/git-checkpoint.js.map +1 -0
  723. package/dist/store/global-salt.js +147 -0
  724. package/dist/store/global-salt.js.map +1 -0
  725. package/dist/store/import-logging.js +139 -0
  726. package/dist/store/import-logging.js.map +1 -0
  727. package/dist/store/import-remap.js +145 -0
  728. package/dist/store/import-remap.js.map +1 -0
  729. package/dist/store/import-sort.js +121 -0
  730. package/dist/store/import-sort.js.map +1 -0
  731. package/dist/store/index.js +29 -0
  732. package/dist/store/index.js.map +1 -0
  733. package/dist/store/json.js +208 -0
  734. package/dist/store/json.js.map +1 -0
  735. package/dist/store/lifecycle-store.js +249 -0
  736. package/dist/store/lifecycle-store.js.map +1 -0
  737. package/dist/store/lock.js +70 -0
  738. package/dist/store/lock.js.map +1 -0
  739. package/dist/store/migrate-signaldock-to-conduit.js +562 -0
  740. package/dist/store/migrate-signaldock-to-conduit.js.map +1 -0
  741. package/dist/store/migration-manager.d.ts +5 -1
  742. package/dist/store/migration-manager.d.ts.map +1 -1
  743. package/dist/store/migration-manager.js +288 -0
  744. package/dist/store/migration-manager.js.map +1 -0
  745. package/dist/store/migration-sqlite.js +676 -0
  746. package/dist/store/migration-sqlite.js.map +1 -0
  747. package/dist/store/nexus-schema.js +268 -0
  748. package/dist/store/nexus-schema.js.map +1 -0
  749. package/dist/store/nexus-sqlite.js +242 -0
  750. package/dist/store/nexus-sqlite.js.map +1 -0
  751. package/dist/store/nexus-validation-schemas.js +40 -0
  752. package/dist/store/nexus-validation-schemas.js.map +1 -0
  753. package/dist/store/parsers.js +37 -0
  754. package/dist/store/parsers.js.map +1 -0
  755. package/dist/store/project-detect.js +457 -0
  756. package/dist/store/project-detect.js.map +1 -0
  757. package/dist/store/provider.js +101 -0
  758. package/dist/store/provider.js.map +1 -0
  759. package/dist/store/regenerators.js +207 -0
  760. package/dist/store/regenerators.js.map +1 -0
  761. package/dist/store/restore-conflict-report.js +206 -0
  762. package/dist/store/restore-conflict-report.js.map +1 -0
  763. package/dist/store/restore-json-merge.js +454 -0
  764. package/dist/store/restore-json-merge.js.map +1 -0
  765. package/dist/store/safety-data-accessor.js +257 -0
  766. package/dist/store/safety-data-accessor.js.map +1 -0
  767. package/dist/store/schema.js +7 -0
  768. package/dist/store/schema.js.map +1 -0
  769. package/dist/store/session-store.js +219 -0
  770. package/dist/store/session-store.js.map +1 -0
  771. package/dist/store/signaldock-sqlite.js +550 -0
  772. package/dist/store/signaldock-sqlite.js.map +1 -0
  773. package/dist/store/sqlite-backup.js +498 -0
  774. package/dist/store/sqlite-backup.js.map +1 -0
  775. package/dist/store/sqlite-data-accessor.js +787 -0
  776. package/dist/store/sqlite-data-accessor.js.map +1 -0
  777. package/dist/store/sqlite.js +483 -0
  778. package/dist/store/sqlite.js.map +1 -0
  779. package/dist/store/status-registry.js +8 -0
  780. package/dist/store/status-registry.js.map +1 -0
  781. package/dist/store/t310-readiness.js +115 -0
  782. package/dist/store/t310-readiness.js.map +1 -0
  783. package/dist/store/task-store.js +358 -0
  784. package/dist/store/task-store.js.map +1 -0
  785. package/dist/store/tasks-schema.d.ts +1 -1
  786. package/dist/store/tasks-schema.js +610 -0
  787. package/dist/store/tasks-schema.js.map +1 -0
  788. package/dist/store/typed-query.js +15 -0
  789. package/dist/store/typed-query.js.map +1 -0
  790. package/dist/store/validation-schemas.d.ts +6 -6
  791. package/dist/store/validation-schemas.js +278 -0
  792. package/dist/store/validation-schemas.js.map +1 -0
  793. package/dist/system/archive-analytics.js +277 -0
  794. package/dist/system/archive-analytics.js.map +1 -0
  795. package/dist/system/archive-stats.js +64 -0
  796. package/dist/system/archive-stats.js.map +1 -0
  797. package/dist/system/audit.js +145 -0
  798. package/dist/system/audit.js.map +1 -0
  799. package/dist/system/backup.js +280 -0
  800. package/dist/system/backup.js.map +1 -0
  801. package/dist/system/cleanup.js +134 -0
  802. package/dist/system/cleanup.js.map +1 -0
  803. package/dist/system/dependencies.js +466 -0
  804. package/dist/system/dependencies.js.map +1 -0
  805. package/dist/system/health.d.ts.map +1 -1
  806. package/dist/system/health.js +1206 -0
  807. package/dist/system/health.js.map +1 -0
  808. package/dist/system/index.js +18 -0
  809. package/dist/system/index.js.map +1 -0
  810. package/dist/system/inject-generate.js +122 -0
  811. package/dist/system/inject-generate.js.map +1 -0
  812. package/dist/system/labels.js +38 -0
  813. package/dist/system/labels.js.map +1 -0
  814. package/dist/system/metrics.js +61 -0
  815. package/dist/system/metrics.js.map +1 -0
  816. package/dist/system/migrate.js +43 -0
  817. package/dist/system/migrate.js.map +1 -0
  818. package/dist/system/platform-paths.js +80 -0
  819. package/dist/system/platform-paths.js.map +1 -0
  820. package/dist/system/runtime.js +161 -0
  821. package/dist/system/runtime.js.map +1 -0
  822. package/dist/system/safestop.js +89 -0
  823. package/dist/system/safestop.js.map +1 -0
  824. package/dist/system/storage-preflight.js +123 -0
  825. package/dist/system/storage-preflight.js.map +1 -0
  826. package/dist/task-work/index.js +159 -0
  827. package/dist/task-work/index.js.map +1 -0
  828. package/dist/tasks/add.js +837 -0
  829. package/dist/tasks/add.js.map +1 -0
  830. package/dist/tasks/analyze.js +85 -0
  831. package/dist/tasks/analyze.js.map +1 -0
  832. package/dist/tasks/archive.js +90 -0
  833. package/dist/tasks/archive.js.map +1 -0
  834. package/dist/tasks/atomicity.js +83 -0
  835. package/dist/tasks/atomicity.js.map +1 -0
  836. package/dist/tasks/cancel-ops.js +83 -0
  837. package/dist/tasks/cancel-ops.js.map +1 -0
  838. package/dist/tasks/complete.d.ts.map +1 -1
  839. package/dist/tasks/complete.js +228 -0
  840. package/dist/tasks/complete.js.map +1 -0
  841. package/dist/tasks/crossref-extract.js +73 -0
  842. package/dist/tasks/crossref-extract.js.map +1 -0
  843. package/dist/tasks/delete-preview.js +192 -0
  844. package/dist/tasks/delete-preview.js.map +1 -0
  845. package/dist/tasks/delete.js +120 -0
  846. package/dist/tasks/delete.js.map +1 -0
  847. package/dist/tasks/deletion-strategy.js +200 -0
  848. package/dist/tasks/deletion-strategy.js.map +1 -0
  849. package/dist/tasks/dependency-check.js +278 -0
  850. package/dist/tasks/dependency-check.js.map +1 -0
  851. package/dist/tasks/deps-ready.js +32 -0
  852. package/dist/tasks/deps-ready.js.map +1 -0
  853. package/dist/tasks/enforcement.js +86 -0
  854. package/dist/tasks/enforcement.js.map +1 -0
  855. package/dist/tasks/epic-enforcement.js +294 -0
  856. package/dist/tasks/epic-enforcement.js.map +1 -0
  857. package/dist/tasks/find.js +163 -0
  858. package/dist/tasks/find.js.map +1 -0
  859. package/dist/tasks/graph-cache.js +127 -0
  860. package/dist/tasks/graph-cache.js.map +1 -0
  861. package/dist/tasks/graph-ops.d.ts.map +1 -1
  862. package/dist/tasks/graph-ops.js +173 -0
  863. package/dist/tasks/graph-ops.js.map +1 -0
  864. package/dist/tasks/graph-rag.js +328 -0
  865. package/dist/tasks/graph-rag.js.map +1 -0
  866. package/dist/tasks/hierarchy-policy.js +149 -0
  867. package/dist/tasks/hierarchy-policy.js.map +1 -0
  868. package/dist/tasks/hierarchy.js +185 -0
  869. package/dist/tasks/hierarchy.js.map +1 -0
  870. package/dist/tasks/id-generator.js +65 -0
  871. package/dist/tasks/id-generator.js.map +1 -0
  872. package/dist/tasks/index.js +14 -0
  873. package/dist/tasks/index.js.map +1 -0
  874. package/dist/tasks/labels.js +55 -0
  875. package/dist/tasks/labels.js.map +1 -0
  876. package/dist/tasks/list.js +75 -0
  877. package/dist/tasks/list.js.map +1 -0
  878. package/dist/tasks/phase-tracking.js +133 -0
  879. package/dist/tasks/phase-tracking.js.map +1 -0
  880. package/dist/tasks/pipeline-stage.js +248 -0
  881. package/dist/tasks/pipeline-stage.js.map +1 -0
  882. package/dist/tasks/plan.js +268 -0
  883. package/dist/tasks/plan.js.map +1 -0
  884. package/dist/tasks/relates.js +101 -0
  885. package/dist/tasks/relates.js.map +1 -0
  886. package/dist/tasks/show.js +83 -0
  887. package/dist/tasks/show.js.map +1 -0
  888. package/dist/tasks/size-weighting.js +86 -0
  889. package/dist/tasks/size-weighting.js.map +1 -0
  890. package/dist/tasks/staleness.js +86 -0
  891. package/dist/tasks/staleness.js.map +1 -0
  892. package/dist/tasks/task-ops.js +1741 -0
  893. package/dist/tasks/task-ops.js.map +1 -0
  894. package/dist/tasks/update.js +303 -0
  895. package/dist/tasks/update.js.map +1 -0
  896. package/dist/templates/index.js +10 -0
  897. package/dist/templates/index.js.map +1 -0
  898. package/dist/templates/parser.js +254 -0
  899. package/dist/templates/parser.js.map +1 -0
  900. package/dist/ui/aliases.js +153 -0
  901. package/dist/ui/aliases.js.map +1 -0
  902. package/dist/ui/changelog.js +184 -0
  903. package/dist/ui/changelog.js.map +1 -0
  904. package/dist/ui/command-registry.js +168 -0
  905. package/dist/ui/command-registry.js.map +1 -0
  906. package/dist/ui/flags.js +94 -0
  907. package/dist/ui/flags.js.map +1 -0
  908. package/dist/ui/index.js +24 -0
  909. package/dist/ui/index.js.map +1 -0
  910. package/dist/upgrade.js +1148 -0
  911. package/dist/upgrade.js.map +1 -0
  912. package/dist/validation/chain-validation.js +146 -0
  913. package/dist/validation/chain-validation.js.map +1 -0
  914. package/dist/validation/compliance.js +155 -0
  915. package/dist/validation/compliance.js.map +1 -0
  916. package/dist/validation/docs-sync.js +212 -0
  917. package/dist/validation/docs-sync.js.map +1 -0
  918. package/dist/validation/doctor/checks.js +1069 -0
  919. package/dist/validation/doctor/checks.js.map +1 -0
  920. package/dist/validation/doctor/index.js +9 -0
  921. package/dist/validation/doctor/index.js.map +1 -0
  922. package/dist/validation/doctor/project-cache.js +160 -0
  923. package/dist/validation/doctor/project-cache.js.map +1 -0
  924. package/dist/validation/doctor/utils.js +155 -0
  925. package/dist/validation/doctor/utils.js.map +1 -0
  926. package/dist/validation/engine.js +914 -0
  927. package/dist/validation/engine.js.map +1 -0
  928. package/dist/validation/gap-check.js +175 -0
  929. package/dist/validation/gap-check.js.map +1 -0
  930. package/dist/validation/index.js +40 -0
  931. package/dist/validation/index.js.map +1 -0
  932. package/dist/validation/manifest.js +237 -0
  933. package/dist/validation/manifest.js.map +1 -0
  934. package/dist/validation/operation-gate-validators.js +724 -0
  935. package/dist/validation/operation-gate-validators.js.map +1 -0
  936. package/dist/validation/operation-verification-gates.js +532 -0
  937. package/dist/validation/operation-verification-gates.js.map +1 -0
  938. package/dist/validation/param-utils.js +141 -0
  939. package/dist/validation/param-utils.js.map +1 -0
  940. package/dist/validation/protocol-common.js +300 -0
  941. package/dist/validation/protocol-common.js.map +1 -0
  942. package/dist/validation/protocols/_shared.js +82 -0
  943. package/dist/validation/protocols/_shared.js.map +1 -0
  944. package/dist/validation/protocols/architecture-decision.js +31 -0
  945. package/dist/validation/protocols/architecture-decision.js.map +1 -0
  946. package/dist/validation/protocols/artifact-publish.js +28 -0
  947. package/dist/validation/protocols/artifact-publish.js.map +1 -0
  948. package/dist/validation/protocols/consensus.js +41 -0
  949. package/dist/validation/protocols/consensus.js.map +1 -0
  950. package/dist/validation/protocols/contribution.js +27 -0
  951. package/dist/validation/protocols/contribution.js.map +1 -0
  952. package/dist/validation/protocols/decomposition.js +28 -0
  953. package/dist/validation/protocols/decomposition.js.map +1 -0
  954. package/dist/validation/protocols/implementation.js +24 -0
  955. package/dist/validation/protocols/implementation.js.map +1 -0
  956. package/dist/validation/protocols/provenance.js +29 -0
  957. package/dist/validation/protocols/provenance.js.map +1 -0
  958. package/dist/validation/protocols/release.js +29 -0
  959. package/dist/validation/protocols/release.js.map +1 -0
  960. package/dist/validation/protocols/research.js +24 -0
  961. package/dist/validation/protocols/research.js.map +1 -0
  962. package/dist/validation/protocols/specification.js +27 -0
  963. package/dist/validation/protocols/specification.js.map +1 -0
  964. package/dist/validation/protocols/testing.js +30 -0
  965. package/dist/validation/protocols/testing.js.map +1 -0
  966. package/dist/validation/protocols/validation.js +30 -0
  967. package/dist/validation/protocols/validation.js.map +1 -0
  968. package/dist/validation/schema-integrity.js +170 -0
  969. package/dist/validation/schema-integrity.js.map +1 -0
  970. package/dist/validation/schema-validator.js +176 -0
  971. package/dist/validation/schema-validator.js.map +1 -0
  972. package/dist/validation/validate-ops.js +937 -0
  973. package/dist/validation/validate-ops.js.map +1 -0
  974. package/dist/validation/validation-rules.js +226 -0
  975. package/dist/validation/validation-rules.js.map +1 -0
  976. package/dist/validation/verification.js +321 -0
  977. package/dist/validation/verification.js.map +1 -0
  978. package/migrations/drizzle-brain/20260411000001_t528-graph-schema-expansion/migration.sql +47 -0
  979. package/migrations/drizzle-brain/20260412000001_t531-quality-score-typed-tables/migration.sql +23 -0
  980. package/migrations/drizzle-brain/20260413000001_t549-tiered-typed-memory/migration.sql +195 -0
  981. package/migrations/drizzle-nexus/20260412000001_t529-nexus-graph-tables/migration.sql +49 -0
  982. package/package.json +13 -12
  983. package/src/config.ts +7 -0
  984. package/src/hooks/handlers/__tests__/conduit-hooks.test.ts +356 -0
  985. package/src/hooks/handlers/conduit-hooks.ts +258 -0
  986. package/src/hooks/handlers/index.ts +13 -0
  987. package/src/hooks/handlers/intelligence-hooks.ts +80 -0
  988. package/src/hooks/handlers/session-hooks.ts +78 -0
  989. package/src/hooks/handlers/task-hooks.ts +14 -0
  990. package/src/hooks/handlers/watchdog-hooks.ts +187 -0
  991. package/src/injection.ts +41 -2
  992. package/src/internal.ts +39 -2
  993. package/src/memory/__tests__/auto-extract.test.ts +43 -114
  994. package/src/memory/__tests__/brain-automation.test.ts +16 -39
  995. package/src/memory/__tests__/brain-rrf.test.ts +431 -0
  996. package/src/memory/__tests__/llm-extraction.test.ts +342 -0
  997. package/src/memory/__tests__/observer-reflector.test.ts +475 -0
  998. package/src/memory/anthropic-key-resolver.ts +113 -0
  999. package/src/memory/auto-extract.ts +40 -72
  1000. package/src/memory/brain-consolidator.ts +344 -0
  1001. package/src/memory/brain-lifecycle.ts +636 -2
  1002. package/src/memory/brain-retrieval.ts +630 -18
  1003. package/src/memory/brain-search.ts +234 -132
  1004. package/src/memory/decisions.ts +21 -1
  1005. package/src/memory/engine-compat.ts +25 -15
  1006. package/src/memory/extraction-gate.ts +574 -0
  1007. package/src/memory/index.ts +6 -2
  1008. package/src/memory/learnings.ts +34 -1
  1009. package/src/memory/llm-extraction.ts +524 -0
  1010. package/src/memory/memory-bridge.ts +29 -12
  1011. package/src/memory/observer-reflector.ts +829 -0
  1012. package/src/memory/patterns.ts +30 -1
  1013. package/src/memory/quality-scoring.ts +93 -9
  1014. package/src/nexus/nexus-bridge.ts +444 -0
  1015. package/src/scaffold.ts +42 -0
  1016. package/src/stats/index.ts +11 -3
  1017. package/src/store/brain-schema.ts +282 -0
  1018. package/src/store/brain-sqlite.ts +55 -0
  1019. package/src/store/migration-manager.ts +83 -12
  1020. package/src/system/health.ts +17 -0
  1021. package/src/tasks/complete.ts +7 -10
  1022. package/src/tasks/graph-ops.ts +1 -0
  1023. package/src/tasks/task-ops.ts +1 -1
  1024. package/templates/CLEO-INJECTION.md +15 -0
@@ -0,0 +1,1561 @@
1
+ /**
2
+ * Memory Engine Compatibility Layer — Brain.db Cognitive Memory
3
+ *
4
+ * Async wrappers around brain.db cognitive memory functions that return
5
+ * EngineResult<T> format for consumption by the dispatch layer.
6
+ *
7
+ * After the memory domain cutover (T5241), this file contains ONLY
8
+ * brain.db-backed operations. Manifest operations moved to
9
+ * pipeline-manifest-compat.ts, and context injection moved to
10
+ * sessions/context-inject.ts.
11
+ *
12
+ * @task T5241
13
+ * @epic T5149
14
+ */
15
+ import { getProjectRoot } from '../paths.js';
16
+ // BRAIN accessor for direct table queries (T5241)
17
+ import { getBrainAccessor } from '../store/brain-accessor.js';
18
+ import { getAccessor } from '../store/data-accessor.js';
19
+ import { linkMemoryToTask, unlinkMemoryFromTask } from './brain-links.js';
20
+ // BRAIN retrieval imports (T5131-T5135)
21
+ import { fetchBrainEntries, observeBrain, searchBrainCompact, timelineBrain, } from './brain-retrieval.js';
22
+ // T545: Decision store with quality scoring and graph auto-population
23
+ import { storeDecision } from './decisions.js';
24
+ import { learningStats, searchLearnings, storeLearning, } from './learnings.js';
25
+ // T419: async reinforcement queue for mental-model writes (ULTRAPLAN L5)
26
+ import { isMentalModelObservation, mentalModelQueue } from './mental-model-queue.js';
27
+ // BRAIN memory imports (T4770)
28
+ import { patternStats, searchPatterns, storePattern, } from './patterns.js';
29
+ // ============================================================================
30
+ // Internal helpers
31
+ // ============================================================================
32
+ function resolveRoot(projectRoot) {
33
+ return projectRoot || getProjectRoot();
34
+ }
35
+ /**
36
+ * Parse brain.db entry ID prefix to determine the table type.
37
+ *
38
+ * Conventions:
39
+ * - D... -> decision (D001, D-xxx)
40
+ * - P... -> pattern (P001, P-xxx)
41
+ * - L... -> learning (L001, L-xxx)
42
+ * - O... or CM-... -> observation (O-xxx, CM-xxx)
43
+ */
44
+ function parseIdPrefix(id) {
45
+ if (id.startsWith('D-') || /^D\d/.test(id))
46
+ return 'decision';
47
+ if (id.startsWith('P-') || /^P\d/.test(id))
48
+ return 'pattern';
49
+ if (id.startsWith('L-') || /^L\d/.test(id))
50
+ return 'learning';
51
+ if (id.startsWith('O-') || id.startsWith('O') || id.startsWith('CM-'))
52
+ return 'observation';
53
+ return null;
54
+ }
55
+ // ============================================================================
56
+ // Brain.db Entry Lookup
57
+ // ============================================================================
58
+ /**
59
+ * Look up a brain.db entry by ID.
60
+ *
61
+ * @param entryId - Brain entry ID with type prefix (D-, P-, L-, O-, or CM-)
62
+ * @param projectRoot - Optional project root path; defaults to resolved root
63
+ * @returns EngineResult containing the typed entry data on success
64
+ *
65
+ * @remarks
66
+ * Parses the ID prefix to determine the entry type (decision, pattern, learning,
67
+ * or observation) and queries the corresponding brain.db table.
68
+ *
69
+ * @example
70
+ * ```typescript
71
+ * const result = await memoryShow('O-abc123', '/project');
72
+ * if (result.success) console.log(result.data.type, result.data.entry);
73
+ * ```
74
+ */
75
+ export async function memoryShow(entryId, projectRoot) {
76
+ if (!entryId) {
77
+ return { success: false, error: { code: 'E_INVALID_INPUT', message: 'entryId is required' } };
78
+ }
79
+ try {
80
+ const root = resolveRoot(projectRoot);
81
+ const entryType = parseIdPrefix(entryId);
82
+ if (!entryType) {
83
+ return {
84
+ success: false,
85
+ error: {
86
+ code: 'E_INVALID_INPUT',
87
+ message: `Unknown entry ID format: '${entryId}'. Expected prefix D-, P-, L-, or O-`,
88
+ },
89
+ };
90
+ }
91
+ const accessor = await getBrainAccessor(root);
92
+ switch (entryType) {
93
+ case 'decision': {
94
+ const row = await accessor.getDecision(entryId);
95
+ if (!row) {
96
+ return {
97
+ success: false,
98
+ error: { code: 'E_NOT_FOUND', message: `Decision '${entryId}' not found in brain.db` },
99
+ };
100
+ }
101
+ return { success: true, data: { type: 'decision', entry: row } };
102
+ }
103
+ case 'pattern': {
104
+ const row = await accessor.getPattern(entryId);
105
+ if (!row) {
106
+ return {
107
+ success: false,
108
+ error: { code: 'E_NOT_FOUND', message: `Pattern '${entryId}' not found in brain.db` },
109
+ };
110
+ }
111
+ return { success: true, data: { type: 'pattern', entry: row } };
112
+ }
113
+ case 'learning': {
114
+ const row = await accessor.getLearning(entryId);
115
+ if (!row) {
116
+ return {
117
+ success: false,
118
+ error: { code: 'E_NOT_FOUND', message: `Learning '${entryId}' not found in brain.db` },
119
+ };
120
+ }
121
+ return { success: true, data: { type: 'learning', entry: row } };
122
+ }
123
+ case 'observation': {
124
+ const row = await accessor.getObservation(entryId);
125
+ if (!row) {
126
+ return {
127
+ success: false,
128
+ error: {
129
+ code: 'E_NOT_FOUND',
130
+ message: `Observation '${entryId}' not found in brain.db`,
131
+ },
132
+ };
133
+ }
134
+ return { success: true, data: { type: 'observation', entry: row } };
135
+ }
136
+ }
137
+ }
138
+ catch (error) {
139
+ return {
140
+ success: false,
141
+ error: {
142
+ code: 'E_BRAIN_SHOW',
143
+ message: error instanceof Error ? error.message : String(error),
144
+ },
145
+ };
146
+ }
147
+ }
148
+ // ============================================================================
149
+ // Brain.db Aggregate Stats
150
+ // ============================================================================
151
+ /**
152
+ * Aggregate stats from brain.db across all tables.
153
+ *
154
+ * @param projectRoot - Optional project root path; defaults to resolved root
155
+ * @returns EngineResult with observation, decision, pattern, and learning counts
156
+ *
157
+ * @remarks
158
+ * Queries each brain.db table for row counts and returns a combined statistics object.
159
+ * Returns zero counts if brain.db is not initialized.
160
+ *
161
+ * @example
162
+ * ```typescript
163
+ * const result = await memoryBrainStats('/project');
164
+ * if (result.success) console.log(result.data.observations);
165
+ * ```
166
+ */
167
+ export async function memoryBrainStats(projectRoot) {
168
+ try {
169
+ const root = resolveRoot(projectRoot);
170
+ const { getBrainDb, getBrainNativeDb } = await import('../store/brain-sqlite.js');
171
+ await getBrainDb(root);
172
+ const nativeDb = getBrainNativeDb();
173
+ if (!nativeDb) {
174
+ return {
175
+ success: true,
176
+ data: {
177
+ observations: 0,
178
+ decisions: 0,
179
+ patterns: 0,
180
+ learnings: 0,
181
+ total: 0,
182
+ message: 'brain.db not initialized',
183
+ },
184
+ };
185
+ }
186
+ const obsCount = nativeDb.prepare('SELECT COUNT(*) AS cnt FROM brain_observations').get().cnt;
187
+ const decCount = nativeDb.prepare('SELECT COUNT(*) AS cnt FROM brain_decisions').get().cnt;
188
+ const patCount = nativeDb.prepare('SELECT COUNT(*) AS cnt FROM brain_patterns').get().cnt;
189
+ const learnCount = nativeDb.prepare('SELECT COUNT(*) AS cnt FROM brain_learnings').get().cnt;
190
+ return {
191
+ success: true,
192
+ data: {
193
+ observations: obsCount,
194
+ decisions: decCount,
195
+ patterns: patCount,
196
+ learnings: learnCount,
197
+ total: obsCount + decCount + patCount + learnCount,
198
+ },
199
+ };
200
+ }
201
+ catch (error) {
202
+ return {
203
+ success: false,
204
+ error: {
205
+ code: 'E_BRAIN_STATS',
206
+ message: error instanceof Error ? error.message : String(error),
207
+ },
208
+ };
209
+ }
210
+ }
211
+ // ============================================================================
212
+ // Brain.db Decision Operations
213
+ // ============================================================================
214
+ /**
215
+ * Search decisions in brain.db.
216
+ *
217
+ * @param params - Search parameters (query, limit, etc.)
218
+ * @param projectRoot - Optional project root path; defaults to resolved root
219
+ * @returns EngineResult with matching decision entries
220
+ *
221
+ * @remarks
222
+ * Queries the brain.db decisions table with optional text filtering and pagination.
223
+ *
224
+ * @example
225
+ * ```typescript
226
+ * const result = await memoryDecisionFind({ query: 'auth' }, '/project');
227
+ * ```
228
+ */
229
+ export async function memoryDecisionFind(params, projectRoot) {
230
+ try {
231
+ const root = resolveRoot(projectRoot);
232
+ const accessor = await getBrainAccessor(root);
233
+ if (params.query) {
234
+ const { getBrainDb, getBrainNativeDb } = await import('../store/brain-sqlite.js');
235
+ await getBrainDb(root);
236
+ const nativeDb = getBrainNativeDb();
237
+ if (!nativeDb) {
238
+ return { success: true, data: { decisions: [], total: 0 } };
239
+ }
240
+ const likePattern = `%${params.query}%`;
241
+ const limit = params.limit ?? 20;
242
+ const rows = nativeDb
243
+ .prepare(`
244
+ SELECT * FROM brain_decisions
245
+ WHERE decision LIKE ? OR rationale LIKE ?
246
+ ORDER BY created_at DESC
247
+ LIMIT ?
248
+ `)
249
+ .all(likePattern, likePattern, limit);
250
+ return { success: true, data: { decisions: rows, total: rows.length } };
251
+ }
252
+ const decisions = await accessor.findDecisions({
253
+ contextTaskId: params.taskId,
254
+ limit: params.limit ?? 20,
255
+ });
256
+ return { success: true, data: { decisions, total: decisions.length } };
257
+ }
258
+ catch (error) {
259
+ return {
260
+ success: false,
261
+ error: {
262
+ code: 'E_DECISION_FIND',
263
+ message: error instanceof Error ? error.message : String(error),
264
+ },
265
+ };
266
+ }
267
+ }
268
+ /**
269
+ * Store a decision to brain.db.
270
+ *
271
+ * @param params - Decision data including title, rationale, and alternatives
272
+ * @param projectRoot - Optional project root path; defaults to resolved root
273
+ * @returns EngineResult with the stored decision ID
274
+ *
275
+ * @remarks
276
+ * Creates a new decision entry in brain.db with a D-prefixed ID.
277
+ * Optionally refreshes the memory bridge after storing.
278
+ *
279
+ * @example
280
+ * ```typescript
281
+ * const result = await memoryDecisionStore({ title: 'Use SQLite', rationale: 'Embedded, fast' }, '/project');
282
+ * ```
283
+ */
284
+ export async function memoryDecisionStore(params, projectRoot) {
285
+ if (!params.decision) {
286
+ return {
287
+ success: false,
288
+ error: { code: 'E_INVALID_INPUT', message: 'decision text is required' },
289
+ };
290
+ }
291
+ if (!params.rationale) {
292
+ return { success: false, error: { code: 'E_INVALID_INPUT', message: 'rationale is required' } };
293
+ }
294
+ try {
295
+ const root = resolveRoot(projectRoot);
296
+ // Route through storeDecision() so quality scoring and graph auto-population
297
+ // (upsertGraphNode) run on every insert — fixes T545 regression where
298
+ // engine-compat bypassed decisions.ts and wrote directly to the accessor,
299
+ // leaving quality_score NULL and no graph node created.
300
+ const row = await storeDecision(root, {
301
+ type: 'technical',
302
+ decision: params.decision,
303
+ rationale: params.rationale,
304
+ confidence: 'medium',
305
+ outcome: 'pending',
306
+ alternatives: params.alternatives,
307
+ contextTaskId: params.taskId,
308
+ });
309
+ return {
310
+ success: true,
311
+ data: {
312
+ id: row.id,
313
+ type: row.type,
314
+ decision: row.decision,
315
+ createdAt: row.createdAt,
316
+ },
317
+ };
318
+ }
319
+ catch (error) {
320
+ return {
321
+ success: false,
322
+ error: {
323
+ code: 'E_DECISION_STORE',
324
+ message: error instanceof Error ? error.message : String(error),
325
+ },
326
+ };
327
+ }
328
+ }
329
+ // ============================================================================
330
+ // BRAIN Retrieval Operations (T5131-T5135) — Renamed from brain.* to flat ops
331
+ // ============================================================================
332
+ /**
333
+ * Token-efficient brain search returning compact results.
334
+ *
335
+ * @param params - Search parameters including query string and limit
336
+ * @param projectRoot - Optional project root path; defaults to resolved root
337
+ * @returns EngineResult with compact search hits (IDs and titles)
338
+ *
339
+ * @remarks
340
+ * Designed for the cheapest-first retrieval pattern. Returns minimal fields
341
+ * per hit to conserve tokens. Use memoryFetch for full entry details.
342
+ *
343
+ * @example
344
+ * ```typescript
345
+ * const result = await memoryFind({ query: 'authentication', limit: 10 }, '/project');
346
+ * ```
347
+ */
348
+ export async function memoryFind(params, projectRoot) {
349
+ try {
350
+ const root = resolveRoot(projectRoot);
351
+ const result = await searchBrainCompact(root, {
352
+ query: params.query,
353
+ limit: params.limit,
354
+ tables: params.tables,
355
+ dateStart: params.dateStart,
356
+ dateEnd: params.dateEnd,
357
+ agent: params.agent,
358
+ });
359
+ return { success: true, data: result };
360
+ }
361
+ catch (error) {
362
+ return {
363
+ success: false,
364
+ error: {
365
+ code: 'E_BRAIN_SEARCH',
366
+ message: error instanceof Error ? error.message : String(error),
367
+ },
368
+ };
369
+ }
370
+ }
371
+ /**
372
+ * Chronological context around a brain entry anchor.
373
+ *
374
+ * @param params - Timeline parameters including anchor ID and window size
375
+ * @param projectRoot - Optional project root path; defaults to resolved root
376
+ * @returns EngineResult with chronologically ordered entries around the anchor
377
+ *
378
+ * @remarks
379
+ * Retrieves entries before and after a given anchor ID for temporal context.
380
+ * Useful for understanding the sequence of observations and decisions.
381
+ *
382
+ * @example
383
+ * ```typescript
384
+ * const result = await memoryTimeline({ anchorId: 'O-abc123', window: 5 }, '/project');
385
+ * ```
386
+ */
387
+ export async function memoryTimeline(params, projectRoot) {
388
+ try {
389
+ const root = resolveRoot(projectRoot);
390
+ const result = await timelineBrain(root, {
391
+ anchor: params.anchor,
392
+ depthBefore: params.depthBefore,
393
+ depthAfter: params.depthAfter,
394
+ });
395
+ return { success: true, data: result };
396
+ }
397
+ catch (error) {
398
+ return {
399
+ success: false,
400
+ error: {
401
+ code: 'E_BRAIN_TIMELINE',
402
+ message: error instanceof Error ? error.message : String(error),
403
+ },
404
+ };
405
+ }
406
+ }
407
+ /**
408
+ * Batch fetch brain entries by IDs.
409
+ *
410
+ * @param params - Fetch parameters including an array of entry IDs
411
+ * @param projectRoot - Optional project root path; defaults to resolved root
412
+ * @returns EngineResult with full entry details for each requested ID
413
+ *
414
+ * @remarks
415
+ * Use after memoryFind to retrieve full details for specific entries.
416
+ * Part of the 3-layer retrieval pattern: search -> filter -> fetch.
417
+ *
418
+ * @example
419
+ * ```typescript
420
+ * const result = await memoryFetch({ ids: ['O-abc123', 'D-def456'] }, '/project');
421
+ * ```
422
+ */
423
+ export async function memoryFetch(params, projectRoot) {
424
+ try {
425
+ const root = resolveRoot(projectRoot);
426
+ const result = await fetchBrainEntries(root, { ids: params.ids });
427
+ return { success: true, data: result };
428
+ }
429
+ catch (error) {
430
+ return {
431
+ success: false,
432
+ error: {
433
+ code: 'E_BRAIN_FETCH',
434
+ message: error instanceof Error ? error.message : String(error),
435
+ },
436
+ };
437
+ }
438
+ }
439
+ /**
440
+ * Save an observation to brain.db.
441
+ *
442
+ * @param params - Observation data including text, title, and optional tags
443
+ * @param projectRoot - Optional project root path; defaults to resolved root
444
+ * @returns EngineResult with the stored observation ID
445
+ *
446
+ * @remarks
447
+ * Creates a new observation entry in brain.db with an O-prefixed ID.
448
+ * Optionally refreshes the memory bridge after storing.
449
+ *
450
+ * @example
451
+ * ```typescript
452
+ * const result = await memoryObserve({ text: 'Auth uses JWT', title: 'Auth discovery' }, '/project');
453
+ * ```
454
+ */
455
+ export async function memoryObserve(params, projectRoot) {
456
+ try {
457
+ const root = resolveRoot(projectRoot);
458
+ const observeParams = {
459
+ text: params.text,
460
+ title: params.title,
461
+ type: params.type,
462
+ project: params.project,
463
+ sourceSessionId: params.sourceSessionId,
464
+ sourceType: params.sourceType,
465
+ agent: params.agent,
466
+ };
467
+ // T419: route mental-model observations (agent-tagged, relevant type) through
468
+ // the async reinforcement queue for non-blocking writes (ULTRAPLAN L5).
469
+ // All other observations use the existing synchronous path.
470
+ let result;
471
+ if (isMentalModelObservation(observeParams) && observeParams.agent) {
472
+ result = await mentalModelQueue.enqueue(root, {
473
+ ...observeParams,
474
+ agent: observeParams.agent,
475
+ });
476
+ }
477
+ else {
478
+ result = await observeBrain(root, observeParams);
479
+ }
480
+ return { success: true, data: result };
481
+ }
482
+ catch (error) {
483
+ return {
484
+ success: false,
485
+ error: {
486
+ code: 'E_BRAIN_OBSERVE',
487
+ message: error instanceof Error ? error.message : String(error),
488
+ },
489
+ };
490
+ }
491
+ }
492
+ // ============================================================================
493
+ // BRAIN Pattern Operations (T4770)
494
+ // ============================================================================
495
+ /**
496
+ * Store a pattern to BRAIN memory.
497
+ *
498
+ * @param params - Pattern data including pattern string, type, and confidence
499
+ * @param projectRoot - Optional project root path; defaults to resolved root
500
+ * @returns EngineResult with the stored pattern ID
501
+ *
502
+ * @remarks
503
+ * Persists a detected pattern (success or failure) to brain.db for future scoring.
504
+ *
505
+ * @example
506
+ * ```typescript
507
+ * const result = await memoryPatternStore({ pattern: 'migration', type: 'success' }, '/project');
508
+ * ```
509
+ */
510
+ export async function memoryPatternStore(params, projectRoot) {
511
+ try {
512
+ const root = resolveRoot(projectRoot);
513
+ const result = await storePattern(root, params);
514
+ return { success: true, data: result };
515
+ }
516
+ catch (error) {
517
+ return {
518
+ success: false,
519
+ error: {
520
+ code: 'E_PATTERN_STORE',
521
+ message: error instanceof Error ? error.message : String(error),
522
+ },
523
+ };
524
+ }
525
+ }
526
+ /**
527
+ * Search patterns in BRAIN memory.
528
+ *
529
+ * @param params - Search parameters including query and type filter
530
+ * @param projectRoot - Optional project root path; defaults to resolved root
531
+ * @returns EngineResult with matching pattern entries
532
+ *
533
+ * @remarks
534
+ * Queries the brain.db patterns table with optional type filtering.
535
+ *
536
+ * @example
537
+ * ```typescript
538
+ * const result = await memoryPatternFind({ type: 'success', limit: 10 }, '/project');
539
+ * ```
540
+ */
541
+ export async function memoryPatternFind(params, projectRoot) {
542
+ try {
543
+ const root = resolveRoot(projectRoot);
544
+ const results = await searchPatterns(root, params);
545
+ return { success: true, data: { patterns: results, total: results.length } };
546
+ }
547
+ catch (error) {
548
+ return {
549
+ success: false,
550
+ error: {
551
+ code: 'E_PATTERN_SEARCH',
552
+ message: error instanceof Error ? error.message : String(error),
553
+ },
554
+ };
555
+ }
556
+ }
557
+ /**
558
+ * Get pattern memory statistics.
559
+ *
560
+ * @param projectRoot - Optional project root path; defaults to resolved root
561
+ * @returns EngineResult with pattern counts by type and overall totals
562
+ *
563
+ * @remarks
564
+ * Aggregates pattern data from brain.db to provide type distribution and counts.
565
+ *
566
+ * @example
567
+ * ```typescript
568
+ * const result = await memoryPatternStats('/project');
569
+ * ```
570
+ */
571
+ export async function memoryPatternStats(projectRoot) {
572
+ try {
573
+ const root = resolveRoot(projectRoot);
574
+ const stats = await patternStats(root);
575
+ return { success: true, data: stats };
576
+ }
577
+ catch (error) {
578
+ return {
579
+ success: false,
580
+ error: {
581
+ code: 'E_PATTERN_STATS',
582
+ message: error instanceof Error ? error.message : String(error),
583
+ },
584
+ };
585
+ }
586
+ }
587
+ // ============================================================================
588
+ // BRAIN Learning Operations (T4770)
589
+ // ============================================================================
590
+ /**
591
+ * Store a learning to BRAIN memory.
592
+ *
593
+ * @param params - Learning data including text and confidence level
594
+ * @param projectRoot - Optional project root path; defaults to resolved root
595
+ * @returns EngineResult with the stored learning ID
596
+ *
597
+ * @remarks
598
+ * Creates a new learning entry in brain.db with an L-prefixed ID.
599
+ *
600
+ * @example
601
+ * ```typescript
602
+ * const result = await memoryLearningStore({ text: 'Drizzle v1 requires beta flag' }, '/project');
603
+ * ```
604
+ */
605
+ export async function memoryLearningStore(params, projectRoot) {
606
+ try {
607
+ const root = resolveRoot(projectRoot);
608
+ const result = await storeLearning(root, params);
609
+ return { success: true, data: result };
610
+ }
611
+ catch (error) {
612
+ return {
613
+ success: false,
614
+ error: {
615
+ code: 'E_LEARNING_STORE',
616
+ message: error instanceof Error ? error.message : String(error),
617
+ },
618
+ };
619
+ }
620
+ }
621
+ /**
622
+ * Search learnings in BRAIN memory.
623
+ *
624
+ * @param params - Search parameters including query and limit
625
+ * @param projectRoot - Optional project root path; defaults to resolved root
626
+ * @returns EngineResult with matching learning entries
627
+ *
628
+ * @remarks
629
+ * Queries the brain.db learnings table with optional text filtering.
630
+ *
631
+ * @example
632
+ * ```typescript
633
+ * const result = await memoryLearningFind({ query: 'drizzle' }, '/project');
634
+ * ```
635
+ */
636
+ export async function memoryLearningFind(params, projectRoot) {
637
+ try {
638
+ const root = resolveRoot(projectRoot);
639
+ const results = await searchLearnings(root, params);
640
+ return { success: true, data: { learnings: results, total: results.length } };
641
+ }
642
+ catch (error) {
643
+ return {
644
+ success: false,
645
+ error: {
646
+ code: 'E_LEARNING_SEARCH',
647
+ message: error instanceof Error ? error.message : String(error),
648
+ },
649
+ };
650
+ }
651
+ }
652
+ /**
653
+ * Get learning memory statistics.
654
+ *
655
+ * @param projectRoot - Optional project root path; defaults to resolved root
656
+ * @returns EngineResult with learning counts and confidence distribution
657
+ *
658
+ * @remarks
659
+ * Aggregates learning data from brain.db to provide totals and breakdowns.
660
+ *
661
+ * @example
662
+ * ```typescript
663
+ * const result = await memoryLearningStats('/project');
664
+ * ```
665
+ */
666
+ export async function memoryLearningStats(projectRoot) {
667
+ try {
668
+ const root = resolveRoot(projectRoot);
669
+ const stats = await learningStats(root);
670
+ return { success: true, data: stats };
671
+ }
672
+ catch (error) {
673
+ return {
674
+ success: false,
675
+ error: {
676
+ code: 'E_LEARNING_STATS',
677
+ message: error instanceof Error ? error.message : String(error),
678
+ },
679
+ };
680
+ }
681
+ }
682
+ // ============================================================================
683
+ // BRAIN Advanced Queries & Links (T5241)
684
+ // ============================================================================
685
+ /**
686
+ * Find contradictory entries in brain.db.
687
+ *
688
+ * @param projectRoot - Optional project root path; defaults to resolved root
689
+ * @returns EngineResult with pairs of contradicting observations
690
+ *
691
+ * @remarks
692
+ * Scans brain.db for observations that contradict each other based on
693
+ * semantic similarity and opposing sentiment or content.
694
+ *
695
+ * @example
696
+ * ```typescript
697
+ * const result = await memoryContradictions('/project');
698
+ * if (result.success) console.log(result.data.contradictions);
699
+ * ```
700
+ */
701
+ export async function memoryContradictions(projectRoot) {
702
+ try {
703
+ const root = resolveRoot(projectRoot);
704
+ const { getBrainDb, getBrainNativeDb } = await import('../store/brain-sqlite.js');
705
+ await getBrainDb(root);
706
+ const nativeDb = getBrainNativeDb();
707
+ if (!nativeDb) {
708
+ return { success: true, data: { contradictions: [] } };
709
+ }
710
+ // Negation patterns for detecting contradictions (adapted from manifest logic)
711
+ const negationPairs = [
712
+ [/\bdoes NOT\b/i, /\bdoes\b(?!.*\bnot\b)/i],
713
+ [/\bcannot\b/i, /\bcan\b(?!.*\bnot\b)/i],
714
+ [/\bno\s+\w+\s+required\b/i, /\brequired\b(?!.*\bno\b)/i],
715
+ [
716
+ /\bnot\s+(?:available|supported|possible|recommended)\b/i,
717
+ /\b(?:available|supported|possible|recommended)\b(?!.*\bnot\b)/i,
718
+ ],
719
+ [/\bwithout\b/i, /\brequires?\b/i],
720
+ [/\bavoid\b/i, /\buse\b/i],
721
+ [/\bdeprecated\b/i, /\brecommended\b/i],
722
+ [/\banti-pattern\b/i, /\bbest practice\b/i],
723
+ ];
724
+ // Fetch all decisions with context for comparison
725
+ const decisions = nativeDb
726
+ .prepare(`
727
+ SELECT id, type, decision, rationale, context_task_id, created_at
728
+ FROM brain_decisions
729
+ ORDER BY created_at DESC
730
+ `)
731
+ .all();
732
+ // Fetch all patterns
733
+ const patterns = nativeDb
734
+ .prepare(`
735
+ SELECT id, type, pattern, context, anti_pattern, created_at
736
+ FROM brain_patterns
737
+ ORDER BY created_at DESC
738
+ `)
739
+ .all();
740
+ // Fetch all learnings
741
+ const learnings = nativeDb
742
+ .prepare(`
743
+ SELECT id, insight, source, created_at
744
+ FROM brain_learnings
745
+ ORDER BY created_at DESC
746
+ `)
747
+ .all();
748
+ const contradictions = [];
749
+ const seenPairs = new Set();
750
+ // Helper to create sorted pair key
751
+ const pairKey = (idA, idB) => (idA < idB ? `${idA}::${idB}` : `${idB}::${idA}`);
752
+ // Check decisions against each other (grouped by task context)
753
+ const decisionsByTask = new Map();
754
+ for (const d of decisions) {
755
+ const key = d.context_task_id;
756
+ if (!decisionsByTask.has(key))
757
+ decisionsByTask.set(key, []);
758
+ decisionsByTask.get(key).push(d);
759
+ }
760
+ for (const [taskId, taskDecisions] of decisionsByTask) {
761
+ if (taskDecisions.length < 2)
762
+ continue;
763
+ for (let i = 0; i < taskDecisions.length; i++) {
764
+ for (let j = i + 1; j < taskDecisions.length; j++) {
765
+ const a = taskDecisions[i];
766
+ const b = taskDecisions[j];
767
+ const key = pairKey(a.id, b.id);
768
+ if (seenPairs.has(key))
769
+ continue;
770
+ const contentA = `${a.decision} ${a.rationale}`;
771
+ const contentB = `${b.decision} ${b.rationale}`;
772
+ for (const [patternNeg, patternPos] of negationPairs) {
773
+ if ((patternNeg.test(contentA) && patternPos.test(contentB)) ||
774
+ (patternPos.test(contentA) && patternNeg.test(contentB))) {
775
+ seenPairs.add(key);
776
+ contradictions.push({
777
+ entryA: {
778
+ id: a.id,
779
+ type: 'decision',
780
+ content: a.decision,
781
+ createdAt: a.created_at,
782
+ },
783
+ entryB: {
784
+ id: b.id,
785
+ type: 'decision',
786
+ content: b.decision,
787
+ createdAt: b.created_at,
788
+ },
789
+ context: taskId || undefined,
790
+ conflictDetails: `Negation pattern: "${contentA.slice(0, 80)}..." vs "${contentB.slice(0, 80)}..."`,
791
+ });
792
+ break;
793
+ }
794
+ }
795
+ }
796
+ }
797
+ }
798
+ // Check patterns with anti-patterns
799
+ for (const p of patterns) {
800
+ if (p.anti_pattern) {
801
+ contradictions.push({
802
+ entryA: { id: p.id, type: 'pattern', content: p.pattern, createdAt: p.created_at },
803
+ entryB: {
804
+ id: p.id,
805
+ type: 'anti-pattern',
806
+ content: p.anti_pattern,
807
+ createdAt: p.created_at,
808
+ },
809
+ conflictDetails: `Pattern defines its own anti-pattern`,
810
+ });
811
+ }
812
+ }
813
+ // Check learnings against each other
814
+ for (let i = 0; i < learnings.length; i++) {
815
+ for (let j = i + 1; j < learnings.length; j++) {
816
+ const a = learnings[i];
817
+ const b = learnings[j];
818
+ const key = pairKey(a.id, b.id);
819
+ if (seenPairs.has(key))
820
+ continue;
821
+ for (const [patternNeg, patternPos] of negationPairs) {
822
+ if ((patternNeg.test(a.insight) && patternPos.test(b.insight)) ||
823
+ (patternPos.test(a.insight) && patternNeg.test(b.insight))) {
824
+ seenPairs.add(key);
825
+ contradictions.push({
826
+ entryA: { id: a.id, type: 'learning', content: a.insight, createdAt: a.created_at },
827
+ entryB: { id: b.id, type: 'learning', content: b.insight, createdAt: b.created_at },
828
+ conflictDetails: `Learning contradiction detected`,
829
+ });
830
+ break;
831
+ }
832
+ }
833
+ }
834
+ }
835
+ return { success: true, data: { contradictions } };
836
+ }
837
+ catch (error) {
838
+ return {
839
+ success: false,
840
+ error: {
841
+ code: 'E_CONTRADICTIONS',
842
+ message: error instanceof Error ? error.message : String(error),
843
+ },
844
+ };
845
+ }
846
+ }
847
+ /**
848
+ * Find superseded entries in brain.db.
849
+ *
850
+ * Identifies entries that have been superseded by newer entries on the same topic.
851
+ *
852
+ * @param params - Superseded search parameters
853
+ * @param projectRoot - Optional project root path; defaults to resolved root
854
+ * @returns EngineResult with superseded entry pairs and their replacements
855
+ *
856
+ * @remarks
857
+ * Scans brain.db for entries where a newer observation or decision covers
858
+ * the same topic, rendering the older entry obsolete.
859
+ *
860
+ * For brain.db, we group by:
861
+ * - Decisions: type + contextTaskId/contextEpicId
862
+ * - Patterns: type + context (first 100 chars for similarity)
863
+ * - Learnings: source + applicableTypes
864
+ * - Observations: type + project
865
+ *
866
+ * @example
867
+ * ```typescript
868
+ * const result = await memorySuperseded({ type: 'decision' }, '/project');
869
+ * ```
870
+ */
871
+ export async function memorySuperseded(params, projectRoot) {
872
+ try {
873
+ const root = resolveRoot(projectRoot);
874
+ const { getBrainDb, getBrainNativeDb } = await import('../store/brain-sqlite.js');
875
+ await getBrainDb(root);
876
+ const nativeDb = getBrainNativeDb();
877
+ if (!nativeDb) {
878
+ return { success: true, data: { superseded: [] } };
879
+ }
880
+ const superseded = [];
881
+ // Helper to normalize and group by key
882
+ const addSuperseded = (entries, groupKey) => {
883
+ if (entries.length < 2)
884
+ return;
885
+ // Sort by creation date (oldest first)
886
+ const sorted = [...entries].sort((a, b) => a.createdAt.localeCompare(b.createdAt));
887
+ // All but the newest are superseded by the newest
888
+ const newest = sorted[sorted.length - 1];
889
+ for (let i = 0; i < sorted.length - 1; i++) {
890
+ superseded.push({
891
+ oldEntry: sorted[i],
892
+ replacement: newest,
893
+ grouping: groupKey,
894
+ });
895
+ }
896
+ };
897
+ // === DECISIONS: Group by type + contextTaskId/contextEpicId ===
898
+ const decisionGroups = new Map();
899
+ const decisionQuery = params?.type
900
+ ? `SELECT id, type, decision, context_task_id, context_epic_id, created_at
901
+ FROM brain_decisions WHERE type = ? ORDER BY created_at DESC`
902
+ : `SELECT id, type, decision, context_task_id, context_epic_id, created_at
903
+ FROM brain_decisions ORDER BY created_at DESC`;
904
+ const decisionParams = params?.type ? [params.type] : [];
905
+ const decisions = nativeDb.prepare(decisionQuery).all(...decisionParams);
906
+ for (const d of decisions) {
907
+ const contextKey = d.context_task_id || d.context_epic_id || 'general';
908
+ const groupKey = `decision:${d.type}:${contextKey}`;
909
+ if (!decisionGroups.has(groupKey))
910
+ decisionGroups.set(groupKey, []);
911
+ decisionGroups.get(groupKey).push({
912
+ id: d.id,
913
+ type: d.type,
914
+ createdAt: d.created_at,
915
+ summary: d.decision.slice(0, 100),
916
+ });
917
+ }
918
+ for (const [key, entries] of decisionGroups) {
919
+ addSuperseded(entries, key);
920
+ }
921
+ // === PATTERNS: Group by type + context (first 100 chars for similarity) ===
922
+ const patternGroups = new Map();
923
+ const patternQuery = params?.type
924
+ ? `SELECT id, type, pattern, context, extracted_at
925
+ FROM brain_patterns WHERE type = ? ORDER BY extracted_at DESC`
926
+ : `SELECT id, type, pattern, context, extracted_at
927
+ FROM brain_patterns ORDER BY extracted_at DESC`;
928
+ const patternParams = params?.type ? [params.type] : [];
929
+ const patterns = nativeDb.prepare(patternQuery).all(...patternParams);
930
+ for (const p of patterns) {
931
+ // Use first 80 chars of context as grouping key for similarity
932
+ const contextKey = p.context?.slice(0, 80) || 'unknown';
933
+ const groupKey = `pattern:${p.type}:${contextKey}`;
934
+ if (!patternGroups.has(groupKey))
935
+ patternGroups.set(groupKey, []);
936
+ patternGroups.get(groupKey).push({
937
+ id: p.id,
938
+ type: p.type,
939
+ createdAt: p.extracted_at,
940
+ summary: p.pattern.slice(0, 100),
941
+ });
942
+ }
943
+ for (const [key, entries] of patternGroups) {
944
+ addSuperseded(entries, key);
945
+ }
946
+ // === LEARNINGS: Group by source + applicableTypes ===
947
+ const learningGroups = new Map();
948
+ const learningQuery = `SELECT id, source, insight, applicable_types_json, created_at
949
+ FROM brain_learnings ORDER BY created_at DESC`;
950
+ const learnings = nativeDb.prepare(learningQuery).all();
951
+ for (const l of learnings) {
952
+ const applicableTypes = l.applicable_types_json
953
+ ? JSON.parse(l.applicable_types_json).slice(0, 2).join(',')
954
+ : 'general';
955
+ const groupKey = `learning:${l.source}:${applicableTypes}`;
956
+ if (!learningGroups.has(groupKey))
957
+ learningGroups.set(groupKey, []);
958
+ learningGroups.get(groupKey).push({
959
+ id: l.id,
960
+ type: 'learning',
961
+ createdAt: l.created_at,
962
+ summary: l.insight.slice(0, 100),
963
+ });
964
+ }
965
+ for (const [key, entries] of learningGroups) {
966
+ addSuperseded(entries, key);
967
+ }
968
+ // === OBSERVATIONS: Group by type + project ===
969
+ const observationGroups = new Map();
970
+ const observationQuery = params?.type
971
+ ? `SELECT id, type, title, project, created_at
972
+ FROM brain_observations WHERE type = ? ORDER BY created_at DESC`
973
+ : `SELECT id, type, title, project, created_at
974
+ FROM brain_observations ORDER BY created_at DESC`;
975
+ const observationParams = params?.type ? [params.type] : [];
976
+ const observations = nativeDb.prepare(observationQuery).all(...observationParams);
977
+ for (const o of observations) {
978
+ const projectKey = params?.project ? params.project : o.project || 'general';
979
+ const groupKey = `observation:${o.type}:${projectKey}`;
980
+ if (!observationGroups.has(groupKey))
981
+ observationGroups.set(groupKey, []);
982
+ observationGroups.get(groupKey).push({
983
+ id: o.id,
984
+ type: o.type,
985
+ createdAt: o.created_at,
986
+ summary: o.title.slice(0, 100),
987
+ });
988
+ }
989
+ for (const [key, entries] of observationGroups) {
990
+ addSuperseded(entries, key);
991
+ }
992
+ return { success: true, data: { superseded, total: superseded.length } };
993
+ }
994
+ catch (error) {
995
+ return {
996
+ success: false,
997
+ error: {
998
+ code: 'E_MEMORY_SUPERSEDED',
999
+ message: error instanceof Error ? error.message : String(error),
1000
+ },
1001
+ };
1002
+ }
1003
+ }
1004
+ /**
1005
+ * Link a brain entry to a task.
1006
+ *
1007
+ * @param params - Link parameters including entryId and taskId
1008
+ * @param projectRoot - Optional project root path; defaults to resolved root
1009
+ * @returns EngineResult confirming the link was created
1010
+ *
1011
+ * @remarks
1012
+ * Creates an association between a brain.db entry and a task in tasks.db.
1013
+ * Used for traceability between memory entries and the work they relate to.
1014
+ *
1015
+ * @example
1016
+ * ```typescript
1017
+ * const result = await memoryLink({ entryId: 'O-abc123', taskId: 'T042' }, '/project');
1018
+ * ```
1019
+ */
1020
+ export async function memoryLink(params, projectRoot) {
1021
+ if (!params.taskId || !params.entryId) {
1022
+ return {
1023
+ success: false,
1024
+ error: { code: 'E_INVALID_INPUT', message: 'taskId and entryId are required' },
1025
+ };
1026
+ }
1027
+ const entryType = parseIdPrefix(params.entryId);
1028
+ if (!entryType) {
1029
+ return {
1030
+ success: false,
1031
+ error: { code: 'E_INVALID_INPUT', message: 'Invalid entryId format' },
1032
+ };
1033
+ }
1034
+ try {
1035
+ const root = resolveRoot(projectRoot);
1036
+ await linkMemoryToTask(root, entryType, params.entryId, params.taskId, 'applies_to');
1037
+ return {
1038
+ success: true,
1039
+ data: { linked: true, taskId: params.taskId, entryId: params.entryId },
1040
+ };
1041
+ }
1042
+ catch (error) {
1043
+ return {
1044
+ success: false,
1045
+ error: {
1046
+ code: 'E_MEMORY_LINK',
1047
+ message: error instanceof Error ? error.message : String(error),
1048
+ },
1049
+ };
1050
+ }
1051
+ }
1052
+ /**
1053
+ * Remove a link between a brain entry and a task.
1054
+ *
1055
+ * @param params - Unlink parameters including entryId and taskId
1056
+ * @param projectRoot - Optional project root path; defaults to resolved root
1057
+ * @returns EngineResult confirming the link was removed
1058
+ *
1059
+ * @remarks
1060
+ * Removes the association created by memoryLink. Idempotent if the link
1061
+ * does not exist.
1062
+ *
1063
+ * @example
1064
+ * ```typescript
1065
+ * const result = await memoryUnlink({ entryId: 'O-abc123', taskId: 'T042' }, '/project');
1066
+ * ```
1067
+ */
1068
+ export async function memoryUnlink(params, projectRoot) {
1069
+ if (!params.taskId || !params.entryId) {
1070
+ return {
1071
+ success: false,
1072
+ error: { code: 'E_INVALID_INPUT', message: 'taskId and entryId are required' },
1073
+ };
1074
+ }
1075
+ const entryType = parseIdPrefix(params.entryId);
1076
+ if (!entryType) {
1077
+ return {
1078
+ success: false,
1079
+ error: { code: 'E_INVALID_INPUT', message: 'Invalid entryId format' },
1080
+ };
1081
+ }
1082
+ try {
1083
+ const root = resolveRoot(projectRoot);
1084
+ await unlinkMemoryFromTask(root, entryType, params.entryId, params.taskId, 'applies_to');
1085
+ return {
1086
+ success: true,
1087
+ data: { unlinked: true, taskId: params.taskId, entryId: params.entryId },
1088
+ };
1089
+ }
1090
+ catch (error) {
1091
+ return {
1092
+ success: false,
1093
+ error: {
1094
+ code: 'E_MEMORY_UNLINK',
1095
+ message: error instanceof Error ? error.message : String(error),
1096
+ },
1097
+ };
1098
+ }
1099
+ }
1100
+ // ============================================================================
1101
+ // PageIndex Graph Operations (T5385)
1102
+ // ============================================================================
1103
+ /**
1104
+ * Add a node or edge to the PageIndex graph.
1105
+ *
1106
+ * @param params - Graph add parameters (node data or edge endpoints)
1107
+ * @param projectRoot - Optional project root path; defaults to resolved root
1108
+ * @returns EngineResult confirming the node or edge was added
1109
+ *
1110
+ * @remarks
1111
+ * Supports adding both nodes (concepts) and edges (relationships) to the
1112
+ * brain.db knowledge graph (PageIndex).
1113
+ *
1114
+ * @example
1115
+ * ```typescript
1116
+ * const result = await memoryGraphAdd({ type: 'node', label: 'auth', nodeType: 'concept' }, '/project');
1117
+ * ```
1118
+ */
1119
+ export async function memoryGraphAdd(params, projectRoot) {
1120
+ try {
1121
+ const root = resolveRoot(projectRoot);
1122
+ const accessor = await getBrainAccessor(root);
1123
+ // Edge mode: fromId + toId + edgeType
1124
+ if (params.fromId && params.toId && params.edgeType) {
1125
+ const edge = await accessor.addPageEdge({
1126
+ fromId: params.fromId,
1127
+ toId: params.toId,
1128
+ edgeType: params.edgeType,
1129
+ weight: params.weight,
1130
+ });
1131
+ return { success: true, data: { type: 'edge', edge } };
1132
+ }
1133
+ // Node mode: nodeId + nodeType + label
1134
+ if (params.nodeId && params.nodeType && params.label) {
1135
+ const node = await accessor.addPageNode({
1136
+ id: params.nodeId,
1137
+ nodeType: params.nodeType,
1138
+ label: params.label,
1139
+ metadataJson: params.metadataJson,
1140
+ });
1141
+ return { success: true, data: { type: 'node', node } };
1142
+ }
1143
+ return {
1144
+ success: false,
1145
+ error: {
1146
+ code: 'E_INVALID_INPUT',
1147
+ message: 'Provide (nodeId + nodeType + label) for a node or (fromId + toId + edgeType) for an edge',
1148
+ },
1149
+ };
1150
+ }
1151
+ catch (error) {
1152
+ return {
1153
+ success: false,
1154
+ error: {
1155
+ code: 'E_GRAPH_ADD',
1156
+ message: error instanceof Error ? error.message : String(error),
1157
+ },
1158
+ };
1159
+ }
1160
+ }
1161
+ /**
1162
+ * Get a node and its edges from the PageIndex graph.
1163
+ *
1164
+ * @param params - Parameters including the node ID to look up
1165
+ * @param projectRoot - Optional project root path; defaults to resolved root
1166
+ * @returns EngineResult with the node data and its connected edges
1167
+ *
1168
+ * @remarks
1169
+ * Returns the full node record plus all edges where the node appears as
1170
+ * either source or target.
1171
+ *
1172
+ * @example
1173
+ * ```typescript
1174
+ * const result = await memoryGraphShow({ nodeId: 'auth' }, '/project');
1175
+ * ```
1176
+ */
1177
+ export async function memoryGraphShow(params, projectRoot) {
1178
+ if (!params.nodeId) {
1179
+ return { success: false, error: { code: 'E_INVALID_INPUT', message: 'nodeId is required' } };
1180
+ }
1181
+ try {
1182
+ const root = resolveRoot(projectRoot);
1183
+ const accessor = await getBrainAccessor(root);
1184
+ const node = await accessor.getPageNode(params.nodeId);
1185
+ if (!node) {
1186
+ return {
1187
+ success: false,
1188
+ error: { code: 'E_NOT_FOUND', message: `Node '${params.nodeId}' not found` },
1189
+ };
1190
+ }
1191
+ const edges = await accessor.getPageEdges(params.nodeId, 'both');
1192
+ return { success: true, data: { node, edges } };
1193
+ }
1194
+ catch (error) {
1195
+ return {
1196
+ success: false,
1197
+ error: {
1198
+ code: 'E_GRAPH_SHOW',
1199
+ message: error instanceof Error ? error.message : String(error),
1200
+ },
1201
+ };
1202
+ }
1203
+ }
1204
+ /**
1205
+ * Get neighbor nodes from the PageIndex graph.
1206
+ *
1207
+ * @param params - Parameters including the node ID and optional depth
1208
+ * @param projectRoot - Optional project root path; defaults to resolved root
1209
+ * @returns EngineResult with neighboring nodes and connecting edges
1210
+ *
1211
+ * @remarks
1212
+ * Traverses the knowledge graph outward from a given node to find related
1213
+ * concepts within the specified depth.
1214
+ *
1215
+ * @example
1216
+ * ```typescript
1217
+ * const result = await memoryGraphNeighbors({ nodeId: 'auth', depth: 2 }, '/project');
1218
+ * ```
1219
+ */
1220
+ export async function memoryGraphNeighbors(params, projectRoot) {
1221
+ if (!params.nodeId) {
1222
+ return { success: false, error: { code: 'E_INVALID_INPUT', message: 'nodeId is required' } };
1223
+ }
1224
+ try {
1225
+ const root = resolveRoot(projectRoot);
1226
+ const accessor = await getBrainAccessor(root);
1227
+ const neighbors = await accessor.getNeighbors(params.nodeId, params.edgeType);
1228
+ return { success: true, data: { neighbors, total: neighbors.length } };
1229
+ }
1230
+ catch (error) {
1231
+ return {
1232
+ success: false,
1233
+ error: {
1234
+ code: 'E_GRAPH_NEIGHBORS',
1235
+ message: error instanceof Error ? error.message : String(error),
1236
+ },
1237
+ };
1238
+ }
1239
+ }
1240
+ // ============================================================================
1241
+ // BRAIN Reasoning & Hybrid Search Operations (T5388-T5393)
1242
+ // ============================================================================
1243
+ /**
1244
+ * Causal trace through task dependency chains.
1245
+ *
1246
+ * @param params - Parameters including the entry or task ID to trace
1247
+ * @param projectRoot - Optional project root path; defaults to resolved root
1248
+ * @returns EngineResult with the causal chain explaining why something happened
1249
+ *
1250
+ * @remarks
1251
+ * Traces backward through task dependencies and brain entries to build
1252
+ * an explanation chain for a given decision or observation.
1253
+ *
1254
+ * @example
1255
+ * ```typescript
1256
+ * const result = await memoryReasonWhy({ id: 'D-abc123' }, '/project');
1257
+ * ```
1258
+ */
1259
+ export async function memoryReasonWhy(params, projectRoot) {
1260
+ if (!params.taskId) {
1261
+ return { success: false, error: { code: 'E_INVALID_INPUT', message: 'taskId is required' } };
1262
+ }
1263
+ try {
1264
+ const root = resolveRoot(projectRoot);
1265
+ const taskAccessor = await getAccessor(root);
1266
+ const { reasonWhy } = await import('./brain-reasoning.js');
1267
+ const result = await reasonWhy(params.taskId, root, taskAccessor);
1268
+ return { success: true, data: result };
1269
+ }
1270
+ catch (error) {
1271
+ return {
1272
+ success: false,
1273
+ error: {
1274
+ code: 'E_REASON_WHY',
1275
+ message: error instanceof Error ? error.message : String(error),
1276
+ },
1277
+ };
1278
+ }
1279
+ }
1280
+ /**
1281
+ * Find semantically similar entries.
1282
+ *
1283
+ * @param params - Parameters including the source entry ID or query text
1284
+ * @param projectRoot - Optional project root path; defaults to resolved root
1285
+ * @returns EngineResult with entries ranked by semantic similarity
1286
+ *
1287
+ * @remarks
1288
+ * Uses embedding vectors or text similarity to find brain entries that are
1289
+ * semantically close to the given reference.
1290
+ *
1291
+ * @example
1292
+ * ```typescript
1293
+ * const result = await memoryReasonSimilar({ id: 'O-abc123', limit: 5 }, '/project');
1294
+ * ```
1295
+ */
1296
+ export async function memoryReasonSimilar(params, projectRoot) {
1297
+ if (!params.entryId) {
1298
+ return { success: false, error: { code: 'E_INVALID_INPUT', message: 'entryId is required' } };
1299
+ }
1300
+ try {
1301
+ const root = resolveRoot(projectRoot);
1302
+ const { reasonSimilar } = await import('./brain-reasoning.js');
1303
+ const results = await reasonSimilar(params.entryId, root, params.limit);
1304
+ return { success: true, data: { results, total: results.length } };
1305
+ }
1306
+ catch (error) {
1307
+ return {
1308
+ success: false,
1309
+ error: {
1310
+ code: 'E_REASON_SIMILAR',
1311
+ message: error instanceof Error ? error.message : String(error),
1312
+ },
1313
+ };
1314
+ }
1315
+ }
1316
+ /**
1317
+ * Hybrid search across FTS5, vector, and graph.
1318
+ *
1319
+ * @param params - Search parameters including query and optional mode/limit
1320
+ * @param projectRoot - Optional project root path; defaults to resolved root
1321
+ * @returns EngineResult with merged and ranked results from all search backends
1322
+ *
1323
+ * @remarks
1324
+ * Combines full-text search (FTS5), vector similarity, and graph traversal
1325
+ * to produce comprehensive search results with merged relevance scoring.
1326
+ *
1327
+ * @example
1328
+ * ```typescript
1329
+ * const result = await memorySearchHybrid({ query: 'authentication flow' }, '/project');
1330
+ * ```
1331
+ */
1332
+ export async function memorySearchHybrid(params, projectRoot) {
1333
+ if (!params.query) {
1334
+ return { success: false, error: { code: 'E_INVALID_INPUT', message: 'query is required' } };
1335
+ }
1336
+ try {
1337
+ const root = resolveRoot(projectRoot);
1338
+ const { hybridSearch } = await import('./brain-search.js');
1339
+ const results = await hybridSearch(params.query, root, {
1340
+ limit: params.limit,
1341
+ });
1342
+ return { success: true, data: { results, total: results.length } };
1343
+ }
1344
+ catch (error) {
1345
+ return {
1346
+ success: false,
1347
+ error: {
1348
+ code: 'E_HYBRID_SEARCH',
1349
+ message: error instanceof Error ? error.message : String(error),
1350
+ },
1351
+ };
1352
+ }
1353
+ }
1354
+ // ============================================================================
1355
+ // Brain Graph Traversal Operations (T535)
1356
+ // ============================================================================
1357
+ /**
1358
+ * BFS traversal of the brain knowledge graph from a seed node.
1359
+ *
1360
+ * @param params - Traversal parameters: nodeId and optional maxDepth (default 3)
1361
+ * @param projectRoot - Optional project root path; defaults to resolved root
1362
+ * @returns EngineResult with traversal nodes annotated with depth
1363
+ *
1364
+ * @remarks
1365
+ * Uses a recursive CTE against brain_page_nodes / brain_page_edges.
1366
+ * Follows edges bidirectionally. Returns the seed node at depth 0.
1367
+ *
1368
+ * @example
1369
+ * ```typescript
1370
+ * const result = await memoryGraphTrace({ nodeId: 'decision:D-abc123', maxDepth: 2 }, '/project');
1371
+ * ```
1372
+ */
1373
+ export async function memoryGraphTrace(params, projectRoot) {
1374
+ if (!params.nodeId) {
1375
+ return { success: false, error: { code: 'E_INVALID_INPUT', message: 'nodeId is required' } };
1376
+ }
1377
+ try {
1378
+ const root = resolveRoot(projectRoot);
1379
+ const { traceBrainGraph } = await import('./graph-queries.js');
1380
+ const nodes = await traceBrainGraph(root, params.nodeId, params.maxDepth ?? 3);
1381
+ if (nodes.length === 0) {
1382
+ return {
1383
+ success: false,
1384
+ error: { code: 'E_NOT_FOUND', message: `Node '${params.nodeId}' not found in brain graph` },
1385
+ };
1386
+ }
1387
+ return { success: true, data: { nodes, total: nodes.length, seed: params.nodeId } };
1388
+ }
1389
+ catch (error) {
1390
+ return {
1391
+ success: false,
1392
+ error: {
1393
+ code: 'E_GRAPH_TRACE',
1394
+ message: error instanceof Error ? error.message : String(error),
1395
+ },
1396
+ };
1397
+ }
1398
+ }
1399
+ /**
1400
+ * Return the immediate (1-hop) neighbours of a brain graph node.
1401
+ *
1402
+ * @param params - Parameters: nodeId, optional edgeType filter
1403
+ * @param projectRoot - Optional project root path; defaults to resolved root
1404
+ * @returns EngineResult with neighbour nodes and edge metadata
1405
+ *
1406
+ * @remarks
1407
+ * Follows edges in both directions. Results include direction ('in'/'out'),
1408
+ * edge type, and weight.
1409
+ *
1410
+ * @example
1411
+ * ```typescript
1412
+ * const result = await memoryGraphRelated({ nodeId: 'decision:D-abc123', edgeType: 'applies_to' }, '/project');
1413
+ * ```
1414
+ */
1415
+ export async function memoryGraphRelated(params, projectRoot) {
1416
+ if (!params.nodeId) {
1417
+ return { success: false, error: { code: 'E_INVALID_INPUT', message: 'nodeId is required' } };
1418
+ }
1419
+ try {
1420
+ const root = resolveRoot(projectRoot);
1421
+ const { relatedBrainNodes } = await import('./graph-queries.js');
1422
+ const related = await relatedBrainNodes(root, params.nodeId, params.edgeType);
1423
+ return { success: true, data: { related, total: related.length, seed: params.nodeId } };
1424
+ }
1425
+ catch (error) {
1426
+ return {
1427
+ success: false,
1428
+ error: {
1429
+ code: 'E_GRAPH_RELATED',
1430
+ message: error instanceof Error ? error.message : String(error),
1431
+ },
1432
+ };
1433
+ }
1434
+ }
1435
+ /**
1436
+ * Return a 360-degree context view of a single brain graph node.
1437
+ *
1438
+ * @param params - Parameters: nodeId
1439
+ * @param projectRoot - Optional project root path; defaults to resolved root
1440
+ * @returns EngineResult with the node, all edges, and neighbouring nodes
1441
+ *
1442
+ * @remarks
1443
+ * Includes the node itself, in-edges, out-edges, and all immediately
1444
+ * reachable neighbour nodes with their edge relationships.
1445
+ *
1446
+ * @example
1447
+ * ```typescript
1448
+ * const result = await memoryGraphContext({ nodeId: 'decision:D-abc123' }, '/project');
1449
+ * ```
1450
+ */
1451
+ export async function memoryGraphContext(params, projectRoot) {
1452
+ if (!params.nodeId) {
1453
+ return { success: false, error: { code: 'E_INVALID_INPUT', message: 'nodeId is required' } };
1454
+ }
1455
+ try {
1456
+ const root = resolveRoot(projectRoot);
1457
+ const { contextBrainNode } = await import('./graph-queries.js');
1458
+ const context = await contextBrainNode(root, params.nodeId);
1459
+ if (!context) {
1460
+ return {
1461
+ success: false,
1462
+ error: { code: 'E_NOT_FOUND', message: `Node '${params.nodeId}' not found in brain graph` },
1463
+ };
1464
+ }
1465
+ return { success: true, data: context };
1466
+ }
1467
+ catch (error) {
1468
+ return {
1469
+ success: false,
1470
+ error: {
1471
+ code: 'E_GRAPH_CONTEXT',
1472
+ message: error instanceof Error ? error.message : String(error),
1473
+ },
1474
+ };
1475
+ }
1476
+ }
1477
+ /**
1478
+ * Return aggregate statistics for the brain knowledge graph.
1479
+ *
1480
+ * @param projectRoot - Optional project root path; defaults to resolved root
1481
+ * @returns EngineResult with node counts by type, edge counts by type, and totals
1482
+ *
1483
+ * @example
1484
+ * ```typescript
1485
+ * const result = await memoryGraphStatsFull('/project');
1486
+ * ```
1487
+ */
1488
+ export async function memoryGraphStatsFull(projectRoot) {
1489
+ try {
1490
+ const root = resolveRoot(projectRoot);
1491
+ const { graphStats } = await import('./graph-queries.js');
1492
+ const stats = await graphStats(root);
1493
+ return { success: true, data: stats };
1494
+ }
1495
+ catch (error) {
1496
+ return {
1497
+ success: false,
1498
+ error: {
1499
+ code: 'E_GRAPH_STATS',
1500
+ message: error instanceof Error ? error.message : String(error),
1501
+ },
1502
+ };
1503
+ }
1504
+ }
1505
+ /**
1506
+ * Remove a node or edge from the PageIndex graph.
1507
+ *
1508
+ * @param params - Parameters specifying the node or edge to remove
1509
+ * @param projectRoot - Optional project root path; defaults to resolved root
1510
+ * @returns EngineResult confirming the removal
1511
+ *
1512
+ * @remarks
1513
+ * Removes a node (and its connected edges) or a specific edge from the
1514
+ * brain.db knowledge graph.
1515
+ *
1516
+ * @example
1517
+ * ```typescript
1518
+ * const result = await memoryGraphRemove({ type: 'node', nodeId: 'stale-concept' }, '/project');
1519
+ * ```
1520
+ */
1521
+ export async function memoryGraphRemove(params, projectRoot) {
1522
+ try {
1523
+ const root = resolveRoot(projectRoot);
1524
+ const accessor = await getBrainAccessor(root);
1525
+ // Edge removal: fromId + toId + edgeType
1526
+ if (params.fromId && params.toId && params.edgeType) {
1527
+ await accessor.removePageEdge(params.fromId, params.toId, params.edgeType);
1528
+ return {
1529
+ success: true,
1530
+ data: {
1531
+ removed: 'edge',
1532
+ fromId: params.fromId,
1533
+ toId: params.toId,
1534
+ edgeType: params.edgeType,
1535
+ },
1536
+ };
1537
+ }
1538
+ // Node removal: nodeId (cascades edges)
1539
+ if (params.nodeId) {
1540
+ await accessor.removePageNode(params.nodeId);
1541
+ return { success: true, data: { removed: 'node', nodeId: params.nodeId } };
1542
+ }
1543
+ return {
1544
+ success: false,
1545
+ error: {
1546
+ code: 'E_INVALID_INPUT',
1547
+ message: 'Provide nodeId to remove a node or (fromId + toId + edgeType) to remove an edge',
1548
+ },
1549
+ };
1550
+ }
1551
+ catch (error) {
1552
+ return {
1553
+ success: false,
1554
+ error: {
1555
+ code: 'E_GRAPH_REMOVE',
1556
+ message: error instanceof Error ? error.message : String(error),
1557
+ },
1558
+ };
1559
+ }
1560
+ }
1561
+ //# sourceMappingURL=engine-compat.js.map