monomind 1.10.0 → 1.10.1

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 (912) hide show
  1. package/bin/monomind.js +50 -0
  2. package/package.json +11 -71
  3. package/.claude/agents/academic/academic-anthropologist.md +0 -126
  4. package/.claude/agents/academic/academic-geographer.md +0 -128
  5. package/.claude/agents/academic/academic-historian.md +0 -124
  6. package/.claude/agents/academic/academic-narratologist.md +0 -119
  7. package/.claude/agents/academic/academic-psychologist.md +0 -119
  8. package/.claude/agents/analysis/analyze-code-quality.md +0 -58
  9. package/.claude/agents/analysis/code-analyzer.md +0 -189
  10. package/.claude/agents/analysis/code-review/analyze-code-quality.md +0 -58
  11. package/.claude/agents/architecture/system-design/arch-system-design.md +0 -54
  12. package/.claude/agents/consensus/crdt-synchronizer.md +0 -977
  13. package/.claude/agents/consensus/performance-benchmarker.md +0 -831
  14. package/.claude/agents/consensus/quorum-manager.md +0 -803
  15. package/.claude/agents/consensus/security-manager.md +0 -602
  16. package/.claude/agents/core/coder.md +0 -262
  17. package/.claude/agents/core/planner.md +0 -170
  18. package/.claude/agents/core/researcher.md +0 -192
  19. package/.claude/agents/core/reviewer.md +0 -327
  20. package/.claude/agents/core/tester.md +0 -318
  21. package/.claude/agents/data/ml/data-ml-model.md +0 -76
  22. package/.claude/agents/design/design-monodesign.md +0 -121
  23. package/.claude/agents/development/dev-backend-api.md +0 -178
  24. package/.claude/agents/devops/ci-cd/ops-cicd-github.md +0 -52
  25. package/.claude/agents/documentation/api-docs/docs-api-openapi.md +0 -63
  26. package/.claude/agents/engineering/engineering-ai-data-remediation-engineer.md +0 -212
  27. package/.claude/agents/engineering/engineering-ai-engineer.md +0 -165
  28. package/.claude/agents/engineering/engineering-autonomous-optimization-architect.md +0 -108
  29. package/.claude/agents/engineering/engineering-backend-architect.md +0 -254
  30. package/.claude/agents/engineering/engineering-code-reviewer.md +0 -95
  31. package/.claude/agents/engineering/engineering-data-engineer.md +0 -307
  32. package/.claude/agents/engineering/engineering-database-optimizer.md +0 -200
  33. package/.claude/agents/engineering/engineering-devops-automator.md +0 -430
  34. package/.claude/agents/engineering/engineering-embedded-firmware-engineer.md +0 -174
  35. package/.claude/agents/engineering/engineering-feishu-integration-developer.md +0 -607
  36. package/.claude/agents/engineering/engineering-frontend-developer.md +0 -249
  37. package/.claude/agents/engineering/engineering-git-workflow-master.md +0 -108
  38. package/.claude/agents/engineering/engineering-incident-response-commander.md +0 -482
  39. package/.claude/agents/engineering/engineering-mobile-app-builder.md +0 -499
  40. package/.claude/agents/engineering/engineering-rapid-prototyper.md +0 -463
  41. package/.claude/agents/engineering/engineering-security-engineer.md +0 -303
  42. package/.claude/agents/engineering/engineering-senior-developer.md +0 -195
  43. package/.claude/agents/engineering/engineering-software-architect.md +0 -100
  44. package/.claude/agents/engineering/engineering-solidity-smart-contract-engineer.md +0 -528
  45. package/.claude/agents/engineering/engineering-sre.md +0 -114
  46. package/.claude/agents/engineering/engineering-technical-writer.md +0 -412
  47. package/.claude/agents/engineering/engineering-threat-detection-engineer.md +0 -540
  48. package/.claude/agents/engineering/engineering-wechat-mini-program-developer.md +0 -351
  49. package/.claude/agents/game-development/blender/blender-addon-engineer.md +0 -235
  50. package/.claude/agents/game-development/game-audio-engineer.md +0 -265
  51. package/.claude/agents/game-development/game-designer.md +0 -168
  52. package/.claude/agents/game-development/godot/godot-gameplay-scripter.md +0 -335
  53. package/.claude/agents/game-development/godot/godot-multiplayer-engineer.md +0 -298
  54. package/.claude/agents/game-development/godot/godot-shader-developer.md +0 -267
  55. package/.claude/agents/game-development/level-designer.md +0 -209
  56. package/.claude/agents/game-development/narrative-designer.md +0 -244
  57. package/.claude/agents/game-development/roblox-studio/roblox-avatar-creator.md +0 -298
  58. package/.claude/agents/game-development/roblox-studio/roblox-experience-designer.md +0 -306
  59. package/.claude/agents/game-development/roblox-studio/roblox-systems-scripter.md +0 -326
  60. package/.claude/agents/game-development/technical-artist.md +0 -230
  61. package/.claude/agents/game-development/unity/unity-architect.md +0 -272
  62. package/.claude/agents/game-development/unity/unity-editor-tool-developer.md +0 -311
  63. package/.claude/agents/game-development/unity/unity-multiplayer-engineer.md +0 -322
  64. package/.claude/agents/game-development/unity/unity-shader-graph-artist.md +0 -270
  65. package/.claude/agents/game-development/unreal-engine/unreal-multiplayer-architect.md +0 -314
  66. package/.claude/agents/game-development/unreal-engine/unreal-systems-engineer.md +0 -311
  67. package/.claude/agents/game-development/unreal-engine/unreal-technical-artist.md +0 -257
  68. package/.claude/agents/game-development/unreal-engine/unreal-world-builder.md +0 -274
  69. package/.claude/agents/github/code-review-swarm.md +0 -557
  70. package/.claude/agents/github/github-modes.md +0 -154
  71. package/.claude/agents/github/issue-tracker.md +0 -299
  72. package/.claude/agents/github/multi-repo-swarm.md +0 -525
  73. package/.claude/agents/github/pr-manager.md +0 -163
  74. package/.claude/agents/github/project-board-sync.md +0 -478
  75. package/.claude/agents/github/release-manager.md +0 -296
  76. package/.claude/agents/github/release-swarm.md +0 -597
  77. package/.claude/agents/github/repo-architect.md +0 -359
  78. package/.claude/agents/github/swarm-issue.md +0 -548
  79. package/.claude/agents/github/swarm-pr.md +0 -427
  80. package/.claude/agents/github/sync-coordinator.md +0 -355
  81. package/.claude/agents/github/workflow-automation.md +0 -640
  82. package/.claude/agents/goal/agent.md +0 -804
  83. package/.claude/agents/goal/code-goal-planner.md +0 -445
  84. package/.claude/agents/goal/goal-planner.md +0 -168
  85. package/.claude/agents/hive-mind/collective-intelligence-coordinator.md +0 -129
  86. package/.claude/agents/hive-mind/queen-coordinator.md +0 -202
  87. package/.claude/agents/hive-mind/scout-explorer.md +0 -241
  88. package/.claude/agents/hive-mind/swarm-memory-manager.md +0 -192
  89. package/.claude/agents/hive-mind/worker-specialist.md +0 -216
  90. package/.claude/agents/marketing/marketing-ai-citation-strategist.md +0 -171
  91. package/.claude/agents/marketing/marketing-app-store-optimizer.md +0 -322
  92. package/.claude/agents/marketing/marketing-baidu-seo-specialist.md +0 -227
  93. package/.claude/agents/marketing/marketing-bilibili-content-strategist.md +0 -200
  94. package/.claude/agents/marketing/marketing-book-co-author.md +0 -111
  95. package/.claude/agents/marketing/marketing-carousel-growth-engine.md +0 -200
  96. package/.claude/agents/marketing/marketing-china-ecommerce-operator.md +0 -284
  97. package/.claude/agents/marketing/marketing-competitive-content.md +0 -155
  98. package/.claude/agents/marketing/marketing-content-creator.md +0 -67
  99. package/.claude/agents/marketing/marketing-cro-specialist.md +0 -147
  100. package/.claude/agents/marketing/marketing-cross-border-ecommerce.md +0 -260
  101. package/.claude/agents/marketing/marketing-douyin-strategist.md +0 -150
  102. package/.claude/agents/marketing/marketing-email-specialist.md +0 -90
  103. package/.claude/agents/marketing/marketing-growth-hacker.md +0 -54
  104. package/.claude/agents/marketing/marketing-instagram-curator.md +0 -114
  105. package/.claude/agents/marketing/marketing-kuaishou-strategist.md +0 -224
  106. package/.claude/agents/marketing/marketing-launch-strategist.md +0 -129
  107. package/.claude/agents/marketing/marketing-linkedin-content-creator.md +0 -215
  108. package/.claude/agents/marketing/marketing-livestream-commerce-coach.md +0 -306
  109. package/.claude/agents/marketing/marketing-podcast-strategist.md +0 -278
  110. package/.claude/agents/marketing/marketing-pricing-strategist.md +0 -127
  111. package/.claude/agents/marketing/marketing-private-domain-operator.md +0 -309
  112. package/.claude/agents/marketing/marketing-reddit-community-builder.md +0 -124
  113. package/.claude/agents/marketing/marketing-seo-specialist.md +0 -279
  114. package/.claude/agents/marketing/marketing-short-video-editing-coach.md +0 -413
  115. package/.claude/agents/marketing/marketing-social-media-strategist.md +0 -125
  116. package/.claude/agents/marketing/marketing-tiktok-strategist.md +0 -126
  117. package/.claude/agents/marketing/marketing-twitter-engager.md +0 -127
  118. package/.claude/agents/marketing/marketing-wechat-official-account.md +0 -146
  119. package/.claude/agents/marketing/marketing-weibo-strategist.md +0 -241
  120. package/.claude/agents/marketing/marketing-xiaohongshu-specialist.md +0 -139
  121. package/.claude/agents/marketing/marketing-zhihu-strategist.md +0 -163
  122. package/.claude/agents/neural/safla-neural.md +0 -74
  123. package/.claude/agents/optimization/benchmark-suite.md +0 -663
  124. package/.claude/agents/optimization/load-balancer.md +0 -429
  125. package/.claude/agents/optimization/performance-monitor.md +0 -670
  126. package/.claude/agents/optimization/resource-allocator.md +0 -672
  127. package/.claude/agents/optimization/topology-optimizer.md +0 -806
  128. package/.claude/agents/paid-media/paid-media-auditor.md +0 -71
  129. package/.claude/agents/paid-media/paid-media-creative-strategist.md +0 -71
  130. package/.claude/agents/paid-media/paid-media-paid-social-strategist.md +0 -71
  131. package/.claude/agents/paid-media/paid-media-ppc-strategist.md +0 -71
  132. package/.claude/agents/paid-media/paid-media-programmatic-buyer.md +0 -71
  133. package/.claude/agents/paid-media/paid-media-search-query-analyst.md +0 -71
  134. package/.claude/agents/paid-media/paid-media-tracking-specialist.md +0 -71
  135. package/.claude/agents/payments/agentic-payments.md +0 -126
  136. package/.claude/agents/product/product-behavioral-nudge-engine.md +0 -81
  137. package/.claude/agents/product/product-feedback-synthesizer.md +0 -119
  138. package/.claude/agents/product/product-manager.md +0 -469
  139. package/.claude/agents/product/product-sprint-prioritizer.md +0 -154
  140. package/.claude/agents/product/product-trend-researcher.md +0 -159
  141. package/.claude/agents/project-management/project-management-experiment-tracker.md +0 -199
  142. package/.claude/agents/project-management/project-management-jira-workflow-steward.md +0 -231
  143. package/.claude/agents/project-management/project-management-project-shepherd.md +0 -195
  144. package/.claude/agents/project-management/project-management-studio-operations.md +0 -201
  145. package/.claude/agents/project-management/project-management-studio-producer.md +0 -204
  146. package/.claude/agents/project-management/project-manager-senior.md +0 -136
  147. package/.claude/agents/reasoning/agent.md +0 -804
  148. package/.claude/agents/reasoning/goal-planner.md +0 -73
  149. package/.claude/agents/sales/sales-account-strategist.md +0 -228
  150. package/.claude/agents/sales/sales-coach.md +0 -272
  151. package/.claude/agents/sales/sales-deal-strategist.md +0 -181
  152. package/.claude/agents/sales/sales-discovery-coach.md +0 -226
  153. package/.claude/agents/sales/sales-engineer.md +0 -183
  154. package/.claude/agents/sales/sales-outbound-strategist.md +0 -202
  155. package/.claude/agents/sales/sales-pipeline-analyst.md +0 -268
  156. package/.claude/agents/sales/sales-proposal-strategist.md +0 -218
  157. package/.claude/agents/schemas/architecture-output.json +0 -43
  158. package/.claude/agents/schemas/code-review-output.json +0 -28
  159. package/.claude/agents/schemas/generic-task-input.json +0 -12
  160. package/.claude/agents/schemas/implementation-output.json +0 -18
  161. package/.claude/agents/schemas/research-output.json +0 -31
  162. package/.claude/agents/schemas/security-audit-output.json +0 -29
  163. package/.claude/agents/schemas/test-report-output.json +0 -29
  164. package/.claude/agents/sona/sona-learning-optimizer.md +0 -65
  165. package/.claude/agents/sparc/architecture.md +0 -453
  166. package/.claude/agents/sparc/pseudocode.md +0 -299
  167. package/.claude/agents/sparc/refinement.md +0 -504
  168. package/.claude/agents/sparc/specification.md +0 -258
  169. package/.claude/agents/spatial-computing/macos-spatial-metal-engineer.md +0 -338
  170. package/.claude/agents/spatial-computing/terminal-integration-specialist.md +0 -71
  171. package/.claude/agents/spatial-computing/visionos-spatial-engineer.md +0 -55
  172. package/.claude/agents/specialists/integration-architect.md +0 -94
  173. package/.claude/agents/specialists/memory-specialist.md +0 -298
  174. package/.claude/agents/specialists/performance-engineer.md +0 -387
  175. package/.claude/agents/specialists/queen-coordinator.md +0 -67
  176. package/.claude/agents/specialists/security-architect.md +0 -154
  177. package/.claude/agents/specialized/accounts-payable-agent.md +0 -186
  178. package/.claude/agents/specialized/agentic-identity-trust.md +0 -388
  179. package/.claude/agents/specialized/agents-orchestrator.md +0 -368
  180. package/.claude/agents/specialized/automation-governance-architect.md +0 -217
  181. package/.claude/agents/specialized/blockchain-security-auditor.md +0 -497
  182. package/.claude/agents/specialized/compliance-auditor.md +0 -159
  183. package/.claude/agents/specialized/corporate-training-designer.md +0 -193
  184. package/.claude/agents/specialized/data-consolidation-agent.md +0 -61
  185. package/.claude/agents/specialized/government-digital-presales-consultant.md +0 -364
  186. package/.claude/agents/specialized/healthcare-marketing-compliance.md +0 -396
  187. package/.claude/agents/specialized/identity-graph-operator.md +0 -261
  188. package/.claude/agents/specialized/lsp-index-engineer.md +0 -315
  189. package/.claude/agents/specialized/mobile/spec-mobile-react-native.md +0 -89
  190. package/.claude/agents/specialized/recruitment-specialist.md +0 -510
  191. package/.claude/agents/specialized/report-distribution-agent.md +0 -66
  192. package/.claude/agents/specialized/sales-data-extraction-agent.md +0 -68
  193. package/.claude/agents/specialized/specialized-cultural-intelligence-strategist.md +0 -89
  194. package/.claude/agents/specialized/specialized-developer-advocate.md +0 -318
  195. package/.claude/agents/specialized/specialized-document-generator.md +0 -56
  196. package/.claude/agents/specialized/specialized-french-consulting-market.md +0 -193
  197. package/.claude/agents/specialized/specialized-korean-business-navigator.md +0 -217
  198. package/.claude/agents/specialized/specialized-mcp-builder.md +0 -64
  199. package/.claude/agents/specialized/specialized-model-qa.md +0 -489
  200. package/.claude/agents/specialized/specialized-salesforce-architect.md +0 -181
  201. package/.claude/agents/specialized/specialized-workflow-architect.md +0 -598
  202. package/.claude/agents/specialized/study-abroad-advisor.md +0 -283
  203. package/.claude/agents/specialized/supply-chain-strategist.md +0 -583
  204. package/.claude/agents/specialized/zk-steward.md +0 -212
  205. package/.claude/agents/sublinear/consensus-coordinator.md +0 -333
  206. package/.claude/agents/sublinear/matrix-optimizer.md +0 -180
  207. package/.claude/agents/sublinear/pagerank-analyzer.md +0 -295
  208. package/.claude/agents/sublinear/performance-optimizer.md +0 -363
  209. package/.claude/agents/sublinear/trading-predictor.md +0 -242
  210. package/.claude/agents/support/support-analytics-reporter.md +0 -366
  211. package/.claude/agents/support/support-executive-summary-generator.md +0 -213
  212. package/.claude/agents/support/support-finance-tracker.md +0 -443
  213. package/.claude/agents/support/support-infrastructure-maintainer.md +0 -619
  214. package/.claude/agents/support/support-legal-compliance-checker.md +0 -589
  215. package/.claude/agents/support/support-support-responder.md +0 -586
  216. package/.claude/agents/swarm/adaptive-coordinator.md +0 -364
  217. package/.claude/agents/swarm/hierarchical-coordinator.md +0 -318
  218. package/.claude/agents/swarm/mesh-coordinator.md +0 -363
  219. package/.claude/agents/templates/automation-smart-agent.md +0 -185
  220. package/.claude/agents/templates/coordinator-swarm-init.md +0 -83
  221. package/.claude/agents/templates/github-pr-manager.md +0 -155
  222. package/.claude/agents/templates/implementer-sparc-coder.md +0 -231
  223. package/.claude/agents/templates/memory-coordinator.md +0 -163
  224. package/.claude/agents/templates/migration-plan.md +0 -724
  225. package/.claude/agents/templates/orchestrator-task.md +0 -120
  226. package/.claude/agents/templates/performance-analyzer.md +0 -179
  227. package/.claude/agents/templates/sparc-coordinator.md +0 -163
  228. package/.claude/agents/testing/production-validator.md +0 -374
  229. package/.claude/agents/testing/tdd-london-swarm.md +0 -241
  230. package/.claude/agents/testing/testing-accessibility-auditor.md +0 -322
  231. package/.claude/agents/testing/testing-api-tester.md +0 -307
  232. package/.claude/agents/testing/testing-evidence-collector.md +0 -211
  233. package/.claude/agents/testing/testing-performance-benchmarker.md +0 -269
  234. package/.claude/agents/testing/testing-reality-checker.md +0 -237
  235. package/.claude/agents/testing/testing-test-results-analyzer.md +0 -306
  236. package/.claude/agents/testing/testing-tool-evaluator.md +0 -395
  237. package/.claude/agents/testing/testing-workflow-optimizer.md +0 -451
  238. package/.claude/checkpoints/1767754460.json +0 -8
  239. package/.claude/commands/agents/README.md +0 -14
  240. package/.claude/commands/agents/agent-capabilities.md +0 -25
  241. package/.claude/commands/agents/agent-coordination.md +0 -32
  242. package/.claude/commands/agents/agent-spawning.md +0 -32
  243. package/.claude/commands/agents/agent-types.md +0 -30
  244. package/.claude/commands/analysis/README.md +0 -18
  245. package/.claude/commands/analysis/bottleneck-detect.md +0 -69
  246. package/.claude/commands/analysis/performance-bottlenecks.md +0 -59
  247. package/.claude/commands/analysis/performance-report.md +0 -52
  248. package/.claude/commands/analysis/token-efficiency.md +0 -42
  249. package/.claude/commands/analysis/token-usage.md +0 -47
  250. package/.claude/commands/automation/README.md +0 -19
  251. package/.claude/commands/automation/auto-agent.md +0 -86
  252. package/.claude/commands/automation/self-healing.md +0 -108
  253. package/.claude/commands/automation/session-memory.md +0 -89
  254. package/.claude/commands/automation/smart-agents.md +0 -81
  255. package/.claude/commands/automation/smart-spawn.md +0 -66
  256. package/.claude/commands/automation/workflow-select.md +0 -60
  257. package/.claude/commands/browse.md +0 -32
  258. package/.claude/commands/coordination/README.md +0 -13
  259. package/.claude/commands/coordination/agent-spawn.md +0 -69
  260. package/.claude/commands/coordination/swarm-init.md +0 -82
  261. package/.claude/commands/coordination/task-orchestrate.md +0 -79
  262. package/.claude/commands/github/README.md +0 -24
  263. package/.claude/commands/github/github-modes.md +0 -151
  264. package/.claude/commands/github/issue-tracker.md +0 -293
  265. package/.claude/commands/github/pr-manager.md +0 -173
  266. package/.claude/commands/github/release-manager.md +0 -343
  267. package/.claude/commands/github/repo-architect.md +0 -379
  268. package/.claude/commands/github/sync-coordinator.md +0 -297
  269. package/.claude/commands/hive-mind/README.md +0 -42
  270. package/.claude/commands/hive-mind/hive-mind-consensus.md +0 -72
  271. package/.claude/commands/hive-mind/hive-mind-init.md +0 -68
  272. package/.claude/commands/hive-mind/hive-mind-memory.md +0 -73
  273. package/.claude/commands/hive-mind/hive-mind-spawn.md +0 -82
  274. package/.claude/commands/hive-mind/hive-mind-status.md +0 -56
  275. package/.claude/commands/hive-mind/hive-mind-stop.md +0 -55
  276. package/.claude/commands/hive-mind/hive-mind.md +0 -87
  277. package/.claude/commands/hooks/README.md +0 -66
  278. package/.claude/commands/hooks/overview.md +0 -117
  279. package/.claude/commands/hooks/post-edit.md +0 -78
  280. package/.claude/commands/hooks/post-task.md +0 -62
  281. package/.claude/commands/hooks/pre-edit.md +0 -81
  282. package/.claude/commands/hooks/pre-task.md +0 -76
  283. package/.claude/commands/hooks/session-end.md +0 -82
  284. package/.claude/commands/hooks/setup.md +0 -132
  285. package/.claude/commands/mastermind/_repeat.md +0 -451
  286. package/.claude/commands/mastermind/architect.md +0 -55
  287. package/.claude/commands/mastermind/brain.md +0 -102
  288. package/.claude/commands/mastermind/build.md +0 -26
  289. package/.claude/commands/mastermind/content.md +0 -26
  290. package/.claude/commands/mastermind/createorg.md +0 -97
  291. package/.claude/commands/mastermind/finance.md +0 -26
  292. package/.claude/commands/mastermind/idea.md +0 -26
  293. package/.claude/commands/mastermind/marketing.md +0 -26
  294. package/.claude/commands/mastermind/master.md +0 -772
  295. package/.claude/commands/mastermind/ops.md +0 -26
  296. package/.claude/commands/mastermind/release.md +0 -26
  297. package/.claude/commands/mastermind/research.md +0 -26
  298. package/.claude/commands/mastermind/review.md +0 -26
  299. package/.claude/commands/mastermind/runorg.md +0 -109
  300. package/.claude/commands/mastermind/sales.md +0 -26
  301. package/.claude/commands/mastermind/techport.md +0 -26
  302. package/.claude/commands/mastermind.md +0 -121
  303. package/.claude/commands/memory/README.md +0 -79
  304. package/.claude/commands/memory/memory-search.md +0 -77
  305. package/.claude/commands/monitoring/README.md +0 -69
  306. package/.claude/commands/monitoring/agent-metrics.md +0 -65
  307. package/.claude/commands/monitoring/agents.md +0 -71
  308. package/.claude/commands/monitoring/status.md +0 -108
  309. package/.claude/commands/monograph/README.md +0 -102
  310. package/.claude/commands/monograph/monograph-build.md +0 -79
  311. package/.claude/commands/monograph/monograph-search.md +0 -96
  312. package/.claude/commands/monograph/monograph-stats.md +0 -53
  313. package/.claude/commands/monograph/monograph-watch.md +0 -63
  314. package/.claude/commands/monograph/monograph-wiki.md +0 -91
  315. package/.claude/commands/monomind/createtask.md +0 -277
  316. package/.claude/commands/monomind/do.md +0 -446
  317. package/.claude/commands/monomind/help.md +0 -118
  318. package/.claude/commands/monomind/idea.md +0 -273
  319. package/.claude/commands/monomind/improve.md +0 -350
  320. package/.claude/commands/monomind/memory.md +0 -230
  321. package/.claude/commands/monomind/repeat.md +0 -257
  322. package/.claude/commands/monomind/review.md +0 -317
  323. package/.claude/commands/monomind/specialagents.md +0 -125
  324. package/.claude/commands/monomind/swarm.md +0 -161
  325. package/.claude/commands/monomind/understand.md +0 -150
  326. package/.claude/commands/optimization/README.md +0 -73
  327. package/.claude/commands/optimization/auto-topology.md +0 -85
  328. package/.claude/commands/optimization/parallel-execution.md +0 -76
  329. package/.claude/commands/optimization/performance-optimize.md +0 -79
  330. package/.claude/commands/pair/README.md +0 -79
  331. package/.claude/commands/pair/examples.md +0 -156
  332. package/.claude/commands/pair/modes.md +0 -122
  333. package/.claude/commands/pair/session.md +0 -124
  334. package/.claude/commands/sparc/analyzer.md +0 -35
  335. package/.claude/commands/sparc/architect.md +0 -36
  336. package/.claude/commands/sparc/ask.md +0 -56
  337. package/.claude/commands/sparc/batch-executor.md +0 -37
  338. package/.claude/commands/sparc/code.md +0 -48
  339. package/.claude/commands/sparc/coder.md +0 -37
  340. package/.claude/commands/sparc/debug.md +0 -42
  341. package/.claude/commands/sparc/debugger.md +0 -37
  342. package/.claude/commands/sparc/designer.md +0 -36
  343. package/.claude/commands/sparc/devops.md +0 -68
  344. package/.claude/commands/sparc/docs-writer.md +0 -39
  345. package/.claude/commands/sparc/documenter.md +0 -37
  346. package/.claude/commands/sparc/innovator.md +0 -37
  347. package/.claude/commands/sparc/integration.md +0 -42
  348. package/.claude/commands/sparc/mcp.md +0 -76
  349. package/.claude/commands/sparc/memory-manager.md +0 -57
  350. package/.claude/commands/sparc/optimizer.md +0 -37
  351. package/.claude/commands/sparc/orchestrator.md +0 -70
  352. package/.claude/commands/sparc/post-deployment-monitoring-mode.md +0 -42
  353. package/.claude/commands/sparc/refinement-optimization-mode.md +0 -42
  354. package/.claude/commands/sparc/researcher.md +0 -37
  355. package/.claude/commands/sparc/reviewer.md +0 -37
  356. package/.claude/commands/sparc/security-review.md +0 -39
  357. package/.claude/commands/sparc/sparc-modes.md +0 -120
  358. package/.claude/commands/sparc/sparc.md +0 -71
  359. package/.claude/commands/sparc/spec-pseudocode.md +0 -39
  360. package/.claude/commands/sparc/supabase-admin.md +0 -301
  361. package/.claude/commands/sparc/swarm-coordinator.md +0 -50
  362. package/.claude/commands/sparc/tdd.md +0 -37
  363. package/.claude/commands/sparc/tester.md +0 -37
  364. package/.claude/commands/sparc/tutorial.md +0 -38
  365. package/.claude/commands/sparc/workflow-manager.md +0 -37
  366. package/.claude/commands/sparc.md +0 -112
  367. package/.claude/commands/stream-chain/pipeline.md +0 -116
  368. package/.claude/commands/stream-chain/run.md +0 -156
  369. package/.claude/commands/swarm/README.md +0 -40
  370. package/.claude/commands/swarm/analysis.md +0 -73
  371. package/.claude/commands/swarm/development.md +0 -72
  372. package/.claude/commands/swarm/examples.md +0 -103
  373. package/.claude/commands/swarm/maintenance.md +0 -75
  374. package/.claude/commands/swarm/optimization.md +0 -84
  375. package/.claude/commands/swarm/research.md +0 -76
  376. package/.claude/commands/swarm/swarm-analysis.md +0 -62
  377. package/.claude/commands/swarm/swarm-background.md +0 -65
  378. package/.claude/commands/swarm/swarm-modes.md +0 -67
  379. package/.claude/commands/swarm/swarm-monitor.md +0 -54
  380. package/.claude/commands/swarm/swarm-status.md +0 -44
  381. package/.claude/commands/swarm/swarm-strategies.md +0 -76
  382. package/.claude/commands/swarm/swarm.md +0 -79
  383. package/.claude/commands/swarm/testing.md +0 -80
  384. package/.claude/commands/tokens.md +0 -18
  385. package/.claude/commands/training/README.md +0 -39
  386. package/.claude/commands/training/model-update.md +0 -78
  387. package/.claude/commands/training/neural-patterns.md +0 -73
  388. package/.claude/commands/training/neural-train.md +0 -79
  389. package/.claude/commands/training/pattern-learn.md +0 -69
  390. package/.claude/commands/training/specialization.md +0 -92
  391. package/.claude/commands/truth/start.md +0 -121
  392. package/.claude/commands/ts.md +0 -14
  393. package/.claude/commands/verify/check.md +0 -106
  394. package/.claude/commands/verify/start.md +0 -105
  395. package/.claude/commands/workflows/README.md +0 -65
  396. package/.claude/commands/workflows/development.md +0 -86
  397. package/.claude/commands/workflows/research.md +0 -89
  398. package/.claude/commands/workflows/workflow-create.md +0 -84
  399. package/.claude/commands/workflows/workflow-execute.md +0 -103
  400. package/.claude/commands/workflows/workflow-export.md +0 -90
  401. package/.claude/config/v1-dependency-optimization.json +0 -266
  402. package/.claude/config/v1-performance-targets.json +0 -251
  403. package/.claude/helpers/README.md +0 -105
  404. package/.claude/helpers/auto-memory-hook.mjs +0 -369
  405. package/.claude/helpers/context-persistence-hook.mjs +0 -1988
  406. package/.claude/helpers/control-start.cjs +0 -91
  407. package/.claude/helpers/extras-registry.json +0 -5141
  408. package/.claude/helpers/graphify-freshen.cjs +0 -98
  409. package/.claude/helpers/hook-handler.cjs +0 -1718
  410. package/.claude/helpers/intelligence.cjs +0 -227
  411. package/.claude/helpers/learning-service.mjs +0 -1144
  412. package/.claude/helpers/loop-tracker.cjs +0 -107
  413. package/.claude/helpers/memory-palace.cjs +0 -401
  414. package/.claude/helpers/memory.cjs +0 -84
  415. package/.claude/helpers/metrics-db.mjs +0 -488
  416. package/.claude/helpers/router.cjs +0 -450
  417. package/.claude/helpers/session.cjs +0 -125
  418. package/.claude/helpers/skill-registry.json +0 -946
  419. package/.claude/helpers/statusline.cjs +0 -1331
  420. package/.claude/helpers/swarm-hooks.sh +0 -761
  421. package/.claude/helpers/toggle-statusline.cjs +0 -58
  422. package/.claude/helpers/token-tracker.cjs +0 -934
  423. package/.claude/mcp.json +0 -3
  424. package/.claude/scheduled_tasks.lock +0 -1
  425. package/.claude/settings.json +0 -318
  426. package/.claude/settings.local.json +0 -52
  427. package/.claude/skills/.monomind/data/ranked-context.json +0 -5
  428. package/.claude/skills/.monomind/sessions/current.json +0 -13
  429. package/.claude/skills/.monomind/sessions/session-1777829336455.json +0 -15
  430. package/.claude/skills/.monomind/sessions/session-1777831614725.json +0 -15
  431. package/.claude/skills/.monomind/sessions/session-1777832095857.json +0 -15
  432. package/.claude/skills/.monomind/sessions/session-1777839814183.json +0 -15
  433. package/.claude/skills/.monomind/sessions/session-1777841847131.json +0 -15
  434. package/.claude/skills/.monomind/sessions/session-1777843309463.json +0 -15
  435. package/.claude/skills/.monomind/sessions/session-1777880867159.json +0 -15
  436. package/.claude/skills/.monomind/sessions/session-1777881884593.json +0 -15
  437. package/.claude/skills/.monomind/sessions/session-1777884090471.json +0 -15
  438. package/.claude/skills/.monomind/sessions/session-1777884808221.json +0 -15
  439. package/.claude/skills/.monomind/sessions/session-1777885672155.json +0 -15
  440. package/.claude/skills/.monomind/sessions/session-1777886852818.json +0 -15
  441. package/.claude/skills/.monomind/sessions/session-1777896532690.json +0 -15
  442. package/.claude/skills/agent-browser-testing/SKILL.md +0 -312
  443. package/.claude/skills/agentdb-advanced/SKILL.md +0 -549
  444. package/.claude/skills/agentdb-learning/SKILL.md +0 -544
  445. package/.claude/skills/agentdb-memory-patterns/SKILL.md +0 -337
  446. package/.claude/skills/agentdb-optimization/SKILL.md +0 -508
  447. package/.claude/skills/agentdb-vector-search/SKILL.md +0 -335
  448. package/.claude/skills/agentic-integration/SKILL.md +0 -265
  449. package/.claude/skills/agentic-jujutsu/SKILL.md +0 -645
  450. package/.claude/skills/cli-modernization/SKILL.md +0 -950
  451. package/.claude/skills/core-implementation/SKILL.md +0 -892
  452. package/.claude/skills/ddd-architecture/SKILL.md +0 -444
  453. package/.claude/skills/github-code-review/SKILL.md +0 -1147
  454. package/.claude/skills/github-multi-repo/SKILL.md +0 -912
  455. package/.claude/skills/github-project-management/SKILL.md +0 -1245
  456. package/.claude/skills/github-release-management/SKILL.md +0 -1118
  457. package/.claude/skills/github-workflow-automation/SKILL.md +0 -1107
  458. package/.claude/skills/hive-mind-advanced/SKILL.md +0 -709
  459. package/.claude/skills/hooks-automation/SKILL.md +0 -1196
  460. package/.claude/skills/mastermind/_agent-select.md +0 -132
  461. package/.claude/skills/mastermind/_intake.md +0 -83
  462. package/.claude/skills/mastermind/_protocol.md +0 -380
  463. package/.claude/skills/mastermind/access.md +0 -236
  464. package/.claude/skills/mastermind/activity.md +0 -191
  465. package/.claude/skills/mastermind/adapter-manager.md +0 -259
  466. package/.claude/skills/mastermind/adapters.md +0 -204
  467. package/.claude/skills/mastermind/agent-detail.md +0 -242
  468. package/.claude/skills/mastermind/agents.md +0 -178
  469. package/.claude/skills/mastermind/approval-detail.md +0 -259
  470. package/.claude/skills/mastermind/approve.md +0 -181
  471. package/.claude/skills/mastermind/architect.md +0 -863
  472. package/.claude/skills/mastermind/backup.md +0 -197
  473. package/.claude/skills/mastermind/bootstrap.md +0 -190
  474. package/.claude/skills/mastermind/budgets.md +0 -237
  475. package/.claude/skills/mastermind/build.md +0 -170
  476. package/.claude/skills/mastermind/companies.md +0 -256
  477. package/.claude/skills/mastermind/content.md +0 -197
  478. package/.claude/skills/mastermind/costs.md +0 -151
  479. package/.claude/skills/mastermind/createorg.md +0 -344
  480. package/.claude/skills/mastermind/diagnose.md +0 -249
  481. package/.claude/skills/mastermind/env.md +0 -198
  482. package/.claude/skills/mastermind/environments.md +0 -250
  483. package/.claude/skills/mastermind/export.md +0 -324
  484. package/.claude/skills/mastermind/finance.md +0 -166
  485. package/.claude/skills/mastermind/goal-detail.md +0 -255
  486. package/.claude/skills/mastermind/goals.md +0 -149
  487. package/.claude/skills/mastermind/heartbeat.md +0 -164
  488. package/.claude/skills/mastermind/idea.md +0 -1120
  489. package/.claude/skills/mastermind/import.md +0 -281
  490. package/.claude/skills/mastermind/inbox.md +0 -214
  491. package/.claude/skills/mastermind/instance-settings.md +0 -315
  492. package/.claude/skills/mastermind/instance.md +0 -231
  493. package/.claude/skills/mastermind/invite-landing.md +0 -227
  494. package/.claude/skills/mastermind/invites.md +0 -254
  495. package/.claude/skills/mastermind/issue-detail.md +0 -291
  496. package/.claude/skills/mastermind/issues.md +0 -235
  497. package/.claude/skills/mastermind/join-queue.md +0 -170
  498. package/.claude/skills/mastermind/liveness.md +0 -392
  499. package/.claude/skills/mastermind/marketing.md +0 -228
  500. package/.claude/skills/mastermind/memory.md +0 -321
  501. package/.claude/skills/mastermind/monotask.md +0 -350
  502. package/.claude/skills/mastermind/my-issues.md +0 -146
  503. package/.claude/skills/mastermind/new-agent.md +0 -241
  504. package/.claude/skills/mastermind/ops.md +0 -168
  505. package/.claude/skills/mastermind/org-chart.md +0 -207
  506. package/.claude/skills/mastermind/org-settings.md +0 -217
  507. package/.claude/skills/mastermind/plan-to-tasks.md +0 -136
  508. package/.claude/skills/mastermind/plugin-manager.md +0 -241
  509. package/.claude/skills/mastermind/plugin-settings.md +0 -273
  510. package/.claude/skills/mastermind/plugins.md +0 -190
  511. package/.claude/skills/mastermind/profile.md +0 -187
  512. package/.claude/skills/mastermind/project-detail.md +0 -249
  513. package/.claude/skills/mastermind/project-workspace.md +0 -244
  514. package/.claude/skills/mastermind/projects.md +0 -164
  515. package/.claude/skills/mastermind/references/copywriting-frameworks.md +0 -181
  516. package/.claude/skills/mastermind/references/persuasion-psychology.md +0 -158
  517. package/.claude/skills/mastermind/release.md +0 -168
  518. package/.claude/skills/mastermind/research.md +0 -168
  519. package/.claude/skills/mastermind/review.md +0 -169
  520. package/.claude/skills/mastermind/routine-detail.md +0 -253
  521. package/.claude/skills/mastermind/routines.md +0 -202
  522. package/.claude/skills/mastermind/runorg.md +0 -373
  523. package/.claude/skills/mastermind/sales.md +0 -170
  524. package/.claude/skills/mastermind/search.md +0 -186
  525. package/.claude/skills/mastermind/secrets.md +0 -199
  526. package/.claude/skills/mastermind/skills.md +0 -156
  527. package/.claude/skills/mastermind/tasks.md +0 -149
  528. package/.claude/skills/mastermind/techport.md +0 -743
  529. package/.claude/skills/mastermind/threads.md +0 -259
  530. package/.claude/skills/mastermind/tree-control.md +0 -250
  531. package/.claude/skills/mastermind/wiki.md +0 -314
  532. package/.claude/skills/mastermind/workspace-detail.md +0 -317
  533. package/.claude/skills/mastermind/workspaces.md +0 -261
  534. package/.claude/skills/mastermind/worktree.md +0 -187
  535. package/.claude/skills/mcp-optimization/SKILL.md +0 -837
  536. package/.claude/skills/memory-unification/SKILL.md +0 -196
  537. package/.claude/skills/monodesign/SKILL.md +0 -302
  538. package/.claude/skills/monodesign/reference/adapt.md +0 -190
  539. package/.claude/skills/monodesign/reference/animate.md +0 -175
  540. package/.claude/skills/monodesign/reference/antipatterns-catalog.md +0 -187
  541. package/.claude/skills/monodesign/reference/audit.md +0 -133
  542. package/.claude/skills/monodesign/reference/bolder.md +0 -113
  543. package/.claude/skills/monodesign/reference/brand-workflow.md +0 -180
  544. package/.claude/skills/monodesign/reference/brand.md +0 -114
  545. package/.claude/skills/monodesign/reference/clarify.md +0 -174
  546. package/.claude/skills/monodesign/reference/cognitive-load.md +0 -106
  547. package/.claude/skills/monodesign/reference/color-and-contrast.md +0 -105
  548. package/.claude/skills/monodesign/reference/colorize.md +0 -154
  549. package/.claude/skills/monodesign/reference/component-specs.md +0 -260
  550. package/.claude/skills/monodesign/reference/component-states.md +0 -274
  551. package/.claude/skills/monodesign/reference/component-system.md +0 -358
  552. package/.claude/skills/monodesign/reference/copy-formulas.md +0 -160
  553. package/.claude/skills/monodesign/reference/craft.md +0 -193
  554. package/.claude/skills/monodesign/reference/critique.md +0 -213
  555. package/.claude/skills/monodesign/reference/delight.md +0 -302
  556. package/.claude/skills/monodesign/reference/design-principles.md +0 -246
  557. package/.claude/skills/monodesign/reference/distill.md +0 -111
  558. package/.claude/skills/monodesign/reference/document.md +0 -427
  559. package/.claude/skills/monodesign/reference/extract.md +0 -69
  560. package/.claude/skills/monodesign/reference/harden.md +0 -347
  561. package/.claude/skills/monodesign/reference/heuristics-scoring.md +0 -234
  562. package/.claude/skills/monodesign/reference/image-prompts.md +0 -118
  563. package/.claude/skills/monodesign/reference/interaction-design.md +0 -195
  564. package/.claude/skills/monodesign/reference/layout.md +0 -141
  565. package/.claude/skills/monodesign/reference/live.md +0 -622
  566. package/.claude/skills/monodesign/reference/motion-design.md +0 -109
  567. package/.claude/skills/monodesign/reference/onboard.md +0 -234
  568. package/.claude/skills/monodesign/reference/optimize.md +0 -258
  569. package/.claude/skills/monodesign/reference/overdrive.md +0 -130
  570. package/.claude/skills/monodesign/reference/personas.md +0 -179
  571. package/.claude/skills/monodesign/reference/polish.md +0 -233
  572. package/.claude/skills/monodesign/reference/pre-delivery-checklist.md +0 -108
  573. package/.claude/skills/monodesign/reference/product.md +0 -62
  574. package/.claude/skills/monodesign/reference/quieter.md +0 -99
  575. package/.claude/skills/monodesign/reference/responsive-design.md +0 -114
  576. package/.claude/skills/monodesign/reference/shape.md +0 -151
  577. package/.claude/skills/monodesign/reference/spatial-design.md +0 -100
  578. package/.claude/skills/monodesign/reference/teach.md +0 -156
  579. package/.claude/skills/monodesign/reference/token-architecture.md +0 -222
  580. package/.claude/skills/monodesign/reference/typeset.md +0 -124
  581. package/.claude/skills/monodesign/reference/typography.md +0 -159
  582. package/.claude/skills/monodesign/reference/ux-research.md +0 -143
  583. package/.claude/skills/monodesign/reference/ux-rules.md +0 -211
  584. package/.claude/skills/monodesign/reference/ux-writing.md +0 -107
  585. package/.claude/skills/monomotion/SKILL.md +0 -145
  586. package/.claude/skills/monomotion/rules/api-control.md +0 -139
  587. package/.claude/skills/monomotion/rules/effects.md +0 -109
  588. package/.claude/skills/monomotion/rules/integration.md +0 -140
  589. package/.claude/skills/monomotion/rules/scroll.md +0 -131
  590. package/.claude/skills/monomotion/rules/sequencing.md +0 -105
  591. package/.claude/skills/monomotion/rules/svg.md +0 -101
  592. package/.claude/skills/monomotion/rules/text.md +0 -119
  593. package/.claude/skills/pair-programming/SKILL.md +0 -1202
  594. package/.claude/skills/performance-analysis/SKILL.md +0 -560
  595. package/.claude/skills/performance-optimization/SKILL.md +0 -416
  596. package/.claude/skills/reasoningbank-agentdb/SKILL.md +0 -444
  597. package/.claude/skills/reasoningbank-intelligence/SKILL.md +0 -199
  598. package/.claude/skills/security-hardening/SKILL.md +0 -101
  599. package/.claude/skills/skill-builder/SKILL.md +0 -910
  600. package/.claude/skills/sparc-methodology/SKILL.md +0 -950
  601. package/.claude/skills/specialagent/SKILL.md +0 -208
  602. package/.claude/skills/stop-slop/SKILL.md +0 -67
  603. package/.claude/skills/stop-slop/references/examples.md +0 -61
  604. package/.claude/skills/stop-slop/references/phrases.md +0 -130
  605. package/.claude/skills/stop-slop/references/structures.md +0 -136
  606. package/.claude/skills/stream-chain/SKILL.md +0 -560
  607. package/.claude/skills/swarm-advanced/SKILL.md +0 -940
  608. package/.claude/skills/swarm-coordination/SKILL.md +0 -451
  609. package/.claude/skills/swarm-orchestration/SKILL.md +0 -179
  610. package/.claude/skills/verification-quality/SKILL.md +0 -674
  611. package/.claude/statusline-command.sh +0 -176
  612. package/.claude/statusline.mjs +0 -109
  613. package/.claude/statusline.sh +0 -431
  614. package/.claude/workflows/feature-dev.yaml +0 -18
  615. package/.claude/workflows/security-audit.yaml +0 -10
  616. package/.claude-plugin/README.md +0 -705
  617. package/.claude-plugin/docs/INSTALLATION.md +0 -258
  618. package/.claude-plugin/docs/PLUGIN_SUMMARY.md +0 -359
  619. package/.claude-plugin/docs/QUICKSTART.md +0 -360
  620. package/.claude-plugin/docs/STRUCTURE.md +0 -126
  621. package/.claude-plugin/hooks/hooks.json +0 -74
  622. package/.claude-plugin/marketplace.json +0 -98
  623. package/.claude-plugin/plugin.json +0 -70
  624. package/.claude-plugin/scripts/install.sh +0 -234
  625. package/.claude-plugin/scripts/uninstall.sh +0 -36
  626. package/.claude-plugin/scripts/verify.sh +0 -108
  627. package/LICENSE +0 -21
  628. package/README.md +0 -441
  629. package/bin/cli.js +0 -11
  630. package/bin/npx-safe-launch.js +0 -9
  631. package/packages/@monomind/cli/README.md +0 -441
  632. package/packages/@monomind/cli/bin/cli.js +0 -221
  633. package/packages/@monomind/cli/bin/mcp-server.js +0 -189
  634. package/packages/@monomind/cli/bin/preinstall.cjs +0 -2
  635. package/packages/@monomind/cli/bundled-graph/dist/tsconfig.tsbuildinfo +0 -1
  636. package/packages/@monomind/cli/bundled-graph/package.json +0 -57
  637. package/packages/@monomind/cli/package.json +0 -114
  638. package/packages/@monomind/guidance/README.md +0 -1192
  639. package/packages/@monomind/guidance/dist/adversarial.d.ts +0 -284
  640. package/packages/@monomind/guidance/dist/adversarial.js +0 -572
  641. package/packages/@monomind/guidance/dist/analyzer.d.ts +0 -530
  642. package/packages/@monomind/guidance/dist/analyzer.js +0 -2518
  643. package/packages/@monomind/guidance/dist/artifacts.d.ts +0 -283
  644. package/packages/@monomind/guidance/dist/artifacts.js +0 -356
  645. package/packages/@monomind/guidance/dist/authority.d.ts +0 -290
  646. package/packages/@monomind/guidance/dist/authority.js +0 -558
  647. package/packages/@monomind/guidance/dist/capabilities.d.ts +0 -209
  648. package/packages/@monomind/guidance/dist/capabilities.js +0 -485
  649. package/packages/@monomind/guidance/dist/coherence.d.ts +0 -233
  650. package/packages/@monomind/guidance/dist/coherence.js +0 -372
  651. package/packages/@monomind/guidance/dist/compiler.d.ts +0 -87
  652. package/packages/@monomind/guidance/dist/compiler.js +0 -419
  653. package/packages/@monomind/guidance/dist/conformance-kit.d.ts +0 -225
  654. package/packages/@monomind/guidance/dist/conformance-kit.js +0 -629
  655. package/packages/@monomind/guidance/dist/continue-gate.d.ts +0 -214
  656. package/packages/@monomind/guidance/dist/continue-gate.js +0 -353
  657. package/packages/@monomind/guidance/dist/crypto-utils.d.ts +0 -17
  658. package/packages/@monomind/guidance/dist/crypto-utils.js +0 -24
  659. package/packages/@monomind/guidance/dist/evolution.d.ts +0 -282
  660. package/packages/@monomind/guidance/dist/evolution.js +0 -500
  661. package/packages/@monomind/guidance/dist/gates.d.ts +0 -79
  662. package/packages/@monomind/guidance/dist/gates.js +0 -302
  663. package/packages/@monomind/guidance/dist/gateway.d.ts +0 -206
  664. package/packages/@monomind/guidance/dist/gateway.js +0 -452
  665. package/packages/@monomind/guidance/dist/generators.d.ts +0 -153
  666. package/packages/@monomind/guidance/dist/generators.js +0 -682
  667. package/packages/@monomind/guidance/dist/headless.d.ts +0 -177
  668. package/packages/@monomind/guidance/dist/headless.js +0 -342
  669. package/packages/@monomind/guidance/dist/hooks.d.ts +0 -109
  670. package/packages/@monomind/guidance/dist/hooks.js +0 -347
  671. package/packages/@monomind/guidance/dist/index.d.ts +0 -205
  672. package/packages/@monomind/guidance/dist/index.js +0 -321
  673. package/packages/@monomind/guidance/dist/ledger.d.ts +0 -162
  674. package/packages/@monomind/guidance/dist/ledger.js +0 -375
  675. package/packages/@monomind/guidance/dist/manifest-validator.d.ts +0 -289
  676. package/packages/@monomind/guidance/dist/manifest-validator.js +0 -838
  677. package/packages/@monomind/guidance/dist/memory-gate.d.ts +0 -222
  678. package/packages/@monomind/guidance/dist/memory-gate.js +0 -382
  679. package/packages/@monomind/guidance/dist/meta-governance.d.ts +0 -265
  680. package/packages/@monomind/guidance/dist/meta-governance.js +0 -348
  681. package/packages/@monomind/guidance/dist/optimizer.d.ts +0 -104
  682. package/packages/@monomind/guidance/dist/optimizer.js +0 -329
  683. package/packages/@monomind/guidance/dist/persistence.d.ts +0 -189
  684. package/packages/@monomind/guidance/dist/persistence.js +0 -464
  685. package/packages/@monomind/guidance/dist/proof.d.ts +0 -185
  686. package/packages/@monomind/guidance/dist/proof.js +0 -238
  687. package/packages/@monomind/guidance/dist/retriever.d.ts +0 -116
  688. package/packages/@monomind/guidance/dist/retriever.js +0 -394
  689. package/packages/@monomind/guidance/dist/ruvbot-integration.d.ts +0 -370
  690. package/packages/@monomind/guidance/dist/ruvbot-integration.js +0 -738
  691. package/packages/@monomind/guidance/dist/temporal.d.ts +0 -426
  692. package/packages/@monomind/guidance/dist/temporal.js +0 -658
  693. package/packages/@monomind/guidance/dist/trust.d.ts +0 -283
  694. package/packages/@monomind/guidance/dist/trust.js +0 -473
  695. package/packages/@monomind/guidance/dist/truth-anchors.d.ts +0 -276
  696. package/packages/@monomind/guidance/dist/truth-anchors.js +0 -488
  697. package/packages/@monomind/guidance/dist/types.d.ts +0 -378
  698. package/packages/@monomind/guidance/dist/types.js +0 -10
  699. package/packages/@monomind/guidance/dist/uncertainty.d.ts +0 -372
  700. package/packages/@monomind/guidance/dist/uncertainty.js +0 -619
  701. package/packages/@monomind/guidance/dist/wasm-kernel.d.ts +0 -48
  702. package/packages/@monomind/guidance/dist/wasm-kernel.js +0 -158
  703. package/packages/@monomind/guidance/package.json +0 -198
  704. package/packages/@monomind/shared/README.md +0 -322
  705. package/packages/@monomind/shared/dist/agent-contract.d.ts +0 -28
  706. package/packages/@monomind/shared/dist/agent-contract.js +0 -57
  707. package/packages/@monomind/shared/dist/agent-error-result.d.ts +0 -17
  708. package/packages/@monomind/shared/dist/agent-error-result.js +0 -23
  709. package/packages/@monomind/shared/dist/core/config/defaults.d.ts +0 -41
  710. package/packages/@monomind/shared/dist/core/config/defaults.js +0 -186
  711. package/packages/@monomind/shared/dist/core/config/index.d.ts +0 -8
  712. package/packages/@monomind/shared/dist/core/config/index.js +0 -12
  713. package/packages/@monomind/shared/dist/core/config/loader.d.ts +0 -45
  714. package/packages/@monomind/shared/dist/core/config/loader.js +0 -238
  715. package/packages/@monomind/shared/dist/core/config/schema.d.ts +0 -324
  716. package/packages/@monomind/shared/dist/core/config/schema.js +0 -160
  717. package/packages/@monomind/shared/dist/core/config/validator.d.ts +0 -92
  718. package/packages/@monomind/shared/dist/core/config/validator.js +0 -147
  719. package/packages/@monomind/shared/dist/core/event-bus.d.ts +0 -31
  720. package/packages/@monomind/shared/dist/core/event-bus.js +0 -197
  721. package/packages/@monomind/shared/dist/core/index.d.ts +0 -15
  722. package/packages/@monomind/shared/dist/core/index.js +0 -19
  723. package/packages/@monomind/shared/dist/core/interfaces/agent.interface.d.ts +0 -200
  724. package/packages/@monomind/shared/dist/core/interfaces/agent.interface.js +0 -6
  725. package/packages/@monomind/shared/dist/core/interfaces/coordinator.interface.d.ts +0 -310
  726. package/packages/@monomind/shared/dist/core/interfaces/coordinator.interface.js +0 -7
  727. package/packages/@monomind/shared/dist/core/interfaces/event.interface.d.ts +0 -224
  728. package/packages/@monomind/shared/dist/core/interfaces/event.interface.js +0 -46
  729. package/packages/@monomind/shared/dist/core/interfaces/index.d.ts +0 -10
  730. package/packages/@monomind/shared/dist/core/interfaces/index.js +0 -15
  731. package/packages/@monomind/shared/dist/core/interfaces/memory.interface.d.ts +0 -298
  732. package/packages/@monomind/shared/dist/core/interfaces/memory.interface.js +0 -7
  733. package/packages/@monomind/shared/dist/core/interfaces/task.interface.d.ts +0 -185
  734. package/packages/@monomind/shared/dist/core/interfaces/task.interface.js +0 -6
  735. package/packages/@monomind/shared/dist/core/orchestrator/event-coordinator.d.ts +0 -35
  736. package/packages/@monomind/shared/dist/core/orchestrator/event-coordinator.js +0 -101
  737. package/packages/@monomind/shared/dist/core/orchestrator/health-monitor.d.ts +0 -60
  738. package/packages/@monomind/shared/dist/core/orchestrator/health-monitor.js +0 -166
  739. package/packages/@monomind/shared/dist/core/orchestrator/index.d.ts +0 -46
  740. package/packages/@monomind/shared/dist/core/orchestrator/index.js +0 -64
  741. package/packages/@monomind/shared/dist/core/orchestrator/lifecycle-manager.d.ts +0 -56
  742. package/packages/@monomind/shared/dist/core/orchestrator/lifecycle-manager.js +0 -195
  743. package/packages/@monomind/shared/dist/core/orchestrator/session-manager.d.ts +0 -83
  744. package/packages/@monomind/shared/dist/core/orchestrator/session-manager.js +0 -193
  745. package/packages/@monomind/shared/dist/core/orchestrator/task-manager.d.ts +0 -49
  746. package/packages/@monomind/shared/dist/core/orchestrator/task-manager.js +0 -253
  747. package/packages/@monomind/shared/dist/events/domain-events.d.ts +0 -282
  748. package/packages/@monomind/shared/dist/events/domain-events.js +0 -165
  749. package/packages/@monomind/shared/dist/events/event-store.d.ts +0 -126
  750. package/packages/@monomind/shared/dist/events/event-store.js +0 -416
  751. package/packages/@monomind/shared/dist/events/event-store.test.d.ts +0 -8
  752. package/packages/@monomind/shared/dist/events/event-store.test.js +0 -293
  753. package/packages/@monomind/shared/dist/events/example-usage.d.ts +0 -10
  754. package/packages/@monomind/shared/dist/events/example-usage.js +0 -193
  755. package/packages/@monomind/shared/dist/events/index.d.ts +0 -21
  756. package/packages/@monomind/shared/dist/events/index.js +0 -22
  757. package/packages/@monomind/shared/dist/events/projections.d.ts +0 -177
  758. package/packages/@monomind/shared/dist/events/projections.js +0 -421
  759. package/packages/@monomind/shared/dist/events/rvf-event-log.d.ts +0 -82
  760. package/packages/@monomind/shared/dist/events/rvf-event-log.js +0 -340
  761. package/packages/@monomind/shared/dist/events/state-reconstructor.d.ts +0 -101
  762. package/packages/@monomind/shared/dist/events/state-reconstructor.js +0 -263
  763. package/packages/@monomind/shared/dist/events.d.ts +0 -80
  764. package/packages/@monomind/shared/dist/events.js +0 -249
  765. package/packages/@monomind/shared/dist/hooks/example-usage.d.ts +0 -42
  766. package/packages/@monomind/shared/dist/hooks/example-usage.js +0 -351
  767. package/packages/@monomind/shared/dist/hooks/executor.d.ts +0 -100
  768. package/packages/@monomind/shared/dist/hooks/executor.js +0 -264
  769. package/packages/@monomind/shared/dist/hooks/hooks.test.d.ts +0 -9
  770. package/packages/@monomind/shared/dist/hooks/hooks.test.js +0 -322
  771. package/packages/@monomind/shared/dist/hooks/index.d.ts +0 -52
  772. package/packages/@monomind/shared/dist/hooks/index.js +0 -51
  773. package/packages/@monomind/shared/dist/hooks/registry.d.ts +0 -133
  774. package/packages/@monomind/shared/dist/hooks/registry.js +0 -277
  775. package/packages/@monomind/shared/dist/hooks/safety/bash-safety.d.ts +0 -105
  776. package/packages/@monomind/shared/dist/hooks/safety/bash-safety.js +0 -481
  777. package/packages/@monomind/shared/dist/hooks/safety/file-organization.d.ts +0 -144
  778. package/packages/@monomind/shared/dist/hooks/safety/file-organization.js +0 -328
  779. package/packages/@monomind/shared/dist/hooks/safety/git-commit.d.ts +0 -158
  780. package/packages/@monomind/shared/dist/hooks/safety/git-commit.js +0 -450
  781. package/packages/@monomind/shared/dist/hooks/safety/index.d.ts +0 -17
  782. package/packages/@monomind/shared/dist/hooks/safety/index.js +0 -17
  783. package/packages/@monomind/shared/dist/hooks/session-hooks.d.ts +0 -234
  784. package/packages/@monomind/shared/dist/hooks/session-hooks.js +0 -334
  785. package/packages/@monomind/shared/dist/hooks/task-hooks.d.ts +0 -163
  786. package/packages/@monomind/shared/dist/hooks/task-hooks.js +0 -326
  787. package/packages/@monomind/shared/dist/hooks/types.d.ts +0 -267
  788. package/packages/@monomind/shared/dist/hooks/types.js +0 -62
  789. package/packages/@monomind/shared/dist/hooks/verify-exports.test.d.ts +0 -9
  790. package/packages/@monomind/shared/dist/hooks/verify-exports.test.js +0 -93
  791. package/packages/@monomind/shared/dist/index.d.ts +0 -46
  792. package/packages/@monomind/shared/dist/index.js +0 -77
  793. package/packages/@monomind/shared/dist/mcp/connection-pool.d.ts +0 -98
  794. package/packages/@monomind/shared/dist/mcp/connection-pool.js +0 -364
  795. package/packages/@monomind/shared/dist/mcp/index.d.ts +0 -69
  796. package/packages/@monomind/shared/dist/mcp/index.js +0 -84
  797. package/packages/@monomind/shared/dist/mcp/server.d.ts +0 -166
  798. package/packages/@monomind/shared/dist/mcp/server.js +0 -593
  799. package/packages/@monomind/shared/dist/mcp/session-manager.d.ts +0 -136
  800. package/packages/@monomind/shared/dist/mcp/session-manager.js +0 -335
  801. package/packages/@monomind/shared/dist/mcp/tool-registry.d.ts +0 -178
  802. package/packages/@monomind/shared/dist/mcp/tool-registry.js +0 -439
  803. package/packages/@monomind/shared/dist/mcp/transport/http.d.ts +0 -104
  804. package/packages/@monomind/shared/dist/mcp/transport/http.js +0 -476
  805. package/packages/@monomind/shared/dist/mcp/transport/index.d.ts +0 -102
  806. package/packages/@monomind/shared/dist/mcp/transport/index.js +0 -238
  807. package/packages/@monomind/shared/dist/mcp/transport/stdio.d.ts +0 -104
  808. package/packages/@monomind/shared/dist/mcp/transport/stdio.js +0 -263
  809. package/packages/@monomind/shared/dist/mcp/transport/websocket.d.ts +0 -133
  810. package/packages/@monomind/shared/dist/mcp/transport/websocket.js +0 -396
  811. package/packages/@monomind/shared/dist/mcp/types.d.ts +0 -438
  812. package/packages/@monomind/shared/dist/mcp/types.js +0 -54
  813. package/packages/@monomind/shared/dist/plugin-interface.d.ts +0 -544
  814. package/packages/@monomind/shared/dist/plugin-interface.js +0 -23
  815. package/packages/@monomind/shared/dist/plugin-loader.d.ts +0 -139
  816. package/packages/@monomind/shared/dist/plugin-loader.js +0 -434
  817. package/packages/@monomind/shared/dist/plugin-registry.d.ts +0 -183
  818. package/packages/@monomind/shared/dist/plugin-registry.js +0 -457
  819. package/packages/@monomind/shared/dist/plugins/index.d.ts +0 -10
  820. package/packages/@monomind/shared/dist/plugins/index.js +0 -10
  821. package/packages/@monomind/shared/dist/plugins/official/hive-mind-plugin.d.ts +0 -106
  822. package/packages/@monomind/shared/dist/plugins/official/hive-mind-plugin.js +0 -241
  823. package/packages/@monomind/shared/dist/plugins/official/index.d.ts +0 -10
  824. package/packages/@monomind/shared/dist/plugins/official/index.js +0 -10
  825. package/packages/@monomind/shared/dist/plugins/official/maestro-plugin.d.ts +0 -121
  826. package/packages/@monomind/shared/dist/plugins/official/maestro-plugin.js +0 -355
  827. package/packages/@monomind/shared/dist/plugins/types.d.ts +0 -93
  828. package/packages/@monomind/shared/dist/plugins/types.js +0 -9
  829. package/packages/@monomind/shared/dist/reducers.d.ts +0 -33
  830. package/packages/@monomind/shared/dist/reducers.js +0 -89
  831. package/packages/@monomind/shared/dist/resilience/bulkhead.d.ts +0 -105
  832. package/packages/@monomind/shared/dist/resilience/bulkhead.js +0 -206
  833. package/packages/@monomind/shared/dist/resilience/circuit-breaker.d.ts +0 -132
  834. package/packages/@monomind/shared/dist/resilience/circuit-breaker.js +0 -233
  835. package/packages/@monomind/shared/dist/resilience/index.d.ts +0 -19
  836. package/packages/@monomind/shared/dist/resilience/index.js +0 -19
  837. package/packages/@monomind/shared/dist/resilience/rate-limiter.d.ts +0 -168
  838. package/packages/@monomind/shared/dist/resilience/rate-limiter.js +0 -314
  839. package/packages/@monomind/shared/dist/resilience/retry.d.ts +0 -91
  840. package/packages/@monomind/shared/dist/resilience/retry.js +0 -159
  841. package/packages/@monomind/shared/dist/retry-policy.d.ts +0 -14
  842. package/packages/@monomind/shared/dist/retry-policy.js +0 -23
  843. package/packages/@monomind/shared/dist/retry-runner.d.ts +0 -21
  844. package/packages/@monomind/shared/dist/retry-runner.js +0 -57
  845. package/packages/@monomind/shared/dist/schema-validator.d.ts +0 -46
  846. package/packages/@monomind/shared/dist/schema-validator.js +0 -133
  847. package/packages/@monomind/shared/dist/scratchpad.d.ts +0 -23
  848. package/packages/@monomind/shared/dist/scratchpad.js +0 -32
  849. package/packages/@monomind/shared/dist/security/index.d.ts +0 -10
  850. package/packages/@monomind/shared/dist/security/index.js +0 -12
  851. package/packages/@monomind/shared/dist/security/input-validation.d.ts +0 -73
  852. package/packages/@monomind/shared/dist/security/input-validation.js +0 -201
  853. package/packages/@monomind/shared/dist/security/secure-random.d.ts +0 -92
  854. package/packages/@monomind/shared/dist/security/secure-random.js +0 -142
  855. package/packages/@monomind/shared/dist/services/index.d.ts +0 -7
  856. package/packages/@monomind/shared/dist/services/index.js +0 -7
  857. package/packages/@monomind/shared/dist/services/progress.service.d.ts +0 -124
  858. package/packages/@monomind/shared/dist/services/progress.service.js +0 -402
  859. package/packages/@monomind/shared/dist/state-manager.d.ts +0 -34
  860. package/packages/@monomind/shared/dist/state-manager.js +0 -73
  861. package/packages/@monomind/shared/dist/state-validator.d.ts +0 -20
  862. package/packages/@monomind/shared/dist/state-validator.js +0 -49
  863. package/packages/@monomind/shared/dist/swarm-state.d.ts +0 -52
  864. package/packages/@monomind/shared/dist/swarm-state.js +0 -18
  865. package/packages/@monomind/shared/dist/testing/fixture-builder.d.ts +0 -14
  866. package/packages/@monomind/shared/dist/testing/fixture-builder.js +0 -32
  867. package/packages/@monomind/shared/dist/testing/index.d.ts +0 -2
  868. package/packages/@monomind/shared/dist/testing/index.js +0 -2
  869. package/packages/@monomind/shared/dist/testing/test-model.d.ts +0 -29
  870. package/packages/@monomind/shared/dist/testing/test-model.js +0 -53
  871. package/packages/@monomind/shared/dist/types/agent-registry.d.ts +0 -62
  872. package/packages/@monomind/shared/dist/types/agent-registry.js +0 -8
  873. package/packages/@monomind/shared/dist/types/agent-version.d.ts +0 -49
  874. package/packages/@monomind/shared/dist/types/agent-version.js +0 -7
  875. package/packages/@monomind/shared/dist/types/agent.types.d.ts +0 -137
  876. package/packages/@monomind/shared/dist/types/agent.types.js +0 -6
  877. package/packages/@monomind/shared/dist/types/benchmark.d.ts +0 -39
  878. package/packages/@monomind/shared/dist/types/benchmark.js +0 -6
  879. package/packages/@monomind/shared/dist/types/communication-flow.d.ts +0 -25
  880. package/packages/@monomind/shared/dist/types/communication-flow.js +0 -7
  881. package/packages/@monomind/shared/dist/types/consensus-audit.d.ts +0 -40
  882. package/packages/@monomind/shared/dist/types/consensus-audit.js +0 -7
  883. package/packages/@monomind/shared/dist/types/dlq.d.ts +0 -40
  884. package/packages/@monomind/shared/dist/types/dlq.js +0 -7
  885. package/packages/@monomind/shared/dist/types/eval.d.ts +0 -59
  886. package/packages/@monomind/shared/dist/types/eval.js +0 -6
  887. package/packages/@monomind/shared/dist/types/index.d.ts +0 -19
  888. package/packages/@monomind/shared/dist/types/index.js +0 -33
  889. package/packages/@monomind/shared/dist/types/mcp.types.d.ts +0 -266
  890. package/packages/@monomind/shared/dist/types/mcp.types.js +0 -7
  891. package/packages/@monomind/shared/dist/types/memory.types.d.ts +0 -236
  892. package/packages/@monomind/shared/dist/types/memory.types.js +0 -7
  893. package/packages/@monomind/shared/dist/types/retry.d.ts +0 -72
  894. package/packages/@monomind/shared/dist/types/retry.js +0 -40
  895. package/packages/@monomind/shared/dist/types/specialization.d.ts +0 -27
  896. package/packages/@monomind/shared/dist/types/specialization.js +0 -8
  897. package/packages/@monomind/shared/dist/types/swarm.types.d.ts +0 -186
  898. package/packages/@monomind/shared/dist/types/swarm.types.js +0 -65
  899. package/packages/@monomind/shared/dist/types/task.types.d.ts +0 -178
  900. package/packages/@monomind/shared/dist/types/task.types.js +0 -32
  901. package/packages/@monomind/shared/dist/types/termination.d.ts +0 -29
  902. package/packages/@monomind/shared/dist/types/termination.js +0 -14
  903. package/packages/@monomind/shared/dist/types/tool-version.d.ts +0 -41
  904. package/packages/@monomind/shared/dist/types/tool-version.js +0 -8
  905. package/packages/@monomind/shared/dist/types/trigger.d.ts +0 -40
  906. package/packages/@monomind/shared/dist/types/trigger.js +0 -8
  907. package/packages/@monomind/shared/dist/types.d.ts +0 -197
  908. package/packages/@monomind/shared/dist/types.js +0 -21
  909. package/packages/@monomind/shared/dist/utils/secure-logger.d.ts +0 -69
  910. package/packages/@monomind/shared/dist/utils/secure-logger.js +0 -208
  911. package/packages/@monomind/shared/package.json +0 -42
  912. package/packages/README.md +0 -513
