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
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-Tagger - Infer tags from context
|
|
3
|
+
*
|
|
4
|
+
* Analyzes tool input/output to automatically infer relevant tags.
|
|
5
|
+
* Uses pattern matching to classify actions.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Infer tags based on tool, input, and content
|
|
9
|
+
*/
|
|
10
|
+
export function inferTags(toolName, toolInput, content) {
|
|
11
|
+
const tags = ['hook', 'autocapture']; // Always add these
|
|
12
|
+
const tool = toolName.toLowerCase();
|
|
13
|
+
const inputStr = JSON.stringify(toolInput).toLowerCase();
|
|
14
|
+
const contentLower = content.toLowerCase();
|
|
15
|
+
// File type tags
|
|
16
|
+
if (tool === 'write' || tool === 'edit') {
|
|
17
|
+
const filePath = String(toolInput.filePath || toolInput.path || '');
|
|
18
|
+
if (filePath.endsWith('.ts') || filePath.endsWith('.tsx')) {
|
|
19
|
+
tags.push('typescript');
|
|
20
|
+
}
|
|
21
|
+
else if (filePath.endsWith('.js') || filePath.endsWith('.jsx')) {
|
|
22
|
+
tags.push('javascript');
|
|
23
|
+
}
|
|
24
|
+
else if (filePath.endsWith('.json')) {
|
|
25
|
+
tags.push('config');
|
|
26
|
+
}
|
|
27
|
+
else if (filePath.endsWith('.md')) {
|
|
28
|
+
tags.push('documentation');
|
|
29
|
+
}
|
|
30
|
+
else if (filePath.endsWith('.test.ts') || filePath.endsWith('.spec.ts')) {
|
|
31
|
+
tags.push('test');
|
|
32
|
+
}
|
|
33
|
+
// Feature/fix detection
|
|
34
|
+
if (contentLower.includes('fix') || contentLower.includes('bug')) {
|
|
35
|
+
tags.push('bugfix');
|
|
36
|
+
}
|
|
37
|
+
else if (contentLower.includes('refactor')) {
|
|
38
|
+
tags.push('refactor');
|
|
39
|
+
}
|
|
40
|
+
else if (contentLower.includes('feature') || contentLower.includes('add')) {
|
|
41
|
+
tags.push('feature');
|
|
42
|
+
}
|
|
43
|
+
else if (contentLower.includes('test')) {
|
|
44
|
+
tags.push('testing');
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// Bash command tags
|
|
48
|
+
if (tool === 'bash') {
|
|
49
|
+
const cmd = String(toolInput.command || toolInput.cmd || '');
|
|
50
|
+
if (cmd.includes('git commit')) {
|
|
51
|
+
tags.push('commit', 'version-control');
|
|
52
|
+
}
|
|
53
|
+
else if (cmd.includes('test') || cmd.includes('jest') || cmd.includes('vitest')) {
|
|
54
|
+
tags.push('testing', 'test');
|
|
55
|
+
}
|
|
56
|
+
else if (cmd.includes('build') || cmd.includes('compile')) {
|
|
57
|
+
tags.push('build');
|
|
58
|
+
}
|
|
59
|
+
else if (cmd.includes('install')) {
|
|
60
|
+
tags.push('dependencies');
|
|
61
|
+
}
|
|
62
|
+
else if (cmd.includes('lint') || cmd.includes('format')) {
|
|
63
|
+
tags.push('linting');
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// Task tags
|
|
67
|
+
if (tool === 'task' || tool === 'todowrite') {
|
|
68
|
+
tags.push('task', 'planning');
|
|
69
|
+
if (contentLower.includes('fix') || contentLower.includes('bug')) {
|
|
70
|
+
tags.push('bugfix');
|
|
71
|
+
}
|
|
72
|
+
else if (contentLower.includes('feature')) {
|
|
73
|
+
tags.push('feature');
|
|
74
|
+
}
|
|
75
|
+
else if (contentLower.includes('refactor')) {
|
|
76
|
+
tags.push('refactor');
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Deduplicate
|
|
80
|
+
return [...new Set(tags)];
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Extract tags from commit message
|
|
84
|
+
*/
|
|
85
|
+
export function extractCommitTags(commitMessage) {
|
|
86
|
+
const tags = ['commit'];
|
|
87
|
+
const msg = commitMessage.toLowerCase();
|
|
88
|
+
// Conventional commits
|
|
89
|
+
if (msg.startsWith('feat:') || msg.includes('feature')) {
|
|
90
|
+
tags.push('feature', 'conventional-commit');
|
|
91
|
+
}
|
|
92
|
+
else if (msg.startsWith('fix:') || msg.includes('bugfix')) {
|
|
93
|
+
tags.push('bugfix', 'conventional-commit');
|
|
94
|
+
}
|
|
95
|
+
else if (msg.startsWith('refactor:')) {
|
|
96
|
+
tags.push('refactor', 'conventional-commit');
|
|
97
|
+
}
|
|
98
|
+
else if (msg.startsWith('docs:')) {
|
|
99
|
+
tags.push('documentation', 'conventional-commit');
|
|
100
|
+
}
|
|
101
|
+
else if (msg.startsWith('test:')) {
|
|
102
|
+
tags.push('testing', 'conventional-commit');
|
|
103
|
+
}
|
|
104
|
+
else if (msg.startsWith('chore:')) {
|
|
105
|
+
tags.push('chore', 'conventional-commit');
|
|
106
|
+
}
|
|
107
|
+
return tags;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Extract tags from file path
|
|
111
|
+
*/
|
|
112
|
+
export function extractFileTags(filePath) {
|
|
113
|
+
const tags = [];
|
|
114
|
+
const path = filePath.toLowerCase();
|
|
115
|
+
// By extension
|
|
116
|
+
if (path.endsWith('.ts') || path.endsWith('.tsx')) {
|
|
117
|
+
tags.push('typescript');
|
|
118
|
+
}
|
|
119
|
+
else if (path.endsWith('.js') || path.endsWith('.jsx')) {
|
|
120
|
+
tags.push('javascript');
|
|
121
|
+
}
|
|
122
|
+
else if (path.endsWith('.py')) {
|
|
123
|
+
tags.push('python');
|
|
124
|
+
}
|
|
125
|
+
else if (path.endsWith('.go')) {
|
|
126
|
+
tags.push('golang');
|
|
127
|
+
}
|
|
128
|
+
else if (path.endsWith('.rs')) {
|
|
129
|
+
tags.push('rust');
|
|
130
|
+
}
|
|
131
|
+
else if (path.endsWith('.java')) {
|
|
132
|
+
tags.push('java');
|
|
133
|
+
}
|
|
134
|
+
else if (path.endsWith('.json')) {
|
|
135
|
+
tags.push('config');
|
|
136
|
+
}
|
|
137
|
+
else if (path.endsWith('.md')) {
|
|
138
|
+
tags.push('documentation');
|
|
139
|
+
}
|
|
140
|
+
// By directory pattern
|
|
141
|
+
if (path.includes('/test') || path.includes('/tests') || path.includes('__tests__')) {
|
|
142
|
+
tags.push('test');
|
|
143
|
+
}
|
|
144
|
+
else if (path.includes('/src/')) {
|
|
145
|
+
tags.push('source');
|
|
146
|
+
}
|
|
147
|
+
else if (path.includes('/lib/') || path.includes('/utils/')) {
|
|
148
|
+
tags.push('library');
|
|
149
|
+
}
|
|
150
|
+
else if (path.includes('/config/') || path.includes('/scripts/')) {
|
|
151
|
+
tags.push('config');
|
|
152
|
+
}
|
|
153
|
+
return tags;
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=auto-tagger.js.map
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Capture Filter - Smart filtering of tool usage
|
|
3
|
+
*
|
|
4
|
+
* Don't capture everything - filter out noise.
|
|
5
|
+
* Only capture meaningful actions that warrant memory.
|
|
6
|
+
*/
|
|
7
|
+
/** Tool categories for capture */
|
|
8
|
+
export type ToolCategory = 'reading' | 'modification' | 'command' | 'commit' | 'testing' | 'search' | 'planning' | 'other';
|
|
9
|
+
/** Capture decision */
|
|
10
|
+
export interface CaptureDecision {
|
|
11
|
+
shouldCapture: boolean;
|
|
12
|
+
reason?: string;
|
|
13
|
+
priority: 'high' | 'medium' | 'low';
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Check if a tool should be captured
|
|
17
|
+
*
|
|
18
|
+
* Rules:
|
|
19
|
+
* - Write, Edit, MultiEdit → capture (modification)
|
|
20
|
+
* - Bash with commit → capture (commit)
|
|
21
|
+
* - Bash with test → capture (testing)
|
|
22
|
+
* - Task → capture (planning)
|
|
23
|
+
* - Read, Glob, grep → skip (reading - too noisy)
|
|
24
|
+
*/
|
|
25
|
+
export declare function shouldCaptureTool(toolName: string): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Get detailed capture decision
|
|
28
|
+
*/
|
|
29
|
+
export declare function getCaptureDecision(toolName: string): CaptureDecision;
|
|
30
|
+
/**
|
|
31
|
+
* Check if Bash command should be captured based on content
|
|
32
|
+
*/
|
|
33
|
+
export declare function shouldCaptureBashCommand(command: string): {
|
|
34
|
+
capture: boolean;
|
|
35
|
+
reason: string;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Categorize tool for tagging
|
|
39
|
+
*/
|
|
40
|
+
export declare function categorizeTool(toolName: string): ToolCategory;
|
|
41
|
+
//# sourceMappingURL=capture-filter.d.ts.map
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Capture Filter - Smart filtering of tool usage
|
|
3
|
+
*
|
|
4
|
+
* Don't capture everything - filter out noise.
|
|
5
|
+
* Only capture meaningful actions that warrant memory.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Check if a tool should be captured
|
|
9
|
+
*
|
|
10
|
+
* Rules:
|
|
11
|
+
* - Write, Edit, MultiEdit → capture (modification)
|
|
12
|
+
* - Bash with commit → capture (commit)
|
|
13
|
+
* - Bash with test → capture (testing)
|
|
14
|
+
* - Task → capture (planning)
|
|
15
|
+
* - Read, Glob, grep → skip (reading - too noisy)
|
|
16
|
+
*/
|
|
17
|
+
export function shouldCaptureTool(toolName) {
|
|
18
|
+
const decision = getCaptureDecision(toolName);
|
|
19
|
+
return decision.shouldCapture;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Get detailed capture decision
|
|
23
|
+
*/
|
|
24
|
+
export function getCaptureDecision(toolName) {
|
|
25
|
+
const tool = toolName.toLowerCase();
|
|
26
|
+
// High priority - always capture
|
|
27
|
+
if (['write', 'edit', 'multiedit'].includes(tool)) {
|
|
28
|
+
return {
|
|
29
|
+
shouldCapture: true,
|
|
30
|
+
reason: 'File modification',
|
|
31
|
+
priority: 'high',
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
// Command with specific patterns
|
|
35
|
+
if (tool === 'bash') {
|
|
36
|
+
// Let the caller check the command for commit/test patterns
|
|
37
|
+
return {
|
|
38
|
+
shouldCapture: true, // Will be filtered by content check
|
|
39
|
+
reason: 'Command execution',
|
|
40
|
+
priority: 'medium',
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
// Task operations
|
|
44
|
+
if (['task', 'todowrite'].includes(tool)) {
|
|
45
|
+
return {
|
|
46
|
+
shouldCapture: true,
|
|
47
|
+
reason: 'Task/planning activity',
|
|
48
|
+
priority: 'high',
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
// Skip noisy tools
|
|
52
|
+
if (['read', 'glob', 'grep', 'websearch', 'webfetch', 'codesearch'].includes(tool)) {
|
|
53
|
+
return {
|
|
54
|
+
shouldCapture: false,
|
|
55
|
+
reason: 'Reading/search tool - too noisy',
|
|
56
|
+
priority: 'low',
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
// Skip other common noise
|
|
60
|
+
if (['bash'].includes(tool)) {
|
|
61
|
+
return {
|
|
62
|
+
shouldCapture: false, // Too noisy without filtering
|
|
63
|
+
reason: 'General command - filtered',
|
|
64
|
+
priority: 'low',
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
// Default: don't capture unknown tools
|
|
68
|
+
return {
|
|
69
|
+
shouldCapture: false,
|
|
70
|
+
reason: 'Unknown tool',
|
|
71
|
+
priority: 'low',
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Check if Bash command should be captured based on content
|
|
76
|
+
*/
|
|
77
|
+
export function shouldCaptureBashCommand(command) {
|
|
78
|
+
const cmd = command.toLowerCase();
|
|
79
|
+
// Git commits - HIGH priority
|
|
80
|
+
if (cmd.includes('git commit') || cmd.includes('git add') && cmd.includes('git commit')) {
|
|
81
|
+
return { capture: true, reason: 'Git commit' };
|
|
82
|
+
}
|
|
83
|
+
// Tests - HIGH priority
|
|
84
|
+
if (cmd.includes('test') || cmd.includes('jest') || cmd.includes('vitest') ||
|
|
85
|
+
cmd.includes('pytest') || cmd.includes('bun test')) {
|
|
86
|
+
return { capture: true, reason: 'Test execution' };
|
|
87
|
+
}
|
|
88
|
+
// Build/compile - MEDIUM priority
|
|
89
|
+
if (cmd.includes('build') || cmd.includes('compile') || cmd.includes('tsc') ||
|
|
90
|
+
cmd.includes('bun build') || cmd.includes('npm run build')) {
|
|
91
|
+
return { capture: true, reason: 'Build/compile' };
|
|
92
|
+
}
|
|
93
|
+
// Installation - LOW priority
|
|
94
|
+
if (cmd.includes('npm install') || cmd.includes('bun install') ||
|
|
95
|
+
cmd.includes('pip install') || cmd.includes('yarn add')) {
|
|
96
|
+
return { capture: false, reason: 'Package installation - too noisy' };
|
|
97
|
+
}
|
|
98
|
+
// Git operations (non-commit) - LOW priority
|
|
99
|
+
if (cmd.includes('git') && !cmd.includes('commit')) {
|
|
100
|
+
return { capture: false, reason: 'Git operations - not commits' };
|
|
101
|
+
}
|
|
102
|
+
// File operations - MEDIUM priority
|
|
103
|
+
if (cmd.includes('mkdir') || cmd.includes('touch') || cmd.includes('rm ')) {
|
|
104
|
+
return { capture: true, reason: 'File operation' };
|
|
105
|
+
}
|
|
106
|
+
// Default - don't capture
|
|
107
|
+
return { capture: false, reason: 'General command' };
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Categorize tool for tagging
|
|
111
|
+
*/
|
|
112
|
+
export function categorizeTool(toolName) {
|
|
113
|
+
const tool = toolName.toLowerCase();
|
|
114
|
+
if (['write', 'edit', 'multiedit'].includes(tool)) {
|
|
115
|
+
return 'modification';
|
|
116
|
+
}
|
|
117
|
+
if (tool === 'bash') {
|
|
118
|
+
return 'command';
|
|
119
|
+
}
|
|
120
|
+
if (['read', 'glob', 'grep', 'websearch', 'webfetch'].includes(tool)) {
|
|
121
|
+
return 'reading';
|
|
122
|
+
}
|
|
123
|
+
if (['task', 'todowrite', 'todo-read'].includes(tool)) {
|
|
124
|
+
return 'planning';
|
|
125
|
+
}
|
|
126
|
+
return 'other';
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=capture-filter.js.map
|
package/dist/core/index.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
export * from './cache.js';
|
|
2
|
-
export * from './context.js';
|
|
3
|
-
export * from './database.js';
|
|
1
|
+
export * from './storage/cache.js';
|
|
2
|
+
export * from './context/context.js';
|
|
3
|
+
export * from './storage/database.js';
|
|
4
4
|
export * from './embeddings.js';
|
|
5
|
-
export * from './
|
|
6
|
-
export * from './privacy.js';
|
|
5
|
+
export * from './ingestion/learnings.js';
|
|
6
|
+
export * from './security/privacy.js';
|
|
7
7
|
export * from './projects.js';
|
|
8
|
-
export * from './secret-detector.js';
|
|
8
|
+
export * from './security/secret-detector.js';
|
|
9
9
|
export * from './worker.js';
|
|
10
10
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/core/index.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
// Shared services - Core utilities and services
|
|
2
|
-
export * from './cache.js';
|
|
3
|
-
export * from './context.js';
|
|
4
|
-
export * from './database.js';
|
|
2
|
+
export * from './storage/cache.js';
|
|
3
|
+
export * from './context/context.js';
|
|
4
|
+
export * from './storage/database.js';
|
|
5
5
|
export * from './embeddings.js';
|
|
6
6
|
// Note: local-embeddings exports duplicate of embeddings, import directly when needed
|
|
7
7
|
// export * from './local-embeddings.js';
|
|
8
|
-
export * from './
|
|
9
|
-
export * from './privacy.js';
|
|
8
|
+
export * from './ingestion/learnings.js';
|
|
9
|
+
export * from './security/privacy.js';
|
|
10
10
|
export * from './projects.js';
|
|
11
11
|
// Note: redis exports duplicates of cache, import directly when needed
|
|
12
|
-
export * from './secret-detector.js';
|
|
12
|
+
export * from './security/secret-detector.js';
|
|
13
13
|
export * from './worker.js';
|
|
14
14
|
//# sourceMappingURL=index.js.map
|
|
@@ -4,11 +4,11 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { and, eq } from 'drizzle-orm';
|
|
6
6
|
import { randomUUID } from 'crypto';
|
|
7
|
-
import { getDb } from '
|
|
8
|
-
import { getSchema } from '
|
|
9
|
-
import { config } from '
|
|
10
|
-
import { getEmbedding } from '
|
|
11
|
-
import { logger } from '
|
|
7
|
+
import { getDb } from '../../db/index.js';
|
|
8
|
+
import { getSchema } from '../../db/schema.js';
|
|
9
|
+
import { config } from '../../config.js';
|
|
10
|
+
import { getEmbedding } from '../embeddings.js';
|
|
11
|
+
import { logger } from '../logger.js';
|
|
12
12
|
/**
|
|
13
13
|
* Store a memory with agent context
|
|
14
14
|
*/
|
|
@@ -53,9 +53,7 @@ export async function storeAgentMemory(content, context, options = {}) {
|
|
|
53
53
|
throw error;
|
|
54
54
|
}
|
|
55
55
|
}
|
|
56
|
-
// ============================================================================
|
|
57
56
|
// Helper Functions
|
|
58
|
-
// ============================================================================
|
|
59
57
|
function calculateReadScope(context, visibility) {
|
|
60
58
|
switch (visibility) {
|
|
61
59
|
case 'private':
|
|
@@ -5,10 +5,10 @@
|
|
|
5
5
|
* This memory is automatically injected into every agent interaction.
|
|
6
6
|
*/
|
|
7
7
|
import { eq, and, sql } from 'drizzle-orm';
|
|
8
|
-
import { getDb } from '
|
|
9
|
-
import { getSchema } from '
|
|
10
|
-
import { createDatabaseClient } from '
|
|
11
|
-
import config from '
|
|
8
|
+
import { getDb } from '../../db/index.js';
|
|
9
|
+
import { getSchema } from '../../db/schema.js';
|
|
10
|
+
import { createDatabaseClient } from '../storage/database.js';
|
|
11
|
+
import config from '../../config.js';
|
|
12
12
|
// Use configurable limits from environment
|
|
13
13
|
const MAX_TOTAL_SIZE_BYTES = config.coreMemoryTotalBytes;
|
|
14
14
|
const MAX_SECTION_SIZE_BYTES = config.coreMemorySectionBytes;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Learnings Module
|
|
3
|
+
* Agent learnings: success, failure, fix, insight
|
|
4
|
+
* With auto-linking to similar memories and learnings
|
|
5
|
+
*/
|
|
6
|
+
export type LearningType = 'success' | 'failure' | 'fix' | 'insight';
|
|
7
|
+
export interface LearningInput {
|
|
8
|
+
type: LearningType;
|
|
9
|
+
content: string;
|
|
10
|
+
context?: string;
|
|
11
|
+
action?: string;
|
|
12
|
+
target?: string;
|
|
13
|
+
project?: string;
|
|
14
|
+
memoryId?: string;
|
|
15
|
+
autoLink?: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface LearningRecord {
|
|
18
|
+
id: string;
|
|
19
|
+
projectId?: string | null;
|
|
20
|
+
conversationId?: string | null;
|
|
21
|
+
type: LearningType;
|
|
22
|
+
action: string;
|
|
23
|
+
target?: string | null;
|
|
24
|
+
summary: string;
|
|
25
|
+
details?: Record<string, unknown> | null;
|
|
26
|
+
memoryId?: string | null;
|
|
27
|
+
isImported?: boolean;
|
|
28
|
+
createdAt?: string | null;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Create a learning and optionally auto-link to similar memories/learnings
|
|
32
|
+
*/
|
|
33
|
+
export declare function createLearning(input: LearningInput): Promise<LearningRecord>;
|
|
34
|
+
/**
|
|
35
|
+
* Get learnings for a project
|
|
36
|
+
*/
|
|
37
|
+
export declare function getLearnings(projectPath: string, limit: number): Promise<LearningRecord[]>;
|
|
38
|
+
/**
|
|
39
|
+
* Get recent learnings
|
|
40
|
+
*/
|
|
41
|
+
export declare function getRecentLearnings(projectPath: string, limit?: number): Promise<LearningRecord[]>;
|
|
42
|
+
/**
|
|
43
|
+
* Get learning by ID
|
|
44
|
+
*/
|
|
45
|
+
export declare function getLearningById(learningId: string): Promise<LearningRecord | null>;
|
|
46
|
+
/**
|
|
47
|
+
* Get learnings linked to a specific memory
|
|
48
|
+
*/
|
|
49
|
+
export declare function getLearningsForMemory(memoryId: string): Promise<LearningRecord[]>;
|
|
50
|
+
/**
|
|
51
|
+
* Delete a learning
|
|
52
|
+
*/
|
|
53
|
+
export declare function deleteLearning(learningId: string): Promise<boolean>;
|
|
54
|
+
export declare const getObservations: typeof getLearnings;
|
|
55
|
+
export declare const getRecentObservations: typeof getRecentLearnings;
|
|
56
|
+
export declare const getObservationById: typeof getLearningById;
|
|
57
|
+
//# sourceMappingURL=learnings.d.ts.map
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Learnings Module
|
|
3
|
+
* Agent learnings: success, failure, fix, insight
|
|
4
|
+
* With auto-linking to similar memories and learnings
|
|
5
|
+
*/
|
|
6
|
+
import { randomUUID } from 'crypto';
|
|
7
|
+
import { desc, eq } from 'drizzle-orm';
|
|
8
|
+
import { getEmbedding } from '../embeddings.js';
|
|
9
|
+
import { getOrCreateProject, requireProject } from '../projects.js';
|
|
10
|
+
import { serializeMetadata, deserializeMetadata } from '../memory/serialization.js';
|
|
11
|
+
import { normalizeTimestamp, prepareEmbedding } from '../lib/utils.js';
|
|
12
|
+
import { logger } from '../logger.js';
|
|
13
|
+
import { getDbClient } from '../lib/db-client.js';
|
|
14
|
+
import { createAssociation } from '../associations.js';
|
|
15
|
+
import { search } from '../memory/memories.js';
|
|
16
|
+
/**
|
|
17
|
+
* Create a learning and optionally auto-link to similar memories/learnings
|
|
18
|
+
*/
|
|
19
|
+
export async function createLearning(input) {
|
|
20
|
+
const { db, schema } = await getDbClient();
|
|
21
|
+
const project = await getOrCreateProject(input.project);
|
|
22
|
+
const embedding = await getEmbedding(input.content);
|
|
23
|
+
const id = randomUUID();
|
|
24
|
+
const learningType = input.type;
|
|
25
|
+
const autoLink = input.autoLink !== false; // default true
|
|
26
|
+
// Build details with learning metadata
|
|
27
|
+
const details = serializeMetadata({
|
|
28
|
+
learningType: learningType,
|
|
29
|
+
learningContent: input.content,
|
|
30
|
+
learningContext: input.context,
|
|
31
|
+
});
|
|
32
|
+
const embeddingValues = prepareEmbedding(embedding);
|
|
33
|
+
// Insert the learning
|
|
34
|
+
await db.insert(schema.learnings).values({
|
|
35
|
+
id,
|
|
36
|
+
projectId: project?.id ?? null,
|
|
37
|
+
type: learningType,
|
|
38
|
+
action: input.action ?? input.content,
|
|
39
|
+
summary: input.context || input.content,
|
|
40
|
+
target: input.target ?? null,
|
|
41
|
+
details,
|
|
42
|
+
memoryId: input.memoryId ?? null,
|
|
43
|
+
...embeddingValues,
|
|
44
|
+
createdAt: new Date(),
|
|
45
|
+
});
|
|
46
|
+
// If memoryId provided, create bidirectional link
|
|
47
|
+
if (input.memoryId) {
|
|
48
|
+
await createAssociation(input.memoryId, // from memory
|
|
49
|
+
id, // to learning
|
|
50
|
+
'relates_to', 1);
|
|
51
|
+
}
|
|
52
|
+
// Auto-link to similar memories and learnings (if enabled)
|
|
53
|
+
if (autoLink) {
|
|
54
|
+
await autoLinkLearning(id, input.content, project?.id ?? null);
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
id,
|
|
58
|
+
projectId: project?.id ?? null,
|
|
59
|
+
conversationId: null,
|
|
60
|
+
type: learningType,
|
|
61
|
+
action: input.action ?? input.content,
|
|
62
|
+
target: input.target ?? null,
|
|
63
|
+
summary: input.context || input.content,
|
|
64
|
+
details: { learningType: learningType, learningContent: input.content, learningContext: input.context },
|
|
65
|
+
memoryId: input.memoryId ?? null,
|
|
66
|
+
createdAt: new Date().toISOString(),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Auto-link a learning to similar memories above threshold
|
|
71
|
+
*/
|
|
72
|
+
async function autoLinkLearning(learningId, content, projectId) {
|
|
73
|
+
const SIMILARITY_THRESHOLD = 0.85;
|
|
74
|
+
const MAX_LINKS = 5;
|
|
75
|
+
if (!projectId)
|
|
76
|
+
return;
|
|
77
|
+
try {
|
|
78
|
+
// Search for similar memories using the search function
|
|
79
|
+
const similarMemories = await search({
|
|
80
|
+
query: content,
|
|
81
|
+
limit: MAX_LINKS,
|
|
82
|
+
});
|
|
83
|
+
// Filter by similarity threshold
|
|
84
|
+
const relevantMemories = similarMemories.filter((m) => (m.similarity ?? 0) >= SIMILARITY_THRESHOLD);
|
|
85
|
+
// Create associations with memories
|
|
86
|
+
for (const mem of relevantMemories) {
|
|
87
|
+
await createAssociation(learningId, // from learning
|
|
88
|
+
mem.id, // to memory
|
|
89
|
+
'relates_to', mem.similarity ?? 0.9);
|
|
90
|
+
}
|
|
91
|
+
logger.info(`Auto-linked learning ${learningId} to ${relevantMemories.length} memories`);
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
logger.error('Error in auto-linking:', error);
|
|
95
|
+
// Don't fail learning creation if auto-link fails
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Get learnings for a project
|
|
100
|
+
*/
|
|
101
|
+
export async function getLearnings(projectPath, limit) {
|
|
102
|
+
try {
|
|
103
|
+
const { db, schema } = await getDbClient();
|
|
104
|
+
const project = await requireProject(projectPath);
|
|
105
|
+
const rows = await db.select().from(schema.learnings)
|
|
106
|
+
.where(eq(schema.learnings.projectId, project.id))
|
|
107
|
+
.orderBy(desc(schema.learnings.createdAt))
|
|
108
|
+
.limit(limit);
|
|
109
|
+
return rows.map((row) => normalizeLearning(row));
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
throw error;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Get recent learnings
|
|
117
|
+
*/
|
|
118
|
+
export async function getRecentLearnings(projectPath, limit = 10) {
|
|
119
|
+
try {
|
|
120
|
+
const { db, schema } = await getDbClient();
|
|
121
|
+
const project = await requireProject(projectPath);
|
|
122
|
+
const rows = await db.select().from(schema.learnings)
|
|
123
|
+
.where(eq(schema.learnings.projectId, project.id))
|
|
124
|
+
.orderBy(desc(schema.learnings.createdAt))
|
|
125
|
+
.limit(limit);
|
|
126
|
+
return rows.map((row) => normalizeLearning(row));
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
logger.error('Error getting recent learnings', error);
|
|
130
|
+
throw error;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Get learning by ID
|
|
135
|
+
*/
|
|
136
|
+
export async function getLearningById(learningId) {
|
|
137
|
+
try {
|
|
138
|
+
const { db, schema } = await getDbClient();
|
|
139
|
+
const rows = await db.select().from(schema.learnings)
|
|
140
|
+
.where(eq(schema.learnings.id, learningId))
|
|
141
|
+
.limit(1);
|
|
142
|
+
if (rows.length === 0)
|
|
143
|
+
return null;
|
|
144
|
+
return normalizeLearning(rows[0]);
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
logger.error('Error getting learning', error);
|
|
148
|
+
throw error;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Get learnings linked to a specific memory
|
|
153
|
+
*/
|
|
154
|
+
export async function getLearningsForMemory(memoryId) {
|
|
155
|
+
try {
|
|
156
|
+
const { db, schema } = await getDbClient();
|
|
157
|
+
const rows = await db.select().from(schema.learnings)
|
|
158
|
+
.where(eq(schema.learnings.memoryId, memoryId))
|
|
159
|
+
.orderBy(desc(schema.learnings.createdAt));
|
|
160
|
+
return rows.map((row) => normalizeLearning(row));
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
logger.error('Error getting learnings for memory', error);
|
|
164
|
+
throw error;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Delete a learning
|
|
169
|
+
*/
|
|
170
|
+
export async function deleteLearning(learningId) {
|
|
171
|
+
try {
|
|
172
|
+
const { db, schema } = await getDbClient();
|
|
173
|
+
await db.delete(schema.learnings)
|
|
174
|
+
.where(eq(schema.learnings.id, learningId));
|
|
175
|
+
return true;
|
|
176
|
+
}
|
|
177
|
+
catch (error) {
|
|
178
|
+
logger.error('Error deleting learning', error);
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
function normalizeLearning(row) {
|
|
183
|
+
const details = deserializeMetadata(row.details ?? null);
|
|
184
|
+
return {
|
|
185
|
+
id: row.id,
|
|
186
|
+
projectId: row.projectId ?? row.project_id ?? null,
|
|
187
|
+
conversationId: row.conversationId ?? row.conversation_id ?? null,
|
|
188
|
+
type: row.type,
|
|
189
|
+
action: row.action,
|
|
190
|
+
target: row.target ?? null,
|
|
191
|
+
summary: row.summary,
|
|
192
|
+
details,
|
|
193
|
+
memoryId: row.memoryId ?? row.memory_id ?? null,
|
|
194
|
+
isImported: row.isImported ?? row.is_imported ?? false,
|
|
195
|
+
createdAt: normalizeTimestamp(row.createdAt ?? row.created_at),
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
// Backwards compatibility aliases
|
|
199
|
+
export const getObservations = getLearnings;
|
|
200
|
+
export const getRecentObservations = getRecentLearnings;
|
|
201
|
+
export const getObservationById = getLearningById;
|
|
202
|
+
//# sourceMappingURL=learnings.js.map
|