@cleocode/core 2026.4.30 → 2026.4.35

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 (1039) 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.d.ts +35 -0
  62. package/dist/bootstrap.d.ts.map +1 -1
  63. package/dist/bootstrap.js +435 -0
  64. package/dist/bootstrap.js.map +1 -0
  65. package/dist/caamp/adapter.js +259 -0
  66. package/dist/caamp/adapter.js.map +1 -0
  67. package/dist/caamp/capability-check.js +38 -0
  68. package/dist/caamp/capability-check.js.map +1 -0
  69. package/dist/caamp/index.js +21 -0
  70. package/dist/caamp/index.js.map +1 -0
  71. package/dist/caamp-init.js +16 -0
  72. package/dist/caamp-init.js.map +1 -0
  73. package/dist/cleo.js +322 -0
  74. package/dist/cleo.js.map +1 -0
  75. package/dist/code/index.d.ts +8 -4
  76. package/dist/code/index.d.ts.map +1 -1
  77. package/dist/code/index.js +14 -0
  78. package/dist/code/index.js.map +1 -0
  79. package/dist/code/outline.js +165 -0
  80. package/dist/code/outline.js.map +1 -0
  81. package/dist/code/parser.d.ts +22 -9
  82. package/dist/code/parser.d.ts.map +1 -1
  83. package/dist/code/parser.js +420 -0
  84. package/dist/code/parser.js.map +1 -0
  85. package/dist/code/search.js +135 -0
  86. package/dist/code/search.js.map +1 -0
  87. package/dist/code/unfold.js +155 -0
  88. package/dist/code/unfold.js.map +1 -0
  89. package/dist/codebase-map/analyzers/architecture.js +129 -0
  90. package/dist/codebase-map/analyzers/architecture.js.map +1 -0
  91. package/dist/codebase-map/analyzers/concerns.js +122 -0
  92. package/dist/codebase-map/analyzers/concerns.js.map +1 -0
  93. package/dist/codebase-map/analyzers/conventions.js +149 -0
  94. package/dist/codebase-map/analyzers/conventions.js.map +1 -0
  95. package/dist/codebase-map/analyzers/integrations.js +108 -0
  96. package/dist/codebase-map/analyzers/integrations.js.map +1 -0
  97. package/dist/codebase-map/analyzers/stack.js +117 -0
  98. package/dist/codebase-map/analyzers/stack.js.map +1 -0
  99. package/dist/codebase-map/analyzers/structure.js +137 -0
  100. package/dist/codebase-map/analyzers/structure.js.map +1 -0
  101. package/dist/codebase-map/analyzers/testing.js +118 -0
  102. package/dist/codebase-map/analyzers/testing.js.map +1 -0
  103. package/dist/codebase-map/index.js +57 -0
  104. package/dist/codebase-map/index.js.map +1 -0
  105. package/dist/codebase-map/store.js +122 -0
  106. package/dist/codebase-map/store.js.map +1 -0
  107. package/dist/codebase-map/summary.js +152 -0
  108. package/dist/codebase-map/summary.js.map +1 -0
  109. package/dist/compliance/index.js +288 -0
  110. package/dist/compliance/index.js.map +1 -0
  111. package/dist/compliance/protocol-enforcement.js +332 -0
  112. package/dist/compliance/protocol-enforcement.js.map +1 -0
  113. package/dist/compliance/protocol-rules.js +786 -0
  114. package/dist/compliance/protocol-rules.js.map +1 -0
  115. package/dist/compliance/protocol-types.js +79 -0
  116. package/dist/compliance/protocol-types.js.map +1 -0
  117. package/dist/compliance/store.js +53 -0
  118. package/dist/compliance/store.js.map +1 -0
  119. package/dist/conduit/conduit-client.js +107 -0
  120. package/dist/conduit/conduit-client.js.map +1 -0
  121. package/dist/conduit/factory.js +52 -0
  122. package/dist/conduit/factory.js.map +1 -0
  123. package/dist/conduit/http-transport.js +155 -0
  124. package/dist/conduit/http-transport.js.map +1 -0
  125. package/dist/conduit/index.js +15 -0
  126. package/dist/conduit/index.js.map +1 -0
  127. package/dist/conduit/local-transport.js +255 -0
  128. package/dist/conduit/local-transport.js.map +1 -0
  129. package/dist/conduit/sse-transport.js +299 -0
  130. package/dist/conduit/sse-transport.js.map +1 -0
  131. package/dist/config/build-config.js +29 -0
  132. package/dist/config/build-config.js.map +1 -0
  133. package/dist/config.js +400 -0
  134. package/dist/config.js.map +1 -0
  135. package/dist/constants.js +18 -0
  136. package/dist/constants.js.map +1 -0
  137. package/dist/context/index.js +137 -0
  138. package/dist/context/index.js.map +1 -0
  139. package/dist/crypto/credentials.js +219 -0
  140. package/dist/crypto/credentials.js.map +1 -0
  141. package/dist/discovery.js +182 -0
  142. package/dist/discovery.js.map +1 -0
  143. package/dist/engine-result.js +12 -0
  144. package/dist/engine-result.js.map +1 -0
  145. package/dist/error-catalog.js +404 -0
  146. package/dist/error-catalog.js.map +1 -0
  147. package/dist/error-registry.js +393 -0
  148. package/dist/error-registry.js.map +1 -0
  149. package/dist/errors.js +173 -0
  150. package/dist/errors.js.map +1 -0
  151. package/dist/hooks/handlers/agent-hooks.js +106 -0
  152. package/dist/hooks/handlers/agent-hooks.js.map +1 -0
  153. package/dist/hooks/handlers/context-hooks.js +111 -0
  154. package/dist/hooks/handlers/context-hooks.js.map +1 -0
  155. package/dist/hooks/handlers/error-hooks.js +52 -0
  156. package/dist/hooks/handlers/error-hooks.js.map +1 -0
  157. package/dist/hooks/handlers/file-hooks.js +104 -0
  158. package/dist/hooks/handlers/file-hooks.js.map +1 -0
  159. package/dist/hooks/handlers/handler-helpers.js +61 -0
  160. package/dist/hooks/handlers/handler-helpers.js.map +1 -0
  161. package/dist/hooks/handlers/index.d.ts +4 -0
  162. package/dist/hooks/handlers/index.d.ts.map +1 -1
  163. package/dist/hooks/handlers/index.js +34 -0
  164. package/dist/hooks/handlers/index.js.map +1 -0
  165. package/dist/hooks/handlers/intelligence-hooks.d.ts +26 -0
  166. package/dist/hooks/handlers/intelligence-hooks.d.ts.map +1 -0
  167. package/dist/hooks/handlers/intelligence-hooks.js +69 -0
  168. package/dist/hooks/handlers/intelligence-hooks.js.map +1 -0
  169. package/dist/hooks/handlers/memory-bridge-refresh.js +42 -0
  170. package/dist/hooks/handlers/memory-bridge-refresh.js.map +1 -0
  171. package/dist/hooks/handlers/notification-hooks.js +62 -0
  172. package/dist/hooks/handlers/notification-hooks.js.map +1 -0
  173. package/dist/hooks/handlers/session-hooks.d.ts +27 -4
  174. package/dist/hooks/handlers/session-hooks.d.ts.map +1 -1
  175. package/dist/hooks/handlers/session-hooks.js +157 -0
  176. package/dist/hooks/handlers/session-hooks.js.map +1 -0
  177. package/dist/hooks/handlers/task-hooks.js +65 -0
  178. package/dist/hooks/handlers/task-hooks.js.map +1 -0
  179. package/dist/hooks/handlers/watchdog-hooks.d.ts +49 -0
  180. package/dist/hooks/handlers/watchdog-hooks.d.ts.map +1 -0
  181. package/dist/hooks/handlers/watchdog-hooks.js +162 -0
  182. package/dist/hooks/handlers/watchdog-hooks.js.map +1 -0
  183. package/dist/hooks/handlers/work-capture-hooks.js +165 -0
  184. package/dist/hooks/handlers/work-capture-hooks.js.map +1 -0
  185. package/dist/hooks/index.js +13 -0
  186. package/dist/hooks/index.js.map +1 -0
  187. package/dist/hooks/payload-schemas.d.ts +6 -6
  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.d.ts +2 -0
  199. package/dist/index.d.ts.map +1 -1
  200. package/dist/index.js +8765 -6253
  201. package/dist/index.js.map +4 -4
  202. package/dist/init.js +920 -0
  203. package/dist/init.js.map +1 -0
  204. package/dist/inject/index.js +82 -0
  205. package/dist/inject/index.js.map +1 -0
  206. package/dist/injection.d.ts +13 -1
  207. package/dist/injection.d.ts.map +1 -1
  208. package/dist/injection.js +377 -0
  209. package/dist/injection.js.map +1 -0
  210. package/dist/intelligence/adaptive-validation.js +497 -0
  211. package/dist/intelligence/adaptive-validation.js.map +1 -0
  212. package/dist/intelligence/impact.js +675 -0
  213. package/dist/intelligence/impact.js.map +1 -0
  214. package/dist/intelligence/index.js +22 -0
  215. package/dist/intelligence/index.js.map +1 -0
  216. package/dist/intelligence/patterns.js +492 -0
  217. package/dist/intelligence/patterns.js.map +1 -0
  218. package/dist/intelligence/prediction.js +499 -0
  219. package/dist/intelligence/prediction.js.map +1 -0
  220. package/dist/intelligence/types.js +13 -0
  221. package/dist/intelligence/types.js.map +1 -0
  222. package/dist/internal.d.ts +18 -10
  223. package/dist/internal.d.ts.map +1 -1
  224. package/dist/internal.js +320 -0
  225. package/dist/internal.js.map +1 -0
  226. package/dist/issue/create.js +121 -0
  227. package/dist/issue/create.js.map +1 -0
  228. package/dist/issue/diagnostics.js +59 -0
  229. package/dist/issue/diagnostics.js.map +1 -0
  230. package/dist/issue/index.js +10 -0
  231. package/dist/issue/index.js.map +1 -0
  232. package/dist/issue/template-parser.js +267 -0
  233. package/dist/issue/template-parser.js.map +1 -0
  234. package/dist/json-schema-validator.js +76 -0
  235. package/dist/json-schema-validator.js.map +1 -0
  236. package/dist/lib/index.js +11 -0
  237. package/dist/lib/index.js.map +1 -0
  238. package/dist/lib/retry.js +152 -0
  239. package/dist/lib/retry.js.map +1 -0
  240. package/dist/lib/tree-sitter-languages.d.ts +11 -7
  241. package/dist/lib/tree-sitter-languages.d.ts.map +1 -1
  242. package/dist/lib/tree-sitter-languages.js +75 -0
  243. package/dist/lib/tree-sitter-languages.js.map +1 -0
  244. package/dist/lifecycle/chain-composition.js +152 -0
  245. package/dist/lifecycle/chain-composition.js.map +1 -0
  246. package/dist/lifecycle/chain-store.js +246 -0
  247. package/dist/lifecycle/chain-store.js.map +1 -0
  248. package/dist/lifecycle/consolidate-rcasd.js +352 -0
  249. package/dist/lifecycle/consolidate-rcasd.js.map +1 -0
  250. package/dist/lifecycle/default-chain.js +176 -0
  251. package/dist/lifecycle/default-chain.js.map +1 -0
  252. package/dist/lifecycle/evidence.js +180 -0
  253. package/dist/lifecycle/evidence.js.map +1 -0
  254. package/dist/lifecycle/frontmatter.js +363 -0
  255. package/dist/lifecycle/frontmatter.js.map +1 -0
  256. package/dist/lifecycle/index.js +756 -0
  257. package/dist/lifecycle/index.js.map +1 -0
  258. package/dist/lifecycle/pipeline.js +656 -0
  259. package/dist/lifecycle/pipeline.js.map +1 -0
  260. package/dist/lifecycle/rcasd-index.js +326 -0
  261. package/dist/lifecycle/rcasd-index.js.map +1 -0
  262. package/dist/lifecycle/rcasd-paths.js +220 -0
  263. package/dist/lifecycle/rcasd-paths.js.map +1 -0
  264. package/dist/lifecycle/resume.js +864 -0
  265. package/dist/lifecycle/resume.js.map +1 -0
  266. package/dist/lifecycle/stage-artifacts.js +94 -0
  267. package/dist/lifecycle/stage-artifacts.js.map +1 -0
  268. package/dist/lifecycle/stage-guidance.js +234 -0
  269. package/dist/lifecycle/stage-guidance.js.map +1 -0
  270. package/dist/lifecycle/stages.js +534 -0
  271. package/dist/lifecycle/stages.js.map +1 -0
  272. package/dist/lifecycle/state-machine.js +516 -0
  273. package/dist/lifecycle/state-machine.js.map +1 -0
  274. package/dist/lifecycle/tessera-engine.js +249 -0
  275. package/dist/lifecycle/tessera-engine.js.map +1 -0
  276. package/dist/logger.js +140 -0
  277. package/dist/logger.js.map +1 -0
  278. package/dist/memory/auto-extract.d.ts +27 -15
  279. package/dist/memory/auto-extract.d.ts.map +1 -1
  280. package/dist/memory/auto-extract.js +96 -0
  281. package/dist/memory/auto-extract.js.map +1 -0
  282. package/dist/memory/brain-backfill.d.ts +59 -0
  283. package/dist/memory/brain-backfill.d.ts.map +1 -0
  284. package/dist/memory/brain-backfill.js +389 -0
  285. package/dist/memory/brain-backfill.js.map +1 -0
  286. package/dist/memory/brain-consolidator.d.ts +48 -0
  287. package/dist/memory/brain-consolidator.d.ts.map +1 -0
  288. package/dist/memory/brain-consolidator.js +294 -0
  289. package/dist/memory/brain-consolidator.js.map +1 -0
  290. package/dist/memory/brain-embedding.js +66 -0
  291. package/dist/memory/brain-embedding.js.map +1 -0
  292. package/dist/memory/brain-lifecycle.d.ts +83 -2
  293. package/dist/memory/brain-lifecycle.d.ts.map +1 -1
  294. package/dist/memory/brain-lifecycle.js +807 -0
  295. package/dist/memory/brain-lifecycle.js.map +1 -0
  296. package/dist/memory/brain-links.js +161 -0
  297. package/dist/memory/brain-links.js.map +1 -0
  298. package/dist/memory/brain-maintenance.js +114 -0
  299. package/dist/memory/brain-maintenance.js.map +1 -0
  300. package/dist/memory/brain-migration.js +149 -0
  301. package/dist/memory/brain-migration.js.map +1 -0
  302. package/dist/memory/brain-purge.d.ts +51 -0
  303. package/dist/memory/brain-purge.d.ts.map +1 -0
  304. package/dist/memory/brain-purge.js +243 -0
  305. package/dist/memory/brain-purge.js.map +1 -0
  306. package/dist/memory/brain-reasoning.js +215 -0
  307. package/dist/memory/brain-reasoning.js.map +1 -0
  308. package/dist/memory/brain-retrieval.d.ts +69 -1
  309. package/dist/memory/brain-retrieval.d.ts.map +1 -1
  310. package/dist/memory/brain-retrieval.js +912 -0
  311. package/dist/memory/brain-retrieval.js.map +1 -0
  312. package/dist/memory/brain-row-types.js +10 -0
  313. package/dist/memory/brain-row-types.js.map +1 -0
  314. package/dist/memory/brain-search.d.ts.map +1 -1
  315. package/dist/memory/brain-search.js +528 -0
  316. package/dist/memory/brain-search.js.map +1 -0
  317. package/dist/memory/brain-similarity.js +145 -0
  318. package/dist/memory/brain-similarity.js.map +1 -0
  319. package/dist/memory/claude-mem-migration.js +277 -0
  320. package/dist/memory/claude-mem-migration.js.map +1 -0
  321. package/dist/memory/decisions.d.ts.map +1 -1
  322. package/dist/memory/decisions.js +218 -0
  323. package/dist/memory/decisions.js.map +1 -0
  324. package/dist/memory/embedding-local.js +102 -0
  325. package/dist/memory/embedding-local.js.map +1 -0
  326. package/dist/memory/embedding-queue.js +271 -0
  327. package/dist/memory/embedding-queue.js.map +1 -0
  328. package/dist/memory/embedding-worker.js +58 -0
  329. package/dist/memory/embedding-worker.js.map +1 -0
  330. package/dist/memory/engine-compat.d.ts +71 -0
  331. package/dist/memory/engine-compat.d.ts.map +1 -1
  332. package/dist/memory/engine-compat.js +1564 -0
  333. package/dist/memory/engine-compat.js.map +1 -0
  334. package/dist/memory/extraction-gate.d.ts +139 -0
  335. package/dist/memory/extraction-gate.d.ts.map +1 -0
  336. package/dist/memory/extraction-gate.js +459 -0
  337. package/dist/memory/extraction-gate.js.map +1 -0
  338. package/dist/memory/graph-auto-populate.d.ts +65 -0
  339. package/dist/memory/graph-auto-populate.d.ts.map +1 -0
  340. package/dist/memory/graph-auto-populate.js +148 -0
  341. package/dist/memory/graph-auto-populate.js.map +1 -0
  342. package/dist/memory/graph-queries.d.ts +127 -0
  343. package/dist/memory/graph-queries.d.ts.map +1 -0
  344. package/dist/memory/graph-queries.js +290 -0
  345. package/dist/memory/graph-queries.js.map +1 -0
  346. package/dist/memory/index.d.ts +2 -0
  347. package/dist/memory/index.d.ts.map +1 -1
  348. package/dist/memory/index.js +1144 -0
  349. package/dist/memory/index.js.map +1 -0
  350. package/dist/memory/learnings.d.ts +16 -0
  351. package/dist/memory/learnings.d.ts.map +1 -1
  352. package/dist/memory/learnings.js +178 -0
  353. package/dist/memory/learnings.js.map +1 -0
  354. package/dist/memory/memory-bridge.js +370 -0
  355. package/dist/memory/memory-bridge.js.map +1 -0
  356. package/dist/memory/mental-model-injection.js +61 -0
  357. package/dist/memory/mental-model-injection.js.map +1 -0
  358. package/dist/memory/mental-model-queue.js +211 -0
  359. package/dist/memory/mental-model-queue.js.map +1 -0
  360. package/dist/memory/patterns.d.ts +26 -4
  361. package/dist/memory/patterns.d.ts.map +1 -1
  362. package/dist/memory/patterns.js +174 -0
  363. package/dist/memory/patterns.js.map +1 -0
  364. package/dist/memory/pipeline-manifest-sqlite.js +975 -0
  365. package/dist/memory/pipeline-manifest-sqlite.js.map +1 -0
  366. package/dist/memory/quality-scoring.d.ts +127 -0
  367. package/dist/memory/quality-scoring.d.ts.map +1 -0
  368. package/dist/memory/quality-scoring.js +182 -0
  369. package/dist/memory/quality-scoring.js.map +1 -0
  370. package/dist/memory/session-memory.js +331 -0
  371. package/dist/memory/session-memory.js.map +1 -0
  372. package/dist/metrics/ab-test.js +260 -0
  373. package/dist/metrics/ab-test.js.map +1 -0
  374. package/dist/metrics/aggregation.js +363 -0
  375. package/dist/metrics/aggregation.js.map +1 -0
  376. package/dist/metrics/common.js +64 -0
  377. package/dist/metrics/common.js.map +1 -0
  378. package/dist/metrics/enums.js +78 -0
  379. package/dist/metrics/enums.js.map +1 -0
  380. package/dist/metrics/index.js +19 -0
  381. package/dist/metrics/index.js.map +1 -0
  382. package/dist/metrics/model-provider-registry.js +88 -0
  383. package/dist/metrics/model-provider-registry.js.map +1 -0
  384. package/dist/metrics/otel-integration.js +263 -0
  385. package/dist/metrics/otel-integration.js.map +1 -0
  386. package/dist/metrics/provider-detection.js +103 -0
  387. package/dist/metrics/provider-detection.js.map +1 -0
  388. package/dist/metrics/token-estimation.js +253 -0
  389. package/dist/metrics/token-estimation.js.map +1 -0
  390. package/dist/metrics/token-service.js +450 -0
  391. package/dist/metrics/token-service.js.map +1 -0
  392. package/dist/migration/agent-outputs.js +316 -0
  393. package/dist/migration/agent-outputs.js.map +1 -0
  394. package/dist/migration/checksum.js +92 -0
  395. package/dist/migration/checksum.js.map +1 -0
  396. package/dist/migration/index.js +282 -0
  397. package/dist/migration/index.js.map +1 -0
  398. package/dist/migration/logger.js +360 -0
  399. package/dist/migration/logger.js.map +1 -0
  400. package/dist/migration/preflight.js +9 -0
  401. package/dist/migration/preflight.js.map +1 -0
  402. package/dist/migration/state.js +421 -0
  403. package/dist/migration/state.js.map +1 -0
  404. package/dist/migration/validate.js +241 -0
  405. package/dist/migration/validate.js.map +1 -0
  406. package/dist/mvi-helpers.js +73 -0
  407. package/dist/mvi-helpers.js.map +1 -0
  408. package/dist/nexus/deps.js +375 -0
  409. package/dist/nexus/deps.js.map +1 -0
  410. package/dist/nexus/discover.js +288 -0
  411. package/dist/nexus/discover.js.map +1 -0
  412. package/dist/nexus/hash.js +10 -0
  413. package/dist/nexus/hash.js.map +1 -0
  414. package/dist/nexus/index.js +40 -0
  415. package/dist/nexus/index.js.map +1 -0
  416. package/dist/nexus/migrate-json-to-sqlite.js +115 -0
  417. package/dist/nexus/migrate-json-to-sqlite.js.map +1 -0
  418. package/dist/nexus/nexus-bridge.d.ts +51 -0
  419. package/dist/nexus/nexus-bridge.d.ts.map +1 -0
  420. package/dist/nexus/nexus-bridge.js +321 -0
  421. package/dist/nexus/nexus-bridge.js.map +1 -0
  422. package/dist/nexus/permissions.js +105 -0
  423. package/dist/nexus/permissions.js.map +1 -0
  424. package/dist/nexus/query.js +175 -0
  425. package/dist/nexus/query.js.map +1 -0
  426. package/dist/nexus/registry.js +584 -0
  427. package/dist/nexus/registry.js.map +1 -0
  428. package/dist/nexus/sharing/index.js +288 -0
  429. package/dist/nexus/sharing/index.js.map +1 -0
  430. package/dist/nexus/transfer-types.js +8 -0
  431. package/dist/nexus/transfer-types.js.map +1 -0
  432. package/dist/nexus/transfer.js +271 -0
  433. package/dist/nexus/transfer.js.map +1 -0
  434. package/dist/nexus/workspace.js +355 -0
  435. package/dist/nexus/workspace.js.map +1 -0
  436. package/dist/observability/index.js +103 -0
  437. package/dist/observability/index.js.map +1 -0
  438. package/dist/observability/log-filter.js +63 -0
  439. package/dist/observability/log-filter.js.map +1 -0
  440. package/dist/observability/log-parser.js +99 -0
  441. package/dist/observability/log-parser.js.map +1 -0
  442. package/dist/observability/log-reader.js +139 -0
  443. package/dist/observability/log-reader.js.map +1 -0
  444. package/dist/observability/types.js +19 -0
  445. package/dist/observability/types.js.map +1 -0
  446. package/dist/orchestration/analyze.js +107 -0
  447. package/dist/orchestration/analyze.js.map +1 -0
  448. package/dist/orchestration/bootstrap.js +132 -0
  449. package/dist/orchestration/bootstrap.js.map +1 -0
  450. package/dist/orchestration/context.js +56 -0
  451. package/dist/orchestration/context.js.map +1 -0
  452. package/dist/orchestration/critical-path.js +100 -0
  453. package/dist/orchestration/critical-path.js.map +1 -0
  454. package/dist/orchestration/hierarchy.js +183 -0
  455. package/dist/orchestration/hierarchy.js.map +1 -0
  456. package/dist/orchestration/index.js +287 -0
  457. package/dist/orchestration/index.js.map +1 -0
  458. package/dist/orchestration/parallel.js +89 -0
  459. package/dist/orchestration/parallel.js.map +1 -0
  460. package/dist/orchestration/protocol-validators.js +815 -0
  461. package/dist/orchestration/protocol-validators.js.map +1 -0
  462. package/dist/orchestration/skill-ops.js +98 -0
  463. package/dist/orchestration/skill-ops.js.map +1 -0
  464. package/dist/orchestration/status.js +107 -0
  465. package/dist/orchestration/status.js.map +1 -0
  466. package/dist/orchestration/unblock.js +103 -0
  467. package/dist/orchestration/unblock.js.map +1 -0
  468. package/dist/orchestration/validate-spawn.js +67 -0
  469. package/dist/orchestration/validate-spawn.js.map +1 -0
  470. package/dist/orchestration/waves.js +86 -0
  471. package/dist/orchestration/waves.js.map +1 -0
  472. package/dist/otel/index.js +163 -0
  473. package/dist/otel/index.js.map +1 -0
  474. package/dist/output.js +164 -0
  475. package/dist/output.js.map +1 -0
  476. package/dist/pagination.js +64 -0
  477. package/dist/pagination.js.map +1 -0
  478. package/dist/paths.js +882 -0
  479. package/dist/paths.js.map +1 -0
  480. package/dist/phases/deps.js +372 -0
  481. package/dist/phases/deps.js.map +1 -0
  482. package/dist/phases/index.js +349 -0
  483. package/dist/phases/index.js.map +1 -0
  484. package/dist/pipeline/index.js +10 -0
  485. package/dist/pipeline/index.js.map +1 -0
  486. package/dist/pipeline/phase.js +45 -0
  487. package/dist/pipeline/phase.js.map +1 -0
  488. package/dist/platform.js +211 -0
  489. package/dist/platform.js.map +1 -0
  490. package/dist/project-info.js +84 -0
  491. package/dist/project-info.js.map +1 -0
  492. package/dist/reconciliation/index.js +10 -0
  493. package/dist/reconciliation/index.js.map +1 -0
  494. package/dist/reconciliation/link-store.js +175 -0
  495. package/dist/reconciliation/link-store.js.map +1 -0
  496. package/dist/reconciliation/reconciliation-engine.js +298 -0
  497. package/dist/reconciliation/reconciliation-engine.js.map +1 -0
  498. package/dist/release/artifacts.js +427 -0
  499. package/dist/release/artifacts.js.map +1 -0
  500. package/dist/release/changelog-writer.js +151 -0
  501. package/dist/release/changelog-writer.js.map +1 -0
  502. package/dist/release/channel.js +144 -0
  503. package/dist/release/channel.js.map +1 -0
  504. package/dist/release/ci.js +166 -0
  505. package/dist/release/ci.js.map +1 -0
  506. package/dist/release/github-pr.js +225 -0
  507. package/dist/release/github-pr.js.map +1 -0
  508. package/dist/release/guards.js +116 -0
  509. package/dist/release/guards.js.map +1 -0
  510. package/dist/release/index.js +22 -0
  511. package/dist/release/index.js.map +1 -0
  512. package/dist/release/release-config.js +158 -0
  513. package/dist/release/release-config.js.map +1 -0
  514. package/dist/release/release-manifest.js +1019 -0
  515. package/dist/release/release-manifest.js.map +1 -0
  516. package/dist/release/version-bump.js +255 -0
  517. package/dist/release/version-bump.js.map +1 -0
  518. package/dist/remote/index.js +257 -0
  519. package/dist/remote/index.js.map +1 -0
  520. package/dist/repair.js +130 -0
  521. package/dist/repair.js.map +1 -0
  522. package/dist/research/index.js +2 -0
  523. package/dist/research/index.js.map +1 -0
  524. package/dist/roadmap/index.js +59 -0
  525. package/dist/roadmap/index.js.map +1 -0
  526. package/dist/routing/capability-matrix.js +1556 -0
  527. package/dist/routing/capability-matrix.js.map +1 -0
  528. package/dist/routing/index.js +9 -0
  529. package/dist/routing/index.js.map +1 -0
  530. package/dist/scaffold.d.ts +18 -0
  531. package/dist/scaffold.d.ts.map +1 -1
  532. package/dist/scaffold.js +1798 -0
  533. package/dist/scaffold.js.map +1 -0
  534. package/dist/schema-management.js +295 -0
  535. package/dist/schema-management.js.map +1 -0
  536. package/dist/security/index.js +9 -0
  537. package/dist/security/index.js.map +1 -0
  538. package/dist/security/input-sanitization.js +326 -0
  539. package/dist/security/input-sanitization.js.map +1 -0
  540. package/dist/sequence/index.js +295 -0
  541. package/dist/sequence/index.js.map +1 -0
  542. package/dist/sessions/assumptions.js +54 -0
  543. package/dist/sessions/assumptions.js.map +1 -0
  544. package/dist/sessions/briefing.js +377 -0
  545. package/dist/sessions/briefing.js.map +1 -0
  546. package/dist/sessions/context-alert.js +222 -0
  547. package/dist/sessions/context-alert.js.map +1 -0
  548. package/dist/sessions/context-inject.js +61 -0
  549. package/dist/sessions/context-inject.js.map +1 -0
  550. package/dist/sessions/context-monitor.js +98 -0
  551. package/dist/sessions/context-monitor.js.map +1 -0
  552. package/dist/sessions/decisions.js +65 -0
  553. package/dist/sessions/decisions.js.map +1 -0
  554. package/dist/sessions/find.js +65 -0
  555. package/dist/sessions/find.js.map +1 -0
  556. package/dist/sessions/handoff.js +328 -0
  557. package/dist/sessions/handoff.js.map +1 -0
  558. package/dist/sessions/hitl-warnings.js +254 -0
  559. package/dist/sessions/hitl-warnings.js.map +1 -0
  560. package/dist/sessions/index.js +327 -0
  561. package/dist/sessions/index.js.map +1 -0
  562. package/dist/sessions/session-archive.js +40 -0
  563. package/dist/sessions/session-archive.js.map +1 -0
  564. package/dist/sessions/session-cleanup.js +59 -0
  565. package/dist/sessions/session-cleanup.js.map +1 -0
  566. package/dist/sessions/session-drift.js +134 -0
  567. package/dist/sessions/session-drift.js.map +1 -0
  568. package/dist/sessions/session-enforcement.js +144 -0
  569. package/dist/sessions/session-enforcement.js.map +1 -0
  570. package/dist/sessions/session-grade.js +253 -0
  571. package/dist/sessions/session-grade.js.map +1 -0
  572. package/dist/sessions/session-history.js +42 -0
  573. package/dist/sessions/session-history.js.map +1 -0
  574. package/dist/sessions/session-id.js +81 -0
  575. package/dist/sessions/session-id.js.map +1 -0
  576. package/dist/sessions/session-memory-bridge.d.ts +16 -10
  577. package/dist/sessions/session-memory-bridge.d.ts.map +1 -1
  578. package/dist/sessions/session-memory-bridge.js +30 -0
  579. package/dist/sessions/session-memory-bridge.js.map +1 -0
  580. package/dist/sessions/session-show.js +24 -0
  581. package/dist/sessions/session-show.js.map +1 -0
  582. package/dist/sessions/session-stats.js +69 -0
  583. package/dist/sessions/session-stats.js.map +1 -0
  584. package/dist/sessions/session-suspend.js +39 -0
  585. package/dist/sessions/session-suspend.js.map +1 -0
  586. package/dist/sessions/session-switch.js +51 -0
  587. package/dist/sessions/session-switch.js.map +1 -0
  588. package/dist/sessions/session-view.js +76 -0
  589. package/dist/sessions/session-view.js.map +1 -0
  590. package/dist/sessions/snapshot.js +213 -0
  591. package/dist/sessions/snapshot.js.map +1 -0
  592. package/dist/sessions/statusline-setup.js +85 -0
  593. package/dist/sessions/statusline-setup.js.map +1 -0
  594. package/dist/sessions/types.js +8 -0
  595. package/dist/sessions/types.js.map +1 -0
  596. package/dist/skills/agents/config.js +94 -0
  597. package/dist/skills/agents/config.js.map +1 -0
  598. package/dist/skills/agents/install.js +116 -0
  599. package/dist/skills/agents/install.js.map +1 -0
  600. package/dist/skills/agents/registry.js +161 -0
  601. package/dist/skills/agents/registry.js.map +1 -0
  602. package/dist/skills/discovery.js +333 -0
  603. package/dist/skills/discovery.js.map +1 -0
  604. package/dist/skills/dispatch.js +347 -0
  605. package/dist/skills/dispatch.js.map +1 -0
  606. package/dist/skills/dynamic-skill-generator.js +87 -0
  607. package/dist/skills/dynamic-skill-generator.js.map +1 -0
  608. package/dist/skills/index.js +44 -0
  609. package/dist/skills/index.js.map +1 -0
  610. package/dist/skills/injection/subagent.js +195 -0
  611. package/dist/skills/injection/subagent.js.map +1 -0
  612. package/dist/skills/injection/token.js +260 -0
  613. package/dist/skills/injection/token.js.map +1 -0
  614. package/dist/skills/install.js +40 -0
  615. package/dist/skills/install.js.map +1 -0
  616. package/dist/skills/manifests/contribution.js +175 -0
  617. package/dist/skills/manifests/contribution.js.map +1 -0
  618. package/dist/skills/manifests/research.js +281 -0
  619. package/dist/skills/manifests/research.js.map +1 -0
  620. package/dist/skills/manifests/resolver.js +146 -0
  621. package/dist/skills/manifests/resolver.js.map +1 -0
  622. package/dist/skills/marketplace.js +90 -0
  623. package/dist/skills/marketplace.js.map +1 -0
  624. package/dist/skills/orchestrator/spawn.js +178 -0
  625. package/dist/skills/orchestrator/spawn.js.map +1 -0
  626. package/dist/skills/orchestrator/startup.js +451 -0
  627. package/dist/skills/orchestrator/startup.js.map +1 -0
  628. package/dist/skills/orchestrator/validator.js +301 -0
  629. package/dist/skills/orchestrator/validator.js.map +1 -0
  630. package/dist/skills/precedence-integration.js +73 -0
  631. package/dist/skills/precedence-integration.js.map +1 -0
  632. package/dist/skills/precedence-types.js +16 -0
  633. package/dist/skills/precedence-types.js.map +1 -0
  634. package/dist/skills/routing-table.js +63 -0
  635. package/dist/skills/routing-table.js.map +1 -0
  636. package/dist/skills/skill-paths.js +217 -0
  637. package/dist/skills/skill-paths.js.map +1 -0
  638. package/dist/skills/test-utility.js +55 -0
  639. package/dist/skills/test-utility.js.map +1 -0
  640. package/dist/skills/types.js +118 -0
  641. package/dist/skills/types.js.map +1 -0
  642. package/dist/skills/validation.js +183 -0
  643. package/dist/skills/validation.js.map +1 -0
  644. package/dist/skills/version.js +57 -0
  645. package/dist/skills/version.js.map +1 -0
  646. package/dist/snapshot/index.js +188 -0
  647. package/dist/snapshot/index.js.map +1 -0
  648. package/dist/spawn/adapter-registry.js +246 -0
  649. package/dist/spawn/adapter-registry.js.map +1 -0
  650. package/dist/spawn/index.js +10 -0
  651. package/dist/spawn/index.js.map +1 -0
  652. package/dist/stats/index.d.ts.map +1 -1
  653. package/dist/stats/index.js +350 -0
  654. package/dist/stats/index.js.map +1 -0
  655. package/dist/stats/workflow-telemetry.js +400 -0
  656. package/dist/stats/workflow-telemetry.js.map +1 -0
  657. package/dist/sticky/archive.js +47 -0
  658. package/dist/sticky/archive.js.map +1 -0
  659. package/dist/sticky/convert.js +235 -0
  660. package/dist/sticky/convert.js.map +1 -0
  661. package/dist/sticky/create.js +48 -0
  662. package/dist/sticky/create.js.map +1 -0
  663. package/dist/sticky/id.js +35 -0
  664. package/dist/sticky/id.js.map +1 -0
  665. package/dist/sticky/index.js +16 -0
  666. package/dist/sticky/index.js.map +1 -0
  667. package/dist/sticky/list.js +57 -0
  668. package/dist/sticky/list.js.map +1 -0
  669. package/dist/sticky/purge.js +45 -0
  670. package/dist/sticky/purge.js.map +1 -0
  671. package/dist/sticky/show.js +42 -0
  672. package/dist/sticky/show.js.map +1 -0
  673. package/dist/sticky/types.js +10 -0
  674. package/dist/sticky/types.js.map +1 -0
  675. package/dist/store/agent-registry-accessor.js +886 -0
  676. package/dist/store/agent-registry-accessor.js.map +1 -0
  677. package/dist/store/api-key-kdf.js +84 -0
  678. package/dist/store/api-key-kdf.js.map +1 -0
  679. package/dist/store/atomic.js +167 -0
  680. package/dist/store/atomic.js.map +1 -0
  681. package/dist/store/backup-crypto.js +184 -0
  682. package/dist/store/backup-crypto.js.map +1 -0
  683. package/dist/store/backup-pack.js +581 -0
  684. package/dist/store/backup-pack.js.map +1 -0
  685. package/dist/store/backup-unpack.js +449 -0
  686. package/dist/store/backup-unpack.js.map +1 -0
  687. package/dist/store/backup.js +94 -0
  688. package/dist/store/backup.js.map +1 -0
  689. package/dist/store/brain-accessor.d.ts +7 -0
  690. package/dist/store/brain-accessor.d.ts.map +1 -1
  691. package/dist/store/brain-accessor.js +429 -0
  692. package/dist/store/brain-accessor.js.map +1 -0
  693. package/dist/store/brain-schema.d.ts +712 -45
  694. package/dist/store/brain-schema.d.ts.map +1 -1
  695. package/dist/store/brain-schema.js +549 -0
  696. package/dist/store/brain-schema.js.map +1 -0
  697. package/dist/store/brain-sqlite.d.ts.map +1 -1
  698. package/dist/store/brain-sqlite.js +257 -0
  699. package/dist/store/brain-sqlite.js.map +1 -0
  700. package/dist/store/cache.js +168 -0
  701. package/dist/store/cache.js.map +1 -0
  702. package/dist/store/chain-schema.js +51 -0
  703. package/dist/store/chain-schema.js.map +1 -0
  704. package/dist/store/cleanup-legacy.js +171 -0
  705. package/dist/store/cleanup-legacy.js.map +1 -0
  706. package/dist/store/conduit-sqlite.js +570 -0
  707. package/dist/store/conduit-sqlite.js.map +1 -0
  708. package/dist/store/converters.js +124 -0
  709. package/dist/store/converters.js.map +1 -0
  710. package/dist/store/cross-db-cleanup.js +319 -0
  711. package/dist/store/cross-db-cleanup.js.map +1 -0
  712. package/dist/store/data-accessor.js +26 -0
  713. package/dist/store/data-accessor.js.map +1 -0
  714. package/dist/store/data-safety-central.js +269 -0
  715. package/dist/store/data-safety-central.js.map +1 -0
  716. package/dist/store/data-safety.js +274 -0
  717. package/dist/store/data-safety.js.map +1 -0
  718. package/dist/store/db-helpers.js +224 -0
  719. package/dist/store/db-helpers.js.map +1 -0
  720. package/dist/store/export.js +155 -0
  721. package/dist/store/export.js.map +1 -0
  722. package/dist/store/file-utils.js +270 -0
  723. package/dist/store/file-utils.js.map +1 -0
  724. package/dist/store/git-checkpoint.js +365 -0
  725. package/dist/store/git-checkpoint.js.map +1 -0
  726. package/dist/store/global-salt.js +147 -0
  727. package/dist/store/global-salt.js.map +1 -0
  728. package/dist/store/import-logging.js +139 -0
  729. package/dist/store/import-logging.js.map +1 -0
  730. package/dist/store/import-remap.js +145 -0
  731. package/dist/store/import-remap.js.map +1 -0
  732. package/dist/store/import-sort.js +121 -0
  733. package/dist/store/import-sort.js.map +1 -0
  734. package/dist/store/index.js +29 -0
  735. package/dist/store/index.js.map +1 -0
  736. package/dist/store/json.js +208 -0
  737. package/dist/store/json.js.map +1 -0
  738. package/dist/store/lifecycle-store.js +249 -0
  739. package/dist/store/lifecycle-store.js.map +1 -0
  740. package/dist/store/lock.js +70 -0
  741. package/dist/store/lock.js.map +1 -0
  742. package/dist/store/migrate-signaldock-to-conduit.js +562 -0
  743. package/dist/store/migrate-signaldock-to-conduit.js.map +1 -0
  744. package/dist/store/migration-manager.d.ts +5 -1
  745. package/dist/store/migration-manager.d.ts.map +1 -1
  746. package/dist/store/migration-manager.js +288 -0
  747. package/dist/store/migration-manager.js.map +1 -0
  748. package/dist/store/migration-sqlite.js +676 -0
  749. package/dist/store/migration-sqlite.js.map +1 -0
  750. package/dist/store/nexus-schema.d.ts +480 -2
  751. package/dist/store/nexus-schema.d.ts.map +1 -1
  752. package/dist/store/nexus-schema.js +268 -0
  753. package/dist/store/nexus-schema.js.map +1 -0
  754. package/dist/store/nexus-sqlite.js +242 -0
  755. package/dist/store/nexus-sqlite.js.map +1 -0
  756. package/dist/store/nexus-validation-schemas.js +40 -0
  757. package/dist/store/nexus-validation-schemas.js.map +1 -0
  758. package/dist/store/parsers.js +37 -0
  759. package/dist/store/parsers.js.map +1 -0
  760. package/dist/store/project-detect.js +457 -0
  761. package/dist/store/project-detect.js.map +1 -0
  762. package/dist/store/provider.js +101 -0
  763. package/dist/store/provider.js.map +1 -0
  764. package/dist/store/regenerators.js +207 -0
  765. package/dist/store/regenerators.js.map +1 -0
  766. package/dist/store/restore-conflict-report.js +206 -0
  767. package/dist/store/restore-conflict-report.js.map +1 -0
  768. package/dist/store/restore-json-merge.js +454 -0
  769. package/dist/store/restore-json-merge.js.map +1 -0
  770. package/dist/store/safety-data-accessor.js +257 -0
  771. package/dist/store/safety-data-accessor.js.map +1 -0
  772. package/dist/store/schema.js +7 -0
  773. package/dist/store/schema.js.map +1 -0
  774. package/dist/store/session-store.js +219 -0
  775. package/dist/store/session-store.js.map +1 -0
  776. package/dist/store/signaldock-sqlite.js +550 -0
  777. package/dist/store/signaldock-sqlite.js.map +1 -0
  778. package/dist/store/sqlite-backup.js +498 -0
  779. package/dist/store/sqlite-backup.js.map +1 -0
  780. package/dist/store/sqlite-data-accessor.js +787 -0
  781. package/dist/store/sqlite-data-accessor.js.map +1 -0
  782. package/dist/store/sqlite.js +483 -0
  783. package/dist/store/sqlite.js.map +1 -0
  784. package/dist/store/status-registry.js +8 -0
  785. package/dist/store/status-registry.js.map +1 -0
  786. package/dist/store/t310-readiness.js +115 -0
  787. package/dist/store/t310-readiness.js.map +1 -0
  788. package/dist/store/task-store.js +358 -0
  789. package/dist/store/task-store.js.map +1 -0
  790. package/dist/store/tasks-schema.d.ts +10 -10
  791. package/dist/store/tasks-schema.js +610 -0
  792. package/dist/store/tasks-schema.js.map +1 -0
  793. package/dist/store/typed-query.js +15 -0
  794. package/dist/store/typed-query.js.map +1 -0
  795. package/dist/store/validation-schemas.d.ts +50 -34
  796. package/dist/store/validation-schemas.d.ts.map +1 -1
  797. package/dist/store/validation-schemas.js +278 -0
  798. package/dist/store/validation-schemas.js.map +1 -0
  799. package/dist/system/archive-analytics.js +277 -0
  800. package/dist/system/archive-analytics.js.map +1 -0
  801. package/dist/system/archive-stats.js +64 -0
  802. package/dist/system/archive-stats.js.map +1 -0
  803. package/dist/system/audit.js +145 -0
  804. package/dist/system/audit.js.map +1 -0
  805. package/dist/system/backup.js +280 -0
  806. package/dist/system/backup.js.map +1 -0
  807. package/dist/system/cleanup.js +134 -0
  808. package/dist/system/cleanup.js.map +1 -0
  809. package/dist/system/dependencies.d.ts +43 -0
  810. package/dist/system/dependencies.d.ts.map +1 -0
  811. package/dist/system/dependencies.js +466 -0
  812. package/dist/system/dependencies.js.map +1 -0
  813. package/dist/system/health.d.ts +3 -0
  814. package/dist/system/health.d.ts.map +1 -1
  815. package/dist/system/health.js +1206 -0
  816. package/dist/system/health.js.map +1 -0
  817. package/dist/system/index.js +18 -0
  818. package/dist/system/index.js.map +1 -0
  819. package/dist/system/inject-generate.js +122 -0
  820. package/dist/system/inject-generate.js.map +1 -0
  821. package/dist/system/labels.js +38 -0
  822. package/dist/system/labels.js.map +1 -0
  823. package/dist/system/metrics.js +61 -0
  824. package/dist/system/metrics.js.map +1 -0
  825. package/dist/system/migrate.js +43 -0
  826. package/dist/system/migrate.js.map +1 -0
  827. package/dist/system/platform-paths.js +80 -0
  828. package/dist/system/platform-paths.js.map +1 -0
  829. package/dist/system/runtime.js +161 -0
  830. package/dist/system/runtime.js.map +1 -0
  831. package/dist/system/safestop.js +89 -0
  832. package/dist/system/safestop.js.map +1 -0
  833. package/dist/system/storage-preflight.js +123 -0
  834. package/dist/system/storage-preflight.js.map +1 -0
  835. package/dist/task-work/index.js +159 -0
  836. package/dist/task-work/index.js.map +1 -0
  837. package/dist/tasks/add.js +837 -0
  838. package/dist/tasks/add.js.map +1 -0
  839. package/dist/tasks/analyze.js +85 -0
  840. package/dist/tasks/analyze.js.map +1 -0
  841. package/dist/tasks/archive.js +90 -0
  842. package/dist/tasks/archive.js.map +1 -0
  843. package/dist/tasks/atomicity.js +83 -0
  844. package/dist/tasks/atomicity.js.map +1 -0
  845. package/dist/tasks/cancel-ops.js +83 -0
  846. package/dist/tasks/cancel-ops.js.map +1 -0
  847. package/dist/tasks/complete.d.ts.map +1 -1
  848. package/dist/tasks/complete.js +229 -0
  849. package/dist/tasks/complete.js.map +1 -0
  850. package/dist/tasks/crossref-extract.js +73 -0
  851. package/dist/tasks/crossref-extract.js.map +1 -0
  852. package/dist/tasks/delete-preview.js +192 -0
  853. package/dist/tasks/delete-preview.js.map +1 -0
  854. package/dist/tasks/delete.js +120 -0
  855. package/dist/tasks/delete.js.map +1 -0
  856. package/dist/tasks/deletion-strategy.js +200 -0
  857. package/dist/tasks/deletion-strategy.js.map +1 -0
  858. package/dist/tasks/dependency-check.js +278 -0
  859. package/dist/tasks/dependency-check.js.map +1 -0
  860. package/dist/tasks/deps-ready.js +32 -0
  861. package/dist/tasks/deps-ready.js.map +1 -0
  862. package/dist/tasks/enforcement.js +86 -0
  863. package/dist/tasks/enforcement.js.map +1 -0
  864. package/dist/tasks/epic-enforcement.js +294 -0
  865. package/dist/tasks/epic-enforcement.js.map +1 -0
  866. package/dist/tasks/find.js +163 -0
  867. package/dist/tasks/find.js.map +1 -0
  868. package/dist/tasks/graph-cache.js +127 -0
  869. package/dist/tasks/graph-cache.js.map +1 -0
  870. package/dist/tasks/graph-ops.d.ts.map +1 -1
  871. package/dist/tasks/graph-ops.js +173 -0
  872. package/dist/tasks/graph-ops.js.map +1 -0
  873. package/dist/tasks/graph-rag.js +328 -0
  874. package/dist/tasks/graph-rag.js.map +1 -0
  875. package/dist/tasks/hierarchy-policy.js +149 -0
  876. package/dist/tasks/hierarchy-policy.js.map +1 -0
  877. package/dist/tasks/hierarchy.js +185 -0
  878. package/dist/tasks/hierarchy.js.map +1 -0
  879. package/dist/tasks/id-generator.js +65 -0
  880. package/dist/tasks/id-generator.js.map +1 -0
  881. package/dist/tasks/index.js +14 -0
  882. package/dist/tasks/index.js.map +1 -0
  883. package/dist/tasks/labels.js +55 -0
  884. package/dist/tasks/labels.js.map +1 -0
  885. package/dist/tasks/list.js +75 -0
  886. package/dist/tasks/list.js.map +1 -0
  887. package/dist/tasks/phase-tracking.js +133 -0
  888. package/dist/tasks/phase-tracking.js.map +1 -0
  889. package/dist/tasks/pipeline-stage.js +248 -0
  890. package/dist/tasks/pipeline-stage.js.map +1 -0
  891. package/dist/tasks/plan.js +268 -0
  892. package/dist/tasks/plan.js.map +1 -0
  893. package/dist/tasks/relates.js +101 -0
  894. package/dist/tasks/relates.js.map +1 -0
  895. package/dist/tasks/show.js +83 -0
  896. package/dist/tasks/show.js.map +1 -0
  897. package/dist/tasks/size-weighting.js +86 -0
  898. package/dist/tasks/size-weighting.js.map +1 -0
  899. package/dist/tasks/staleness.js +86 -0
  900. package/dist/tasks/staleness.js.map +1 -0
  901. package/dist/tasks/task-ops.js +1741 -0
  902. package/dist/tasks/task-ops.js.map +1 -0
  903. package/dist/tasks/update.js +303 -0
  904. package/dist/tasks/update.js.map +1 -0
  905. package/dist/templates/index.js +10 -0
  906. package/dist/templates/index.js.map +1 -0
  907. package/dist/templates/parser.js +254 -0
  908. package/dist/templates/parser.js.map +1 -0
  909. package/dist/ui/aliases.js +153 -0
  910. package/dist/ui/aliases.js.map +1 -0
  911. package/dist/ui/changelog.js +184 -0
  912. package/dist/ui/changelog.js.map +1 -0
  913. package/dist/ui/command-registry.js +168 -0
  914. package/dist/ui/command-registry.js.map +1 -0
  915. package/dist/ui/flags.js +94 -0
  916. package/dist/ui/flags.js.map +1 -0
  917. package/dist/ui/index.js +24 -0
  918. package/dist/ui/index.js.map +1 -0
  919. package/dist/upgrade.js +1148 -0
  920. package/dist/upgrade.js.map +1 -0
  921. package/dist/validation/chain-validation.js +146 -0
  922. package/dist/validation/chain-validation.js.map +1 -0
  923. package/dist/validation/compliance.js +155 -0
  924. package/dist/validation/compliance.js.map +1 -0
  925. package/dist/validation/docs-sync.js +212 -0
  926. package/dist/validation/docs-sync.js.map +1 -0
  927. package/dist/validation/doctor/checks.js +1069 -0
  928. package/dist/validation/doctor/checks.js.map +1 -0
  929. package/dist/validation/doctor/index.js +9 -0
  930. package/dist/validation/doctor/index.js.map +1 -0
  931. package/dist/validation/doctor/project-cache.js +160 -0
  932. package/dist/validation/doctor/project-cache.js.map +1 -0
  933. package/dist/validation/doctor/utils.js +155 -0
  934. package/dist/validation/doctor/utils.js.map +1 -0
  935. package/dist/validation/engine.js +914 -0
  936. package/dist/validation/engine.js.map +1 -0
  937. package/dist/validation/gap-check.js +175 -0
  938. package/dist/validation/gap-check.js.map +1 -0
  939. package/dist/validation/index.js +40 -0
  940. package/dist/validation/index.js.map +1 -0
  941. package/dist/validation/manifest.js +237 -0
  942. package/dist/validation/manifest.js.map +1 -0
  943. package/dist/validation/operation-gate-validators.js +724 -0
  944. package/dist/validation/operation-gate-validators.js.map +1 -0
  945. package/dist/validation/operation-verification-gates.js +532 -0
  946. package/dist/validation/operation-verification-gates.js.map +1 -0
  947. package/dist/validation/param-utils.js +141 -0
  948. package/dist/validation/param-utils.js.map +1 -0
  949. package/dist/validation/protocol-common.js +300 -0
  950. package/dist/validation/protocol-common.js.map +1 -0
  951. package/dist/validation/protocols/_shared.js +82 -0
  952. package/dist/validation/protocols/_shared.js.map +1 -0
  953. package/dist/validation/protocols/architecture-decision.js +31 -0
  954. package/dist/validation/protocols/architecture-decision.js.map +1 -0
  955. package/dist/validation/protocols/artifact-publish.js +28 -0
  956. package/dist/validation/protocols/artifact-publish.js.map +1 -0
  957. package/dist/validation/protocols/consensus.js +41 -0
  958. package/dist/validation/protocols/consensus.js.map +1 -0
  959. package/dist/validation/protocols/contribution.js +27 -0
  960. package/dist/validation/protocols/contribution.js.map +1 -0
  961. package/dist/validation/protocols/decomposition.js +28 -0
  962. package/dist/validation/protocols/decomposition.js.map +1 -0
  963. package/dist/validation/protocols/implementation.js +24 -0
  964. package/dist/validation/protocols/implementation.js.map +1 -0
  965. package/dist/validation/protocols/provenance.js +29 -0
  966. package/dist/validation/protocols/provenance.js.map +1 -0
  967. package/dist/validation/protocols/release.js +29 -0
  968. package/dist/validation/protocols/release.js.map +1 -0
  969. package/dist/validation/protocols/research.js +24 -0
  970. package/dist/validation/protocols/research.js.map +1 -0
  971. package/dist/validation/protocols/specification.js +27 -0
  972. package/dist/validation/protocols/specification.js.map +1 -0
  973. package/dist/validation/protocols/testing.js +30 -0
  974. package/dist/validation/protocols/testing.js.map +1 -0
  975. package/dist/validation/protocols/validation.js +30 -0
  976. package/dist/validation/protocols/validation.js.map +1 -0
  977. package/dist/validation/schema-integrity.js +170 -0
  978. package/dist/validation/schema-integrity.js.map +1 -0
  979. package/dist/validation/schema-validator.js +176 -0
  980. package/dist/validation/schema-validator.js.map +1 -0
  981. package/dist/validation/validate-ops.js +937 -0
  982. package/dist/validation/validate-ops.js.map +1 -0
  983. package/dist/validation/validation-rules.js +226 -0
  984. package/dist/validation/validation-rules.js.map +1 -0
  985. package/dist/validation/verification.js +321 -0
  986. package/dist/validation/verification.js.map +1 -0
  987. package/migrations/drizzle-brain/20260411000001_t528-graph-schema-expansion/migration.sql +47 -0
  988. package/migrations/drizzle-brain/20260412000001_t531-quality-score-typed-tables/migration.sql +23 -0
  989. package/migrations/drizzle-brain/20260413000001_t549-tiered-typed-memory/migration.sql +195 -0
  990. package/migrations/drizzle-nexus/20260412000001_t529-nexus-graph-tables/migration.sql +49 -0
  991. package/package.json +19 -19
  992. package/src/bootstrap.ts +124 -0
  993. package/src/code/index.ts +20 -4
  994. package/src/code/parser.ts +310 -110
  995. package/src/hooks/handlers/__tests__/hook-automation-e2e.test.ts +19 -45
  996. package/src/hooks/handlers/__tests__/session-hooks.test.ts +42 -54
  997. package/src/hooks/handlers/index.ts +6 -0
  998. package/src/hooks/handlers/intelligence-hooks.ts +80 -0
  999. package/src/hooks/handlers/session-hooks.ts +52 -33
  1000. package/src/hooks/handlers/watchdog-hooks.ts +187 -0
  1001. package/src/index.ts +14 -0
  1002. package/src/injection.ts +41 -2
  1003. package/src/internal.ts +68 -9
  1004. package/src/lib/tree-sitter-languages.ts +11 -7
  1005. package/src/memory/__tests__/auto-extract.test.ts +20 -82
  1006. package/src/memory/__tests__/embedding-pipeline.test.ts +389 -0
  1007. package/src/memory/auto-extract.ts +34 -120
  1008. package/src/memory/brain-backfill.ts +471 -0
  1009. package/src/memory/brain-consolidator.ts +344 -0
  1010. package/src/memory/brain-lifecycle.ts +636 -2
  1011. package/src/memory/brain-purge.ts +315 -0
  1012. package/src/memory/brain-retrieval.ts +486 -2
  1013. package/src/memory/brain-search.ts +61 -10
  1014. package/src/memory/decisions.ts +96 -3
  1015. package/src/memory/engine-compat.ts +177 -11
  1016. package/src/memory/extraction-gate.ts +574 -0
  1017. package/src/memory/graph-auto-populate.ts +173 -0
  1018. package/src/memory/graph-queries.ts +424 -0
  1019. package/src/memory/index.ts +6 -2
  1020. package/src/memory/learnings.ts +87 -7
  1021. package/src/memory/patterns.ts +95 -13
  1022. package/src/memory/quality-scoring.ts +257 -0
  1023. package/src/nexus/nexus-bridge.ts +444 -0
  1024. package/src/scaffold.ts +42 -0
  1025. package/src/sessions/__tests__/session-memory-bridge.test.ts +27 -49
  1026. package/src/sessions/session-memory-bridge.ts +19 -47
  1027. package/src/stats/index.ts +11 -3
  1028. package/src/store/__tests__/brain-accessor-pageindex.test.ts +93 -22
  1029. package/src/store/brain-accessor.ts +48 -2
  1030. package/src/store/brain-schema.ts +403 -13
  1031. package/src/store/brain-sqlite.ts +90 -0
  1032. package/src/store/migration-manager.ts +83 -12
  1033. package/src/store/nexus-schema.ts +257 -3
  1034. package/src/system/dependencies.ts +534 -0
  1035. package/src/system/health.ts +143 -22
  1036. package/src/tasks/complete.ts +40 -0
  1037. package/src/tasks/graph-ops.ts +1 -0
  1038. package/src/tasks/task-ops.ts +1 -1
  1039. package/templates/CLEO-INJECTION.md +15 -0
