squish-memory 1.0.1 → 1.1.5

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 (601) hide show
  1. package/.env.example +130 -0
  2. package/CHANGELOG.md +55 -0
  3. package/README.md +155 -274
  4. package/config/hooks/claude-code-hooks.json +39 -0
  5. package/config/hooks/cursor-hooks.json +30 -0
  6. package/config/hooks/opencode-hooks.json +30 -0
  7. package/config/hooks/windsurf-hooks.json +30 -0
  8. package/config/mcp-mode-semantics.json +23 -21
  9. package/config/plugin-manifest.json +101 -152
  10. package/{plugin.json → config/plugin.json} +2 -2
  11. package/config/settings.json +52 -51
  12. package/{commands → core/commands}/init.md +39 -39
  13. package/dist/config.d.ts +28 -4
  14. package/dist/config.js +97 -29
  15. package/dist/core/adapters/config/claude-code.d.ts +45 -0
  16. package/dist/core/adapters/config/claude-code.js +113 -0
  17. package/dist/core/adapters/config/cursor.d.ts +26 -0
  18. package/dist/core/adapters/config/cursor.js +74 -0
  19. package/dist/core/adapters/config/opencode.d.ts +23 -0
  20. package/dist/core/adapters/config/opencode.js +73 -0
  21. package/dist/core/adapters/config/windsurf.d.ts +26 -0
  22. package/dist/core/adapters/config/windsurf.js +74 -0
  23. package/dist/core/adapters/index.d.ts +45 -0
  24. package/dist/core/adapters/index.js +84 -0
  25. package/dist/core/adapters/scripts/install-adapter.d.ts +19 -0
  26. package/dist/core/adapters/scripts/install-adapter.js +149 -0
  27. package/dist/core/adapters/timeline.d.ts +23 -0
  28. package/dist/core/adapters/timeline.js +88 -0
  29. package/dist/core/adapters/types.d.ts +157 -0
  30. package/dist/core/adapters/types.js +50 -0
  31. package/dist/{algorithms → core/algorithms}/analytics/token-estimator.d.ts +1 -1
  32. package/dist/{algorithms → core/algorithms}/analytics/token-estimator.js +3 -3
  33. package/dist/{algorithms → core/algorithms}/detection/semantic-ranker.d.ts +1 -1
  34. package/dist/{algorithms → core/algorithms}/detection/semantic-ranker.js +1 -1
  35. package/dist/{algorithms → core/algorithms}/detection/two-stage-detector.d.ts +1 -1
  36. package/dist/{algorithms → core/algorithms}/detection/two-stage-detector.js +7 -10
  37. package/dist/{algorithms → core/algorithms}/handlers/approve-merge.js +4 -4
  38. package/dist/{algorithms → core/algorithms}/handlers/detect-duplicates.js +3 -3
  39. package/dist/{algorithms → core/algorithms}/handlers/get-stats.js +3 -3
  40. package/dist/{algorithms → core/algorithms}/handlers/list-proposals.js +3 -3
  41. package/dist/{algorithms → core/algorithms}/handlers/preview-merge.js +3 -3
  42. package/dist/{algorithms → core/algorithms}/handlers/reject-merge.js +3 -3
  43. package/dist/{algorithms → core/algorithms}/handlers/reverse-merge.js +3 -3
  44. package/dist/core/algorithms/index.d.ts +21 -0
  45. package/dist/core/algorithms/index.js +26 -0
  46. package/dist/core/algorithms/operations/cache-maintenance.d.ts +12 -0
  47. package/dist/core/algorithms/operations/cache-maintenance.js +157 -0
  48. package/dist/{algorithms → core/algorithms}/safety/safety-checks.d.ts +1 -1
  49. package/dist/{algorithms → core/algorithms}/strategies/merge-strategies.d.ts +19 -1
  50. package/dist/{algorithms → core/algorithms}/strategies/merge-strategies.js +74 -123
  51. package/dist/core/algorithms/types.d.ts +133 -0
  52. package/dist/core/algorithms/types.js +5 -0
  53. package/dist/core/associations.d.ts +1 -2
  54. package/dist/core/associations.js +1 -2
  55. package/dist/core/autosave.d.ts +19 -0
  56. package/dist/core/autosave.js +16 -0
  57. package/dist/{commands → core/commands}/managed-sync.js +5 -5
  58. package/dist/core/commands/mcp-server.js +739 -0
  59. package/dist/core/context/agent-context.d.ts +106 -0
  60. package/dist/core/context/agent-context.js +274 -0
  61. package/dist/core/{context-paging.d.ts → context/context-paging.d.ts} +2 -12
  62. package/dist/core/{context-paging.js → context/context-paging.js} +19 -39
  63. package/dist/core/context/context-window.d.ts +40 -0
  64. package/dist/core/context/context-window.js +177 -0
  65. package/dist/core/context/context.js +22 -0
  66. package/dist/core/embeddings.d.ts +1 -1
  67. package/dist/core/embeddings.js +54 -2
  68. package/dist/core/error-handling.d.ts +63 -0
  69. package/dist/core/error-handling.js +173 -0
  70. package/dist/core/external-folder/index.d.ts +102 -0
  71. package/dist/core/external-folder/index.js +294 -0
  72. package/dist/core/hooks/agent-hooks.d.ts +74 -0
  73. package/dist/core/hooks/agent-hooks.js +244 -0
  74. package/dist/core/hooks/auto-tagger.d.ts +19 -0
  75. package/dist/core/hooks/auto-tagger.js +155 -0
  76. package/dist/core/hooks/capture-filter.d.ts +41 -0
  77. package/dist/core/hooks/capture-filter.js +128 -0
  78. package/dist/core/index.d.ts +6 -6
  79. package/dist/core/index.js +6 -6
  80. package/dist/core/{agent-memory.js → ingestion/agent-memory.js} +5 -7
  81. package/dist/core/{core-memory.js → ingestion/core-memory.js} +4 -4
  82. package/dist/core/ingestion/learnings.d.ts +57 -0
  83. package/dist/core/ingestion/learnings.js +202 -0
  84. package/dist/core/lib/db-client.d.ts +114 -0
  85. package/dist/core/lib/db-client.js +130 -0
  86. package/dist/core/lib/schemas.d.ts +129 -0
  87. package/dist/core/lib/schemas.js +87 -0
  88. package/dist/core/{utils.d.ts → lib/utils.d.ts} +1 -0
  89. package/dist/core/{utils.js → lib/utils.js} +31 -15
  90. package/dist/core/lib/validation.d.ts +38 -0
  91. package/dist/core/lib/validation.js +151 -0
  92. package/dist/core/lifecycle.d.ts +7 -0
  93. package/dist/core/lifecycle.js +140 -20
  94. package/dist/core/local-embeddings.d.ts +6 -1
  95. package/dist/core/local-embeddings.js +6 -15
  96. package/dist/core/logger.js +7 -1
  97. package/dist/core/mcp/server.js +27 -1
  98. package/dist/core/mcp/tools.js +35 -3
  99. package/dist/core/mcp/types.d.ts +4 -4
  100. package/dist/core/memory/categorizer.js +1 -0
  101. package/dist/core/memory/conflict-detector.js +1 -1
  102. package/dist/core/memory/consolidation.d.ts +1 -10
  103. package/dist/core/memory/consolidation.js +2 -11
  104. package/dist/core/memory/context-collector.js +1 -1
  105. package/dist/core/memory/edit-workflow.js +1 -1
  106. package/dist/core/memory/entity-resolver.js +7 -7
  107. package/dist/core/memory/fact-extractor.js +12 -12
  108. package/dist/core/memory/feedback-tracker.js +1 -1
  109. package/dist/core/memory/hooks.d.ts +88 -0
  110. package/dist/core/memory/hooks.js +174 -0
  111. package/dist/core/memory/hybrid-retrieval.js +2 -2
  112. package/dist/core/memory/hybrid-search.d.ts +1 -6
  113. package/dist/core/memory/hybrid-search.js +70 -84
  114. package/dist/core/memory/importance.d.ts +8 -13
  115. package/dist/core/memory/importance.js +47 -74
  116. package/dist/core/memory/loader.d.ts +31 -0
  117. package/dist/core/memory/loader.js +141 -0
  118. package/dist/core/memory/markdown/markdown-storage.d.ts +72 -0
  119. package/dist/core/memory/markdown/markdown-storage.js +243 -0
  120. package/dist/core/memory/memories.d.ts +12 -4
  121. package/dist/core/memory/memories.js +196 -181
  122. package/dist/core/memory/memory-lifecycle.d.ts +8 -0
  123. package/dist/core/memory/memory-lifecycle.js +55 -0
  124. package/dist/core/memory/migrate.d.ts +21 -0
  125. package/dist/core/memory/migrate.js +134 -0
  126. package/dist/core/memory/normalization.d.ts +22 -0
  127. package/dist/core/memory/normalization.js +26 -0
  128. package/dist/core/memory/progressive-disclosure.js +1 -1
  129. package/dist/core/memory/query-rewriter.js +9 -9
  130. package/dist/core/memory/serialization.d.ts +4 -0
  131. package/dist/core/memory/serialization.js +49 -0
  132. package/dist/core/memory/stats.d.ts +5 -0
  133. package/dist/core/memory/stats.js +63 -12
  134. package/dist/core/memory/temporal-facts.js +21 -0
  135. package/dist/core/memory/write-gate.js +1 -1
  136. package/dist/core/obsidian-vault.d.ts +30 -0
  137. package/dist/core/obsidian-vault.js +94 -0
  138. package/dist/core/places/index.d.ts +14 -0
  139. package/dist/core/places/index.js +14 -0
  140. package/dist/core/places/memory-places.d.ts +68 -0
  141. package/dist/core/places/memory-places.js +261 -0
  142. package/dist/core/places/places.d.ts +88 -0
  143. package/dist/core/places/places.js +314 -0
  144. package/dist/core/places/rules.d.ts +74 -0
  145. package/dist/core/places/rules.js +240 -0
  146. package/dist/core/places/walking.d.ts +56 -0
  147. package/dist/core/places/walking.js +121 -0
  148. package/dist/core/projects.d.ts +5 -0
  149. package/dist/core/projects.js +39 -18
  150. package/dist/core/responses.d.ts +96 -0
  151. package/dist/core/responses.js +122 -0
  152. package/dist/core/scheduler/cron-scheduler.js +89 -14
  153. package/dist/core/scheduler/index.d.ts +1 -1
  154. package/dist/core/scheduler/index.js +1 -1
  155. package/dist/core/scheduler/job-runner.js +1 -1
  156. package/dist/core/search/conversations.js +40 -42
  157. package/dist/core/search/entities.js +6 -9
  158. package/dist/core/search/graph-boost.d.ts +7 -0
  159. package/dist/core/search/graph-boost.js +23 -0
  160. package/dist/core/search/qmd-search.js +4 -4
  161. package/dist/core/security/encrypt.d.ts +6 -0
  162. package/dist/core/security/encrypt.js +47 -0
  163. package/dist/core/{governance.d.ts → security/governance.d.ts} +6 -1
  164. package/dist/core/security/governance.js +79 -0
  165. package/dist/core/session/auto-load.js +6 -6
  166. package/dist/core/session/index.d.ts +1 -1
  167. package/dist/core/session/index.js +1 -1
  168. package/dist/core/session/self-iteration-job.d.ts +20 -0
  169. package/dist/core/session/self-iteration-job.js +282 -0
  170. package/dist/core/session/session-hooks.d.ts +18 -0
  171. package/dist/core/session/session-hooks.js +58 -0
  172. package/dist/core/session-hooks/self-iteration-job.js +35 -35
  173. package/dist/core/{cache.js → storage/cache.js} +2 -2
  174. package/dist/core/sync/qmd-sync.d.ts +1 -13
  175. package/dist/core/sync/qmd-sync.js +1 -13
  176. package/dist/core/toon.d.ts +43 -0
  177. package/dist/core/toon.js +160 -0
  178. package/dist/core/utils/memory-operations.js +1 -1
  179. package/dist/core/utils/vector-operations.d.ts +71 -0
  180. package/dist/core/utils/vector-operations.js +129 -0
  181. package/dist/db/adapter.d.ts +3 -3
  182. package/dist/db/adapter.js +115 -36
  183. package/dist/db/bootstrap.js +927 -555
  184. package/dist/{drizzle → db/drizzle}/schema-sqlite.d.ts +74 -25
  185. package/dist/{drizzle → db/drizzle}/schema-sqlite.js +91 -24
  186. package/dist/{drizzle → db/drizzle}/schema.d.ts +79 -32
  187. package/dist/{drizzle → db/drizzle}/schema.js +106 -35
  188. package/dist/db/drizzle.config.d.ts +3 -0
  189. package/dist/db/drizzle.config.js +12 -0
  190. package/dist/db/index.d.ts +1 -5
  191. package/dist/db/index.js +51 -8
  192. package/dist/db/neon.d.ts +8 -0
  193. package/dist/db/neon.js +20 -0
  194. package/dist/db/schema/index.d.ts +40 -0
  195. package/dist/db/schema/index.js +105 -0
  196. package/dist/db/schema/tables/context-sessions.d.ts +9 -0
  197. package/dist/db/schema/tables/context-sessions.js +37 -0
  198. package/dist/db/schema/tables/conversations.d.ts +9 -0
  199. package/dist/db/schema/tables/conversations.js +47 -0
  200. package/dist/db/schema/tables/core-memory.d.ts +9 -0
  201. package/dist/db/schema/tables/core-memory.js +41 -0
  202. package/dist/db/schema/tables/entities.d.ts +9 -0
  203. package/dist/db/schema/tables/entities.js +39 -0
  204. package/dist/db/schema/tables/entity-relations.d.ts +9 -0
  205. package/dist/db/schema/tables/entity-relations.js +31 -0
  206. package/dist/db/schema/tables/learnings.d.ts +9 -0
  207. package/dist/db/schema/tables/learnings.js +66 -0
  208. package/dist/db/schema/tables/memories.d.ts +9 -0
  209. package/dist/db/schema/tables/memories.js +161 -0
  210. package/dist/db/schema/tables/memory-associations.d.ts +9 -0
  211. package/dist/db/schema/tables/memory-associations.js +39 -0
  212. package/dist/db/schema/tables/memory-hash-cache.d.ts +9 -0
  213. package/dist/db/schema/tables/memory-hash-cache.js +29 -0
  214. package/dist/db/schema/tables/memory-merge-history.d.ts +9 -0
  215. package/dist/db/schema/tables/memory-merge-history.js +33 -0
  216. package/dist/db/schema/tables/memory-merge-proposals.d.ts +9 -0
  217. package/dist/db/schema/tables/memory-merge-proposals.js +39 -0
  218. package/dist/db/schema/tables/messages.d.ts +9 -0
  219. package/dist/db/schema/tables/messages.js +41 -0
  220. package/dist/db/schema/tables/namespaces.d.ts +9 -0
  221. package/dist/db/schema/tables/namespaces.js +37 -0
  222. package/dist/db/schema/tables/projects.d.ts +9 -0
  223. package/dist/db/schema/tables/projects.js +31 -0
  224. package/dist/db/schema/tables/users.d.ts +9 -0
  225. package/dist/db/schema/tables/users.js +27 -0
  226. package/dist/db/schema.d.ts +1 -1
  227. package/dist/db/schema.js +2 -2
  228. package/dist/db/supabase.d.ts +9 -0
  229. package/dist/db/supabase.js +24 -0
  230. package/dist/index.d.ts +2 -14
  231. package/dist/index.js +1457 -631
  232. package/dist/vendor/sql.js/sql-wasm.wasm +0 -0
  233. package/dist/webui/server.d.ts +5 -0
  234. package/dist/{api/web/web.js → webui/server.js} +538 -509
  235. package/generated/mcp/manifest.json +23 -23
  236. package/{.mcp.json → mcp.json.example} +1 -1
  237. package/package.json +159 -169
  238. package/scripts/README.md +60 -0
  239. package/scripts/copy-runtime-assets.mjs +26 -0
  240. package/scripts/generate-mcp.mjs +264 -264
  241. package/scripts/github-release.sh +4 -4
  242. package/scripts/install-claude-code.sh +85 -0
  243. package/scripts/install-cursor.sh +56 -0
  244. package/scripts/install-hooks.sh +73 -0
  245. package/scripts/install-interactive.mjs +357 -674
  246. package/scripts/install-opencode.sh +75 -0
  247. package/scripts/install-windsurf.sh +67 -0
  248. package/skills/squish-memory/SKILL.md +104 -100
  249. package/skills/squish-memory/{install.mjs → scripts/install.mjs} +2 -2
  250. package/skills/squish-memory/{install.sh → scripts/install.sh} +2 -2
  251. package/skills/squish-memory/write_skill.js +2 -0
  252. package/.claude-plugin/marketplace.json +0 -20
  253. package/.claude-plugin/plugin.json +0 -32
  254. package/.env.mcp.example +0 -56
  255. package/QUICK-START.md +0 -71
  256. package/bin/squish-add.mjs +0 -32
  257. package/bin/squish-rm.mjs +0 -21
  258. package/commands/observe.md +0 -5
  259. package/dist/algorithms/analytics/token-estimator.d.ts.map +0 -1
  260. package/dist/algorithms/analytics/token-estimator.js.map +0 -1
  261. package/dist/algorithms/detection/hash-filters.d.ts.map +0 -1
  262. package/dist/algorithms/detection/hash-filters.js.map +0 -1
  263. package/dist/algorithms/detection/semantic-ranker.d.ts.map +0 -1
  264. package/dist/algorithms/detection/semantic-ranker.js.map +0 -1
  265. package/dist/algorithms/detection/two-stage-detector.d.ts.map +0 -1
  266. package/dist/algorithms/detection/two-stage-detector.js.map +0 -1
  267. package/dist/algorithms/handlers/approve-merge.d.ts.map +0 -1
  268. package/dist/algorithms/handlers/approve-merge.js.map +0 -1
  269. package/dist/algorithms/handlers/detect-duplicates.d.ts.map +0 -1
  270. package/dist/algorithms/handlers/detect-duplicates.js.map +0 -1
  271. package/dist/algorithms/handlers/get-stats.d.ts.map +0 -1
  272. package/dist/algorithms/handlers/get-stats.js.map +0 -1
  273. package/dist/algorithms/handlers/list-proposals.d.ts.map +0 -1
  274. package/dist/algorithms/handlers/list-proposals.js.map +0 -1
  275. package/dist/algorithms/handlers/preview-merge.d.ts.map +0 -1
  276. package/dist/algorithms/handlers/preview-merge.js.map +0 -1
  277. package/dist/algorithms/handlers/reject-merge.d.ts.map +0 -1
  278. package/dist/algorithms/handlers/reject-merge.js.map +0 -1
  279. package/dist/algorithms/handlers/reverse-merge.d.ts.map +0 -1
  280. package/dist/algorithms/handlers/reverse-merge.js.map +0 -1
  281. package/dist/algorithms/safety/safety-checks.d.ts.map +0 -1
  282. package/dist/algorithms/safety/safety-checks.js.map +0 -1
  283. package/dist/algorithms/strategies/merge-strategies.d.ts.map +0 -1
  284. package/dist/algorithms/strategies/merge-strategies.js.map +0 -1
  285. package/dist/algorithms/utils/response-builder.d.ts.map +0 -1
  286. package/dist/algorithms/utils/response-builder.js.map +0 -1
  287. package/dist/api/web/index.d.ts +0 -3
  288. package/dist/api/web/index.d.ts.map +0 -1
  289. package/dist/api/web/index.js +0 -4
  290. package/dist/api/web/index.js.map +0 -1
  291. package/dist/api/web/web-server.d.ts +0 -3
  292. package/dist/api/web/web-server.d.ts.map +0 -1
  293. package/dist/api/web/web-server.js +0 -6
  294. package/dist/api/web/web-server.js.map +0 -1
  295. package/dist/api/web/web.d.ts +0 -4
  296. package/dist/api/web/web.d.ts.map +0 -1
  297. package/dist/api/web/web.js.map +0 -1
  298. package/dist/commands/managed-sync.d.ts.map +0 -1
  299. package/dist/commands/managed-sync.js.map +0 -1
  300. package/dist/commands/mcp-server.d.ts.map +0 -1
  301. package/dist/commands/mcp-server.js +0 -393
  302. package/dist/commands/mcp-server.js.map +0 -1
  303. package/dist/config.d.ts.map +0 -1
  304. package/dist/config.js.map +0 -1
  305. package/dist/core/agent-memory.d.ts.map +0 -1
  306. package/dist/core/agent-memory.js.map +0 -1
  307. package/dist/core/associations.d.ts.map +0 -1
  308. package/dist/core/associations.js.map +0 -1
  309. package/dist/core/cache.d.ts.map +0 -1
  310. package/dist/core/cache.js.map +0 -1
  311. package/dist/core/consolidation.d.ts.map +0 -1
  312. package/dist/core/consolidation.js.map +0 -1
  313. package/dist/core/context-paging.d.ts.map +0 -1
  314. package/dist/core/context-paging.js.map +0 -1
  315. package/dist/core/context.d.ts.map +0 -1
  316. package/dist/core/context.js +0 -24
  317. package/dist/core/context.js.map +0 -1
  318. package/dist/core/core-memory.d.ts.map +0 -1
  319. package/dist/core/core-memory.js.map +0 -1
  320. package/dist/core/database.d.ts.map +0 -1
  321. package/dist/core/database.js.map +0 -1
  322. package/dist/core/embeddings/google-multimodal.d.ts.map +0 -1
  323. package/dist/core/embeddings/google-multimodal.js.map +0 -1
  324. package/dist/core/embeddings/qmd-client.d.ts.map +0 -1
  325. package/dist/core/embeddings/qmd-client.js.map +0 -1
  326. package/dist/core/embeddings.d.ts.map +0 -1
  327. package/dist/core/embeddings.js.map +0 -1
  328. package/dist/core/governance.d.ts.map +0 -1
  329. package/dist/core/governance.js +0 -64
  330. package/dist/core/governance.js.map +0 -1
  331. package/dist/core/index.d.ts.map +0 -1
  332. package/dist/core/index.js.map +0 -1
  333. package/dist/core/layers/generator.d.ts.map +0 -1
  334. package/dist/core/layers/generator.js.map +0 -1
  335. package/dist/core/lifecycle.d.ts.map +0 -1
  336. package/dist/core/lifecycle.js.map +0 -1
  337. package/dist/core/local-embeddings.d.ts.map +0 -1
  338. package/dist/core/local-embeddings.js.map +0 -1
  339. package/dist/core/logger.d.ts.map +0 -1
  340. package/dist/core/logger.js.map +0 -1
  341. package/dist/core/mcp/client.d.ts.map +0 -1
  342. package/dist/core/mcp/client.js.map +0 -1
  343. package/dist/core/mcp/index.d.ts.map +0 -1
  344. package/dist/core/mcp/index.js.map +0 -1
  345. package/dist/core/mcp/server.d.ts.map +0 -1
  346. package/dist/core/mcp/server.js.map +0 -1
  347. package/dist/core/mcp/standalone-server.d.ts.map +0 -1
  348. package/dist/core/mcp/standalone-server.js.map +0 -1
  349. package/dist/core/mcp/tools.d.ts.map +0 -1
  350. package/dist/core/mcp/tools.js.map +0 -1
  351. package/dist/core/mcp/types.d.ts.map +0 -1
  352. package/dist/core/mcp/types.js.map +0 -1
  353. package/dist/core/memory/bridge-discovery.d.ts.map +0 -1
  354. package/dist/core/memory/bridge-discovery.js.map +0 -1
  355. package/dist/core/memory/categorizer.d.ts.map +0 -1
  356. package/dist/core/memory/categorizer.js.map +0 -1
  357. package/dist/core/memory/conflict-detector.d.ts.map +0 -1
  358. package/dist/core/memory/conflict-detector.js.map +0 -1
  359. package/dist/core/memory/consolidation.d.ts.map +0 -1
  360. package/dist/core/memory/consolidation.js.map +0 -1
  361. package/dist/core/memory/context-collector.d.ts.map +0 -1
  362. package/dist/core/memory/context-collector.js.map +0 -1
  363. package/dist/core/memory/contradiction-resolver.d.ts.map +0 -1
  364. package/dist/core/memory/contradiction-resolver.js.map +0 -1
  365. package/dist/core/memory/edit-workflow.d.ts.map +0 -1
  366. package/dist/core/memory/edit-workflow.js.map +0 -1
  367. package/dist/core/memory/entity-extractor.d.ts.map +0 -1
  368. package/dist/core/memory/entity-extractor.js.map +0 -1
  369. package/dist/core/memory/entity-resolver.d.ts.map +0 -1
  370. package/dist/core/memory/entity-resolver.js.map +0 -1
  371. package/dist/core/memory/fact-extractor.d.ts.map +0 -1
  372. package/dist/core/memory/fact-extractor.js.map +0 -1
  373. package/dist/core/memory/feedback-tracker.d.ts.map +0 -1
  374. package/dist/core/memory/feedback-tracker.js.map +0 -1
  375. package/dist/core/memory/hybrid-retrieval.d.ts.map +0 -1
  376. package/dist/core/memory/hybrid-retrieval.js.map +0 -1
  377. package/dist/core/memory/hybrid-scorer.d.ts.map +0 -1
  378. package/dist/core/memory/hybrid-scorer.js.map +0 -1
  379. package/dist/core/memory/hybrid-search.d.ts.map +0 -1
  380. package/dist/core/memory/hybrid-search.js.map +0 -1
  381. package/dist/core/memory/importance.d.ts.map +0 -1
  382. package/dist/core/memory/importance.js.map +0 -1
  383. package/dist/core/memory/index.d.ts.map +0 -1
  384. package/dist/core/memory/index.js.map +0 -1
  385. package/dist/core/memory/memories.d.ts.map +0 -1
  386. package/dist/core/memory/memories.js.map +0 -1
  387. package/dist/core/memory/memory-manager.d.ts.map +0 -1
  388. package/dist/core/memory/memory-manager.js.map +0 -1
  389. package/dist/core/memory/progressive-disclosure.d.ts.map +0 -1
  390. package/dist/core/memory/progressive-disclosure.js.map +0 -1
  391. package/dist/core/memory/query-processor.d.ts.map +0 -1
  392. package/dist/core/memory/query-processor.js.map +0 -1
  393. package/dist/core/memory/query-rewriter.d.ts.map +0 -1
  394. package/dist/core/memory/query-rewriter.js.map +0 -1
  395. package/dist/core/memory/response-analyzer.d.ts.map +0 -1
  396. package/dist/core/memory/response-analyzer.js.map +0 -1
  397. package/dist/core/memory/serialization.d.ts.map +0 -1
  398. package/dist/core/memory/serialization.js.map +0 -1
  399. package/dist/core/memory/stats.d.ts.map +0 -1
  400. package/dist/core/memory/stats.js.map +0 -1
  401. package/dist/core/memory/telemetry.d.ts.map +0 -1
  402. package/dist/core/memory/telemetry.js.map +0 -1
  403. package/dist/core/memory/temporal-facts.d.ts.map +0 -1
  404. package/dist/core/memory/temporal-facts.js.map +0 -1
  405. package/dist/core/memory/temporal-parser.d.ts.map +0 -1
  406. package/dist/core/memory/temporal-parser.js.map +0 -1
  407. package/dist/core/memory/trigger-detector.d.ts.map +0 -1
  408. package/dist/core/memory/trigger-detector.js.map +0 -1
  409. package/dist/core/memory/write-gate.d.ts.map +0 -1
  410. package/dist/core/memory/write-gate.js.map +0 -1
  411. package/dist/core/namespaces/index.d.ts.map +0 -1
  412. package/dist/core/namespaces/index.js.map +0 -1
  413. package/dist/core/namespaces/uri-parser.d.ts.map +0 -1
  414. package/dist/core/namespaces/uri-parser.js.map +0 -1
  415. package/dist/core/observations.d.ts +0 -26
  416. package/dist/core/observations.d.ts.map +0 -1
  417. package/dist/core/observations.js +0 -110
  418. package/dist/core/observations.js.map +0 -1
  419. package/dist/core/privacy.d.ts.map +0 -1
  420. package/dist/core/privacy.js.map +0 -1
  421. package/dist/core/projects.d.ts.map +0 -1
  422. package/dist/core/projects.js.map +0 -1
  423. package/dist/core/redis.d.ts.map +0 -1
  424. package/dist/core/redis.js.map +0 -1
  425. package/dist/core/requirements.d.ts +0 -20
  426. package/dist/core/requirements.d.ts.map +0 -1
  427. package/dist/core/requirements.js +0 -35
  428. package/dist/core/requirements.js.map +0 -1
  429. package/dist/core/scheduler/cron-scheduler.d.ts.map +0 -1
  430. package/dist/core/scheduler/cron-scheduler.js.map +0 -1
  431. package/dist/core/scheduler/heartbeat.d.ts.map +0 -1
  432. package/dist/core/scheduler/heartbeat.js.map +0 -1
  433. package/dist/core/scheduler/index.d.ts.map +0 -1
  434. package/dist/core/scheduler/index.js.map +0 -1
  435. package/dist/core/scheduler/job-runner.d.ts.map +0 -1
  436. package/dist/core/scheduler/job-runner.js.map +0 -1
  437. package/dist/core/search/conversations.d.ts.map +0 -1
  438. package/dist/core/search/conversations.js.map +0 -1
  439. package/dist/core/search/entities.d.ts.map +0 -1
  440. package/dist/core/search/entities.js.map +0 -1
  441. package/dist/core/search/folder-context.d.ts.map +0 -1
  442. package/dist/core/search/folder-context.js.map +0 -1
  443. package/dist/core/search/index.d.ts.map +0 -1
  444. package/dist/core/search/index.js.map +0 -1
  445. package/dist/core/search/qmd-search.d.ts.map +0 -1
  446. package/dist/core/search/qmd-search.js.map +0 -1
  447. package/dist/core/secret-detector.d.ts.map +0 -1
  448. package/dist/core/secret-detector.js.map +0 -1
  449. package/dist/core/session/auto-load.d.ts.map +0 -1
  450. package/dist/core/session/auto-load.js.map +0 -1
  451. package/dist/core/session/index.d.ts.map +0 -1
  452. package/dist/core/session/index.js.map +0 -1
  453. package/dist/core/session/types.d.ts.map +0 -1
  454. package/dist/core/session/types.js.map +0 -1
  455. package/dist/core/session-hooks/self-iteration-job.d.ts.map +0 -1
  456. package/dist/core/session-hooks/self-iteration-job.js.map +0 -1
  457. package/dist/core/session-hooks/session-hooks.d.ts.map +0 -1
  458. package/dist/core/session-hooks/session-hooks.js.map +0 -1
  459. package/dist/core/snapshots/cleanup.d.ts.map +0 -1
  460. package/dist/core/snapshots/cleanup.js.map +0 -1
  461. package/dist/core/snapshots/comparison.d.ts.map +0 -1
  462. package/dist/core/snapshots/comparison.js.map +0 -1
  463. package/dist/core/snapshots/creation.d.ts.map +0 -1
  464. package/dist/core/snapshots/creation.js.map +0 -1
  465. package/dist/core/snapshots/retrieval.d.ts.map +0 -1
  466. package/dist/core/snapshots/retrieval.js.map +0 -1
  467. package/dist/core/snapshots/stats.d.ts.map +0 -1
  468. package/dist/core/snapshots/stats.js.map +0 -1
  469. package/dist/core/snapshots.d.ts.map +0 -1
  470. package/dist/core/snapshots.js.map +0 -1
  471. package/dist/core/summarization/cleanup.d.ts.map +0 -1
  472. package/dist/core/summarization/cleanup.js.map +0 -1
  473. package/dist/core/summarization/queries.d.ts.map +0 -1
  474. package/dist/core/summarization/queries.js.map +0 -1
  475. package/dist/core/summarization/stats.d.ts.map +0 -1
  476. package/dist/core/summarization/stats.js.map +0 -1
  477. package/dist/core/summarization/strategies.d.ts.map +0 -1
  478. package/dist/core/summarization/strategies.js.map +0 -1
  479. package/dist/core/summarization.d.ts.map +0 -1
  480. package/dist/core/summarization.js.map +0 -1
  481. package/dist/core/sync/qmd-sync.d.ts.map +0 -1
  482. package/dist/core/sync/qmd-sync.js.map +0 -1
  483. package/dist/core/temporal-facts.d.ts.map +0 -1
  484. package/dist/core/temporal-facts.js.map +0 -1
  485. package/dist/core/tracing/collector.d.ts.map +0 -1
  486. package/dist/core/tracing/collector.js.map +0 -1
  487. package/dist/core/tracing/visualizer.d.ts.map +0 -1
  488. package/dist/core/tracing/visualizer.js.map +0 -1
  489. package/dist/core/utils/cleanup-operations.d.ts.map +0 -1
  490. package/dist/core/utils/cleanup-operations.js.map +0 -1
  491. package/dist/core/utils/content-extraction.d.ts.map +0 -1
  492. package/dist/core/utils/content-extraction.js.map +0 -1
  493. package/dist/core/utils/filter-builder.d.ts.map +0 -1
  494. package/dist/core/utils/filter-builder.js.map +0 -1
  495. package/dist/core/utils/history-traversal.d.ts.map +0 -1
  496. package/dist/core/utils/history-traversal.js.map +0 -1
  497. package/dist/core/utils/memory-operations.d.ts.map +0 -1
  498. package/dist/core/utils/memory-operations.js.map +0 -1
  499. package/dist/core/utils/query-operations.d.ts.map +0 -1
  500. package/dist/core/utils/query-operations.js.map +0 -1
  501. package/dist/core/utils/summarization-helpers.d.ts.map +0 -1
  502. package/dist/core/utils/summarization-helpers.js.map +0 -1
  503. package/dist/core/utils/temporal-queries.d.ts.map +0 -1
  504. package/dist/core/utils/temporal-queries.js.map +0 -1
  505. package/dist/core/utils/version-management.d.ts.map +0 -1
  506. package/dist/core/utils/version-management.js.map +0 -1
  507. package/dist/core/utils.d.ts.map +0 -1
  508. package/dist/core/utils.js.map +0 -1
  509. package/dist/core/worker.d.ts.map +0 -1
  510. package/dist/core/worker.js.map +0 -1
  511. package/dist/db/adapter.d.ts.map +0 -1
  512. package/dist/db/adapter.js.map +0 -1
  513. package/dist/db/bootstrap.d.ts.map +0 -1
  514. package/dist/db/bootstrap.js.map +0 -1
  515. package/dist/db/index.d.ts.map +0 -1
  516. package/dist/db/index.js.map +0 -1
  517. package/dist/db/schema.d.ts.map +0 -1
  518. package/dist/db/schema.js.map +0 -1
  519. package/dist/drizzle/schema-sqlite.d.ts.map +0 -1
  520. package/dist/drizzle/schema-sqlite.js.map +0 -1
  521. package/dist/drizzle/schema.d.ts.map +0 -1
  522. package/dist/drizzle/schema.js.map +0 -1
  523. package/dist/index.d.ts.map +0 -1
  524. package/dist/index.js.map +0 -1
  525. package/hooks/hooks.json +0 -52
  526. package/hooks/post-tool-use.js +0 -26
  527. package/hooks/session-end.js +0 -28
  528. package/hooks/session-start.js +0 -33
  529. package/hooks/user-prompt-submit.js +0 -26
  530. package/hooks/utils.js +0 -153
  531. package/npx-installer.js +0 -208
  532. package/packages/plugin-claude-code/README.md +0 -73
  533. package/packages/plugin-claude-code/dist/plugin-wrapper.d.ts +0 -35
  534. package/packages/plugin-claude-code/dist/plugin-wrapper.d.ts.map +0 -1
  535. package/packages/plugin-claude-code/dist/plugin-wrapper.js +0 -191
  536. package/packages/plugin-claude-code/dist/plugin-wrapper.js.map +0 -1
  537. package/packages/plugin-claude-code/package.json +0 -31
  538. package/packages/plugin-openclaw/README.md +0 -70
  539. package/packages/plugin-openclaw/dist/index.d.ts +0 -49
  540. package/packages/plugin-openclaw/dist/index.d.ts.map +0 -1
  541. package/packages/plugin-openclaw/dist/index.js +0 -262
  542. package/packages/plugin-openclaw/dist/index.js.map +0 -1
  543. package/packages/plugin-openclaw/openclaw.plugin.json +0 -94
  544. package/packages/plugin-openclaw/package.json +0 -31
  545. package/packages/plugin-opencode/install.mjs +0 -217
  546. package/packages/plugin-opencode/package.json +0 -21
  547. package/scripts/db/check-db.mjs +0 -88
  548. package/scripts/db/fix-all-columns.mjs +0 -52
  549. package/scripts/db/fix-schema-all.mjs +0 -55
  550. package/scripts/db/fix-schema-full.mjs +0 -46
  551. package/scripts/db/fix-schema.mjs +0 -38
  552. package/scripts/db/init-db.mjs +0 -13
  553. package/scripts/db/recreate-db.mjs +0 -14
  554. package/scripts/install-mcp.mjs +0 -116
  555. package/scripts/install-web.sh +0 -120
  556. package/scripts/install.mjs +0 -340
  557. package/scripts/openclaw-bootstrap.mjs +0 -127
  558. package/scripts/package-release.sh +0 -71
  559. package/scripts/test/test-all-systems.mjs +0 -139
  560. package/scripts/test/test-memory-system.mjs +0 -139
  561. package/scripts/test/test-v0.5.0.mjs +0 -210
  562. package/skills/memory-guide/SKILL.md +0 -256
  563. package/skills/squish-cli/SKILL.md +0 -200
  564. package/skills/squish-mcp/SKILL.md +0 -311
  565. package/skills/squish-memory/claude-desktop.json +0 -12
  566. package/skills/squish-memory/openclaw.json +0 -13
  567. package/skills/squish-memory/opencode.json +0 -14
  568. package/skills/squish-memory/skill.json +0 -32
  569. /package/{commands → core/commands}/context-paging.md +0 -0
  570. /package/{commands → core/commands}/context-status.md +0 -0
  571. /package/{commands → core/commands}/context.md +0 -0
  572. /package/{commands → core/commands}/core-memory.md +0 -0
  573. /package/{commands → core/commands}/health.md +0 -0
  574. /package/{commands → core/commands}/merge.md +0 -0
  575. /package/{commands → core/commands}/recall.md +0 -0
  576. /package/{commands → core/commands}/remember.md +0 -0
  577. /package/{commands → core/commands}/search.md +0 -0
  578. /package/dist/{algorithms → core/algorithms}/detection/hash-filters.d.ts +0 -0
  579. /package/dist/{algorithms → core/algorithms}/detection/hash-filters.js +0 -0
  580. /package/dist/{algorithms → core/algorithms}/handlers/approve-merge.d.ts +0 -0
  581. /package/dist/{algorithms → core/algorithms}/handlers/detect-duplicates.d.ts +0 -0
  582. /package/dist/{algorithms → core/algorithms}/handlers/get-stats.d.ts +0 -0
  583. /package/dist/{algorithms → core/algorithms}/handlers/list-proposals.d.ts +0 -0
  584. /package/dist/{algorithms → core/algorithms}/handlers/preview-merge.d.ts +0 -0
  585. /package/dist/{algorithms → core/algorithms}/handlers/reject-merge.d.ts +0 -0
  586. /package/dist/{algorithms → core/algorithms}/handlers/reverse-merge.d.ts +0 -0
  587. /package/dist/{algorithms → core/algorithms}/safety/safety-checks.js +0 -0
  588. /package/dist/{algorithms → core/algorithms}/utils/response-builder.d.ts +0 -0
  589. /package/dist/{algorithms → core/algorithms}/utils/response-builder.js +0 -0
  590. /package/dist/{commands → core/commands}/managed-sync.d.ts +0 -0
  591. /package/dist/{commands → core/commands}/mcp-server.d.ts +0 -0
  592. /package/dist/core/{context.d.ts → context/context.d.ts} +0 -0
  593. /package/dist/core/{agent-memory.d.ts → ingestion/agent-memory.d.ts} +0 -0
  594. /package/dist/core/{core-memory.d.ts → ingestion/core-memory.d.ts} +0 -0
  595. /package/dist/core/{privacy.d.ts → security/privacy.d.ts} +0 -0
  596. /package/dist/core/{privacy.js → security/privacy.js} +0 -0
  597. /package/dist/core/{secret-detector.d.ts → security/secret-detector.d.ts} +0 -0
  598. /package/dist/core/{secret-detector.js → security/secret-detector.js} +0 -0
  599. /package/dist/core/{cache.d.ts → storage/cache.d.ts} +0 -0
  600. /package/dist/core/{database.d.ts → storage/database.d.ts} +0 -0
  601. /package/dist/core/{database.js → storage/database.js} +0 -0
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Walking Interface - Sequential memory retrieval through places
3
+ *
4
+ * Implements Method of Loci walking through memory places:
5
+ * - Walk single place to get memories in order
6
+ * - Walk all places for full tour
7
+ * - Token budget handling with TOON compression
8
+ */
9
+ import { getProjectPlaces } from './places.js';
10
+ import { getPlaceMemories } from './memory-places.js';
11
+ import { getMemory } from '../memory/memories.js';
12
+ import { compressForContext } from '../toon.js';
13
+ import { logger } from '../logger.js';
14
+ /**
15
+ * Walk through a single place
16
+ */
17
+ export async function walkPlace(projectId, placeType, options = {}) {
18
+ const { tokenBudget = 170, maxMemoriesPerPlace = 10, includePurpose = true, compressWithToon = false } = options;
19
+ // Get the place
20
+ const places = await getProjectPlaces(projectId);
21
+ const place = places.find(p => p.placeType === placeType);
22
+ if (!place) {
23
+ logger.warn(`[Walking] Place not found: ${placeType}`);
24
+ return null;
25
+ }
26
+ // Get memory IDs for this place
27
+ const memoryIds = await getPlaceMemories(place.id, maxMemoriesPerPlace);
28
+ // Get full memories
29
+ const memories = [];
30
+ let totalTokens = 0;
31
+ for (const memoryId of memoryIds) {
32
+ const memory = await getMemory(memoryId);
33
+ if (!memory)
34
+ continue;
35
+ let content = memory.content || '';
36
+ // Compress with TOON if requested
37
+ if (compressWithToon && content) {
38
+ content = compressForContext(content);
39
+ }
40
+ const tokenEstimate = Math.ceil(content.length / 4); // rough token estimate
41
+ if (totalTokens + tokenEstimate > tokenBudget) {
42
+ // Would exceed budget - stop adding
43
+ break;
44
+ }
45
+ memories.push({
46
+ id: memory.id,
47
+ content,
48
+ type: memory.type,
49
+ tags: memory.tags || [],
50
+ createdAt: memory.createdAt || '',
51
+ });
52
+ totalTokens += tokenEstimate;
53
+ }
54
+ return {
55
+ place,
56
+ memories,
57
+ totalTokens,
58
+ truncated: memories.length < memoryIds.length,
59
+ };
60
+ }
61
+ /**
62
+ * Walk through all places in loci order
63
+ */
64
+ export async function walkAllPlaces(projectId, options = {}) {
65
+ const places = await getProjectPlaces(projectId);
66
+ const results = [];
67
+ for (const place of places) {
68
+ const walkResult = await walkPlace(projectId, place.placeType, options);
69
+ if (walkResult && walkResult.memories.length > 0) {
70
+ results.push(walkResult);
71
+ }
72
+ }
73
+ logger.info(`[Walking] Walked ${results.length} places for project ${projectId}`);
74
+ return results;
75
+ }
76
+ /**
77
+ * Quick tour - just place names and purposes (minimal tokens)
78
+ */
79
+ export async function quickTour(projectId) {
80
+ const places = await getProjectPlaces(projectId);
81
+ return {
82
+ places: places.map(p => ({
83
+ name: p.name,
84
+ purpose: p.purpose || '',
85
+ memoryCount: p.memoryCount,
86
+ })),
87
+ totalMemories: places.reduce((sum, p) => sum + p.memoryCount, 0),
88
+ };
89
+ }
90
+ /**
91
+ * Get context summary for a place (for injection)
92
+ */
93
+ export async function getPlaceContext(projectId, placeType, maxTokens = 50) {
94
+ const walkResult = await walkPlace(projectId, placeType, {
95
+ tokenBudget: maxTokens,
96
+ compressWithToon: true,
97
+ });
98
+ if (!walkResult || walkResult.memories.length === 0) {
99
+ return '';
100
+ }
101
+ const lines = walkResult.memories.map((m, i) => `${i + 1}. [${m.type}] ${m.content.substring(0, 100)}`);
102
+ return `## ${walkResult.place.name}\n${lines.join('\n')}`;
103
+ }
104
+ /**
105
+ * Full context for session start (all places)
106
+ */
107
+ export async function getFullWalkingContext(projectId, maxTokens = 170) {
108
+ const results = await walkAllPlaces(projectId, {
109
+ tokenBudget: Math.floor(maxTokens / 7), // Distribute across 7 places
110
+ compressWithToon: true,
111
+ });
112
+ if (results.length === 0) {
113
+ return 'No memories yet. Start building your spatial memory!';
114
+ }
115
+ const sections = results.map(r => {
116
+ const lines = r.memories.slice(0, 3).map((m, i) => ` ${i + 1}. ${m.content.substring(0, 60)}...`).join('\n');
117
+ return `## ${r.place.name}\n${lines}`;
118
+ });
119
+ return sections.join('\n\n');
120
+ }
121
+ //# sourceMappingURL=walking.js.map
@@ -7,6 +7,11 @@ export interface ProjectRecord {
7
7
  }
