@stackmemoryai/stackmemory 0.5.59 → 0.5.62
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 +105 -1
- package/dist/scripts/initialize.js +68 -1
- package/dist/scripts/initialize.js.map +2 -2
- package/dist/src/cli/claude-sm.js +130 -50
- package/dist/src/cli/claude-sm.js.map +2 -2
- package/dist/src/cli/index.js +18 -3
- package/dist/src/cli/index.js.map +3 -3
- package/dist/src/core/extensions/custom-tools.js +567 -0
- package/dist/src/core/extensions/custom-tools.js.map +7 -0
- package/dist/src/core/extensions/index.js +55 -0
- package/dist/src/core/extensions/index.js.map +7 -0
- package/dist/src/core/extensions/loader.js +709 -0
- package/dist/src/core/extensions/loader.js.map +7 -0
- package/dist/src/core/extensions/plugin-system.js +506 -0
- package/dist/src/core/extensions/plugin-system.js.map +7 -0
- package/dist/src/core/extensions/provider-adapter.js +617 -0
- package/dist/src/core/extensions/provider-adapter.js.map +7 -0
- package/dist/src/core/extensions/sandbox-runtime.js +664 -0
- package/dist/src/core/extensions/sandbox-runtime.js.map +7 -0
- package/dist/src/core/retrieval/index.js +2 -0
- package/dist/src/core/retrieval/index.js.map +2 -2
- package/dist/src/core/retrieval/privacy-filter.js +129 -0
- package/dist/src/core/retrieval/privacy-filter.js.map +7 -0
- package/dist/src/core/retrieval/unified-context-assembler.js +273 -0
- package/dist/src/core/retrieval/unified-context-assembler.js.map +7 -0
- package/dist/src/core/storage/chromadb-adapter.js +32 -6
- package/dist/src/core/storage/chromadb-adapter.js.map +2 -2
- package/dist/src/hooks/diffmem-hooks.js +377 -0
- package/dist/src/hooks/diffmem-hooks.js.map +7 -0
- package/dist/src/integrations/diffmem/client.js +209 -0
- package/dist/src/integrations/diffmem/client.js.map +7 -0
- package/dist/src/integrations/diffmem/config.js +15 -0
- package/dist/src/integrations/diffmem/config.js.map +7 -0
- package/dist/{core/session → src/integrations/diffmem}/index.js +5 -8
- package/dist/src/integrations/diffmem/index.js.map +7 -0
- package/dist/src/integrations/mcp/handlers/diffmem-handlers.js +456 -0
- package/dist/src/integrations/mcp/handlers/diffmem-handlers.js.map +7 -0
- package/dist/src/integrations/mcp/server.js +121 -0
- package/dist/src/integrations/mcp/server.js.map +2 -2
- package/dist/src/skills/repo-ingestion-skill.js +35 -12
- package/dist/src/skills/repo-ingestion-skill.js.map +2 -2
- package/package.json +13 -7
- package/scripts/background-sync-manager.js +145 -83
- package/scripts/claude-sm-autostart.js +17 -12
- package/scripts/gepa/README.md +275 -0
- package/scripts/gepa/config.json +53 -0
- package/scripts/gepa/evals/coding-tasks.jsonl +5 -0
- package/scripts/gepa/evals/fixtures/buggy-loop.js +18 -0
- package/scripts/gepa/evals/fixtures/callback-hell.js +53 -0
- package/scripts/gepa/generations/gen-000/baseline.md +124 -0
- package/scripts/gepa/hooks/auto-optimize.js +494 -0
- package/scripts/gepa/hooks/eval-tracker.js +203 -0
- package/scripts/gepa/hooks/reflect.js +311 -0
- package/scripts/gepa/optimize.js +611 -0
- package/scripts/gepa/state.json +14 -0
- package/scripts/initialize.ts +83 -1
- package/scripts/test-pre-publish-quick.sh +1 -1
- package/dist/agents/core/agent-task-manager.js +0 -527
- package/dist/agents/core/agent-task-manager.js.map +0 -7
- package/dist/agents/testing-agent.js +0 -614
- package/dist/agents/testing-agent.js.map +0 -7
- package/dist/agents/verifiers/base-verifier.js +0 -133
- package/dist/agents/verifiers/base-verifier.js.map +0 -7
- package/dist/agents/verifiers/formatter-verifier.js +0 -130
- package/dist/agents/verifiers/formatter-verifier.js.map +0 -7
- package/dist/agents/verifiers/llm-judge.js +0 -252
- package/dist/agents/verifiers/llm-judge.js.map +0 -7
- package/dist/cli/auto-detect.js +0 -321
- package/dist/cli/auto-detect.js.map +0 -7
- package/dist/cli/browser-test.js +0 -33
- package/dist/cli/browser-test.js.map +0 -7
- package/dist/cli/claude-sm-danger.js +0 -21
- package/dist/cli/claude-sm-danger.js.map +0 -7
- package/dist/cli/claude-sm.js +0 -1156
- package/dist/cli/claude-sm.js.map +0 -7
- package/dist/cli/codex-sm-danger.js +0 -21
- package/dist/cli/codex-sm-danger.js.map +0 -7
- package/dist/cli/codex-sm.js +0 -349
- package/dist/cli/codex-sm.js.map +0 -7
- package/dist/cli/commands/api.js +0 -232
- package/dist/cli/commands/api.js.map +0 -7
- package/dist/cli/commands/auto-background.js +0 -180
- package/dist/cli/commands/auto-background.js.map +0 -7
- package/dist/cli/commands/cleanup-processes.js +0 -68
- package/dist/cli/commands/cleanup-processes.js.map +0 -7
- package/dist/cli/commands/clear.js +0 -202
- package/dist/cli/commands/clear.js.map +0 -7
- package/dist/cli/commands/config.js +0 -445
- package/dist/cli/commands/config.js.map +0 -7
- package/dist/cli/commands/context-rehydrate.js +0 -751
- package/dist/cli/commands/context-rehydrate.js.map +0 -7
- package/dist/cli/commands/context.js +0 -343
- package/dist/cli/commands/context.js.map +0 -7
- package/dist/cli/commands/daemon.js +0 -392
- package/dist/cli/commands/daemon.js.map +0 -7
- package/dist/cli/commands/dashboard.js +0 -210
- package/dist/cli/commands/dashboard.js.map +0 -7
- package/dist/cli/commands/db.js +0 -147
- package/dist/cli/commands/db.js.map +0 -7
- package/dist/cli/commands/decision.js +0 -266
- package/dist/cli/commands/decision.js.map +0 -7
- package/dist/cli/commands/discovery.js +0 -279
- package/dist/cli/commands/discovery.js.map +0 -7
- package/dist/cli/commands/handoff.js +0 -624
- package/dist/cli/commands/handoff.js.map +0 -7
- package/dist/cli/commands/hooks.js +0 -298
- package/dist/cli/commands/hooks.js.map +0 -7
- package/dist/cli/commands/linear-unified.js +0 -353
- package/dist/cli/commands/linear-unified.js.map +0 -7
- package/dist/cli/commands/linear.js +0 -529
- package/dist/cli/commands/linear.js.map +0 -7
- package/dist/cli/commands/log.js +0 -169
- package/dist/cli/commands/log.js.map +0 -7
- package/dist/cli/commands/login.js +0 -172
- package/dist/cli/commands/login.js.map +0 -7
- package/dist/cli/commands/migrate.js +0 -240
- package/dist/cli/commands/migrate.js.map +0 -7
- package/dist/cli/commands/model.js +0 -533
- package/dist/cli/commands/model.js.map +0 -7
- package/dist/cli/commands/monitor.js +0 -313
- package/dist/cli/commands/monitor.js.map +0 -7
- package/dist/cli/commands/onboard.js +0 -536
- package/dist/cli/commands/onboard.js.map +0 -7
- package/dist/cli/commands/projects.js +0 -199
- package/dist/cli/commands/projects.js.map +0 -7
- package/dist/cli/commands/quality.js +0 -413
- package/dist/cli/commands/quality.js.map +0 -7
- package/dist/cli/commands/ralph.js +0 -909
- package/dist/cli/commands/ralph.js.map +0 -7
- package/dist/cli/commands/retrieval.js +0 -248
- package/dist/cli/commands/retrieval.js.map +0 -7
- package/dist/cli/commands/search.js +0 -173
- package/dist/cli/commands/search.js.map +0 -7
- package/dist/cli/commands/service.js +0 -749
- package/dist/cli/commands/service.js.map +0 -7
- package/dist/cli/commands/session.js +0 -200
- package/dist/cli/commands/session.js.map +0 -7
- package/dist/cli/commands/settings.js +0 -306
- package/dist/cli/commands/settings.js.map +0 -7
- package/dist/cli/commands/setup.js +0 -701
- package/dist/cli/commands/setup.js.map +0 -7
- package/dist/cli/commands/shell.js +0 -249
- package/dist/cli/commands/shell.js.map +0 -7
- package/dist/cli/commands/signup.js +0 -50
- package/dist/cli/commands/signup.js.map +0 -7
- package/dist/cli/commands/skills.js +0 -470
- package/dist/cli/commands/skills.js.map +0 -7
- package/dist/cli/commands/sms-notify.js +0 -795
- package/dist/cli/commands/sms-notify.js.map +0 -7
- package/dist/cli/commands/storage-tier.js +0 -183
- package/dist/cli/commands/storage-tier.js.map +0 -7
- package/dist/cli/commands/storage.js +0 -360
- package/dist/cli/commands/storage.js.map +0 -7
- package/dist/cli/commands/sweep.js +0 -249
- package/dist/cli/commands/sweep.js.map +0 -7
- package/dist/cli/commands/tasks.js +0 -213
- package/dist/cli/commands/tasks.js.map +0 -7
- package/dist/cli/commands/test.js +0 -286
- package/dist/cli/commands/test.js.map +0 -7
- package/dist/cli/commands/workflow.js +0 -142
- package/dist/cli/commands/workflow.js.map +0 -7
- package/dist/cli/commands/worktree.js +0 -319
- package/dist/cli/commands/worktree.js.map +0 -7
- package/dist/cli/index.js +0 -594
- package/dist/cli/index.js.map +0 -7
- package/dist/cli/opencode-sm.js +0 -448
- package/dist/cli/opencode-sm.js.map +0 -7
- package/dist/cli/utils/viewer.js +0 -96
- package/dist/cli/utils/viewer.js.map +0 -7
- package/dist/core/analytics/team-analytics.js +0 -378
- package/dist/core/analytics/team-analytics.js.map +0 -7
- package/dist/core/config/config-manager.js +0 -398
- package/dist/core/config/config-manager.js.map +0 -7
- package/dist/core/config/feature-flags.js +0 -76
- package/dist/core/config/feature-flags.js.map +0 -7
- package/dist/core/config/storage-config.js +0 -115
- package/dist/core/config/storage-config.js.map +0 -7
- package/dist/core/config/types.js +0 -144
- package/dist/core/config/types.js.map +0 -7
- package/dist/core/context/auto-context.js +0 -80
- package/dist/core/context/auto-context.js.map +0 -7
- package/dist/core/context/dual-stack-manager.js +0 -870
- package/dist/core/context/dual-stack-manager.js.map +0 -7
- package/dist/core/context/enhanced-rehydration.js +0 -994
- package/dist/core/context/enhanced-rehydration.js.map +0 -7
- package/dist/core/context/frame-database.js +0 -479
- package/dist/core/context/frame-database.js.map +0 -7
- package/dist/core/context/frame-digest.js +0 -250
- package/dist/core/context/frame-digest.js.map +0 -7
- package/dist/core/context/frame-handoff-manager.js +0 -778
- package/dist/core/context/frame-handoff-manager.js.map +0 -7
- package/dist/core/context/frame-lifecycle-hooks.js +0 -119
- package/dist/core/context/frame-lifecycle-hooks.js.map +0 -7
- package/dist/core/context/frame-manager.js +0 -1069
- package/dist/core/context/frame-manager.js.map +0 -7
- package/dist/core/context/frame-recovery.js +0 -302
- package/dist/core/context/frame-recovery.js.map +0 -7
- package/dist/core/context/frame-stack.js +0 -314
- package/dist/core/context/frame-stack.js.map +0 -7
- package/dist/core/context/frame-types.js +0 -5
- package/dist/core/context/frame-types.js.map +0 -7
- package/dist/core/context/incremental-gc.js +0 -290
- package/dist/core/context/incremental-gc.js.map +0 -7
- package/dist/core/context/index.js +0 -25
- package/dist/core/context/index.js.map +0 -7
- package/dist/core/context/model-aware-compaction.js +0 -623
- package/dist/core/context/model-aware-compaction.js.map +0 -7
- package/dist/core/context/permission-manager.js +0 -185
- package/dist/core/context/permission-manager.js.map +0 -7
- package/dist/core/context/recursive-context-manager.js +0 -592
- package/dist/core/context/recursive-context-manager.js.map +0 -7
- package/dist/core/context/refactored-frame-manager.js +0 -754
- package/dist/core/context/refactored-frame-manager.js.map +0 -7
- package/dist/core/context/shared-context-layer.js +0 -621
- package/dist/core/context/shared-context-layer.js.map +0 -7
- package/dist/core/context/stack-merge-resolver.js +0 -749
- package/dist/core/context/stack-merge-resolver.js.map +0 -7
- package/dist/core/context/validation.js +0 -130
- package/dist/core/context/validation.js.map +0 -7
- package/dist/core/database/batch-operations.js +0 -384
- package/dist/core/database/batch-operations.js.map +0 -7
- package/dist/core/database/connection-pool.js +0 -330
- package/dist/core/database/connection-pool.js.map +0 -7
- package/dist/core/database/database-adapter.js +0 -60
- package/dist/core/database/database-adapter.js.map +0 -7
- package/dist/core/database/migration-manager.js +0 -614
- package/dist/core/database/migration-manager.js.map +0 -7
- package/dist/core/database/paradedb-adapter.js +0 -990
- package/dist/core/database/paradedb-adapter.js.map +0 -7
- package/dist/core/database/query-cache.js +0 -298
- package/dist/core/database/query-cache.js.map +0 -7
- package/dist/core/database/query-router.js +0 -430
- package/dist/core/database/query-router.js.map +0 -7
- package/dist/core/database/sqlite-adapter.js +0 -738
- package/dist/core/database/sqlite-adapter.js.map +0 -7
- package/dist/core/digest/enhanced-hybrid-digest.js +0 -277
- package/dist/core/digest/enhanced-hybrid-digest.js.map +0 -7
- package/dist/core/digest/frame-digest-integration.js +0 -176
- package/dist/core/digest/frame-digest-integration.js.map +0 -7
- package/dist/core/digest/hybrid-digest-generator.js +0 -553
- package/dist/core/digest/hybrid-digest-generator.js.map +0 -7
- package/dist/core/digest/index.js +0 -9
- package/dist/core/digest/index.js.map +0 -7
- package/dist/core/digest/types.js +0 -25
- package/dist/core/digest/types.js.map +0 -7
- package/dist/core/errors/error-utils.js +0 -208
- package/dist/core/errors/error-utils.js.map +0 -7
- package/dist/core/errors/index.js +0 -521
- package/dist/core/errors/index.js.map +0 -7
- package/dist/core/errors/recovery.js +0 -269
- package/dist/core/errors/recovery.js.map +0 -7
- package/dist/core/execution/parallel-executor.js +0 -258
- package/dist/core/execution/parallel-executor.js.map +0 -7
- package/dist/core/frame/workflow-templates.js +0 -319
- package/dist/core/frame/workflow-templates.js.map +0 -7
- package/dist/core/merge/conflict-detector.js +0 -431
- package/dist/core/merge/conflict-detector.js.map +0 -7
- package/dist/core/merge/index.js +0 -9
- package/dist/core/merge/index.js.map +0 -7
- package/dist/core/merge/resolution-engine.js +0 -558
- package/dist/core/merge/resolution-engine.js.map +0 -7
- package/dist/core/merge/stack-diff.js +0 -532
- package/dist/core/merge/stack-diff.js.map +0 -7
- package/dist/core/merge/unified-merge-resolver.js +0 -303
- package/dist/core/merge/unified-merge-resolver.js.map +0 -7
- package/dist/core/models/fallback-monitor.js +0 -232
- package/dist/core/models/fallback-monitor.js.map +0 -7
- package/dist/core/models/model-router.js +0 -340
- package/dist/core/models/model-router.js.map +0 -7
- package/dist/core/monitoring/error-handler.js +0 -49
- package/dist/core/monitoring/error-handler.js.map +0 -7
- package/dist/core/monitoring/logger.js +0 -202
- package/dist/core/monitoring/logger.js.map +0 -7
- package/dist/core/monitoring/metrics.js +0 -172
- package/dist/core/monitoring/metrics.js.map +0 -7
- package/dist/core/monitoring/progress-tracker.js +0 -189
- package/dist/core/monitoring/progress-tracker.js.map +0 -7
- package/dist/core/monitoring/session-monitor.js +0 -300
- package/dist/core/monitoring/session-monitor.js.map +0 -7
- package/dist/core/performance/context-cache.js +0 -273
- package/dist/core/performance/context-cache.js.map +0 -7
- package/dist/core/performance/index.js +0 -11
- package/dist/core/performance/index.js.map +0 -7
- package/dist/core/performance/lazy-context-loader.js +0 -327
- package/dist/core/performance/lazy-context-loader.js.map +0 -7
- package/dist/core/performance/monitor.js +0 -221
- package/dist/core/performance/monitor.js.map +0 -7
- package/dist/core/performance/optimized-frame-context.js +0 -345
- package/dist/core/performance/optimized-frame-context.js.map +0 -7
- package/dist/core/performance/performance-benchmark.js +0 -277
- package/dist/core/performance/performance-benchmark.js.map +0 -7
- package/dist/core/performance/performance-profiler.js +0 -370
- package/dist/core/performance/performance-profiler.js.map +0 -7
- package/dist/core/performance/streaming-jsonl-parser.js +0 -195
- package/dist/core/performance/streaming-jsonl-parser.js.map +0 -7
- package/dist/core/persistence/postgres-adapter.js +0 -349
- package/dist/core/persistence/postgres-adapter.js.map +0 -7
- package/dist/core/projects/project-isolation.js +0 -201
- package/dist/core/projects/project-isolation.js.map +0 -7
- package/dist/core/projects/project-manager.js +0 -697
- package/dist/core/projects/project-manager.js.map +0 -7
- package/dist/core/query/query-parser.js +0 -370
- package/dist/core/query/query-parser.js.map +0 -7
- package/dist/core/query/query-templates.js +0 -321
- package/dist/core/query/query-templates.js.map +0 -7
- package/dist/core/retrieval/context-retriever.js +0 -479
- package/dist/core/retrieval/context-retriever.js.map +0 -7
- package/dist/core/retrieval/graph-retrieval.js +0 -662
- package/dist/core/retrieval/graph-retrieval.js.map +0 -7
- package/dist/core/retrieval/hierarchical-retrieval.js +0 -656
- package/dist/core/retrieval/hierarchical-retrieval.js.map +0 -7
- package/dist/core/retrieval/index.js +0 -8
- package/dist/core/retrieval/index.js.map +0 -7
- package/dist/core/retrieval/llm-context-retrieval.js +0 -613
- package/dist/core/retrieval/llm-context-retrieval.js.map +0 -7
- package/dist/core/retrieval/llm-provider.js +0 -151
- package/dist/core/retrieval/llm-provider.js.map +0 -7
- package/dist/core/retrieval/retrieval-audit.js +0 -236
- package/dist/core/retrieval/retrieval-audit.js.map +0 -7
- package/dist/core/retrieval/retrieval-benchmarks.js +0 -521
- package/dist/core/retrieval/retrieval-benchmarks.js.map +0 -7
- package/dist/core/retrieval/summary-generator.js +0 -589
- package/dist/core/retrieval/summary-generator.js.map +0 -7
- package/dist/core/retrieval/types.js +0 -21
- package/dist/core/retrieval/types.js.map +0 -7
- package/dist/core/security/index.js +0 -35
- package/dist/core/security/index.js.map +0 -7
- package/dist/core/security/input-sanitizer.js +0 -321
- package/dist/core/security/input-sanitizer.js.map +0 -7
- package/dist/core/session/clear-survival.js +0 -465
- package/dist/core/session/clear-survival.js.map +0 -7
- package/dist/core/session/enhanced-handoff.js +0 -792
- package/dist/core/session/enhanced-handoff.js.map +0 -7
- package/dist/core/session/handoff-generator.js +0 -343
- package/dist/core/session/handoff-generator.js.map +0 -7
- package/dist/core/session/index.js.map +0 -7
- package/dist/core/session/session-manager.js +0 -347
- package/dist/core/session/session-manager.js.map +0 -7
- package/dist/core/skills/index.js +0 -7
- package/dist/core/skills/index.js.map +0 -7
- package/dist/core/skills/skill-storage.js +0 -764
- package/dist/core/skills/skill-storage.js.map +0 -7
- package/dist/core/skills/types.js +0 -193
- package/dist/core/skills/types.js.map +0 -7
- package/dist/core/storage/chromadb-adapter.js +0 -354
- package/dist/core/storage/chromadb-adapter.js.map +0 -7
- package/dist/core/storage/infinite-storage.js +0 -510
- package/dist/core/storage/infinite-storage.js.map +0 -7
- package/dist/core/storage/railway-optimized-storage.js +0 -591
- package/dist/core/storage/railway-optimized-storage.js.map +0 -7
- package/dist/core/storage/remote-storage.js +0 -489
- package/dist/core/storage/remote-storage.js.map +0 -7
- package/dist/core/storage/two-tier-storage.js +0 -766
- package/dist/core/storage/two-tier-storage.js.map +0 -7
- package/dist/core/trace/cli-trace-wrapper.js +0 -132
- package/dist/core/trace/cli-trace-wrapper.js.map +0 -7
- package/dist/core/trace/db-trace-wrapper.js +0 -247
- package/dist/core/trace/db-trace-wrapper.js.map +0 -7
- package/dist/core/trace/debug-trace.js +0 -417
- package/dist/core/trace/debug-trace.js.map +0 -7
- package/dist/core/trace/index.js +0 -109
- package/dist/core/trace/index.js.map +0 -7
- package/dist/core/trace/linear-api-wrapper.js +0 -178
- package/dist/core/trace/linear-api-wrapper.js.map +0 -7
- package/dist/core/trace/trace-demo.js +0 -154
- package/dist/core/trace/trace-demo.js.map +0 -7
- package/dist/core/trace/trace-detector.demo.js +0 -142
- package/dist/core/trace/trace-detector.demo.js.map +0 -7
- package/dist/core/trace/trace-detector.js +0 -528
- package/dist/core/trace/trace-detector.js.map +0 -7
- package/dist/core/trace/trace-store.js +0 -345
- package/dist/core/trace/trace-store.js.map +0 -7
- package/dist/core/trace/types.js +0 -77
- package/dist/core/trace/types.js.map +0 -7
- package/dist/core/utils/async-mutex.js +0 -114
- package/dist/core/utils/async-mutex.js.map +0 -7
- package/dist/core/utils/compression.js +0 -83
- package/dist/core/utils/compression.js.map +0 -7
- package/dist/core/utils/update-checker.js +0 -218
- package/dist/core/utils/update-checker.js.map +0 -7
- package/dist/core/worktree/worktree-manager.js +0 -465
- package/dist/core/worktree/worktree-manager.js.map +0 -7
- package/dist/daemon/daemon-config.js +0 -149
- package/dist/daemon/daemon-config.js.map +0 -7
- package/dist/daemon/services/context-service.js +0 -122
- package/dist/daemon/services/context-service.js.map +0 -7
- package/dist/daemon/services/linear-service.js +0 -136
- package/dist/daemon/services/linear-service.js.map +0 -7
- package/dist/daemon/session-daemon.js +0 -312
- package/dist/daemon/session-daemon.js.map +0 -7
- package/dist/daemon/unified-daemon.js +0 -276
- package/dist/daemon/unified-daemon.js.map +0 -7
- package/dist/features/analytics/api/analytics-api.js +0 -287
- package/dist/features/analytics/api/analytics-api.js.map +0 -7
- package/dist/features/analytics/core/analytics-service.js +0 -282
- package/dist/features/analytics/core/analytics-service.js.map +0 -7
- package/dist/features/analytics/index.js +0 -18
- package/dist/features/analytics/index.js.map +0 -7
- package/dist/features/analytics/queries/metrics-queries.js +0 -277
- package/dist/features/analytics/queries/metrics-queries.js.map +0 -7
- package/dist/features/analytics/types/metrics.js +0 -5
- package/dist/features/analytics/types/metrics.js.map +0 -7
- package/dist/features/browser/browser-mcp.js +0 -492
- package/dist/features/browser/browser-mcp.js.map +0 -7
- package/dist/features/sweep/index.js +0 -20
- package/dist/features/sweep/index.js.map +0 -7
- package/dist/features/sweep/prediction-client.js +0 -155
- package/dist/features/sweep/prediction-client.js.map +0 -7
- package/dist/features/sweep/prompt-builder.js +0 -85
- package/dist/features/sweep/prompt-builder.js.map +0 -7
- package/dist/features/sweep/pty-wrapper.js +0 -171
- package/dist/features/sweep/pty-wrapper.js.map +0 -7
- package/dist/features/sweep/state-watcher.js +0 -87
- package/dist/features/sweep/state-watcher.js.map +0 -7
- package/dist/features/sweep/status-bar.js +0 -88
- package/dist/features/sweep/status-bar.js.map +0 -7
- package/dist/features/sweep/sweep-server-manager.js +0 -226
- package/dist/features/sweep/sweep-server-manager.js.map +0 -7
- package/dist/features/sweep/tab-interceptor.js +0 -38
- package/dist/features/sweep/tab-interceptor.js.map +0 -7
- package/dist/features/sweep/types.js +0 -18
- package/dist/features/sweep/types.js.map +0 -7
- package/dist/features/tasks/linear-task-manager.js +0 -487
- package/dist/features/tasks/linear-task-manager.js.map +0 -7
- package/dist/features/tasks/task-aware-context.js +0 -410
- package/dist/features/tasks/task-aware-context.js.map +0 -7
- package/dist/features/tui/simple-monitor.js +0 -116
- package/dist/features/tui/simple-monitor.js.map +0 -7
- package/dist/features/tui/swarm-monitor.js +0 -648
- package/dist/features/tui/swarm-monitor.js.map +0 -7
- package/dist/features/web/client/stores/task-store.js +0 -26
- package/dist/features/web/client/stores/task-store.js.map +0 -7
- package/dist/features/web/server/index.js +0 -194
- package/dist/features/web/server/index.js.map +0 -7
- package/dist/hooks/auto-background.js +0 -151
- package/dist/hooks/auto-background.js.map +0 -7
- package/dist/hooks/claude-code-whatsapp-hook.js +0 -197
- package/dist/hooks/claude-code-whatsapp-hook.js.map +0 -7
- package/dist/hooks/config.js +0 -150
- package/dist/hooks/config.js.map +0 -7
- package/dist/hooks/daemon.js +0 -364
- package/dist/hooks/daemon.js.map +0 -7
- package/dist/hooks/events.js +0 -58
- package/dist/hooks/events.js.map +0 -7
- package/dist/hooks/index.js +0 -12
- package/dist/hooks/index.js.map +0 -7
- package/dist/hooks/linear-task-picker.js +0 -186
- package/dist/hooks/linear-task-picker.js.map +0 -7
- package/dist/hooks/schemas.js +0 -197
- package/dist/hooks/schemas.js.map +0 -7
- package/dist/hooks/secure-fs.js +0 -49
- package/dist/hooks/secure-fs.js.map +0 -7
- package/dist/hooks/security-logger.js +0 -155
- package/dist/hooks/security-logger.js.map +0 -7
- package/dist/hooks/session-summary.js +0 -222
- package/dist/hooks/session-summary.js.map +0 -7
- package/dist/hooks/sms-action-runner.js +0 -371
- package/dist/hooks/sms-action-runner.js.map +0 -7
- package/dist/hooks/sms-notify.js +0 -506
- package/dist/hooks/sms-notify.js.map +0 -7
- package/dist/hooks/sms-watcher.js +0 -93
- package/dist/hooks/sms-watcher.js.map +0 -7
- package/dist/hooks/sms-webhook.js +0 -555
- package/dist/hooks/sms-webhook.js.map +0 -7
- package/dist/hooks/whatsapp-commands.js +0 -479
- package/dist/hooks/whatsapp-commands.js.map +0 -7
- package/dist/hooks/whatsapp-scheduler.js +0 -317
- package/dist/hooks/whatsapp-scheduler.js.map +0 -7
- package/dist/hooks/whatsapp-sync.js +0 -409
- package/dist/hooks/whatsapp-sync.js.map +0 -7
- package/dist/index.js +0 -25
- package/dist/index.js.map +0 -7
- package/dist/integrations/anthropic/client.js +0 -263
- package/dist/integrations/anthropic/client.js.map +0 -7
- package/dist/integrations/claude-code/agent-bridge.js +0 -768
- package/dist/integrations/claude-code/agent-bridge.js.map +0 -7
- package/dist/integrations/claude-code/enhanced-pre-clear-hooks.js +0 -459
- package/dist/integrations/claude-code/enhanced-pre-clear-hooks.js.map +0 -7
- package/dist/integrations/claude-code/lifecycle-hooks.js +0 -254
- package/dist/integrations/claude-code/lifecycle-hooks.js.map +0 -7
- package/dist/integrations/claude-code/post-task-hooks.js +0 -545
- package/dist/integrations/claude-code/post-task-hooks.js.map +0 -7
- package/dist/integrations/claude-code/subagent-client-stub.js +0 -20
- package/dist/integrations/claude-code/subagent-client-stub.js.map +0 -7
- package/dist/integrations/claude-code/subagent-client.js +0 -511
- package/dist/integrations/claude-code/subagent-client.js.map +0 -7
- package/dist/integrations/claude-code/task-coordinator.js +0 -360
- package/dist/integrations/claude-code/task-coordinator.js.map +0 -7
- package/dist/integrations/linear/auth.js +0 -337
- package/dist/integrations/linear/auth.js.map +0 -7
- package/dist/integrations/linear/auto-sync.js +0 -258
- package/dist/integrations/linear/auto-sync.js.map +0 -7
- package/dist/integrations/linear/client.js +0 -634
- package/dist/integrations/linear/client.js.map +0 -7
- package/dist/integrations/linear/config.js +0 -130
- package/dist/integrations/linear/config.js.map +0 -7
- package/dist/integrations/linear/migration.js +0 -361
- package/dist/integrations/linear/migration.js.map +0 -7
- package/dist/integrations/linear/oauth-server.js +0 -454
- package/dist/integrations/linear/oauth-server.js.map +0 -7
- package/dist/integrations/linear/rest-client.js +0 -213
- package/dist/integrations/linear/rest-client.js.map +0 -7
- package/dist/integrations/linear/sync-manager.js +0 -236
- package/dist/integrations/linear/sync-manager.js.map +0 -7
- package/dist/integrations/linear/sync-service.js +0 -231
- package/dist/integrations/linear/sync-service.js.map +0 -7
- package/dist/integrations/linear/sync.js +0 -782
- package/dist/integrations/linear/sync.js.map +0 -7
- package/dist/integrations/linear/types.js +0 -5
- package/dist/integrations/linear/types.js.map +0 -7
- package/dist/integrations/linear/unified-sync.js +0 -589
- package/dist/integrations/linear/unified-sync.js.map +0 -7
- package/dist/integrations/linear/webhook-handler.js +0 -219
- package/dist/integrations/linear/webhook-handler.js.map +0 -7
- package/dist/integrations/linear/webhook-server.js +0 -218
- package/dist/integrations/linear/webhook-server.js.map +0 -7
- package/dist/integrations/linear/webhook.js +0 -291
- package/dist/integrations/linear/webhook.js.map +0 -7
- package/dist/integrations/mcp/handlers/code-execution-handlers.js +0 -266
- package/dist/integrations/mcp/handlers/code-execution-handlers.js.map +0 -7
- package/dist/integrations/mcp/handlers/context-handlers.js +0 -257
- package/dist/integrations/mcp/handlers/context-handlers.js.map +0 -7
- package/dist/integrations/mcp/handlers/discovery-handlers.js +0 -497
- package/dist/integrations/mcp/handlers/discovery-handlers.js.map +0 -7
- package/dist/integrations/mcp/handlers/index.js +0 -166
- package/dist/integrations/mcp/handlers/index.js.map +0 -7
- package/dist/integrations/mcp/handlers/linear-handlers.js +0 -247
- package/dist/integrations/mcp/handlers/linear-handlers.js.map +0 -7
- package/dist/integrations/mcp/handlers/skill-handlers.js +0 -529
- package/dist/integrations/mcp/handlers/skill-handlers.js.map +0 -7
- package/dist/integrations/mcp/handlers/task-handlers.js +0 -239
- package/dist/integrations/mcp/handlers/task-handlers.js.map +0 -7
- package/dist/integrations/mcp/handlers/trace-handlers.js +0 -308
- package/dist/integrations/mcp/handlers/trace-handlers.js.map +0 -7
- package/dist/integrations/mcp/index.js +0 -23
- package/dist/integrations/mcp/index.js.map +0 -7
- package/dist/integrations/mcp/middleware/tool-scoring.js +0 -356
- package/dist/integrations/mcp/middleware/tool-scoring.js.map +0 -7
- package/dist/integrations/mcp/refactored-server.js +0 -374
- package/dist/integrations/mcp/refactored-server.js.map +0 -7
- package/dist/integrations/mcp/remote-server.js +0 -682
- package/dist/integrations/mcp/remote-server.js.map +0 -7
- package/dist/integrations/mcp/schemas.js +0 -147
- package/dist/integrations/mcp/schemas.js.map +0 -7
- package/dist/integrations/mcp/server.js +0 -1975
- package/dist/integrations/mcp/server.js.map +0 -7
- package/dist/integrations/mcp/tool-definitions-code.js +0 -125
- package/dist/integrations/mcp/tool-definitions-code.js.map +0 -7
- package/dist/integrations/mcp/tool-definitions.js +0 -702
- package/dist/integrations/mcp/tool-definitions.js.map +0 -7
- package/dist/integrations/mcp/trace-test.js +0 -48
- package/dist/integrations/mcp/trace-test.js.map +0 -7
- package/dist/integrations/pg-aiguide/embedding-provider.js +0 -189
- package/dist/integrations/pg-aiguide/embedding-provider.js.map +0 -7
- package/dist/integrations/pg-aiguide/semantic-search.js +0 -187
- package/dist/integrations/pg-aiguide/semantic-search.js.map +0 -7
- package/dist/integrations/pg-aiguide/timescale-analytics.js +0 -224
- package/dist/integrations/pg-aiguide/timescale-analytics.js.map +0 -7
- package/dist/integrations/ralph/bridge/ralph-stackmemory-bridge.js +0 -860
- package/dist/integrations/ralph/bridge/ralph-stackmemory-bridge.js.map +0 -7
- package/dist/integrations/ralph/context/context-budget-manager.js +0 -301
- package/dist/integrations/ralph/context/context-budget-manager.js.map +0 -7
- package/dist/integrations/ralph/context/stackmemory-context-loader.js +0 -360
- package/dist/integrations/ralph/context/stackmemory-context-loader.js.map +0 -7
- package/dist/integrations/ralph/coordination/enhanced-coordination.js +0 -410
- package/dist/integrations/ralph/coordination/enhanced-coordination.js.map +0 -7
- package/dist/integrations/ralph/index.js +0 -18
- package/dist/integrations/ralph/index.js.map +0 -7
- package/dist/integrations/ralph/learning/pattern-learner.js +0 -401
- package/dist/integrations/ralph/learning/pattern-learner.js.map +0 -7
- package/dist/integrations/ralph/lifecycle/iteration-lifecycle.js +0 -448
- package/dist/integrations/ralph/lifecycle/iteration-lifecycle.js.map +0 -7
- package/dist/integrations/ralph/monitoring/swarm-dashboard.js +0 -294
- package/dist/integrations/ralph/monitoring/swarm-dashboard.js.map +0 -7
- package/dist/integrations/ralph/monitoring/swarm-registry.js +0 -108
- package/dist/integrations/ralph/monitoring/swarm-registry.js.map +0 -7
- package/dist/integrations/ralph/orchestration/multi-loop-orchestrator.js +0 -463
- package/dist/integrations/ralph/orchestration/multi-loop-orchestrator.js.map +0 -7
- package/dist/integrations/ralph/patterns/compounding-engineering-pattern.js +0 -400
- package/dist/integrations/ralph/patterns/compounding-engineering-pattern.js.map +0 -7
- package/dist/integrations/ralph/patterns/extended-coherence-sessions.js +0 -473
- package/dist/integrations/ralph/patterns/extended-coherence-sessions.js.map +0 -7
- package/dist/integrations/ralph/patterns/oracle-worker-pattern.js +0 -388
- package/dist/integrations/ralph/patterns/oracle-worker-pattern.js.map +0 -7
- package/dist/integrations/ralph/performance/performance-optimizer.js +0 -358
- package/dist/integrations/ralph/performance/performance-optimizer.js.map +0 -7
- package/dist/integrations/ralph/ralph-integration-demo.js +0 -182
- package/dist/integrations/ralph/ralph-integration-demo.js.map +0 -7
- package/dist/integrations/ralph/recovery/crash-recovery.js +0 -462
- package/dist/integrations/ralph/recovery/crash-recovery.js.map +0 -7
- package/dist/integrations/ralph/state/state-reconciler.js +0 -404
- package/dist/integrations/ralph/state/state-reconciler.js.map +0 -7
- package/dist/integrations/ralph/swarm/git-workflow-manager.js +0 -428
- package/dist/integrations/ralph/swarm/git-workflow-manager.js.map +0 -7
- package/dist/integrations/ralph/swarm/swarm-coordinator.js +0 -996
- package/dist/integrations/ralph/swarm/swarm-coordinator.js.map +0 -7
- package/dist/integrations/ralph/types.js +0 -5
- package/dist/integrations/ralph/types.js.map +0 -7
- package/dist/integrations/ralph/visualization/ralph-debugger.js +0 -585
- package/dist/integrations/ralph/visualization/ralph-debugger.js.map +0 -7
- package/dist/mcp/stackmemory-mcp-server.js +0 -554
- package/dist/mcp/stackmemory-mcp-server.js.map +0 -7
- package/dist/middleware/exponential-rate-limiter.js +0 -289
- package/dist/middleware/exponential-rate-limiter.js.map +0 -7
- package/dist/models/user.model.js +0 -358
- package/dist/models/user.model.js.map +0 -7
- package/dist/servers/production/auth-middleware.js +0 -528
- package/dist/servers/production/auth-middleware.js.map +0 -7
- package/dist/servers/railway/config.js +0 -55
- package/dist/servers/railway/config.js.map +0 -7
- package/dist/servers/railway/index-enhanced.js +0 -160
- package/dist/servers/railway/index-enhanced.js.map +0 -7
- package/dist/servers/railway/index.js +0 -1349
- package/dist/servers/railway/index.js.map +0 -7
- package/dist/servers/railway/simple.js +0 -64
- package/dist/servers/railway/simple.js.map +0 -7
- package/dist/servers/railway/storage-test.js +0 -459
- package/dist/servers/railway/storage-test.js.map +0 -7
- package/dist/services/config-service.js +0 -65
- package/dist/services/config-service.js.map +0 -7
- package/dist/services/context-service.js +0 -194
- package/dist/services/context-service.js.map +0 -7
- package/dist/skills/api-discovery.js +0 -354
- package/dist/skills/api-discovery.js.map +0 -7
- package/dist/skills/api-skill.js +0 -475
- package/dist/skills/api-skill.js.map +0 -7
- package/dist/skills/claude-skills.js +0 -1061
- package/dist/skills/claude-skills.js.map +0 -7
- package/dist/skills/dashboard-launcher.js +0 -216
- package/dist/skills/dashboard-launcher.js.map +0 -7
- package/dist/skills/recursive-agent-orchestrator.js +0 -575
- package/dist/skills/recursive-agent-orchestrator.js.map +0 -7
- package/dist/skills/repo-ingestion-skill.js +0 -609
- package/dist/skills/repo-ingestion-skill.js.map +0 -7
- package/dist/skills/security-secrets-scanner.js +0 -284
- package/dist/skills/security-secrets-scanner.js.map +0 -7
- package/dist/skills/unified-rlm-orchestrator.js +0 -404
- package/dist/skills/unified-rlm-orchestrator.js.map +0 -7
- package/dist/types/task.js +0 -5
- package/dist/types/task.js.map +0 -7
- package/dist/utils/env.js +0 -50
- package/dist/utils/env.js.map +0 -7
- package/dist/utils/formatting.js +0 -62
- package/dist/utils/formatting.js.map +0 -7
- package/dist/utils/process-cleanup.js +0 -136
- package/dist/utils/process-cleanup.js.map +0 -7
- package/dist/validation/schemas.js +0 -222
- package/dist/validation/schemas.js.map +0 -7
- /package/dist/{core/merge → src/core/extensions}/types.js +0 -0
- /package/dist/{core/merge → src/core/extensions}/types.js.map +0 -0
- /package/dist/{core → src/integrations/diffmem}/types.js +0 -0
- /package/dist/{core → src/integrations/diffmem}/types.js.map +0 -0
|
@@ -2,11 +2,23 @@ import { fileURLToPath as __fileURLToPath } from 'url';
|
|
|
2
2
|
import { dirname as __pathDirname } from 'path';
|
|
3
3
|
const __filename = __fileURLToPath(import.meta.url);
|
|
4
4
|
const __dirname = __pathDirname(__filename);
|
|
5
|
-
import { CloudClient } from "chromadb";
|
|
6
5
|
import { v4 as uuidv4 } from "uuid";
|
|
7
6
|
import { Logger } from "../monitoring/logger.js";
|
|
7
|
+
let chromadbModule = null;
|
|
8
|
+
async function getChromaDB() {
|
|
9
|
+
if (!chromadbModule) {
|
|
10
|
+
try {
|
|
11
|
+
chromadbModule = await import("chromadb");
|
|
12
|
+
} catch {
|
|
13
|
+
throw new Error(
|
|
14
|
+
"chromadb is not installed. Install it with: npm install chromadb"
|
|
15
|
+
);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return chromadbModule;
|
|
19
|
+
}
|
|
8
20
|
class ChromaDBAdapter {
|
|
9
|
-
client;
|
|
21
|
+
client = null;
|
|
10
22
|
collection = null;
|
|
11
23
|
logger;
|
|
12
24
|
config;
|
|
@@ -17,14 +29,28 @@ class ChromaDBAdapter {
|
|
|
17
29
|
this.userId = userId;
|
|
18
30
|
this.teamId = teamId;
|
|
19
31
|
this.logger = new Logger("ChromaDBAdapter");
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Factory method to create and initialize the adapter
|
|
35
|
+
*/
|
|
36
|
+
static async create(config, userId, teamId) {
|
|
37
|
+
const adapter = new ChromaDBAdapter(config, userId, teamId);
|
|
38
|
+
await adapter.initClient();
|
|
39
|
+
return adapter;
|
|
40
|
+
}
|
|
41
|
+
async initClient() {
|
|
42
|
+
const chromadb = await getChromaDB();
|
|
43
|
+
this.client = new chromadb.CloudClient({
|
|
44
|
+
apiKey: this.config.apiKey,
|
|
45
|
+
tenant: this.config.tenant,
|
|
46
|
+
database: this.config.database
|
|
24
47
|
});
|
|
25
48
|
}
|
|
26
49
|
async initialize() {
|
|
27
50
|
try {
|
|
51
|
+
if (!this.client) {
|
|
52
|
+
await this.initClient();
|
|
53
|
+
}
|
|
28
54
|
const collectionName = this.config.collectionName || "stackmemory_contexts";
|
|
29
55
|
this.collection = await this.client.getOrCreateCollection({
|
|
30
56
|
name: collectionName,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/core/storage/chromadb-adapter.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * ChromaDB Storage Adapter for StackMemory\n *\n * Provides vector storage and semantic search capabilities for context data\n * using ChromaDB cloud service with user and team segmentation.\n */\n\nimport { CloudClient, Collection } from 'chromadb';\nimport { v4 as uuidv4 } from 'uuid';\nimport { Frame } from '../context/index.js';\nimport { Logger } from '../monitoring/logger.js';\n\ninterface ChromaDocument {\n id: string;\n document: string;\n metadata: {\n user_id: string;\n team_id?: string;\n frame_id: string;\n session_id: string;\n project_name: string;\n timestamp: number;\n type: 'frame' | 'decision' | 'observation' | 'context';\n score?: number;\n tags?: string[];\n };\n}\n\ninterface ChromaConfig {\n apiKey: string;\n tenant: string;\n database: string;\n collectionName?: string;\n}\n\nexport class ChromaDBAdapter {\n private client: CloudClient;\n private collection: Collection | null = null;\n private logger: Logger;\n private config: ChromaConfig;\n private userId: string;\n private teamId?: string;\n\n constructor(config: ChromaConfig, userId: string, teamId?: string) {\n this.config = config;\n this.userId = userId;\n this.teamId = teamId;\n this.logger = new Logger('ChromaDBAdapter');\n\n // Initialize ChromaDB client\n this.client = new CloudClient({\n apiKey: config.apiKey,\n tenant: config.tenant,\n database: config.database,\n });\n }\n\n async initialize(): Promise<void> {\n try {\n const collectionName =\n this.config.collectionName || 'stackmemory_contexts';\n\n // Get or create collection with metadata for filtering\n this.collection = await this.client.getOrCreateCollection({\n name: collectionName,\n metadata: {\n description: 'StackMemory context storage',\n version: '1.0.0',\n created_at: new Date().toISOString(),\n },\n });\n\n this.logger.info(`ChromaDB collection '${collectionName}' initialized`);\n } catch (error: unknown) {\n this.logger.error('Failed to initialize ChromaDB collection', error);\n throw error;\n }\n }\n\n /**\n * Store a frame in ChromaDB\n */\n async storeFrame(frame: Frame): Promise<void> {\n if (!this.collection) {\n throw new Error('ChromaDB not initialized');\n }\n\n try {\n // Prepare document from frame\n const frameMetadata: any = {\n user_id: this.userId,\n frame_id: frame.frameId,\n session_id: frame.sessionId || 'unknown',\n project_name: frame.projectName || 'default',\n timestamp: frame.timestamp,\n type: 'frame',\n score: frame.score,\n tags: frame.tags || [],\n };\n\n // Only add team_id if it exists\n if (this.teamId) {\n frameMetadata.team_id = this.teamId;\n }\n\n const document: ChromaDocument = {\n id: `frame_${frame.frameId}_${this.userId}`,\n document: this.frameToDocument(frame),\n metadata: frameMetadata,\n };\n\n // Add to ChromaDB\n await this.collection.add({\n ids: [document.id],\n documents: [document.document],\n metadatas: [document.metadata],\n });\n\n this.logger.debug(\n `Stored frame ${frame.frameId} for user ${this.userId}`\n );\n } catch (error: unknown) {\n this.logger.error(`Failed to store frame ${frame.frameId}`, error);\n throw error;\n }\n }\n\n /**\n * Store a decision or observation\n */\n async storeContext(\n type: 'decision' | 'observation',\n content: string,\n metadata?: Record<string, any>\n ): Promise<void> {\n if (!this.collection) {\n throw new Error('ChromaDB not initialized');\n }\n\n try {\n const contextId = `${type}_${uuidv4()}_${this.userId}`;\n\n const documentMetadata: any = {\n user_id: this.userId,\n frame_id: metadata?.frame_id || 'none',\n session_id: metadata?.session_id || 'unknown',\n project_name: metadata?.project_name || 'default',\n timestamp: Date.now(),\n type,\n ...metadata,\n };\n\n // Only add team_id if it exists (ChromaDB doesn't accept undefined values)\n if (this.teamId) {\n documentMetadata.team_id = this.teamId;\n }\n\n const document: ChromaDocument = {\n id: contextId,\n document: content,\n metadata: documentMetadata,\n };\n\n await this.collection.add({\n ids: [document.id],\n documents: [document.document],\n metadatas: [document.metadata],\n });\n\n this.logger.debug(`Stored ${type} for user ${this.userId}`);\n } catch (error: unknown) {\n this.logger.error(`Failed to store ${type}`, error);\n throw error;\n }\n }\n\n /**\n * Query contexts by semantic similarity\n */\n async queryContexts(\n query: string,\n limit: number = 10,\n filters?: {\n type?: string[];\n projectName?: string;\n sessionId?: string;\n startTime?: number;\n endTime?: number;\n }\n ): Promise<Array<{ content: string; metadata: any; distance: number }>> {\n if (!this.collection) {\n throw new Error('ChromaDB not initialized');\n }\n\n try {\n // Build where clause for filtering\n const whereClause: any = {\n user_id: this.userId,\n };\n\n // Add team filter if applicable\n if (this.teamId) {\n whereClause['$or'] = [\n { team_id: this.teamId },\n { user_id: this.userId },\n ];\n }\n\n // Add additional filters\n if (filters?.type && filters.type.length > 0) {\n whereClause.type = { $in: filters.type };\n }\n\n if (filters?.projectName) {\n whereClause.project_name = filters.projectName;\n }\n\n if (filters?.sessionId) {\n whereClause.session_id = filters.sessionId;\n }\n\n if (filters?.startTime || filters?.endTime) {\n whereClause.timestamp = {};\n if (filters.startTime) {\n whereClause.timestamp.$gte = filters.startTime;\n }\n if (filters.endTime) {\n whereClause.timestamp.$lte = filters.endTime;\n }\n }\n\n // Query ChromaDB\n const results = await this.collection.query({\n queryTexts: [query],\n nResults: limit,\n where: whereClause,\n include: ['documents', 'metadatas', 'distances'],\n });\n\n // Format results\n const contexts: Array<{\n content: string;\n metadata: any;\n distance: number;\n }> = [];\n\n if (results.documents && results.documents[0]) {\n for (let i = 0; i < results.documents[0].length; i++) {\n contexts.push({\n content: results.documents[0][i] || '',\n metadata: results.metadatas?.[0]?.[i] || {},\n distance: results.distances?.[0]?.[i] || 0,\n });\n }\n }\n\n this.logger.debug(`Found ${contexts.length} contexts for query`);\n return contexts;\n } catch (error: unknown) {\n this.logger.error('Failed to query contexts', error);\n throw error;\n }\n }\n\n /**\n * Get user's recent contexts\n */\n async getRecentContexts(\n limit: number = 20,\n type?: string\n ): Promise<Array<{ content: string; metadata: any }>> {\n if (!this.collection) {\n throw new Error('ChromaDB not initialized');\n }\n\n try {\n const whereClause: any = {\n user_id: this.userId,\n };\n\n if (type) {\n whereClause.type = type;\n }\n\n // Get all documents for the user (ChromaDB doesn't support direct ordering)\n const results = await this.collection.get({\n where: whereClause,\n include: ['documents', 'metadatas'],\n });\n\n // Sort by timestamp and limit\n const contexts: Array<{ content: string; metadata: any }> = [];\n\n if (results.documents) {\n const indexed = results.documents.map((doc, i) => ({\n content: doc || '',\n metadata: results.metadatas?.[i] || {},\n }));\n\n // Sort by timestamp descending\n indexed.sort(\n (a, b) => (b.metadata.timestamp || 0) - (a.metadata.timestamp || 0)\n );\n\n // Take limit\n contexts.push(...indexed.slice(0, limit));\n }\n\n return contexts;\n } catch (error: unknown) {\n this.logger.error('Failed to get recent contexts', error);\n throw error;\n }\n }\n\n /**\n * Delete old contexts (retention policy)\n */\n async deleteOldContexts(olderThanDays: number = 30): Promise<number> {\n if (!this.collection) {\n throw new Error('ChromaDB not initialized');\n }\n\n try {\n const cutoffTime = Date.now() - olderThanDays * 24 * 60 * 60 * 1000;\n\n // Get old documents\n const results = await this.collection.get({\n where: {\n user_id: this.userId,\n timestamp: { $lt: cutoffTime },\n },\n include: ['ids'],\n });\n\n if (!results.ids || results.ids.length === 0) {\n return 0;\n }\n\n // Delete old documents\n await this.collection.delete({\n ids: results.ids,\n });\n\n this.logger.info(`Deleted ${results.ids.length} old contexts`);\n return results.ids.length;\n } catch (error: unknown) {\n this.logger.error('Failed to delete old contexts', error);\n throw error;\n }\n }\n\n /**\n * Get team contexts (if user is part of a team)\n */\n async getTeamContexts(\n limit: number = 20\n ): Promise<Array<{ content: string; metadata: any }>> {\n if (!this.collection || !this.teamId) {\n return [];\n }\n\n try {\n const results = await this.collection.get({\n where: {\n team_id: this.teamId,\n },\n include: ['documents', 'metadatas'],\n limit,\n });\n\n const contexts: Array<{ content: string; metadata: any }> = [];\n\n if (results.documents) {\n for (let i = 0; i < results.documents.length; i++) {\n contexts.push({\n content: results.documents[i] || '',\n metadata: results.metadatas?.[i] || {},\n });\n }\n }\n\n return contexts;\n } catch (error: unknown) {\n this.logger.error('Failed to get team contexts', error);\n return [];\n }\n }\n\n /**\n * Convert frame to searchable document\n */\n private frameToDocument(frame: Frame): string {\n const parts = [\n `Frame: ${frame.title}`,\n `Type: ${frame.type}`,\n `Status: ${frame.status}`,\n ];\n\n if (frame.description) {\n parts.push(`Description: ${frame.description}`);\n }\n\n if (frame.inputs && frame.inputs.length > 0) {\n parts.push(`Inputs: ${frame.inputs.join(', ')}`);\n }\n\n if (frame.outputs && frame.outputs.length > 0) {\n parts.push(`Outputs: ${frame.outputs.join(', ')}`);\n }\n\n if (frame.tags && frame.tags.length > 0) {\n parts.push(`Tags: ${frame.tags.join(', ')}`);\n }\n\n if (frame.digest_json) {\n try {\n const digest = JSON.parse(frame.digest_json);\n if (digest.summary) {\n parts.push(`Summary: ${digest.summary}`);\n }\n if (digest.keyDecisions) {\n parts.push(`Decisions: ${digest.keyDecisions.join('. ')}`);\n }\n } catch {\n // Ignore parse errors\n }\n }\n\n return parts.join('\\n');\n }\n\n /**\n * Update team ID for a user\n */\n async updateTeamId(newTeamId: string): Promise<void> {\n this.teamId = newTeamId;\n this.logger.info(`Updated team ID to ${newTeamId} for user ${this.userId}`);\n }\n\n /**\n * Get storage statistics\n */\n async getStats(): Promise<{\n totalDocuments: number;\n userDocuments: number;\n teamDocuments?: number;\n documentsByType: Record<string, number>;\n }> {\n if (!this.collection) {\n throw new Error('ChromaDB not initialized');\n }\n\n try {\n // Get user documents\n const userResults = await this.collection.get({\n where: { user_id: this.userId },\n include: ['metadatas'],\n });\n\n const stats: any = {\n totalDocuments: 0,\n userDocuments: userResults.ids?.length || 0,\n documentsByType: {},\n };\n\n // Count by type\n if (userResults.metadatas) {\n for (const metadata of userResults.metadatas) {\n const type = metadata?.type || 'unknown';\n stats.documentsByType[type] = (stats.documentsByType[type] || 0) + 1;\n }\n }\n\n // Get team documents if applicable\n if (this.teamId) {\n const teamResults = await this.collection.get({\n where: { team_id: this.teamId },\n include: ['ids'],\n });\n stats.teamDocuments = teamResults.ids?.length || 0;\n }\n\n stats.totalDocuments = stats.userDocuments + (stats.teamDocuments || 0);\n\n return stats;\n } catch (error: unknown) {\n this.logger.error('Failed to get stats', error);\n throw error;\n }\n }\n}\n"],
|
|
5
|
-
"mappings": ";;;;
|
|
4
|
+
"sourcesContent": ["/**\n * ChromaDB Storage Adapter for StackMemory\n *\n * Provides vector storage and semantic search capabilities for context data\n * using ChromaDB cloud service with user and team segmentation.\n *\n * NOTE: chromadb is an optional dependency. This adapter gracefully handles\n * the case when chromadb is not installed.\n */\n\nimport { v4 as uuidv4 } from 'uuid';\n\n// Dynamic import types for optional chromadb dependency\ntype CloudClient = import('chromadb').CloudClient;\ntype Collection = import('chromadb').Collection;\nimport { Frame } from '../context/index.js';\nimport { Logger } from '../monitoring/logger.js';\n\ninterface ChromaDocument {\n id: string;\n document: string;\n metadata: {\n user_id: string;\n team_id?: string;\n frame_id: string;\n session_id: string;\n project_name: string;\n timestamp: number;\n type: 'frame' | 'decision' | 'observation' | 'context';\n score?: number;\n tags?: string[];\n };\n}\n\ninterface ChromaConfig {\n apiKey: string;\n tenant: string;\n database: string;\n collectionName?: string;\n}\n\n// Check if chromadb is available\nlet chromadbModule: typeof import('chromadb') | null = null;\n\nasync function getChromaDB(): Promise<typeof import('chromadb')> {\n if (!chromadbModule) {\n try {\n chromadbModule = await import('chromadb');\n } catch {\n throw new Error(\n 'chromadb is not installed. Install it with: npm install chromadb'\n );\n }\n }\n return chromadbModule;\n}\n\nexport class ChromaDBAdapter {\n private client: CloudClient | null = null;\n private collection: Collection | null = null;\n private logger: Logger;\n private config: ChromaConfig;\n private userId: string;\n private teamId?: string;\n\n constructor(config: ChromaConfig, userId: string, teamId?: string) {\n this.config = config;\n this.userId = userId;\n this.teamId = teamId;\n this.logger = new Logger('ChromaDBAdapter');\n }\n\n /**\n * Factory method to create and initialize the adapter\n */\n static async create(\n config: ChromaConfig,\n userId: string,\n teamId?: string\n ): Promise<ChromaDBAdapter> {\n const adapter = new ChromaDBAdapter(config, userId, teamId);\n await adapter.initClient();\n return adapter;\n }\n\n private async initClient(): Promise<void> {\n const chromadb = await getChromaDB();\n this.client = new chromadb.CloudClient({\n apiKey: this.config.apiKey,\n tenant: this.config.tenant,\n database: this.config.database,\n });\n }\n\n async initialize(): Promise<void> {\n try {\n if (!this.client) {\n await this.initClient();\n }\n\n const collectionName =\n this.config.collectionName || 'stackmemory_contexts';\n\n // Get or create collection with metadata for filtering\n this.collection = await this.client!.getOrCreateCollection({\n name: collectionName,\n metadata: {\n description: 'StackMemory context storage',\n version: '1.0.0',\n created_at: new Date().toISOString(),\n },\n });\n\n this.logger.info(`ChromaDB collection '${collectionName}' initialized`);\n } catch (error: unknown) {\n this.logger.error('Failed to initialize ChromaDB collection', error);\n throw error;\n }\n }\n\n /**\n * Store a frame in ChromaDB\n */\n async storeFrame(frame: Frame): Promise<void> {\n if (!this.collection) {\n throw new Error('ChromaDB not initialized');\n }\n\n try {\n // Prepare document from frame\n const frameMetadata: any = {\n user_id: this.userId,\n frame_id: frame.frameId,\n session_id: frame.sessionId || 'unknown',\n project_name: frame.projectName || 'default',\n timestamp: frame.timestamp,\n type: 'frame',\n score: frame.score,\n tags: frame.tags || [],\n };\n\n // Only add team_id if it exists\n if (this.teamId) {\n frameMetadata.team_id = this.teamId;\n }\n\n const document: ChromaDocument = {\n id: `frame_${frame.frameId}_${this.userId}`,\n document: this.frameToDocument(frame),\n metadata: frameMetadata,\n };\n\n // Add to ChromaDB\n await this.collection.add({\n ids: [document.id],\n documents: [document.document],\n metadatas: [document.metadata],\n });\n\n this.logger.debug(\n `Stored frame ${frame.frameId} for user ${this.userId}`\n );\n } catch (error: unknown) {\n this.logger.error(`Failed to store frame ${frame.frameId}`, error);\n throw error;\n }\n }\n\n /**\n * Store a decision or observation\n */\n async storeContext(\n type: 'decision' | 'observation',\n content: string,\n metadata?: Record<string, any>\n ): Promise<void> {\n if (!this.collection) {\n throw new Error('ChromaDB not initialized');\n }\n\n try {\n const contextId = `${type}_${uuidv4()}_${this.userId}`;\n\n const documentMetadata: any = {\n user_id: this.userId,\n frame_id: metadata?.frame_id || 'none',\n session_id: metadata?.session_id || 'unknown',\n project_name: metadata?.project_name || 'default',\n timestamp: Date.now(),\n type,\n ...metadata,\n };\n\n // Only add team_id if it exists (ChromaDB doesn't accept undefined values)\n if (this.teamId) {\n documentMetadata.team_id = this.teamId;\n }\n\n const document: ChromaDocument = {\n id: contextId,\n document: content,\n metadata: documentMetadata,\n };\n\n await this.collection.add({\n ids: [document.id],\n documents: [document.document],\n metadatas: [document.metadata],\n });\n\n this.logger.debug(`Stored ${type} for user ${this.userId}`);\n } catch (error: unknown) {\n this.logger.error(`Failed to store ${type}`, error);\n throw error;\n }\n }\n\n /**\n * Query contexts by semantic similarity\n */\n async queryContexts(\n query: string,\n limit: number = 10,\n filters?: {\n type?: string[];\n projectName?: string;\n sessionId?: string;\n startTime?: number;\n endTime?: number;\n }\n ): Promise<Array<{ content: string; metadata: any; distance: number }>> {\n if (!this.collection) {\n throw new Error('ChromaDB not initialized');\n }\n\n try {\n // Build where clause for filtering\n const whereClause: any = {\n user_id: this.userId,\n };\n\n // Add team filter if applicable\n if (this.teamId) {\n whereClause['$or'] = [\n { team_id: this.teamId },\n { user_id: this.userId },\n ];\n }\n\n // Add additional filters\n if (filters?.type && filters.type.length > 0) {\n whereClause.type = { $in: filters.type };\n }\n\n if (filters?.projectName) {\n whereClause.project_name = filters.projectName;\n }\n\n if (filters?.sessionId) {\n whereClause.session_id = filters.sessionId;\n }\n\n if (filters?.startTime || filters?.endTime) {\n whereClause.timestamp = {};\n if (filters.startTime) {\n whereClause.timestamp.$gte = filters.startTime;\n }\n if (filters.endTime) {\n whereClause.timestamp.$lte = filters.endTime;\n }\n }\n\n // Query ChromaDB\n const results = await this.collection.query({\n queryTexts: [query],\n nResults: limit,\n where: whereClause,\n include: ['documents', 'metadatas', 'distances'],\n });\n\n // Format results\n const contexts: Array<{\n content: string;\n metadata: any;\n distance: number;\n }> = [];\n\n if (results.documents && results.documents[0]) {\n for (let i = 0; i < results.documents[0].length; i++) {\n contexts.push({\n content: results.documents[0][i] || '',\n metadata: results.metadatas?.[0]?.[i] || {},\n distance: results.distances?.[0]?.[i] || 0,\n });\n }\n }\n\n this.logger.debug(`Found ${contexts.length} contexts for query`);\n return contexts;\n } catch (error: unknown) {\n this.logger.error('Failed to query contexts', error);\n throw error;\n }\n }\n\n /**\n * Get user's recent contexts\n */\n async getRecentContexts(\n limit: number = 20,\n type?: string\n ): Promise<Array<{ content: string; metadata: any }>> {\n if (!this.collection) {\n throw new Error('ChromaDB not initialized');\n }\n\n try {\n const whereClause: any = {\n user_id: this.userId,\n };\n\n if (type) {\n whereClause.type = type;\n }\n\n // Get all documents for the user (ChromaDB doesn't support direct ordering)\n const results = await this.collection.get({\n where: whereClause,\n include: ['documents', 'metadatas'],\n });\n\n // Sort by timestamp and limit\n const contexts: Array<{ content: string; metadata: any }> = [];\n\n if (results.documents) {\n const indexed = results.documents.map((doc, i) => ({\n content: doc || '',\n metadata: results.metadatas?.[i] || {},\n }));\n\n // Sort by timestamp descending\n indexed.sort(\n (a, b) => (b.metadata.timestamp || 0) - (a.metadata.timestamp || 0)\n );\n\n // Take limit\n contexts.push(...indexed.slice(0, limit));\n }\n\n return contexts;\n } catch (error: unknown) {\n this.logger.error('Failed to get recent contexts', error);\n throw error;\n }\n }\n\n /**\n * Delete old contexts (retention policy)\n */\n async deleteOldContexts(olderThanDays: number = 30): Promise<number> {\n if (!this.collection) {\n throw new Error('ChromaDB not initialized');\n }\n\n try {\n const cutoffTime = Date.now() - olderThanDays * 24 * 60 * 60 * 1000;\n\n // Get old documents\n const results = await this.collection.get({\n where: {\n user_id: this.userId,\n timestamp: { $lt: cutoffTime },\n },\n include: ['ids'],\n });\n\n if (!results.ids || results.ids.length === 0) {\n return 0;\n }\n\n // Delete old documents\n await this.collection.delete({\n ids: results.ids,\n });\n\n this.logger.info(`Deleted ${results.ids.length} old contexts`);\n return results.ids.length;\n } catch (error: unknown) {\n this.logger.error('Failed to delete old contexts', error);\n throw error;\n }\n }\n\n /**\n * Get team contexts (if user is part of a team)\n */\n async getTeamContexts(\n limit: number = 20\n ): Promise<Array<{ content: string; metadata: any }>> {\n if (!this.collection || !this.teamId) {\n return [];\n }\n\n try {\n const results = await this.collection.get({\n where: {\n team_id: this.teamId,\n },\n include: ['documents', 'metadatas'],\n limit,\n });\n\n const contexts: Array<{ content: string; metadata: any }> = [];\n\n if (results.documents) {\n for (let i = 0; i < results.documents.length; i++) {\n contexts.push({\n content: results.documents[i] || '',\n metadata: results.metadatas?.[i] || {},\n });\n }\n }\n\n return contexts;\n } catch (error: unknown) {\n this.logger.error('Failed to get team contexts', error);\n return [];\n }\n }\n\n /**\n * Convert frame to searchable document\n */\n private frameToDocument(frame: Frame): string {\n const parts = [\n `Frame: ${frame.title}`,\n `Type: ${frame.type}`,\n `Status: ${frame.status}`,\n ];\n\n if (frame.description) {\n parts.push(`Description: ${frame.description}`);\n }\n\n if (frame.inputs && frame.inputs.length > 0) {\n parts.push(`Inputs: ${frame.inputs.join(', ')}`);\n }\n\n if (frame.outputs && frame.outputs.length > 0) {\n parts.push(`Outputs: ${frame.outputs.join(', ')}`);\n }\n\n if (frame.tags && frame.tags.length > 0) {\n parts.push(`Tags: ${frame.tags.join(', ')}`);\n }\n\n if (frame.digest_json) {\n try {\n const digest = JSON.parse(frame.digest_json);\n if (digest.summary) {\n parts.push(`Summary: ${digest.summary}`);\n }\n if (digest.keyDecisions) {\n parts.push(`Decisions: ${digest.keyDecisions.join('. ')}`);\n }\n } catch {\n // Ignore parse errors\n }\n }\n\n return parts.join('\\n');\n }\n\n /**\n * Update team ID for a user\n */\n async updateTeamId(newTeamId: string): Promise<void> {\n this.teamId = newTeamId;\n this.logger.info(`Updated team ID to ${newTeamId} for user ${this.userId}`);\n }\n\n /**\n * Get storage statistics\n */\n async getStats(): Promise<{\n totalDocuments: number;\n userDocuments: number;\n teamDocuments?: number;\n documentsByType: Record<string, number>;\n }> {\n if (!this.collection) {\n throw new Error('ChromaDB not initialized');\n }\n\n try {\n // Get user documents\n const userResults = await this.collection.get({\n where: { user_id: this.userId },\n include: ['metadatas'],\n });\n\n const stats: any = {\n totalDocuments: 0,\n userDocuments: userResults.ids?.length || 0,\n documentsByType: {},\n };\n\n // Count by type\n if (userResults.metadatas) {\n for (const metadata of userResults.metadatas) {\n const type = metadata?.type || 'unknown';\n stats.documentsByType[type] = (stats.documentsByType[type] || 0) + 1;\n }\n }\n\n // Get team documents if applicable\n if (this.teamId) {\n const teamResults = await this.collection.get({\n where: { team_id: this.teamId },\n include: ['ids'],\n });\n stats.teamDocuments = teamResults.ids?.length || 0;\n }\n\n stats.totalDocuments = stats.userDocuments + (stats.teamDocuments || 0);\n\n return stats;\n } catch (error: unknown) {\n this.logger.error('Failed to get stats', error);\n throw error;\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
import { fileURLToPath as __fileURLToPath } from 'url';
|
|
2
|
+
import { dirname as __pathDirname } from 'path';
|
|
3
|
+
const __filename = __fileURLToPath(import.meta.url);
|
|
4
|
+
const __dirname = __pathDirname(__filename);
|
|
5
|
+
import { logger } from "../core/monitoring/logger.js";
|
|
6
|
+
const DEFAULT_CONFIG = {
|
|
7
|
+
enabled: !!process.env.DIFFMEM_ENDPOINT,
|
|
8
|
+
endpoint: process.env.DIFFMEM_ENDPOINT || "http://localhost:3100",
|
|
9
|
+
autoFetchCategories: ["preference", "expertise", "pattern"],
|
|
10
|
+
autoLearnEnabled: true,
|
|
11
|
+
learningConfidenceThreshold: 0.7,
|
|
12
|
+
maxMemoriesPerSession: 50
|
|
13
|
+
};
|
|
14
|
+
class DiffMemHooks {
|
|
15
|
+
config;
|
|
16
|
+
fetchedMemories = [];
|
|
17
|
+
learningBuffer = [];
|
|
18
|
+
isConnected = false;
|
|
19
|
+
frameManager;
|
|
20
|
+
sessionStartTime = 0;
|
|
21
|
+
constructor(config = {}) {
|
|
22
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Register session hooks with the event emitter
|
|
26
|
+
*/
|
|
27
|
+
register(emitter, frameManager) {
|
|
28
|
+
this.frameManager = frameManager;
|
|
29
|
+
if (!this.config.enabled) {
|
|
30
|
+
logger.debug("DiffMem hooks disabled - skipping registration");
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
emitter.registerHandler("session_start", this.onSessionStart.bind(this));
|
|
34
|
+
emitter.registerHandler("session_end", this.onSessionEnd.bind(this));
|
|
35
|
+
logger.info("DiffMem hooks registered", {
|
|
36
|
+
endpoint: this.config.endpoint,
|
|
37
|
+
autoFetchCategories: this.config.autoFetchCategories,
|
|
38
|
+
autoLearnEnabled: this.config.autoLearnEnabled
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Handle session start - fetch user knowledge
|
|
43
|
+
*/
|
|
44
|
+
async onSessionStart(event) {
|
|
45
|
+
const sessionEvent = event;
|
|
46
|
+
this.sessionStartTime = Date.now();
|
|
47
|
+
try {
|
|
48
|
+
const status = await this.checkStatus();
|
|
49
|
+
this.isConnected = status.connected;
|
|
50
|
+
if (!this.isConnected) {
|
|
51
|
+
logger.debug("DiffMem not available - skipping memory fetch");
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const query = {
|
|
55
|
+
categories: this.config.autoFetchCategories,
|
|
56
|
+
limit: this.config.maxMemoriesPerSession,
|
|
57
|
+
minConfidence: this.config.learningConfidenceThreshold
|
|
58
|
+
};
|
|
59
|
+
this.fetchedMemories = await this.fetchMemories(query);
|
|
60
|
+
if (this.frameManager && this.fetchedMemories.length > 0) {
|
|
61
|
+
await this.injectAsAnchors(sessionEvent.data.sessionId);
|
|
62
|
+
}
|
|
63
|
+
logger.info("DiffMem session start completed", {
|
|
64
|
+
memoriesFetched: this.fetchedMemories.length,
|
|
65
|
+
sessionId: sessionEvent.data.sessionId
|
|
66
|
+
});
|
|
67
|
+
} catch (error) {
|
|
68
|
+
logger.warn("DiffMem session start failed", {
|
|
69
|
+
error: error instanceof Error ? error.message : String(error)
|
|
70
|
+
});
|
|
71
|
+
this.isConnected = false;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Handle session end - sync buffered learnings
|
|
76
|
+
*/
|
|
77
|
+
async onSessionEnd(event) {
|
|
78
|
+
const sessionEvent = event;
|
|
79
|
+
if (!this.config.autoLearnEnabled || this.learningBuffer.length === 0) {
|
|
80
|
+
logger.debug("No learnings to sync on session end");
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
if (!this.isConnected) {
|
|
84
|
+
const status = await this.checkStatus();
|
|
85
|
+
if (!status.connected) {
|
|
86
|
+
logger.warn("DiffMem not available - learnings not synced", {
|
|
87
|
+
bufferedCount: this.learningBuffer.length
|
|
88
|
+
});
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
this.isConnected = true;
|
|
92
|
+
}
|
|
93
|
+
try {
|
|
94
|
+
await this.syncLearnings();
|
|
95
|
+
const sessionDuration = Date.now() - this.sessionStartTime;
|
|
96
|
+
logger.info("DiffMem session end completed", {
|
|
97
|
+
learningSynced: this.learningBuffer.length,
|
|
98
|
+
sessionId: sessionEvent.data.sessionId,
|
|
99
|
+
sessionDurationMs: sessionDuration
|
|
100
|
+
});
|
|
101
|
+
this.learningBuffer = [];
|
|
102
|
+
} catch (error) {
|
|
103
|
+
logger.warn("DiffMem session end sync failed", {
|
|
104
|
+
error: error instanceof Error ? error.message : String(error),
|
|
105
|
+
bufferedCount: this.learningBuffer.length
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Record a learning during session
|
|
111
|
+
*/
|
|
112
|
+
recordLearning(insight) {
|
|
113
|
+
if (!this.config.autoLearnEnabled) {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
if (insight.confidence < this.config.learningConfidenceThreshold) {
|
|
117
|
+
logger.debug("Learning below confidence threshold", {
|
|
118
|
+
confidence: insight.confidence,
|
|
119
|
+
threshold: this.config.learningConfidenceThreshold
|
|
120
|
+
});
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
const learning = {
|
|
124
|
+
...insight,
|
|
125
|
+
timestamp: Date.now()
|
|
126
|
+
};
|
|
127
|
+
this.learningBuffer.push(learning);
|
|
128
|
+
logger.debug("Learning recorded", {
|
|
129
|
+
category: learning.category,
|
|
130
|
+
confidence: learning.confidence,
|
|
131
|
+
bufferSize: this.learningBuffer.length
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Get fetched memories
|
|
136
|
+
*/
|
|
137
|
+
getUserKnowledge() {
|
|
138
|
+
return [...this.fetchedMemories];
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Format memories for LLM context with token budget
|
|
142
|
+
*/
|
|
143
|
+
formatForContext(maxTokens = 2e3) {
|
|
144
|
+
if (this.fetchedMemories.length === 0) {
|
|
145
|
+
return "";
|
|
146
|
+
}
|
|
147
|
+
const sortedMemories = [...this.fetchedMemories].sort((a, b) => {
|
|
148
|
+
if (b.confidence !== a.confidence) {
|
|
149
|
+
return b.confidence - a.confidence;
|
|
150
|
+
}
|
|
151
|
+
return b.timestamp - a.timestamp;
|
|
152
|
+
});
|
|
153
|
+
const sections = /* @__PURE__ */ new Map();
|
|
154
|
+
for (const memory of sortedMemories) {
|
|
155
|
+
const category = memory.category;
|
|
156
|
+
if (!sections.has(category)) {
|
|
157
|
+
sections.set(category, []);
|
|
158
|
+
}
|
|
159
|
+
const categoryMemories = sections.get(category);
|
|
160
|
+
if (categoryMemories) {
|
|
161
|
+
categoryMemories.push(memory.content);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
const lines = ["## User Knowledge"];
|
|
165
|
+
let estimatedTokens = 5;
|
|
166
|
+
const categoryLabels = {
|
|
167
|
+
preference: "Preferences",
|
|
168
|
+
expertise: "Expertise",
|
|
169
|
+
project_knowledge: "Project Knowledge",
|
|
170
|
+
pattern: "Patterns",
|
|
171
|
+
correction: "Corrections"
|
|
172
|
+
};
|
|
173
|
+
for (const [category, contents] of sections) {
|
|
174
|
+
const label = categoryLabels[category] || category;
|
|
175
|
+
const categoryHeader = `
|
|
176
|
+
### ${label}`;
|
|
177
|
+
const headerTokens = Math.ceil(categoryHeader.length / 4);
|
|
178
|
+
if (estimatedTokens + headerTokens > maxTokens) {
|
|
179
|
+
break;
|
|
180
|
+
}
|
|
181
|
+
lines.push(categoryHeader);
|
|
182
|
+
estimatedTokens += headerTokens;
|
|
183
|
+
for (const content of contents) {
|
|
184
|
+
const contentLine = `- ${content}`;
|
|
185
|
+
const contentTokens = Math.ceil(contentLine.length / 4);
|
|
186
|
+
if (estimatedTokens + contentTokens > maxTokens) {
|
|
187
|
+
lines.push("- (additional items truncated for token budget)");
|
|
188
|
+
break;
|
|
189
|
+
}
|
|
190
|
+
lines.push(contentLine);
|
|
191
|
+
estimatedTokens += contentTokens;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return lines.join("\n");
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Get current connection status
|
|
198
|
+
*/
|
|
199
|
+
getStatus() {
|
|
200
|
+
return {
|
|
201
|
+
connected: this.isConnected,
|
|
202
|
+
memoriesLoaded: this.fetchedMemories.length,
|
|
203
|
+
learningsBuffered: this.learningBuffer.length
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Update configuration
|
|
208
|
+
*/
|
|
209
|
+
updateConfig(config) {
|
|
210
|
+
this.config = { ...this.config, ...config };
|
|
211
|
+
logger.debug("DiffMem config updated", { config: this.config });
|
|
212
|
+
}
|
|
213
|
+
// Private methods
|
|
214
|
+
/**
|
|
215
|
+
* Check DiffMem service status
|
|
216
|
+
*/
|
|
217
|
+
async checkStatus() {
|
|
218
|
+
try {
|
|
219
|
+
const controller = new AbortController();
|
|
220
|
+
const timeoutId = setTimeout(() => controller.abort(), 3e3);
|
|
221
|
+
const response = await fetch(`${this.config.endpoint}/status`, {
|
|
222
|
+
method: "GET",
|
|
223
|
+
signal: controller.signal
|
|
224
|
+
});
|
|
225
|
+
clearTimeout(timeoutId);
|
|
226
|
+
if (!response.ok) {
|
|
227
|
+
return { connected: false, memoryCount: 0, lastSync: null };
|
|
228
|
+
}
|
|
229
|
+
const status = await response.json();
|
|
230
|
+
return {
|
|
231
|
+
connected: true,
|
|
232
|
+
memoryCount: status.memoryCount || 0,
|
|
233
|
+
lastSync: status.lastSync || null,
|
|
234
|
+
version: status.version
|
|
235
|
+
};
|
|
236
|
+
} catch {
|
|
237
|
+
return { connected: false, memoryCount: 0, lastSync: null };
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Fetch memories from DiffMem
|
|
242
|
+
*/
|
|
243
|
+
async fetchMemories(query) {
|
|
244
|
+
try {
|
|
245
|
+
const controller = new AbortController();
|
|
246
|
+
const timeoutId = setTimeout(() => controller.abort(), 5e3);
|
|
247
|
+
const response = await fetch(`${this.config.endpoint}/memories/query`, {
|
|
248
|
+
method: "POST",
|
|
249
|
+
headers: { "Content-Type": "application/json" },
|
|
250
|
+
body: JSON.stringify(query),
|
|
251
|
+
signal: controller.signal
|
|
252
|
+
});
|
|
253
|
+
clearTimeout(timeoutId);
|
|
254
|
+
if (!response.ok) {
|
|
255
|
+
logger.warn("DiffMem query failed", { status: response.status });
|
|
256
|
+
return [];
|
|
257
|
+
}
|
|
258
|
+
const data = await response.json();
|
|
259
|
+
return data.memories || [];
|
|
260
|
+
} catch (error) {
|
|
261
|
+
logger.debug("DiffMem fetch failed", {
|
|
262
|
+
error: error instanceof Error ? error.message : String(error)
|
|
263
|
+
});
|
|
264
|
+
return [];
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Sync buffered learnings to DiffMem
|
|
269
|
+
*/
|
|
270
|
+
async syncLearnings() {
|
|
271
|
+
if (this.learningBuffer.length === 0) {
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
const controller = new AbortController();
|
|
275
|
+
const timeoutId = setTimeout(() => controller.abort(), 1e4);
|
|
276
|
+
try {
|
|
277
|
+
const response = await fetch(`${this.config.endpoint}/memories/learn`, {
|
|
278
|
+
method: "POST",
|
|
279
|
+
headers: { "Content-Type": "application/json" },
|
|
280
|
+
body: JSON.stringify({ insights: this.learningBuffer }),
|
|
281
|
+
signal: controller.signal
|
|
282
|
+
});
|
|
283
|
+
clearTimeout(timeoutId);
|
|
284
|
+
if (!response.ok) {
|
|
285
|
+
throw new Error(`Sync failed with status ${response.status}`);
|
|
286
|
+
}
|
|
287
|
+
logger.info("Learnings synced to DiffMem", {
|
|
288
|
+
count: this.learningBuffer.length
|
|
289
|
+
});
|
|
290
|
+
} catch (error) {
|
|
291
|
+
clearTimeout(timeoutId);
|
|
292
|
+
throw error;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Inject fetched memories as frame anchors
|
|
297
|
+
*/
|
|
298
|
+
async injectAsAnchors(sessionId) {
|
|
299
|
+
if (!this.frameManager || this.fetchedMemories.length === 0) {
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
try {
|
|
303
|
+
const byCategory = /* @__PURE__ */ new Map();
|
|
304
|
+
for (const memory of this.fetchedMemories) {
|
|
305
|
+
if (!byCategory.has(memory.category)) {
|
|
306
|
+
byCategory.set(memory.category, []);
|
|
307
|
+
}
|
|
308
|
+
const categoryList = byCategory.get(memory.category);
|
|
309
|
+
if (categoryList) {
|
|
310
|
+
categoryList.push(memory);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
for (const [category, memories] of byCategory) {
|
|
314
|
+
const highConfidence = memories.filter((m) => m.confidence >= 0.8);
|
|
315
|
+
for (const memory of highConfidence.slice(0, 5)) {
|
|
316
|
+
const anchorType = this.categoryToAnchorType(category);
|
|
317
|
+
const priority = Math.round(memory.confidence * 10);
|
|
318
|
+
this.frameManager.addAnchor(anchorType, memory.content, priority, {
|
|
319
|
+
source: "diffmem",
|
|
320
|
+
category: memory.category,
|
|
321
|
+
memoryId: memory.id,
|
|
322
|
+
confidence: memory.confidence,
|
|
323
|
+
sessionId
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
logger.debug("Memories injected as anchors", {
|
|
328
|
+
totalMemories: this.fetchedMemories.length,
|
|
329
|
+
anchorsCreated: Math.min(
|
|
330
|
+
this.fetchedMemories.filter((m) => m.confidence >= 0.8).length,
|
|
331
|
+
25
|
|
332
|
+
)
|
|
333
|
+
});
|
|
334
|
+
} catch (error) {
|
|
335
|
+
logger.warn("Failed to inject memories as anchors", {
|
|
336
|
+
error: error instanceof Error ? error.message : String(error)
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Map memory category to anchor type
|
|
342
|
+
*/
|
|
343
|
+
categoryToAnchorType(category) {
|
|
344
|
+
switch (category) {
|
|
345
|
+
case "preference":
|
|
346
|
+
return "CONSTRAINT";
|
|
347
|
+
case "expertise":
|
|
348
|
+
return "FACT";
|
|
349
|
+
case "project_knowledge":
|
|
350
|
+
return "FACT";
|
|
351
|
+
case "pattern":
|
|
352
|
+
return "INTERFACE_CONTRACT";
|
|
353
|
+
case "correction":
|
|
354
|
+
return "DECISION";
|
|
355
|
+
default:
|
|
356
|
+
return "FACT";
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
let instance = null;
|
|
361
|
+
function getDiffMemHooks(config) {
|
|
362
|
+
if (!instance) {
|
|
363
|
+
instance = new DiffMemHooks(config);
|
|
364
|
+
} else if (config) {
|
|
365
|
+
instance.updateConfig(config);
|
|
366
|
+
}
|
|
367
|
+
return instance;
|
|
368
|
+
}
|
|
369
|
+
function resetDiffMemHooks() {
|
|
370
|
+
instance = null;
|
|
371
|
+
}
|
|
372
|
+
export {
|
|
373
|
+
DiffMemHooks,
|
|
374
|
+
getDiffMemHooks,
|
|
375
|
+
resetDiffMemHooks
|
|
376
|
+
};
|
|
377
|
+
//# sourceMappingURL=diffmem-hooks.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/hooks/diffmem-hooks.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * DiffMem Session Hooks\n * Integrates DiffMem user memory with StackMemory session lifecycle\n */\n\nimport { logger } from '../core/monitoring/logger.js';\nimport type { HookEventEmitter, HookEventData } from './events.js';\nimport type { RefactoredFrameManager } from '../core/context/refactored-frame-manager.js';\nimport type {\n UserMemory,\n MemoryQuery,\n LearnedInsight,\n DiffMemStatus,\n} from '../integrations/diffmem/types.js';\n\nexport interface DiffMemHookConfig {\n enabled: boolean;\n endpoint: string;\n autoFetchCategories: string[];\n autoLearnEnabled: boolean;\n learningConfidenceThreshold: number;\n maxMemoriesPerSession: number;\n}\n\ninterface SessionStartEvent extends HookEventData {\n type: 'session_start';\n data: {\n sessionId?: string;\n projectId?: string;\n context?: Record<string, unknown>;\n };\n}\n\ninterface SessionEndEvent extends HookEventData {\n type: 'session_end';\n data: {\n sessionId?: string;\n duration?: number;\n exitCode?: number | null;\n };\n}\n\nconst DEFAULT_CONFIG: DiffMemHookConfig = {\n enabled: !!process.env.DIFFMEM_ENDPOINT,\n endpoint: process.env.DIFFMEM_ENDPOINT || 'http://localhost:3100',\n autoFetchCategories: ['preference', 'expertise', 'pattern'],\n autoLearnEnabled: true,\n learningConfidenceThreshold: 0.7,\n maxMemoriesPerSession: 50,\n};\n\n/**\n * DiffMem Session Hooks\n * Manages user memory fetch on session start and sync on session end\n */\nexport class DiffMemHooks {\n private config: DiffMemHookConfig;\n private fetchedMemories: UserMemory[] = [];\n private learningBuffer: LearnedInsight[] = [];\n private isConnected: boolean = false;\n private frameManager?: RefactoredFrameManager;\n private sessionStartTime: number = 0;\n\n constructor(config: Partial<DiffMemHookConfig> = {}) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Register session hooks with the event emitter\n */\n register(\n emitter: HookEventEmitter,\n frameManager?: RefactoredFrameManager\n ): void {\n this.frameManager = frameManager;\n\n if (!this.config.enabled) {\n logger.debug('DiffMem hooks disabled - skipping registration');\n return;\n }\n\n emitter.registerHandler('session_start', this.onSessionStart.bind(this));\n emitter.registerHandler('session_end', this.onSessionEnd.bind(this));\n\n logger.info('DiffMem hooks registered', {\n endpoint: this.config.endpoint,\n autoFetchCategories: this.config.autoFetchCategories,\n autoLearnEnabled: this.config.autoLearnEnabled,\n });\n }\n\n /**\n * Handle session start - fetch user knowledge\n */\n async onSessionStart(event: HookEventData): Promise<void> {\n const sessionEvent = event as SessionStartEvent;\n this.sessionStartTime = Date.now();\n\n try {\n // Check DiffMem connectivity\n const status = await this.checkStatus();\n this.isConnected = status.connected;\n\n if (!this.isConnected) {\n logger.debug('DiffMem not available - skipping memory fetch');\n return;\n }\n\n // Fetch user memories for configured categories\n const query: MemoryQuery = {\n categories: this.config.autoFetchCategories,\n limit: this.config.maxMemoriesPerSession,\n minConfidence: this.config.learningConfidenceThreshold,\n };\n\n this.fetchedMemories = await this.fetchMemories(query);\n\n // Inject as frame anchors if frame manager available\n if (this.frameManager && this.fetchedMemories.length > 0) {\n await this.injectAsAnchors(sessionEvent.data.sessionId);\n }\n\n logger.info('DiffMem session start completed', {\n memoriesFetched: this.fetchedMemories.length,\n sessionId: sessionEvent.data.sessionId,\n });\n } catch (error) {\n // Graceful degradation - log and continue\n logger.warn('DiffMem session start failed', {\n error: error instanceof Error ? error.message : String(error),\n });\n this.isConnected = false;\n }\n }\n\n /**\n * Handle session end - sync buffered learnings\n */\n async onSessionEnd(event: HookEventData): Promise<void> {\n const sessionEvent = event as SessionEndEvent;\n\n if (!this.config.autoLearnEnabled || this.learningBuffer.length === 0) {\n logger.debug('No learnings to sync on session end');\n return;\n }\n\n if (!this.isConnected) {\n // Try to reconnect before giving up\n const status = await this.checkStatus();\n if (!status.connected) {\n logger.warn('DiffMem not available - learnings not synced', {\n bufferedCount: this.learningBuffer.length,\n });\n return;\n }\n this.isConnected = true;\n }\n\n try {\n await this.syncLearnings();\n\n const sessionDuration = Date.now() - this.sessionStartTime;\n logger.info('DiffMem session end completed', {\n learningSynced: this.learningBuffer.length,\n sessionId: sessionEvent.data.sessionId,\n sessionDurationMs: sessionDuration,\n });\n\n // Clear buffer after successful sync\n this.learningBuffer = [];\n } catch (error) {\n logger.warn('DiffMem session end sync failed', {\n error: error instanceof Error ? error.message : String(error),\n bufferedCount: this.learningBuffer.length,\n });\n }\n }\n\n /**\n * Record a learning during session\n */\n recordLearning(insight: Omit<LearnedInsight, 'timestamp'>): void {\n if (!this.config.autoLearnEnabled) {\n return;\n }\n\n // Filter by confidence threshold\n if (insight.confidence < this.config.learningConfidenceThreshold) {\n logger.debug('Learning below confidence threshold', {\n confidence: insight.confidence,\n threshold: this.config.learningConfidenceThreshold,\n });\n return;\n }\n\n const learning: LearnedInsight = {\n ...insight,\n timestamp: Date.now(),\n };\n\n this.learningBuffer.push(learning);\n\n logger.debug('Learning recorded', {\n category: learning.category,\n confidence: learning.confidence,\n bufferSize: this.learningBuffer.length,\n });\n }\n\n /**\n * Get fetched memories\n */\n getUserKnowledge(): UserMemory[] {\n return [...this.fetchedMemories];\n }\n\n /**\n * Format memories for LLM context with token budget\n */\n formatForContext(maxTokens: number = 2000): string {\n if (this.fetchedMemories.length === 0) {\n return '';\n }\n\n // Sort by confidence (highest first) then by timestamp (newest first)\n const sortedMemories = [...this.fetchedMemories].sort((a, b) => {\n if (b.confidence !== a.confidence) {\n return b.confidence - a.confidence;\n }\n return b.timestamp - a.timestamp;\n });\n\n const sections: Map<string, string[]> = new Map();\n\n // Group by category\n for (const memory of sortedMemories) {\n const category = memory.category;\n if (!sections.has(category)) {\n sections.set(category, []);\n }\n const categoryMemories = sections.get(category);\n if (categoryMemories) {\n categoryMemories.push(memory.content);\n }\n }\n\n // Build output with token estimation (~4 chars per token)\n const lines: string[] = ['## User Knowledge'];\n let estimatedTokens = 5; // Header\n\n const categoryLabels: Record<string, string> = {\n preference: 'Preferences',\n expertise: 'Expertise',\n project_knowledge: 'Project Knowledge',\n pattern: 'Patterns',\n correction: 'Corrections',\n };\n\n for (const [category, contents] of sections) {\n const label = categoryLabels[category] || category;\n const categoryHeader = `\\n### ${label}`;\n const headerTokens = Math.ceil(categoryHeader.length / 4);\n\n if (estimatedTokens + headerTokens > maxTokens) {\n break;\n }\n\n lines.push(categoryHeader);\n estimatedTokens += headerTokens;\n\n for (const content of contents) {\n const contentLine = `- ${content}`;\n const contentTokens = Math.ceil(contentLine.length / 4);\n\n if (estimatedTokens + contentTokens > maxTokens) {\n lines.push('- (additional items truncated for token budget)');\n break;\n }\n\n lines.push(contentLine);\n estimatedTokens += contentTokens;\n }\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Get current connection status\n */\n getStatus(): {\n connected: boolean;\n memoriesLoaded: number;\n learningsBuffered: number;\n } {\n return {\n connected: this.isConnected,\n memoriesLoaded: this.fetchedMemories.length,\n learningsBuffered: this.learningBuffer.length,\n };\n }\n\n /**\n * Update configuration\n */\n updateConfig(config: Partial<DiffMemHookConfig>): void {\n this.config = { ...this.config, ...config };\n logger.debug('DiffMem config updated', { config: this.config });\n }\n\n // Private methods\n\n /**\n * Check DiffMem service status\n */\n private async checkStatus(): Promise<DiffMemStatus> {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 3000);\n\n const response = await fetch(`${this.config.endpoint}/status`, {\n method: 'GET',\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n return { connected: false, memoryCount: 0, lastSync: null };\n }\n\n const status = await response.json();\n return {\n connected: true,\n memoryCount: status.memoryCount || 0,\n lastSync: status.lastSync || null,\n version: status.version,\n };\n } catch {\n return { connected: false, memoryCount: 0, lastSync: null };\n }\n }\n\n /**\n * Fetch memories from DiffMem\n */\n private async fetchMemories(query: MemoryQuery): Promise<UserMemory[]> {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 5000);\n\n const response = await fetch(`${this.config.endpoint}/memories/query`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(query),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n logger.warn('DiffMem query failed', { status: response.status });\n return [];\n }\n\n const data = await response.json();\n return data.memories || [];\n } catch (error) {\n logger.debug('DiffMem fetch failed', {\n error: error instanceof Error ? error.message : String(error),\n });\n return [];\n }\n }\n\n /**\n * Sync buffered learnings to DiffMem\n */\n private async syncLearnings(): Promise<void> {\n if (this.learningBuffer.length === 0) {\n return;\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 10000);\n\n try {\n const response = await fetch(`${this.config.endpoint}/memories/learn`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ insights: this.learningBuffer }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw new Error(`Sync failed with status ${response.status}`);\n }\n\n logger.info('Learnings synced to DiffMem', {\n count: this.learningBuffer.length,\n });\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n /**\n * Inject fetched memories as frame anchors\n */\n private async injectAsAnchors(sessionId?: string): Promise<void> {\n if (!this.frameManager || this.fetchedMemories.length === 0) {\n return;\n }\n\n try {\n // Group by category for efficient anchor creation\n const byCategory = new Map<string, UserMemory[]>();\n for (const memory of this.fetchedMemories) {\n if (!byCategory.has(memory.category)) {\n byCategory.set(memory.category, []);\n }\n const categoryList = byCategory.get(memory.category);\n if (categoryList) {\n categoryList.push(memory);\n }\n }\n\n // Create anchors for high-confidence memories\n for (const [category, memories] of byCategory) {\n const highConfidence = memories.filter((m) => m.confidence >= 0.8);\n\n for (const memory of highConfidence.slice(0, 5)) {\n const anchorType = this.categoryToAnchorType(category);\n const priority = Math.round(memory.confidence * 10);\n\n this.frameManager.addAnchor(anchorType, memory.content, priority, {\n source: 'diffmem',\n category: memory.category,\n memoryId: memory.id,\n confidence: memory.confidence,\n sessionId,\n });\n }\n }\n\n logger.debug('Memories injected as anchors', {\n totalMemories: this.fetchedMemories.length,\n anchorsCreated: Math.min(\n this.fetchedMemories.filter((m) => m.confidence >= 0.8).length,\n 25\n ),\n });\n } catch (error) {\n logger.warn('Failed to inject memories as anchors', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n /**\n * Map memory category to anchor type\n */\n private categoryToAnchorType(\n category: string\n ):\n | 'FACT'\n | 'DECISION'\n | 'CONSTRAINT'\n | 'INTERFACE_CONTRACT'\n | 'TODO'\n | 'RISK' {\n switch (category) {\n case 'preference':\n return 'CONSTRAINT';\n case 'expertise':\n return 'FACT';\n case 'project_knowledge':\n return 'FACT';\n case 'pattern':\n return 'INTERFACE_CONTRACT';\n case 'correction':\n return 'DECISION';\n default:\n return 'FACT';\n }\n }\n}\n\n// Singleton instance\nlet instance: DiffMemHooks | null = null;\n\n/**\n * Get the singleton DiffMemHooks instance\n */\nexport function getDiffMemHooks(\n config?: Partial<DiffMemHookConfig>\n): DiffMemHooks {\n if (!instance) {\n instance = new DiffMemHooks(config);\n } else if (config) {\n instance.updateConfig(config);\n }\n return instance;\n}\n\n/**\n * Reset the singleton (for testing)\n */\nexport function resetDiffMemHooks(): void {\n instance = null;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|