@@ -1,1988 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * Context Persistence Hook (ADR-051)
4
- *
5
- * Intercepts Claude Code's PreCompact, SessionStart, and UserPromptSubmit
6
- * lifecycle events to persist conversation history in SQLite (primary),
7
- * RuVector PostgreSQL (optional), or JSON (fallback), enabling "infinite
8
- * context" across compaction boundaries.
9
- *
10
- * Backend priority:
11
- * 1. better-sqlite3 (native, WAL mode, indexed queries, ACID transactions)
12
- * 2. RuVector PostgreSQL (if RUVECTOR_* env vars set - TB-scale, GNN search)
13
- * 3. AgentDB from @monomind/memory (HNSW vector search)
14
- * 4. JsonFileBackend (zero dependencies, always works)
15
- *
16
- * Proactive archiving:
17
- * - UserPromptSubmit hook archives on every prompt, BEFORE context fills up
18
- * - PreCompact hook is a safety net that catches any remaining unarchived turns
19
- * - SessionStart hook restores context after compaction
20
- * - Together, compaction becomes invisible — no information is ever lost
21
- *
22
- * Usage:
23
- * node context-persistence-hook.mjs pre-compact # PreCompact: archive transcript
24
- * node context-persistence-hook.mjs session-start # SessionStart: restore context
25
- * node context-persistence-hook.mjs user-prompt-submit # UserPromptSubmit: proactive archive
26
- * node context-persistence-hook.mjs status # Show archive stats
27
- */
28
-
29
- import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
30
- import { createHash } from 'crypto';
31
- import { join, dirname } from 'path';
32
- import { fileURLToPath } from 'url';
33
- import { createRequire } from 'module';
34
-
35
- const __filename = fileURLToPath(import.meta.url);
36
- const __dirname = dirname(__filename);
37
- const PROJECT_ROOT = join(__dirname, '../..');
38
- const DATA_DIR = join(PROJECT_ROOT, '.monomind', 'data');
39
- const ARCHIVE_JSON_PATH = join(DATA_DIR, 'transcript-archive.json');
40
- const ARCHIVE_DB_PATH = join(DATA_DIR, 'transcript-archive.db');
41
-
42
- const NAMESPACE = 'transcript-archive';
43
- const RESTORE_BUDGET = parseInt(process.env.MONOMIND_COMPACT_RESTORE_BUDGET || '4000', 10);
44
- const MAX_MESSAGES = 500;
45
- const BLOCK_COMPACTION = process.env.MONOMIND_BLOCK_COMPACTION === 'true';
46
- const COMPACT_INSTRUCTION_BUDGET = parseInt(process.env.MONOMIND_COMPACT_INSTRUCTION_BUDGET || '2000', 10);
47
- const RETENTION_DAYS = parseInt(process.env.MONOMIND_RETENTION_DAYS || '30', 10);
48
- const AUTO_OPTIMIZE = process.env.MONOMIND_AUTO_OPTIMIZE !== 'false'; // on by default
49
-
50
- // ============================================================================
51
- // Context Autopilot — prevent compaction by managing context size in real-time
52
- // ============================================================================
53
- const AUTOPILOT_ENABLED = process.env.MONOMIND_CONTEXT_AUTOPILOT !== 'false'; // on by default
54
- const CONTEXT_WINDOW_TOKENS = parseInt(process.env.MONOMIND_CONTEXT_WINDOW || '200000', 10);
55
- const AUTOPILOT_WARN_PCT = parseFloat(process.env.MONOMIND_AUTOPILOT_WARN || '0.70');
56
- const AUTOPILOT_PRUNE_PCT = parseFloat(process.env.MONOMIND_AUTOPILOT_PRUNE || '0.85');
57
- const AUTOPILOT_STATE_PATH = join(DATA_DIR, 'autopilot-state.json');
58
-
59
- // Approximate tokens per character (Claude averages ~3.5 chars per token)
60
- const CHARS_PER_TOKEN = 3.5;
61
-
62
- // Ensure data dir
63
- if (!existsSync(DATA_DIR)) mkdirSync(DATA_DIR, { recursive: true });
64
-
65
- // ============================================================================
66
- // SQLite Backend (better-sqlite3 — synchronous, fast, WAL mode)
67
- // ============================================================================
68
-
69
- class SQLiteBackend {
70
- constructor(dbPath) {
71
- this.dbPath = dbPath;
72
- this.db = null;
73
- }
74
-
75
- async initialize() {
76
- const require = createRequire(import.meta.url);
77
- const Database = require('better-sqlite3');
78
- this.db = new Database(this.dbPath);
79
-
80
- // Performance optimizations
81
- this.db.pragma('journal_mode = WAL');
82
- this.db.pragma('synchronous = NORMAL');
83
- this.db.pragma('cache_size = 5000');
84
- this.db.pragma('temp_store = MEMORY');
85
-
86
- // Create schema
87
- this.db.exec(`
88
- CREATE TABLE IF NOT EXISTS transcript_entries (
89
- id TEXT PRIMARY KEY,
90
- key TEXT NOT NULL,
91
- content TEXT NOT NULL,
92
- type TEXT NOT NULL DEFAULT 'episodic',
93
- namespace TEXT NOT NULL DEFAULT 'transcript-archive',
94
- tags TEXT NOT NULL DEFAULT '[]',
95
- metadata TEXT NOT NULL DEFAULT '{}',
96
- access_level TEXT NOT NULL DEFAULT 'private',
97
- created_at INTEGER NOT NULL,
98
- updated_at INTEGER NOT NULL,
99
- version INTEGER NOT NULL DEFAULT 1,
100
- access_count INTEGER NOT NULL DEFAULT 0,
101
- last_accessed_at INTEGER NOT NULL,
102
- content_hash TEXT,
103
- session_id TEXT,
104
- chunk_index INTEGER,
105
- summary TEXT
106
- );
107
-
108
- CREATE INDEX IF NOT EXISTS idx_te_namespace ON transcript_entries(namespace);
109
- CREATE INDEX IF NOT EXISTS idx_te_session ON transcript_entries(session_id);
110
- CREATE INDEX IF NOT EXISTS idx_te_hash ON transcript_entries(content_hash);
111
- CREATE INDEX IF NOT EXISTS idx_te_chunk ON transcript_entries(session_id, chunk_index);
112
- CREATE INDEX IF NOT EXISTS idx_te_created ON transcript_entries(created_at);
113
- `);
114
-
115
- // Schema migration: add confidence + embedding columns (self-learning support)
116
- try {
117
- this.db.exec(`ALTER TABLE transcript_entries ADD COLUMN confidence REAL NOT NULL DEFAULT 0.8`);
118
- } catch { /* column already exists */ }
119
- try {
120
- this.db.exec(`ALTER TABLE transcript_entries ADD COLUMN embedding BLOB`);
121
- } catch { /* column already exists */ }
122
- try {
123
- this.db.exec(`CREATE INDEX IF NOT EXISTS idx_te_confidence ON transcript_entries(confidence)`);
124
- } catch { /* index already exists */ }
125
-
126
- // Prepare statements for reuse
127
- this._stmts = {
128
- insert: this.db.prepare(`
129
- INSERT OR IGNORE INTO transcript_entries
130
- (id, key, content, type, namespace, tags, metadata, access_level,
131
- created_at, updated_at, version, access_count, last_accessed_at,
132
- content_hash, session_id, chunk_index, summary)
133
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
134
- `),
135
- queryByNamespace: this.db.prepare(
136
- 'SELECT * FROM transcript_entries WHERE namespace = ? ORDER BY created_at DESC'
137
- ),
138
- queryBySession: this.db.prepare(
139
- 'SELECT * FROM transcript_entries WHERE namespace = ? AND session_id = ? ORDER BY chunk_index DESC'
140
- ),
141
- countAll: this.db.prepare('SELECT COUNT(*) as cnt FROM transcript_entries'),
142
- countByNamespace: this.db.prepare(
143
- 'SELECT COUNT(*) as cnt FROM transcript_entries WHERE namespace = ?'
144
- ),
145
- hashExists: this.db.prepare(
146
- 'SELECT 1 FROM transcript_entries WHERE content_hash = ? LIMIT 1'
147
- ),
148
- listNamespaces: this.db.prepare(
149
- 'SELECT DISTINCT namespace FROM transcript_entries'
150
- ),
151
- listSessions: this.db.prepare(
152
- 'SELECT session_id, COUNT(*) as cnt FROM transcript_entries WHERE namespace = ? GROUP BY session_id ORDER BY MAX(created_at) DESC'
153
- ),
154
- };
155
-
156
- this._bulkInsert = this.db.transaction((entries) => {
157
- for (const e of entries) {
158
- this._stmts.insert.run(
159
- e.id, e.key, e.content, e.type, e.namespace,
160
- JSON.stringify(e.tags), JSON.stringify(e.metadata), e.accessLevel,
161
- e.createdAt, e.updatedAt, e.version, e.accessCount, e.lastAccessedAt,
162
- e.metadata?.contentHash || null,
163
- e.metadata?.sessionId || null,
164
- e.metadata?.chunkIndex ?? null,
165
- e.metadata?.summary || null
166
- );
167
- }
168
- });
169
-
170
- // Optimization statements
171
- this._stmts.markAccessed = this.db.prepare(
172
- 'UPDATE transcript_entries SET access_count = access_count + 1, last_accessed_at = ? WHERE id = ?'
173
- );
174
- this._stmts.pruneStale = this.db.prepare(
175
- 'DELETE FROM transcript_entries WHERE namespace = ? AND access_count = 0 AND created_at < ?'
176
- );
177
- this._stmts.queryByImportance = this.db.prepare(`
178
- SELECT *, (
179
- (CAST(access_count AS REAL) + 1) *
180
- (1.0 / (1.0 + (? - created_at) / 86400000.0)) *
181
- (CASE WHEN json_array_length(json_extract(metadata, '$.toolNames')) > 0 THEN 1.5 ELSE 1.0 END) *
182
- (CASE WHEN json_array_length(json_extract(metadata, '$.filePaths')) > 0 THEN 1.3 ELSE 1.0 END)
183
- ) AS importance_score
184
- FROM transcript_entries
185
- WHERE namespace = ? AND session_id = ?
186
- ORDER BY importance_score DESC
187
- `);
188
- this._stmts.allForSync = this.db.prepare(
189
- 'SELECT * FROM transcript_entries WHERE namespace = ? ORDER BY created_at ASC'
190
- );
191
- }
192
-
193
- async store(entry) {
194
- this._stmts.insert.run(
195
- entry.id, entry.key, entry.content, entry.type, entry.namespace,
196
- JSON.stringify(entry.tags), JSON.stringify(entry.metadata), entry.accessLevel,
197
- entry.createdAt, entry.updatedAt, entry.version, entry.accessCount, entry.lastAccessedAt,
198
- entry.metadata?.contentHash || null,
199
- entry.metadata?.sessionId || null,
200
- entry.metadata?.chunkIndex ?? null,
201
- entry.metadata?.summary || null
202
- );
203
- }
204
-
205
- async bulkInsert(entries) {
206
- this._bulkInsert(entries);
207
- }
208
-
209
- async query(opts) {
210
- let rows;
211
- if (opts?.namespace && opts?.sessionId) {
212
- rows = this._stmts.queryBySession.all(opts.namespace, opts.sessionId);
213
- } else if (opts?.namespace) {
214
- rows = this._stmts.queryByNamespace.all(opts.namespace);
215
- } else {
216
- rows = this.db.prepare('SELECT * FROM transcript_entries ORDER BY created_at DESC').all();
217
- }
218
- return rows.map(r => this._rowToEntry(r));
219
- }
220
-
221
- async queryBySession(namespace, sessionId) {
222
- const rows = this._stmts.queryBySession.all(namespace, sessionId);
223
- return rows.map(r => this._rowToEntry(r));
224
- }
225
-
226
- hashExists(hash) {
227
- return !!this._stmts.hashExists.get(hash);
228
- }
229
-
230
- async count(namespace) {
231
- if (namespace) {
232
- return this._stmts.countByNamespace.get(namespace).cnt;
233
- }
234
- return this._stmts.countAll.get().cnt;
235
- }
236
-
237
- async listNamespaces() {
238
- return this._stmts.listNamespaces.all().map(r => r.namespace);
239
- }
240
-
241
- async listSessions(namespace) {
242
- return this._stmts.listSessions.all(namespace || NAMESPACE);
243
- }
244
-
245
- markAccessed(ids) {
246
- const now = Date.now();
247
- const boostStmt = this.db.prepare(
248
- 'UPDATE transcript_entries SET access_count = access_count + 1, last_accessed_at = ?, confidence = MIN(1.0, confidence + 0.03) WHERE id = ?'
249
- );
250
- for (const id of ids) {
251
- boostStmt.run(now, id);
252
- }
253
- }
254
-
255
- /**
256
- * Confidence decay: reduce confidence for entries not accessed recently.
257
- * Decay rate: 0.5% per hour (matches LearningBridge default).
258
- * Entries with confidence below 0.1 are floor-clamped.
259
- */
260
- decayConfidence(namespace, hoursElapsed = 1) {
261
- const decayRate = 0.005 * hoursElapsed;
262
- const result = this.db.prepare(
263
- 'UPDATE transcript_entries SET confidence = MAX(0.1, confidence - ?) WHERE namespace = ? AND confidence > 0.1'
264
- ).run(decayRate, namespace || NAMESPACE);
265
- return result.changes;
266
- }
267
-
268
- /**
269
- * Store embedding blob for an entry (768-dim Float32Array → Buffer).
270
- */
271
- storeEmbedding(id, embedding) {
272
- const buf = Buffer.from(embedding.buffer, embedding.byteOffset, embedding.byteLength);
273
- this.db.prepare('UPDATE transcript_entries SET embedding = ? WHERE id = ?').run(buf, id);
274
- }
275
-
276
- /**
277
- * Cosine similarity search across all entries with embeddings.
278
- * Handles both 384-dim (ONNX) and 768-dim (legacy hash) embeddings.
279
- * Returns top-k entries ranked by similarity to the query embedding.
280
- */
281
- semanticSearch(queryEmbedding, k = 10, namespace) {
282
- const rows = this.db.prepare(
283
- 'SELECT id, embedding, summary, session_id, chunk_index, confidence, access_count FROM transcript_entries WHERE namespace = ? AND embedding IS NOT NULL'
284
- ).all(namespace || NAMESPACE);
285
-
286
- const queryDim = queryEmbedding.length;
287
- const scored = [];
288
- for (const row of rows) {
289
- if (!row.embedding) continue;
290
- const stored = new Float32Array(row.embedding.buffer, row.embedding.byteOffset, row.embedding.byteLength / 4);
291
- // Only compare if dimensions match
292
- if (stored.length !== queryDim) continue;
293
- let dot = 0;
294
- for (let i = 0; i < queryDim; i++) {
295
- dot += queryEmbedding[i] * stored[i];
296
- }
297
- // Boost by confidence (self-learning signal)
298
- const score = dot * (row.confidence || 0.8);
299
- scored.push({ id: row.id, score, summary: row.summary, sessionId: row.session_id, chunkIndex: row.chunk_index, confidence: row.confidence, accessCount: row.access_count });
300
- }
301
-
302
- scored.sort((a, b) => b.score - a.score);
303
- return scored.slice(0, k);
304
- }
305
-
306
- /**
307
- * Smart pruning: prune by confidence instead of just age.
308
- * Removes entries with confidence <= threshold AND access_count = 0.
309
- */
310
- pruneByConfidence(namespace, threshold = 0.2) {
311
- const result = this.db.prepare(
312
- 'DELETE FROM transcript_entries WHERE namespace = ? AND confidence <= ? AND access_count = 0'
313
- ).run(namespace || NAMESPACE, threshold);
314
- return result.changes;
315
- }
316
-
317
- pruneStale(namespace, maxAgeDays) {
318
- const cutoff = Date.now() - (maxAgeDays * 24 * 60 * 60 * 1000);
319
- const result = this._stmts.pruneStale.run(namespace || NAMESPACE, cutoff);
320
- return result.changes;
321
- }
322
-
323
- queryByImportance(namespace, sessionId) {
324
- const now = Date.now();
325
- const rows = this._stmts.queryByImportance.all(now, namespace, sessionId);
326
- return rows.map(r => ({ ...this._rowToEntry(r), importanceScore: r.importance_score }));
327
- }
328
-
329
- allForSync(namespace) {
330
- const rows = this._stmts.allForSync.all(namespace || NAMESPACE);
331
- return rows.map(r => this._rowToEntry(r));
332
- }
333
-
334
- async shutdown() {
335
- if (this.db) {
336
- this.db.pragma('optimize');
337
- this.db.close();
338
- this.db = null;
339
- }
340
- }
341
-
342
- _rowToEntry(row) {
343
- return {
344
- id: row.id,
345
- key: row.key,
346
- content: row.content,
347
- type: row.type,
348
- namespace: row.namespace,
349
- tags: JSON.parse(row.tags),
350
- metadata: JSON.parse(row.metadata),
351
- accessLevel: row.access_level,
352
- createdAt: row.created_at,
353
- updatedAt: row.updated_at,
354
- version: row.version,
355
- accessCount: row.access_count,
356
- lastAccessedAt: row.last_accessed_at,
357
- references: [],
358
- };
359
- }
360
- }
361
-
362
- // ============================================================================
363
- // JSON File Backend (fallback when better-sqlite3 unavailable)
364
- // ============================================================================
365
-
366
- class JsonFileBackend {
367
- constructor(filePath) {
368
- this.filePath = filePath;
369
- this.entries = new Map();
370
- }
371
-
372
- async initialize() {
373
- if (existsSync(this.filePath)) {
374
- try {
375
- const data = JSON.parse(readFileSync(this.filePath, 'utf-8'));
376
- if (Array.isArray(data)) {
377
- for (const entry of data) this.entries.set(entry.id, entry);
378
- }
379
- } catch { /* start fresh */ }
380
- }
381
- }
382
-
383
- async store(entry) { this.entries.set(entry.id, entry); this._persist(); }
384
-
385
- async bulkInsert(entries) {
386
- for (const e of entries) this.entries.set(e.id, e);
387
- this._persist();
388
- }
389
-
390
- async query(opts) {
391
- let results = [...this.entries.values()];
392
- if (opts?.namespace) results = results.filter(e => e.namespace === opts.namespace);
393
- if (opts?.type) results = results.filter(e => e.type === opts.type);
394
- if (opts?.limit) results = results.slice(0, opts.limit);
395
- return results;
396
- }
397
-
398
- async queryBySession(namespace, sessionId) {
399
- return [...this.entries.values()]
400
- .filter(e => e.namespace === namespace && e.metadata?.sessionId === sessionId)
401
- .sort((a, b) => (b.metadata?.chunkIndex ?? 0) - (a.metadata?.chunkIndex ?? 0));
402
- }
403
-
404
- hashExists(hash) {
405
- for (const e of this.entries.values()) {
406
- if (e.metadata?.contentHash === hash) return true;
407
- }
408
- return false;
409
- }
410
-
411
- async count(namespace) {
412
- if (!namespace) return this.entries.size;
413
- let n = 0;
414
- for (const e of this.entries.values()) {
415
- if (e.namespace === namespace) n++;
416
- }
417
- return n;
418
- }
419
-
420
- async listNamespaces() {
421
- const ns = new Set();
422
- for (const e of this.entries.values()) ns.add(e.namespace || 'default');
423
- return [...ns];
424
- }
425
-
426
- async listSessions(namespace) {
427
- const sessions = new Map();
428
- for (const e of this.entries.values()) {
429
- if (e.namespace === (namespace || NAMESPACE) && e.metadata?.sessionId) {
430
- sessions.set(e.metadata.sessionId, (sessions.get(e.metadata.sessionId) || 0) + 1);
431
- }
432
- }
433
- return [...sessions.entries()].map(([session_id, cnt]) => ({ session_id, cnt }));
434
- }
435
-
436
- async shutdown() { this._persist(); }
437
-
438
- _persist() {
439
- try {
440
- writeFileSync(this.filePath, JSON.stringify([...this.entries.values()], null, 2), 'utf-8');
441
- } catch { /* best effort */ }
442
- }
443
- }
444
-
445
- // ============================================================================
446
- // RuVector PostgreSQL Backend (optional, TB-scale, GNN-enhanced)
447
- // ============================================================================
448
-
449
- class RuVectorBackend {
450
- constructor(config) {
451
- this.config = config;
452
- this.pool = null;
453
- }
454
-
455
- async initialize() {
456
- const pg = await import('pg');
457
- const Pool = pg.default?.Pool || pg.Pool;
458
- this.pool = new Pool({
459
- host: this.config.host,
460
- port: this.config.port || 5432,
461
- database: this.config.database,
462
- user: this.config.user,
463
- password: this.config.password,
464
- ssl: this.config.ssl || false,
465
- max: 3,
466
- idleTimeoutMillis: 10000,
467
- connectionTimeoutMillis: 3000,
468
- application_name: 'monomind-context-persistence',
469
- });
470
-
471
- // Test connection and create schema
472
- const client = await this.pool.connect();
473
- try {
474
- await client.query(`
475
- CREATE TABLE IF NOT EXISTS transcript_entries (
476
- id TEXT PRIMARY KEY,
477
- key TEXT NOT NULL,
478
- content TEXT NOT NULL,
479
- type TEXT NOT NULL DEFAULT 'episodic',
480
- namespace TEXT NOT NULL DEFAULT 'transcript-archive',
481
- tags JSONB NOT NULL DEFAULT '[]',
482
- metadata JSONB NOT NULL DEFAULT '{}',
483
- access_level TEXT NOT NULL DEFAULT 'private',
484
- created_at BIGINT NOT NULL,
485
- updated_at BIGINT NOT NULL,
486
- version INTEGER NOT NULL DEFAULT 1,
487
- access_count INTEGER NOT NULL DEFAULT 0,
488
- last_accessed_at BIGINT NOT NULL,
489
- content_hash TEXT,
490
- session_id TEXT,
491
- chunk_index INTEGER,
492
- summary TEXT,
493
- embedding vector(768)
494
- );
495
-
496
- CREATE INDEX IF NOT EXISTS idx_te_namespace ON transcript_entries(namespace);
497
- CREATE INDEX IF NOT EXISTS idx_te_session ON transcript_entries(session_id);
498
- CREATE INDEX IF NOT EXISTS idx_te_hash ON transcript_entries(content_hash);
499
- CREATE INDEX IF NOT EXISTS idx_te_chunk ON transcript_entries(session_id, chunk_index);
500
- CREATE INDEX IF NOT EXISTS idx_te_created ON transcript_entries(created_at);
501
- `);
502
- } finally {
503
- client.release();
504
- }
505
- }
506
-
507
- async store(entry) {
508
- const embeddingArr = entry._embedding
509
- ? `[${Array.from(entry._embedding).join(',')}]`
510
- : null;
511
- await this.pool.query(
512
- `INSERT INTO transcript_entries
513
- (id, key, content, type, namespace, tags, metadata, access_level,
514
- created_at, updated_at, version, access_count, last_accessed_at,
515
- content_hash, session_id, chunk_index, summary, embedding)
516
- VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18)
517
- ON CONFLICT (id) DO NOTHING`,
518
- [
519
- entry.id, entry.key, entry.content, entry.type, entry.namespace,
520
- JSON.stringify(entry.tags), JSON.stringify(entry.metadata), entry.accessLevel,
521
- entry.createdAt, entry.updatedAt, entry.version, entry.accessCount, entry.lastAccessedAt,
522
- entry.metadata?.contentHash || null,
523
- entry.metadata?.sessionId || null,
524
- entry.metadata?.chunkIndex ?? null,
525
- entry.metadata?.summary || null,
526
- embeddingArr,
527
- ]
528
- );
529
- }
530
-
531
- async bulkInsert(entries) {
532
- const client = await this.pool.connect();
533
- try {
534
- await client.query('BEGIN');
535
- for (const entry of entries) {
536
- const embeddingArr = entry._embedding
537
- ? `[${Array.from(entry._embedding).join(',')}]`
538
- : null;
539
- await client.query(
540
- `INSERT INTO transcript_entries
541
- (id, key, content, type, namespace, tags, metadata, access_level,
542
- created_at, updated_at, version, access_count, last_accessed_at,
543
- content_hash, session_id, chunk_index, summary, embedding)
544
- VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18)
545
- ON CONFLICT (id) DO NOTHING`,
546
- [
547
- entry.id, entry.key, entry.content, entry.type, entry.namespace,
548
- JSON.stringify(entry.tags), JSON.stringify(entry.metadata), entry.accessLevel,
549
- entry.createdAt, entry.updatedAt, entry.version, entry.accessCount, entry.lastAccessedAt,
550
- entry.metadata?.contentHash || null,
551
- entry.metadata?.sessionId || null,
552
- entry.metadata?.chunkIndex ?? null,
553
- entry.metadata?.summary || null,
554
- embeddingArr,
555
- ]
556
- );
557
- }
558
- await client.query('COMMIT');
559
- } catch (err) {
560
- await client.query('ROLLBACK');
561
- throw err;
562
- } finally {
563
- client.release();
564
- }
565
- }
566
-
567
- async query(opts) {
568
- let sql = 'SELECT * FROM transcript_entries';
569
- const params = [];
570
- const clauses = [];
571
- if (opts?.namespace) { params.push(opts.namespace); clauses.push(`namespace = $${params.length}`); }
572
- if (clauses.length) sql += ' WHERE ' + clauses.join(' AND ');
573
- sql += ' ORDER BY created_at DESC';
574
- if (opts?.limit) { params.push(opts.limit); sql += ` LIMIT $${params.length}`; }
575
- const { rows } = await this.pool.query(sql, params);
576
- return rows.map(r => this._rowToEntry(r));
577
- }
578
-
579
- async queryBySession(namespace, sessionId) {
580
- const { rows } = await this.pool.query(
581
- 'SELECT * FROM transcript_entries WHERE namespace = $1 AND session_id = $2 ORDER BY chunk_index DESC',
582
- [namespace, sessionId]
583
- );
584
- return rows.map(r => this._rowToEntry(r));
585
- }
586
-
587
- hashExists(hash) {
588
- // Synchronous check not possible with pg — use a cached check
589
- // The bulkInsert uses ON CONFLICT DO NOTHING for dedup at DB level
590
- return false;
591
- }
592
-
593
- async hashExistsAsync(hash) {
594
- const { rows } = await this.pool.query(
595
- 'SELECT 1 FROM transcript_entries WHERE content_hash = $1 LIMIT 1',
596
- [hash]
597
- );
598
- return rows.length > 0;
599
- }
600
-
601
- async count(namespace) {
602
- const sql = namespace
603
- ? 'SELECT COUNT(*) as cnt FROM transcript_entries WHERE namespace = $1'
604
- : 'SELECT COUNT(*) as cnt FROM transcript_entries';
605
- const params = namespace ? [namespace] : [];
606
- const { rows } = await this.pool.query(sql, params);
607
- return parseInt(rows[0].cnt, 10);
608
- }
609
-
610
- async listNamespaces() {
611
- const { rows } = await this.pool.query('SELECT DISTINCT namespace FROM transcript_entries');
612
- return rows.map(r => r.namespace);
613
- }
614
-
615
- async listSessions(namespace) {
616
- const { rows } = await this.pool.query(
617
- `SELECT session_id, COUNT(*) as cnt FROM transcript_entries
618
- WHERE namespace = $1 GROUP BY session_id ORDER BY MAX(created_at) DESC`,
619
- [namespace || NAMESPACE]
620
- );
621
- return rows.map(r => ({ session_id: r.session_id, cnt: parseInt(r.cnt, 10) }));
622
- }
623
-
624
- async markAccessed(ids) {
625
- const now = Date.now();
626
- for (const id of ids) {
627
- await this.pool.query(
628
- 'UPDATE transcript_entries SET access_count = access_count + 1, last_accessed_at = $1 WHERE id = $2',
629
- [now, id]
630
- );
631
- }
632
- }
633
-
634
- async pruneStale(namespace, maxAgeDays) {
635
- const cutoff = Date.now() - (maxAgeDays * 24 * 60 * 60 * 1000);
636
- const { rowCount } = await this.pool.query(
637
- 'DELETE FROM transcript_entries WHERE namespace = $1 AND access_count = 0 AND created_at < $2',
638
- [namespace || NAMESPACE, cutoff]
639
- );
640
- return rowCount;
641
- }
642
-
643
- async queryByImportance(namespace, sessionId) {
644
- const now = Date.now();
645
- const { rows } = await this.pool.query(`
646
- SELECT *, (
647
- (CAST(access_count AS REAL) + 1) *
648
- (1.0 / (1.0 + ($1 - created_at) / 86400000.0)) *
649
- (CASE WHEN jsonb_array_length(metadata->'toolNames') > 0 THEN 1.5 ELSE 1.0 END) *
650
- (CASE WHEN jsonb_array_length(metadata->'filePaths') > 0 THEN 1.3 ELSE 1.0 END)
651
- ) AS importance_score
652
- FROM transcript_entries
653
- WHERE namespace = $2 AND session_id = $3
654
- ORDER BY importance_score DESC
655
- `, [now, namespace, sessionId]);
656
- return rows.map(r => ({ ...this._rowToEntry(r), importanceScore: r.importance_score }));
657
- }
658
-
659
- async shutdown() {
660
- if (this.pool) {
661
- await this.pool.end();
662
- this.pool = null;
663
- }
664
- }
665
-
666
- _rowToEntry(row) {
667
- return {
668
- id: row.id,
669
- key: row.key,
670
- content: row.content,
671
- type: row.type,
672
- namespace: row.namespace,
673
- tags: typeof row.tags === 'string' ? JSON.parse(row.tags) : row.tags,
674
- metadata: typeof row.metadata === 'string' ? JSON.parse(row.metadata) : row.metadata,
675
- accessLevel: row.access_level,
676
- createdAt: parseInt(row.created_at, 10),
677
- updatedAt: parseInt(row.updated_at, 10),
678
- version: row.version,
679
- accessCount: row.access_count,
680
- lastAccessedAt: parseInt(row.last_accessed_at, 10),
681
- references: [],
682
- };
683
- }
684
- }
685
-
686
- /**
687
- * Parse RuVector config from environment variables.
688
- * Returns null if required vars are not set.
689
- */
690
- function getRuVectorConfig() {
691
- const host = process.env.RUVECTOR_HOST || process.env.PGHOST;
692
- const database = process.env.RUVECTOR_DATABASE || process.env.PGDATABASE;
693
- const user = process.env.RUVECTOR_USER || process.env.PGUSER;
694
- const password = process.env.RUVECTOR_PASSWORD || process.env.PGPASSWORD;
695
-
696
- if (!host || !database || !user) return null;
697
-
698
- return {
699
- host,
700
- port: parseInt(process.env.RUVECTOR_PORT || process.env.PGPORT || '5432', 10),
701
- database,
702
- user,
703
- password: password || '',
704
- ssl: process.env.RUVECTOR_SSL === 'true',
705
- };
706
- }
707
-
708
- // ============================================================================
709
- // Backend resolution: SQLite > RuVector PostgreSQL > AgentDB > JSON
710
- // ============================================================================
711
-
712
- async function resolveBackend() {
713
- // Tier 1: better-sqlite3 (native, fastest, local)
714
- try {
715
- const backend = new SQLiteBackend(ARCHIVE_DB_PATH);
716
- await backend.initialize();
717
- return { backend, type: 'sqlite' };
718
- } catch { /* fall through */ }
719
-
720
- // Tier 2: RuVector PostgreSQL (TB-scale, vector search, GNN)
721
- try {
722
- const rvConfig = getRuVectorConfig();
723
- if (rvConfig) {
724
- const backend = new RuVectorBackend(rvConfig);
725
- await backend.initialize();
726
- return { backend, type: 'ruvector' };
727
- }
728
- } catch { /* fall through */ }
729
-
730
- // Tier 3: AgentDB from @monomind/memory (HNSW)
731
- try {
732
- const localDist = join(PROJECT_ROOT, 'packages/@monomind/memory/dist/index.js');
733
- let memPkg = null;
734
- if (existsSync(localDist)) {
735
- memPkg = await import(`file://${localDist}`);
736
- } else {
737
- memPkg = await import('@monomind/memory');
738
- }
739
- if (memPkg?.AgentDBBackend) {
740
- const backend = new memPkg.AgentDBBackend();
741
- await backend.initialize();
742
- return { backend, type: 'agentdb' };
743
- }
744
- } catch { /* fall through */ }
745
-
746
- // Tier 4: JSON file (always works)
747
- const backend = new JsonFileBackend(ARCHIVE_JSON_PATH);
748
- await backend.initialize();
749
- return { backend, type: 'json' };
750
- }
751
-
752
- // ============================================================================
753
- // ONNX Embedding (384-dim, all-MiniLM-L6-v2 via @xenova/transformers)
754
- // ============================================================================
755
-
756
- const EMBEDDING_DIM = 384; // ONNX all-MiniLM-L6-v2 output dimension
757
- let _onnxPipeline = null;
758
- let _onnxFailed = false;
759
-
760
- /**
761
- * Initialize ONNX embedding pipeline (lazy, cached).
762
- * Returns null if @xenova/transformers is not available.
763
- */
764
- async function getOnnxPipeline() {
765
- if (_onnxFailed) return null;
766
- if (_onnxPipeline) return _onnxPipeline;
767
- try {
768
- const { pipeline } = await import('@xenova/transformers');
769
- _onnxPipeline = await pipeline('feature-extraction', 'Xenova/all-MiniLM-L6-v2');
770
- return _onnxPipeline;
771
- } catch {
772
- _onnxFailed = true;
773
- return null;
774
- }
775
- }
776
-
777
- /**
778
- * Generate ONNX embedding (384-dim, high quality semantic vectors).
779
- * Falls back to hash embedding if ONNX is unavailable.
780
- */
781
- async function createEmbedding(text) {
782
- // Try ONNX first (384-dim, real semantic understanding)
783
- const pipe = await getOnnxPipeline();
784
- if (pipe) {
785
- try {
786
- const truncated = text.slice(0, 512); // MiniLM max ~512 tokens
787
- const output = await pipe(truncated, { pooling: 'mean', normalize: true });
788
- return { embedding: new Float32Array(output.data), dim: 384, method: 'onnx' };
789
- } catch { /* fall through to hash */ }
790
- }
791
- // Fallback: hash embedding (384-dim to match ONNX dimension)
792
- return { embedding: createHashEmbedding(text, 384), dim: 384, method: 'hash' };
793
- }
794
-
795
- // ============================================================================
796
- // Hash embedding fallback (deterministic, sub-millisecond)
797
- // ============================================================================
798
-
799
- function createHashEmbedding(text, dimensions = 384) {
800
- const embedding = new Float32Array(dimensions);
801
- const normalized = text.toLowerCase().trim();
802
- for (let i = 0; i < dimensions; i++) {
803
- let hash = 0;
804
- for (let j = 0; j < normalized.length; j++) {
805
- hash = ((hash << 5) - hash + normalized.charCodeAt(j) * (i + 1)) | 0;
806
- }
807
- embedding[i] = (Math.sin(hash) + 1) / 2;
808
- }
809
- let norm = 0;
810
- for (let i = 0; i < dimensions; i++) norm += embedding[i] * embedding[i];
811
- norm = Math.sqrt(norm);
812
- if (norm > 0) for (let i = 0; i < dimensions; i++) embedding[i] /= norm;
813
- return embedding;
814
- }
815
-
816
- // ============================================================================
817
- // Content hash for dedup
818
- // ============================================================================
819
-
820
- function hashContent(content) {
821
- return createHash('sha256').update(content).digest('hex');
822
- }
823
-
824
- // ============================================================================
825
- // Read stdin with timeout (hooks receive JSON input on stdin)
826
- // ============================================================================
827
-
828
- function readStdin(timeoutMs = 100) {
829
- return new Promise((resolve) => {
830
- let data = '';
831
- const timer = setTimeout(() => {
832
- process.stdin.removeAllListeners();
833
- resolve(data ? JSON.parse(data) : null);
834
- }, timeoutMs);
835
-
836
- if (process.stdin.isTTY) {
837
- clearTimeout(timer);
838
- resolve(null);
839
- return;
840
- }
841
-
842
- process.stdin.setEncoding('utf-8');
843
- process.stdin.on('data', (chunk) => { data += chunk; });
844
- process.stdin.on('end', () => {
845
- clearTimeout(timer);
846
- try { resolve(data ? JSON.parse(data) : null); }
847
- catch { resolve(null); }
848
- });
849
- process.stdin.on('error', () => {
850
- clearTimeout(timer);
851
- resolve(null);
852
- });
853
- process.stdin.resume();
854
- });
855
- }
856
-
857
- // ============================================================================
858
- // Transcript parsing
859
- // ============================================================================
860
-
861
- function parseTranscript(transcriptPath) {
862
- if (!existsSync(transcriptPath)) return [];
863
- const content = readFileSync(transcriptPath, 'utf-8');
864
- const lines = content.split('\n').filter(Boolean);
865
- const messages = [];
866
- for (const line of lines) {
867
- try {
868
- const parsed = JSON.parse(line);
869
- // SDK transcript wraps messages: { type: "user"|"A", message: { role, content } }
870
- // Unwrap to get the inner API message with role/content
871
- if (parsed.message && parsed.message.role) {
872
- messages.push(parsed.message);
873
- } else if (parsed.role) {
874
- // Already in API message format (e.g. from tests)
875
- messages.push(parsed);
876
- }
877
- // Skip non-message entries (progress, file-history-snapshot, queue-operation)
878
- } catch { /* skip malformed lines */ }
879
- }
880
- return messages;
881
- }
882
-
883
- // ============================================================================
884
- // Extract text content from message content blocks
885
- // ============================================================================
886
-
887
- function extractTextContent(message) {
888
- if (!message) return '';
889
- if (typeof message.content === 'string') return message.content;
890
- if (Array.isArray(message.content)) {
891
- return message.content
892
- .filter(b => b.type === 'text')
893
- .map(b => b.text || '')
894
- .join('\n');
895
- }
896
- if (typeof message.text === 'string') return message.text;
897
- return '';
898
- }
899
-
900
- // ============================================================================
901
- // Extract tool calls from assistant message
902
- // ============================================================================
903
-
904
- function extractToolCalls(message) {
905
- if (!message || !Array.isArray(message.content)) return [];
906
- return message.content
907
- .filter(b => b.type === 'tool_use')
908
- .map(b => ({
909
- name: b.name || 'unknown',
910
- input: b.input || {},
911
- }));
912
- }
913
-
914
- // ============================================================================
915
- // Extract file paths from tool calls
916
- // ============================================================================
917
-
918
- function extractFilePaths(toolCalls) {
919
- const paths = new Set();
920
- for (const tc of toolCalls) {
921
- if (tc.input?.file_path) paths.add(tc.input.file_path);
922
- if (tc.input?.path) paths.add(tc.input.path);
923
- if (tc.input?.notebook_path) paths.add(tc.input.notebook_path);
924
- }
925
- return [...paths];
926
- }
927
-
928
- // ============================================================================
929
- // Chunk transcript into conversation turns
930
- // ============================================================================
931
-
932
- function chunkTranscript(messages) {
933
- const relevant = messages.filter(
934
- m => m.role === 'user' || m.role === 'assistant'
935
- );
936
- const capped = relevant.slice(-MAX_MESSAGES);
937
-
938
- const chunks = [];
939
- let currentChunk = null;
940
-
941
- for (const msg of capped) {
942
- if (msg.role === 'user') {
943
- const isSynthetic = Array.isArray(msg.content) &&
944
- msg.content.every(b => b.type === 'tool_result');
945
- if (isSynthetic && currentChunk) continue;
946
- if (currentChunk) chunks.push(currentChunk);
947
- currentChunk = {
948
- userMessage: msg,
949
- assistantMessage: null,
950
- toolCalls: [],
951
- turnIndex: chunks.length,
952
- };
953
- } else if (msg.role === 'assistant' && currentChunk) {
954
- currentChunk.assistantMessage = msg;
955
- currentChunk.toolCalls = extractToolCalls(msg);
956
- }
957
- }
958
-
959
- if (currentChunk) chunks.push(currentChunk);
960
- return chunks;
961
- }
962
-
963
- // ============================================================================
964
- // Extract summary from chunk (no LLM, extractive only)
965
- // ============================================================================
966
-
967
- function extractSummary(chunk) {
968
- const parts = [];
969
-
970
- const userText = extractTextContent(chunk.userMessage);
971
- const firstUserLine = userText.split('\n').find(l => l.trim()) || '';
972
- if (firstUserLine) parts.push(firstUserLine.slice(0, 100));
973
-
974
- const toolNames = [...new Set(chunk.toolCalls.map(tc => tc.name))];
975
- if (toolNames.length) parts.push('Tools: ' + toolNames.join(', '));
976
-
977
- const filePaths = extractFilePaths(chunk.toolCalls);
978
- if (filePaths.length) {
979
- const shortPaths = filePaths.slice(0, 5).map(p => {
980
- const segs = p.split('/');
981
- return segs.length > 2 ? '.../' + segs.slice(-2).join('/') : p;
982
- });
983
- parts.push('Files: ' + shortPaths.join(', '));
984
- }
985
-
986
- const assistantText = extractTextContent(chunk.assistantMessage);
987
- const assistantLines = assistantText.split('\n').filter(l => l.trim()).slice(0, 2);
988
- if (assistantLines.length) parts.push(assistantLines.join(' ').slice(0, 120));
989
-
990
- return parts.join(' | ').slice(0, 300);
991
- }
992
-
993
- // ============================================================================
994
- // Generate unique ID
995
- // ============================================================================
996
-
997
- let idCounter = 0;
998
- function generateId() {
999
- return `ctx-${Date.now()}-${++idCounter}-${Math.random().toString(36).slice(2, 8)}`;
1000
- }
1001
-
1002
- // ============================================================================
1003
- // Build MemoryEntry from chunk
1004
- // ============================================================================
1005
-
1006
- function buildEntry(chunk, sessionId, trigger, timestamp) {
1007
- const userText = extractTextContent(chunk.userMessage);
1008
- const assistantText = extractTextContent(chunk.assistantMessage);
1009
- const fullContent = `User: ${userText}\n\nAssistant: ${assistantText}`;
1010
- const toolNames = [...new Set(chunk.toolCalls.map(tc => tc.name))];
1011
- const filePaths = extractFilePaths(chunk.toolCalls);
1012
- const summary = extractSummary(chunk);
1013
- const contentHash = hashContent(fullContent);
1014
-
1015
- const now = Date.now();
1016
- return {
1017
- id: generateId(),
1018
- key: `transcript:${sessionId}:${chunk.turnIndex}:${timestamp}`,
1019
- content: fullContent,
1020
- type: 'episodic',
1021
- namespace: NAMESPACE,
1022
- tags: ['transcript', 'compaction', sessionId, ...toolNames],
1023
- metadata: {
1024
- sessionId,
1025
- chunkIndex: chunk.turnIndex,
1026
- trigger,
1027
- timestamp,
1028
- toolNames,
1029
- filePaths,
1030
- summary,
1031
- contentHash,
1032
- turnRange: [chunk.turnIndex, chunk.turnIndex],
1033
- },
1034
- accessLevel: 'private',
1035
- createdAt: now,
1036
- updatedAt: now,
1037
- version: 1,
1038
- references: [],
1039
- accessCount: 0,
1040
- lastAccessedAt: now,
1041
- };
1042
- }
1043
-
1044
- // ============================================================================
1045
- // Store chunks with dedup (uses indexed hash lookup for SQLite)
1046
- // ============================================================================
1047
-
1048
- async function storeChunks(backend, chunks, sessionId, trigger) {
1049
- const timestamp = new Date().toISOString();
1050
-
1051
- const entries = [];
1052
- for (const chunk of chunks) {
1053
- const entry = buildEntry(chunk, sessionId, trigger, timestamp);
1054
- // Fast hash-based dedup (indexed lookup in SQLite, scan in JSON)
1055
- if (!backend.hashExists(entry.metadata.contentHash)) {
1056
- entries.push(entry);
1057
- }
1058
- }
1059
-
1060
- if (entries.length > 0) {
1061
- await backend.bulkInsert(entries);
1062
- }
1063
-
1064
- return { stored: entries.length, deduped: chunks.length - entries.length };
1065
- }
1066
-
1067
- // ============================================================================
1068
- // Retrieve context for restoration (uses indexed session query for SQLite)
1069
- // ============================================================================
1070
-
1071
- async function retrieveContext(backend, sessionId, budget) {
1072
- // Use optimized session query if available, otherwise filter manually
1073
- const sessionEntries = backend.queryBySession
1074
- ? await backend.queryBySession(NAMESPACE, sessionId)
1075
- : (await backend.query({ namespace: NAMESPACE }))
1076
- .filter(e => e.metadata?.sessionId === sessionId)
1077
- .sort((a, b) => (b.metadata?.chunkIndex ?? 0) - (a.metadata?.chunkIndex ?? 0));
1078
-
1079
- if (sessionEntries.length === 0) return '';
1080
-
1081
- const lines = [];
1082
- let charCount = 0;
1083
- const header = `## Restored Context (from pre-compaction archive)\n\nPrevious conversation included ${sessionEntries.length} archived turns:\n\n`;
1084
- charCount += header.length;
1085
-
1086
- for (const entry of sessionEntries) {
1087
- const meta = entry.metadata || {};
1088
- const toolStr = meta.toolNames?.length ? ` Tools: ${meta.toolNames.join(', ')}.` : '';
1089
- const fileStr = meta.filePaths?.length ? ` Files: ${meta.filePaths.slice(0, 3).join(', ')}.` : '';
1090
- const line = `- [Turn ${meta.chunkIndex ?? '?'}] ${meta.summary || '(no summary)'}${toolStr}${fileStr}`;
1091
-
1092
- if (charCount + line.length + 1 > budget) break;
1093
- lines.push(line);
1094
- charCount += line.length + 1;
1095
- }
1096
-
1097
- if (lines.length === 0) return '';
1098
-
1099
- const footer = `\n\nFull archive: ${NAMESPACE} namespace in AgentDB (query with session ID: ${sessionId})`;
1100
- return header + lines.join('\n') + footer;
1101
- }
1102
-
1103
- // ============================================================================
1104
- // Build custom compact instructions (exit code 0 stdout)
1105
- // Guides Claude on what to preserve during compaction summary
1106
- // ============================================================================
1107
-
1108
- function buildCompactInstructions(chunks, sessionId, archiveResult) {
1109
- const parts = [];
1110
-
1111
- parts.push('COMPACTION GUIDANCE (from context-persistence-hook):');
1112
- parts.push('');
1113
- parts.push(`All ${chunks.length} conversation turns have been archived to the transcript-archive database.`);
1114
- parts.push(`Session: ${sessionId} | Stored: ${archiveResult.stored} new, ${archiveResult.deduped} deduped.`);
1115
- parts.push('After compaction, archived context will be automatically restored via SessionStart hook.');
1116
- parts.push('');
1117
-
1118
- // Collect unique tools and files across all chunks for preservation hints
1119
- const allTools = new Set();
1120
- const allFiles = new Set();
1121
- const decisions = [];
1122
-
1123
- for (const chunk of chunks) {
1124
- const toolNames = [...new Set(chunk.toolCalls.map(tc => tc.name))];
1125
- for (const t of toolNames) allTools.add(t);
1126
- const filePaths = extractFilePaths(chunk.toolCalls);
1127
- for (const f of filePaths) allFiles.add(f);
1128
-
1129
- // Look for decision indicators in assistant text
1130
- const assistantText = extractTextContent(chunk.assistantMessage);
1131
- if (assistantText) {
1132
- const lower = assistantText.toLowerCase();
1133
- if (lower.includes('decided') || lower.includes('choosing') || lower.includes('approach')
1134
- || lower.includes('instead of') || lower.includes('rather than')) {
1135
- const firstLine = assistantText.split('\n').find(l => l.trim()) || '';
1136
- if (firstLine.length > 10) decisions.push(firstLine.slice(0, 120));
1137
- }
1138
- }
1139
- }
1140
-
1141
- parts.push('PRESERVE in compaction summary:');
1142
-
1143
- if (allFiles.size > 0) {
1144
- const fileList = [...allFiles].slice(0, 15).map(f => {
1145
- const segs = f.split('/');
1146
- return segs.length > 3 ? '.../' + segs.slice(-3).join('/') : f;
1147
- });
1148
- parts.push(`- Files modified/read: ${fileList.join(', ')}`);
1149
- }
1150
-
1151
- if (allTools.size > 0) {
1152
- parts.push(`- Tools used: ${[...allTools].join(', ')}`);
1153
- }
1154
-
1155
- if (decisions.length > 0) {
1156
- parts.push('- Key decisions:');
1157
- for (const d of decisions.slice(0, 5)) {
1158
- parts.push(` * ${d}`);
1159
- }
1160
- }
1161
-
1162
- // Recent turns summary (most important context)
1163
- const recentChunks = chunks.slice(-5);
1164
- if (recentChunks.length > 0) {
1165
- parts.push('');
1166
- parts.push('MOST RECENT TURNS (prioritize preserving):');
1167
- for (const chunk of recentChunks) {
1168
- const userText = extractTextContent(chunk.userMessage);
1169
- const firstLine = userText.split('\n').find(l => l.trim()) || '';
1170
- const toolNames = [...new Set(chunk.toolCalls.map(tc => tc.name))];
1171
- parts.push(`- [Turn ${chunk.turnIndex}] ${firstLine.slice(0, 80)}${toolNames.length ? ` (${toolNames.join(', ')})` : ''}`);
1172
- }
1173
- }
1174
-
1175
- // Cap at budget
1176
- let result = parts.join('\n');
1177
- if (result.length > COMPACT_INSTRUCTION_BUDGET) {
1178
- result = result.slice(0, COMPACT_INSTRUCTION_BUDGET - 3) + '...';
1179
- }
1180
- return result;
1181
- }
1182
-
1183
- // ============================================================================
1184
- // Importance scoring for retrieval ranking
1185
- // ============================================================================
1186
-
1187
- function computeImportance(entry, now) {
1188
- const meta = entry.metadata || {};
1189
- const accessCount = entry.accessCount || 0;
1190
- const createdAt = entry.createdAt || now;
1191
- const ageMs = Math.max(1, now - createdAt);
1192
- const ageDays = ageMs / 86400000;
1193
-
1194
- // Recency: exponential decay, half-life of 7 days
1195
- const recency = Math.exp(-0.693 * ageDays / 7);
1196
-
1197
- // Frequency: log-scaled access count
1198
- const frequency = Math.log2(accessCount + 1) + 1;
1199
-
1200
- // Richness: tool calls and file paths indicate actionable context
1201
- const toolCount = meta.toolNames?.length || 0;
1202
- const fileCount = meta.filePaths?.length || 0;
1203
- const richness = 1.0 + (toolCount > 0 ? 0.5 : 0) + (fileCount > 0 ? 0.3 : 0);
1204
-
1205
- return recency * frequency * richness;
1206
- }
1207
-
1208
- // ============================================================================
1209
- // Smart retrieval: importance-ranked instead of just recency
1210
- // ============================================================================
1211
-
1212
- async function retrieveContextSmart(backend, sessionId, budget) {
1213
- let sessionEntries;
1214
-
1215
- // Use importance-ranked query if backend supports it
1216
- if (backend.queryByImportance) {
1217
- try {
1218
- sessionEntries = backend.queryByImportance(NAMESPACE, sessionId);
1219
- } catch {
1220
- // Fall back to standard query
1221
- sessionEntries = null;
1222
- }
1223
- }
1224
-
1225
- if (!sessionEntries) {
1226
- // Fall back: fetch all, compute importance in JS
1227
- const raw = backend.queryBySession
1228
- ? await backend.queryBySession(NAMESPACE, sessionId)
1229
- : (await backend.query({ namespace: NAMESPACE }))
1230
- .filter(e => e.metadata?.sessionId === sessionId);
1231
-
1232
- const now = Date.now();
1233
- sessionEntries = raw
1234
- .map(e => ({ ...e, importanceScore: computeImportance(e, now) }))
1235
- .sort((a, b) => b.importanceScore - a.importanceScore);
1236
- }
1237
-
1238
- if (sessionEntries.length === 0) return { text: '', accessedIds: [] };
1239
-
1240
- const lines = [];
1241
- const accessedIds = [];
1242
- let charCount = 0;
1243
- const header = `## Restored Context (importance-ranked from archive)\n\nPrevious conversation: ${sessionEntries.length} archived turns, ranked by importance:\n\n`;
1244
- charCount += header.length;
1245
-
1246
- for (const entry of sessionEntries) {
1247
- const meta = entry.metadata || {};
1248
- const score = entry.importanceScore?.toFixed(2) || '?';
1249
- const toolStr = meta.toolNames?.length ? ` Tools: ${meta.toolNames.join(', ')}.` : '';
1250
- const fileStr = meta.filePaths?.length ? ` Files: ${meta.filePaths.slice(0, 3).join(', ')}.` : '';
1251
- const line = `- [Turn ${meta.chunkIndex ?? '?'}, score:${score}] ${meta.summary || '(no summary)'}${toolStr}${fileStr}`;
1252
-
1253
- if (charCount + line.length + 1 > budget) break;
1254
- lines.push(line);
1255
- accessedIds.push(entry.id);
1256
- charCount += line.length + 1;
1257
- }
1258
-
1259
- if (lines.length === 0) return { text: '', accessedIds: [] };
1260
-
1261
- // Cross-session semantic search: find related context from previous sessions
1262
- let crossSessionText = '';
1263
- if (backend.semanticSearch && sessionEntries.length > 0) {
1264
- try {
1265
- // Use the most recent turn's summary as the search query
1266
- const recentSummary = sessionEntries[0]?.metadata?.summary || '';
1267
- if (recentSummary) {
1268
- const crossResults = await crossSessionSearch(backend, recentSummary, sessionId, 3);
1269
- if (crossResults.length > 0) {
1270
- const crossLines = crossResults.map(r =>
1271
- `- [Session ${r.sessionId?.slice(0, 8)}..., turn ${r.chunkIndex ?? '?'}, conf:${(r.confidence || 0).toFixed(2)}] ${r.summary || '(no summary)'}`
1272
- );
1273
- crossSessionText = `\n\nRelated context from previous sessions:\n${crossLines.join('\n')}`;
1274
- }
1275
- }
1276
- } catch { /* cross-session search is best-effort */ }
1277
- }
1278
-
1279
- const footer = `\n\nFull archive: ${NAMESPACE} namespace (session: ${sessionId}). ${sessionEntries.length - lines.length} additional turns available.`;
1280
- return { text: header + lines.join('\n') + crossSessionText + footer, accessedIds };
1281
- }
1282
-
1283
- // ============================================================================
1284
- // Auto-optimize: prune stale entries, run after archiving
1285
- // ============================================================================
1286
-
1287
- async function autoOptimize(backend, backendType) {
1288
- if (!AUTO_OPTIMIZE) return { pruned: 0, synced: 0, decayed: 0, embedded: 0 };
1289
-
1290
- let pruned = 0;
1291
- let decayed = 0;
1292
- let embedded = 0;
1293
-
1294
- // Step 1: Confidence decay — reduce confidence for unaccessed entries
1295
- if (backend.decayConfidence) {
1296
- try {
1297
- decayed = backend.decayConfidence(NAMESPACE, 1); // 1 hour worth of decay per optimize cycle
1298
- } catch { /* non-critical */ }
1299
- }
1300
-
1301
- // Step 2: Smart pruning — remove low-confidence entries first
1302
- if (backend.pruneByConfidence) {
1303
- try {
1304
- pruned += backend.pruneByConfidence(NAMESPACE, 0.15);
1305
- } catch { /* non-critical */ }
1306
- }
1307
-
1308
- // Step 3: Age-based pruning as fallback
1309
- if (backend.pruneStale) {
1310
- try {
1311
- pruned += backend.pruneStale(NAMESPACE, RETENTION_DAYS);
1312
- } catch { /* non-critical */ }
1313
- }
1314
-
1315
- // Step 4: Generate ONNX embeddings (384-dim) for entries missing them
1316
- if (backend.storeEmbedding) {
1317
- try {
1318
- const rows = backend.db?.prepare?.(
1319
- 'SELECT id, content FROM transcript_entries WHERE namespace = ? AND embedding IS NULL LIMIT 20'
1320
- )?.all(NAMESPACE);
1321
- if (rows) {
1322
- for (const row of rows) {
1323
- const { embedding } = await createEmbedding(row.content);
1324
- backend.storeEmbedding(row.id, embedding);
1325
- embedded++;
1326
- }
1327
- }
1328
- } catch { /* non-critical */ }
1329
- }
1330
-
1331
- // Step 5: Auto-sync to RuVector if available
1332
- let synced = 0;
1333
- if (backendType === 'sqlite' && backend.allForSync) {
1334
- try {
1335
- const rvConfig = getRuVectorConfig();
1336
- if (rvConfig) {
1337
- const rvBackend = new RuVectorBackend(rvConfig);
1338
- await rvBackend.initialize();
1339
-
1340
- const allEntries = backend.allForSync(NAMESPACE);
1341
- if (allEntries.length > 0) {
1342
- // Add hash embeddings for vector search in RuVector
1343
- const entriesToSync = allEntries.map(e => ({
1344
- ...e,
1345
- _embedding: createHashEmbedding(e.content),
1346
- }));
1347
- await rvBackend.bulkInsert(entriesToSync);
1348
- synced = entriesToSync.length;
1349
- }
1350
-
1351
- await rvBackend.shutdown();
1352
- }
1353
- } catch { /* RuVector sync is best-effort */ }
1354
- }
1355
-
1356
- return { pruned, synced, decayed, embedded };
1357
- }
1358
-
1359
- // ============================================================================
1360
- // Cross-session semantic retrieval
1361
- // ============================================================================
1362
-
1363
- /**
1364
- * Find relevant context from OTHER sessions using semantic similarity.
1365
- * This enables "What did we discuss about auth?" across sessions.
1366
- */
1367
- async function crossSessionSearch(backend, queryText, currentSessionId, k = 5) {
1368
- if (!backend.semanticSearch) return [];
1369
- try {
1370
- const { embedding: queryEmb } = await createEmbedding(queryText);
1371
- const results = backend.semanticSearch(queryEmb, k * 2, NAMESPACE);
1372
- // Filter out current session entries (we already have those)
1373
- return results
1374
- .filter(r => r.sessionId !== currentSessionId)
1375
- .slice(0, k);
1376
- } catch { return []; }
1377
- }
1378
-
1379
- // ============================================================================
1380
- // Context Autopilot Engine
1381
- // ============================================================================
1382
-
1383
- /**
1384
- * Estimate context token usage from transcript JSONL.
1385
- *
1386
- * Primary method: Read the most recent assistant message's `usage` field which
1387
- * contains `input_tokens` + `cache_read_input_tokens` — this is the ACTUAL
1388
- * context size as reported by the Claude API. This includes system prompt,
1389
- * CLAUDE.md, tool definitions, all messages, and everything Claude sees.
1390
- *
1391
- * Fallback: Sum character lengths and divide by CHARS_PER_TOKEN.
1392
- */
1393
- function estimateContextTokens(transcriptPath) {
1394
- if (!existsSync(transcriptPath)) return { tokens: 0, turns: 0, method: 'none' };
1395
-
1396
- const content = readFileSync(transcriptPath, 'utf-8');
1397
- const lines = content.split('\n').filter(Boolean);
1398
-
1399
- // Track the most recent usage data (from the last assistant message)
1400
- let lastInputTokens = 0;
1401
- let lastCacheRead = 0;
1402
- let lastCacheCreate = 0;
1403
- let turns = 0;
1404
- let lastPreTokens = 0;
1405
- let totalChars = 0;
1406
-
1407
- for (let i = 0; i < lines.length; i++) {
1408
- try {
1409
- const parsed = JSON.parse(lines[i]);
1410
-
1411
- // Check for compact_boundary
1412
- if (parsed.type === 'system' && parsed.subtype === 'compact_boundary') {
1413
- lastPreTokens = parsed.compactMetadata?.preTokens
1414
- || parsed.compact_metadata?.pre_tokens || 0;
1415
- // Reset after compaction — new context starts here
1416
- totalChars = 0;
1417
- turns = 0;
1418
- lastInputTokens = 0;
1419
- lastCacheRead = 0;
1420
- lastCacheCreate = 0;
1421
- continue;
1422
- }
1423
-
1424
- // Extract ACTUAL token usage from assistant messages
1425
- // The SDK transcript stores: { message: { role, content, usage: { input_tokens, cache_read_input_tokens, ... } } }
1426
- const msg = parsed.message || parsed;
1427
- const usage = msg.usage;
1428
- if (usage && (msg.role === 'assistant' || parsed.type === 'assistant')) {
1429
- const inputTokens = usage.input_tokens || 0;
1430
- const cacheRead = usage.cache_read_input_tokens || 0;
1431
- const cacheCreate = usage.cache_creation_input_tokens || 0;
1432
-
1433
- // The total context sent to Claude = input_tokens + cache_read + cache_create
1434
- // input_tokens: non-cached tokens actually processed
1435
- // cache_read: tokens served from cache (still in context)
1436
- // cache_create: tokens newly cached (still in context)
1437
- const totalContext = inputTokens + cacheRead + cacheCreate;
1438
-
1439
- if (totalContext > 0) {
1440
- lastInputTokens = inputTokens;
1441
- lastCacheRead = cacheRead;
1442
- lastCacheCreate = cacheCreate;
1443
- }
1444
- }
1445
-
1446
- // Count turns for display
1447
- const role = msg.role || parsed.type;
1448
- if (role === 'user') turns++;
1449
-
1450
- // Char fallback accumulation
1451
- if (role === 'user' || role === 'assistant') {
1452
- const c = msg.content;
1453
- if (typeof c === 'string') totalChars += c.length;
1454
- else if (Array.isArray(c)) {
1455
- for (const block of c) {
1456
- if (block.text) totalChars += block.text.length;
1457
- else if (block.input) totalChars += JSON.stringify(block.input).length;
1458
- }
1459
- }
1460
- }
1461
- } catch { /* skip */ }
1462
- }
1463
-
1464
- // Primary: use actual API usage data
1465
- const actualTotal = lastInputTokens + lastCacheRead + lastCacheCreate;
1466
- if (actualTotal > 0) {
1467
- return {
1468
- tokens: actualTotal,
1469
- turns,
1470
- method: 'api-usage',
1471
- lastPreTokens,
1472
- breakdown: {
1473
- input: lastInputTokens,
1474
- cacheRead: lastCacheRead,
1475
- cacheCreate: lastCacheCreate,
1476
- },
1477
- };
1478
- }
1479
-
1480
- // Fallback: char-based estimate
1481
- const estimatedTokens = Math.ceil(totalChars / CHARS_PER_TOKEN);
1482
- if (lastPreTokens > 0) {
1483
- const compactSummaryTokens = 3000;
1484
- return {
1485
- tokens: compactSummaryTokens + estimatedTokens,
1486
- turns,
1487
- method: 'post-compact-char-estimate',
1488
- lastPreTokens,
1489
- };
1490
- }
1491
-
1492
- return { tokens: estimatedTokens, turns, method: 'char-estimate' };
1493
- }
1494
-
1495
- /**
1496
- * Load autopilot state (persisted across hook invocations).
1497
- */
1498
- function loadAutopilotState() {
1499
- try {
1500
- if (existsSync(AUTOPILOT_STATE_PATH)) {
1501
- return JSON.parse(readFileSync(AUTOPILOT_STATE_PATH, 'utf-8'));
1502
- }
1503
- } catch { /* fresh state */ }
1504
- return {
1505
- sessionId: null,
1506
- lastTokenEstimate: 0,
1507
- lastPercentage: 0,
1508
- pruneCount: 0,
1509
- warningIssued: false,
1510
- lastCheck: 0,
1511
- history: [], // Track token growth over time
1512
- };
1513
- }
1514
-
1515
- /**
1516
- * Save autopilot state.
1517
- */
1518
- function saveAutopilotState(state) {
1519
- try {
1520
- writeFileSync(AUTOPILOT_STATE_PATH, JSON.stringify(state, null, 2), 'utf-8');
1521
- } catch { /* best effort */ }
1522
- }
1523
-
1524
- /**
1525
- * Build a context optimization report for additionalContext injection.
1526
- */
1527
- function buildAutopilotReport(percentage, tokens, windowSize, turns, state) {
1528
- const bar = buildProgressBar(percentage);
1529
- const status = percentage >= AUTOPILOT_PRUNE_PCT
1530
- ? 'OPTIMIZING'
1531
- : percentage >= AUTOPILOT_WARN_PCT
1532
- ? 'WARNING'
1533
- : 'OK';
1534
-
1535
- const parts = [
1536
- `[ContextAutopilot] ${bar} ${(percentage * 100).toFixed(1)}% context used`,
1537
- `(~${formatTokens(tokens)}/${formatTokens(windowSize)} tokens, ${turns} turns)`,
1538
- `Status: ${status}`,
1539
- ];
1540
-
1541
- if (state.pruneCount > 0) {
1542
- parts.push(`| Optimizations: ${state.pruneCount} prune cycles`);
1543
- }
1544
-
1545
- // Add trend if we have history
1546
- if (state.history.length >= 2) {
1547
- const recent = state.history.slice(-3);
1548
- const avgGrowth = recent.reduce((sum, h, i) => {
1549
- if (i === 0) return 0;
1550
- return sum + (h.pct - recent[i - 1].pct);
1551
- }, 0) / (recent.length - 1);
1552
-
1553
- if (avgGrowth > 0) {
1554
- const turnsUntilFull = Math.ceil((1.0 - percentage) / avgGrowth);
1555
- parts.push(`| ~${turnsUntilFull} turns until optimization needed`);
1556
- }
1557
- }
1558
-
1559
- return parts.join(' ');
1560
- }
1561
-
1562
- /**
1563
- * Visual progress bar for context usage.
1564
- */
1565
- function buildProgressBar(percentage) {
1566
- const width = 20;
1567
- const filled = Math.round(percentage * width);
1568
- const empty = width - filled;
1569
- const fillChar = percentage >= AUTOPILOT_PRUNE_PCT ? '!' : percentage >= AUTOPILOT_WARN_PCT ? '#' : '=';
1570
- return `[${fillChar.repeat(filled)}${'-'.repeat(empty)}]`;
1571
- }
1572
-
1573
- /**
1574
- * Format token count for display.
1575
- */
1576
- function formatTokens(n) {
1577
- if (n >= 1000000) return (n / 1000000).toFixed(1) + 'M';
1578
- if (n >= 1000) return (n / 1000).toFixed(1) + 'K';
1579
- return String(n);
1580
- }
1581
-
1582
- /**
1583
- * Context Autopilot: run on every UserPromptSubmit.
1584
- * Returns { additionalContext, shouldBlock } for the hook output.
1585
- */
1586
- async function runAutopilot(transcriptPath, sessionId, backend, backendType) {
1587
- const state = loadAutopilotState();
1588
-
1589
- // Reset state if session changed
1590
- if (state.sessionId !== sessionId) {
1591
- state.sessionId = sessionId;
1592
- state.lastTokenEstimate = 0;
1593
- state.lastPercentage = 0;
1594
- state.pruneCount = 0;
1595
- state.warningIssued = false;
1596
- state.history = [];
1597
- }
1598
-
1599
- // Estimate current context usage
1600
- const { tokens, turns, method, lastPreTokens } = estimateContextTokens(transcriptPath);
1601
- const percentage = Math.min(tokens / CONTEXT_WINDOW_TOKENS, 1.0);
1602
-
1603
- // Track history (keep last 50 data points)
1604
- state.history.push({ ts: Date.now(), tokens, pct: percentage, turns });
1605
- if (state.history.length > 50) state.history.shift();
1606
-
1607
- state.lastTokenEstimate = tokens;
1608
- state.lastPercentage = percentage;
1609
- state.lastCheck = Date.now();
1610
-
1611
- let optimizationMessage = '';
1612
-
1613
- // Phase 1: Warning zone (70-85%) — advise concise responses
1614
- if (percentage >= AUTOPILOT_WARN_PCT && percentage < AUTOPILOT_PRUNE_PCT) {
1615
- if (!state.warningIssued) {
1616
- state.warningIssued = true;
1617
- optimizationMessage = ` | Context at ${(percentage * 100).toFixed(0)}%. Keep responses concise to extend session.`;
1618
- }
1619
- }
1620
-
1621
- // Phase 2: Critical zone (85%+) — session rotation needed
1622
- if (percentage >= AUTOPILOT_PRUNE_PCT) {
1623
- state.pruneCount++;
1624
-
1625
- // Prune stale entries from archive to free up storage
1626
- if (backend.pruneStale) {
1627
- try {
1628
- const pruned = backend.pruneStale(NAMESPACE, Math.min(RETENTION_DAYS, 7));
1629
- if (pruned > 0) {
1630
- optimizationMessage += ` | Pruned ${pruned} stale archive entries.`;
1631
- }
1632
- } catch { /* non-critical */ }
1633
- }
1634
-
1635
- const turnsLeft = Math.max(0, Math.ceil((1.0 - percentage) / 0.03));
1636
- optimizationMessage += ` | CRITICAL: ${(percentage * 100).toFixed(0)}% context used (~${turnsLeft} turns left). All ${turns} turns archived. Start a new session with /clear — context will be fully restored via SessionStart hook.`;
1637
- }
1638
-
1639
- const report = buildAutopilotReport(percentage, tokens, CONTEXT_WINDOW_TOKENS, turns, state);
1640
- saveAutopilotState(state);
1641
-
1642
- return {
1643
- additionalContext: report + optimizationMessage,
1644
- percentage,
1645
- tokens,
1646
- turns,
1647
- method,
1648
- state,
1649
- };
1650
- }
1651
-
1652
- // ============================================================================
1653
- // Commands
1654
- // ============================================================================
1655
-
1656
- async function doPreCompact() {
1657
- const input = await readStdin(200);
1658
- if (!input) return;
1659
-
1660
- const { session_id: sessionId, transcript_path: transcriptPath, trigger } = input;
1661
- if (!transcriptPath || !sessionId) return;
1662
-
1663
- const messages = parseTranscript(transcriptPath);
1664
- if (messages.length === 0) return;
1665
-
1666
- const chunks = chunkTranscript(messages);
1667
- if (chunks.length === 0) return;
1668
-
1669
- const { backend, type } = await resolveBackend();
1670
-
1671
- const archiveResult = await storeChunks(backend, chunks, sessionId, trigger || 'auto');
1672
-
1673
- // Auto-optimize: prune stale entries + sync to RuVector if available
1674
- const optimizeResult = await autoOptimize(backend, type);
1675
-
1676
- const total = await backend.count(NAMESPACE);
1677
- await backend.shutdown();
1678
-
1679
- const optParts = [];
1680
- if (optimizeResult.pruned > 0) optParts.push(`${optimizeResult.pruned} pruned`);
1681
- if (optimizeResult.decayed > 0) optParts.push(`${optimizeResult.decayed} decayed`);
1682
- if (optimizeResult.embedded > 0) optParts.push(`${optimizeResult.embedded} embedded`);
1683
- if (optimizeResult.synced > 0) optParts.push(`${optimizeResult.synced} synced`);
1684
- const optimizeMsg = optParts.length > 0 ? ` Optimized: ${optParts.join(', ')}.` : '';
1685
- process.stderr.write(
1686
- `[ContextPersistence] Archived ${archiveResult.stored} turns (${archiveResult.deduped} deduped) via ${type}. Total: ${total}.${optimizeMsg}\n`
1687
- );
1688
-
1689
- // Exit code 0: stdout is appended as custom compact instructions
1690
- // This guides Claude on what to preserve in the compaction summary
1691
- const instructions = buildCompactInstructions(chunks, sessionId, archiveResult);
1692
- process.stdout.write(instructions);
1693
-
1694
- // Context Autopilot: track state and log archival status
1695
- // NOTE: Claude Code 2.0.76 executePreCompactHooks uses executeHooksOutsideREPL
1696
- // which does NOT support exit code 2 blocking. Compaction always proceeds.
1697
- // Our "infinite context" comes from archive + restore, not blocking.
1698
- if (AUTOPILOT_ENABLED) {
1699
- const state = loadAutopilotState();
1700
- const pct = state.lastPercentage || 0;
1701
- const bar = buildProgressBar(pct);
1702
-
1703
- process.stderr.write(
1704
- `[ContextAutopilot] ${bar} ${(pct * 100).toFixed(1)}% | ${trigger} compact — ${chunks.length} turns archived. Context will be restored after compaction.\n`
1705
- );
1706
-
1707
- // Reset autopilot state for post-compaction fresh start
1708
- state.lastTokenEstimate = 0;
1709
- state.lastPercentage = 0;
1710
- state.warningIssued = false;
1711
- saveAutopilotState(state);
1712
- }
1713
- }
1714
-
1715
- async function doSessionStart() {
1716
- const input = await readStdin(200);
1717
-
1718
- // Restore context after compaction OR after /clear (session rotation)
1719
- // With DISABLE_COMPACT, /clear is the primary way to free context
1720
- if (!input || (input.source !== 'compact' && input.source !== 'clear')) return;
1721
-
1722
- const sessionId = input.session_id;
1723
- if (!sessionId) return;
1724
-
1725
- const { backend, type } = await resolveBackend();
1726
-
1727
- // Use smart retrieval (importance-ranked) when auto-optimize is on
1728
- let additionalContext;
1729
- if (AUTO_OPTIMIZE) {
1730
- const { text, accessedIds } = await retrieveContextSmart(backend, sessionId, RESTORE_BUDGET);
1731
- additionalContext = text;
1732
-
1733
- // Track which entries were actually restored (access pattern learning)
1734
- if (accessedIds.length > 0 && backend.markAccessed) {
1735
- try { backend.markAccessed(accessedIds); } catch { /* non-critical */ }
1736
- }
1737
-
1738
- if (accessedIds.length > 0) {
1739
- process.stderr.write(
1740
- `[ContextPersistence] Smart restore: ${accessedIds.length} turns (importance-ranked) via ${type}\n`
1741
- );
1742
- }
1743
- } else {
1744
- additionalContext = await retrieveContext(backend, sessionId, RESTORE_BUDGET);
1745
- }
1746
-
1747
- await backend.shutdown();
1748
-
1749
- if (!additionalContext) return;
1750
-
1751
- const output = {
1752
- hookSpecificOutput: {
1753
- hookEventName: 'SessionStart',
1754
- additionalContext,
1755
- },
1756
- };
1757
- process.stdout.write(JSON.stringify(output));
1758
- }
1759
-
1760
- // ============================================================================
1761
- // Proactive archiving on every user prompt (prevents context cliff)
1762
- // ============================================================================
1763
-
1764
- async function doUserPromptSubmit() {
1765
- const input = await readStdin(200);
1766
- if (!input) return;
1767
-
1768
- const { session_id: sessionId, transcript_path: transcriptPath } = input;
1769
- if (!transcriptPath || !sessionId) return;
1770
-
1771
- const messages = parseTranscript(transcriptPath);
1772
- if (messages.length === 0) return;
1773
-
1774
- const chunks = chunkTranscript(messages);
1775
- if (chunks.length === 0) return;
1776
-
1777
- const { backend, type } = await resolveBackend();
1778
-
1779
- // Only archive new turns (dedup handles the rest, but we can skip early
1780
- // by only processing the last N chunks since the previous archive)
1781
- const existingCount = backend.queryBySession
1782
- ? (await backend.queryBySession(NAMESPACE, sessionId)).length
1783
- : 0;
1784
-
1785
- // Skip if we've already archived most turns (within 2 turns tolerance)
1786
- const skipArchive = existingCount > 0 && chunks.length - existingCount <= 2;
1787
-
1788
- let archiveMsg = '';
1789
- if (!skipArchive) {
1790
- const result = await storeChunks(backend, chunks, sessionId, 'proactive');
1791
- if (result.stored > 0) {
1792
- const total = await backend.count(NAMESPACE);
1793
- archiveMsg = `[ContextPersistence] Proactively archived ${result.stored} turns (total: ${total}).`;
1794
- process.stderr.write(
1795
- `[ContextPersistence] Proactive archive: ${result.stored} new, ${result.deduped} deduped via ${type}. Total: ${total}\n`
1796
- );
1797
- }
1798
- }
1799
-
1800
- // Context Autopilot: estimate usage and report percentage
1801
- let autopilotMsg = '';
1802
- if (AUTOPILOT_ENABLED && transcriptPath) {
1803
- try {
1804
- const autopilot = await runAutopilot(transcriptPath, sessionId, backend, type);
1805
- autopilotMsg = autopilot.additionalContext;
1806
-
1807
- process.stderr.write(
1808
- `[ContextAutopilot] ${(autopilot.percentage * 100).toFixed(1)}% context used (~${formatTokens(autopilot.tokens)} tokens, ${autopilot.turns} turns, ${autopilot.method})\n`
1809
- );
1810
- } catch (err) {
1811
- process.stderr.write(`[ContextAutopilot] Error: ${err.message}\n`);
1812
- }
1813
- }
1814
-
1815
- await backend.shutdown();
1816
-
1817
- // Combine archive message and autopilot report
1818
- const additionalContext = [archiveMsg, autopilotMsg].filter(Boolean).join(' ');
1819
-
1820
- if (additionalContext) {
1821
- const output = {
1822
- hookSpecificOutput: {
1823
- hookEventName: 'UserPromptSubmit',
1824
- additionalContext,
1825
- },
1826
- };
1827
- process.stdout.write(JSON.stringify(output));
1828
- }
1829
- }
1830
-
1831
- async function doStatus() {
1832
- const { backend, type } = await resolveBackend();
1833
-
1834
- const total = await backend.count();
1835
- const archiveCount = await backend.count(NAMESPACE);
1836
- const namespaces = await backend.listNamespaces();
1837
- const sessions = await backend.listSessions(NAMESPACE);
1838
-
1839
- console.log('\n=== Context Persistence Archive Status ===\n');
1840
- const backendLabel = {
1841
- sqlite: ARCHIVE_DB_PATH,
1842
- ruvector: `${process.env.RUVECTOR_HOST || 'N/A'}:${process.env.RUVECTOR_PORT || '5432'}`,
1843
- agentdb: 'in-memory HNSW',
1844
- json: ARCHIVE_JSON_PATH,
1845
- };
1846
- console.log(` Backend: ${type} (${backendLabel[type] || type})`);
1847
- console.log(` Total: ${total} entries`);
1848
- console.log(` Transcripts: ${archiveCount} entries`);
1849
- console.log(` Namespaces: ${namespaces.join(', ') || 'none'}`);
1850
- console.log(` Budget: ${RESTORE_BUDGET} chars`);
1851
- console.log(` Sessions: ${sessions.length}`);
1852
- console.log(` Proactive: enabled (UserPromptSubmit hook)`);
1853
- console.log(` Auto-opt: ${AUTO_OPTIMIZE ? 'enabled' : 'disabled'} (importance ranking, pruning, sync)`);
1854
- console.log(` Retention: ${RETENTION_DAYS} days (prune never-accessed entries)`);
1855
- const rvConfig = getRuVectorConfig();
1856
- console.log(` RuVector: ${rvConfig ? `${rvConfig.host}:${rvConfig.port}/${rvConfig.database} (auto-sync enabled)` : 'not configured'}`);
1857
-
1858
- // Self-learning stats
1859
- if (type === 'sqlite' && backend.db) {
1860
- try {
1861
- const embCount = backend.db.prepare('SELECT COUNT(*) as cnt FROM transcript_entries WHERE embedding IS NOT NULL').get().cnt;
1862
- const avgConf = backend.db.prepare('SELECT AVG(confidence) as avg FROM transcript_entries WHERE namespace = ?').get(NAMESPACE)?.avg || 0;
1863
- const lowConf = backend.db.prepare('SELECT COUNT(*) as cnt FROM transcript_entries WHERE namespace = ? AND confidence < 0.3').get(NAMESPACE).cnt;
1864
- console.log('');
1865
- console.log(' --- Self-Learning ---');
1866
- console.log(` Embeddings: ${embCount}/${archiveCount} entries have vector embeddings`);
1867
- console.log(` Avg conf: ${(avgConf * 100).toFixed(1)}% (decay: -0.5%/hr, boost: +3%/access)`);
1868
- console.log(` Low conf: ${lowConf} entries below 30% (pruned at 15%)`);
1869
- console.log(` Semantic: ${embCount > 0 ? 'enabled (cross-session search)' : 'pending (embeddings generating)'}`);
1870
- } catch { /* stats are non-critical */ }
1871
- }
1872
-
1873
- // Autopilot status
1874
- console.log('');
1875
- console.log(' --- Context Autopilot ---');
1876
- console.log(` Enabled: ${AUTOPILOT_ENABLED}`);
1877
- console.log(` Window: ${formatTokens(CONTEXT_WINDOW_TOKENS)} tokens`);
1878
- console.log(` Warn at: ${(AUTOPILOT_WARN_PCT * 100).toFixed(0)}%`);
1879
- console.log(` Prune at: ${(AUTOPILOT_PRUNE_PCT * 100).toFixed(0)}%`);
1880
- console.log(` Compaction: LOSSLESS (archive before, restore after)`);
1881
-
1882
- const apState = loadAutopilotState();
1883
- if (apState.sessionId) {
1884
- const pct = apState.lastPercentage || 0;
1885
- const bar = buildProgressBar(pct);
1886
- console.log(` Current: ${bar} ${(pct * 100).toFixed(1)}% (~${formatTokens(apState.lastTokenEstimate)} tokens)`);
1887
- console.log(` Prune cycles: ${apState.pruneCount}`);
1888
- if (apState.history.length >= 2) {
1889
- const first = apState.history[0];
1890
- const last = apState.history[apState.history.length - 1];
1891
- const growthRate = (last.pct - first.pct) / apState.history.length;
1892
- if (growthRate > 0) {
1893
- const turnsLeft = Math.ceil((1.0 - pct) / growthRate);
1894
- console.log(` Est. runway: ~${turnsLeft} turns until prune threshold`);
1895
- }
1896
- }
1897
- }
1898
-
1899
- if (sessions.length > 0) {
1900
- console.log('\n Recent sessions:');
1901
- for (const s of sessions.slice(0, 10)) {
1902
- console.log(` - ${s.session_id}: ${s.cnt} turns`);
1903
- }
1904
- }
1905
-
1906
- console.log('');
1907
- await backend.shutdown();
1908
- }
1909
-
1910
- // ============================================================================
1911
- // Exports for testing
1912
- // ============================================================================
1913
-
1914
- // Wrappers used by hook-handler.cjs which imports this module and calls
1915
- // cpHook.archive() (session-end / pre-compact) and cpHook.restore() (session-restore).
1916
- export async function archive() { return doPreCompact(); }
1917
- export async function restore() { return doSessionStart(); }
1918
-
1919
- export {
1920
- SQLiteBackend,
1921
- RuVectorBackend,
1922
- JsonFileBackend,
1923
- resolveBackend,
1924
- getRuVectorConfig,
1925
- createEmbedding,
1926
- createHashEmbedding,
1927
- getOnnxPipeline,
1928
- EMBEDDING_DIM,
1929
- hashContent,
1930
- parseTranscript,
1931
- extractTextContent,
1932
- extractToolCalls,
1933
- extractFilePaths,
1934
- chunkTranscript,
1935
- extractSummary,
1936
- buildEntry,
1937
- buildCompactInstructions,
1938
- computeImportance,
1939
- retrieveContextSmart,
1940
- autoOptimize,
1941
- crossSessionSearch,
1942
- storeChunks,
1943
- retrieveContext,
1944
- readStdin,
1945
- // Autopilot
1946
- estimateContextTokens,
1947
- loadAutopilotState,
1948
- saveAutopilotState,
1949
- runAutopilot,
1950
- buildProgressBar,
1951
- formatTokens,
1952
- buildAutopilotReport,
1953
- NAMESPACE,
1954
- ARCHIVE_DB_PATH,
1955
- ARCHIVE_JSON_PATH,
1956
- COMPACT_INSTRUCTION_BUDGET,
1957
- RETENTION_DAYS,
1958
- AUTO_OPTIMIZE,
1959
- AUTOPILOT_ENABLED,
1960
- CONTEXT_WINDOW_TOKENS,
1961
- AUTOPILOT_WARN_PCT,
1962
- AUTOPILOT_PRUNE_PCT,
1963
- };
1964
-
1965
- // ============================================================================
1966
- // Main — only runs when invoked directly (not when imported as a module)
1967
- // ============================================================================
1968
-
1969
- const _isMain = process.argv[1] === __filename;
1970
-
1971
- if (_isMain) {
1972
- const command = process.argv[2] || 'status';
1973
-
1974
- try {
1975
- switch (command) {
1976
- case 'pre-compact': await doPreCompact(); break;
1977
- case 'session-start': await doSessionStart(); break;
1978
- case 'user-prompt-submit': await doUserPromptSubmit(); break;
1979
- case 'status': await doStatus(); break;
1980
- default:
1981
- console.log('Usage: context-persistence-hook.mjs <pre-compact|session-start|user-prompt-submit|status>');
1982
- process.exit(1);
1983
- }
1984
- } catch (err) {
1985
- // Hooks must never crash Claude Code - fail silently
1986
- process.stderr.write(`[ContextPersistence] Error (non-critical): ${err.message}\n`);
1987
- }
1988
- }