squish-memory 0.8.2 → 0.9.2

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 (283) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +2 -2
  3. package/.env.mcp +30 -0
  4. package/.mcp.json +2 -5
  5. package/CHANGELOG.md +111 -0
  6. package/QUICK-START.md +65 -0
  7. package/README.md +188 -530
  8. package/commands/managed-sync.ts +69 -0
  9. package/commands/mcp-server.ts +519 -0
  10. package/config/mcp-cli-fallback-policy.json +22 -0
  11. package/config/mcp-migration-map.json +22 -0
  12. package/config/mcp-mode-semantics.json +21 -0
  13. package/config/mcp-remote-auth.json +36 -0
  14. package/config/mcp-universal.schema.json +48 -0
  15. package/config/mcp.json +38 -0
  16. package/config/remote-memory-policy.json +32 -0
  17. package/dist/algorithms/merge/detection/hash-filters.js +2 -2
  18. package/dist/algorithms/merge/detection/hash-filters.js.map +1 -1
  19. package/dist/algorithms/merge/detection/two-stage-detector.d.ts +5 -2
  20. package/dist/algorithms/merge/detection/two-stage-detector.d.ts.map +1 -1
  21. package/dist/algorithms/merge/detection/two-stage-detector.js +139 -22
  22. package/dist/algorithms/merge/detection/two-stage-detector.js.map +1 -1
  23. package/dist/api/web/index.d.ts +3 -0
  24. package/dist/api/web/index.d.ts.map +1 -0
  25. package/dist/api/web/index.js +4 -0
  26. package/dist/api/web/index.js.map +1 -0
  27. package/dist/api/web/web-server.d.ts +3 -0
  28. package/dist/api/web/web-server.d.ts.map +1 -0
  29. package/dist/api/web/web-server.js +6 -0
  30. package/dist/api/web/web-server.js.map +1 -0
  31. package/dist/api/web/web.d.ts.map +1 -1
  32. package/dist/api/web/web.js +227 -78
  33. package/dist/api/web/web.js.map +1 -1
  34. package/dist/commands/managed-sync.d.ts +10 -0
  35. package/dist/commands/managed-sync.d.ts.map +1 -0
  36. package/dist/commands/managed-sync.js +64 -0
  37. package/dist/commands/managed-sync.js.map +1 -0
  38. package/dist/commands/mcp-server.d.ts +3 -0
  39. package/dist/commands/mcp-server.d.ts.map +1 -0
  40. package/dist/commands/mcp-server.js +389 -0
  41. package/dist/commands/mcp-server.js.map +1 -0
  42. package/dist/config.d.ts +24 -1
  43. package/dist/config.d.ts.map +1 -1
  44. package/dist/config.js +32 -1
  45. package/dist/config.js.map +1 -1
  46. package/dist/core/associations.d.ts +1 -1
  47. package/dist/core/associations.d.ts.map +1 -1
  48. package/dist/core/consolidation.d.ts +31 -0
  49. package/dist/core/consolidation.d.ts.map +1 -1
  50. package/dist/core/consolidation.js +237 -29
  51. package/dist/core/consolidation.js.map +1 -1
  52. package/dist/core/embeddings/google-multimodal.d.ts +14 -0
  53. package/dist/core/embeddings/google-multimodal.d.ts.map +1 -0
  54. package/dist/core/embeddings/google-multimodal.js +142 -0
  55. package/dist/core/embeddings/google-multimodal.js.map +1 -0
  56. package/dist/core/embeddings.d.ts +3 -2
  57. package/dist/core/embeddings.d.ts.map +1 -1
  58. package/dist/core/embeddings.js +61 -39
  59. package/dist/core/embeddings.js.map +1 -1
  60. package/dist/core/mcp/client.d.ts +17 -0
  61. package/dist/core/mcp/client.d.ts.map +1 -0
  62. package/dist/core/mcp/client.js +101 -0
  63. package/dist/core/mcp/client.js.map +1 -0
  64. package/dist/core/mcp/index.d.ts +6 -0
  65. package/dist/core/mcp/index.d.ts.map +1 -0
  66. package/dist/core/mcp/index.js +6 -0
  67. package/dist/core/mcp/index.js.map +1 -0
  68. package/dist/core/mcp/server.d.ts +18 -0
  69. package/dist/core/mcp/server.d.ts.map +1 -0
  70. package/dist/core/mcp/server.js +131 -0
  71. package/dist/core/mcp/server.js.map +1 -0
  72. package/dist/core/mcp/standalone-server.d.ts +13 -0
  73. package/dist/core/mcp/standalone-server.d.ts.map +1 -0
  74. package/dist/core/mcp/standalone-server.js +46 -0
  75. package/dist/core/mcp/standalone-server.js.map +1 -0
  76. package/dist/core/mcp/tools.d.ts +9 -0
  77. package/dist/core/mcp/tools.d.ts.map +1 -0
  78. package/dist/core/mcp/tools.js +262 -0
  79. package/dist/core/mcp/tools.js.map +1 -0
  80. package/dist/core/mcp/types.d.ts +315 -0
  81. package/dist/core/mcp/types.d.ts.map +1 -0
  82. package/dist/core/mcp/types.js +48 -0
  83. package/dist/core/mcp/types.js.map +1 -0
  84. package/dist/core/memory/categorizer.d.ts +27 -0
  85. package/dist/core/memory/categorizer.d.ts.map +1 -0
  86. package/dist/core/memory/categorizer.js +304 -0
  87. package/dist/core/memory/categorizer.js.map +1 -0
  88. package/dist/core/memory/conflict-detector.d.ts +7 -0
  89. package/dist/core/memory/conflict-detector.d.ts.map +1 -0
  90. package/dist/core/memory/conflict-detector.js +43 -0
  91. package/dist/core/memory/conflict-detector.js.map +1 -0
  92. package/dist/core/memory/context-collector.d.ts +10 -0
  93. package/dist/core/memory/context-collector.d.ts.map +1 -0
  94. package/dist/core/memory/context-collector.js +55 -0
  95. package/dist/core/memory/context-collector.js.map +1 -0
  96. package/dist/core/memory/contradiction-resolver.d.ts +40 -0
  97. package/dist/core/memory/contradiction-resolver.d.ts.map +1 -0
  98. package/dist/core/memory/contradiction-resolver.js +368 -0
  99. package/dist/core/memory/contradiction-resolver.js.map +1 -0
  100. package/dist/core/memory/edit-workflow.d.ts +19 -0
  101. package/dist/core/memory/edit-workflow.d.ts.map +1 -0
  102. package/dist/core/memory/edit-workflow.js +120 -0
  103. package/dist/core/memory/edit-workflow.js.map +1 -0
  104. package/dist/core/memory/feedback-tracker.d.ts +12 -0
  105. package/dist/core/memory/feedback-tracker.d.ts.map +1 -0
  106. package/dist/core/memory/feedback-tracker.js +151 -0
  107. package/dist/core/memory/feedback-tracker.js.map +1 -0
  108. package/dist/core/memory/hybrid-retrieval.d.ts +11 -12
  109. package/dist/core/memory/hybrid-retrieval.d.ts.map +1 -1
  110. package/dist/core/memory/hybrid-retrieval.js +56 -28
  111. package/dist/core/memory/hybrid-retrieval.js.map +1 -1
  112. package/dist/core/memory/hybrid-scorer.d.ts +5 -16
  113. package/dist/core/memory/hybrid-scorer.d.ts.map +1 -1
  114. package/dist/core/memory/hybrid-scorer.js +161 -125
  115. package/dist/core/memory/hybrid-scorer.js.map +1 -1
  116. package/dist/core/memory/hybrid-search.js +64 -22
  117. package/dist/core/memory/hybrid-search.js.map +1 -1
  118. package/dist/core/memory/memories.d.ts +4 -0
  119. package/dist/core/memory/memories.d.ts.map +1 -1
  120. package/dist/core/memory/memories.js +138 -60
  121. package/dist/core/memory/memories.js.map +1 -1
  122. package/dist/core/memory/progressive-disclosure.d.ts +43 -0
  123. package/dist/core/memory/progressive-disclosure.d.ts.map +1 -0
  124. package/dist/core/memory/progressive-disclosure.js +280 -0
  125. package/dist/core/memory/progressive-disclosure.js.map +1 -0
  126. package/dist/core/memory/query-rewriter.d.ts +13 -0
  127. package/dist/core/memory/query-rewriter.d.ts.map +1 -0
  128. package/dist/core/memory/query-rewriter.js +118 -0
  129. package/dist/core/memory/query-rewriter.js.map +1 -0
  130. package/dist/core/memory/response-analyzer.d.ts +9 -0
  131. package/dist/core/memory/response-analyzer.d.ts.map +1 -0
  132. package/dist/core/memory/response-analyzer.js +61 -0
  133. package/dist/core/memory/response-analyzer.js.map +1 -0
  134. package/dist/core/memory/stats.d.ts +17 -0
  135. package/dist/core/memory/stats.d.ts.map +1 -0
  136. package/dist/core/memory/stats.js +87 -0
  137. package/dist/core/memory/stats.js.map +1 -0
  138. package/dist/core/memory/telemetry.d.ts +69 -0
  139. package/dist/core/memory/telemetry.d.ts.map +1 -0
  140. package/dist/core/memory/telemetry.js +313 -0
  141. package/dist/core/memory/telemetry.js.map +1 -0
  142. package/dist/core/memory/temporal-facts.d.ts +41 -0
  143. package/dist/core/memory/temporal-facts.d.ts.map +1 -0
  144. package/dist/core/memory/temporal-facts.js +262 -0
  145. package/dist/core/memory/temporal-facts.js.map +1 -0
  146. package/dist/core/memory/trigger-detector.d.ts +14 -0
  147. package/dist/core/memory/trigger-detector.d.ts.map +1 -0
  148. package/dist/core/memory/trigger-detector.js +42 -0
  149. package/dist/core/memory/trigger-detector.js.map +1 -0
  150. package/dist/core/memory/write-gate.d.ts +54 -0
  151. package/dist/core/memory/write-gate.d.ts.map +1 -0
  152. package/dist/core/memory/write-gate.js +210 -0
  153. package/dist/core/memory/write-gate.js.map +1 -0
  154. package/dist/core/observations.d.ts.map +1 -1
  155. package/dist/core/observations.js +1 -0
  156. package/dist/core/observations.js.map +1 -1
  157. package/dist/core/projects.d.ts +2 -0
  158. package/dist/core/projects.d.ts.map +1 -1
  159. package/dist/core/projects.js +33 -0
  160. package/dist/core/projects.js.map +1 -1
  161. package/dist/core/scheduler/cron-scheduler.d.ts +32 -0
  162. package/dist/core/scheduler/cron-scheduler.d.ts.map +1 -0
  163. package/dist/core/scheduler/cron-scheduler.js +238 -0
  164. package/dist/core/scheduler/cron-scheduler.js.map +1 -0
  165. package/dist/core/scheduler/heartbeat.d.ts +11 -0
  166. package/dist/core/scheduler/heartbeat.d.ts.map +1 -0
  167. package/dist/core/scheduler/heartbeat.js +73 -0
  168. package/dist/core/scheduler/heartbeat.js.map +1 -0
  169. package/dist/core/scheduler/index.d.ts +8 -0
  170. package/dist/core/scheduler/index.d.ts.map +1 -0
  171. package/dist/core/scheduler/index.js +8 -0
  172. package/dist/core/scheduler/index.js.map +1 -0
  173. package/dist/core/scheduler/job-runner.d.ts +11 -0
  174. package/dist/core/scheduler/job-runner.d.ts.map +1 -0
  175. package/dist/core/scheduler/job-runner.js +161 -0
  176. package/dist/core/scheduler/job-runner.js.map +1 -0
  177. package/dist/core/session/auto-load.d.ts +6 -0
  178. package/dist/core/session/auto-load.d.ts.map +1 -0
  179. package/dist/core/session/auto-load.js +119 -0
  180. package/dist/core/session/auto-load.js.map +1 -0
  181. package/dist/core/session/index.d.ts +7 -0
  182. package/dist/core/session/index.d.ts.map +1 -0
  183. package/dist/core/session/index.js +7 -0
  184. package/dist/core/session/index.js.map +1 -0
  185. package/dist/core/session/types.d.ts +26 -0
  186. package/dist/core/session/types.d.ts.map +1 -0
  187. package/dist/core/session/types.js +10 -0
  188. package/dist/core/session/types.js.map +1 -0
  189. package/dist/core/snapshots/comparison.d.ts.map +1 -1
  190. package/dist/core/snapshots/comparison.js +8 -2
  191. package/dist/core/snapshots/comparison.js.map +1 -1
  192. package/dist/core/utils/content-extraction.d.ts.map +1 -1
  193. package/dist/core/utils/content-extraction.js +11 -1
  194. package/dist/core/utils/content-extraction.js.map +1 -1
  195. package/dist/core/utils/memory-operations.d.ts.map +1 -1
  196. package/dist/core/utils/memory-operations.js +3 -1
  197. package/dist/core/utils/memory-operations.js.map +1 -1
  198. package/dist/core/utils/summarization-helpers.d.ts.map +1 -1
  199. package/dist/core/utils/summarization-helpers.js +4 -1
  200. package/dist/core/utils/summarization-helpers.js.map +1 -1
  201. package/dist/core/utils.d.ts.map +1 -1
  202. package/dist/core/utils.js +26 -3
  203. package/dist/core/utils.js.map +1 -1
  204. package/dist/core/worker.d.ts +20 -0
  205. package/dist/core/worker.d.ts.map +1 -1
  206. package/dist/core/worker.js +86 -0
  207. package/dist/core/worker.js.map +1 -1
  208. package/dist/db/adapter.d.ts +1 -5
  209. package/dist/db/adapter.d.ts.map +1 -1
  210. package/dist/db/adapter.js +137 -12
  211. package/dist/db/adapter.js.map +1 -1
  212. package/dist/db/bootstrap.d.ts.map +1 -1
  213. package/dist/db/bootstrap.js +178 -3
  214. package/dist/db/bootstrap.js.map +1 -1
  215. package/dist/db/index.d.ts +1 -5
  216. package/dist/db/index.d.ts.map +1 -1
  217. package/dist/db/index.js +7 -4
  218. package/dist/db/index.js.map +1 -1
  219. package/dist/drizzle/schema-sqlite.d.ts +1953 -612
  220. package/dist/drizzle/schema-sqlite.d.ts.map +1 -1
  221. package/dist/drizzle/schema-sqlite.js +134 -0
  222. package/dist/drizzle/schema-sqlite.js.map +1 -1
  223. package/dist/drizzle/schema.d.ts +684 -3
  224. package/dist/drizzle/schema.d.ts.map +1 -1
  225. package/dist/drizzle/schema.js +81 -1
  226. package/dist/drizzle/schema.js.map +1 -1
  227. package/dist/index.d.ts +3 -3
  228. package/dist/index.js +152 -13
  229. package/dist/index.js.map +1 -1
  230. package/package.json +126 -103
  231. package/scripts/build-release.sh +33 -0
  232. package/scripts/db/check-db.mjs +88 -0
  233. package/scripts/db/fix-all-columns.mjs +52 -0
  234. package/scripts/db/fix-schema-all.mjs +55 -0
  235. package/scripts/db/fix-schema-full.mjs +46 -0
  236. package/scripts/db/fix-schema.mjs +38 -0
  237. package/scripts/db/init-db.mjs +13 -0
  238. package/scripts/db/recreate-db.mjs +14 -0
  239. package/scripts/generate-mcp.mjs +264 -0
  240. package/scripts/github-release.sh +61 -0
  241. package/scripts/init-dirs.mjs +13 -0
  242. package/scripts/init-dirs.ts +15 -0
  243. package/scripts/install-mcp.mjs +116 -0
  244. package/scripts/install-web.sh +120 -0
  245. package/scripts/install.mjs +340 -0
  246. package/scripts/openclaw-bootstrap.mjs +127 -0
  247. package/scripts/package-release.sh +71 -0
  248. package/scripts/remote-preflight.mjs +62 -0
  249. package/scripts/squish-fallback.mjs +132 -0
  250. package/scripts/test/test-all-systems.mjs +139 -0
  251. package/scripts/test/test-memory-system.mjs +139 -0
  252. package/scripts/test/test-v0.5.0.mjs +210 -0
  253. package/scripts/verify-mcp.mjs +214 -0
  254. package/skills/memory-guide/SKILL.md +181 -123
  255. package/skills/squish-cli/SKILL.md +200 -0
  256. package/skills/squish-mcp/SKILL.md +311 -0
  257. package/skills/squish-memory/SKILL.md +100 -62
  258. package/skills/squish-memory/claude-desktop.json +12 -0
  259. package/skills/squish-memory/install.mjs +335 -0
  260. package/skills/squish-memory/install.sh +94 -62
  261. package/skills/squish-memory/openclaw.json +13 -0
  262. package/skills/squish-memory/opencode.json +14 -0
  263. package/skills/squish-memory/skill.json +32 -0
  264. package/dist/adapters/claude-code/capture.d.ts +0 -11
  265. package/dist/adapters/claude-code/capture.d.ts.map +0 -1
  266. package/dist/adapters/claude-code/capture.js +0 -100
  267. package/dist/adapters/claude-code/capture.js.map +0 -1
  268. package/dist/adapters/claude-code/index.d.ts +0 -5
  269. package/dist/adapters/claude-code/index.d.ts.map +0 -1
  270. package/dist/adapters/claude-code/index.js +0 -6
  271. package/dist/adapters/claude-code/index.js.map +0 -1
  272. package/dist/adapters/claude-code/injection.d.ts +0 -34
  273. package/dist/adapters/claude-code/injection.d.ts.map +0 -1
  274. package/dist/adapters/claude-code/injection.js +0 -127
  275. package/dist/adapters/claude-code/injection.js.map +0 -1
  276. package/dist/adapters/claude-code/plugin-wrapper.d.ts +0 -21
  277. package/dist/adapters/claude-code/plugin-wrapper.d.ts.map +0 -1
  278. package/dist/adapters/claude-code/plugin-wrapper.js +0 -239
  279. package/dist/adapters/claude-code/plugin-wrapper.js.map +0 -1
  280. package/dist/adapters/claude-code/types.d.ts +0 -46
  281. package/dist/adapters/claude-code/types.d.ts.map +0 -1
  282. package/dist/adapters/claude-code/types.js +0 -6
  283. package/dist/adapters/claude-code/types.js.map +0 -1
