squish-memory 1.0.2 → 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 (341) hide show
  1. package/.env.example +130 -0
  2. package/CHANGELOG.md +55 -0
  3. package/README.md +150 -287
  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/tools.js +35 -3
  98. package/dist/core/memory/categorizer.js +1 -0
  99. package/dist/core/memory/conflict-detector.js +1 -1
  100. package/dist/core/memory/consolidation.d.ts +1 -10
  101. package/dist/core/memory/consolidation.js +2 -11
  102. package/dist/core/memory/context-collector.js +1 -1
  103. package/dist/core/memory/edit-workflow.js +1 -1
  104. package/dist/core/memory/entity-resolver.js +7 -7
  105. package/dist/core/memory/fact-extractor.js +12 -12
  106. package/dist/core/memory/feedback-tracker.js +1 -1
  107. package/dist/core/memory/hooks.d.ts +88 -0
  108. package/dist/core/memory/hooks.js +174 -0
  109. package/dist/core/memory/hybrid-retrieval.js +2 -2
  110. package/dist/core/memory/hybrid-search.d.ts +1 -6
  111. package/dist/core/memory/hybrid-search.js +70 -84
  112. package/dist/core/memory/importance.d.ts +8 -13
  113. package/dist/core/memory/importance.js +47 -74
  114. package/dist/core/memory/loader.d.ts +31 -0
  115. package/dist/core/memory/loader.js +141 -0
  116. package/dist/core/memory/markdown/markdown-storage.d.ts +72 -0
  117. package/dist/core/memory/markdown/markdown-storage.js +243 -0
  118. package/dist/core/memory/memories.d.ts +12 -4
  119. package/dist/core/memory/memories.js +192 -180
  120. package/dist/core/memory/memory-lifecycle.d.ts +8 -0
  121. package/dist/core/memory/memory-lifecycle.js +55 -0
  122. package/dist/core/memory/migrate.d.ts +21 -0
  123. package/dist/core/memory/migrate.js +134 -0
  124. package/dist/core/memory/normalization.d.ts +22 -0
  125. package/dist/core/memory/normalization.js +26 -0
  126. package/dist/core/memory/progressive-disclosure.js +1 -1
  127. package/dist/core/memory/query-rewriter.js +9 -9
  128. package/dist/core/memory/serialization.d.ts +4 -0
  129. package/dist/core/memory/serialization.js +49 -0
  130. package/dist/core/memory/stats.d.ts +5 -0
  131. package/dist/core/memory/stats.js +63 -12
  132. package/dist/core/memory/temporal-facts.js +21 -0
  133. package/dist/core/memory/write-gate.js +1 -1
  134. package/dist/core/obsidian-vault.d.ts +30 -0
  135. package/dist/core/obsidian-vault.js +94 -0
  136. package/dist/core/places/index.d.ts +14 -0
  137. package/dist/core/places/index.js +14 -0
  138. package/dist/core/places/memory-places.d.ts +68 -0
  139. package/dist/core/places/memory-places.js +261 -0
  140. package/dist/core/places/places.d.ts +88 -0
  141. package/dist/core/places/places.js +314 -0
  142. package/dist/core/places/rules.d.ts +74 -0
  143. package/dist/core/places/rules.js +240 -0
  144. package/dist/core/places/walking.d.ts +56 -0
  145. package/dist/core/places/walking.js +121 -0
  146. package/dist/core/projects.d.ts +5 -0
  147. package/dist/core/projects.js +39 -18
  148. package/dist/core/responses.d.ts +96 -0
  149. package/dist/core/responses.js +122 -0
  150. package/dist/core/scheduler/cron-scheduler.js +29 -7
  151. package/dist/core/scheduler/index.d.ts +1 -1
  152. package/dist/core/scheduler/index.js +1 -1
  153. package/dist/core/scheduler/job-runner.js +1 -1
  154. package/dist/core/search/conversations.js +40 -42
  155. package/dist/core/search/entities.js +6 -9
  156. package/dist/core/search/graph-boost.d.ts +7 -0
  157. package/dist/core/search/graph-boost.js +23 -0
  158. package/dist/core/search/qmd-search.js +4 -4
  159. package/dist/core/security/encrypt.d.ts +6 -0
  160. package/dist/core/security/encrypt.js +47 -0
  161. package/dist/core/{governance.d.ts → security/governance.d.ts} +6 -1
  162. package/dist/core/security/governance.js +79 -0
  163. package/dist/core/session/auto-load.js +6 -6
  164. package/dist/core/session/index.d.ts +1 -1
  165. package/dist/core/session/index.js +1 -1
  166. package/dist/core/session/self-iteration-job.d.ts +20 -0
  167. package/dist/core/session/self-iteration-job.js +282 -0
  168. package/dist/core/session/session-hooks.d.ts +18 -0
  169. package/dist/core/session/session-hooks.js +58 -0
  170. package/dist/core/session-hooks/self-iteration-job.js +35 -35
  171. package/dist/core/{cache.js → storage/cache.js} +2 -2
  172. package/dist/core/sync/qmd-sync.d.ts +1 -13
  173. package/dist/core/sync/qmd-sync.js +1 -13
  174. package/dist/core/toon.d.ts +43 -0
  175. package/dist/core/toon.js +160 -0
  176. package/dist/core/utils/memory-operations.js +1 -1
  177. package/dist/core/utils/vector-operations.d.ts +71 -0
  178. package/dist/core/utils/vector-operations.js +129 -0
  179. package/dist/db/adapter.d.ts +3 -3
  180. package/dist/db/adapter.js +99 -88
  181. package/dist/db/bootstrap.js +820 -522
  182. package/dist/{drizzle → db/drizzle}/schema-sqlite.d.ts +74 -25
  183. package/dist/{drizzle → db/drizzle}/schema-sqlite.js +91 -24
  184. package/dist/{drizzle → db/drizzle}/schema.d.ts +79 -32
  185. package/dist/{drizzle → db/drizzle}/schema.js +106 -35
  186. package/dist/db/drizzle.config.d.ts +3 -0
  187. package/dist/db/drizzle.config.js +12 -0
  188. package/dist/db/index.d.ts +1 -5
  189. package/dist/db/index.js +51 -8
  190. package/dist/db/neon.d.ts +8 -0
  191. package/dist/db/neon.js +20 -0
  192. package/dist/db/schema/index.d.ts +40 -0
  193. package/dist/db/schema/index.js +105 -0
  194. package/dist/db/schema/tables/context-sessions.d.ts +9 -0
  195. package/dist/db/schema/tables/context-sessions.js +37 -0
  196. package/dist/db/schema/tables/conversations.d.ts +9 -0
  197. package/dist/db/schema/tables/conversations.js +47 -0
  198. package/dist/db/schema/tables/core-memory.d.ts +9 -0
  199. package/dist/db/schema/tables/core-memory.js +41 -0
  200. package/dist/db/schema/tables/entities.d.ts +9 -0
  201. package/dist/db/schema/tables/entities.js +39 -0
  202. package/dist/db/schema/tables/entity-relations.d.ts +9 -0
  203. package/dist/db/schema/tables/entity-relations.js +31 -0
  204. package/dist/db/schema/tables/learnings.d.ts +9 -0
  205. package/dist/db/schema/tables/learnings.js +66 -0
  206. package/dist/db/schema/tables/memories.d.ts +9 -0
  207. package/dist/db/schema/tables/memories.js +161 -0
  208. package/dist/db/schema/tables/memory-associations.d.ts +9 -0
  209. package/dist/db/schema/tables/memory-associations.js +39 -0
  210. package/dist/db/schema/tables/memory-hash-cache.d.ts +9 -0
  211. package/dist/db/schema/tables/memory-hash-cache.js +29 -0
  212. package/dist/db/schema/tables/memory-merge-history.d.ts +9 -0
  213. package/dist/db/schema/tables/memory-merge-history.js +33 -0
  214. package/dist/db/schema/tables/memory-merge-proposals.d.ts +9 -0
  215. package/dist/db/schema/tables/memory-merge-proposals.js +39 -0
  216. package/dist/db/schema/tables/messages.d.ts +9 -0
  217. package/dist/db/schema/tables/messages.js +41 -0
  218. package/dist/db/schema/tables/namespaces.d.ts +9 -0
  219. package/dist/db/schema/tables/namespaces.js +37 -0
  220. package/dist/db/schema/tables/projects.d.ts +9 -0
  221. package/dist/db/schema/tables/projects.js +31 -0
  222. package/dist/db/schema/tables/users.d.ts +9 -0
  223. package/dist/db/schema/tables/users.js +27 -0
  224. package/dist/db/schema.d.ts +1 -1
  225. package/dist/db/schema.js +2 -2
  226. package/dist/db/supabase.d.ts +9 -0
  227. package/dist/db/supabase.js +24 -0
  228. package/dist/index.d.ts +2 -14
  229. package/dist/index.js +1320 -640
  230. package/dist/vendor/sql.js/sql-wasm.wasm +0 -0
  231. package/dist/webui/server.d.ts +5 -0
  232. package/dist/{api/web/web.js → webui/server.js} +511 -508
  233. package/generated/mcp/manifest.json +1 -1
  234. package/{.mcp.json → mcp.json.example} +1 -1
  235. package/package.json +159 -181
  236. package/scripts/README.md +60 -0
  237. package/scripts/copy-runtime-assets.mjs +26 -0
  238. package/scripts/generate-mcp.mjs +264 -264
  239. package/scripts/github-release.sh +4 -4
  240. package/scripts/install-claude-code.sh +85 -0
  241. package/scripts/install-cursor.sh +56 -0
  242. package/scripts/install-hooks.sh +73 -0
  243. package/scripts/install-interactive.mjs +357 -677
  244. package/scripts/install-opencode.sh +75 -0
  245. package/scripts/install-windsurf.sh +67 -0
  246. package/skills/squish-memory/SKILL.md +104 -114
  247. package/skills/squish-memory/{install.mjs → scripts/install.mjs} +2 -2
  248. package/skills/squish-memory/{install.sh → scripts/install.sh} +2 -2
  249. package/skills/squish-memory/write_skill.js +2 -0
  250. package/.claude-plugin/marketplace.json +0 -20
  251. package/.claude-plugin/plugin.json +0 -32
  252. package/.env.mcp.example +0 -60
  253. package/QUICK-START.md +0 -71
  254. package/bin/squish-add.mjs +0 -32
  255. package/bin/squish-rm.mjs +0 -21
  256. package/commands/observe.md +0 -5
  257. package/dist/api/web/index.d.ts +0 -3
  258. package/dist/api/web/index.js +0 -4
  259. package/dist/api/web/web-server.d.ts +0 -3
  260. package/dist/api/web/web-server.js +0 -6
  261. package/dist/api/web/web.d.ts +0 -4
  262. package/dist/commands/mcp-server.js +0 -393
  263. package/dist/core/context.js +0 -24
  264. package/dist/core/governance.js +0 -64
  265. package/dist/core/observations.d.ts +0 -26
  266. package/dist/core/observations.js +0 -110
  267. package/dist/core/requirements.d.ts +0 -20
  268. package/dist/core/requirements.js +0 -35
  269. package/hooks/hooks.json +0 -52
  270. package/hooks/post-tool-use.js +0 -26
  271. package/hooks/session-end.js +0 -28
  272. package/hooks/session-start.js +0 -33
  273. package/hooks/user-prompt-submit.js +0 -26
  274. package/hooks/utils.js +0 -153
  275. package/npx-installer.js +0 -208
  276. package/packages/plugin-claude-code/README.md +0 -73
  277. package/packages/plugin-claude-code/dist/plugin-wrapper.d.ts +0 -35
  278. package/packages/plugin-claude-code/dist/plugin-wrapper.js +0 -191
  279. package/packages/plugin-claude-code/package.json +0 -31
  280. package/packages/plugin-openclaw/README.md +0 -70
  281. package/packages/plugin-openclaw/dist/index.d.ts +0 -49
  282. package/packages/plugin-openclaw/dist/index.js +0 -262
  283. package/packages/plugin-openclaw/openclaw.plugin.json +0 -94
  284. package/packages/plugin-openclaw/package.json +0 -31
  285. package/packages/plugin-opencode/install.mjs +0 -217
  286. package/packages/plugin-opencode/package.json +0 -21
  287. package/scripts/db/check-db.mjs +0 -88
  288. package/scripts/db/fix-all-columns.mjs +0 -52
  289. package/scripts/db/fix-schema-all.mjs +0 -55
  290. package/scripts/db/fix-schema-full.mjs +0 -46
  291. package/scripts/db/fix-schema.mjs +0 -38
  292. package/scripts/db/init-db.mjs +0 -13
  293. package/scripts/db/recreate-db.mjs +0 -14
  294. package/scripts/install-mcp.mjs +0 -116
  295. package/scripts/install-web.sh +0 -120
  296. package/scripts/install.mjs +0 -340
  297. package/scripts/openclaw-bootstrap.mjs +0 -127
  298. package/scripts/package-release.sh +0 -71
  299. package/scripts/test/test-all-systems.mjs +0 -139
  300. package/scripts/test/test-memory-system.mjs +0 -139
  301. package/scripts/test/test-v0.5.0.mjs +0 -210
  302. package/skills/memory-guide/SKILL.md +0 -332
  303. package/skills/squish-cli/SKILL.md +0 -240
  304. package/skills/squish-mcp/SKILL.md +0 -355
  305. package/skills/squish-memory/claude-desktop.json +0 -12
  306. package/skills/squish-memory/openclaw.json +0 -13
  307. package/skills/squish-memory/opencode.json +0 -14
  308. package/skills/squish-memory/skill.json +0 -32
  309. /package/{commands → core/commands}/context-paging.md +0 -0
  310. /package/{commands → core/commands}/context-status.md +0 -0
  311. /package/{commands → core/commands}/context.md +0 -0
  312. /package/{commands → core/commands}/core-memory.md +0 -0
  313. /package/{commands → core/commands}/health.md +0 -0
  314. /package/{commands → core/commands}/merge.md +0 -0
  315. /package/{commands → core/commands}/recall.md +0 -0
  316. /package/{commands → core/commands}/remember.md +0 -0
  317. /package/{commands → core/commands}/search.md +0 -0
  318. /package/dist/{algorithms → core/algorithms}/detection/hash-filters.d.ts +0 -0
  319. /package/dist/{algorithms → core/algorithms}/detection/hash-filters.js +0 -0
  320. /package/dist/{algorithms → core/algorithms}/handlers/approve-merge.d.ts +0 -0
  321. /package/dist/{algorithms → core/algorithms}/handlers/detect-duplicates.d.ts +0 -0
  322. /package/dist/{algorithms → core/algorithms}/handlers/get-stats.d.ts +0 -0
  323. /package/dist/{algorithms → core/algorithms}/handlers/list-proposals.d.ts +0 -0
  324. /package/dist/{algorithms → core/algorithms}/handlers/preview-merge.d.ts +0 -0
  325. /package/dist/{algorithms → core/algorithms}/handlers/reject-merge.d.ts +0 -0
  326. /package/dist/{algorithms → core/algorithms}/handlers/reverse-merge.d.ts +0 -0
  327. /package/dist/{algorithms → core/algorithms}/safety/safety-checks.js +0 -0
  328. /package/dist/{algorithms → core/algorithms}/utils/response-builder.d.ts +0 -0
  329. /package/dist/{algorithms → core/algorithms}/utils/response-builder.js +0 -0
  330. /package/dist/{commands → core/commands}/managed-sync.d.ts +0 -0
  331. /package/dist/{commands → core/commands}/mcp-server.d.ts +0 -0
  332. /package/dist/core/{context.d.ts → context/context.d.ts} +0 -0
  333. /package/dist/core/{agent-memory.d.ts → ingestion/agent-memory.d.ts} +0 -0
  334. /package/dist/core/{core-memory.d.ts → ingestion/core-memory.d.ts} +0 -0
  335. /package/dist/core/{privacy.d.ts → security/privacy.d.ts} +0 -0
  336. /package/dist/core/{privacy.js → security/privacy.js} +0 -0
  337. /package/dist/core/{secret-detector.d.ts → security/secret-detector.d.ts} +0 -0
  338. /package/dist/core/{secret-detector.js → security/secret-detector.js} +0 -0
  339. /package/dist/core/{cache.d.ts → storage/cache.d.ts} +0 -0
  340. /package/dist/core/{database.d.ts → storage/database.d.ts} +0 -0
  341. /package/dist/core/{database.js → storage/database.js} +0 -0
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Agent Context API - Direct access for agents
3
+ *
4
+ * Provides a simple API for agents to get context without CLI calls.
5
+ * Use this instead of spawning squish CLI processes.
6
+ *
7
+ * Usage:
8
+ * import { getAgentContext, searchWithPlace } from './core/context/agent-context.js';
9
+ *
10
+ * const context = await getAgentContext(projectPath, { task: "fix bug" });
11
+ * const results = await searchWithPlace(projectPath, "error fix", { limit: 5 });
12
+ */
13
+ export interface AgentContextOptions {
14
+ /** Current task or action (helps auto-detect relevant place) */
15
+ task?: string;
16
+ /** Preferred tier: quick (50 tokens), medium (170), full (500) */
17
+ tier?: 'quick' | 'medium' | 'full';
18
+ /** Max memories to return */
19
+ limit?: number;
20
+ /** Include place context */
21
+ includePlaces?: boolean;
22
+ }
23
+ export interface SearchOptions {
24
+ /** Query string */
25
+ query: string;
26
+ /** Optional place filter */
27
+ place?: string;
28
+ /** Max results */
29
+ limit?: number;
30
+ /** Memory type filter */
31
+ type?: string;
32
+ }
33
+ /**
34
+ * Get agent context - the main function I can call directly
35
+ *
36
+ * Instead of: squish context --tier medium --has-memories
37
+ * Use: const ctx = await getAgentContext(projectPath, { task: "fix bug", tier: "medium" })
38
+ */
39
+ export declare function getAgentContext(projectPath: string, options?: AgentContextOptions): Promise<{
40
+ ok: boolean;
41
+ memories: Array<{
42
+ id: string;
43
+ type: string;
44
+ content: string;
45
+ place?: string;
46
+ placeType?: string;
47
+ }>;
48
+ places: Array<{
49
+ name: string;
50
+ type: string;
51
+ purpose?: string;
52
+ memories: number;
53
+ preview?: string[];
54
+ }>;
55
+ sessionId?: string;
56
+ tokens?: number;
57
+ }>;
58
+ /**
59
+ * Search memories with automatic place detection
60
+ *
61
+ * If query contains keywords associated with a place (e.g., "fix" -> Workshop),
62
+ * it will automatically include that place in results or boost those results.
63
+ */
64
+ export declare function searchWithPlace(projectPath: string, query: string, options?: SearchOptions): Promise<{
65
+ ok: boolean;
66
+ query: string;
67
+ autoDetectedPlace?: string;
68
+ count: number;
69
+ results: Array<{
70
+ id: string;
71
+ type: string;
72
+ content: string;
73
+ score: number;
74
+ place?: string;
75
+ placeType?: string;
76
+ }>;
77
+ }>;
78
+ /**
79
+ * Get single memory with place info
80
+ */
81
+ export declare function getMemoryWithPlace(projectPath: string, memoryId: string): Promise<{
82
+ ok: boolean;
83
+ memory?: {
84
+ id: string;
85
+ type: string;
86
+ content: string;
87
+ tags: string[];
88
+ createdAt: Date;
89
+ place?: string;
90
+ placeType?: string;
91
+ };
92
+ }>;
93
+ /**
94
+ * Quick context for session start - lightweight version
95
+ * Use this when you just need the basics without full context
96
+ */
97
+ export declare function getQuickContext(projectPath: string, limit?: number): Promise<{
98
+ ok: boolean;
99
+ memories: Array<{
100
+ id: string;
101
+ type: string;
102
+ content: string;
103
+ }>;
104
+ activePlaces: string[];
105
+ }>;
106
+ //# sourceMappingURL=agent-context.d.ts.map
@@ -0,0 +1,274 @@
1
+ /**
2
+ * Agent Context API - Direct access for agents
3
+ *
4
+ * Provides a simple API for agents to get context without CLI calls.
5
+ * Use this instead of spawning squish CLI processes.
6
+ *
7
+ * Usage:
8
+ * import { getAgentContext, searchWithPlace } from './core/context/agent-context.js';
9
+ *
10
+ * const context = await getAgentContext(projectPath, { task: "fix bug" });
11
+ * const results = await searchWithPlace(projectPath, "error fix", { limit: 5 });
12
+ */
13
+ import { getRecent, search } from '../memory/memories.js';
14
+ import { getProjectByPath } from '../projects.js';
15
+ import { ensureProject } from '../projects.js';
16
+ import { initializeDefaultPlaces, getProjectPlaces, getMemoryPlace, getPlace, walkPlace } from '../places/index.js';
17
+ import { logger } from '../logger.js';
18
+ /**
19
+ * Get agent context - the main function I can call directly
20
+ *
21
+ * Instead of: squish context --tier medium --has-memories
22
+ * Use: const ctx = await getAgentContext(projectPath, { task: "fix bug", tier: "medium" })
23
+ */
24
+ export async function getAgentContext(projectPath, options = {}) {
25
+ try {
26
+ await ensureProject(projectPath);
27
+ const project = await getProjectByPath(projectPath);
28
+ if (!project) {
29
+ return { ok: false, memories: [], places: [] };
30
+ }
31
+ const tier = options.tier || 'medium';
32
+ const limit = options.limit || 5;
33
+ const includePlaces = options.includePlaces !== false;
34
+ // Get recent memories
35
+ const memories = await getRecent(projectPath, limit);
36
+ // Add place info to each memory
37
+ const memoriesWithPlace = await Promise.all(memories.map(async (m) => {
38
+ const placeId = await getMemoryPlace(m.id);
39
+ let placeInfo = {};
40
+ if (placeId) {
41
+ const place = await getPlace(placeId);
42
+ placeInfo = { place: place?.name || null, placeType: place?.placeType || null };
43
+ }
44
+ return {
45
+ id: m.id,
46
+ type: m.type,
47
+ content: m.content || m.content,
48
+ ...placeInfo,
49
+ };
50
+ }));
51
+ // Get places context
52
+ let places = [];
53
+ if (includePlaces) {
54
+ await initializeDefaultPlaces(project.id);
55
+ const projectPlaces = await getProjectPlaces(project.id);
56
+ // Filter to populated places only
57
+ const populatedPlaces = projectPlaces.filter(p => p.memoryCount > 0);
58
+ if (tier === 'quick') {
59
+ // Just names
60
+ places = populatedPlaces.map(p => ({
61
+ name: p.name,
62
+ type: p.placeType,
63
+ memories: p.memoryCount,
64
+ }));
65
+ }
66
+ else if (tier === 'medium') {
67
+ // Top 3 per place
68
+ const mediumPlaces = [];
69
+ for (const p of populatedPlaces.slice(0, 5)) {
70
+ const walkResult = await walkPlace(project.id, p.placeType, {
71
+ tokenBudget: 170,
72
+ maxMemoriesPerPlace: 3,
73
+ compressWithToon: false,
74
+ });
75
+ mediumPlaces.push({
76
+ name: p.name,
77
+ type: p.placeType,
78
+ purpose: p.purpose,
79
+ memories: p.memoryCount,
80
+ preview: walkResult?.memories.slice(0, 3).map((m) => m.content?.substring(0, 80)) || [],
81
+ });
82
+ }
83
+ places = mediumPlaces;
84
+ }
85
+ else {
86
+ // Full
87
+ places = populatedPlaces.map(p => ({
88
+ name: p.name,
89
+ type: p.placeType,
90
+ purpose: p.purpose,
91
+ memories: p.memoryCount,
92
+ }));
93
+ }
94
+ }
95
+ // Estimate token count
96
+ const tokens = tier === 'quick' ? 50 : tier === 'medium' ? 170 : 500;
97
+ return {
98
+ ok: true,
99
+ memories: memoriesWithPlace,
100
+ places,
101
+ tokens,
102
+ };
103
+ }
104
+ catch (error) {
105
+ logger.error('[AgentContext] Error getting context:', error);
106
+ return { ok: false, memories: [], places: [] };
107
+ }
108
+ }
109
+ /**
110
+ * Search memories with automatic place detection
111
+ *
112
+ * If query contains keywords associated with a place (e.g., "fix" -> Workshop),
113
+ * it will automatically include that place in results or boost those results.
114
+ */
115
+ export async function searchWithPlace(projectPath, query, options = { query, limit: 10 }) {
116
+ try {
117
+ await ensureProject(projectPath);
118
+ const project = await getProjectByPath(projectPath);
119
+ if (!project) {
120
+ return { ok: false, query, count: 0, results: [] };
121
+ }
122
+ // Search
123
+ const results = await search({
124
+ query,
125
+ type: options.type,
126
+ limit: (options.limit || 10) * 2,
127
+ project: projectPath,
128
+ });
129
+ const limited = results.slice(0, options.limit || 10);
130
+ // Auto-detect place from query keywords
131
+ const autoPlace = detectPlaceFromQuery(query);
132
+ // Add place info to results
133
+ const resultsWithPlace = await Promise.all(limited.map(async (r) => {
134
+ const placeId = await getMemoryPlace(r.id);
135
+ let placeInfo = { place: null, placeType: null };
136
+ if (placeId) {
137
+ const place = await getPlace(placeId);
138
+ placeInfo = {
139
+ place: place?.name || null,
140
+ placeType: place?.placeType || null,
141
+ };
142
+ }
143
+ return {
144
+ id: r.id,
145
+ type: r.type,
146
+ content: r.content,
147
+ score: r.similarity ?? 0,
148
+ ...placeInfo,
149
+ };
150
+ }));
151
+ // Filter by place if specified or auto-detected
152
+ let filtered = resultsWithPlace;
153
+ const placeFilter = options.place || autoPlace;
154
+ if (placeFilter) {
155
+ filtered = resultsWithPlace.filter((r) => r.placeType === placeFilter);
156
+ }
157
+ return {
158
+ ok: true,
159
+ query,
160
+ autoDetectedPlace: autoPlace || undefined,
161
+ count: filtered.length,
162
+ results: filtered,
163
+ };
164
+ }
165
+ catch (error) {
166
+ logger.error('[AgentContext] Error searching:', error);
167
+ return { ok: false, query, count: 0, results: [] };
168
+ }
169
+ }
170
+ /**
171
+ * Detect place type from query keywords
172
+ *
173
+ * Maps common terms to place types:
174
+ * - fix, bug, error, issue -> workshop (fixing stuff)
175
+ * - design, plan, architecture, api -> library (learning/docs)
176
+ * - task, todo, manage, organize -> office (work management)
177
+ * - code, implement, feature -> workshop
178
+ * - research, learn, study -> library
179
+ * - experiment, test, try -> lab
180
+ * - review, archive -> archive
181
+ */
182
+ function detectPlaceFromQuery(query) {
183
+ const q = query.toLowerCase();
184
+ // Map keywords to places
185
+ const keywords = {
186
+ workshop: ['fix', 'bug', 'error', 'issue', 'code', 'implement', 'feature', 'refactor', 'debug'],
187
+ library: ['design', 'plan', 'architecture', 'api', 'learn', 'research', 'study', 'documentation', 'docs'],
188
+ office: ['task', 'todo', 'manage', 'organize', 'schedule', 'meeting', 'project'],
189
+ lab: ['test', 'experiment', 'try', 'verify', 'prototype', 'poc'],
190
+ garden: ['idea', 'brainstorm', 'create', 'design', 'concept'],
191
+ archive: ['review', 'archive', 'old', 'past', 'historical'],
192
+ };
193
+ // Check each place's keywords
194
+ for (const [placeType, words] of Object.entries(keywords)) {
195
+ for (const word of words) {
196
+ if (q.includes(word)) {
197
+ return placeType;
198
+ }
199
+ }
200
+ }
201
+ return null;
202
+ }
203
+ /**
204
+ * Get single memory with place info
205
+ */
206
+ export async function getMemoryWithPlace(projectPath, memoryId) {
207
+ try {
208
+ const { getMemory } = await import('../memory/memories.js');
209
+ const memory = await getMemory(memoryId);
210
+ if (!memory) {
211
+ return { ok: false };
212
+ }
213
+ // Get place info
214
+ const placeId = await getMemoryPlace(memoryId);
215
+ let placeInfo = {};
216
+ if (placeId) {
217
+ const place = await getPlace(placeId);
218
+ placeInfo = {
219
+ place: place?.name || null,
220
+ placeType: place?.placeType || null,
221
+ };
222
+ }
223
+ return {
224
+ ok: true,
225
+ memory: {
226
+ id: memory.id,
227
+ type: memory.type,
228
+ content: memory.content || '',
229
+ tags: memory.tags || [],
230
+ createdAt: memory.createdAt,
231
+ ...placeInfo,
232
+ },
233
+ };
234
+ }
235
+ catch (error) {
236
+ logger.error('[AgentContext] Error getting memory:', error);
237
+ return { ok: false };
238
+ }
239
+ }
240
+ /**
241
+ * Quick context for session start - lightweight version
242
+ * Use this when you just need the basics without full context
243
+ */
244
+ export async function getQuickContext(projectPath, limit = 3) {
245
+ try {
246
+ await ensureProject(projectPath);
247
+ const project = await getProjectByPath(projectPath);
248
+ if (!project) {
249
+ return { ok: false, memories: [], activePlaces: [] };
250
+ }
251
+ // Get recent memories
252
+ const memories = await getRecent(projectPath, limit);
253
+ // Get places with memories
254
+ await initializeDefaultPlaces(project.id);
255
+ const places = await getProjectPlaces(project.id);
256
+ const activePlaces = places
257
+ .filter(p => p.memoryCount > 0)
258
+ .map(p => p.name);
259
+ return {
260
+ ok: true,
261
+ memories: memories.map((m) => ({
262
+ id: m.id,
263
+ type: m.type,
264
+ content: m.content?.substring(0, 100) || '',
265
+ })),
266
+ activePlaces,
267
+ };
268
+ }
269
+ catch (error) {
270
+ logger.error('[AgentContext] Error getting quick context:', error);
271
+ return { ok: false, memories: [], activePlaces: [] };
272
+ }
273
+ }
274
+ //# sourceMappingURL=agent-context.js.map
@@ -1,14 +1,6 @@
1
1
  /**
2
- * Context Paging Service - Agent-controlled memory loading (Tier 2)
3
- *
4
- * Simple memory tracking system that allows agents to:
5
- * - Load memories into their working set
6
- * - Evict memories from working set
7
- * - View what's currently in their working set
8
- *
9
- * Note: This does NOT track tokens - Claude is context-aware and manages
10
- * its own token budget. This just tracks WHAT memories are in the agent's
11
- * current working set for visibility and management.
2
+ * Context Paging Service - Agent-controlled memory loading
3
+ * Allows agents to load/evict memories from working set
12
4
  */