8
8
  export declare function getProjectByPath(path: string): Promise<ProjectRecord | null>;
9
9
  export declare function ensureProject(path?: string): Promise<ProjectRecord | null>;
10
+ export declare class ProjectNotFoundError extends Error {
11
+ constructor(path: string);
12
+ }
13
+ export declare function requireProject(path: string): Promise<ProjectRecord>;
14
+ export declare function getOrCreateProject(path?: string): Promise<ProjectRecord | null>;
10
15
  export declare function getAllProjects(): Promise<ProjectRecord[]>;
11
16
  export declare function getProjectById(id: string): Promise<ProjectRecord | null>;
12
17
  //# sourceMappingURL=projects.d.ts.map
@@ -3,9 +3,8 @@ import { randomUUID } from 'crypto';
3
3
  import { eq } from 'drizzle-orm';
4
4
  import { getDb } from '../db/index.js';
5
5
  import { getSchema } from '../db/schema.js';
6
- import { fromSqliteJson, toSqliteJson } from './memory/serialization.js';
7
- import { config } from '../config.js';
8
- import { createDatabaseClient } from './database.js';
6
+ import { serializeMetadata, deserializeMetadata } from './memory/serialization.js';
7
+ import { createDatabaseClient } from './storage/database.js';
9
8
  export async function getProjectByPath(path) {
10
9
  try {
11
10
  const db = createDatabaseClient(await getDb());
@@ -31,26 +30,48 @@ export async function ensureProject(path) {
31
30
  const id = randomUUID();
32
31
  const name = basename(path) || path;
33
32
  const metadata = { source: 'mcp' };
34
- if (config.isTeamMode) {
35
- await db.insert(schema.projects).values({
36
- id,
37
- name,
38
- path,
39
- metadata,
40
- });
33
+ await db.insert(schema.projects).values({
34
+ id,
35
+ name,
36
+ path,
37
+ metadata: serializeMetadata(metadata),
38
+ });
39
+ return { id, name, path, metadata };
40
+ }
41
+ export class ProjectNotFoundError extends Error {
42
+ constructor(path) {
43
+ super(`Project not found: ${path}`);
44
+ this.name = 'ProjectNotFoundError';
41
45
  }
42
- else {
43
- await db.insert(schema.projects).values({
44
- id,
45
- name,
46
- path,
47
- metadata: toSqliteJson(metadata),
48
- });
46
+ }
47
+ export async function requireProject(path) {
48
+ const project = await getProjectByPath(path);
49
+ if (!project) {
50
+ throw new ProjectNotFoundError(path);
49
51
  }
52
+ return project;
53
+ }
54
+ export async function getOrCreateProject(path) {
55
+ if (!path)
56
+ return null;
57
+ const existing = await getProjectByPath(path);
58
+ if (existing)
59
+ return existing;
60
+ const db = createDatabaseClient(await getDb());
61
+ const schema = await getSchema();
62
+ const id = randomUUID();
63
+ const name = basename(path) || path;
64
+ const metadata = { source: 'mcp' };
65
+ await db.insert(schema.projects).values({
66
+ id,
67
+ name,
68
+ path,
69
+ metadata: serializeMetadata(metadata),
70
+ });
50
71
  return { id, name, path, metadata };
51
72
  }
52
73
  function normalizeProject(row) {
53
- const metadata = config.isTeamMode ? row.metadata : fromSqliteJson(row.metadata);
74
+ const metadata = deserializeMetadata(row.metadata ?? null);
54
75
  return {
55
76
  id: row.id,
56
77
  name: row.name,
@@ -0,0 +1,96 @@
1
+ /**
2
+ * ResponseFormatter - Unified response formatting for all Squish output contexts
3
+ * @module core/responses
4
+ */
5
+ export type ResponseStatus = 'ok' | 'error';
6
+ export interface BaseResponse<T = unknown> {
7
+ status: ResponseStatus;
8
+ message?: string;
9
+ data?: T;
10
+ error?: string;
11
+ timestamp?: string;
12
+ }
13
+ export interface PaginatedResponse<T> extends BaseResponse<T[]> {
14
+ count: number;
15
+ total?: number;
16
+ page?: number;
17
+ limit?: number;
18
+ }
19
+ /**
20
+ * Format options for web responses
21
+ */
22
+ export interface WebFormatOptions {
23
+ statusCode?: number;
24
+ pagination?: {
25
+ total: number;
26
+ page: number;
27
+ limit: number;
28
+ };
29
+ }
30
+ /**
31
+ * Unified response formatter for all Squish output contexts
32
+ */
33
+ export declare class ResponseFormatter {
34
+ /**
35
+ * Generate ISO timestamp
36
+ */
37
+ private static getTimestamp;
38
+ /**
39
+ * Build base response with timestamp
40
+ */
41
+ private static buildBase;
42
+ /**
43
+ * Format response for CLI output (pretty-printed JSON)
44
+ */
45
+ static cli<T>(data: T, message?: string): string;
46
+ /**
47
+ * Format error for CLI and exit process
48
+ */
49
+ static cliError(error: Error): never;
50
+ /**
51
+ * Format successful response for Web API
52
+ */
53
+ static web<T>(data: T, message?: string, options?: WebFormatOptions): {
54
+ status: number;
55
+ body: BaseResponse<T>;
56
+ };
57
+ /**
58
+ * Format error response for Web API
59
+ */
60
+ static webError(error: Error, options?: {
61
+ statusCode?: number;
62
+ log?: boolean;
63
+ }): {
64
+ status: number;
65
+ body: BaseResponse;
66
+ };
67
+ /**
68
+ * Format response for MCP tools
69
+ */
70
+ static mcp<T>(data: T, message?: string): {
71
+ content: Array<{
72
+ type: string;
73
+ text: string;
74
+ }>;
75
+ };
76
+ /**
77
+ * Format error for MCP tools (throws McpError)
78
+ */
79
+ static mcpError(error: Error, context?: string): never;
80
+ /**
81
+ * Format response for algorithm handlers
82
+ */
83
+ static algorithm<T>(data: T, message: string, options?: {
84
+ ok?: boolean;
85
+ error?: string;
86
+ }): BaseResponse<T>;
87
+ /**
88
+ * Convenience method for success responses
89
+ */
90
+ static success<T>(data: T, message?: string): BaseResponse<T>;
91
+ /**
92
+ * Convenience method for failure responses
93
+ */
94
+ static failure(message: string, error?: Error | string): BaseResponse;
95
+ }
96
+ //# sourceMappingURL=responses.d.ts.map
@@ -0,0 +1,122 @@
1
+ /**
2
+ * ResponseFormatter - Unified response formatting for all Squish output contexts
3
+ * @module core/responses
4
+ */
5
+ /**
6
+ * Unified response formatter for all Squish output contexts
7
+ */
8
+ export class ResponseFormatter {
9
+ /**
10
+ * Generate ISO timestamp
11
+ */
12
+ static getTimestamp() {
13
+ return new Date().toISOString();
14
+ }
15
+ /**
16
+ * Build base response with timestamp
17
+ */
18
+ static buildBase(status, message, data, error) {
19
+ return {
20
+ status,
21
+ message,
22
+ data,
23
+ error,
24
+ timestamp: this.getTimestamp(),
25
+ };
26
+ }
27
+ // CLI Formatters
28
+ /**
29
+ * Format response for CLI output (pretty-printed JSON)
30
+ */
31
+ static cli(data, message) {
32
+ const response = this.buildBase(data instanceof Error ? 'error' : 'ok', message, data);
33
+ return JSON.stringify(response, null, 2);
34
+ }
35
+ /**
36
+ * Format error for CLI and exit process
37
+ */
38
+ static cliError(error) {
39
+ const response = this.buildBase('error', error.message, undefined, error.message);
40
+ console.error(JSON.stringify(response, null, 2));
41
+ process.exit(1);
42
+ }
43
+ // Web API Formatters
44
+ /**
45
+ * Format successful response for Web API
46
+ */
47
+ static web(data, message, options) {
48
+ const body = this.buildBase('ok', message, data);
49
+ // Add pagination metadata if provided
50
+ if (options?.pagination) {
51
+ body.count = options.pagination.total;
52
+ body.total = options.pagination.total;
53
+ body.page = options.pagination.page;
54
+ body.limit = options.pagination.limit;
55
+ }
56
+ return {
57
+ status: options?.statusCode ?? 200,
58
+ body,
59
+ };
60
+ }
61
+ /**
62
+ * Format error response for Web API
63
+ */
64
+ static webError(error, options) {
65
+ const statusCode = options?.statusCode ?? 500;
66
+ const body = this.buildBase('error', error.message, undefined, error.message);
67
+ if (options?.log !== false) {
68
+ console.error(`[Web API Error ${statusCode}]:`, error.message);
69
+ }
70
+ return { status: statusCode, body };
71
+ }
72
+ // MCP Formatters
73
+ /**
74
+ * Format response for MCP tools
75
+ */
76
+ static mcp(data, message) {
77
+ const response = this.buildBase('ok', message, data);
78
+ return {
79
+ content: [{ type: 'text', text: JSON.stringify(response, null, 2) }],
80
+ };
81
+ }
82
+ /**
83
+ * Format error for MCP tools (throws McpError)
84
+ */
85
+ static mcpError(error, context) {
86
+ const message = context ? `${context}: ${error.message}` : error.message;
87
+ const response = this.buildBase('error', message, undefined, message);
88
+ // Import McpError dynamically to avoid requiring @modelcontextprotocol/sdk in non-MCP contexts
89
+ try {
90
+ const { McpError, ErrorCode } = require('@modelcontextprotocol/sdk/types.js');
91
+ throw new McpError(ErrorCode.InternalError, JSON.stringify(response));
92
+ }
93
+ catch (e) {
94
+ // If McpError is not available, throw a standard error with MCP-formatted message
95
+ const mcpError = new Error(JSON.stringify(response));
96
+ mcpError.name = 'McpError';
97
+ throw mcpError;
98
+ }
99
+ }
100
+ // Algorithm Handler Formatters
101
+ /**
102
+ * Format response for algorithm handlers
103
+ */
104
+ static algorithm(data, message, options) {
105
+ const isOk = options?.ok !== false;
106
+ return this.buildBase(isOk ? 'ok' : 'error', message, isOk ? data : undefined, options?.error);
107
+ }
108
+ /**
109
+ * Convenience method for success responses
110
+ */
111
+ static success(data, message) {
112
+ return this.buildBase('ok', message, data);
113
+ }
114
+ /**
115
+ * Convenience method for failure responses
116
+ */
117
+ static failure(message, error) {
118
+ const errorMessage = error instanceof Error ? error.message : error;
119
+ return this.buildBase('error', message, undefined, errorMessage);
120
+ }
121
+ }
122
+ //# sourceMappingURL=responses.js.map
@@ -1,10 +1,11 @@
1
1
  /** Cron Scheduler - Persistent cron-based job scheduling with fallback support */
2
2
  import cron from 'node-cron';
3
3
  import { selfIterationHandler } from '../session-hooks/self-iteration-job.js';
4
+ import { runLifecycleMaintenance } from '../lifecycle.js';
4
5
  import { logger } from '../logger.js';
5
6
  import { config } from '../../config.js';
6
7
  import { getDb } from '../../db/index.js';
7
- import { maintenanceJobs, maintenanceJobHistory } from '../../drizzle/schema-sqlite.js';
8
+ import { maintenanceJobs, maintenanceJobHistory } from '../../db/drizzle/schema-sqlite.js';
8
9
  import { eq } from 'drizzle-orm';
9
10
  const jobHandlers = new Map();
10
11
  const activeTasks = new Map();
@@ -14,6 +15,20 @@ export function registerJobHandler(jobName, handler) {
14
15
  }
15
16
  // Register self-iteration job handler
16
17
  registerJobHandler('self_iteration', selfIterationHandler);
18
+ // Decay job handler - runs lifecycle maintenance (decay, tier updates, eviction)
19
+ const decayHandler = async (context) => {
20
+ const stats = await runLifecycleMaintenance();
21
+ return {
22
+ recordsProcessed: stats.decayed + stats.expired + stats.evicted,
23
+ summary: {
24
+ decayed: stats.decayed,
25
+ expired: stats.expired,
26
+ evicted: stats.evicted,
27
+ tierChanges: stats.tierChanges,
28
+ },
29
+ };
30
+ };
31
+ registerJobHandler('decay_maintenance', decayHandler);
17
32
  export async function initializeScheduler() {
18
33
  if (!config.cronEnabled) {
19
34
  logger.info('[Scheduler] Cron scheduling disabled, using heartbeat fallback');
@@ -42,6 +57,13 @@ export async function initializeScheduler() {
42
57
  }
43
58
  async function ensureDefaultJobs(db) {
44
59
  const defaultJobs = [
60
+ {
61
+ jobName: 'decay_maintenance',
62
+ jobType: 'hourly',
63
+ cronExpression: '0 * * * *', // Run every hour at :00
64
+ enabled: true,
65
+ jobConfig: { applyDecay: true, updateTiers: true, evictOld: true },
66
+ },
45
67
  {
46
68
  jobName: 'nightly_maintenance',
47
69
  jobType: 'nightly',
@@ -65,18 +87,61 @@ async function ensureDefaultJobs(db) {
65
87
  },
66
88
  ];
67
89
  for (const job of defaultJobs) {
68
- const existing = await db
69
- .select()
70
- .from(maintenanceJobs)
71
- .where(eq(maintenanceJobs.jobName, job.jobName))
72
- .limit(1);
90
+ let existing;
91
+ try {
92
+ existing = await db
93
+ .select()
94
+ .from(maintenanceJobs)
95
+ .where(eq(maintenanceJobs.jobName, job.jobName))
96
+ .limit(1);
97
+ }
98
+ catch (queryError) {
99
+ logger.error(`[Scheduler] Query failed for job ${job.jobName}:`, queryError.message);
100
+ // Try raw SQL fallback
101
+ try {
102
+ const rawDb = db.$client;
103
+ if (rawDb && typeof rawDb.prepare === 'function') {
104
+ existing = rawDb.prepare('SELECT * FROM maintenance_jobs WHERE job_name = ?').all(job.jobName);
105
+ }
106
+ }
107
+ catch (fallbackError) {
108
+ logger.error(`[Scheduler] Fallback query also failed:`, fallbackError.message);
109
+ throw queryError;
110
+ }
111
+ }
73
112
  if (existing.length === 0) {
74
- await db.insert(maintenanceJobs).values({
75
- ...job,
76
- totalRuns: 0,
77
- successCount: 0,
78
- failureCount: 0,
79
- });
113
+ try {
114
+ await db.insert(maintenanceJobs).values({
115
+ jobName: job.jobName,
116
+ jobType: job.jobType,
117
+ cronExpression: job.cronExpression,
118
+ enabled: job.enabled,
119
+ jobConfig: job.jobConfig,
120
+ totalRuns: 0,
121
+ successCount: 0,
122
+ failureCount: 0,
123
+ lastRunAt: null,
124
+ nextRunAt: null,
125
+ lastRunDuration: null,
126
+ lastRunStatus: null,
127
+ lastRunError: null,
128
+ });
129
+ }
130
+ catch (insertError) {
131
+ // Fallback to raw SQL if drizzle insert fails
132
+ logger.warn(`[Scheduler] Drizzle insert failed, using raw SQL: ${insertError.message}`);
133
+ const rawDb = db.$client;
134
+ if (rawDb && typeof rawDb.prepare === 'function') {
135
+ const stmt = rawDb.prepare(`
136
+ INSERT INTO maintenance_jobs
137
+ (id, job_name, job_type, cron_expression, enabled, job_config,
138
+ total_runs, success_count, failure_count, last_run_at, next_run_at,
139
+ last_run_duration, last_run_status, last_run_error)
140
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
141
+ `);
142
+ stmt.run(crypto.randomUUID(), job.jobName, job.jobType, job.cronExpression, job.enabled ? 1 : 0, JSON.stringify(job.jobConfig), 0, 0, 0, null, null, null, null, null);
143
+ }
144
+ }
80
145
  logger.info(`[Scheduler] Created default job: ${job.jobName}`);
81
146
  // Register self-iteration handler
82
147
  if (job.jobName === 'self_iteration') {
@@ -115,7 +180,7 @@ export async function scheduleJob(job) {
115
180
  .set({ nextRunAt: nextRun })
116
181
  .where(eq(maintenanceJobs.id, job.id));
117
182
  }
118
- logger.info(`[Scheduler] Scheduled ${job.jobName} with cron: ${job.cronExpression}, next run: ${nextRun?.toISOString()}`);
183
+ logger.info(`[Scheduler] Scheduled ${job.jobName} with cron: ${job.cronExpression}${nextRun ? `, next run: ${nextRun.toISOString()}` : ''}`);
119
184
  }
120
185
  export async function executeJob(job) {
121
186
  const db = await getDb();
@@ -183,13 +248,23 @@ function getNextRunTime(cronExpression) {
183
248
  try {
184
249
  const now = new Date();
185
250
  const parts = cronExpression.split(' ');
186
- if (parts[2] === '*' && parts[3] === '*' && parts[4] === '*') {
251
+ // Daily jobs: MM HH * * *
252
+ if (parts[2] === '*' && parts[3] === '*' && parts[4] === '*' && parts[1] !== '*') {
187
253
  const next = new Date(now);
188
254
  next.setHours(parseInt(parts[1]), parseInt(parts[0]), 0, 0);
189
255
  if (next <= now)
190
256
  next.setDate(next.getDate() + 1);
191
257
  return next;
192
258
  }
259
+ // Hourly jobs: MM * * * *
260
+ if (parts[1] === '*' && parts[2] === '*' && parts[3] === '*' && parts[4] === '*') {
261
+ const next = new Date(now);
262
+ next.setMinutes(parseInt(parts[0]), 0, 0);
263
+ if (next <= now)
264
+ next.setHours(next.getHours() + 1);
265
+ return next;
266
+ }
267
+ // Weekly jobs: MM HH * * D
193
268
  if (parts[4] !== '*') {
194
269
  const dayOfWeek = parseInt(parts[4]);
195
270
  const next = new Date(now);
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Scheduler Module
3
- * v0.10.0 - Cron-based job scheduling with heartbeat fallback
3
+ * Cron-based job scheduling with heartbeat fallback
4
4
  */
5
5
  export * from './cron-scheduler.js';
6
6
  export * from './heartbeat.js';
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Scheduler Module
3
- * v0.10.0 - Cron-based job scheduling with heartbeat fallback
3
+ * Cron-based job scheduling with heartbeat fallback
4
4
  */
5
5
  export * from './cron-scheduler.js';
6
6
  export * from './heartbeat.js';
@@ -5,7 +5,7 @@ import { runLifecycleMaintenance } from '../lifecycle.js';
5
5
  import { pruneWeakAssociations } from '../associations.js';
6
6
  import { pruneOldSummaries } from '../summarization.js';
7
7
  import { getDb } from '../../db/index.js';
8
- import { memories, memoryFeedback } from '../../drizzle/schema-sqlite.js';
8
+ import { memories, memoryFeedback } from '../../db/drizzle/schema-sqlite.js';
9
9
  import { eq, and, gt, lt } from 'drizzle-orm';
10
10
  export async function runNightlyJob(context) {
11
11
  const summary = {};