@@ -1,85 +1,172 @@
1
1
  import express from 'express';
2
2
  import cors from 'cors';
3
3
  import { logger } from '../../core/logger.js';
4
+ import { getRecentMemories } from '../../core/memory/memories.js';
5
+ import { getObservationsForProject } from '../../core/observations.js';
6
+ import { getAllProjects, getProjectByPath } from '../../core/projects.js';
7
+ import { getDb } from '../../db/index.js';
8
+ import { isDatabaseUnavailableError } from '../../core/utils.js';
4
9
  const app = express();
5
10
  const PORT = process.env.SQUISH_WEB_PORT || 37777;
6
11
  app.use(cors());
7
12
  app.use(express.json());
8
13
  // Health check endpoint
9
14
  app.get('/api/health', async (req, res) => {
15
+ let dbStatus = 'ok';
16
+ let projectInfo = null;
17
+ let allProjects = [];
18
+ try {
19
+ const db = await getDb();
20
+ if (db && typeof db.prepare === 'function') {
21
+ db.prepare('SELECT 1').get();
22
+ }
23
+ // Get all projects from database
24
+ allProjects = await getAllProjects();
25
+ // If there are projects, use the first one as default (most recent)
26
+ if (allProjects.length > 0) {
27
+ projectInfo = { id: allProjects[0].id, name: allProjects[0].name, path: allProjects[0].path };
28
+ }
29
+ }
30
+ catch (error) {
31
+ dbStatus = 'error';
32
+ logger.error('Health check failed:', error.message);
33
+ }
10
34
  res.json({
11
- status: 'ok',
12
- version: '0.1.0',
13
- database: 'ok',
14
- project: { id: 'demo', name: 'Demo Project', path: process.cwd() },
35
+ status: dbStatus === 'ok' ? 'ok' : 'error',
36
+ version: '0.9.1',
37
+ database: dbStatus,
38
+ project: projectInfo || { id: 'unknown', name: 'No Project', path: '' },
39
+ projects: allProjects,
15
40
  timestamp: new Date().toISOString()
16
41
  });
17
42
  });
