sensorium-mcp 3.0.103 → 3.1.0-refactor.0
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/README.md +25 -0
- package/dist/config/agent-settings.d.ts +69 -0
- package/dist/config/agent-settings.d.ts.map +1 -0
- package/dist/config/agent-settings.js +225 -0
- package/dist/config/agent-settings.js.map +1 -0
- package/dist/config/agent-templates.d.ts +39 -0
- package/dist/config/agent-templates.d.ts.map +1 -0
- package/dist/config/agent-templates.js +105 -0
- package/dist/config/agent-templates.js.map +1 -0
- package/dist/config/index.d.ts +16 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +58 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/keep-alive-settings.d.ts +29 -0
- package/dist/config/keep-alive-settings.d.ts.map +1 -0
- package/dist/config/keep-alive-settings.js +100 -0
- package/dist/config/keep-alive-settings.js.map +1 -0
- package/dist/config/mcp-settings.d.ts +59 -0
- package/dist/config/mcp-settings.d.ts.map +1 -0
- package/dist/config/mcp-settings.js +196 -0
- package/dist/config/mcp-settings.js.map +1 -0
- package/dist/config/misc-settings.d.ts +46 -0
- package/dist/config/misc-settings.d.ts.map +1 -0
- package/dist/config/misc-settings.js +146 -0
- package/dist/config/misc-settings.js.map +1 -0
- package/dist/config/settings-store.d.ts +10 -0
- package/dist/config/settings-store.d.ts.map +1 -0
- package/dist/config/settings-store.js +65 -0
- package/dist/config/settings-store.js.map +1 -0
- package/dist/dashboard/log-parser.d.ts.map +1 -1
- package/dist/dashboard/log-parser.js +12 -2
- package/dist/dashboard/log-parser.js.map +1 -1
- package/dist/dashboard/presets.d.ts +1 -1
- package/dist/dashboard/presets.d.ts.map +1 -1
- package/dist/dashboard/presets.js +1 -1
- package/dist/dashboard/presets.js.map +1 -1
- package/dist/dashboard/routes/agent-templates.d.ts.map +1 -1
- package/dist/dashboard/routes/agent-templates.js +13 -8
- package/dist/dashboard/routes/agent-templates.js.map +1 -1
- package/dist/dashboard/routes/claude.d.ts.map +1 -1
- package/dist/dashboard/routes/claude.js +6 -3
- package/dist/dashboard/routes/claude.js.map +1 -1
- package/dist/dashboard/routes/copilot.d.ts.map +1 -1
- package/dist/dashboard/routes/copilot.js +16 -7
- package/dist/dashboard/routes/copilot.js.map +1 -1
- package/dist/dashboard/routes/data.d.ts.map +1 -1
- package/dist/dashboard/routes/data.js +43 -15
- package/dist/dashboard/routes/data.js.map +1 -1
- package/dist/dashboard/routes/env-vars.d.ts.map +1 -1
- package/dist/dashboard/routes/env-vars.js.map +1 -1
- package/dist/dashboard/routes/mcp-servers.d.ts.map +1 -1
- package/dist/dashboard/routes/mcp-servers.js +11 -5
- package/dist/dashboard/routes/mcp-servers.js.map +1 -1
- package/dist/dashboard/routes/prompts.d.ts.map +1 -1
- package/dist/dashboard/routes/prompts.js +2 -2
- package/dist/dashboard/routes/prompts.js.map +1 -1
- package/dist/dashboard/routes/settings.d.ts.map +1 -1
- package/dist/dashboard/routes/settings.js +5 -3
- package/dist/dashboard/routes/settings.js.map +1 -1
- package/dist/dashboard/routes/skills.d.ts.map +1 -1
- package/dist/dashboard/routes/skills.js +4 -4
- package/dist/dashboard/routes/skills.js.map +1 -1
- package/dist/dashboard/routes/snapshots.d.ts.map +1 -1
- package/dist/dashboard/routes/snapshots.js +18 -11
- package/dist/dashboard/routes/snapshots.js.map +1 -1
- package/dist/dashboard/routes/templates.d.ts.map +1 -1
- package/dist/dashboard/routes/templates.js +6 -3
- package/dist/dashboard/routes/templates.js.map +1 -1
- package/dist/dashboard/routes/threads-create.d.ts +22 -0
- package/dist/dashboard/routes/threads-create.d.ts.map +1 -0
- package/dist/dashboard/routes/threads-create.js +225 -0
- package/dist/dashboard/routes/threads-create.js.map +1 -0
- package/dist/dashboard/routes/threads-helpers.d.ts +28 -0
- package/dist/dashboard/routes/threads-helpers.d.ts.map +1 -0
- package/dist/dashboard/routes/threads-helpers.js +138 -0
- package/dist/dashboard/routes/threads-helpers.js.map +1 -0
- package/dist/dashboard/routes/threads-read.d.ts +26 -0
- package/dist/dashboard/routes/threads-read.d.ts.map +1 -0
- package/dist/dashboard/routes/threads-read.js +118 -0
- package/dist/dashboard/routes/threads-read.js.map +1 -0
- package/dist/dashboard/routes/threads.d.ts +5 -44
- package/dist/dashboard/routes/threads.d.ts.map +1 -1
- package/dist/dashboard/routes/threads.js +40 -496
- package/dist/dashboard/routes/threads.js.map +1 -1
- package/dist/dashboard/routes/types.d.ts.map +1 -1
- package/dist/dashboard/routes/types.js.map +1 -1
- package/dist/dashboard/routes.d.ts.map +1 -1
- package/dist/dashboard/routes.js +9 -5
- package/dist/dashboard/routes.js.map +1 -1
- package/dist/data/daily-marker.d.ts.map +1 -1
- package/dist/data/daily-marker.js +1 -1
- package/dist/data/daily-marker.js.map +1 -1
- package/dist/data/file-storage.d.ts.map +1 -1
- package/dist/data/file-storage.js +40 -16
- package/dist/data/file-storage.js.map +1 -1
- package/dist/data/interfaces.d.ts +23 -2
- package/dist/data/interfaces.d.ts.map +1 -1
- package/dist/data/memory/bootstrap.d.ts +1 -1
- package/dist/data/memory/bootstrap.d.ts.map +1 -1
- package/dist/data/memory/bootstrap.js +32 -13
- package/dist/data/memory/bootstrap.js.map +1 -1
- package/dist/data/memory/consolidation.d.ts.map +1 -1
- package/dist/data/memory/consolidation.js +17 -8
- package/dist/data/memory/consolidation.js.map +1 -1
- package/dist/data/memory/db-types.d.ts +4 -0
- package/dist/data/memory/db-types.d.ts.map +1 -0
- package/dist/data/memory/db-types.js +2 -0
- package/dist/data/memory/db-types.js.map +1 -0
- package/dist/data/memory/episodes.d.ts.map +1 -1
- package/dist/data/memory/episodes.js +3 -5
- package/dist/data/memory/episodes.js.map +1 -1
- package/dist/data/memory/index.d.ts +28 -14
- package/dist/data/memory/index.d.ts.map +1 -1
- package/dist/data/memory/index.js +28 -14
- package/dist/data/memory/index.js.map +1 -1
- package/dist/data/memory/migration-runner.d.ts +1 -1
- package/dist/data/memory/migration-runner.d.ts.map +1 -1
- package/dist/data/memory/migration-runner.js +23 -15
- package/dist/data/memory/migration-runner.js.map +1 -1
- package/dist/data/memory/narrative-lint.d.ts +12 -0
- package/dist/data/memory/narrative-lint.d.ts.map +1 -0
- package/dist/data/memory/narrative-lint.js +117 -0
- package/dist/data/memory/narrative-lint.js.map +1 -0
- package/dist/data/memory/narrative-resolutions.d.ts +26 -0
- package/dist/data/memory/narrative-resolutions.d.ts.map +1 -0
- package/dist/data/memory/narrative-resolutions.js +81 -0
- package/dist/data/memory/narrative-resolutions.js.map +1 -0
- package/dist/data/memory/narrative-sources.d.ts +19 -0
- package/dist/data/memory/narrative-sources.d.ts.map +1 -0
- package/dist/data/memory/narrative-sources.js +150 -0
- package/dist/data/memory/narrative-sources.js.map +1 -0
- package/dist/data/memory/narrative-store.d.ts +11 -0
- package/dist/data/memory/narrative-store.d.ts.map +1 -0
- package/dist/data/memory/narrative-store.js +80 -0
- package/dist/data/memory/narrative-store.js.map +1 -0
- package/dist/data/memory/narrative-types.d.ts +15 -0
- package/dist/data/memory/narrative-types.d.ts.map +1 -0
- package/dist/data/memory/narrative-types.js +3 -0
- package/dist/data/memory/narrative-types.js.map +1 -0
- package/dist/data/memory/narrative.d.ts +5 -2
- package/dist/data/memory/narrative.d.ts.map +1 -1
- package/dist/data/memory/narrative.js +31 -521
- package/dist/data/memory/narrative.js.map +1 -1
- package/dist/data/memory/note-archival.d.ts +17 -0
- package/dist/data/memory/note-archival.d.ts.map +1 -0
- package/dist/data/memory/note-archival.js +48 -0
- package/dist/data/memory/note-archival.js.map +1 -0
- package/dist/data/memory/note-embeddings.d.ts +27 -0
- package/dist/data/memory/note-embeddings.d.ts.map +1 -0
- package/dist/data/memory/note-embeddings.js +98 -0
- package/dist/data/memory/note-embeddings.js.map +1 -0
- package/dist/data/memory/reflection-dedup.d.ts +17 -0
- package/dist/data/memory/reflection-dedup.d.ts.map +1 -0
- package/dist/data/memory/reflection-dedup.js +55 -0
- package/dist/data/memory/reflection-dedup.js.map +1 -0
- package/dist/data/memory/reflection-gates.d.ts +40 -0
- package/dist/data/memory/reflection-gates.d.ts.map +1 -0
- package/dist/data/memory/reflection-gates.js +220 -0
- package/dist/data/memory/reflection-gates.js.map +1 -0
- package/dist/data/memory/reflection-sources.d.ts +13 -0
- package/dist/data/memory/reflection-sources.d.ts.map +1 -0
- package/dist/data/memory/reflection-sources.js +115 -0
- package/dist/data/memory/reflection-sources.js.map +1 -0
- package/dist/data/memory/reflection.d.ts +5 -35
- package/dist/data/memory/reflection.d.ts.map +1 -1
- package/dist/data/memory/reflection.js +25 -329
- package/dist/data/memory/reflection.js.map +1 -1
- package/dist/data/memory/schema-ddl.d.ts +1 -1
- package/dist/data/memory/schema-ddl.d.ts.map +1 -1
- package/dist/data/memory/schema-ddl.js +5 -3
- package/dist/data/memory/schema-ddl.js.map +1 -1
- package/dist/data/memory/schema-guard.d.ts +1 -1
- package/dist/data/memory/schema-guard.d.ts.map +1 -1
- package/dist/data/memory/schema-guard.js +5 -4
- package/dist/data/memory/schema-guard.js.map +1 -1
- package/dist/data/memory/schema.d.ts +2 -2
- package/dist/data/memory/schema.d.ts.map +1 -1
- package/dist/data/memory/schema.js +4 -2
- package/dist/data/memory/schema.js.map +1 -1
- package/dist/data/memory/{semantic.d.ts → semantic-notes.d.ts} +6 -72
- package/dist/data/memory/semantic-notes.d.ts.map +1 -0
- package/dist/data/memory/semantic-notes.js +249 -0
- package/dist/data/memory/semantic-notes.js.map +1 -0
- package/dist/data/memory/semantic-search.d.ts +29 -0
- package/dist/data/memory/semantic-search.d.ts.map +1 -0
- package/dist/data/memory/semantic-search.js +156 -0
- package/dist/data/memory/semantic-search.js.map +1 -0
- package/dist/data/memory/synthesis.d.ts.map +1 -1
- package/dist/data/memory/synthesis.js +15 -7
- package/dist/data/memory/synthesis.js.map +1 -1
- package/dist/data/memory/thread-registry.d.ts +2 -2
- package/dist/data/memory/thread-registry.d.ts.map +1 -1
- package/dist/data/memory/thread-registry.js +74 -36
- package/dist/data/memory/thread-registry.js.map +1 -1
- package/dist/data/memory/topic-index.d.ts +20 -0
- package/dist/data/memory/topic-index.d.ts.map +1 -0
- package/dist/data/memory/topic-index.js +91 -0
- package/dist/data/memory/topic-index.js.map +1 -0
- package/dist/data/memory/topic-shift.js +1 -1
- package/dist/data/memory/topic-shift.js.map +1 -1
- package/dist/data/memory/utils.d.ts +0 -5
- package/dist/data/memory/utils.d.ts.map +1 -1
- package/dist/data/memory/utils.js +0 -94
- package/dist/data/memory/utils.js.map +1 -1
- package/dist/data/sent-message.repository.js +2 -2
- package/dist/data/sent-message.repository.js.map +1 -1
- package/dist/data/templates.js +2 -2
- package/dist/data/templates.js.map +1 -1
- package/dist/index.js +21 -19
- package/dist/index.js.map +1 -1
- package/dist/integrations/openai/chat.d.ts.map +1 -1
- package/dist/integrations/openai/chat.js +5 -5
- package/dist/integrations/openai/chat.js.map +1 -1
- package/dist/integrations/openai/speech.d.ts +1 -1
- package/dist/integrations/openai/speech.d.ts.map +1 -1
- package/dist/integrations/openai/speech.js +1 -3
- package/dist/integrations/openai/speech.js.map +1 -1
- package/dist/integrations/openai/video.d.ts.map +1 -1
- package/dist/integrations/openai/video.js +21 -10
- package/dist/integrations/openai/video.js.map +1 -1
- package/dist/integrations/openai/vision.d.ts.map +1 -1
- package/dist/integrations/openai/vision.js.map +1 -1
- package/dist/integrations/openai/voice-emotion.d.ts.map +1 -1
- package/dist/integrations/openai/voice-emotion.js +2 -2
- package/dist/integrations/openai/voice-emotion.js.map +1 -1
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/{logger.js → lib/logger.js} +77 -50
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/markdown.d.ts.map +1 -0
- package/dist/{markdown.js → lib/markdown.js} +13 -5
- package/dist/lib/markdown.js.map +1 -0
- package/dist/{types.d.ts → lib/types.d.ts} +0 -1
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/{utils.js → lib/utils.js} +29 -9
- package/dist/lib/utils.js.map +1 -0
- package/dist/llm/json.d.ts +14 -0
- package/dist/llm/json.d.ts.map +1 -0
- package/dist/llm/json.js +112 -0
- package/dist/llm/json.js.map +1 -0
- package/dist/llm/prompts/narrative.d.ts +7 -0
- package/dist/llm/prompts/narrative.d.ts.map +1 -0
- package/dist/llm/prompts/narrative.js +124 -0
- package/dist/llm/prompts/narrative.js.map +1 -0
- package/dist/llm/prompts/reflection.d.ts +6 -0
- package/dist/llm/prompts/reflection.d.ts.map +1 -0
- package/dist/llm/prompts/reflection.js +77 -0
- package/dist/llm/prompts/reflection.js.map +1 -0
- package/dist/server/factory.d.ts +2 -2
- package/dist/server/factory.d.ts.map +1 -1
- package/dist/server/factory.js +152 -73
- package/dist/server/factory.js.map +1 -1
- package/dist/{http-server.d.ts → server/http-server.d.ts} +2 -2
- package/dist/server/http-server.d.ts.map +1 -0
- package/dist/{http-server.js → server/http-server.js} +38 -17
- package/dist/server/http-server.js.map +1 -0
- package/dist/{stdio-server.d.ts → server/stdio-server.d.ts} +1 -1
- package/dist/server/stdio-server.d.ts.map +1 -0
- package/dist/{stdio-server.js → server/stdio-server.js} +25 -11
- package/dist/server/stdio-server.js.map +1 -0
- package/dist/services/agent-spawn.service.d.ts +1 -1
- package/dist/services/agent-spawn.service.d.ts.map +1 -1
- package/dist/services/agent-spawn.service.js +17 -7
- package/dist/services/agent-spawn.service.js.map +1 -1
- package/dist/services/background-runner.d.ts +2 -2
- package/dist/services/background-runner.d.ts.map +1 -1
- package/dist/services/background-runner.js +8 -3
- package/dist/services/background-runner.js.map +1 -1
- package/dist/services/claude-spawn.service.d.ts.map +1 -1
- package/dist/services/claude-spawn.service.js +61 -52
- package/dist/services/claude-spawn.service.js.map +1 -1
- package/dist/services/codex-spawn.service.d.ts.map +1 -1
- package/dist/services/codex-spawn.service.js +52 -40
- package/dist/services/codex-spawn.service.js.map +1 -1
- package/dist/services/consolidation-prompts.d.ts +26 -0
- package/dist/services/consolidation-prompts.d.ts.map +1 -0
- package/dist/services/consolidation-prompts.js +144 -0
- package/dist/services/consolidation-prompts.js.map +1 -0
- package/dist/services/consolidation.service.d.ts +1 -5
- package/dist/services/consolidation.service.d.ts.map +1 -1
- package/dist/services/consolidation.service.js +53 -322
- package/dist/services/consolidation.service.js.map +1 -1
- package/dist/services/copilot-spawn.service.d.ts.map +1 -1
- package/dist/services/copilot-spawn.service.js +47 -57
- package/dist/services/copilot-spawn.service.js.map +1 -1
- package/dist/{daily-session.d.ts → services/daily-session.d.ts} +1 -1
- package/dist/services/daily-session.d.ts.map +1 -0
- package/dist/{daily-session.js → services/daily-session.js} +15 -14
- package/dist/services/daily-session.js.map +1 -0
- package/dist/services/dispatcher/broker.d.ts +0 -6
- package/dist/services/dispatcher/broker.d.ts.map +1 -1
- package/dist/services/dispatcher/broker.js +46 -38
- package/dist/services/dispatcher/broker.js.map +1 -1
- package/dist/services/dispatcher/index.d.ts +1 -1
- package/dist/services/dispatcher/index.d.ts.map +1 -1
- package/dist/services/dispatcher/index.js +1 -1
- package/dist/services/dispatcher/index.js.map +1 -1
- package/dist/services/dispatcher/lock.d.ts.map +1 -1
- package/dist/services/dispatcher/lock.js +24 -9
- package/dist/services/dispatcher/lock.js.map +1 -1
- package/dist/services/dispatcher/poller.d.ts +1 -1
- package/dist/services/dispatcher/poller.d.ts.map +1 -1
- package/dist/services/dispatcher/poller.js +74 -49
- package/dist/services/dispatcher/poller.js.map +1 -1
- package/dist/services/drive.d.ts.map +1 -0
- package/dist/{drive.js → services/drive.js} +1 -1
- package/dist/services/drive.js.map +1 -0
- package/dist/services/intent.d.ts.map +1 -0
- package/dist/{intent.js → services/intent.js} +78 -23
- package/dist/services/intent.js.map +1 -0
- package/dist/services/keep-alive-sync.service.d.ts +11 -0
- package/dist/services/keep-alive-sync.service.d.ts.map +1 -0
- package/dist/services/keep-alive-sync.service.js +47 -0
- package/dist/services/keep-alive-sync.service.js.map +1 -0
- package/dist/services/keeper.service.d.ts +1 -1
- package/dist/services/keeper.service.d.ts.map +1 -1
- package/dist/services/keeper.service.js +31 -18
- package/dist/services/keeper.service.js.map +1 -1
- package/dist/services/maintenance-signal.js +1 -1
- package/dist/services/maintenance-signal.js.map +1 -1
- package/dist/services/mcp-config.service.d.ts.map +1 -1
- package/dist/services/mcp-config.service.js +19 -6
- package/dist/services/mcp-config.service.js.map +1 -1
- package/dist/services/memory-briefing.service.d.ts.map +1 -1
- package/dist/services/memory-briefing.service.js +13 -7
- package/dist/services/memory-briefing.service.js.map +1 -1
- package/dist/services/memory-pruning.service.d.ts +12 -0
- package/dist/services/memory-pruning.service.d.ts.map +1 -0
- package/dist/services/memory-pruning.service.js +177 -0
- package/dist/services/memory-pruning.service.js.map +1 -0
- package/dist/services/process.service.d.ts +7 -2
- package/dist/services/process.service.d.ts.map +1 -1
- package/dist/services/process.service.js +233 -103
- package/dist/services/process.service.js.map +1 -1
- package/dist/services/reconnect-snapshot.service.d.ts.map +1 -1
- package/dist/services/reconnect-snapshot.service.js +3 -3
- package/dist/services/reconnect-snapshot.service.js.map +1 -1
- package/dist/{scheduler.d.ts → services/scheduler.d.ts} +1 -23
- package/dist/services/scheduler.d.ts.map +1 -0
- package/dist/{scheduler.js → services/scheduler.js} +6 -8
- package/dist/services/scheduler.js.map +1 -0
- package/dist/services/self-update.service.d.ts +15 -5
- package/dist/services/self-update.service.d.ts.map +1 -1
- package/dist/services/self-update.service.js +85 -41
- package/dist/services/self-update.service.js.map +1 -1
- package/dist/services/spawn-common.d.ts +40 -16
- package/dist/services/spawn-common.d.ts.map +1 -1
- package/dist/services/spawn-common.js +163 -36
- package/dist/services/spawn-common.js.map +1 -1
- package/dist/{telegram.d.ts → services/telegram.d.ts} +3 -3
- package/dist/services/telegram.d.ts.map +1 -0
- package/dist/{telegram.js → services/telegram.js} +16 -8
- package/dist/services/telegram.js.map +1 -0
- package/dist/services/thread-config.service.d.ts +25 -0
- package/dist/services/thread-config.service.d.ts.map +1 -0
- package/dist/services/thread-config.service.js +73 -0
- package/dist/services/thread-config.service.js.map +1 -0
- package/dist/services/thread-health.service.d.ts.map +1 -1
- package/dist/services/thread-health.service.js +23 -9
- package/dist/services/thread-health.service.js.map +1 -1
- package/dist/services/thread-lifecycle.service.d.ts.map +1 -1
- package/dist/services/thread-lifecycle.service.js +21 -7
- package/dist/services/thread-lifecycle.service.js.map +1 -1
- package/dist/services/topic.service.d.ts.map +1 -1
- package/dist/services/topic.service.js +17 -6
- package/dist/services/topic.service.js.map +1 -1
- package/dist/services/worker-cleanup.service.d.ts +3 -2
- package/dist/services/worker-cleanup.service.d.ts.map +1 -1
- package/dist/services/worker-cleanup.service.js +31 -19
- package/dist/services/worker-cleanup.service.js.map +1 -1
- package/dist/sessions/dashboard-registry.d.ts +38 -0
- package/dist/sessions/dashboard-registry.d.ts.map +1 -0
- package/dist/sessions/dashboard-registry.js +84 -0
- package/dist/sessions/dashboard-registry.js.map +1 -0
- package/dist/{sessions.d.ts → sessions/mcp-registry.d.ts} +3 -60
- package/dist/sessions/mcp-registry.d.ts.map +1 -0
- package/dist/{sessions.js → sessions/mcp-registry.js} +5 -214
- package/dist/sessions/mcp-registry.js.map +1 -0
- package/dist/sessions/session-store.d.ts +17 -0
- package/dist/sessions/session-store.d.ts.map +1 -0
- package/dist/sessions/session-store.js +69 -0
- package/dist/sessions/session-store.js.map +1 -0
- package/dist/sessions/topic-registry.d.ts +14 -0
- package/dist/sessions/topic-registry.d.ts.map +1 -0
- package/dist/sessions/topic-registry.js +67 -0
- package/dist/sessions/topic-registry.js.map +1 -0
- package/dist/tools/definitions.d.ts +1 -9
- package/dist/tools/definitions.d.ts.map +1 -1
- package/dist/tools/definitions.js.map +1 -1
- package/dist/tools/defs/memory-defs.d.ts +1 -1
- package/dist/tools/defs/memory-defs.d.ts.map +1 -1
- package/dist/tools/defs/memory-defs.js +1 -1
- package/dist/tools/defs/memory-defs.js.map +1 -1
- package/dist/tools/defs/session-defs.d.ts +1 -1
- package/dist/tools/defs/session-defs.d.ts.map +1 -1
- package/dist/tools/defs/session-defs.js +3 -14
- package/dist/tools/defs/session-defs.js.map +1 -1
- package/dist/tools/defs/skill-defs.d.ts +1 -1
- package/dist/tools/defs/skill-defs.d.ts.map +1 -1
- package/dist/tools/defs/types.d.ts +11 -0
- package/dist/tools/defs/types.d.ts.map +1 -0
- package/dist/{chat-ui/src → tools/defs}/types.js.map +1 -1
- package/dist/tools/defs/utility-defs.d.ts +1 -1
- package/dist/tools/defs/utility-defs.d.ts.map +1 -1
- package/dist/tools/defs/utility-defs.js.map +1 -1
- package/dist/tools/defs/wait-defs.d.ts +1 -1
- package/dist/tools/defs/wait-defs.d.ts.map +1 -1
- package/dist/tools/delegate-tool.d.ts +2 -2
- package/dist/tools/delegate-tool.d.ts.map +1 -1
- package/dist/tools/delegate-tool.js +57 -37
- package/dist/tools/delegate-tool.js.map +1 -1
- package/dist/tools/memory-tools.d.ts +2 -2
- package/dist/tools/memory-tools.d.ts.map +1 -1
- package/dist/tools/memory-tools.js +108 -37
- package/dist/tools/memory-tools.js.map +1 -1
- package/dist/{response-builders.d.ts → tools/response-builders.d.ts} +2 -2
- package/dist/tools/response-builders.d.ts.map +1 -0
- package/dist/{response-builders.js → tools/response-builders.js} +151 -30
- package/dist/tools/response-builders.js.map +1 -0
- package/dist/tools/session-tools.d.ts +5 -14
- package/dist/tools/session-tools.d.ts.map +1 -1
- package/dist/tools/session-tools.js +17 -12
- package/dist/tools/session-tools.js.map +1 -1
- package/dist/tools/shared-agent-utils.d.ts +1 -1
- package/dist/tools/shared-agent-utils.d.ts.map +1 -1
- package/dist/tools/shared-agent-utils.js +2 -4
- package/dist/tools/shared-agent-utils.js.map +1 -1
- package/dist/tools/skill-tools.d.ts +1 -1
- package/dist/tools/skill-tools.d.ts.map +1 -1
- package/dist/tools/skill-tools.js +12 -7
- package/dist/tools/skill-tools.js.map +1 -1
- package/dist/tools/start-session-tool.d.ts +3 -3
- package/dist/tools/start-session-tool.d.ts.map +1 -1
- package/dist/tools/start-session-tool.js +35 -25
- package/dist/tools/start-session-tool.js.map +1 -1
- package/dist/tools/utility-tools.d.ts +3 -3
- package/dist/tools/utility-tools.d.ts.map +1 -1
- package/dist/tools/utility-tools.js +46 -28
- package/dist/tools/utility-tools.js.map +1 -1
- package/dist/tools/wait/auto-forward.d.ts +1 -1
- package/dist/tools/wait/auto-forward.d.ts.map +1 -1
- package/dist/tools/wait/auto-forward.js +6 -4
- package/dist/tools/wait/auto-forward.js.map +1 -1
- package/dist/tools/wait/context.d.ts +45 -0
- package/dist/tools/wait/context.d.ts.map +1 -0
- package/dist/tools/wait/context.js +5 -0
- package/dist/tools/wait/context.js.map +1 -0
- package/dist/tools/wait/drive-handler.d.ts +2 -2
- package/dist/tools/wait/drive-handler.d.ts.map +1 -1
- package/dist/tools/wait/drive-handler.js +24 -12
- package/dist/tools/wait/drive-handler.js.map +1 -1
- package/dist/tools/wait/index.d.ts +2 -1
- package/dist/tools/wait/index.d.ts.map +1 -1
- package/dist/tools/wait/index.js.map +1 -1
- package/dist/tools/wait/media-processor.d.ts +4 -4
- package/dist/tools/wait/media-processor.d.ts.map +1 -1
- package/dist/tools/wait/media-processor.js +17 -8
- package/dist/tools/wait/media-processor.js.map +1 -1
- package/dist/tools/wait/message-delivery.d.ts +5 -5
- package/dist/tools/wait/message-delivery.d.ts.map +1 -1
- package/dist/tools/wait/message-delivery.js +78 -37
- package/dist/tools/wait/message-delivery.js.map +1 -1
- package/dist/tools/wait/message-processing.d.ts +2 -2
- package/dist/tools/wait/message-processing.d.ts.map +1 -1
- package/dist/tools/wait/message-processing.js +95 -37
- package/dist/tools/wait/message-processing.js.map +1 -1
- package/dist/tools/wait/poll-loop.d.ts +2 -41
- package/dist/tools/wait/poll-loop.d.ts.map +1 -1
- package/dist/tools/wait/poll-loop.js +75 -23
- package/dist/tools/wait/poll-loop.js.map +1 -1
- package/dist/tools/wait/reaction-handler.d.ts +3 -3
- package/dist/tools/wait/reaction-handler.d.ts.map +1 -1
- package/dist/tools/wait/reaction-handler.js +6 -6
- package/dist/tools/wait/reaction-handler.js.map +1 -1
- package/dist/tools/wait/task-handler.d.ts +1 -1
- package/dist/tools/wait/task-handler.d.ts.map +1 -1
- package/dist/tools/wait/task-handler.js +5 -4
- package/dist/tools/wait/task-handler.js.map +1 -1
- package/package.json +11 -2
- package/templates/code-review.default.md +1 -1
- package/templates/fire-and-forget.default.md +1 -1
- package/templates/handoff.default.md +1 -1
- package/templates/sensorium-repair.default.md +1 -1
- package/templates/sleep.default.md +1 -1
- package/dist/chat-ui/src/main.d.ts +0 -2
- package/dist/chat-ui/src/main.d.ts.map +0 -1
- package/dist/chat-ui/src/main.js +0 -4
- package/dist/chat-ui/src/main.js.map +0 -1
- package/dist/chat-ui/src/markdown.d.ts +0 -2
- package/dist/chat-ui/src/markdown.d.ts.map +0 -1
- package/dist/chat-ui/src/markdown.js +0 -39
- package/dist/chat-ui/src/markdown.js.map +0 -1
- package/dist/chat-ui/src/mock-data.d.ts +0 -4
- package/dist/chat-ui/src/mock-data.d.ts.map +0 -1
- package/dist/chat-ui/src/mock-data.js +0 -230
- package/dist/chat-ui/src/mock-data.js.map +0 -1
- package/dist/chat-ui/src/types.d.ts +0 -47
- package/dist/chat-ui/src/types.d.ts.map +0 -1
- package/dist/chat-ui/vite.config.d.ts +0 -3
- package/dist/chat-ui/vite.config.d.ts.map +0 -1
- package/dist/chat-ui/vite.config.js +0 -14
- package/dist/chat-ui/vite.config.js.map +0 -1
- package/dist/config.d.ts +0 -228
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js +0 -841
- package/dist/config.js.map +0 -1
- package/dist/daily-session.d.ts.map +0 -1
- package/dist/daily-session.js.map +0 -1
- package/dist/dashboard.d.ts +0 -10
- package/dist/dashboard.d.ts.map +0 -1
- package/dist/dashboard.js +0 -10
- package/dist/dashboard.js.map +0 -1
- package/dist/data/memory/semantic.d.ts.map +0 -1
- package/dist/data/memory/semantic.js +0 -588
- package/dist/data/memory/semantic.js.map +0 -1
- package/dist/dispatcher.d.ts +0 -9
- package/dist/dispatcher.d.ts.map +0 -1
- package/dist/dispatcher.js +0 -9
- package/dist/dispatcher.js.map +0 -1
- package/dist/drive.d.ts.map +0 -1
- package/dist/drive.js.map +0 -1
- package/dist/http-server.d.ts.map +0 -1
- package/dist/http-server.js.map +0 -1
- package/dist/intent.d.ts.map +0 -1
- package/dist/intent.js.map +0 -1
- package/dist/logger.d.ts.map +0 -1
- package/dist/logger.js.map +0 -1
- package/dist/markdown.d.ts.map +0 -1
- package/dist/markdown.js.map +0 -1
- package/dist/memory.d.ts +0 -9
- package/dist/memory.d.ts.map +0 -1
- package/dist/memory.js +0 -9
- package/dist/memory.js.map +0 -1
- package/dist/openai.d.ts +0 -13
- package/dist/openai.d.ts.map +0 -1
- package/dist/openai.js +0 -17
- package/dist/openai.js.map +0 -1
- package/dist/response-builders.d.ts.map +0 -1
- package/dist/response-builders.js.map +0 -1
- package/dist/scheduler.d.ts.map +0 -1
- package/dist/scheduler.js.map +0 -1
- package/dist/sessions.d.ts.map +0 -1
- package/dist/sessions.js.map +0 -1
- package/dist/stdio-server.d.ts.map +0 -1
- package/dist/stdio-server.js.map +0 -1
- package/dist/telegram.d.ts.map +0 -1
- package/dist/telegram.js.map +0 -1
- package/dist/tool-definitions.d.ts +0 -2
- package/dist/tool-definitions.d.ts.map +0 -1
- package/dist/tool-definitions.js +0 -2
- package/dist/tool-definitions.js.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js.map +0 -1
- package/dist/utils.d.ts.map +0 -1
- package/dist/utils.js.map +0 -1
- /package/dist/{logger.d.ts → lib/logger.d.ts} +0 -0
- /package/dist/{markdown.d.ts → lib/markdown.d.ts} +0 -0
- /package/dist/{types.js → lib/types.js} +0 -0
- /package/dist/{utils.d.ts → lib/utils.d.ts} +0 -0
- /package/dist/{drive.d.ts → services/drive.d.ts} +0 -0
- /package/dist/{intent.d.ts → services/intent.d.ts} +0 -0
- /package/dist/{chat-ui/src → tools/defs}/types.js +0 -0
|
@@ -9,7 +9,7 @@ import BetterSqlite3 from "better-sqlite3";
|
|
|
9
9
|
import { mkdirSync } from "node:fs";
|
|
10
10
|
import { homedir } from "node:os";
|
|
11
11
|
import { join } from "node:path";
|
|
12
|
-
import { log } from "../../logger.js";
|
|
12
|
+
import { log } from "../../lib/logger.js";
|
|
13
13
|
import { SCHEMA_SQL, cleanupOldSentMessages } from "./schema-ddl.js";
|
|
14
14
|
import { runMigrations } from "./migration-runner.js";
|
|
15
15
|
import { ensureSchemaIntegrity } from "./schema-guard.js";
|
|
@@ -19,7 +19,9 @@ function migrateExistingRootThreads(db) {
|
|
|
19
19
|
const count = db.prepare("SELECT COUNT(*) as cnt FROM thread_registry").get().cnt;
|
|
20
20
|
if (count > 0)
|
|
21
21
|
return;
|
|
22
|
-
const rows = db
|
|
22
|
+
const rows = db
|
|
23
|
+
.prepare("SELECT DISTINCT thread_id FROM episodes ORDER BY thread_id")
|
|
24
|
+
.all();
|
|
23
25
|
if (rows.length === 0)
|
|
24
26
|
return;
|
|
25
27
|
const now = nowISO();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/data/memory/schema.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,aAAa,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,GAAG,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/data/memory/schema.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,aAAa,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAIpC,OAAO,EAAE,sBAAsB,EAAE,CAAC;AAElC,SAAS,0BAA0B,CAAC,EAAY;IAC9C,MAAM,KAAK,GACT,EAAE,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC,GAAG,EAC9D,CAAC,GAAa,CAAC;IAChB,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO;IAEtB,MAAM,IAAI,GAAG,EAAE;SACZ,OAAO,CAAC,4DAA4D,CAAC;SACrE,GAAG,EAA+B,CAAC;IACtC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAE9B,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CACrB,sKAAsK,CACvK,CAAC;IACF,MAAM,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;QAC9B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,QAAQ,GAAG,GAAG,CAAC,SAAmB,CAAC;YACzC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,QAAQ,EAAE,EAAE,GAAG,CAAC,CAAC;QAChD,CAAC;IACH,CAAC,CAAC,CAAC;IACH,GAAG,EAAE,CAAC;IACN,GAAG,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,MAAM,4BAA4B,CAAC,CAAC;AAChE,CAAC;AAED,IAAI,YAAY,GAAoB,IAAI,CAAC;AAEzC,MAAM,UAAU,YAAY;IAC1B,IAAI,YAAY;QAAE,OAAO,YAAY,CAAC;IAEtC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,qBAAqB,CAAC,CAAC;IACrD,SAAS,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEtC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IACxC,MAAM,EAAE,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;IAErC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,EAAE,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;IACjC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAC/B,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAEpB,MAAM,YAAY,GAChB,EAAE,CAAC,OAAO,CAAC,4CAA4C,CAAC,CAAC,GAAG,EAC7D,CAAC,GAAG,CAAC;IACN,IAAI,YAAY,KAAK,CAAC,EAAE,CAAC;QACvB,EAAE,CAAC,OAAO,CAAC,gEAAgE,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7F,CAAC;IAED,aAAa,CAAC,EAAE,CAAC,CAAC;IAClB,qBAAqB,CAAC,EAAE,CAAC,CAAC;IAC1B,0BAA0B,CAAC,EAAE,CAAC,CAAC;IAE/B,IAAI,CAAC;QACH,EAAE,CAAC,OAAO,CACR;;;;;;yEAMmE,CACpE,CAAC,GAAG,EAAE,CAAC;IACV,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,KAAK,CAAC,6DAA6D,GAAG,EAAE,CAAC,CAAC;IAChF,CAAC;IAED,YAAY,GAAG,EAAE,CAAC;IAClB,OAAO,EAAE,CAAC;AACZ,CAAC"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Semantic note
|
|
3
|
-
*
|
|
4
|
-
* Extracted from memory.ts — semantic memory layer.
|
|
2
|
+
* Semantic note repository — the SemanticNote type, row mapping, and CRUD
|
|
3
|
+
* (save, read, update, supersede, link migration).
|
|
5
4
|
*/
|
|
6
5
|
import type { Database } from "./schema.js";
|
|
7
6
|
export interface SemanticNote {
|
|
@@ -26,20 +25,9 @@ export interface SemanticNote {
|
|
|
26
25
|
createdAt: string;
|
|
27
26
|
updatedAt: string;
|
|
28
27
|
}
|
|
29
|
-
|
|
30
|
-
export declare function
|
|
31
|
-
|
|
32
|
-
* Recompute meta_topic_index from scratch over the currently-active notes.
|
|
33
|
-
*
|
|
34
|
-
* The incremental upsert/decrement counters drift because note expiry,
|
|
35
|
-
* supersession and merge bypass the decrement path (they UPDATE valid_to
|
|
36
|
-
* directly). Rather than wire decrements into every expiry site, we treat the
|
|
37
|
-
* index as a derived aggregate and rebuild it authoritatively here — called
|
|
38
|
-
* during consolidation. semantic_count reflects live notes; total_accesses is
|
|
39
|
-
* the summed access_count of those notes (a real retrieval signal, which is
|
|
40
|
-
* what bootstrap orders by). Returns the number of topics indexed.
|
|
41
|
-
*/
|
|
42
|
-
export declare function rebuildTopicIndex(db: Database): number;
|
|
28
|
+
/** Increment access_count and update last_accessed for a batch of note IDs. */
|
|
29
|
+
export declare function bumpAccessCounts(db: Database, noteIds: string[]): void;
|
|
30
|
+
export declare function rowToSemanticNote(row: Record<string, unknown>): SemanticNote;
|
|
43
31
|
/** Look up a single semantic note by ID (returns type + keywords only, or undefined). */
|
|
44
32
|
export declare function getSemanticNoteById(db: Database, noteId: string): {
|
|
45
33
|
type: string;
|
|
@@ -60,23 +48,6 @@ export declare function saveSemanticNote(db: Database, note: {
|
|
|
60
48
|
linkedNotes?: string[];
|
|
61
49
|
linkReasons?: Record<string, string>;
|
|
62
50
|
}): string;
|
|
63
|
-
export declare function searchSemanticNotes(db: Database, query: string, options?: {
|
|
64
|
-
types?: string[];
|
|
65
|
-
maxResults?: number;
|
|
66
|
-
skipAccessTracking?: boolean;
|
|
67
|
-
startTime?: string;
|
|
68
|
-
endTime?: string;
|
|
69
|
-
threadId?: number;
|
|
70
|
-
}): SemanticNote[];
|
|
71
|
-
export declare function searchSemanticNotesRanked(db: Database, query: string, options?: {
|
|
72
|
-
types?: string[];
|
|
73
|
-
maxResults?: number;
|
|
74
|
-
skipAccessTracking?: boolean;
|
|
75
|
-
minMatchRatio?: number;
|
|
76
|
-
threadId?: number;
|
|
77
|
-
startTime?: string;
|
|
78
|
-
endTime?: string;
|
|
79
|
-
}): SemanticNote[];
|
|
80
51
|
export declare function getTopSemanticNotes(db: Database, options?: {
|
|
81
52
|
type?: string;
|
|
82
53
|
limit?: number;
|
|
@@ -118,41 +89,4 @@ export declare function supersedeNote(db: Database, oldNoteId: string, newNote:
|
|
|
118
89
|
* is dead-on-arrival, since the consumer filters out expired link targets.
|
|
119
90
|
*/
|
|
120
91
|
export declare function migrateInboundLinks(db: Database, fromNoteId: string, toNoteId: string): void;
|
|
121
|
-
|
|
122
|
-
export declare function saveNoteEmbedding(db: Database, noteId: string, embedding: Float32Array): void;
|
|
123
|
-
/**
|
|
124
|
-
* Search semantic notes using embedding cosine similarity.
|
|
125
|
-
* Returns notes sorted by similarity score, filtered by minimum threshold.
|
|
126
|
-
*/
|
|
127
|
-
export declare function searchByEmbedding(db: Database, queryEmbedding: Float32Array, options?: {
|
|
128
|
-
maxResults?: number;
|
|
129
|
-
minSimilarity?: number;
|
|
130
|
-
skipAccessTracking?: boolean;
|
|
131
|
-
threadId?: number;
|
|
132
|
-
startTime?: string;
|
|
133
|
-
endTime?: string;
|
|
134
|
-
}): (SemanticNote & {
|
|
135
|
-
similarity: number;
|
|
136
|
-
})[];
|
|
137
|
-
/** Get note IDs that don't have embeddings yet (for backfill). */
|
|
138
|
-
export declare function getNotesWithoutEmbeddings(db: Database): {
|
|
139
|
-
noteId: string;
|
|
140
|
-
content: string;
|
|
141
|
-
}[];
|
|
142
|
-
/**
|
|
143
|
-
* Find semantic notes that potentially conflict with a given note
|
|
144
|
-
* by sharing >= 2 keywords of the same type.
|
|
145
|
-
*/
|
|
146
|
-
export declare function findPotentialConflicts(db: Database, noteId: string): SemanticNote[];
|
|
147
|
-
/**
|
|
148
|
-
* Expire all active semantic notes belonging to a given thread.
|
|
149
|
-
* Sets valid_to = NOW() and decrements the topic index for each note's keywords.
|
|
150
|
-
* Returns the count of archived notes.
|
|
151
|
-
*/
|
|
152
|
-
export declare function archiveNotesForThread(db: Database, threadId: number): number;
|
|
153
|
-
/**
|
|
154
|
-
* Find thread IDs that have active (non-expired) semantic notes.
|
|
155
|
-
* Returns distinct thread IDs (excluding null/global notes).
|
|
156
|
-
*/
|
|
157
|
-
export declare function getThreadIdsWithActiveNotes(db: Database): number[];
|
|
158
|
-
//# sourceMappingURL=semantic.d.ts.map
|
|
92
|
+
//# sourceMappingURL=semantic-notes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semantic-notes.d.ts","sourceRoot":"","sources":["../../../src/data/memory/semantic-notes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAO5C,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,GAAG,QAAQ,GAAG,cAAc,CAAC;IACpE,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAYD,+EAA+E;AAC/E,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAStE;AAID,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,YAAY,CAuB5E;AAID,yFAAyF;AACzF,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,QAAQ,EACZ,MAAM,EAAE,MAAM,GACb;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,SAAS,CAMlD;AAED,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,YAAY,EAAE,CASrF;AAED,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,QAAQ,EACZ,IAAI,EAAE;IACJ,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,GAAG,QAAQ,GAAG,cAAc,CAAC;IACpE,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC,GACA,MAAM,CA8CR;AAED,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,QAAQ,EACZ,OAAO,CAAC,EAAE;IACR,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,YAAY,GAAG,cAAc,GAAG,YAAY,CAAC;IACtD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GACA,YAAY,EAAE,CAiChB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,GAAG,YAAY,EAAE,CAW9D;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,YAAY,EAAE,CAW7E;AAED,wBAAgB,kBAAkB,CAChC,EAAE,EAAE,QAAQ,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC,CAAC,GACD,IAAI,CAgCN;AAED,wBAAgB,aAAa,CAC3B,EAAE,EAAE,QAAQ,EACZ,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE;IACP,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B,GACA,MAAM,CAiDR;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CA6B5F"}
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Semantic note repository — the SemanticNote type, row mapping, and CRUD
|
|
3
|
+
* (save, read, update, supersede, link migration).
|
|
4
|
+
*/
|
|
5
|
+
import { generateId, nowISO, jsonOrNull, parseJsonArray, parseJsonObject } from "./utils.js";
|
|
6
|
+
import { updateTopicIndexForKeywords } from "./topic-index.js";
|
|
7
|
+
import { log } from "../../lib/logger.js";
|
|
8
|
+
// ─── Constants ───────────────────────────────────────────────────────────────
|
|
9
|
+
/** Maximum guardrail notes returned by getGuardrailNotes. */
|
|
10
|
+
const GUARDRAIL_LIMIT = 5;
|
|
11
|
+
/** Maximum pinned notes returned by getPinnedNotes. */
|
|
12
|
+
const PINNED_LIMIT = 20;
|
|
13
|
+
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
14
|
+
/** Increment access_count and update last_accessed for a batch of note IDs. */
|
|
15
|
+
export function bumpAccessCounts(db, noteIds) {
|
|
16
|
+
if (noteIds.length === 0)
|
|
17
|
+
return;
|
|
18
|
+
const now = nowISO();
|
|
19
|
+
const stmt = db.prepare(`UPDATE semantic_notes SET access_count = access_count + 1, last_accessed = ? WHERE note_id = ?`);
|
|
20
|
+
db.transaction(() => {
|
|
21
|
+
for (const id of noteIds)
|
|
22
|
+
stmt.run(now, id);
|
|
23
|
+
})();
|
|
24
|
+
}
|
|
25
|
+
// ─── Row → Interface mappers ─────────────────────────────────────────────────
|
|
26
|
+
export function rowToSemanticNote(row) {
|
|
27
|
+
return {
|
|
28
|
+
noteId: row.note_id,
|
|
29
|
+
type: row.type,
|
|
30
|
+
content: row.content,
|
|
31
|
+
keywords: parseJsonArray(row.keywords),
|
|
32
|
+
confidence: row.confidence,
|
|
33
|
+
priority: row.priority ?? 0,
|
|
34
|
+
threadId: row.thread_id ?? null,
|
|
35
|
+
sourceEpisodes: parseJsonArray(row.source_episodes),
|
|
36
|
+
linkedNotes: parseJsonArray(row.linked_notes),
|
|
37
|
+
linkReasons: parseJsonObject(row.link_reasons),
|
|
38
|
+
validFrom: row.valid_from,
|
|
39
|
+
validTo: row.valid_to ?? null,
|
|
40
|
+
supersededBy: row.superseded_by ?? null,
|
|
41
|
+
accessCount: row.access_count,
|
|
42
|
+
lastAccessed: row.last_accessed ?? null,
|
|
43
|
+
isGuardrail: row.is_guardrail === 1,
|
|
44
|
+
pinned: row.pinned === 1,
|
|
45
|
+
qualityScore: row.quality_score ?? null,
|
|
46
|
+
createdAt: row.created_at,
|
|
47
|
+
updatedAt: row.updated_at,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
// ─── Semantic Memory CRUD ────────────────────────────────────────────────────
|
|
51
|
+
/** Look up a single semantic note by ID (returns type + keywords only, or undefined). */
|
|
52
|
+
export function getSemanticNoteById(db, noteId) {
|
|
53
|
+
const row = db
|
|
54
|
+
.prepare("SELECT type, keywords FROM semantic_notes WHERE note_id = ?")
|
|
55
|
+
.get(noteId);
|
|
56
|
+
if (!row)
|
|
57
|
+
return undefined;
|
|
58
|
+
return { type: row.type, keywords: parseJsonArray(row.keywords) };
|
|
59
|
+
}
|
|
60
|
+
export function getSemanticNotesByIds(db, noteIds) {
|
|
61
|
+
if (noteIds.length === 0)
|
|
62
|
+
return [];
|
|
63
|
+
const placeholders = noteIds.map(() => "?").join(",");
|
|
64
|
+
const rows = db
|
|
65
|
+
.prepare(`SELECT * FROM semantic_notes WHERE note_id IN (${placeholders}) AND valid_to IS NULL AND superseded_by IS NULL`)
|
|
66
|
+
.all(...noteIds);
|
|
67
|
+
return rows.map(rowToSemanticNote);
|
|
68
|
+
}
|
|
69
|
+
export function saveSemanticNote(db, note) {
|
|
70
|
+
const validTypes = new Set(["fact", "preference", "pattern", "entity", "relationship"]);
|
|
71
|
+
if (!validTypes.has(note.type)) {
|
|
72
|
+
log.warn(`[semantic] Saving note with non-standard type "${note.type}" — consider using fact/preference/pattern/entity/relationship`);
|
|
73
|
+
}
|
|
74
|
+
const id = generateId("sn");
|
|
75
|
+
const now = nowISO();
|
|
76
|
+
const qualityScore = note.qualityScore != null ? Math.max(1, Math.min(5, Math.round(note.qualityScore))) : null;
|
|
77
|
+
if (qualityScore !== null && qualityScore < 3) {
|
|
78
|
+
log.warn(`[semantic] Low-quality note (score ${qualityScore}/5): ${note.content.slice(0, 120)}`);
|
|
79
|
+
}
|
|
80
|
+
db.prepare(`INSERT INTO semantic_notes
|
|
81
|
+
(note_id, type, content, keywords, confidence, priority, thread_id, is_guardrail, pinned, source_episodes, linked_notes, link_reasons, valid_from, access_count, quality_score, created_at, updated_at)
|
|
82
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0, ?, ?, ?)`).run(id, note.type, note.content, JSON.stringify(note.keywords), Math.max(0, Math.min(1, note.confidence ?? 0.5)), Math.max(0, Math.min(2, note.priority ?? 0)), note.threadId ?? null, note.isGuardrail ? 1 : 0, note.pinned ? 1 : 0, jsonOrNull(note.sourceEpisodes), jsonOrNull(note.linkedNotes), note.linkReasons ? JSON.stringify(note.linkReasons) : null, now, qualityScore, now, now);
|
|
83
|
+
// Update topic index for each keyword
|
|
84
|
+
updateTopicIndexForKeywords(db, note.keywords);
|
|
85
|
+
return id;
|
|
86
|
+
}
|
|
87
|
+
export function getTopSemanticNotes(db, options) {
|
|
88
|
+
const limit = options?.limit ?? 10;
|
|
89
|
+
const sortBy = options?.sortBy ?? "confidence";
|
|
90
|
+
const validSortColumns = {
|
|
91
|
+
confidence: "confidence DESC",
|
|
92
|
+
access_count: "access_count DESC",
|
|
93
|
+
created_at: "created_at DESC",
|
|
94
|
+
};
|
|
95
|
+
const orderClause = validSortColumns[sortBy] ?? "confidence DESC";
|
|
96
|
+
let sql = `SELECT * FROM semantic_notes WHERE valid_to IS NULL AND superseded_by IS NULL`;
|
|
97
|
+
const params = [];
|
|
98
|
+
// Thread filtering: current thread + universal globals (thread_id IS NULL); foreign threads excluded.
|
|
99
|
+
if (options?.threadId !== undefined) {
|
|
100
|
+
sql += ` AND (thread_id = ? OR thread_id IS NULL)`;
|
|
101
|
+
params.push(options.threadId);
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
// Fail-closed: never broaden to the whole cross-thread pool. Only universal notes.
|
|
105
|
+
sql += ` AND (thread_id IS NULL OR is_guardrail = 1 OR pinned = 1)`;
|
|
106
|
+
}
|
|
107
|
+
if (options?.type) {
|
|
108
|
+
sql += ` AND type = ?`;
|
|
109
|
+
params.push(options.type);
|
|
110
|
+
}
|
|
111
|
+
sql += ` ORDER BY ${orderClause} LIMIT ?`;
|
|
112
|
+
params.push(limit);
|
|
113
|
+
const rows = db.prepare(sql).all(...params);
|
|
114
|
+
return rows.map(rowToSemanticNote);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Guardrail notes: explicitly flagged decision constraints the LLM must always
|
|
118
|
+
* follow. Capped at 5, ordered by priority DESC then access_count DESC.
|
|
119
|
+
*/
|
|
120
|
+
export function getGuardrailNotes(db) {
|
|
121
|
+
const rows = db
|
|
122
|
+
.prepare(`SELECT * FROM semantic_notes
|
|
123
|
+
WHERE valid_to IS NULL AND superseded_by IS NULL
|
|
124
|
+
AND is_guardrail = 1
|
|
125
|
+
ORDER BY priority DESC, access_count DESC, confidence DESC
|
|
126
|
+
LIMIT ?`)
|
|
127
|
+
.all(GUARDRAIL_LIMIT);
|
|
128
|
+
return rows.map(rowToSemanticNote);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Pinned notes: always shown in bootstrap briefing regardless of access count.
|
|
132
|
+
* Thread-scoped — only returns notes for the given thread (or global NULL).
|
|
133
|
+
* Ordered by priority DESC, then confidence DESC.
|
|
134
|
+
*/
|
|
135
|
+
export function getPinnedNotes(db, threadId) {
|
|
136
|
+
const rows = db
|
|
137
|
+
.prepare(`SELECT * FROM semantic_notes
|
|
138
|
+
WHERE valid_to IS NULL AND superseded_by IS NULL
|
|
139
|
+
AND pinned = 1 AND thread_id = ?
|
|
140
|
+
ORDER BY priority DESC, confidence DESC, created_at ASC
|
|
141
|
+
LIMIT ?`)
|
|
142
|
+
.all(threadId, PINNED_LIMIT);
|
|
143
|
+
return rows.map(rowToSemanticNote);
|
|
144
|
+
}
|
|
145
|
+
export function updateSemanticNote(db, noteId, updates) {
|
|
146
|
+
const now = nowISO();
|
|
147
|
+
const setClauses = ["updated_at = ?"];
|
|
148
|
+
const params = [now];
|
|
149
|
+
if (updates.content !== undefined) {
|
|
150
|
+
setClauses.push("content = ?");
|
|
151
|
+
params.push(updates.content);
|
|
152
|
+
}
|
|
153
|
+
if (updates.confidence !== undefined) {
|
|
154
|
+
setClauses.push("confidence = ?");
|
|
155
|
+
params.push(updates.confidence);
|
|
156
|
+
}
|
|
157
|
+
if (updates.priority !== undefined) {
|
|
158
|
+
setClauses.push("priority = ?");
|
|
159
|
+
params.push(Math.max(0, Math.min(2, updates.priority)));
|
|
160
|
+
}
|
|
161
|
+
if (updates.keywords !== undefined) {
|
|
162
|
+
setClauses.push("keywords = ?");
|
|
163
|
+
params.push(JSON.stringify(updates.keywords));
|
|
164
|
+
}
|
|
165
|
+
if (updates.linkedNotes !== undefined) {
|
|
166
|
+
setClauses.push("linked_notes = ?");
|
|
167
|
+
params.push(JSON.stringify(updates.linkedNotes));
|
|
168
|
+
}
|
|
169
|
+
if (updates.linkReasons !== undefined) {
|
|
170
|
+
setClauses.push("link_reasons = ?");
|
|
171
|
+
params.push(JSON.stringify(updates.linkReasons));
|
|
172
|
+
}
|
|
173
|
+
params.push(noteId);
|
|
174
|
+
db.prepare(`UPDATE semantic_notes SET ${setClauses.join(", ")} WHERE note_id = ?`).run(...params);
|
|
175
|
+
}
|
|
176
|
+
export function supersedeNote(db, oldNoteId, newNote) {
|
|
177
|
+
// Inherit thread_id and is_guardrail from the old note being superseded
|
|
178
|
+
const oldRow = db
|
|
179
|
+
.prepare(`SELECT thread_id, is_guardrail, pinned FROM semantic_notes WHERE note_id = ?`)
|
|
180
|
+
.get(oldNoteId);
|
|
181
|
+
// Defensive guard: never demote a guardrail or pinned note. Save the new note fresh
|
|
182
|
+
// (without inheriting guardrail/pinned status) and leave the protected target untouched.
|
|
183
|
+
if (oldRow && (oldRow.is_guardrail === 1 || oldRow.pinned === 1)) {
|
|
184
|
+
log.warn(`[semantic] Refusing to supersede guardrail/pinned note ${oldNoteId}; saving new note without expiring target`);
|
|
185
|
+
return saveSemanticNote(db, {
|
|
186
|
+
type: newNote.type,
|
|
187
|
+
content: newNote.content,
|
|
188
|
+
keywords: newNote.keywords,
|
|
189
|
+
confidence: newNote.confidence,
|
|
190
|
+
priority: newNote.priority,
|
|
191
|
+
qualityScore: newNote.qualityScore,
|
|
192
|
+
threadId: oldRow.thread_id ?? null,
|
|
193
|
+
sourceEpisodes: newNote.sourceEpisodes,
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
const newId = saveSemanticNote(db, {
|
|
197
|
+
type: newNote.type,
|
|
198
|
+
content: newNote.content,
|
|
199
|
+
keywords: newNote.keywords,
|
|
200
|
+
confidence: newNote.confidence,
|
|
201
|
+
priority: newNote.priority,
|
|
202
|
+
qualityScore: newNote.qualityScore,
|
|
203
|
+
threadId: oldRow?.thread_id ?? null,
|
|
204
|
+
isGuardrail: (oldRow?.is_guardrail ?? 0) === 1,
|
|
205
|
+
pinned: (oldRow?.pinned ?? 0) === 1,
|
|
206
|
+
sourceEpisodes: newNote.sourceEpisodes,
|
|
207
|
+
});
|
|
208
|
+
const now = nowISO();
|
|
209
|
+
db.prepare(`UPDATE semantic_notes SET superseded_by = ?, valid_to = ?, updated_at = ? WHERE note_id = ?`).run(newId, now, now, oldNoteId);
|
|
210
|
+
// The supersession relationship is already recorded by superseded_by above.
|
|
211
|
+
// Repoint any inbound causal links from the now-expired note to its successor
|
|
212
|
+
// so they stay live for the bootstrap consumer.
|
|
213
|
+
migrateInboundLinks(db, oldNoteId, newId);
|
|
214
|
+
return newId;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Repoint inbound causal links from a now-dead note to its successor.
|
|
218
|
+
* When `fromNoteId` is superseded/merged into `toNoteId`, any active note that
|
|
219
|
+
* linked to `fromNoteId` is repointed at the live successor — otherwise the link
|
|
220
|
+
* is dead-on-arrival, since the consumer filters out expired link targets.
|
|
221
|
+
*/
|
|
222
|
+
export function migrateInboundLinks(db, fromNoteId, toNoteId) {
|
|
223
|
+
if (fromNoteId === toNoteId)
|
|
224
|
+
return;
|
|
225
|
+
// Escape LIKE wildcards — note IDs contain underscores ("sn_<hex>") which
|
|
226
|
+
// would otherwise match any character and produce unnecessary false positives.
|
|
227
|
+
const escapedId = fromNoteId.replace(/%/g, "\\%").replace(/_/g, "\\_");
|
|
228
|
+
const inbound = db
|
|
229
|
+
.prepare(`SELECT note_id, linked_notes, link_reasons FROM semantic_notes
|
|
230
|
+
WHERE valid_to IS NULL AND superseded_by IS NULL AND linked_notes LIKE ? ESCAPE '\\'`)
|
|
231
|
+
.all(`%${escapedId}%`);
|
|
232
|
+
for (const row of inbound) {
|
|
233
|
+
const linked = parseJsonArray(row.linked_notes);
|
|
234
|
+
if (!linked.includes(fromNoteId))
|
|
235
|
+
continue; // LIKE prefilter false positive
|
|
236
|
+
const reasons = parseJsonObject(row.link_reasons);
|
|
237
|
+
const reason = reasons[fromNoteId];
|
|
238
|
+
delete reasons[fromNoteId];
|
|
239
|
+
const next = linked.filter((id) => id !== fromNoteId);
|
|
240
|
+
// Skip if the successor is the note itself — never create a self-link.
|
|
241
|
+
if (toNoteId !== row.note_id && !next.includes(toNoteId)) {
|
|
242
|
+
next.push(toNoteId);
|
|
243
|
+
if (reason && !reasons[toNoteId])
|
|
244
|
+
reasons[toNoteId] = reason;
|
|
245
|
+
}
|
|
246
|
+
updateSemanticNote(db, row.note_id, { linkedNotes: next, linkReasons: reasons });
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
//# sourceMappingURL=semantic-notes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semantic-notes.js","sourceRoot":"","sources":["../../../src/data/memory/semantic-notes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7F,OAAO,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AA2B1C,gFAAgF;AAEhF,6DAA6D;AAC7D,MAAM,eAAe,GAAG,CAAC,CAAC;AAE1B,uDAAuD;AACvD,MAAM,YAAY,GAAG,EAAE,CAAC;AAExB,gFAAgF;AAEhF,+EAA+E;AAC/E,MAAM,UAAU,gBAAgB,CAAC,EAAY,EAAE,OAAiB;IAC9D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IACjC,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CACrB,gGAAgG,CACjG,CAAC;IACF,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;QAClB,KAAK,MAAM,EAAE,IAAI,OAAO;YAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC9C,CAAC,CAAC,EAAE,CAAC;AACP,CAAC;AAED,gFAAgF;AAEhF,MAAM,UAAU,iBAAiB,CAAC,GAA4B;IAC5D,OAAO;QACL,MAAM,EAAE,GAAG,CAAC,OAAiB;QAC7B,IAAI,EAAE,GAAG,CAAC,IAA4B;QACtC,OAAO,EAAE,GAAG,CAAC,OAAiB;QAC9B,QAAQ,EAAE,cAAc,CAAC,GAAG,CAAC,QAAyB,CAAC;QACvD,UAAU,EAAE,GAAG,CAAC,UAAoB;QACpC,QAAQ,EAAG,GAAG,CAAC,QAAmB,IAAI,CAAC;QACvC,QAAQ,EAAG,GAAG,CAAC,SAAoB,IAAI,IAAI;QAC3C,cAAc,EAAE,cAAc,CAAC,GAAG,CAAC,eAAgC,CAAC;QACpE,WAAW,EAAE,cAAc,CAAC,GAAG,CAAC,YAA6B,CAAC;QAC9D,WAAW,EAAE,eAAe,CAAC,GAAG,CAAC,YAA6B,CAA2B;QACzF,SAAS,EAAE,GAAG,CAAC,UAAoB;QACnC,OAAO,EAAG,GAAG,CAAC,QAAmB,IAAI,IAAI;QACzC,YAAY,EAAG,GAAG,CAAC,aAAwB,IAAI,IAAI;QACnD,WAAW,EAAE,GAAG,CAAC,YAAsB;QACvC,YAAY,EAAG,GAAG,CAAC,aAAwB,IAAI,IAAI;QACnD,WAAW,EAAG,GAAG,CAAC,YAAuB,KAAK,CAAC;QAC/C,MAAM,EAAG,GAAG,CAAC,MAAiB,KAAK,CAAC;QACpC,YAAY,EAAG,GAAG,CAAC,aAA+B,IAAI,IAAI;QAC1D,SAAS,EAAE,GAAG,CAAC,UAAoB;QACnC,SAAS,EAAE,GAAG,CAAC,UAAoB;KACpC,CAAC;AACJ,CAAC;AAED,gFAAgF;AAEhF,yFAAyF;AACzF,MAAM,UAAU,mBAAmB,CACjC,EAAY,EACZ,MAAc;IAEd,MAAM,GAAG,GAAG,EAAE;SACX,OAAO,CAAC,6DAA6D,CAAC;SACtE,GAAG,CAAC,MAAM,CAAmD,CAAC;IACjE,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,EAAY,EAAE,OAAiB;IACnE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACpC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtD,MAAM,IAAI,GAAG,EAAE;SACZ,OAAO,CACN,kDAAkD,YAAY,kDAAkD,CACjH;SACA,GAAG,CAAC,GAAG,OAAO,CAA8B,CAAC;IAChD,OAAO,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,EAAY,EACZ,IAaC;IAED,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC;IACxF,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,GAAG,CAAC,IAAI,CACN,kDAAkD,IAAI,CAAC,IAAI,gEAAgE,CAC5H,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC5B,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IAErB,MAAM,YAAY,GAChB,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7F,IAAI,YAAY,KAAK,IAAI,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;QAC9C,GAAG,CAAC,IAAI,CACN,sCAAsC,YAAY,QAAQ,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CACvF,CAAC;IACJ,CAAC;IAED,EAAE,CAAC,OAAO,CACR;;gEAE4D,CAC7D,CAAC,GAAG,CACH,EAAE,EACF,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAC7B,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC,EAChD,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,EAC5C,IAAI,CAAC,QAAQ,IAAI,IAAI,EACrB,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EACxB,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EACnB,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,EAC/B,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,EAC5B,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAC1D,GAAG,EACH,YAAY,EACZ,GAAG,EACH,GAAG,CACJ,CAAC;IAEF,sCAAsC;IACtC,2BAA2B,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAE/C,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,EAAY,EACZ,OAKC;IAED,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC;IACnC,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,YAAY,CAAC;IAE/C,MAAM,gBAAgB,GAA2B;QAC/C,UAAU,EAAE,iBAAiB;QAC7B,YAAY,EAAE,mBAAmB;QACjC,UAAU,EAAE,iBAAiB;KAC9B,CAAC;IACF,MAAM,WAAW,GAAG,gBAAgB,CAAC,MAAM,CAAC,IAAI,iBAAiB,CAAC;IAElE,IAAI,GAAG,GAAG,+EAA+E,CAAC;IAC1F,MAAM,MAAM,GAAc,EAAE,CAAC;IAE7B,sGAAsG;IACtG,IAAI,OAAO,EAAE,QAAQ,KAAK,SAAS,EAAE,CAAC;QACpC,GAAG,IAAI,2CAA2C,CAAC;QACnD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;SAAM,CAAC;QACN,mFAAmF;QACnF,GAAG,IAAI,4DAA4D,CAAC;IACtE,CAAC;IAED,IAAI,OAAO,EAAE,IAAI,EAAE,CAAC;QAClB,GAAG,IAAI,eAAe,CAAC;QACvB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAED,GAAG,IAAI,aAAa,WAAW,UAAU,CAAC;IAC1C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEnB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAA8B,CAAC;IACzE,OAAO,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;AACrC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,EAAY;IAC5C,MAAM,IAAI,GAAG,EAAE;SACZ,OAAO,CACN;;;;eAIS,CACV;SACA,GAAG,CAAC,eAAe,CAA8B,CAAC;IACrD,OAAO,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;AACrC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,EAAY,EAAE,QAAgB;IAC3D,MAAM,IAAI,GAAG,EAAE;SACZ,OAAO,CACN;;;;eAIS,CACV;SACA,GAAG,CAAC,QAAQ,EAAE,YAAY,CAA8B,CAAC;IAC5D,OAAO,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,EAAY,EACZ,MAAc,EACd,OAOE;IAEF,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,UAAU,GAAa,CAAC,gBAAgB,CAAC,CAAC;IAChD,MAAM,MAAM,GAAc,CAAC,GAAG,CAAC,CAAC;IAEhC,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAClC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACrC,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACnC,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACnC,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACtC,UAAU,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;IACnD,CAAC;IACD,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACtC,UAAU,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpB,EAAE,CAAC,OAAO,CAAC,6BAA6B,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;AACpG,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,EAAY,EACZ,SAAiB,EACjB,OAQC;IAED,wEAAwE;IACxE,MAAM,MAAM,GAAG,EAAE;SACd,OAAO,CAAC,8EAA8E,CAAC;SACvF,GAAG,CAAC,SAAS,CACgE,CAAC;IAEjF,oFAAoF;IACpF,yFAAyF;IACzF,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;QACjE,GAAG,CAAC,IAAI,CACN,0DAA0D,SAAS,2CAA2C,CAC/G,CAAC;QACF,OAAO,gBAAgB,CAAC,EAAE,EAAE;YAC1B,IAAI,EAAE,OAAO,CAAC,IAA4B;YAC1C,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,QAAQ,EAAE,MAAM,CAAC,SAAS,IAAI,IAAI;YAClC,cAAc,EAAE,OAAO,CAAC,cAAc;SACvC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,KAAK,GAAG,gBAAgB,CAAC,EAAE,EAAE;QACjC,IAAI,EAAE,OAAO,CAAC,IAA4B;QAC1C,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,QAAQ,EAAE,MAAM,EAAE,SAAS,IAAI,IAAI;QACnC,WAAW,EAAE,CAAC,MAAM,EAAE,YAAY,IAAI,CAAC,CAAC,KAAK,CAAC;QAC9C,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC;QACnC,cAAc,EAAE,OAAO,CAAC,cAAc;KACvC,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,EAAE,CAAC,OAAO,CACR,6FAA6F,CAC9F,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;IAElC,4EAA4E;IAC5E,8EAA8E;IAC9E,gDAAgD;IAChD,mBAAmB,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;IAE1C,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,EAAY,EAAE,UAAkB,EAAE,QAAgB;IACpF,IAAI,UAAU,KAAK,QAAQ;QAAE,OAAO;IACpC,0EAA0E;IAC1E,+EAA+E;IAC/E,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG,EAAE;SACf,OAAO,CACN;0FACoF,CACrF;SACA,GAAG,CAAC,IAAI,SAAS,GAAG,CAIrB,CAAC;IACH,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC;YAAE,SAAS,CAAC,gCAAgC;QAC5E,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,YAA6B,CAA2B,CAAC;QAC7F,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,OAAO,OAAO,CAAC,UAAU,CAAC,CAAC;QAC3B,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,UAAU,CAAC,CAAC;QACtD,uEAAuE;QACvE,IAAI,QAAQ,KAAK,GAAG,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACpB,IAAI,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;gBAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC;QAC/D,CAAC;QACD,kBAAkB,CAAC,EAAE,EAAE,GAAG,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;IACnF,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Keyword-based search over semantic notes: LIKE-term search, ranked
|
|
3
|
+
* multi-term search, and keyword-overlap conflict detection.
|
|
4
|
+
*/
|
|
5
|
+
import type { Database } from "./schema.js";
|
|
6
|
+
import { type SemanticNote } from "./semantic-notes.js";
|
|
7
|
+
export declare function searchSemanticNotes(db: Database, query: string, options?: {
|
|
8
|
+
types?: string[];
|
|
9
|
+
maxResults?: number;
|
|
10
|
+
skipAccessTracking?: boolean;
|
|
11
|
+
startTime?: string;
|
|
12
|
+
endTime?: string;
|
|
13
|
+
threadId?: number;
|
|
14
|
+
}): SemanticNote[];
|
|
15
|
+
export declare function searchSemanticNotesRanked(db: Database, query: string, options?: {
|
|
16
|
+
types?: string[];
|
|
17
|
+
maxResults?: number;
|
|
18
|
+
skipAccessTracking?: boolean;
|
|
19
|
+
minMatchRatio?: number;
|
|
20
|
+
threadId?: number;
|
|
21
|
+
startTime?: string;
|
|
22
|
+
endTime?: string;
|
|
23
|
+
}): SemanticNote[];
|
|
24
|
+
/**
|
|
25
|
+
* Find semantic notes that potentially conflict with a given note
|
|
26
|
+
* by sharing >= 2 keywords of the same type.
|
|
27
|
+
*/
|
|
28
|
+
export declare function findPotentialConflicts(db: Database, noteId: string): SemanticNote[];
|
|
29
|
+
//# sourceMappingURL=semantic-search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semantic-search.d.ts","sourceRoot":"","sources":["../../../src/data/memory/semantic-search.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAuC,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAS7F,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,QAAQ,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;IACR,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GACA,YAAY,EAAE,CA0DhB;AAED,wBAAgB,yBAAyB,CACvC,EAAE,EAAE,QAAQ,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;IACR,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GACA,YAAY,EAAE,CA6EhB;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,EAAE,CA2BnF"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Keyword-based search over semantic notes: LIKE-term search, ranked
|
|
3
|
+
* multi-term search, and keyword-overlap conflict detection.
|
|
4
|
+
*/
|
|
5
|
+
import { bumpAccessCounts, rowToSemanticNote } from "./semantic-notes.js";
|
|
6
|
+
// ─── Constants ───────────────────────────────────────────────────────────────
|
|
7
|
+
/** Minimum shared keywords required to flag a note as a potential conflict. */
|
|
8
|
+
const MIN_KEYWORD_OVERLAP = 2;
|
|
9
|
+
// ─── Keyword Search ──────────────────────────────────────────────────────────
|
|
10
|
+
export function searchSemanticNotes(db, query, options) {
|
|
11
|
+
const maxResults = options?.maxResults ?? 10;
|
|
12
|
+
const terms = query
|
|
13
|
+
.toLowerCase()
|
|
14
|
+
.split(/\s+/)
|
|
15
|
+
.filter((t) => t.length > 1);
|
|
16
|
+
if (terms.length === 0)
|
|
17
|
+
return [];
|
|
18
|
+
// Build LIKE conditions: each term must match content OR keywords
|
|
19
|
+
// Escape SQL LIKE wildcards in search terms
|
|
20
|
+
const conditions = [];
|
|
21
|
+
const params = [];
|
|
22
|
+
for (const term of terms) {
|
|
23
|
+
const escaped = term.replace(/%/g, "\\%").replace(/_/g, "\\_");
|
|
24
|
+
conditions.push(`(LOWER(content) LIKE ? ESCAPE '\\' OR LOWER(keywords) LIKE ? ESCAPE '\\')`);
|
|
25
|
+
params.push(`%${escaped}%`, `%${escaped}%`);
|
|
26
|
+
}
|
|
27
|
+
let sql = `SELECT * FROM semantic_notes WHERE valid_to IS NULL AND superseded_by IS NULL AND (${conditions.join(" AND ")})`;
|
|
28
|
+
if (options?.startTime) {
|
|
29
|
+
sql += ` AND created_at >= ?`;
|
|
30
|
+
params.push(options.startTime);
|
|
31
|
+
}
|
|
32
|
+
if (options?.endTime) {
|
|
33
|
+
sql += ` AND created_at <= ?`;
|
|
34
|
+
params.push(options.endTime);
|
|
35
|
+
}
|
|
36
|
+
// Thread filtering: current thread + universal globals (thread_id IS NULL); foreign threads excluded.
|
|
37
|
+
if (options?.threadId !== undefined) {
|
|
38
|
+
sql += ` AND (thread_id = ? OR thread_id IS NULL)`;
|
|
39
|
+
params.push(options.threadId);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
// Fail-closed: never broaden to the whole cross-thread pool. Only universal notes.
|
|
43
|
+
sql += ` AND (thread_id IS NULL OR is_guardrail = 1 OR pinned = 1)`;
|
|
44
|
+
}
|
|
45
|
+
if (options?.types && options.types.length > 0) {
|
|
46
|
+
const placeholders = options.types.map(() => "?").join(",");
|
|
47
|
+
sql += ` AND type IN (${placeholders})`;
|
|
48
|
+
params.push(...options.types);
|
|
49
|
+
}
|
|
50
|
+
sql += ` ORDER BY confidence DESC, access_count DESC LIMIT ?`;
|
|
51
|
+
params.push(maxResults);
|
|
52
|
+
const rows = db.prepare(sql).all(...params);
|
|
53
|
+
// Update access counts
|
|
54
|
+
if (!options?.skipAccessTracking) {
|
|
55
|
+
bumpAccessCounts(db, rows.map((r) => r.note_id));
|
|
56
|
+
}
|
|
57
|
+
return rows.map(rowToSemanticNote);
|
|
58
|
+
}
|
|
59
|
+
export function searchSemanticNotesRanked(db, query, options) {
|
|
60
|
+
const maxResults = options?.maxResults ?? 10;
|
|
61
|
+
const minMatchRatio = options?.minMatchRatio ?? 0.4; // require at least 40% of terms to match
|
|
62
|
+
const terms = query
|
|
63
|
+
.toLowerCase()
|
|
64
|
+
.split(/\s+/)
|
|
65
|
+
.filter((t) => t.length > 1);
|
|
66
|
+
if (terms.length === 0)
|
|
67
|
+
return [];
|
|
68
|
+
// Use OR to get broad recall
|
|
69
|
+
const conditions = [];
|
|
70
|
+
const params = [];
|
|
71
|
+
for (const term of terms) {
|
|
72
|
+
const escaped = term.replace(/%/g, "\\%").replace(/_/g, "\\_");
|
|
73
|
+
conditions.push(`(LOWER(content) LIKE ? ESCAPE '\\' OR LOWER(keywords) LIKE ? ESCAPE '\\')`);
|
|
74
|
+
params.push(`%${escaped}%`, `%${escaped}%`);
|
|
75
|
+
}
|
|
76
|
+
let sql = `SELECT * FROM semantic_notes WHERE valid_to IS NULL AND superseded_by IS NULL AND (${conditions.join(" OR ")})`;
|
|
77
|
+
if (options?.startTime) {
|
|
78
|
+
sql += ` AND created_at >= ?`;
|
|
79
|
+
params.push(options.startTime);
|
|
80
|
+
}
|
|
81
|
+
if (options?.endTime) {
|
|
82
|
+
sql += ` AND created_at <= ?`;
|
|
83
|
+
params.push(options.endTime);
|
|
84
|
+
}
|
|
85
|
+
// Thread filtering: current thread + universal globals (thread_id IS NULL); foreign threads excluded.
|
|
86
|
+
if (options?.threadId !== undefined) {
|
|
87
|
+
sql += ` AND (thread_id = ? OR thread_id IS NULL)`;
|
|
88
|
+
params.push(options.threadId);
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
// Fail-closed: never broaden to the whole cross-thread pool. Only universal notes.
|
|
92
|
+
sql += ` AND (thread_id IS NULL OR is_guardrail = 1 OR pinned = 1)`;
|
|
93
|
+
}
|
|
94
|
+
if (options?.types && options.types.length > 0) {
|
|
95
|
+
const placeholders = options.types.map(() => "?").join(",");
|
|
96
|
+
sql += ` AND type IN (${placeholders})`;
|
|
97
|
+
params.push(...options.types);
|
|
98
|
+
}
|
|
99
|
+
sql += ` ORDER BY confidence DESC, access_count DESC LIMIT ?`;
|
|
100
|
+
params.push(maxResults * 3); // fetch more to allow scoring/filtering
|
|
101
|
+
const rows = db.prepare(sql).all(...params);
|
|
102
|
+
const allNotes = rows.map(rowToSemanticNote);
|
|
103
|
+
// Score by how many terms match
|
|
104
|
+
const minMatches = Math.max(2, Math.ceil(terms.length * minMatchRatio));
|
|
105
|
+
const scored = allNotes
|
|
106
|
+
.map((n) => {
|
|
107
|
+
const text = (n.content + " " + n.keywords.join(" ")).toLowerCase();
|
|
108
|
+
let matchCount = 0;
|
|
109
|
+
for (const term of terms) {
|
|
110
|
+
if (text.includes(term))
|
|
111
|
+
matchCount++;
|
|
112
|
+
}
|
|
113
|
+
return { ...n, _matchCount: matchCount };
|
|
114
|
+
})
|
|
115
|
+
.filter((n) => n._matchCount >= minMatches)
|
|
116
|
+
.sort((a, b) => {
|
|
117
|
+
if (b._matchCount !== a._matchCount)
|
|
118
|
+
return b._matchCount - a._matchCount;
|
|
119
|
+
return b.confidence - a.confidence;
|
|
120
|
+
})
|
|
121
|
+
.slice(0, maxResults);
|
|
122
|
+
const notes = scored;
|
|
123
|
+
// Update access counts
|
|
124
|
+
if (!options?.skipAccessTracking) {
|
|
125
|
+
bumpAccessCounts(db, notes.map((n) => n.noteId));
|
|
126
|
+
}
|
|
127
|
+
return notes;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Find semantic notes that potentially conflict with a given note
|
|
131
|
+
* by sharing >= 2 keywords of the same type.
|
|
132
|
+
*/
|
|
133
|
+
export function findPotentialConflicts(db, noteId) {
|
|
134
|
+
const row = db
|
|
135
|
+
.prepare(`SELECT note_id, type, keywords FROM semantic_notes WHERE note_id = ?`)
|
|
136
|
+
.get(noteId);
|
|
137
|
+
if (!row)
|
|
138
|
+
return [];
|
|
139
|
+
const noteKeywords = row.keywords ? JSON.parse(row.keywords) : [];
|
|
140
|
+
if (noteKeywords.length < MIN_KEYWORD_OVERLAP)
|
|
141
|
+
return [];
|
|
142
|
+
// Fetch all active notes of the same type (excluding this note and superseded ones)
|
|
143
|
+
const candidates = db
|
|
144
|
+
.prepare(`SELECT * FROM semantic_notes
|
|
145
|
+
WHERE type = ? AND note_id != ? AND valid_to IS NULL AND superseded_by IS NULL`)
|
|
146
|
+
.all(row.type, noteId);
|
|
147
|
+
const lowerKeywords = new Set(noteKeywords.map((k) => k.toLowerCase()));
|
|
148
|
+
return candidates
|
|
149
|
+
.filter((c) => {
|
|
150
|
+
const cKeywords = c.keywords ? JSON.parse(c.keywords) : [];
|
|
151
|
+
const overlap = cKeywords.filter((k) => lowerKeywords.has(k.toLowerCase())).length;
|
|
152
|
+
return overlap >= MIN_KEYWORD_OVERLAP;
|
|
153
|
+
})
|
|
154
|
+
.map(rowToSemanticNote);
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=semantic-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semantic-search.js","sourceRoot":"","sources":["../../../src/data/memory/semantic-search.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"synthesis.d.ts","sourceRoot":"","sources":["../../../src/data/memory/synthesis.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG5C;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CACxB,EAAE,EAAE,QAAQ,EACZ,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,MAAM,GACrB;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"synthesis.d.ts","sourceRoot":"","sources":["../../../src/data/memory/synthesis.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG5C;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CACxB,EAAE,EAAE,QAAQ,EACZ,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,MAAM,GACrB;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CA4K3E"}
|