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.
- package/.env.example +130 -0
- package/CHANGELOG.md +55 -0
- package/README.md +150 -287
- package/config/hooks/claude-code-hooks.json +39 -0
- package/config/hooks/cursor-hooks.json +30 -0
- package/config/hooks/opencode-hooks.json +30 -0
- package/config/hooks/windsurf-hooks.json +30 -0
- package/config/mcp-mode-semantics.json +23 -21
- package/config/plugin-manifest.json +101 -152
- package/{plugin.json → config/plugin.json} +2 -2
- package/config/settings.json +52 -51
- package/{commands → core/commands}/init.md +39 -39
- package/dist/config.d.ts +28 -4
- package/dist/config.js +97 -29
- package/dist/core/adapters/config/claude-code.d.ts +45 -0
- package/dist/core/adapters/config/claude-code.js +113 -0
- package/dist/core/adapters/config/cursor.d.ts +26 -0
- package/dist/core/adapters/config/cursor.js +74 -0
- package/dist/core/adapters/config/opencode.d.ts +23 -0
- package/dist/core/adapters/config/opencode.js +73 -0
- package/dist/core/adapters/config/windsurf.d.ts +26 -0
- package/dist/core/adapters/config/windsurf.js +74 -0
- package/dist/core/adapters/index.d.ts +45 -0
- package/dist/core/adapters/index.js +84 -0
- package/dist/core/adapters/scripts/install-adapter.d.ts +19 -0
- package/dist/core/adapters/scripts/install-adapter.js +149 -0
- package/dist/core/adapters/timeline.d.ts +23 -0
- package/dist/core/adapters/timeline.js +88 -0
- package/dist/core/adapters/types.d.ts +157 -0
- package/dist/core/adapters/types.js +50 -0
- package/dist/{algorithms → core/algorithms}/analytics/token-estimator.d.ts +1 -1
- package/dist/{algorithms → core/algorithms}/analytics/token-estimator.js +3 -3
- package/dist/{algorithms → core/algorithms}/detection/semantic-ranker.d.ts +1 -1
- package/dist/{algorithms → core/algorithms}/detection/semantic-ranker.js +1 -1
- package/dist/{algorithms → core/algorithms}/detection/two-stage-detector.d.ts +1 -1
- package/dist/{algorithms → core/algorithms}/detection/two-stage-detector.js +7 -10
- package/dist/{algorithms → core/algorithms}/handlers/approve-merge.js +4 -4
- package/dist/{algorithms → core/algorithms}/handlers/detect-duplicates.js +3 -3
- package/dist/{algorithms → core/algorithms}/handlers/get-stats.js +3 -3
- package/dist/{algorithms → core/algorithms}/handlers/list-proposals.js +3 -3
- package/dist/{algorithms → core/algorithms}/handlers/preview-merge.js +3 -3
- package/dist/{algorithms → core/algorithms}/handlers/reject-merge.js +3 -3
- package/dist/{algorithms → core/algorithms}/handlers/reverse-merge.js +3 -3
- package/dist/core/algorithms/index.d.ts +21 -0
- package/dist/core/algorithms/index.js +26 -0
- package/dist/core/algorithms/operations/cache-maintenance.d.ts +12 -0
- package/dist/core/algorithms/operations/cache-maintenance.js +157 -0
- package/dist/{algorithms → core/algorithms}/safety/safety-checks.d.ts +1 -1
- package/dist/{algorithms → core/algorithms}/strategies/merge-strategies.d.ts +19 -1
- package/dist/{algorithms → core/algorithms}/strategies/merge-strategies.js +74 -123
- package/dist/core/algorithms/types.d.ts +133 -0
- package/dist/core/algorithms/types.js +5 -0
- package/dist/core/associations.d.ts +1 -2
- package/dist/core/associations.js +1 -2
- package/dist/core/autosave.d.ts +19 -0
- package/dist/core/autosave.js +16 -0
- package/dist/{commands → core/commands}/managed-sync.js +5 -5
- package/dist/core/commands/mcp-server.js +739 -0
- package/dist/core/context/agent-context.d.ts +106 -0
- package/dist/core/context/agent-context.js +274 -0
- package/dist/core/{context-paging.d.ts → context/context-paging.d.ts} +2 -12
- package/dist/core/{context-paging.js → context/context-paging.js} +19 -39
- package/dist/core/context/context-window.d.ts +40 -0
- package/dist/core/context/context-window.js +177 -0
- package/dist/core/context/context.js +22 -0
- package/dist/core/embeddings.d.ts +1 -1
- package/dist/core/embeddings.js +54 -2
- package/dist/core/error-handling.d.ts +63 -0
- package/dist/core/error-handling.js +173 -0
- package/dist/core/external-folder/index.d.ts +102 -0
- package/dist/core/external-folder/index.js +294 -0
- package/dist/core/hooks/agent-hooks.d.ts +74 -0
- package/dist/core/hooks/agent-hooks.js +244 -0
- package/dist/core/hooks/auto-tagger.d.ts +19 -0
- package/dist/core/hooks/auto-tagger.js +155 -0
- package/dist/core/hooks/capture-filter.d.ts +41 -0
- package/dist/core/hooks/capture-filter.js +128 -0
- package/dist/core/index.d.ts +6 -6
- package/dist/core/index.js +6 -6
- package/dist/core/{agent-memory.js → ingestion/agent-memory.js} +5 -7
- package/dist/core/{core-memory.js → ingestion/core-memory.js} +4 -4
- package/dist/core/ingestion/learnings.d.ts +57 -0
- package/dist/core/ingestion/learnings.js +202 -0
- package/dist/core/lib/db-client.d.ts +114 -0
- package/dist/core/lib/db-client.js +130 -0
- package/dist/core/lib/schemas.d.ts +129 -0
- package/dist/core/lib/schemas.js +87 -0
- package/dist/core/{utils.d.ts → lib/utils.d.ts} +1 -0
- package/dist/core/{utils.js → lib/utils.js} +31 -15
- package/dist/core/lib/validation.d.ts +38 -0
- package/dist/core/lib/validation.js +151 -0
- package/dist/core/lifecycle.d.ts +7 -0
- package/dist/core/lifecycle.js +140 -20
- package/dist/core/local-embeddings.d.ts +6 -1
- package/dist/core/local-embeddings.js +6 -15
- package/dist/core/logger.js +7 -1
- package/dist/core/mcp/tools.js +35 -3
- package/dist/core/memory/categorizer.js +1 -0
- package/dist/core/memory/conflict-detector.js +1 -1
- package/dist/core/memory/consolidation.d.ts +1 -10
- package/dist/core/memory/consolidation.js +2 -11
- package/dist/core/memory/context-collector.js +1 -1
- package/dist/core/memory/edit-workflow.js +1 -1
- package/dist/core/memory/entity-resolver.js +7 -7
- package/dist/core/memory/fact-extractor.js +12 -12
- package/dist/core/memory/feedback-tracker.js +1 -1
- package/dist/core/memory/hooks.d.ts +88 -0
- package/dist/core/memory/hooks.js +174 -0
- package/dist/core/memory/hybrid-retrieval.js +2 -2
- package/dist/core/memory/hybrid-search.d.ts +1 -6
- package/dist/core/memory/hybrid-search.js +70 -84
- package/dist/core/memory/importance.d.ts +8 -13
- package/dist/core/memory/importance.js +47 -74
- package/dist/core/memory/loader.d.ts +31 -0
- package/dist/core/memory/loader.js +141 -0
- package/dist/core/memory/markdown/markdown-storage.d.ts +72 -0
- package/dist/core/memory/markdown/markdown-storage.js +243 -0
- package/dist/core/memory/memories.d.ts +12 -4
- package/dist/core/memory/memories.js +192 -180
- package/dist/core/memory/memory-lifecycle.d.ts +8 -0
- package/dist/core/memory/memory-lifecycle.js +55 -0
- package/dist/core/memory/migrate.d.ts +21 -0
- package/dist/core/memory/migrate.js +134 -0
- package/dist/core/memory/normalization.d.ts +22 -0
- package/dist/core/memory/normalization.js +26 -0
- package/dist/core/memory/progressive-disclosure.js +1 -1
- package/dist/core/memory/query-rewriter.js +9 -9
- package/dist/core/memory/serialization.d.ts +4 -0
- package/dist/core/memory/serialization.js +49 -0
- package/dist/core/memory/stats.d.ts +5 -0
- package/dist/core/memory/stats.js +63 -12
- package/dist/core/memory/temporal-facts.js +21 -0
- package/dist/core/memory/write-gate.js +1 -1
- package/dist/core/obsidian-vault.d.ts +30 -0
- package/dist/core/obsidian-vault.js +94 -0
- package/dist/core/places/index.d.ts +14 -0
- package/dist/core/places/index.js +14 -0
- package/dist/core/places/memory-places.d.ts +68 -0
- package/dist/core/places/memory-places.js +261 -0
- package/dist/core/places/places.d.ts +88 -0
- package/dist/core/places/places.js +314 -0
- package/dist/core/places/rules.d.ts +74 -0
- package/dist/core/places/rules.js +240 -0
- package/dist/core/places/walking.d.ts +56 -0
- package/dist/core/places/walking.js +121 -0
- package/dist/core/projects.d.ts +5 -0
- package/dist/core/projects.js +39 -18
- package/dist/core/responses.d.ts +96 -0
- package/dist/core/responses.js +122 -0
- package/dist/core/scheduler/cron-scheduler.js +29 -7
- package/dist/core/scheduler/index.d.ts +1 -1
- package/dist/core/scheduler/index.js +1 -1
- package/dist/core/scheduler/job-runner.js +1 -1
- package/dist/core/search/conversations.js +40 -42
- package/dist/core/search/entities.js +6 -9
- package/dist/core/search/graph-boost.d.ts +7 -0
- package/dist/core/search/graph-boost.js +23 -0
- package/dist/core/search/qmd-search.js +4 -4
- package/dist/core/security/encrypt.d.ts +6 -0
- package/dist/core/security/encrypt.js +47 -0
- package/dist/core/{governance.d.ts → security/governance.d.ts} +6 -1
- package/dist/core/security/governance.js +79 -0
- package/dist/core/session/auto-load.js +6 -6
- package/dist/core/session/index.d.ts +1 -1
- package/dist/core/session/index.js +1 -1
- package/dist/core/session/self-iteration-job.d.ts +20 -0
- package/dist/core/session/self-iteration-job.js +282 -0
- package/dist/core/session/session-hooks.d.ts +18 -0
- package/dist/core/session/session-hooks.js +58 -0
- package/dist/core/session-hooks/self-iteration-job.js +35 -35
- package/dist/core/{cache.js → storage/cache.js} +2 -2
- package/dist/core/sync/qmd-sync.d.ts +1 -13
- package/dist/core/sync/qmd-sync.js +1 -13
- package/dist/core/toon.d.ts +43 -0
- package/dist/core/toon.js +160 -0
- package/dist/core/utils/memory-operations.js +1 -1
- package/dist/core/utils/vector-operations.d.ts +71 -0
- package/dist/core/utils/vector-operations.js +129 -0
- package/dist/db/adapter.d.ts +3 -3
- package/dist/db/adapter.js +99 -88
- package/dist/db/bootstrap.js +820 -522
- package/dist/{drizzle → db/drizzle}/schema-sqlite.d.ts +74 -25
- package/dist/{drizzle → db/drizzle}/schema-sqlite.js +91 -24
- package/dist/{drizzle → db/drizzle}/schema.d.ts +79 -32
- package/dist/{drizzle → db/drizzle}/schema.js +106 -35
- package/dist/db/drizzle.config.d.ts +3 -0
- package/dist/db/drizzle.config.js +12 -0
- package/dist/db/index.d.ts +1 -5
- package/dist/db/index.js +51 -8
- package/dist/db/neon.d.ts +8 -0
- package/dist/db/neon.js +20 -0
- package/dist/db/schema/index.d.ts +40 -0
- package/dist/db/schema/index.js +105 -0
- package/dist/db/schema/tables/context-sessions.d.ts +9 -0
- package/dist/db/schema/tables/context-sessions.js +37 -0
- package/dist/db/schema/tables/conversations.d.ts +9 -0
- package/dist/db/schema/tables/conversations.js +47 -0
- package/dist/db/schema/tables/core-memory.d.ts +9 -0
- package/dist/db/schema/tables/core-memory.js +41 -0
- package/dist/db/schema/tables/entities.d.ts +9 -0
- package/dist/db/schema/tables/entities.js +39 -0
- package/dist/db/schema/tables/entity-relations.d.ts +9 -0
- package/dist/db/schema/tables/entity-relations.js +31 -0
- package/dist/db/schema/tables/learnings.d.ts +9 -0
- package/dist/db/schema/tables/learnings.js +66 -0
- package/dist/db/schema/tables/memories.d.ts +9 -0
- package/dist/db/schema/tables/memories.js +161 -0
- package/dist/db/schema/tables/memory-associations.d.ts +9 -0
- package/dist/db/schema/tables/memory-associations.js +39 -0
- package/dist/db/schema/tables/memory-hash-cache.d.ts +9 -0
- package/dist/db/schema/tables/memory-hash-cache.js +29 -0
- package/dist/db/schema/tables/memory-merge-history.d.ts +9 -0
- package/dist/db/schema/tables/memory-merge-history.js +33 -0
- package/dist/db/schema/tables/memory-merge-proposals.d.ts +9 -0
- package/dist/db/schema/tables/memory-merge-proposals.js +39 -0
- package/dist/db/schema/tables/messages.d.ts +9 -0
- package/dist/db/schema/tables/messages.js +41 -0
- package/dist/db/schema/tables/namespaces.d.ts +9 -0
- package/dist/db/schema/tables/namespaces.js +37 -0
- package/dist/db/schema/tables/projects.d.ts +9 -0
- package/dist/db/schema/tables/projects.js +31 -0
- package/dist/db/schema/tables/users.d.ts +9 -0
- package/dist/db/schema/tables/users.js +27 -0
- package/dist/db/schema.d.ts +1 -1
- package/dist/db/schema.js +2 -2
- package/dist/db/supabase.d.ts +9 -0
- package/dist/db/supabase.js +24 -0
- package/dist/index.d.ts +2 -14
- package/dist/index.js +1320 -640
- package/dist/vendor/sql.js/sql-wasm.wasm +0 -0
- package/dist/webui/server.d.ts +5 -0
- package/dist/{api/web/web.js → webui/server.js} +511 -508
- package/generated/mcp/manifest.json +1 -1
- package/{.mcp.json → mcp.json.example} +1 -1
- package/package.json +159 -181
- package/scripts/README.md +60 -0
- package/scripts/copy-runtime-assets.mjs +26 -0
- package/scripts/generate-mcp.mjs +264 -264
- package/scripts/github-release.sh +4 -4
- package/scripts/install-claude-code.sh +85 -0
- package/scripts/install-cursor.sh +56 -0
- package/scripts/install-hooks.sh +73 -0
- package/scripts/install-interactive.mjs +357 -677
- package/scripts/install-opencode.sh +75 -0
- package/scripts/install-windsurf.sh +67 -0
- package/skills/squish-memory/SKILL.md +104 -114
- package/skills/squish-memory/{install.mjs → scripts/install.mjs} +2 -2
- package/skills/squish-memory/{install.sh → scripts/install.sh} +2 -2
- package/skills/squish-memory/write_skill.js +2 -0
- package/.claude-plugin/marketplace.json +0 -20
- package/.claude-plugin/plugin.json +0 -32
- package/.env.mcp.example +0 -60
- package/QUICK-START.md +0 -71
- package/bin/squish-add.mjs +0 -32
- package/bin/squish-rm.mjs +0 -21
- package/commands/observe.md +0 -5
- package/dist/api/web/index.d.ts +0 -3
- package/dist/api/web/index.js +0 -4
- package/dist/api/web/web-server.d.ts +0 -3
- package/dist/api/web/web-server.js +0 -6
- package/dist/api/web/web.d.ts +0 -4
- package/dist/commands/mcp-server.js +0 -393
- package/dist/core/context.js +0 -24
- package/dist/core/governance.js +0 -64
- package/dist/core/observations.d.ts +0 -26
- package/dist/core/observations.js +0 -110
- package/dist/core/requirements.d.ts +0 -20
- package/dist/core/requirements.js +0 -35
- package/hooks/hooks.json +0 -52
- package/hooks/post-tool-use.js +0 -26
- package/hooks/session-end.js +0 -28
- package/hooks/session-start.js +0 -33
- package/hooks/user-prompt-submit.js +0 -26
- package/hooks/utils.js +0 -153
- package/npx-installer.js +0 -208
- package/packages/plugin-claude-code/README.md +0 -73
- package/packages/plugin-claude-code/dist/plugin-wrapper.d.ts +0 -35
- package/packages/plugin-claude-code/dist/plugin-wrapper.js +0 -191
- package/packages/plugin-claude-code/package.json +0 -31
- package/packages/plugin-openclaw/README.md +0 -70
- package/packages/plugin-openclaw/dist/index.d.ts +0 -49
- package/packages/plugin-openclaw/dist/index.js +0 -262
- package/packages/plugin-openclaw/openclaw.plugin.json +0 -94
- package/packages/plugin-openclaw/package.json +0 -31
- package/packages/plugin-opencode/install.mjs +0 -217
- package/packages/plugin-opencode/package.json +0 -21
- package/scripts/db/check-db.mjs +0 -88
- package/scripts/db/fix-all-columns.mjs +0 -52
- package/scripts/db/fix-schema-all.mjs +0 -55
- package/scripts/db/fix-schema-full.mjs +0 -46
- package/scripts/db/fix-schema.mjs +0 -38
- package/scripts/db/init-db.mjs +0 -13
- package/scripts/db/recreate-db.mjs +0 -14
- package/scripts/install-mcp.mjs +0 -116
- package/scripts/install-web.sh +0 -120
- package/scripts/install.mjs +0 -340
- package/scripts/openclaw-bootstrap.mjs +0 -127
- package/scripts/package-release.sh +0 -71
- package/scripts/test/test-all-systems.mjs +0 -139
- package/scripts/test/test-memory-system.mjs +0 -139
- package/scripts/test/test-v0.5.0.mjs +0 -210
- package/skills/memory-guide/SKILL.md +0 -332
- package/skills/squish-cli/SKILL.md +0 -240
- package/skills/squish-mcp/SKILL.md +0 -355
- package/skills/squish-memory/claude-desktop.json +0 -12
- package/skills/squish-memory/openclaw.json +0 -13
- package/skills/squish-memory/opencode.json +0 -14
- package/skills/squish-memory/skill.json +0 -32
- /package/{commands → core/commands}/context-paging.md +0 -0
- /package/{commands → core/commands}/context-status.md +0 -0
- /package/{commands → core/commands}/context.md +0 -0
- /package/{commands → core/commands}/core-memory.md +0 -0
- /package/{commands → core/commands}/health.md +0 -0
- /package/{commands → core/commands}/merge.md +0 -0
- /package/{commands → core/commands}/recall.md +0 -0
- /package/{commands → core/commands}/remember.md +0 -0
- /package/{commands → core/commands}/search.md +0 -0
- /package/dist/{algorithms → core/algorithms}/detection/hash-filters.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/detection/hash-filters.js +0 -0
- /package/dist/{algorithms → core/algorithms}/handlers/approve-merge.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/handlers/detect-duplicates.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/handlers/get-stats.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/handlers/list-proposals.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/handlers/preview-merge.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/handlers/reject-merge.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/handlers/reverse-merge.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/safety/safety-checks.js +0 -0
- /package/dist/{algorithms → core/algorithms}/utils/response-builder.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/utils/response-builder.js +0 -0
- /package/dist/{commands → core/commands}/managed-sync.d.ts +0 -0
- /package/dist/{commands → core/commands}/mcp-server.d.ts +0 -0
- /package/dist/core/{context.d.ts → context/context.d.ts} +0 -0
- /package/dist/core/{agent-memory.d.ts → ingestion/agent-memory.d.ts} +0 -0
- /package/dist/core/{core-memory.d.ts → ingestion/core-memory.d.ts} +0 -0
- /package/dist/core/{privacy.d.ts → security/privacy.d.ts} +0 -0
- /package/dist/core/{privacy.js → security/privacy.js} +0 -0
- /package/dist/core/{secret-detector.d.ts → security/secret-detector.d.ts} +0 -0
- /package/dist/core/{secret-detector.js → security/secret-detector.js} +0 -0
- /package/dist/core/{cache.d.ts → storage/cache.d.ts} +0 -0
- /package/dist/core/{database.d.ts → storage/database.d.ts} +0 -0
- /package/dist/core/{database.js → storage/database.js} +0 -0
|
@@ -4,18 +4,15 @@
|
|
|
4
4
|
* Stage 1: Hash-based prefiltering (SimHash + MinHash)
|
|
5
5
|
* Stage 2: Semantic ranking using embeddings
|
|
6
6
|
*/
|
|
7
|
-
import { getEmbedding, getBatchEmbeddings } from '
|
|
7
|
+
import { getEmbedding, getBatchEmbeddings } from '../../../core/embeddings.js';
|
|
8
8
|
import { SimHashFilter, MinHashFilter, findCandidatePairs } from './hash-filters.js';
|
|
9
9
|
import { rankCandidates, analyzePair } from './semantic-ranker.js';
|
|
10
|
-
import { getDb } from '../../db/index.js';
|
|
11
|
-
import { getSchema } from '../../db/schema.js';
|
|
12
|
-
import { createDatabaseClient } from '../../core/database.js';
|
|
13
10
|
import { eq, and } from 'drizzle-orm';
|
|
14
11
|
import * as crypto from 'crypto';
|
|
12
|
+
import { getDbClient } from '../../../core/lib/db-client.js';
|
|
15
13
|
export async function detectDuplicates(options) {
|
|
16
14
|
const startTime = Date.now();
|
|
17
|
-
const db =
|
|
18
|
-
const schema = await getSchema();
|
|
15
|
+
const { db, schema } = await getDbClient();
|
|
19
16
|
let query = db.select().from(schema.memories);
|
|
20
17
|
if (options.projectId) {
|
|
21
18
|
query = query.where(eq(schema.memories.projectId, options.projectId));
|
|
@@ -239,8 +236,7 @@ export async function detectDuplicates(options) {
|
|
|
239
236
|
};
|
|
240
237
|
}
|
|
241
238
|
export async function analyzeMergePair(memoryId1, memoryId2) {
|
|
242
|
-
const db =
|
|
243
|
-
const schema = await getSchema();
|
|
239
|
+
const { db, schema } = await getDbClient();
|
|
244
240
|
const [memory1] = await db
|
|
245
241
|
.select()
|
|
246
242
|
.from(schema.memories)
|
|
@@ -271,6 +267,8 @@ function countByType(memories) {
|
|
|
271
267
|
decision: 0,
|
|
272
268
|
context: 0,
|
|
273
269
|
preference: 0,
|
|
270
|
+
reflection: 0,
|
|
271
|
+
note: 0,
|
|
274
272
|
};
|
|
275
273
|
for (const memory of memories) {
|
|
276
274
|
const type = memory.type;
|
|
@@ -281,8 +279,7 @@ function countByType(memories) {
|
|
|
281
279
|
return counts;
|
|
282
280
|
}
|
|
283
281
|
export async function getDetectionStats(projectId) {
|
|
284
|
-
const db =
|
|
285
|
-
const schema = await getSchema();
|
|
282
|
+
const { db, schema } = await getDbClient();
|
|
286
283
|
const memories = await db
|
|
287
284
|
.select()
|
|
288
285
|
.from(schema.memories)
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
* Executes the approved merge in a single atomic transaction.
|
|
3
3
|
*/
|
|
4
4
|
import { randomUUID } from 'crypto';
|
|
5
|
-
import { getDb } from '
|
|
6
|
-
import { getSchema } from '
|
|
7
|
-
import { createDatabaseClient } from '
|
|
5
|
+
import { getDb } from '../../../db/index.js';
|
|
6
|
+
import { getSchema } from '../../../db/schema.js';
|
|
7
|
+
import { createDatabaseClient } from '../../../core/storage/database.js';
|
|
8
8
|
import { eq, inArray } from 'drizzle-orm';
|
|
9
9
|
import { mergeMemories } from '../strategies/merge-strategies.js';
|
|
10
10
|
import { estimateTokensSaved } from '../analytics/token-estimator.js';
|
|
11
|
-
import { getEmbedding } from '
|
|
11
|
+
import { getEmbedding } from '../../../core/embeddings.js';
|
|
12
12
|
export async function handleApproveMerge(input) {
|
|
13
13
|
try {
|
|
14
14
|
const { proposalId, reviewNotes } = input;
|
|
@@ -9,9 +9,9 @@ import { detectDuplicates } from '../detection/two-stage-detector.js';
|
|
|
9
9
|
import { runSafetyChecks } from '../safety/safety-checks.js';
|
|
10
10
|
import { mergeMemories } from '../strategies/merge-strategies.js';
|
|
11
11
|
import { estimateTokensSaved } from '../analytics/token-estimator.js';
|
|
12
|
-
import { getDb } from '
|
|
13
|
-
import { getSchema } from '
|
|
14
|
-
import { createDatabaseClient } from '
|
|
12
|
+
import { getDb } from '../../../db/index.js';
|
|
13
|
+
import { getSchema } from '../../../db/schema.js';
|
|
14
|
+
import { createDatabaseClient } from '../../../core/storage/database.js';
|
|
15
15
|
import { buildSuccessResponse, buildErrorResponse } from '../utils/response-builder.js';
|
|
16
16
|
/**
|
|
17
17
|
* Handle detect_duplicate_memories tool call
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Returns statistics about memory merges for a project
|
|
5
5
|
*/
|
|
6
|
-
import { getDb } from '
|
|
7
|
-
import { getSchema } from '
|
|
8
|
-
import { createDatabaseClient } from '
|
|
6
|
+
import { getDb } from '../../../db/index.js';
|
|
7
|
+
import { getSchema } from '../../../db/schema.js';
|
|
8
|
+
import { createDatabaseClient } from '../../../core/storage/database.js';
|
|
9
9
|
import { eq } from 'drizzle-orm';
|
|
10
10
|
import { calculateProjectTokenSavings, formatTokenCount } from '../analytics/token-estimator.js';
|
|
11
11
|
/**
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Lists pending merge proposals for user review
|
|
5
5
|
*/
|
|
6
|
-
import { getDb } from '
|
|
7
|
-
import { getSchema } from '
|
|
8
|
-
import { createDatabaseClient } from '
|
|
6
|
+
import { getDb } from '../../../db/index.js';
|
|
7
|
+
import { getSchema } from '../../../db/schema.js';
|
|
8
|
+
import { createDatabaseClient } from '../../../core/storage/database.js';
|
|
9
9
|
import { eq, desc } from 'drizzle-orm';
|
|
10
10
|
/**
|
|
11
11
|
* Handle list_merge_proposals tool call
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Shows a preview of the merged result without executing the merge.
|
|
3
3
|
*/
|
|
4
|
-
import { getDb } from '
|
|
5
|
-
import { getSchema } from '
|
|
6
|
-
import { createDatabaseClient } from '
|
|
4
|
+
import { getDb } from '../../../db/index.js';
|
|
5
|
+
import { getSchema } from '../../../db/schema.js';
|
|
6
|
+
import { createDatabaseClient } from '../../../core/storage/database.js';
|
|
7
7
|
import { eq } from 'drizzle-orm';
|
|
8
8
|
import { estimateMergeSavingsPreview } from '../analytics/token-estimator.js';
|
|
9
9
|
import { mergeMemories } from '../strategies/merge-strategies.js';
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Rejects a merge proposal without executing it
|
|
5
5
|
*/
|
|
6
|
-
import { getDb } from '
|
|
7
|
-
import { getSchema } from '
|
|
8
|
-
import { createDatabaseClient } from '
|
|
6
|
+
import { getDb } from '../../../db/index.js';
|
|
7
|
+
import { getSchema } from '../../../db/schema.js';
|
|
8
|
+
import { createDatabaseClient } from '../../../core/storage/database.js';
|
|
9
9
|
import { eq } from 'drizzle-orm';
|
|
10
10
|
/**
|
|
11
11
|
* Handle reject_merge tool call
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Reverses/undoes a completed merge and restores original memories.
|
|
3
3
|
*/
|
|
4
|
-
import { getDb } from '
|
|
5
|
-
import { getSchema } from '
|
|
6
|
-
import { createDatabaseClient } from '
|
|
4
|
+
import { getDb } from '../../../db/index.js';
|
|
5
|
+
import { getSchema } from '../../../db/schema.js';
|
|
6
|
+
import { createDatabaseClient } from '../../../core/storage/database.js';
|
|
7
7
|
import { eq } from 'drizzle-orm';
|
|
8
8
|
export async function handleReverseMerge(input) {
|
|
9
9
|
try {
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Merging Feature - Barrel Exports
|
|
3
|
+
*
|
|
4
|
+
* Provides a clean public API for memory merging functionality
|
|
5
|
+
*/
|
|
6
|
+
export * from './types.js';
|
|
7
|
+
export { detectDuplicates, analyzeMergePair, getDetectionStats } from './detection/two-stage-detector.js';
|
|
8
|
+
export { SimHashFilter, MinHashFilter, findCandidatePairs } from './detection/hash-filters.js';
|
|
9
|
+
export { rankCandidates, analyzePair } from './detection/semantic-ranker.js';
|
|
10
|
+
export { getMergeStrategy, mergeMemories, MERGE_STRATEGIES } from './strategies/merge-strategies.js';
|
|
11
|
+
export type { MergeStrategy, MergedMemory } from './strategies/merge-strategies.js';
|
|
12
|
+
export { runSafetyChecks, checkBlockers, formatSafetyResults, describeSafetyChecks } from './safety/safety-checks.js';
|
|
13
|
+
export { estimateTokensSaved, calculateProjectTokenSavings, estimateMergeSavingsPreview, getTokenStatistics, formatTokenCount, formatSavingsReport, } from './analytics/token-estimator.js';
|
|
14
|
+
export { handleDetectDuplicates } from './handlers/detect-duplicates.js';
|
|
15
|
+
export { handleListProposals } from './handlers/list-proposals.js';
|
|
16
|
+
export { handlePreviewMerge } from './handlers/preview-merge.js';
|
|
17
|
+
export { handleApproveMerge } from './handlers/approve-merge.js';
|
|
18
|
+
export { handleRejectMerge } from './handlers/reject-merge.js';
|
|
19
|
+
export { handleReverseMerge } from './handlers/reverse-merge.js';
|
|
20
|
+
export { handleGetMergeStats } from './handlers/get-stats.js';
|
|
21
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Merging Feature - Barrel Exports
|
|
3
|
+
*
|
|
4
|
+
* Provides a clean public API for memory merging functionality
|
|
5
|
+
*/
|
|
6
|
+
// Types
|
|
7
|
+
export * from './types.js';
|
|
8
|
+
// Detection
|
|
9
|
+
export { detectDuplicates, analyzeMergePair, getDetectionStats } from './detection/two-stage-detector.js';
|
|
10
|
+
export { SimHashFilter, MinHashFilter, findCandidatePairs } from './detection/hash-filters.js';
|
|
11
|
+
export { rankCandidates, analyzePair } from './detection/semantic-ranker.js';
|
|
12
|
+
// Merge Strategies
|
|
13
|
+
export { getMergeStrategy, mergeMemories, MERGE_STRATEGIES } from './strategies/merge-strategies.js';
|
|
14
|
+
// Safety
|
|
15
|
+
export { runSafetyChecks, checkBlockers, formatSafetyResults, describeSafetyChecks } from './safety/safety-checks.js';
|
|
16
|
+
// Analytics & Tokens
|
|
17
|
+
export { estimateTokensSaved, calculateProjectTokenSavings, estimateMergeSavingsPreview, getTokenStatistics, formatTokenCount, formatSavingsReport, } from './analytics/token-estimator.js';
|
|
18
|
+
// Handlers (MCP Tools)
|
|
19
|
+
export { handleDetectDuplicates } from './handlers/detect-duplicates.js';
|
|
20
|
+
export { handleListProposals } from './handlers/list-proposals.js';
|
|
21
|
+
export { handlePreviewMerge } from './handlers/preview-merge.js';
|
|
22
|
+
export { handleApproveMerge } from './handlers/approve-merge.js';
|
|
23
|
+
export { handleRejectMerge } from './handlers/reject-merge.js';
|
|
24
|
+
export { handleReverseMerge } from './handlers/reverse-merge.js';
|
|
25
|
+
export { handleGetMergeStats } from './handlers/get-stats.js';
|
|
26
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hash cache maintenance - SimHash/MinHash signatures for duplicate detection
|
|
3
|
+
*/
|
|
4
|
+
export declare function updateCache(memoryId: string): Promise<boolean>;
|
|
5
|
+
export declare function rebuildCache(projectId: string): Promise<{
|
|
6
|
+
processed: number;
|
|
7
|
+
succeeded: number;
|
|
8
|
+
failed: number;
|
|
9
|
+
}>;
|
|
10
|
+
export declare function isStale(memoryId: string): Promise<boolean>;
|
|
11
|
+
export declare function cleanupOrphaned(projectId: string): Promise<number>;
|
|
12
|
+
//# sourceMappingURL=cache-maintenance.d.ts.map
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hash cache maintenance - SimHash/MinHash signatures for duplicate detection
|
|
3
|
+
*/
|
|
4
|
+
import { getDb } from '../../../db/index.js';
|
|
5
|
+
import { getSchema } from '../../../db/schema.js';
|
|
6
|
+
import { createDatabaseClient } from '../../../core/storage/database.js';
|
|
7
|
+
import { eq } from 'drizzle-orm';
|
|
8
|
+
import { SimHashFilter, MinHashFilter } from '../detection/hash-filters.js';
|
|
9
|
+
import crypto from 'crypto';
|
|
10
|
+
import { logger } from '../../../core/logger.js';
|
|
11
|
+
function hashContent(content) {
|
|
12
|
+
return crypto.createHash('md5').update(content).digest('hex');
|
|
13
|
+
}
|
|
14
|
+
export async function updateCache(memoryId) {
|
|
15
|
+
try {
|
|
16
|
+
const db = createDatabaseClient(await getDb());
|
|
17
|
+
const schema = await getSchema();
|
|
18
|
+
// Load the memory
|
|
19
|
+
const [memory] = await db
|
|
20
|
+
.select()
|
|
21
|
+
.from(schema.memories)
|
|
22
|
+
.where(eq(schema.memories.id, memoryId));
|
|
23
|
+
if (!memory) {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
// Generate hashes
|
|
27
|
+
const simhashFilter = new SimHashFilter();
|
|
28
|
+
const minhashFilter = new MinHashFilter();
|
|
29
|
+
const simhash = simhashFilter.generateHash(memory.content);
|
|
30
|
+
const minhash = minhashFilter.generateSignature(memory.content);
|
|
31
|
+
const contentHash = hashContent(memory.content);
|
|
32
|
+
// Upsert cache entry
|
|
33
|
+
const now = new Date();
|
|
34
|
+
// Check if entry exists
|
|
35
|
+
const [existing] = await db
|
|
36
|
+
.select()
|
|
37
|
+
.from(schema.memoryHashCache)
|
|
38
|
+
.where(eq(schema.memoryHashCache.memoryId, memoryId));
|
|
39
|
+
if (existing) {
|
|
40
|
+
// Update existing
|
|
41
|
+
await db
|
|
42
|
+
.update(schema.memoryHashCache)
|
|
43
|
+
.set({
|
|
44
|
+
simhash,
|
|
45
|
+
minhash: minhash,
|
|
46
|
+
contentHash,
|
|
47
|
+
lastUpdated: now,
|
|
48
|
+
})
|
|
49
|
+
.where(eq(schema.memoryHashCache.memoryId, memoryId));
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
// Create new
|
|
53
|
+
await db.insert(schema.memoryHashCache).values({
|
|
54
|
+
memoryId,
|
|
55
|
+
projectId: memory.projectId,
|
|
56
|
+
simhash,
|
|
57
|
+
minhash: minhash,
|
|
58
|
+
contentHash,
|
|
59
|
+
lastUpdated: now,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
logger.error(`Failed to update hash cache for ${memoryId}`, error);
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
export async function rebuildCache(projectId) {
|
|
70
|
+
try {
|
|
71
|
+
const db = createDatabaseClient(await getDb());
|
|
72
|
+
const schema = await getSchema();
|
|
73
|
+
// Get all memories in project
|
|
74
|
+
const memories = await db
|
|
75
|
+
.select()
|
|
76
|
+
.from(schema.memories)
|
|
77
|
+
.where(eq(schema.memories.projectId, projectId));
|
|
78
|
+
let succeeded = 0;
|
|
79
|
+
let failed = 0;
|
|
80
|
+
for (const memory of memories) {
|
|
81
|
+
const ok = await updateCache(memory.id);
|
|
82
|
+
if (ok) {
|
|
83
|
+
succeeded++;
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
failed++;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return {
|
|
90
|
+
processed: memories.length,
|
|
91
|
+
succeeded,
|
|
92
|
+
failed,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
logger.error(`Failed to rebuild hash cache for project ${projectId}`, error);
|
|
97
|
+
return { processed: 0, succeeded: 0, failed: 0 };
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
export async function isStale(memoryId) {
|
|
101
|
+
try {
|
|
102
|
+
const db = createDatabaseClient(await getDb());
|
|
103
|
+
const schema = await getSchema();
|
|
104
|
+
const [memory] = await db
|
|
105
|
+
.select()
|
|
106
|
+
.from(schema.memories)
|
|
107
|
+
.where(eq(schema.memories.id, memoryId));
|
|
108
|
+
if (!memory) {
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
const [cacheEntry] = await db
|
|
112
|
+
.select()
|
|
113
|
+
.from(schema.memoryHashCache)
|
|
114
|
+
.where(eq(schema.memoryHashCache.memoryId, memoryId));
|
|
115
|
+
if (!cacheEntry) {
|
|
116
|
+
return true; // No cache entry = stale
|
|
117
|
+
}
|
|
118
|
+
const currentContentHash = hashContent(memory.content);
|
|
119
|
+
return currentContentHash !== cacheEntry.contentHash;
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
logger.error('Failed to check hash cache staleness', error);
|
|
123
|
+
return true; // Assume stale on error
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
export async function cleanupOrphaned(projectId) {
|
|
127
|
+
try {
|
|
128
|
+
const db = createDatabaseClient(await getDb());
|
|
129
|
+
const schema = await getSchema();
|
|
130
|
+
// Get all cache entries for project
|
|
131
|
+
const cacheEntries = await db
|
|
132
|
+
.select()
|
|
133
|
+
.from(schema.memoryHashCache)
|
|
134
|
+
.where(eq(schema.memoryHashCache.projectId, projectId));
|
|
135
|
+
let deleted = 0;
|
|
136
|
+
for (const entry of cacheEntries) {
|
|
137
|
+
// Check if memory exists
|
|
138
|
+
const [memory] = await db
|
|
139
|
+
.select()
|
|
140
|
+
.from(schema.memories)
|
|
141
|
+
.where(eq(schema.memories.id, entry.memoryId));
|
|
142
|
+
if (!memory) {
|
|
143
|
+
// Memory doesn't exist, delete cache entry
|
|
144
|
+
await db
|
|
145
|
+
.delete(schema.memoryHashCache)
|
|
146
|
+
.where(eq(schema.memoryHashCache.memoryId, entry.memoryId));
|
|
147
|
+
deleted++;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return deleted;
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
logger.error('Failed to cleanup orphaned hash cache', error);
|
|
154
|
+
return 0;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=cache-maintenance.js.map
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Safety checks to prevent bad merges.
|
|
3
3
|
* Checks run before creating merge proposals and are categorized as BLOCKER or WARNING.
|
|
4
4
|
*/
|
|
5
|
-
import type { Memory } from '
|
|
5
|
+
import type { Memory } from '../../../db/drizzle/schema.js';
|
|
6
6
|
export interface SafetyCheckResult {
|
|
7
7
|
passed: boolean;
|
|
8
8
|
warnings: string[];
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Type-specific merge strategies for different memory types.
|
|
3
3
|
* Each type has different merge semantics to preserve meaning and prevent data loss.
|
|
4
4
|
*/
|
|
5
|
-
import type { Memory, MemoryType } from '
|
|
5
|
+
import type { Memory, MemoryType } from '../../../db/drizzle/schema.js';
|
|
6
6
|
export interface MergeStrategy {
|
|
7
7
|
type: MemoryType;
|
|
8
8
|
/**
|
|
@@ -26,6 +26,24 @@ export interface MergedMemory {
|
|
|
26
26
|
mergeReason: string;
|
|
27
27
|
conflictWarnings: string[];
|
|
28
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* Base implementation of MergeStrategy with common functionality.
|
|
31
|
+
* Reduces code duplication across specific merge strategies.
|
|
32
|
+
*/
|
|
33
|
+
export declare abstract class BaseMergeStrategy implements MergeStrategy {
|
|
34
|
+
abstract type: MemoryType;
|
|
35
|
+
canMerge(sources: Memory[]): {
|
|
36
|
+
ok: boolean;
|
|
37
|
+
reason?: string;
|
|
38
|
+
};
|
|
39
|
+
protected validateSources(sources: Memory[]): boolean;
|
|
40
|
+
protected handleEmptySources(): MergedMemory;
|
|
41
|
+
protected mergeTags(sources: Memory[]): string[];
|
|
42
|
+
protected buildBaseMetadata(sources: Memory[], extra?: Record<string, unknown>): Record<string, unknown>;
|
|
43
|
+
protected sortByDate(sources: Memory[], order?: 'asc' | 'desc'): Memory[];
|
|
44
|
+
protected sortChronologically(sources: Memory[]): Memory[];
|
|
45
|
+
abstract merge(sources: Memory[]): MergedMemory;
|
|
46
|
+
}
|
|
29
47
|
export declare const MERGE_STRATEGIES: Record<MemoryType, MergeStrategy>;
|
|
30
48
|
export declare function getMergeStrategy(type: MemoryType): MergeStrategy;
|
|
31
49
|
export declare function mergeMemories(sources: Memory[]): MergedMemory;
|