13
5
  interface LoadedMemory {
14
6
  id: string;
@@ -24,7 +16,6 @@ interface LoadedMemory {
24
16
  export declare function initializeContextSession(sessionId: string, projectId: string, userId?: string): Promise<void>;
25
17
  /**
26
18
  * Load a memory into working set
27
- * Note: Claude manages its own context - this just tracks what you've loaded
28
19
  */
29
20
  export declare function loadMemoryToContext(sessionId: string, memoryId: string): Promise<{
30
21
  success: boolean;
@@ -48,7 +39,6 @@ export declare function viewLoadedMemories(sessionId: string): Promise<{
48
39
  }>;
49
40
  /**
50
41
  * Get context status - what's in your working set and what's available
51
- * Note: Claude manages its own context/tokens - this just shows WHAT you have loaded
52
42
  */
53
43
  export declare function getContextStatus(sessionId: string, projectId: string): Promise<{
54
44
  success: boolean;
@@ -1,28 +1,17 @@
1
1
  /**
2
- * Context Paging Service - Agent-controlled memory loading (Tier 2)
3
- *
4
- * Simple memory tracking system that allows agents to:
5
- * - Load memories into their working set
6
- * - Evict memories from working set
7
- * - View what's currently in their working set
8
- *
9
- * Note: This does NOT track tokens - Claude is context-aware and manages
10
- * its own token budget. This just tracks WHAT memories are in the agent's
11
- * current working set for visibility and management.
2
+ * Context Paging Service - Agent-controlled memory loading
3
+ * Allows agents to load/evict memories from working set
12
4
  */
13
5
  import { eq, and } from 'drizzle-orm';
14
6
  import { sql } from 'drizzle-orm';
15
- import { getDb } from '../db/index.js';
16
- import { getSchema } from '../db/schema.js';
17
- import { createDatabaseClient } from './database.js';
18
- import { getMemoryById } from './memory/memories.js';
7
+ import { getMemory } from '../memory/memories.js';
8
+ import { getDbClient } from '../lib/db-client.js';
19
9
  /**
20
10
  * Initialize or get a context session
21
11
  * Simplified - just tracks what's loaded, not tokens (Claude manages its own context)
22
12
  */
23
13
  export async function initializeContextSession(sessionId, projectId, userId) {
24
- const db = createDatabaseClient(await getDb());
25
- const schema = await getSchema();
14
+ const { db, schema } = await getDbClient();
26
15
  const { contextSessions } = schema;
27
16
  // Check if session exists
28
17
  const existing = await db
@@ -46,11 +35,9 @@ export async function initializeContextSession(sessionId, projectId, userId) {
46
35
  }
47
36
  /**
48
37
  * Load a memory into working set
49
- * Note: Claude manages its own context - this just tracks what you've loaded
50
38
  */
51
39
  export async function loadMemoryToContext(sessionId, memoryId) {
52
- const db = createDatabaseClient(await getDb());
53
- const schema = await getSchema();
40
+ const { db, schema } = await getDbClient();
54
41
  const { contextSessions } = schema;
55
42
  // Get session
56
43
  const session = await db
@@ -74,7 +61,7 @@ export async function loadMemoryToContext(sessionId, memoryId) {
74
61
  };
75
62
  }
76
63
  // Get memory
77
- const memory = await getMemoryById(memoryId);
64
+ const memory = await getMemory(memoryId);
78
65
  if (!memory) {
79
66
  return {
80
67
  success: false,
@@ -112,8 +99,7 @@ export async function loadMemoryToContext(sessionId, memoryId) {
112
99
  * Evict a memory from working set
113
100
  */
114
101
  export async function evictMemoryFromContext(sessionId, memoryId) {
115
- const db = createDatabaseClient(await getDb());
116
- const schema = await getSchema();
102
+ const { db, schema } = await getDbClient();
117
103
  const { contextSessions } = schema;
118
104
  // Get session
119
105
  const session = await db
@@ -161,8 +147,7 @@ export async function evictMemoryFromContext(sessionId, memoryId) {
161
147
  * View all memories in working set
162
148
  */
163
149
  export async function viewLoadedMemories(sessionId) {
164
- const db = createDatabaseClient(await getDb());
165
- const schema = await getSchema();
150
+ const { db, schema } = await getDbClient();
166
151
  const { contextSessions } = schema;
167
152
  // Get session
168
153
  const session = await db
@@ -189,7 +174,7 @@ export async function viewLoadedMemories(sessionId) {
189
174
  // Get all loaded memories
190
175
  const memories = [];
191
176
  for (const id of loadedIds) {
192
- const memory = await getMemoryById(id);
177
+ const memory = await getMemory(id);
193
178
  if (memory) {
194
179
  memories.push({
195
180
  id: memory.id,
@@ -208,12 +193,10 @@ export async function viewLoadedMemories(sessionId) {
208
193
  }
209
194
  /**
210
195
  * Get context status - what's in your working set and what's available
211
- * Note: Claude manages its own context/tokens - this just shows WHAT you have loaded
212
196
  */
213
197
  export async function getContextStatus(sessionId, projectId) {
214
- const db = createDatabaseClient(await getDb());
215
- const schema = await getSchema();
216
- const { contextSessions, memories, observations } = schema;
198
+ const { db, schema } = await getDbClient();
199
+ const { contextSessions, memories, learnings } = schema;
217
200
  // Get session
218
201
  const session = await db
219
202
  .select()
@@ -231,13 +214,13 @@ export async function getContextStatus(sessionId, projectId) {
231
214
  }
232
215
  const currentSession = session[0];
233
216
  // Get core memory stats
234
- const { getCoreMemoryStats } = await import('./core-memory.js');
217
+ const { getCoreMemoryStats } = await import('../ingestion/core-memory.js');
235
218
  const coreStats = await getCoreMemoryStats(projectId);
236
219
  // Get loaded memories
237
220
  const loadedIds = currentSession.loadedMemoryIds || [];
238
221
  const loadedMemories = [];
239
222
  for (const id of loadedIds) {
240
- const memory = await getMemoryById(id);
223
+ const memory = await getMemory(id);
241
224
  if (memory) {
242
225
  loadedMemories.push({
243
226
  id: memory.id,
@@ -253,8 +236,8 @@ export async function getContextStatus(sessionId, projectId) {
253
236
  .where(eq(memories.projectId, projectId));
254
237
  const totalObservations = await db
255
238
  .select()
256
- .from(observations)
257
- .where(eq(observations.projectId, projectId));
239
+ .from(learnings)
240
+ .where(eq(learnings.projectId, projectId));
258
241
  return {
259
242
  success: true,
260
243
  coreMemory: {
@@ -277,8 +260,7 @@ export async function getContextStatus(sessionId, projectId) {
277
260
  * Clear all loaded memories from working set
278
261
  */
279
262
  export async function clearLoadedMemories(sessionId) {
280
- const db = createDatabaseClient(await getDb());
281
- const schema = await getSchema();
263
+ const { db, schema } = await getDbClient();
282
264
  const { contextSessions } = schema;
283
265
  await db
284
266
  .update(contextSessions)
@@ -296,8 +278,7 @@ export async function clearLoadedMemories(sessionId) {
296
278
  * Get all memories currently marked as in-context for a session
297
279
  */
298
280
  export async function getInContextMemories(sessionId) {
299
- const db = createDatabaseClient(await getDb());
300
- const schema = await getSchema();
281
+ const { db, schema } = await getDbClient();
301
282
  const { contextSessions } = schema;
302
283
  // Get session to find project
303
284
  const session = await db
@@ -327,8 +308,7 @@ export async function getInContextMemories(sessionId) {
327
308
  * Get out-of-context (archived) memories for a project
328
309
  */
329
310
  export async function getOutOfContextMemories(projectId, limit = 10) {
330
- const db = createDatabaseClient(await getDb());
331
- const schema = await getSchema();
311
+ const { db, schema } = await getDbClient();
332
312
  const { memories } = schema;
333
313
  // Get out-of-context memories, ordered by last accessed
334
314
  const outOfContextMemories = await db
@@ -0,0 +1,40 @@
1
+ export interface ContextWindowConfig {
2
+ maxTokens: number;
3
+ warningThreshold: number;
4
+ criticalThreshold: number;
5
+ }
6
+ export declare const DEFAULT_CONTEXT_CONFIG: ContextWindowConfig;
7
+ export interface TokenUsageStats {
8
+ coreMemoryTokens: number;
9
+ memoriesTokens: number;
10
+ totalTokens: number;
11
+ maxTokens: number;
12
+ usagePercent: number;
13
+ status: 'ok' | 'warning' | 'critical';
14
+ remainingTokens: number;
15
+ }
16
+ export interface OptimizationSuggestion {
17
+ type: 'drop' | 'summarize' | 'consolidate';
18
+ memoryId: string;
19
+ memoryType: string;
20
+ contentPreview: string;
21
+ tokens: number;
22
+ reason: string;
23
+ priority: number;
24
+ }
25
+ export declare function estimateTokens(content: string): number;
26
+ export declare function getTokenUsage(projectPath: string): Promise<TokenUsageStats>;
27
+ export declare function checkContextLimit(projectPath: string, additionalTokens: number): Promise<{
28
+ ok: boolean;
29
+ warning?: string;
30
+ stats: TokenUsageStats;
31
+ }>;
32
+ export declare function getOptimizationSuggestions(projectPath: string): Promise<OptimizationSuggestion[]>;
33
+ export declare function getContextWindowStatus(projectPath: string): Promise<{
34
+ config: ContextWindowConfig;
35
+ usage: TokenUsageStats;
36
+ suggestions: OptimizationSuggestion[];
37
+ memoryCount: number;
38
+ coreMemorySections: number;
39
+ }>;
40
+ //# sourceMappingURL=context-window.d.ts.map