18
43
  // Get recent memories
19
44
  app.get('/api/memories', async (req, res) => {
20
- const mockMemories = [
21
- {
22
- id: '1',
23
- type: 'conversation',
24
- content: 'User asked about implementing a new feature for the dashboard',
25
- tags: ['feature', 'dashboard'],
26
- projectId: 'demo',
27
- createdAt: new Date().toISOString()
45
+ try {
46
+ const projectPath = req.query.projectPath || process.cwd();
47
+ const limit = Math.min(Math.max(parseInt(req.query.limit) || 20, 1), 100);
48
+ const project = await getProjectByPath(projectPath);
49
+ if (!project) {
50
+ return res.json({ status: 'ok', data: [], count: 0, message: 'Project not found' });
28
51
  }
29
- ];
30
- res.json({
31
- status: 'ok',
32
- data: mockMemories,
33
- count: mockMemories.length
34
- });
52
+ const memories = await getRecentMemories(projectPath, limit);
53
+ res.json({
54
+ status: 'ok',
55
+ data: memories,
56
+ count: memories.length,
57
+ project: { id: project.id, name: project.name, path: project.path }
58
+ });
59
+ }
60
+ catch (error) {
61
+ if (isDatabaseUnavailableError(error)) {
62
+ return res.json({ status: 'ok', data: [], count: 0, message: 'Database unavailable' });
63
+ }
64
+ logger.error('Failed to get memories:', error.message);
65
+ res.status(500).json({ status: 'error', message: error.message });
66
+ }
35
67
  });
36
68
  // Get observations for project
37
69
  app.get('/api/observations', async (req, res) => {
38
- const mockObservations = [
39
- {
40
- id: '1',
41
- type: 'tool_usage',
42
- summary: 'User ran a build command',
43
- action: 'build',
44
- target: 'project',
45
- createdAt: new Date().toISOString()
70
+ try {
71
+ const projectPath = req.query.projectPath || process.cwd();
72
+ const limit = Math.min(Math.max(parseInt(req.query.limit) || 20, 1), 100);
73
+ const project = await getProjectByPath(projectPath);
74
+ if (!project) {
75
+ return res.json({ status: 'ok', data: [], count: 0, message: 'Project not found' });
46
76
  }
47
- ];
48
- res.json({
49
- status: 'ok',
50
- data: mockObservations,
51
- count: mockObservations.length
52
- });
77
+ const observations = await getObservationsForProject(projectPath, limit);
78
+ res.json({
79
+ status: 'ok',
80
+ data: observations,
81
+ count: observations.length,
82
+ project: { id: project.id, name: project.name, path: project.path }
83
+ });
84
+ }
85
+ catch (error) {
86
+ if (isDatabaseUnavailableError(error)) {
87
+ return res.json({ status: 'ok', data: [], count: 0, message: 'Database unavailable' });
88
+ }
89
+ logger.error('Failed to get observations:', error.message);
90
+ res.status(500).json({ status: 'error', message: error.message });
91
+ }
53
92
  });
54
93
  // Get project context
55
94
  app.get('/api/context', async (req, res) => {
56
- const mockMemories = [
57
- {
58
- id: '1',
59
- type: 'conversation',
60
- content: 'Enhanced web UI with modern design',
61
- tags: ['ui', 'enhancement'],
62
- projectId: 'demo',
63
- createdAt: new Date().toISOString()
95
+ try {
96
+ // Get all projects and use first one as default if no projectPath specified
97
+ const allProjects = await getAllProjects();
98
+ let projectPath = req.query.projectPath;
99
+ // If no projectPath provided, use the first project from database
100
+ if (!projectPath && allProjects.length > 0) {
101
+ projectPath = allProjects[0].path;
64
102
  }
65
- ];
66
- const mockObservations = [
67
- {
68
- id: '1',
69
- type: 'tool_usage',
70
- summary: 'Web UI server started successfully',
71
- action: 'start',
72
- target: 'server',
73
- createdAt: new Date().toISOString()
103
+ if (!projectPath) {
104
+ return res.json({
105
+ status: 'ok',
106
+ project: { id: 'unknown', name: 'No Project', path: '' },
107
+ projects: allProjects,
108
+ memories: [],
109
+ observations: [],
110
+ totalCount: 0,
111
+ message: 'No projects found in database'
112
+ });
74
113
  }
75
- ];
76
- res.json({
77
- status: 'ok',
78
- project: { id: 'demo', name: 'Demo Project', path: process.cwd() },
79
- memories: mockMemories,
80
- observations: mockObservations,
81
- totalCount: mockMemories.length + mockObservations.length
82
- });
114
+ const project = await getProjectByPath(projectPath);
115
+ if (!project) {
116
+ return res.json({
117
+ status: 'ok',
118
+ project: { id: 'unknown', name: 'Project Not Found', path: projectPath },
119
+ projects: allProjects,
120
+ memories: [],
121
+ observations: [],
122
+ totalCount: 0,
123
+ message: 'Project not found in database'
124
+ });
125
+ }
126
+ const memories = await getRecentMemories(projectPath, 20);
127
+ const observations = await getObservationsForProject(projectPath, 20);
128
+ res.json({
129
+ status: 'ok',
130
+ project: { id: project.id, name: project.name, path: project.path },
131
+ projects: allProjects,
132
+ memories: memories,
133
+ observations: observations,
134
+ totalCount: memories.length + observations.length
135
+ });
136
+ }
137
+ catch (error) {
138
+ if (isDatabaseUnavailableError(error)) {
139
+ return res.json({
140
+ status: 'ok',
141
+ project: { id: 'unknown', name: 'Error', path: '' },
142
+ projects: [],
143
+ memories: [],
144
+ observations: [],
145
+ totalCount: 0,
146
+ message: 'Database unavailable'
147
+ });
148
+ }
149
+ logger.error('Failed to get context:', error.message);
150
+ res.status(500).json({ status: 'error', message: error.message });
151
+ }
152
+ });
153
+ // Get all projects
154
+ app.get('/api/projects', async (req, res) => {
155
+ try {
156
+ const projects = await getAllProjects();
157
+ res.json({
158
+ status: 'ok',
159
+ data: projects,
160
+ count: projects.length
161
+ });
162
+ }
163
+ catch (error) {
164
+ if (isDatabaseUnavailableError(error)) {
165
+ return res.json({ status: 'ok', data: [], count: 0, message: 'Database unavailable' });
166
+ }
167
+ logger.error('Failed to get projects:', error.message);
168
+ res.status(500).json({ status: 'error', message: error.message });
169
+ }
83
170
  });
84
171
  // Web UI
85
172
  app.get('/', (req, res) => {
@@ -158,6 +245,9 @@ app.get('/', (req, res) => {
158
245
  </h1>
159
246
  </div>
160
247
  <div class="flex items-center gap-4">
248
+ <select id="project-select" onchange="changeProject(this.value)" class="bg-card-bg px-4 py-2 rounded-full border-2 border-slate-700/50 text-text-main text-sm font-medium focus:outline-none focus:border-primary">
249
+ <option value="">Loading projects...</option>
250
+ </select>
161
251
  <div class="bg-card-bg px-4 py-2 rounded-full border-2 border-slate-700/50 flex items-center gap-2">
162
252
  <div class="size-2 rounded-full bg-primary animate-pulse"></div>
163
253
  <span class="text-xs font-bold uppercase tracking-widest text-text-muted">Local Server: Online</span>
@@ -250,23 +340,75 @@ app.get('/', (req, res) => {
250
340
  </div>
251
341
  </footer>
252
342
  <script>
343
+ let currentProjectPath = null;
344
+
345
+ async function loadProjects() {
346
+ try {
347
+ const response = await fetch('/api/projects');
348
+ const data = await response.json();
349
+
350
+ if (data.status === 'ok' && data.data && data.data.length > 0) {
351
+ const select = document.getElementById('project-select');
352
+ if (select) {
353
+ select.innerHTML = data.data.map(function(p) {
354
+ return '<option value="' + escapeHtml(p.path) + '">' + escapeHtml(p.name || p.path) + '</option>';
355
+ }).join('');
356
+
357
+ // Try to select current directory
358
+ const cwd = window.location.pathname === '/' ? '' : window.location.pathname;
359
+ const defaultProject = data.data.find(function(p) { return p.path === cwd; }) || data.data[0];
360
+ if (defaultProject) {
361
+ currentProjectPath = defaultProject.path;
362
+ select.value = defaultProject.path;
363
+ }
364
+ }
365
+ } else {
366
+ // No projects yet, use current directory
367
+ currentProjectPath = window.location.pathname === '/' ? '' : window.location.pathname;
368
+ }
369
+ } catch (error) {
370
+ console.error('Failed to load projects:', error);
371
+ currentProjectPath = '';
372
+ }
373
+ }
374
+
253
375
  async function loadData() {
254
376
  try {
255
- const response = await fetch('/api/context');
377
+ const url = currentProjectPath ? '/api/context?projectPath=' + encodeURIComponent(currentProjectPath) : '/api/context';
378
+ const response = await fetch(url);
256
379
  const data = await response.json();
257
380
 
258
381
  if (data.status === 'ok') {
259
- document.getElementById('memories-count').textContent = data.memories.length;
260
- document.getElementById('observations-count').textContent = data.observations.length;
261
- document.getElementById('total-count').textContent = data.totalCount;
262
- updateStatus('ok');
382
+ document.getElementById('memories-count').textContent = data.memories ? data.memories.length : 0;
383
+ document.getElementById('observations-count').textContent = data.observations ? data.observations.length : 0;
384
+ document.getElementById('total-count').textContent = data.totalCount || 0;
385
+ updateStatus(data.memories && data.observations ? 'ok' : 'error');
386
+
387
+ renderMemories(data.memories || []);
388
+ renderObservations(data.observations || []);
263
389
 
264
- renderMemories(data.memories);
265
- renderObservations(data.observations);
390
+ // Update project info
391
+ if (data.project) {
392
+ const projectInfo = document.getElementById('project-info');
393
+ if (projectInfo) {
394
+ projectInfo.textContent = data.project.name || data.project.path || 'Unknown';
395
+ }
396
+ }
266
397
 
267
- // Hide error alert
398
+ // Hide error alert if data loaded
268
399
  const errorAlert = document.querySelector('.blob-alert');
269
- if (errorAlert) errorAlert.style.display = 'none';
400
+ if (errorAlert && (data.memories && data.memories.length > 0 || data.observations && data.observations.length > 0)) {
401
+ errorAlert.style.display = 'none';
402
+ }
403
+
404
+ // Show error alert if message present
405
+ if (data.message) {
406
+ const errorAlert = document.querySelector('.blob-alert');
407
+ if (errorAlert) {
408
+ errorAlert.querySelector('p').textContent = data.message;
409
+ errorAlert.style.display = 'flex';
410
+ }
411
+ }
270
412
  } else {
271
413
  throw new Error('API returned error status');
272
414
  }
@@ -281,7 +423,7 @@ app.get('/', (req, res) => {
281
423
 
282
424
  function renderMemories(memories) {
283
425
  const container = document.getElementById('memories');
284
- if (memories.length === 0) {
426
+ if (!memories || memories.length === 0) {
285
427
  container.innerHTML = '<div class="bg-card-bg/50 p-6 rounded-3xl border-2 border-slate-700/20 flex flex-col items-center justify-center py-16 opacity-60"><p class="font-black italic text-text-muted">No memories found</p></div>';
286
428
  return;
287
429
  }
@@ -289,13 +431,12 @@ app.get('/', (req, res) => {
289
431
  container.innerHTML = memories.map(function(memory) {
290
432
  return '<div class="bg-card-bg p-6 rounded-3xl border-2 border-slate-700/20 squishy-hover">' +
291
433
  '<div class="flex items-start justify-between mb-4">' +
292
- '<span class="bg-primary text-black px-3 py-1 rounded-full text-xs font-bold uppercase">' + memory.type + '</span>' +
434
+ '<span class="bg-primary text-black px-3 py-1 rounded-full text-xs font-bold uppercase">' + (memory.type || 'memory') + '</span>' +
293
435
  '<span class="text-text-muted text-sm">' + formatTime(memory.createdAt) + '</span>' +
294
436
  '</div>' +
295
- '<div class="text-text-main mb-4">' + escapeHtml(memory.content) + '</div>' +
437
+ '<div class="text-text-main mb-4">' + escapeHtml(memory.content || memory.text || '') + '</div>' +
296
438
  '<div class="text-text-muted text-sm">' +
297
- 'Tags: ' + (memory.tags ? memory.tags.join(', ') : 'none') + ' | ' +
298
- 'Project: ' + (memory.projectId || 'unknown') +
439
+ 'Tags: ' + (memory.tags ? memory.tags.join(', ') : 'none') +
299
440
  '</div>' +
300
441
  '</div>';
301
442
  }).join('');
@@ -303,7 +444,7 @@ app.get('/', (req, res) => {
303
444
 
304
445
  function renderObservations(observations) {
305
446
  const container = document.getElementById('observations');
306
- if (observations.length === 0) {
447
+ if (!observations || observations.length === 0) {
307
448
  container.innerHTML = '<div class="bg-card-bg/50 p-6 rounded-3xl border-2 border-slate-700/20 flex flex-col items-center justify-center py-16 opacity-60"><p class="font-black italic text-text-muted">No observations found</p></div>';
308
449
  return;
309
450
  }
@@ -311,19 +452,19 @@ app.get('/', (req, res) => {
311
452
  container.innerHTML = observations.map(function(obs) {
312
453
  return '<div class="bg-card-bg p-6 rounded-3xl border-2 border-slate-700/20 squishy-hover">' +
313
454
  '<div class="flex items-start justify-between mb-4">' +
314
- '<span class="bg-secondary text-black px-3 py-1 rounded-full text-xs font-bold uppercase">' + obs.type + '</span>' +
455
+ '<span class="bg-secondary text-black px-3 py-1 rounded-full text-xs font-bold uppercase">' + (obs.type || 'observation') + '</span>' +
315
456
  '<span class="text-text-muted text-sm">' + formatTime(obs.createdAt) + '</span>' +
316
457
  '</div>' +
317
- '<div class="text-text-main mb-4">' + escapeHtml(obs.summary) + '</div>' +
458
+ '<div class="text-text-main mb-4">' + escapeHtml(obs.summary || obs.content || '') + '</div>' +
318
459
  '<div class="text-text-muted text-sm">' +
319
- 'Action: ' + obs.action + ' | ' +
460
+ 'Action: ' + (obs.action || 'none') + ' | ' +
320
461
  'Target: ' + (obs.target || 'none') +
321
462
  '</div>' +
322
463
  '</div>';
323
464
  }).join('');
324
465
  }
325
466
 
326
- function updateStatus(status) {
467
+ function updateStatus(status) {
327
468
  const statusCard = document.querySelector('.squishy-hover.flex-col');
328
469
  if (!statusCard) return;
329
470
 
@@ -467,9 +608,17 @@ app.get('/', (req, res) => {
467
608
  modal.remove();
468
609
  }
469
610
  }
611
+
612
+ function changeProject(path) {
613
+ currentProjectPath = path;
614
+ loadData();
615
+ }
470
616
 
471
- loadData();
472
- window.refreshInterval = setInterval(loadData, 30000);
617
+ // Initialize: load projects first, then data
618
+ loadProjects().then(function() {
619
+ loadData();
620
+ window.refreshInterval = setInterval(loadData, 30000);
621
+ });
473
622
  </script>
474
623
  </body></html>`;
475
624
  res.send(html);
@@ -1 +1 @@
1
- {"version":3,"file":"web.js","sourceRoot":"","sources":["../../../api/web/web.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"web.js","sourceRoot":"","sources":["../../../api/web/web.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export declare class ManagedSync {
2
+ private client;
3
+ private syncEnabled;
4
+ constructor();
5
+ sync(): Promise<void>;
6
+ pushMemory(memoryId: string): Promise<void>;
7
+ pullMemory(memoryId: string): Promise<void>;
8
+ }
9
+ export declare function startManagedSync(): Promise<ManagedSync>;
10
+ //# sourceMappingURL=managed-sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"managed-sync.d.ts","sourceRoot":"","sources":["../../commands/managed-sync.ts"],"names":[],"mappings":"AAKA,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,WAAW,CAAU;;IAQvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAcrB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB3C,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAiBlD;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,WAAW,CAAC,CAI7D"}
@@ -0,0 +1,64 @@
1
+ import { MCPClient } from '../core/mcp/client.js';
2
+ import { config } from '../config.js';
3
+ import { logger } from '../core/logger.js';
4
+ import { searchMemories, rememberMemory } from '../core/memory/memories.js';
5
+ export class ManagedSync {
6
+ client;
7
+ syncEnabled;
8
+ constructor() {
9
+ this.syncEnabled = config.managedMode && !!config.managedApiKey;
10
+ this.client = new MCPClient(config.managedApiUrl);
11
+ }
12
+ async sync() {
13
+ if (!this.syncEnabled) {
14
+ logger.debug('Managed sync disabled');
15
+ return;
16
+ }
17
+ try {
18
+ await this.client.initialize();
19
+ logger.info('Connected to managed storage');
20
+ }
21
+ catch (error) {
22
+ logger.error('Managed sync connection failed:', error);
23
+ }
24
+ }
25
+ async pushMemory(memoryId) {
26
+ if (!this.syncEnabled)
27
+ return;
28
+ try {
29
+ const memory = await searchMemories({ query: memoryId, limit: 1 });
30
+ if (memory.length > 0) {
31
+ await this.client.callTool('managed_memory_store', {
32
+ memory: memory[0],
33
+ });
34
+ logger.debug(`Pushed memory ${memoryId} to managed storage`);
35
+ }
36
+ }
37
+ catch (error) {
38
+ logger.error(`Failed to push memory ${memoryId}:`, error);
39
+ }
40
+ }
41
+ async pullMemory(memoryId) {
42
+ if (!this.syncEnabled)
43
+ return;
44
+ try {
45
+ const result = await this.client.callTool('managed_memory_retrieve', {
46
+ memoryId,
47
+ });
48
+ if (result.content[0]?.text) {
49
+ const memory = JSON.parse(result.content[0].text);
50
+ await rememberMemory(memory);
51
+ logger.debug(`Pulled memory ${memoryId} from managed storage`);
52
+ }
53
+ }
54
+ catch (error) {
55
+ logger.error(`Failed to pull memory ${memoryId}:`, error);
56
+ }
57
+ }
58
+ }
59
+ export async function startManagedSync() {
60
+ const sync = new ManagedSync();
61
+ await sync.sync();
62
+ return sync;
63
+ }
64
+ //# sourceMappingURL=managed-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"managed-sync.js","sourceRoot":"","sources":["../../commands/managed-sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5E,MAAM,OAAO,WAAW;IACd,MAAM,CAAY;IAClB,WAAW,CAAU;IAE7B;QACE,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC;QAEhE,IAAI,CAAC,MAAM,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;YACtC,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,QAAgB;QAC/B,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,OAAO;QAE9B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YACnE,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtB,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,sBAAsB,EAAE;oBACjD,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;iBAClB,CAAC,CAAC;gBACH,MAAM,CAAC,KAAK,CAAC,iBAAiB,QAAQ,qBAAqB,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,yBAAyB,QAAQ,GAAG,EAAE,KAAK,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,QAAgB;QAC/B,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,OAAO;QAE9B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,yBAAyB,EAAE;gBACnE,QAAQ;aACT,CAAC,CAAC;YAEH,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;gBAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBAClD,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;gBAC7B,MAAM,CAAC,KAAK,CAAC,iBAAiB,QAAQ,uBAAuB,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,yBAAyB,QAAQ,GAAG,EAAE,KAAK,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC;IAC/B,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;IAClB,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=mcp-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../../commands/mcp-server.ts"],"names":[],"mappings":""}