@@ -0,0 +1,912 @@
1
+ /**
2
+ * BRAIN Retrieval Operations — 3-layer pattern (search -> timeline -> fetch).
3
+ *
4
+ * Provides token-efficient memory access modeled after claude-mem's
5
+ * search/timeline/get_observations workflow:
6
+ *
7
+ * 1. searchBrainCompact — lightweight index (IDs + titles, ~50 tokens/hit)
8
+ * 2. timelineBrain — chronological context around an anchor entry
9
+ * 3. fetchBrainEntries — full details for a filtered set of IDs
10
+ * 4. observeBrain — unified save (observations table)
11
+ *
12
+ * Wave 2A provides the core implementations; Wave 2B wires them through
13
+ * the dispatch layer (engine-compat -> domain handler -> CLI gateway).
14
+ *
15
+ * @task T5131 T5132 T5133 T5134 T5135
16
+ * @epic T5149
17
+ */
18
+ import { createHash } from 'node:crypto';
19
+ import { memoryFindHitNext } from '../mvi-helpers.js';
20
+ import { getBrainAccessor } from '../store/brain-accessor.js';
21
+ import { sessionExistsInTasksDb } from '../store/cross-db-cleanup.js';
22
+ import { getDb } from '../store/sqlite.js';
23
+ import { typedAll } from '../store/typed-query.js';
24
+ import { embedText, isEmbeddingAvailable } from './brain-embedding.js';
25
+ import { searchBrain } from './brain-search.js';
26
+ import { searchSimilar } from './brain-similarity.js';
27
+ import { addGraphEdge, upsertGraphNode } from './graph-auto-populate.js';
28
+ import { computeObservationQuality } from './quality-scoring.js';
29
+ // ============================================================================
30
+ // Layer 1: Compact Search
31
+ // ============================================================================
32
+ /**
33
+ * Token-efficient compact search across BRAIN tables.
34
+ * Returns index-level hits (~50 tokens per result).
35
+ *
36
+ * Delegates to searchBrain() from brain-search.ts for FTS5/LIKE search,
37
+ * then projects results to a compact format with optional date filtering.
38
+ *
39
+ * @param projectRoot - Project root directory
40
+ * @param params - Search parameters
41
+ * @returns Compact search results with token estimate
42
+ */
43
+ export async function searchBrainCompact(projectRoot, params) {
44
+ const { query, limit, tables, dateStart, dateEnd, agent } = params;
45
+ if (!query?.trim()) {
46
+ return { results: [], total: 0, tokensEstimated: 0 };
47
+ }
48
+ // T418: when agent filter is set, restrict search to observations table only
49
+ const effectiveTables = agent !== undefined && agent !== null
50
+ ? ['observations']
51
+ : tables;
52
+ const searchResult = await searchBrain(projectRoot, query, {
53
+ limit: limit ?? 10,
54
+ tables: effectiveTables,
55
+ });
56
+ // Project full results to compact format.
57
+ // Note: searchBrain() returns rows from raw SQL (nativeDb) which use
58
+ // snake_case column names, but the TypeScript types are camelCase.
59
+ // We handle both naming conventions for robustness.
60
+ let results = [];
61
+ if (!agent) {
62
+ for (const d of searchResult.decisions) {
63
+ const raw = d;
64
+ results.push({
65
+ id: d.id,
66
+ type: 'decision',
67
+ title: d.decision.slice(0, 80),
68
+ date: (d.createdAt ?? raw['created_at']) || '',
69
+ });
70
+ }
71
+ for (const p of searchResult.patterns) {
72
+ const raw = p;
73
+ results.push({
74
+ id: p.id,
75
+ type: 'pattern',
76
+ title: p.pattern.slice(0, 80),
77
+ date: (p.extractedAt ?? raw['extracted_at']) || '',
78
+ });
79
+ }
80
+ for (const l of searchResult.learnings) {
81
+ const raw = l;
82
+ results.push({
83
+ id: l.id,
84
+ type: 'learning',
85
+ title: l.insight.slice(0, 80),
86
+ date: (l.createdAt ?? raw['created_at']) || '',
87
+ });
88
+ }
89
+ }
90
+ for (const o of searchResult.observations) {
91
+ const raw = o;
92
+ // T418: apply agent post-filter when specified
93
+ if (agent) {
94
+ const rowAgent = o.agent ?? raw['agent'] ?? null;
95
+ if (rowAgent !== agent)
96
+ continue;
97
+ }
98
+ results.push({
99
+ id: o.id,
100
+ type: 'observation',
101
+ title: o.title.slice(0, 80),
102
+ date: (o.createdAt ?? raw['created_at']) || '',
103
+ });
104
+ }
105
+ // Apply date filters client-side if provided
106
+ if (dateStart) {
107
+ results = results.filter((r) => r.date >= dateStart);
108
+ }
109
+ if (dateEnd) {
110
+ results = results.filter((r) => r.date <= dateEnd);
111
+ }
112
+ // Enrich each hit with _next progressive disclosure directives
113
+ for (const hit of results) {
114
+ hit._next = memoryFindHitNext(hit.id);
115
+ }
116
+ return {
117
+ results,
118
+ total: results.length,
119
+ tokensEstimated: results.length * 50,
120
+ };
121
+ }
122
+ // ============================================================================
123
+ // Layer 2: Timeline
124
+ // ============================================================================
125
+ /**
126
+ * Determine the entry type from its ID prefix.
127
+ *
128
+ * Conventions:
129
+ * - D... -> decision (D001, D-xxx)
130
+ * - P... -> pattern (P001, P-xxx)
131
+ * - L... -> learning (L001, L-xxx)
132
+ * - O... or CM-... -> observation (O-xxx, CM-xxx)
133
+ */
134
+ function parseIdPrefix(id) {
135
+ if (id.startsWith('D-') || /^D\d/.test(id))
136
+ return 'decision';
137
+ if (id.startsWith('P-') || /^P\d/.test(id))
138
+ return 'pattern';
139
+ if (id.startsWith('L-') || /^L\d/.test(id))
140
+ return 'learning';
141
+ if (id.startsWith('O-') || id.startsWith('O') || id.startsWith('CM-'))
142
+ return 'observation';
143
+ return null;
144
+ }
145
+ /**
146
+ * Get chronological context around an anchor entry.
147
+ * Fetches the anchor's full data, then queries all 4 BRAIN tables
148
+ * via UNION ALL to find chronological neighbors.
149
+ *
150
+ * @param projectRoot - Project root directory
151
+ * @param params - Timeline parameters with anchor ID and depth
152
+ * @returns Anchor entry data with surrounding chronological entries
153
+ */
154
+ export async function timelineBrain(projectRoot, params) {
155
+ const { anchor: anchorId, depthBefore = 3, depthAfter = 3 } = params;
156
+ // Ensure DB is initialized
157
+ const { getBrainDb, getBrainNativeDb } = await import('../store/brain-sqlite.js');
158
+ await getBrainDb(projectRoot);
159
+ const nativeDb = getBrainNativeDb();
160
+ if (!nativeDb) {
161
+ return { anchor: null, before: [], after: [] };
162
+ }
163
+ // Determine anchor type and fetch it via accessor
164
+ const anchorType = parseIdPrefix(anchorId);
165
+ if (!anchorType) {
166
+ return { anchor: null, before: [], after: [] };
167
+ }
168
+ const accessor = await getBrainAccessor(projectRoot);
169
+ let anchorData = null;
170
+ let anchorDate = null;
171
+ switch (anchorType) {
172
+ case 'decision': {
173
+ const row = await accessor.getDecision(anchorId);
174
+ if (row) {
175
+ anchorData = row;
176
+ anchorDate = row.createdAt;
177
+ }
178
+ break;
179
+ }
180
+ case 'pattern': {
181
+ const row = await accessor.getPattern(anchorId);
182
+ if (row) {
183
+ anchorData = row;
184
+ anchorDate = row.extractedAt;
185
+ }
186
+ break;
187
+ }
188
+ case 'learning': {
189
+ const row = await accessor.getLearning(anchorId);
190
+ if (row) {
191
+ anchorData = row;
192
+ anchorDate = row.createdAt;
193
+ }
194
+ break;
195
+ }
196
+ case 'observation': {
197
+ const row = await accessor.getObservation(anchorId);
198
+ if (row) {
199
+ anchorData = row;
200
+ anchorDate = row.createdAt;
201
+ }
202
+ break;
203
+ }
204
+ }
205
+ if (!anchorData || !anchorDate) {
206
+ return { anchor: null, before: [], after: [] };
207
+ }
208
+ // UNION ALL across all 4 tables to get chronological neighbors.
209
+ // Excludes the anchor itself.
210
+ const beforeRows = typedAll(nativeDb.prepare(`
211
+ SELECT id, 'decision' AS type, created_at AS date FROM brain_decisions WHERE created_at < ? AND id != ?
212
+ UNION ALL
213
+ SELECT id, 'pattern' AS type, extracted_at AS date FROM brain_patterns WHERE extracted_at < ? AND id != ?
214
+ UNION ALL
215
+ SELECT id, 'learning' AS type, created_at AS date FROM brain_learnings WHERE created_at < ? AND id != ?
216
+ UNION ALL
217
+ SELECT id, 'observation' AS type, created_at AS date FROM brain_observations WHERE created_at < ? AND id != ?
218
+ ORDER BY date DESC
219
+ LIMIT ?
220
+ `), anchorDate, anchorId, anchorDate, anchorId, anchorDate, anchorId, anchorDate, anchorId, depthBefore);
221
+ const afterRows = typedAll(nativeDb.prepare(`
222
+ SELECT id, 'decision' AS type, created_at AS date FROM brain_decisions WHERE created_at > ? AND id != ?
223
+ UNION ALL
224
+ SELECT id, 'pattern' AS type, extracted_at AS date FROM brain_patterns WHERE extracted_at > ? AND id != ?
225
+ UNION ALL
226
+ SELECT id, 'learning' AS type, created_at AS date FROM brain_learnings WHERE created_at > ? AND id != ?
227
+ UNION ALL
228
+ SELECT id, 'observation' AS type, created_at AS date FROM brain_observations WHERE created_at > ? AND id != ?
229
+ ORDER BY date ASC
230
+ LIMIT ?
231
+ `), anchorDate, anchorId, anchorDate, anchorId, anchorDate, anchorId, anchorDate, anchorId, depthAfter);
232
+ return {
233
+ anchor: { id: anchorId, type: anchorType, data: anchorData },
234
+ before: beforeRows.map((r) => ({ id: r.id, type: r.type, date: r.date })),
235
+ after: afterRows.map((r) => ({ id: r.id, type: r.type, date: r.date })),
236
+ };
237
+ }
238
+ // ============================================================================
239
+ // Layer 3: Batch Fetch
240
+ // ============================================================================
241
+ /**
242
+ * Batch-fetch full details by IDs.
243
+ * Groups IDs by prefix to query the correct tables via BrainDataAccessor.
244
+ *
245
+ * @param projectRoot - Project root directory
246
+ * @param params - Fetch parameters with IDs
247
+ * @returns Full entry data for each found ID, plus not-found list
248
+ */
249
+ export async function fetchBrainEntries(projectRoot, params) {
250
+ const { ids } = params;
251
+ if (!ids || ids.length === 0) {
252
+ return { results: [], notFound: [], tokensEstimated: 0 };
253
+ }
254
+ const accessor = await getBrainAccessor(projectRoot);
255
+ // Group IDs by type prefix
256
+ const decisionIds = [];
257
+ const patternIds = [];
258
+ const learningIds = [];
259
+ const observationIds = [];
260
+ const unknownIds = [];
261
+ for (const id of ids) {
262
+ const type = parseIdPrefix(id);
263
+ switch (type) {
264
+ case 'decision':
265
+ decisionIds.push(id);
266
+ break;
267
+ case 'pattern':
268
+ patternIds.push(id);
269
+ break;
270
+ case 'learning':
271
+ learningIds.push(id);
272
+ break;
273
+ case 'observation':
274
+ observationIds.push(id);
275
+ break;
276
+ default:
277
+ unknownIds.push(id);
278
+ }
279
+ }
280
+ const results = [];
281
+ const notFound = [...unknownIds];
282
+ // Fetch decisions
283
+ for (const id of decisionIds) {
284
+ const row = await accessor.getDecision(id);
285
+ if (row) {
286
+ results.push({ id, type: 'decision', data: row });
287
+ }
288
+ else {
289
+ notFound.push(id);
290
+ }
291
+ }
292
+ // Fetch patterns
293
+ for (const id of patternIds) {
294
+ const row = await accessor.getPattern(id);
295
+ if (row) {
296
+ results.push({ id, type: 'pattern', data: row });
297
+ }
298
+ else {
299
+ notFound.push(id);
300
+ }
301
+ }
302
+ // Fetch learnings
303
+ for (const id of learningIds) {
304
+ const row = await accessor.getLearning(id);
305
+ if (row) {
306
+ results.push({ id, type: 'learning', data: row });
307
+ }
308
+ else {
309
+ notFound.push(id);
310
+ }
311
+ }
312
+ // Fetch observations
313
+ for (const id of observationIds) {
314
+ const row = await accessor.getObservation(id);
315
+ if (row) {
316
+ results.push({ id, type: 'observation', data: row });
317
+ }
318
+ else {
319
+ notFound.push(id);
320
+ }
321
+ }
322
+ return {
323
+ results,
324
+ notFound,
325
+ tokensEstimated: results.length * 500,
326
+ };
327
+ }
328
+ // ============================================================================
329
+ // Observe (Unified Save)
330
+ // ============================================================================
331
+ /**
332
+ * Keyword patterns for auto-classifying observation type from text.
333
+ */
334
+ const TYPE_KEYWORDS = [
335
+ { keywords: ['bug', 'fix', 'error', 'crash'], type: 'bugfix' },
336
+ { keywords: ['refactor', 'rename', 'extract', 'move'], type: 'refactor' },
337
+ { keywords: ['add', 'create', 'implement', 'new'], type: 'feature' },
338
+ { keywords: ['decide', 'chose', 'pick', 'instead'], type: 'decision' },
339
+ { keywords: ['update', 'change', 'modify', 'upgrade'], type: 'change' },
340
+ ];
341
+ /**
342
+ * Auto-classify observation type from text using keyword matching.
343
+ */
344
+ function classifyObservationType(text) {
345
+ const lower = text.toLowerCase();
346
+ for (const { keywords, type } of TYPE_KEYWORDS) {
347
+ for (const keyword of keywords) {
348
+ if (lower.includes(keyword)) {
349
+ return type;
350
+ }
351
+ }
352
+ }
353
+ return 'discovery';
354
+ }
355
+ /** Monotonic counter to prevent ID collisions within the same millisecond. */
356
+ let observeSeq = 0;
357
+ /**
358
+ * Save an observation to the BRAIN observations table.
359
+ * Replaces the external claude-mem save_observation pattern.
360
+ *
361
+ * Auto-classifies type from text if not provided. Generates a
362
+ * unique ID with O- prefix + base36 timestamp.
363
+ *
364
+ * @param projectRoot - Project root directory
365
+ * @param params - Observation data
366
+ * @returns Created observation ID, type, and timestamp
367
+ */
368
+ export async function observeBrain(projectRoot, params) {
369
+ const { text, title: titleParam, type: typeParam, project, sourceSessionId, sourceType, agent, sourceConfidence: sourceConfidenceParam, } = params;
370
+ if (!text?.trim()) {
371
+ throw new Error('Observation text is required');
372
+ }
373
+ const type = typeParam ?? classifyObservationType(text);
374
+ const title = titleParam ?? text.slice(0, 120);
375
+ const now = new Date().toISOString().replace('T', ' ').slice(0, 19);
376
+ // T549 Wave 1-A: Tier routing for observations.
377
+ // Observations always start as short-term episodic entries.
378
+ // sourceConfidence routing (spec §4.1 Decision Tree):
379
+ // - sourceType 'manual' → 'owner' (owner-stated facts skip short-term in consolidator)
380
+ // - sourceType 'session-debrief' → 'task-outcome' (synthesized summaries)
381
+ // - otherwise → 'agent' (default for all hook/agent writes)
382
+ // verified is always false at write time — consolidator sets true via corroboration gate.
383
+ const resolvedSourceConfidence = sourceConfidenceParam ??
384
+ (sourceType === 'manual'
385
+ ? 'owner'
386
+ : sourceType === 'session-debrief'
387
+ ? 'task-outcome'
388
+ : 'agent');
389
+ const memoryTier = 'short';
390
+ const memoryType = 'episodic';
391
+ const verified = false;
392
+ // Content-hash dedup: SHA-256 prefix of title+text
393
+ const contentHash = createHash('sha256')
394
+ .update(title + text)
395
+ .digest('hex')
396
+ .slice(0, 16);
397
+ // Check for recent duplicate (same content within last 30 seconds)
398
+ const { getBrainNativeDb } = await import('../store/brain-sqlite.js');
399
+ const nativeDb = getBrainNativeDb();
400
+ if (nativeDb) {
401
+ const cutoff = new Date(Date.now() - 30000).toISOString().replace('T', ' ').slice(0, 19);
402
+ const existing = typedAll(nativeDb.prepare('SELECT id, type, created_at FROM brain_observations WHERE content_hash = ? AND created_at > ?'), contentHash, cutoff);
403
+ if (existing.length > 0) {
404
+ return {
405
+ id: existing[0].id,
406
+ type: existing[0].type,
407
+ createdAt: existing[0].created_at,
408
+ };
409
+ }
410
+ }
411
+ // Write-guard: validate cross-db session reference before inserting
412
+ let validSessionId = sourceSessionId ?? null;
413
+ if (validSessionId) {
414
+ try {
415
+ const tasksDb = await getDb(projectRoot);
416
+ if (!(await sessionExistsInTasksDb(validSessionId, tasksDb))) {
417
+ validSessionId = null;
418
+ }
419
+ }
420
+ catch {
421
+ // Best-effort: if tasks.db unavailable, null out the reference
422
+ validSessionId = null;
423
+ }
424
+ }
425
+ // Compute quality score from text richness, title length, and T549 source multiplier.
426
+ const qualityScore = computeObservationQuality({
427
+ text,
428
+ title,
429
+ sourceConfidence: resolvedSourceConfidence,
430
+ memoryTier,
431
+ });
432
+ const id = `O-${Date.now().toString(36)}-${(observeSeq++ % 1000).toString(36)}`;
433
+ const accessor = await getBrainAccessor(projectRoot);
434
+ const row = await accessor.addObservation({
435
+ id,
436
+ type,
437
+ title,
438
+ narrative: text,
439
+ contentHash,
440
+ project: project ?? null,
441
+ sourceSessionId: validSessionId,
442
+ sourceType: sourceType ?? 'agent',
443
+ agent: agent ?? null,
444
+ qualityScore,
445
+ createdAt: now,
446
+ // T549 Wave 1-A: tier/type/confidence assigned at write time
447
+ memoryTier,
448
+ memoryType,
449
+ sourceConfidence: resolvedSourceConfidence,
450
+ verified,
451
+ });
452
+ // Populate embedding if provider is available (T5387).
453
+ // Fire-and-forget: embedding runs in the background so it never blocks the CLI.
454
+ // The observation is already saved above — if embedding fails, the observation
455
+ // still exists, just without vector similarity search capability. (T027)
456
+ if (isEmbeddingAvailable()) {
457
+ setImmediate(() => {
458
+ embedText(text)
459
+ .then((vector) => {
460
+ if (vector && nativeDb) {
461
+ nativeDb
462
+ .prepare('INSERT OR REPLACE INTO brain_embeddings (id, embedding) VALUES (?, ?)')
463
+ .run(id, Buffer.from(vector.buffer));
464
+ }
465
+ })
466
+ .catch(() => {
467
+ // Silently skip embedding failures — observation is already persisted
468
+ });
469
+ });
470
+ }
471
+ // Regenerate memory bridge for high-value observation types (T5240).
472
+ // Only learning and decision types trigger bridge refresh to avoid excessive writes.
473
+ if (type === 'decision') {
474
+ import('./memory-bridge.js')
475
+ .then(({ refreshMemoryBridge }) => refreshMemoryBridge(projectRoot))
476
+ .catch(() => {
477
+ /* Memory bridge refresh is best-effort */
478
+ });
479
+ }
480
+ // Auto-link observation to the currently focused task when a session is active. (T141)
481
+ // This is a fire-and-forget side effect — linking failure MUST NOT block the return.
482
+ if (validSessionId) {
483
+ autoLinkObservationToTask(projectRoot, row.id, accessor).catch(() => {
484
+ /* Auto-linking is best-effort */
485
+ });
486
+ }
487
+ // Auto-populate graph node + edges for this observation (best-effort, T537).
488
+ try {
489
+ await upsertGraphNode(projectRoot, `observation:${row.id}`, 'observation', row.title.substring(0, 200), row.qualityScore ?? 0.5, row.narrative ?? row.title, { sourceType: row.sourceType, agent: row.agent ?? undefined });
490
+ // Link observation → session when the observation has a session context.
491
+ if (validSessionId) {
492
+ await upsertGraphNode(projectRoot, `session:${validSessionId}`, 'session', validSessionId, 0.8, '');
493
+ await addGraphEdge(projectRoot, `observation:${row.id}`, `session:${validSessionId}`, 'produced_by', 1.0, 'auto:observe');
494
+ }
495
+ }
496
+ catch {
497
+ /* Graph population is best-effort — never block the primary return */
498
+ }
499
+ return {
500
+ id: row.id,
501
+ type: row.type,
502
+ createdAt: row.createdAt,
503
+ };
504
+ }
505
+ /**
506
+ * Auto-link a newly created observation to the currently focused task.
507
+ *
508
+ * Queries the active session via sessionStatus() and reads taskWork.taskId.
509
+ * If a task is focused, inserts a brain_memory_links row linking the
510
+ * observation to that task with linkType 'produced_by'.
511
+ *
512
+ * All failures are silently swallowed — this is a best-effort side effect.
513
+ *
514
+ * @param projectRoot - Project root directory
515
+ * @param observationId - ID of the newly created observation
516
+ * @param accessor - BrainDataAccessor to use for the link insert
517
+ */
518
+ async function autoLinkObservationToTask(projectRoot, observationId, accessor) {
519
+ const { sessionStatus } = await import('../sessions/index.js');
520
+ const session = await sessionStatus(projectRoot);
521
+ if (!session)
522
+ return;
523
+ const taskId = session.taskWork?.taskId;
524
+ if (!taskId)
525
+ return;
526
+ await accessor.addLink({
527
+ memoryType: 'observation',
528
+ memoryId: observationId,
529
+ taskId,
530
+ linkType: 'produced_by',
531
+ });
532
+ }
533
+ /**
534
+ * Backfill embeddings for existing observations that lack them.
535
+ *
536
+ * Iterates through observations not yet in brain_embeddings and
537
+ * generates vectors using the registered embedding provider.
538
+ * Processes in batches to avoid memory pressure.
539
+ *
540
+ * An optional {@link PopulateEmbeddingsOptions.onProgress} callback is called
541
+ * after each observation is attempted, enabling callers to report progress.
542
+ *
543
+ * @param projectRoot - Project root directory
544
+ * @param options - Optional batch size and progress callback
545
+ * @returns Count of processed, skipped, and errored observations
546
+ *
547
+ * @epic T134
548
+ * @task T142
549
+ */
550
+ export async function populateEmbeddings(projectRoot, options) {
551
+ if (!isEmbeddingAvailable()) {
552
+ return { processed: 0, skipped: 0, errors: 0 };
553
+ }
554
+ const { getBrainDb, getBrainNativeDb } = await import('../store/brain-sqlite.js');
555
+ await getBrainDb(projectRoot);
556
+ const nativeDb = getBrainNativeDb();
557
+ if (!nativeDb) {
558
+ return { processed: 0, skipped: 0, errors: 0 };
559
+ }
560
+ const batchSize = options?.batchSize ?? 50;
561
+ const { onProgress } = options ?? {};
562
+ let processed = 0;
563
+ let skipped = 0;
564
+ let errors = 0;
565
+ // Find observations without embeddings
566
+ const rows = typedAll(nativeDb.prepare(`
567
+ SELECT o.id, o.narrative, o.title
568
+ FROM brain_observations o
569
+ LEFT JOIN brain_embeddings e ON o.id = e.id
570
+ WHERE e.id IS NULL AND o.narrative IS NOT NULL
571
+ ORDER BY o.created_at DESC
572
+ `));
573
+ const total = rows.length;
574
+ let attempted = 0;
575
+ for (let i = 0; i < rows.length; i += batchSize) {
576
+ const batch = rows.slice(i, i + batchSize);
577
+ for (const row of batch) {
578
+ try {
579
+ const vector = await embedText(row.narrative || row.title);
580
+ if (vector) {
581
+ nativeDb
582
+ .prepare('INSERT OR REPLACE INTO brain_embeddings (id, embedding) VALUES (?, ?)')
583
+ .run(row.id, Buffer.from(vector.buffer));
584
+ processed++;
585
+ }
586
+ else {
587
+ skipped++;
588
+ }
589
+ }
590
+ catch {
591
+ errors++;
592
+ }
593
+ attempted++;
594
+ onProgress?.(attempted, total);
595
+ }
596
+ }
597
+ return { processed, skipped, errors };
598
+ }
599
+ /**
600
+ * Budget-aware hybrid retrieval combining FTS5, vector KNN, and graph neighbor scores.
601
+ *
602
+ * Strategy (parallel where possible):
603
+ * A. FTS5 BM25 search (always) — keyword precision (50% weight)
604
+ * B. Vector KNN search (optional) — semantic recall (40% weight, skipped if no embeddings)
605
+ * C. Graph neighbors (optional) — associative context (10% weight, skipped if graph empty)
606
+ *
607
+ * Score fusion: final = (fts*0.50 + vec*0.40 + graph*0.10) × qualityScore
608
+ * Recency boost: +0.05 for entries updated in last 7 days.
609
+ * Type priority: procedural entries get +0.10 (always-useful rules).
610
+ *
611
+ * Budget enforcement:
612
+ * - Rank top-50 candidates by fused score.
613
+ * - Walk list, accumulate token cost (≈ textLen/4), stop at budget.
614
+ * - Episodic entries dropped first when budget is tight.
615
+ *
616
+ * Citation tracking: increments citationCount for returned entries in background (setImmediate).
617
+ *
618
+ * @param projectRoot - Project root directory
619
+ * @param query - Text to search for
620
+ * @param tokenBudget - Maximum tokens to spend on results (default 500)
621
+ * @param options - Optional filters (types, tiers, verified)
622
+ * @returns Retrieved entries within budget with token accounting
623
+ */
624
+ export async function retrieveWithBudget(projectRoot, query, tokenBudget = 500, options) {
625
+ if (!query?.trim()) {
626
+ return { entries: [], tokensUsed: 0, tokensRemaining: tokenBudget, excluded: 0 };
627
+ }
628
+ // -------------------------------------------------------------------------
629
+ // Run search strategies in parallel
630
+ // -------------------------------------------------------------------------
631
+ const [ftsResult, vecResults, graphNeighbors] = await Promise.all([
632
+ // A. FTS5
633
+ searchBrain(projectRoot, query, { limit: 30 }).catch(() => ({
634
+ decisions: [],
635
+ patterns: [],
636
+ learnings: [],
637
+ observations: [],
638
+ })),
639
+ // B. Vector KNN (degrades gracefully when unavailable)
640
+ searchSimilar(query, projectRoot, 20).catch(() => []),
641
+ // C. Graph neighbors from top FTS hit
642
+ Promise.resolve([]),
643
+ ]);
644
+ const candidateMap = new Map();
645
+ // FTS results (normalized score 0.5 starting point — BM25 doesn't give 0..1)
646
+ const FTS_BASE = 0.5;
647
+ for (const d of ftsResult.decisions) {
648
+ const raw = d;
649
+ const id = d.id;
650
+ const tier = (d.memoryTier ?? raw['memory_tier']) || undefined;
651
+ const mtype = (d.memoryType ?? raw['memory_type']) || undefined;
652
+ const updatedAt = (d.updatedAt ?? raw['updated_at']) || undefined;
653
+ candidateMap.set(id, {
654
+ id,
655
+ type: 'decision',
656
+ title: d.decision.slice(0, 120),
657
+ text: `${d.decision} — ${d.rationale}`,
658
+ ftsScore: FTS_BASE,
659
+ vecScore: 0,
660
+ graphScore: 0,
661
+ qualityScore: d.qualityScore ?? 0.5,
662
+ memoryTier: tier,
663
+ memoryType: mtype,
664
+ updatedAt,
665
+ });
666
+ }
667
+ for (const p of ftsResult.patterns) {
668
+ const raw = p;
669
+ const id = p.id;
670
+ const tier = (p.memoryTier ?? raw['memory_tier']) || undefined;
671
+ const mtype = (p.memoryType ?? raw['memory_type']) || undefined;
672
+ const updatedAt = (p.updatedAt ?? raw['updated_at']) || undefined;
673
+ candidateMap.set(id, {
674
+ id,
675
+ type: 'pattern',
676
+ title: p.pattern.slice(0, 120),
677
+ text: `${p.pattern} — ${p.context}`,
678
+ ftsScore: FTS_BASE,
679
+ vecScore: 0,
680
+ graphScore: 0,
681
+ qualityScore: p.qualityScore ?? 0.5,
682
+ memoryTier: tier,
683
+ memoryType: mtype,
684
+ updatedAt,
685
+ });
686
+ }
687
+ for (const l of ftsResult.learnings) {
688
+ const raw = l;
689
+ const id = l.id;
690
+ const tier = (l.memoryTier ?? raw['memory_tier']) || undefined;
691
+ const mtype = (l.memoryType ?? raw['memory_type']) || undefined;
692
+ const updatedAt = (l.updatedAt ?? raw['updated_at']) || undefined;
693
+ candidateMap.set(id, {
694
+ id,
695
+ type: 'learning',
696
+ title: l.insight.slice(0, 120),
697
+ text: `${l.insight} (source: ${l.source})`,
698
+ ftsScore: FTS_BASE,
699
+ vecScore: 0,
700
+ graphScore: 0,
701
+ qualityScore: l.qualityScore ?? 0.5,
702
+ memoryTier: tier,
703
+ memoryType: mtype,
704
+ updatedAt,
705
+ });
706
+ }
707
+ for (const o of ftsResult.observations) {
708
+ const raw = o;
709
+ const id = o.id;
710
+ const tier = (o.memoryTier ?? raw['memory_tier']) || undefined;
711
+ const mtype = (o.memoryType ?? raw['memory_type']) || undefined;
712
+ const updatedAt = (o.updatedAt ?? raw['updated_at']) || undefined;
713
+ candidateMap.set(id, {
714
+ id,
715
+ type: 'observation',
716
+ title: o.title.slice(0, 120),
717
+ text: o.narrative ?? o.title,
718
+ ftsScore: FTS_BASE,
719
+ vecScore: 0,
720
+ graphScore: 0,
721
+ qualityScore: o.qualityScore ?? 0.5,
722
+ memoryTier: tier,
723
+ memoryType: mtype,
724
+ updatedAt,
725
+ });
726
+ }
727
+ // B. Merge vector scores (distance → similarity: similarity = 1 - distance)
728
+ for (const v of vecResults) {
729
+ const simScore = Math.max(0, 1 - v.distance);
730
+ const existing = candidateMap.get(v.id);
731
+ if (existing) {
732
+ existing.vecScore = simScore;
733
+ }
734
+ else {
735
+ candidateMap.set(v.id, {
736
+ id: v.id,
737
+ type: v.type,
738
+ title: v.title.slice(0, 120),
739
+ text: v.text,
740
+ ftsScore: 0,
741
+ vecScore: simScore,
742
+ graphScore: 0,
743
+ qualityScore: 0.5,
744
+ memoryTier: undefined,
745
+ memoryType: undefined,
746
+ });
747
+ }
748
+ }
749
+ // C. Merge graph scores
750
+ for (const g of graphNeighbors) {
751
+ const existing = candidateMap.get(g.id);
752
+ if (existing) {
753
+ existing.graphScore = g.graphScore;
754
+ }
755
+ }
756
+ // -------------------------------------------------------------------------
757
+ // Score fusion + ranking
758
+ // -------------------------------------------------------------------------
759
+ const sevenDaysAgo = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000)
760
+ .toISOString()
761
+ .replace('T', ' ')
762
+ .slice(0, 19);
763
+ const candidates = Array.from(candidateMap.values()).map((c) => {
764
+ // Fused score
765
+ let score = c.ftsScore * 0.5 + c.vecScore * 0.4 + c.graphScore * 0.1;
766
+ // Quality multiplier
767
+ score *= c.qualityScore;
768
+ // Recency boost for recently-updated entries
769
+ if (c.updatedAt && c.updatedAt >= sevenDaysAgo) {
770
+ score += 0.05;
771
+ }
772
+ // Type priority boost for procedural entries (always-useful rules)
773
+ if (c.memoryType === 'procedural' || c.type === 'pattern') {
774
+ score += 0.1;
775
+ }
776
+ return { ...c, score };
777
+ });
778
+ // -------------------------------------------------------------------------
779
+ // Apply option filters (types, tiers, verified)
780
+ // -------------------------------------------------------------------------
781
+ // We'll apply verified filter by checking the DB if requested
782
+ let filtered = candidates;
783
+ if (options?.types && options.types.length > 0) {
784
+ const allowedTypes = new Set(options.types);
785
+ filtered = filtered.filter((c) => {
786
+ if (!c.memoryType)
787
+ return true; // unknown type — include
788
+ return allowedTypes.has(c.memoryType);
789
+ });
790
+ }
791
+ if (options?.tiers && options.tiers.length > 0) {
792
+ const allowedTiers = new Set(options.tiers);
793
+ filtered = filtered.filter((c) => {
794
+ if (!c.memoryTier)
795
+ return true; // unknown tier — include
796
+ return allowedTiers.has(c.memoryTier);
797
+ });
798
+ }
799
+ // -------------------------------------------------------------------------
800
+ // Sort: procedural first, then by score descending
801
+ // -------------------------------------------------------------------------
802
+ filtered.sort((a, b) => {
803
+ const aProcedural = a.memoryType === 'procedural' || a.type === 'pattern' ? 1 : 0;
804
+ const bProcedural = b.memoryType === 'procedural' || b.type === 'pattern' ? 1 : 0;
805
+ if (aProcedural !== bProcedural)
806
+ return bProcedural - aProcedural;
807
+ return b.score - a.score;
808
+ });
809
+ // Cap candidate list at top 50
810
+ const topCandidates = filtered.slice(0, 50);
811
+ // -------------------------------------------------------------------------
812
+ // Budget enforcement — episodic entries are dropped first when budget tight
813
+ // -------------------------------------------------------------------------
814
+ // Sort for budget walk: procedural first, semantic second, episodic last
815
+ const typeOrder = (c) => {
816
+ if (c.memoryType === 'procedural' || c.type === 'pattern')
817
+ return 0;
818
+ if (c.memoryType === 'semantic' || c.type === 'decision' || c.type === 'learning')
819
+ return 1;
820
+ return 2; // episodic
821
+ };
822
+ const budgetOrdered = [...topCandidates].sort((a, b) => {
823
+ const orderDiff = typeOrder(a) - typeOrder(b);
824
+ if (orderDiff !== 0)
825
+ return orderDiff;
826
+ return b.score - a.score;
827
+ });
828
+ const result = [];
829
+ let tokensUsed = 0;
830
+ let excluded = 0;
831
+ for (const candidate of budgetOrdered) {
832
+ const entryTokens = Math.ceil(candidate.text.length / 4);
833
+ if (tokensUsed + entryTokens > tokenBudget) {
834
+ excluded++;
835
+ continue;
836
+ }
837
+ result.push({
838
+ id: candidate.id,
839
+ type: candidate.type,
840
+ title: candidate.title,
841
+ text: candidate.text,
842
+ score: candidate.score,
843
+ tokensEstimated: entryTokens,
844
+ memoryTier: candidate.memoryTier,
845
+ memoryType: candidate.memoryType,
846
+ });
847
+ tokensUsed += entryTokens;
848
+ }
849
+ // -------------------------------------------------------------------------
850
+ // Citation tracking — non-blocking background increment
851
+ // -------------------------------------------------------------------------
852
+ if (result.length > 0) {
853
+ const returnedIds = result.map((e) => e.id);
854
+ setImmediate(() => {
855
+ incrementCitationCounts(projectRoot, returnedIds).catch(() => {
856
+ /* best-effort */
857
+ });
858
+ });
859
+ }
860
+ return {
861
+ entries: result,
862
+ tokensUsed,
863
+ tokensRemaining: tokenBudget - tokensUsed,
864
+ excluded,
865
+ };
866
+ }
867
+ // ============================================================================
868
+ // Citation Count Increment (non-blocking helper)
869
+ // ============================================================================
870
+ /**
871
+ * Increment citationCount for a list of entry IDs.
872
+ *
873
+ * Routes each ID to the correct table based on its ID prefix. All updates
874
+ * are best-effort — errors are silently swallowed.
875
+ *
876
+ * @param projectRoot - Project root for brain.db resolution
877
+ * @param ids - Entry IDs whose citation counts should be incremented
878
+ */
879
+ async function incrementCitationCounts(projectRoot, ids) {
880
+ if (ids.length === 0)
881
+ return;
882
+ const { getBrainDb, getBrainNativeDb } = await import('../store/brain-sqlite.js');
883
+ await getBrainDb(projectRoot);
884
+ const nativeDb = getBrainNativeDb();
885
+ if (!nativeDb)
886
+ return;
887
+ const now = new Date().toISOString().replace('T', ' ').slice(0, 19);
888
+ for (const id of ids) {
889
+ let table;
890
+ if (id.startsWith('D-') || /^D\d/.test(id)) {
891
+ table = 'brain_decisions';
892
+ }
893
+ else if (id.startsWith('P-') || /^P\d/.test(id)) {
894
+ table = 'brain_patterns';
895
+ }
896
+ else if (id.startsWith('L-') || /^L\d/.test(id)) {
897
+ table = 'brain_learnings';
898
+ }
899
+ else {
900
+ table = 'brain_observations';
901
+ }
902
+ try {
903
+ nativeDb
904
+ .prepare(`UPDATE ${table} SET citation_count = citation_count + 1, updated_at = ? WHERE id = ?`)
905
+ .run(now, id);
906
+ }
907
+ catch {
908
+ /* best-effort — column may not exist in older schemas */
909
+ }
910
+ }
911
+ }
912
+ //# sourceMappingURL=brain-retrieval.js.map