@astragenie/astramemory-local 0.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +341 -0
- package/README.md +419 -0
- package/dist/backup/retention.d.ts +15 -0
- package/dist/backup/retention.js +62 -0
- package/dist/backup/retention.js.map +1 -0
- package/dist/backup/snapshot.d.ts +21 -0
- package/dist/backup/snapshot.js +55 -0
- package/dist/backup/snapshot.js.map +1 -0
- package/dist/backup/verify.d.ts +23 -0
- package/dist/backup/verify.js +77 -0
- package/dist/backup/verify.js.map +1 -0
- package/dist/budget/tracker.d.ts +58 -0
- package/dist/budget/tracker.js +102 -0
- package/dist/budget/tracker.js.map +1 -0
- package/dist/capture/codex.d.ts +63 -0
- package/dist/capture/codex.js +0 -0
- package/dist/capture/codex.js.map +1 -0
- package/dist/cli/backup.d.ts +1 -0
- package/dist/cli/backup.js +112 -0
- package/dist/cli/backup.js.map +1 -0
- package/dist/cli/budget.d.ts +7 -0
- package/dist/cli/budget.js +44 -0
- package/dist/cli/budget.js.map +1 -0
- package/dist/cli/capture.d.ts +10 -0
- package/dist/cli/capture.js +113 -0
- package/dist/cli/capture.js.map +1 -0
- package/dist/cli/consolidate.d.ts +16 -0
- package/dist/cli/consolidate.js +146 -0
- package/dist/cli/consolidate.js.map +1 -0
- package/dist/cli/doctor.d.ts +1 -0
- package/dist/cli/doctor.js +54 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/entity-backfill.d.ts +10 -0
- package/dist/cli/entity-backfill.js +46 -0
- package/dist/cli/entity-backfill.js.map +1 -0
- package/dist/cli/hook-install.d.ts +45 -0
- package/dist/cli/hook-install.js +77 -0
- package/dist/cli/hook-install.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +312 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +16 -0
- package/dist/cli/init.js +431 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/mcp-stdio.d.ts +18 -0
- package/dist/cli/mcp-stdio.js +67 -0
- package/dist/cli/mcp-stdio.js.map +1 -0
- package/dist/cli/memory.d.ts +15 -0
- package/dist/cli/memory.js +52 -0
- package/dist/cli/memory.js.map +1 -0
- package/dist/cli/open-runtime-db.d.ts +15 -0
- package/dist/cli/open-runtime-db.js +37 -0
- package/dist/cli/open-runtime-db.js.map +1 -0
- package/dist/cli/pair.d.ts +29 -0
- package/dist/cli/pair.js +64 -0
- package/dist/cli/pair.js.map +1 -0
- package/dist/cli/providers.d.ts +10 -0
- package/dist/cli/providers.js +97 -0
- package/dist/cli/providers.js.map +1 -0
- package/dist/cli/queue-purge.d.ts +5 -0
- package/dist/cli/queue-purge.js +92 -0
- package/dist/cli/queue-purge.js.map +1 -0
- package/dist/cli/queue.d.ts +29 -0
- package/dist/cli/queue.js +73 -0
- package/dist/cli/queue.js.map +1 -0
- package/dist/cli/rebuild.d.ts +15 -0
- package/dist/cli/rebuild.js +70 -0
- package/dist/cli/rebuild.js.map +1 -0
- package/dist/cli/reembed-dim.d.ts +21 -0
- package/dist/cli/reembed-dim.js +199 -0
- package/dist/cli/reembed-dim.js.map +1 -0
- package/dist/cli/reinstall.d.ts +1 -0
- package/dist/cli/reinstall.js +205 -0
- package/dist/cli/reinstall.js.map +1 -0
- package/dist/cli/restore.d.ts +1 -0
- package/dist/cli/restore.js +167 -0
- package/dist/cli/restore.js.map +1 -0
- package/dist/cli/retag.d.ts +14 -0
- package/dist/cli/retag.js +62 -0
- package/dist/cli/retag.js.map +1 -0
- package/dist/cli/search.d.ts +66 -0
- package/dist/cli/search.js +174 -0
- package/dist/cli/search.js.map +1 -0
- package/dist/cli/serve.d.ts +9 -0
- package/dist/cli/serve.js +364 -0
- package/dist/cli/serve.js.map +1 -0
- package/dist/cli/service.d.ts +1 -0
- package/dist/cli/service.js +121 -0
- package/dist/cli/service.js.map +1 -0
- package/dist/cli/sync.d.ts +15 -0
- package/dist/cli/sync.js +61 -0
- package/dist/cli/sync.js.map +1 -0
- package/dist/cli/token.d.ts +24 -0
- package/dist/cli/token.js +77 -0
- package/dist/cli/token.js.map +1 -0
- package/dist/cli/wait-health.d.ts +4 -0
- package/dist/cli/wait-health.js +23 -0
- package/dist/cli/wait-health.js.map +1 -0
- package/dist/config/config.d.ts +127 -0
- package/dist/config/config.js +38 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/datadir.d.ts +30 -0
- package/dist/config/datadir.js +65 -0
- package/dist/config/datadir.js.map +1 -0
- package/dist/config/loader.d.ts +23 -0
- package/dist/config/loader.js +102 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/migrate-dirs.d.ts +36 -0
- package/dist/config/migrate-dirs.js +132 -0
- package/dist/config/migrate-dirs.js.map +1 -0
- package/dist/config/persist-envs.d.ts +23 -0
- package/dist/config/persist-envs.js +119 -0
- package/dist/config/persist-envs.js.map +1 -0
- package/dist/config/resolve-runtime.d.ts +19 -0
- package/dist/config/resolve-runtime.js +53 -0
- package/dist/config/resolve-runtime.js.map +1 -0
- package/dist/config/secrets.d.ts +28 -0
- package/dist/config/secrets.js +38 -0
- package/dist/config/secrets.js.map +1 -0
- package/dist/config/sync-settings.d.ts +16 -0
- package/dist/config/sync-settings.js +34 -0
- package/dist/config/sync-settings.js.map +1 -0
- package/dist/config/writer.d.ts +19 -0
- package/dist/config/writer.js +121 -0
- package/dist/config/writer.js.map +1 -0
- package/dist/consolidate/consolidate.d.ts +80 -0
- package/dist/consolidate/consolidate.js +0 -0
- package/dist/consolidate/consolidate.js.map +1 -0
- package/dist/consolidate/proposals.d.ts +35 -0
- package/dist/consolidate/proposals.js +66 -0
- package/dist/consolidate/proposals.js.map +1 -0
- package/dist/contracts/atom-wire.d.ts +48 -0
- package/dist/contracts/atom-wire.js +55 -0
- package/dist/contracts/atom-wire.js.map +1 -0
- package/dist/contracts/embed.d.ts +41 -0
- package/dist/contracts/embed.js +20 -0
- package/dist/contracts/embed.js.map +1 -0
- package/dist/contracts/index.d.ts +5 -0
- package/dist/contracts/index.js +6 -0
- package/dist/contracts/index.js.map +1 -0
- package/dist/contracts/job.d.ts +113 -0
- package/dist/contracts/job.js +32 -0
- package/dist/contracts/job.js.map +1 -0
- package/dist/contracts/llm.d.ts +30 -0
- package/dist/contracts/llm.js +2 -0
- package/dist/contracts/llm.js.map +1 -0
- package/dist/contracts/memory.d.ts +47 -0
- package/dist/contracts/memory.js +5 -0
- package/dist/contracts/memory.js.map +1 -0
- package/dist/contracts/vector.d.ts +29 -0
- package/dist/contracts/vector.js +2 -0
- package/dist/contracts/vector.js.map +1 -0
- package/dist/distill/flatten-turns.d.ts +1 -0
- package/dist/distill/flatten-turns.js +50 -0
- package/dist/distill/flatten-turns.js.map +1 -0
- package/dist/distill/pipeline.d.ts +45 -0
- package/dist/distill/pipeline.js +113 -0
- package/dist/distill/pipeline.js.map +1 -0
- package/dist/distill/prompts/extract.d.ts +122 -0
- package/dist/distill/prompts/extract.js +67 -0
- package/dist/distill/prompts/extract.js.map +1 -0
- package/dist/distill/stages/01-cleanup.d.ts +9 -0
- package/dist/distill/stages/01-cleanup.js +67 -0
- package/dist/distill/stages/01-cleanup.js.map +1 -0
- package/dist/distill/stages/02-normalize.d.ts +9 -0
- package/dist/distill/stages/02-normalize.js +76 -0
- package/dist/distill/stages/02-normalize.js.map +1 -0
- package/dist/distill/stages/03-chunk.d.ts +22 -0
- package/dist/distill/stages/03-chunk.js +138 -0
- package/dist/distill/stages/03-chunk.js.map +1 -0
- package/dist/distill/stages/04-compact.d.ts +28 -0
- package/dist/distill/stages/04-compact.js +69 -0
- package/dist/distill/stages/04-compact.js.map +1 -0
- package/dist/distill/stages/05-extract.d.ts +35 -0
- package/dist/distill/stages/05-extract.js +101 -0
- package/dist/distill/stages/05-extract.js.map +1 -0
- package/dist/distill/stages/06-reduce.d.ts +16 -0
- package/dist/distill/stages/06-reduce.js +30 -0
- package/dist/distill/stages/06-reduce.js.map +1 -0
- package/dist/distill/stages/07-memory-normalize.d.ts +27 -0
- package/dist/distill/stages/07-memory-normalize.js +65 -0
- package/dist/distill/stages/07-memory-normalize.js.map +1 -0
- package/dist/distill/stages/08-embed-index.d.ts +31 -0
- package/dist/distill/stages/08-embed-index.js +82 -0
- package/dist/distill/stages/08-embed-index.js.map +1 -0
- package/dist/doctor/checks.d.ts +77 -0
- package/dist/doctor/checks.js +626 -0
- package/dist/doctor/checks.js.map +1 -0
- package/dist/doctor/hardening-checks.d.ts +9 -0
- package/dist/doctor/hardening-checks.js +182 -0
- package/dist/doctor/hardening-checks.js.map +1 -0
- package/dist/doctor/probes/embed-probe.d.ts +19 -0
- package/dist/doctor/probes/embed-probe.js +47 -0
- package/dist/doctor/probes/embed-probe.js.map +1 -0
- package/dist/doctor/probes/llm-chat-probe.d.ts +11 -0
- package/dist/doctor/probes/llm-chat-probe.js +41 -0
- package/dist/doctor/probes/llm-chat-probe.js.map +1 -0
- package/dist/doctor/probes/plugin-coexistence.d.ts +14 -0
- package/dist/doctor/probes/plugin-coexistence.js +60 -0
- package/dist/doctor/probes/plugin-coexistence.js.map +1 -0
- package/dist/doctor/runner.d.ts +17 -0
- package/dist/doctor/runner.js +53 -0
- package/dist/doctor/runner.js.map +1 -0
- package/dist/doctor/types.d.ts +12 -0
- package/dist/doctor/types.js +2 -0
- package/dist/doctor/types.js.map +1 -0
- package/dist/entity/backfill.d.ts +30 -0
- package/dist/entity/backfill.js +55 -0
- package/dist/entity/backfill.js.map +1 -0
- package/dist/entity/extract-entities.d.ts +27 -0
- package/dist/entity/extract-entities.js +86 -0
- package/dist/entity/extract-entities.js.map +1 -0
- package/dist/entity/normalize.d.ts +17 -0
- package/dist/entity/normalize.js +20 -0
- package/dist/entity/normalize.js.map +1 -0
- package/dist/eval/harness.d.ts +96 -0
- package/dist/eval/harness.js +119 -0
- package/dist/eval/harness.js.map +1 -0
- package/dist/eval/metrics.d.ts +23 -0
- package/dist/eval/metrics.js +44 -0
- package/dist/eval/metrics.js.map +1 -0
- package/dist/log/correlation.d.ts +24 -0
- package/dist/log/correlation.js +33 -0
- package/dist/log/correlation.js.map +1 -0
- package/dist/log/logger.d.ts +38 -0
- package/dist/log/logger.js +129 -0
- package/dist/log/logger.js.map +1 -0
- package/dist/log/scrub.d.ts +33 -0
- package/dist/log/scrub.js +91 -0
- package/dist/log/scrub.js.map +1 -0
- package/dist/mcp/server.d.ts +36 -0
- package/dist/mcp/server.js +553 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/memory-tool/adapter.d.ts +73 -0
- package/dist/memory-tool/adapter.js +269 -0
- package/dist/memory-tool/adapter.js.map +1 -0
- package/dist/pipeline/errors.d.ts +21 -0
- package/dist/pipeline/errors.js +34 -0
- package/dist/pipeline/errors.js.map +1 -0
- package/dist/pipeline/failure-classifier.d.ts +13 -0
- package/dist/pipeline/failure-classifier.js +72 -0
- package/dist/pipeline/failure-classifier.js.map +1 -0
- package/dist/pipeline/handler-ctx-ext.d.ts +23 -0
- package/dist/pipeline/handler-ctx-ext.js +19 -0
- package/dist/pipeline/handler-ctx-ext.js.map +1 -0
- package/dist/pipeline/handler.d.ts +20 -0
- package/dist/pipeline/handler.js +2 -0
- package/dist/pipeline/handler.js.map +1 -0
- package/dist/pipeline/handlers/cleanup.d.ts +14 -0
- package/dist/pipeline/handlers/cleanup.js +47 -0
- package/dist/pipeline/handlers/cleanup.js.map +1 -0
- package/dist/pipeline/handlers/consolidate.d.ts +8 -0
- package/dist/pipeline/handlers/consolidate.js +23 -0
- package/dist/pipeline/handlers/consolidate.js.map +1 -0
- package/dist/pipeline/handlers/distill-events.d.ts +15 -0
- package/dist/pipeline/handlers/distill-events.js +134 -0
- package/dist/pipeline/handlers/distill-events.js.map +1 -0
- package/dist/pipeline/handlers/distill.d.ts +17 -0
- package/dist/pipeline/handlers/distill.js +110 -0
- package/dist/pipeline/handlers/distill.js.map +1 -0
- package/dist/pipeline/handlers/reembed.d.ts +10 -0
- package/dist/pipeline/handlers/reembed.js +34 -0
- package/dist/pipeline/handlers/reembed.js.map +1 -0
- package/dist/pipeline/job-repo.d.ts +86 -0
- package/dist/pipeline/job-repo.js +168 -0
- package/dist/pipeline/job-repo.js.map +1 -0
- package/dist/pipeline/mock-providers.d.ts +49 -0
- package/dist/pipeline/mock-providers.js +175 -0
- package/dist/pipeline/mock-providers.js.map +1 -0
- package/dist/pipeline/registry.d.ts +15 -0
- package/dist/pipeline/registry.js +20 -0
- package/dist/pipeline/registry.js.map +1 -0
- package/dist/pipeline/worker.d.ts +41 -0
- package/dist/pipeline/worker.js +167 -0
- package/dist/pipeline/worker.js.map +1 -0
- package/dist/providers/embed/azure-openai.d.ts +25 -0
- package/dist/providers/embed/azure-openai.js +138 -0
- package/dist/providers/embed/azure-openai.js.map +1 -0
- package/dist/providers/embed/ollama.d.ts +17 -0
- package/dist/providers/embed/ollama.js +106 -0
- package/dist/providers/embed/ollama.js.map +1 -0
- package/dist/providers/index.d.ts +19 -0
- package/dist/providers/index.js +72 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/llm/azure-openai.d.ts +20 -0
- package/dist/providers/llm/azure-openai.js +135 -0
- package/dist/providers/llm/azure-openai.js.map +1 -0
- package/dist/providers/llm/ollama.d.ts +13 -0
- package/dist/providers/llm/ollama.js +113 -0
- package/dist/providers/llm/ollama.js.map +1 -0
- package/dist/providers/llm/pricing.d.ts +21 -0
- package/dist/providers/llm/pricing.js +22 -0
- package/dist/providers/llm/pricing.js.map +1 -0
- package/dist/recall/pack.d.ts +32 -0
- package/dist/recall/pack.js +90 -0
- package/dist/recall/pack.js.map +1 -0
- package/dist/recall/policy.d.ts +39 -0
- package/dist/recall/policy.js +96 -0
- package/dist/recall/policy.js.map +1 -0
- package/dist/redact/detectors.d.ts +20 -0
- package/dist/redact/detectors.js +85 -0
- package/dist/redact/detectors.js.map +1 -0
- package/dist/redact/entropy.d.ts +24 -0
- package/dist/redact/entropy.js +77 -0
- package/dist/redact/entropy.js.map +1 -0
- package/dist/redact/index.d.ts +47 -0
- package/dist/redact/index.js +165 -0
- package/dist/redact/index.js.map +1 -0
- package/dist/search/fuse.d.ts +108 -0
- package/dist/search/fuse.js +135 -0
- package/dist/search/fuse.js.map +1 -0
- package/dist/search/query.d.ts +28 -0
- package/dist/search/query.js +70 -0
- package/dist/search/query.js.map +1 -0
- package/dist/search/search.d.ts +164 -0
- package/dist/search/search.js +310 -0
- package/dist/search/search.js.map +1 -0
- package/dist/server/app.d.ts +17 -0
- package/dist/server/app.js +133 -0
- package/dist/server/app.js.map +1 -0
- package/dist/server/health-state.d.ts +29 -0
- package/dist/server/health-state.js +28 -0
- package/dist/server/health-state.js.map +1 -0
- package/dist/server/lib/network.d.ts +12 -0
- package/dist/server/lib/network.js +16 -0
- package/dist/server/lib/network.js.map +1 -0
- package/dist/server/lib/score-contract.d.ts +36 -0
- package/dist/server/lib/score-contract.js +54 -0
- package/dist/server/lib/score-contract.js.map +1 -0
- package/dist/server/lib/stable-stringify.d.ts +10 -0
- package/dist/server/lib/stable-stringify.js +27 -0
- package/dist/server/lib/stable-stringify.js.map +1 -0
- package/dist/server/lib/wire-meta.d.ts +7 -0
- package/dist/server/lib/wire-meta.js +29 -0
- package/dist/server/lib/wire-meta.js.map +1 -0
- package/dist/server/queries/dashboard.d.ts +142 -0
- package/dist/server/queries/dashboard.js +166 -0
- package/dist/server/queries/dashboard.js.map +1 -0
- package/dist/server/routes/consolidation.d.ts +14 -0
- package/dist/server/routes/consolidation.js +67 -0
- package/dist/server/routes/consolidation.js.map +1 -0
- package/dist/server/routes/dashboard-api-html.d.ts +15 -0
- package/dist/server/routes/dashboard-api-html.js +144 -0
- package/dist/server/routes/dashboard-api-html.js.map +1 -0
- package/dist/server/routes/dashboard-consolidation-html.d.ts +26 -0
- package/dist/server/routes/dashboard-consolidation-html.js +202 -0
- package/dist/server/routes/dashboard-consolidation-html.js.map +1 -0
- package/dist/server/routes/dashboard-html.d.ts +15 -0
- package/dist/server/routes/dashboard-html.js +365 -0
- package/dist/server/routes/dashboard-html.js.map +1 -0
- package/dist/server/routes/dashboard-jobs-html.d.ts +18 -0
- package/dist/server/routes/dashboard-jobs-html.js +186 -0
- package/dist/server/routes/dashboard-jobs-html.js.map +1 -0
- package/dist/server/routes/dashboard-search-html.d.ts +18 -0
- package/dist/server/routes/dashboard-search-html.js +189 -0
- package/dist/server/routes/dashboard-search-html.js.map +1 -0
- package/dist/server/routes/dashboard.d.ts +19 -0
- package/dist/server/routes/dashboard.js +68 -0
- package/dist/server/routes/dashboard.js.map +1 -0
- package/dist/server/routes/digest.d.ts +9 -0
- package/dist/server/routes/digest.js +37 -0
- package/dist/server/routes/digest.js.map +1 -0
- package/dist/server/routes/entities.d.ts +12 -0
- package/dist/server/routes/entities.js +46 -0
- package/dist/server/routes/entities.js.map +1 -0
- package/dist/server/routes/health.d.ts +14 -0
- package/dist/server/routes/health.js +100 -0
- package/dist/server/routes/health.js.map +1 -0
- package/dist/server/routes/ingest.d.ts +209 -0
- package/dist/server/routes/ingest.js +454 -0
- package/dist/server/routes/ingest.js.map +1 -0
- package/dist/server/routes/lifecycle.d.ts +21 -0
- package/dist/server/routes/lifecycle.js +132 -0
- package/dist/server/routes/lifecycle.js.map +1 -0
- package/dist/server/routes/mcp.d.ts +15 -0
- package/dist/server/routes/mcp.js +36 -0
- package/dist/server/routes/mcp.js.map +1 -0
- package/dist/server/routes/memory-tool.d.ts +14 -0
- package/dist/server/routes/memory-tool.js +28 -0
- package/dist/server/routes/memory-tool.js.map +1 -0
- package/dist/server/routes/memory.d.ts +7 -0
- package/dist/server/routes/memory.js +19 -0
- package/dist/server/routes/memory.js.map +1 -0
- package/dist/server/routes/recall.d.ts +15 -0
- package/dist/server/routes/recall.js +74 -0
- package/dist/server/routes/recall.js.map +1 -0
- package/dist/server/routes/search.d.ts +12 -0
- package/dist/server/routes/search.js +203 -0
- package/dist/server/routes/search.js.map +1 -0
- package/dist/server/routes/version.d.ts +2 -0
- package/dist/server/routes/version.js +11 -0
- package/dist/server/routes/version.js.map +1 -0
- package/dist/server/routes/why.d.ts +9 -0
- package/dist/server/routes/why.js +38 -0
- package/dist/server/routes/why.js.map +1 -0
- package/dist/service/index.d.ts +10 -0
- package/dist/service/index.js +25 -0
- package/dist/service/index.js.map +1 -0
- package/dist/service/install-flow.d.ts +18 -0
- package/dist/service/install-flow.js +47 -0
- package/dist/service/install-flow.js.map +1 -0
- package/dist/service/instance-lock.d.ts +26 -0
- package/dist/service/instance-lock.js +150 -0
- package/dist/service/instance-lock.js.map +1 -0
- package/dist/service/launchd.d.ts +11 -0
- package/dist/service/launchd.js +196 -0
- package/dist/service/launchd.js.map +1 -0
- package/dist/service/schtasks.d.ts +31 -0
- package/dist/service/schtasks.js +274 -0
- package/dist/service/schtasks.js.map +1 -0
- package/dist/service/shim.d.ts +21 -0
- package/dist/service/shim.js +80 -0
- package/dist/service/shim.js.map +1 -0
- package/dist/service/systemd.d.ts +11 -0
- package/dist/service/systemd.js +150 -0
- package/dist/service/systemd.js.map +1 -0
- package/dist/service/task-xml.d.ts +36 -0
- package/dist/service/task-xml.js +91 -0
- package/dist/service/task-xml.js.map +1 -0
- package/dist/service/types.d.ts +47 -0
- package/dist/service/types.js +2 -0
- package/dist/service/types.js.map +1 -0
- package/dist/storage/archival.d.ts +29 -0
- package/dist/storage/archival.js +47 -0
- package/dist/storage/archival.js.map +1 -0
- package/dist/storage/bearer-keystore.d.ts +34 -0
- package/dist/storage/bearer-keystore.js +75 -0
- package/dist/storage/bearer-keystore.js.map +1 -0
- package/dist/storage/db.d.ts +37 -0
- package/dist/storage/db.js +92 -0
- package/dist/storage/db.js.map +1 -0
- package/dist/storage/entities.d.ts +71 -0
- package/dist/storage/entities.js +141 -0
- package/dist/storage/entities.js.map +1 -0
- package/dist/storage/ingest-idempotency.d.ts +26 -0
- package/dist/storage/ingest-idempotency.js +29 -0
- package/dist/storage/ingest-idempotency.js.map +1 -0
- package/dist/storage/keystore.d.ts +64 -0
- package/dist/storage/keystore.js +194 -0
- package/dist/storage/keystore.js.map +1 -0
- package/dist/storage/memories.d.ts +51 -0
- package/dist/storage/memories.js +67 -0
- package/dist/storage/memories.js.map +1 -0
- package/dist/storage/memory-events.d.ts +145 -0
- package/dist/storage/memory-events.js +287 -0
- package/dist/storage/memory-events.js.map +1 -0
- package/dist/storage/migrate-encrypt.d.ts +16 -0
- package/dist/storage/migrate-encrypt.js +121 -0
- package/dist/storage/migrate-encrypt.js.map +1 -0
- package/dist/storage/migrate.d.ts +27 -0
- package/dist/storage/migrate.js +105 -0
- package/dist/storage/migrate.js.map +1 -0
- package/dist/storage/redaction-log.d.ts +18 -0
- package/dist/storage/redaction-log.js +27 -0
- package/dist/storage/redaction-log.js.map +1 -0
- package/dist/storage/usefulness.d.ts +115 -0
- package/dist/storage/usefulness.js +203 -0
- package/dist/storage/usefulness.js.map +1 -0
- package/dist/sync/conflict-resolve.d.ts +26 -0
- package/dist/sync/conflict-resolve.js +139 -0
- package/dist/sync/conflict-resolve.js.map +1 -0
- package/dist/sync/puller.d.ts +115 -0
- package/dist/sync/puller.js +173 -0
- package/dist/sync/puller.js.map +1 -0
- package/dist/sync/shipper.d.ts +112 -0
- package/dist/sync/shipper.js +189 -0
- package/dist/sync/shipper.js.map +1 -0
- package/dist/tag-hygiene/backfill.d.ts +50 -0
- package/dist/tag-hygiene/backfill.js +117 -0
- package/dist/tag-hygiene/backfill.js.map +1 -0
- package/dist/tag-hygiene/derive-repo.d.ts +9 -0
- package/dist/tag-hygiene/derive-repo.js +19 -0
- package/dist/tag-hygiene/derive-repo.js.map +1 -0
- package/dist/tag-hygiene/tier2-infer.d.ts +28 -0
- package/dist/tag-hygiene/tier2-infer.js +72 -0
- package/dist/tag-hygiene/tier2-infer.js.map +1 -0
- package/dist/vector/sqlite-vec.d.ts +16 -0
- package/dist/vector/sqlite-vec.js +49 -0
- package/dist/vector/sqlite-vec.js.map +1 -0
- package/migrations/001-init.sql +117 -0
- package/migrations/002-wire-v1.sql +16 -0
- package/migrations/003-expand-memory-types.sql +81 -0
- package/migrations/004-provenance.sql +4 -0
- package/migrations/005-security.sql +12 -0
- package/migrations/006-atom-v3.sql +28 -0
- package/migrations/007-memory-events.sql +30 -0
- package/migrations/008-consolidation.sql +31 -0
- package/migrations/009-tag-hygiene.sql +13 -0
- package/migrations/010-sync-pull.sql +53 -0
- package/migrations/011-embed-dim-migration.sql +28 -0
- package/migrations/012-entities.sql +36 -0
- package/migrations/013-archival.sql +50 -0
- package/package.json +50 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"02-normalize.js","sourceRoot":"","sources":["../../../src/distill/stages/02-normalize.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC;;;GAGG;AACH,MAAM,aAAa,GAA2B;IAC5C,aAAa,EAAE,aAAa;IAC5B,aAAa,EAAE,aAAa;IAC5B,YAAY,EAAE,aAAa;IAC3B,QAAQ,EAAE,QAAQ;IAClB,SAAS,EAAE,gBAAgB;IAC3B,gBAAgB,EAAE,gBAAgB;IAClC,gBAAgB,EAAE,gBAAgB;CACnC,CAAC;AAEF,+DAA+D;AAC/D,MAAM,eAAe,GAAG,mCAAmC,CAAC;AAE5D,0DAA0D;AAC1D,MAAM,gBAAgB,GAAG,mCAAmC,CAAC;AAE7D;;;;;GAKG;AACH,MAAM,iBAAiB,GAAG,sEAAsE,CAAC;AAEjG,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;AAEvB,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,IAAI,MAAM,GAAG,IAAI,CAAC;IAElB,2DAA2D;IAC3D,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC,KAAK,EAAE,EAAE;QACjD,sDAAsD;QACtD,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC/C,OAAO,YAAY,CAAC,YAAY,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,0DAA0D;IAC1D,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,KAAK,EAAE,EAAE;QAClD,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,8CAA8C;IAC9C,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QAChE,OAAO,GAAG,IAAI,IAAI,IAAI,GAAG,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,uCAAuC;IACvC,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAErC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,uDAAuD;IACvD,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAE7C,IAAI,WAAW,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QACxC,OAAO,GAAG,GAAG,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACrD,CAAC;IACD,gFAAgF;IAChF,8CAA8C;IAC9C,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY;IACvC,0DAA0D;IAC1D,KAAK,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;QAC/D,sCAAsC;QACtC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,0BAA0B,EAAE,MAAM,CAAC,CAAC;QAClE,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,MAAM,OAAO,KAAK,EAAE,IAAI,CAAC,CAAC;QAChD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stage 3 — Chunk (deterministic)
|
|
3
|
+
*
|
|
4
|
+
* Token-aware split using word-count proxy (~800 tokens ≈ ~3200 chars).
|
|
5
|
+
* Respects turn boundaries — does not split mid role: block.
|
|
6
|
+
*
|
|
7
|
+
* Turn detection: lines starting with "user:", "assistant:", "system:",
|
|
8
|
+
* "human:", "ai:" (case-insensitive) are treated as turn boundaries.
|
|
9
|
+
*/
|
|
10
|
+
export interface Chunk {
|
|
11
|
+
index: number;
|
|
12
|
+
text: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Split text into chunks respecting turn boundaries.
|
|
16
|
+
*
|
|
17
|
+
* Algorithm:
|
|
18
|
+
* 1. Split into "turns" — sequences of lines starting with a role: prefix.
|
|
19
|
+
* 2. Pack turns into chunks until MAX_CHUNK_CHARS would be exceeded.
|
|
20
|
+
* 3. If a single turn exceeds MAX_CHUNK_CHARS, split it by paragraph then by line.
|
|
21
|
+
*/
|
|
22
|
+
export declare function chunk(text: string): Chunk[];
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stage 3 — Chunk (deterministic)
|
|
3
|
+
*
|
|
4
|
+
* Token-aware split using word-count proxy (~800 tokens ≈ ~3200 chars).
|
|
5
|
+
* Respects turn boundaries — does not split mid role: block.
|
|
6
|
+
*
|
|
7
|
+
* Turn detection: lines starting with "user:", "assistant:", "system:",
|
|
8
|
+
* "human:", "ai:" (case-insensitive) are treated as turn boundaries.
|
|
9
|
+
*/
|
|
10
|
+
/** Approximate chars per token (conservative estimate) */
|
|
11
|
+
const CHARS_PER_TOKEN = 4;
|
|
12
|
+
/** Target tokens per chunk */
|
|
13
|
+
const TARGET_TOKENS = 800;
|
|
14
|
+
/** Max chars per chunk before we must split even mid-turn */
|
|
15
|
+
const MAX_CHUNK_CHARS = TARGET_TOKENS * CHARS_PER_TOKEN; // 3200
|
|
16
|
+
/** Turn boundary patterns */
|
|
17
|
+
const TURN_BOUNDARY_RE = /^(user|assistant|system|human|ai)\s*:/i;
|
|
18
|
+
/**
|
|
19
|
+
* Split text into chunks respecting turn boundaries.
|
|
20
|
+
*
|
|
21
|
+
* Algorithm:
|
|
22
|
+
* 1. Split into "turns" — sequences of lines starting with a role: prefix.
|
|
23
|
+
* 2. Pack turns into chunks until MAX_CHUNK_CHARS would be exceeded.
|
|
24
|
+
* 3. If a single turn exceeds MAX_CHUNK_CHARS, split it by paragraph then by line.
|
|
25
|
+
*/
|
|
26
|
+
export function chunk(text) {
|
|
27
|
+
const turns = splitIntoTurns(text);
|
|
28
|
+
return packTurns(turns);
|
|
29
|
+
}
|
|
30
|
+
function splitIntoTurns(text) {
|
|
31
|
+
const lines = text.split('\n');
|
|
32
|
+
const turns = [];
|
|
33
|
+
let current = [];
|
|
34
|
+
for (const line of lines) {
|
|
35
|
+
if (TURN_BOUNDARY_RE.test(line) && current.length > 0) {
|
|
36
|
+
turns.push({ text: current.join('\n') });
|
|
37
|
+
current = [line];
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
current.push(line);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (current.length > 0) {
|
|
44
|
+
const t = current.join('\n').trim();
|
|
45
|
+
if (t)
|
|
46
|
+
turns.push({ text: t });
|
|
47
|
+
}
|
|
48
|
+
return turns;
|
|
49
|
+
}
|
|
50
|
+
function packTurns(turns) {
|
|
51
|
+
const chunks = [];
|
|
52
|
+
let current = '';
|
|
53
|
+
let idx = 0;
|
|
54
|
+
for (const turn of turns) {
|
|
55
|
+
const turnText = turn.text.trim();
|
|
56
|
+
if (!turnText)
|
|
57
|
+
continue;
|
|
58
|
+
// If this single turn is too large, flush current and split the turn
|
|
59
|
+
if (turnText.length > MAX_CHUNK_CHARS) {
|
|
60
|
+
if (current.trim()) {
|
|
61
|
+
chunks.push({ index: idx++, text: current.trim() });
|
|
62
|
+
current = '';
|
|
63
|
+
}
|
|
64
|
+
// Split the oversized turn by paragraph
|
|
65
|
+
const subChunks = splitLargeTurn(turnText, idx);
|
|
66
|
+
for (const sc of subChunks) {
|
|
67
|
+
chunks.push({ index: idx++, text: sc.text });
|
|
68
|
+
}
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
// Would adding this turn exceed the limit?
|
|
72
|
+
const candidate = current ? current + '\n\n' + turnText : turnText;
|
|
73
|
+
if (candidate.length > MAX_CHUNK_CHARS && current.trim()) {
|
|
74
|
+
chunks.push({ index: idx++, text: current.trim() });
|
|
75
|
+
current = turnText;
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
current = candidate;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
if (current.trim()) {
|
|
82
|
+
chunks.push({ index: idx, text: current.trim() });
|
|
83
|
+
}
|
|
84
|
+
// Edge case: empty input
|
|
85
|
+
if (chunks.length === 0) {
|
|
86
|
+
return [{ index: 0, text: '' }];
|
|
87
|
+
}
|
|
88
|
+
return chunks;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Split a single turn that exceeds MAX_CHUNK_CHARS into sub-chunks.
|
|
92
|
+
* First tries paragraph boundaries, then line-by-line as fallback.
|
|
93
|
+
*/
|
|
94
|
+
function splitLargeTurn(text, startIdx) {
|
|
95
|
+
const paragraphs = text.split(/\n\n+/);
|
|
96
|
+
const chunks = [];
|
|
97
|
+
let current = '';
|
|
98
|
+
let idx = startIdx;
|
|
99
|
+
for (const para of paragraphs) {
|
|
100
|
+
if (!para.trim())
|
|
101
|
+
continue;
|
|
102
|
+
if (para.length > MAX_CHUNK_CHARS) {
|
|
103
|
+
// Split by line
|
|
104
|
+
if (current.trim()) {
|
|
105
|
+
chunks.push({ index: idx++, text: current.trim() });
|
|
106
|
+
current = '';
|
|
107
|
+
}
|
|
108
|
+
const lines = para.split('\n');
|
|
109
|
+
for (const line of lines) {
|
|
110
|
+
if (!line.trim())
|
|
111
|
+
continue;
|
|
112
|
+
const cand = current ? current + '\n' + line : line;
|
|
113
|
+
if (cand.length > MAX_CHUNK_CHARS && current.trim()) {
|
|
114
|
+
chunks.push({ index: idx++, text: current.trim() });
|
|
115
|
+
current = line;
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
current = cand;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
const cand = current ? current + '\n\n' + para : para;
|
|
124
|
+
if (cand.length > MAX_CHUNK_CHARS && current.trim()) {
|
|
125
|
+
chunks.push({ index: idx++, text: current.trim() });
|
|
126
|
+
current = para;
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
current = cand;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
if (current.trim()) {
|
|
134
|
+
chunks.push({ index: idx, text: current.trim() });
|
|
135
|
+
}
|
|
136
|
+
return chunks;
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=03-chunk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"03-chunk.js","sourceRoot":"","sources":["../../../src/distill/stages/03-chunk.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stage 4 — Compact (LLM call per chunk)
|
|
3
|
+
*
|
|
4
|
+
* Removes redundancy, repeated thinking, false starts from each chunk.
|
|
5
|
+
* Preserves decisions, file paths, commands, errors, rationale.
|
|
6
|
+
*
|
|
7
|
+
* Budget: checks cap before each call, records after.
|
|
8
|
+
* Throws BudgetExceeded if over cap (caller moves job to paused).
|
|
9
|
+
*/
|
|
10
|
+
import type { LLMProvider } from '../../contracts/index.js';
|
|
11
|
+
import type { Chunk } from './03-chunk.js';
|
|
12
|
+
import { BudgetTracker, BudgetExceeded } from '../../budget/tracker.js';
|
|
13
|
+
export { BudgetExceeded };
|
|
14
|
+
export interface CompactResult {
|
|
15
|
+
index: number;
|
|
16
|
+
text: string;
|
|
17
|
+
usageUsd: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Compact a single chunk via LLM.
|
|
21
|
+
* Returns the compressed text and actual USD cost.
|
|
22
|
+
*/
|
|
23
|
+
export declare function compactChunk(chk: Chunk, provider: LLMProvider, budget: BudgetTracker, capUsd: number): Promise<CompactResult>;
|
|
24
|
+
/**
|
|
25
|
+
* Compact all chunks in sequence.
|
|
26
|
+
* Stops at first BudgetExceeded — caller catches and pauses job.
|
|
27
|
+
*/
|
|
28
|
+
export declare function compact(chunks: Chunk[], provider: LLMProvider, budget: BudgetTracker, capUsd: number): Promise<CompactResult[]>;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stage 4 — Compact (LLM call per chunk)
|
|
3
|
+
*
|
|
4
|
+
* Removes redundancy, repeated thinking, false starts from each chunk.
|
|
5
|
+
* Preserves decisions, file paths, commands, errors, rationale.
|
|
6
|
+
*
|
|
7
|
+
* Budget: checks cap before each call, records after.
|
|
8
|
+
* Throws BudgetExceeded if over cap (caller moves job to paused).
|
|
9
|
+
*/
|
|
10
|
+
import { BudgetTracker, BudgetExceeded } from '../../budget/tracker.js';
|
|
11
|
+
export { BudgetExceeded };
|
|
12
|
+
const COMPACT_SYSTEM = `You are a transcript compressor for AI coding agent sessions.
|
|
13
|
+
|
|
14
|
+
Compress the provided transcript chunk. Remove:
|
|
15
|
+
- Repeated or near-identical lines
|
|
16
|
+
- Thinking-out-loud that reaches no conclusion
|
|
17
|
+
- False starts and self-corrections that don't change the outcome
|
|
18
|
+
- Generic acknowledgment phrases ("Sure!", "Of course!", "I'll help you with that")
|
|
19
|
+
|
|
20
|
+
PRESERVE:
|
|
21
|
+
- All decisions and chosen approaches
|
|
22
|
+
- All file paths and commands
|
|
23
|
+
- All error messages and their resolutions
|
|
24
|
+
- All rationale and architectural reasoning
|
|
25
|
+
- All TODO items and pending work
|
|
26
|
+
|
|
27
|
+
Output plain text only. No markdown formatting. No commentary.`;
|
|
28
|
+
/**
|
|
29
|
+
* Compact a single chunk via LLM.
|
|
30
|
+
* Returns the compressed text and actual USD cost.
|
|
31
|
+
*/
|
|
32
|
+
export async function compactChunk(chk, provider, budget, capUsd) {
|
|
33
|
+
if (!chk.text.trim()) {
|
|
34
|
+
return { index: chk.index, text: '', usageUsd: 0 };
|
|
35
|
+
}
|
|
36
|
+
const messages = [
|
|
37
|
+
{ role: 'system', content: COMPACT_SYSTEM },
|
|
38
|
+
{ role: 'user', content: chk.text },
|
|
39
|
+
];
|
|
40
|
+
// Estimate cost: prompt = system + user text chars
|
|
41
|
+
const promptChars = COMPACT_SYSTEM.length + chk.text.length;
|
|
42
|
+
// For Ollama providers, usd=0 always — use a negligible estimate to pass budget check
|
|
43
|
+
// For Azure, pricing is handled after the call via usage.usd
|
|
44
|
+
const estimateUsd = BudgetTracker.estimateUsd(promptChars, 0.000002, 0.000002);
|
|
45
|
+
budget.assertCanSpend(estimateUsd, capUsd);
|
|
46
|
+
const result = await provider.chat(messages, {
|
|
47
|
+
temperature: 0.1,
|
|
48
|
+
maxTokens: 2000,
|
|
49
|
+
});
|
|
50
|
+
// Record actual cost (0 for Ollama, real for Azure)
|
|
51
|
+
budget.record(result.usage.usd);
|
|
52
|
+
return {
|
|
53
|
+
index: chk.index,
|
|
54
|
+
text: result.text.trim(),
|
|
55
|
+
usageUsd: result.usage.usd,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Compact all chunks in sequence.
|
|
60
|
+
* Stops at first BudgetExceeded — caller catches and pauses job.
|
|
61
|
+
*/
|
|
62
|
+
export async function compact(chunks, provider, budget, capUsd) {
|
|
63
|
+
const results = [];
|
|
64
|
+
for (const chk of chunks) {
|
|
65
|
+
results.push(await compactChunk(chk, provider, budget, capUsd));
|
|
66
|
+
}
|
|
67
|
+
return results;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=04-compact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"04-compact.js","sourceRoot":"","sources":["../../../src/distill/stages/04-compact.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAExE,OAAO,EAAE,cAAc,EAAE,CAAC;AAE1B,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;+DAewC,CAAC;AAQhE;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,GAAU,EACV,QAAqB,EACrB,MAAqB,EACrB,MAAc;IAEd,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QACrB,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACrD,CAAC;IAED,MAAM,QAAQ,GAAc;QAC1B,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE;QAC3C,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE;KACpC,CAAC;IAEF,mDAAmD;IACnD,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;IAC5D,sFAAsF;IACtF,6DAA6D;IAC7D,MAAM,WAAW,GAAG,aAAa,CAAC,WAAW,CAAC,WAAW,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAE/E,MAAM,CAAC,cAAc,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAE3C,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE;QAC3C,WAAW,EAAE,GAAG;QAChB,SAAS,EAAE,IAAI;KAChB,CAAC,CAAC;IAEH,oDAAoD;IACpD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAEhC,OAAO;QACL,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE;QACxB,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG;KAC3B,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,MAAe,EACf,QAAqB,EACrB,MAAqB,EACrB,MAAc;IAEd,MAAM,OAAO,GAAoB,EAAE,CAAC;IACpC,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,MAAM,YAAY,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stage 5 — Extract (LLM JSON-mode per chunk)
|
|
3
|
+
*
|
|
4
|
+
* Emits typed atoms {type, text, importance, confidence, evidence}.
|
|
5
|
+
* Zod-validates the JSON response. Retries once with a stricter prompt
|
|
6
|
+
* on parse failure. Throws BudgetExceeded if over cap.
|
|
7
|
+
*/
|
|
8
|
+
import type { LLMProvider } from '../../contracts/index.js';
|
|
9
|
+
import { type Atom } from '../prompts/extract.js';
|
|
10
|
+
import { BudgetTracker, BudgetExceeded } from '../../budget/tracker.js';
|
|
11
|
+
export { BudgetExceeded };
|
|
12
|
+
export type { Atom };
|
|
13
|
+
export interface ExtractResult {
|
|
14
|
+
chunkIndex: number;
|
|
15
|
+
atoms: Atom[];
|
|
16
|
+
usageUsd: number;
|
|
17
|
+
retried: boolean;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Extract atoms from a single compacted chunk.
|
|
21
|
+
*
|
|
22
|
+
* Parse / Zod validation failure → throws DeterministicError immediately.
|
|
23
|
+
* The worker catches this, poisons the job after a single attempt, and does not
|
|
24
|
+
* issue a second LLM call. This prevents burning budget on a malformed transcript
|
|
25
|
+
* that will never produce valid JSON regardless of how many times we retry.
|
|
26
|
+
*/
|
|
27
|
+
export declare function extractChunk(chunkIndex: number, text: string, provider: LLMProvider, budget: BudgetTracker, capUsd: number): Promise<ExtractResult>;
|
|
28
|
+
/**
|
|
29
|
+
* Extract atoms from all compacted chunks.
|
|
30
|
+
* Stops at first BudgetExceeded.
|
|
31
|
+
*/
|
|
32
|
+
export declare function extract(chunks: Array<{
|
|
33
|
+
index: number;
|
|
34
|
+
text: string;
|
|
35
|
+
}>, provider: LLMProvider, budget: BudgetTracker, capUsd: number): Promise<ExtractResult[]>;
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stage 5 — Extract (LLM JSON-mode per chunk)
|
|
3
|
+
*
|
|
4
|
+
* Emits typed atoms {type, text, importance, confidence, evidence}.
|
|
5
|
+
* Zod-validates the JSON response. Retries once with a stricter prompt
|
|
6
|
+
* on parse failure. Throws BudgetExceeded if over cap.
|
|
7
|
+
*/
|
|
8
|
+
import { z } from 'zod';
|
|
9
|
+
import { AtomSchema, EXTRACTION_SYSTEM_PROMPT, } from '../prompts/extract.js';
|
|
10
|
+
import { BudgetTracker, BudgetExceeded } from '../../budget/tracker.js';
|
|
11
|
+
import { DeterministicError } from '../../pipeline/errors.js';
|
|
12
|
+
/**
|
|
13
|
+
* Lenient wrapper: accepts any objects in the atoms array so that individual
|
|
14
|
+
* bad atoms (short text, unknown type, etc.) don't reject the whole response.
|
|
15
|
+
* Valid atoms are filtered with AtomSchema after JSON parsing.
|
|
16
|
+
*/
|
|
17
|
+
const LenientExtractionSchema = z.object({ atoms: z.array(z.unknown()) });
|
|
18
|
+
export { BudgetExceeded };
|
|
19
|
+
/**
|
|
20
|
+
* Extract atoms from a single compacted chunk.
|
|
21
|
+
*
|
|
22
|
+
* Parse / Zod validation failure → throws DeterministicError immediately.
|
|
23
|
+
* The worker catches this, poisons the job after a single attempt, and does not
|
|
24
|
+
* issue a second LLM call. This prevents burning budget on a malformed transcript
|
|
25
|
+
* that will never produce valid JSON regardless of how many times we retry.
|
|
26
|
+
*/
|
|
27
|
+
export async function extractChunk(chunkIndex, text, provider, budget, capUsd) {
|
|
28
|
+
if (!text.trim()) {
|
|
29
|
+
return { chunkIndex, atoms: [], usageUsd: 0, retried: false };
|
|
30
|
+
}
|
|
31
|
+
const promptChars = EXTRACTION_SYSTEM_PROMPT.length + text.length;
|
|
32
|
+
const estimateUsd = BudgetTracker.estimateUsd(promptChars, 0.000002, 0.000002);
|
|
33
|
+
budget.assertCanSpend(estimateUsd, capUsd);
|
|
34
|
+
const result = await callExtract(text, EXTRACTION_SYSTEM_PROMPT, provider);
|
|
35
|
+
budget.record(result.usageUsd);
|
|
36
|
+
const parsed = tryParseAtoms(result.text);
|
|
37
|
+
if (parsed !== null) {
|
|
38
|
+
return { chunkIndex, atoms: parsed, usageUsd: result.usageUsd, retried: false };
|
|
39
|
+
}
|
|
40
|
+
// Parse / schema failure — deterministic. Let the worker decide retry policy.
|
|
41
|
+
throw new DeterministicError(`[extract] chunk ${chunkIndex}: Zod/JSON parse failed — raw: ${result.text.slice(0, 200)}`);
|
|
42
|
+
}
|
|
43
|
+
async function callExtract(text, systemPrompt, provider) {
|
|
44
|
+
const messages = [
|
|
45
|
+
{ role: 'system', content: systemPrompt },
|
|
46
|
+
{ role: 'user', content: `Extract knowledge atoms from this transcript chunk:\n\n${text}` },
|
|
47
|
+
];
|
|
48
|
+
const result = await provider.chat(messages, {
|
|
49
|
+
temperature: 0.1,
|
|
50
|
+
json: true,
|
|
51
|
+
maxTokens: 1500,
|
|
52
|
+
});
|
|
53
|
+
return { text: result.text, usageUsd: result.usage.usd };
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Try to parse the LLM response into an Atom[].
|
|
57
|
+
* Strips markdown fences if present.
|
|
58
|
+
*
|
|
59
|
+
* Returns an Atom[] (possibly empty) when the JSON is structurally valid and
|
|
60
|
+
* contains an `atoms` array — even if individual atoms are malformed (they
|
|
61
|
+
* are silently dropped via AtomSchema filtering).
|
|
62
|
+
*
|
|
63
|
+
* Returns null only when the raw text is not parseable JSON or is missing the
|
|
64
|
+
* top-level `atoms` key — this is the signal for a DeterministicError.
|
|
65
|
+
*/
|
|
66
|
+
function tryParseAtoms(raw) {
|
|
67
|
+
try {
|
|
68
|
+
let text = raw.trim();
|
|
69
|
+
// Strip markdown code fences
|
|
70
|
+
text = text.replace(/^```(?:json)?\n?/i, '').replace(/\n?```\s*$/i, '').trim();
|
|
71
|
+
// Find the outermost JSON object
|
|
72
|
+
const start = text.indexOf('{');
|
|
73
|
+
const end = text.lastIndexOf('}');
|
|
74
|
+
if (start === -1 || end === -1)
|
|
75
|
+
return null;
|
|
76
|
+
const jsonStr = text.slice(start, end + 1);
|
|
77
|
+
const parsed = JSON.parse(jsonStr);
|
|
78
|
+
// Use the lenient schema — only requires `atoms` to be an array
|
|
79
|
+
const wrapper = LenientExtractionSchema.safeParse(parsed);
|
|
80
|
+
if (!wrapper.success)
|
|
81
|
+
return null;
|
|
82
|
+
// Filter atoms individually: drop those that fail strict AtomSchema
|
|
83
|
+
// (short text, unknown type, out-of-range numbers, etc.)
|
|
84
|
+
return wrapper.data.atoms.filter((a) => AtomSchema.safeParse(a).success);
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Extract atoms from all compacted chunks.
|
|
92
|
+
* Stops at first BudgetExceeded.
|
|
93
|
+
*/
|
|
94
|
+
export async function extract(chunks, provider, budget, capUsd) {
|
|
95
|
+
const results = [];
|
|
96
|
+
for (const chk of chunks) {
|
|
97
|
+
results.push(await extractChunk(chk.index, chk.text, provider, budget, capUsd));
|
|
98
|
+
}
|
|
99
|
+
return results;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=05-extract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"05-extract.js","sourceRoot":"","sources":["../../../src/distill/stages/05-extract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stage 6 — Reduce (deterministic)
|
|
3
|
+
*
|
|
4
|
+
* Merge atoms across chunks by hash(normalized_text).
|
|
5
|
+
* When duplicates exist, keep the highest-importance instance.
|
|
6
|
+
*/
|
|
7
|
+
import type { Atom } from '../prompts/extract.js';
|
|
8
|
+
export interface ReducedAtom extends Atom {
|
|
9
|
+
/** Hash of the normalized (lowercased, trimmed, whitespace-collapsed) text */
|
|
10
|
+
contentHash: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Merge a flat array of atoms, deduplicating by content hash.
|
|
14
|
+
* On collision, keep the highest-importance instance.
|
|
15
|
+
*/
|
|
16
|
+
export declare function reduce(atoms: Atom[]): ReducedAtom[];
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stage 6 — Reduce (deterministic)
|
|
3
|
+
*
|
|
4
|
+
* Merge atoms across chunks by hash(normalized_text).
|
|
5
|
+
* When duplicates exist, keep the highest-importance instance.
|
|
6
|
+
*/
|
|
7
|
+
import { createHash } from 'node:crypto';
|
|
8
|
+
/**
|
|
9
|
+
* Merge a flat array of atoms, deduplicating by content hash.
|
|
10
|
+
* On collision, keep the highest-importance instance.
|
|
11
|
+
*/
|
|
12
|
+
export function reduce(atoms) {
|
|
13
|
+
const byHash = new Map();
|
|
14
|
+
for (const atom of atoms) {
|
|
15
|
+
const hash = contentHash(atom.text);
|
|
16
|
+
const existing = byHash.get(hash);
|
|
17
|
+
if (!existing || atom.importance > existing.importance) {
|
|
18
|
+
byHash.set(hash, { ...atom, contentHash: hash });
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return [...byHash.values()];
|
|
22
|
+
}
|
|
23
|
+
function contentHash(text) {
|
|
24
|
+
const normalized = text.trim().toLowerCase().replace(/\s+/g, ' ');
|
|
25
|
+
// Full 64-hex (256-bit) SHA-256 — the previous 16-hex (64-bit) slice had
|
|
26
|
+
// birthday-bound collision risk around 2^32 atoms which is too low for a
|
|
27
|
+
// long-running memory corpus.
|
|
28
|
+
return createHash('sha256').update(normalized, 'utf8').digest('hex');
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=06-reduce.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"06-reduce.js","sourceRoot":"","sources":["../../../src/distill/stages/06-reduce.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAQzC;;;GAGG;AACH,MAAM,UAAU,MAAM,CAAC,KAAa;IAClC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAuB,CAAC;IAE9C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAElC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU,EAAE,CAAC;YACvD,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAClE,yEAAyE;IACzE,yEAAyE;IACzE,8BAA8B;IAC9B,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACvE,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stage 7 — Memory-normalize (deterministic)
|
|
3
|
+
*
|
|
4
|
+
* Apply canonical text rules to each reduced atom:
|
|
5
|
+
* - Trim and collapse whitespace
|
|
6
|
+
* - Apply entity dictionary (case canonicalization)
|
|
7
|
+
* - Compute final SHA-256 hash of the normalized text
|
|
8
|
+
*/
|
|
9
|
+
import type { ReducedAtom } from './06-reduce.js';
|
|
10
|
+
export interface NormalizedMemory extends ReducedAtom {
|
|
11
|
+
normalizedText: string;
|
|
12
|
+
finalHash: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Normalize a single atom text to canonical form.
|
|
16
|
+
*/
|
|
17
|
+
export declare function normalizeText(text: string): string;
|
|
18
|
+
/**
|
|
19
|
+
* Compute a stable hash for a normalized memory text.
|
|
20
|
+
* This is the dedup key used when inserting into the memories table.
|
|
21
|
+
*/
|
|
22
|
+
export declare function computeHash(normalizedText: string): string;
|
|
23
|
+
/**
|
|
24
|
+
* Apply memory normalization to all reduced atoms.
|
|
25
|
+
* Returns atoms with `normalizedText` and `finalHash` added.
|
|
26
|
+
*/
|
|
27
|
+
export declare function memoryNormalize(atoms: ReducedAtom[]): NormalizedMemory[];
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stage 7 — Memory-normalize (deterministic)
|
|
3
|
+
*
|
|
4
|
+
* Apply canonical text rules to each reduced atom:
|
|
5
|
+
* - Trim and collapse whitespace
|
|
6
|
+
* - Apply entity dictionary (case canonicalization)
|
|
7
|
+
* - Compute final SHA-256 hash of the normalized text
|
|
8
|
+
*/
|
|
9
|
+
import { createHash } from 'node:crypto';
|
|
10
|
+
/**
|
|
11
|
+
* Entity dictionary: patterns → canonical replacement.
|
|
12
|
+
* Applied as case-insensitive whole-word replacements.
|
|
13
|
+
* Extend here as more entities are discovered.
|
|
14
|
+
*/
|
|
15
|
+
const ENTITY_DICT = [
|
|
16
|
+
// sqlite-vec MUST precede bare sqlite so hyphenated form is protected first
|
|
17
|
+
[/\bsqlite-vec\b/gi, 'sqlite-vec'],
|
|
18
|
+
[/\bsqlite\b(?!-vec)/gi, 'SQLite'],
|
|
19
|
+
[/\bpostgres(?:ql)?\b/gi, 'PostgreSQL'],
|
|
20
|
+
[/\bmysql\b/gi, 'MySQL'],
|
|
21
|
+
[/\bjavascript\b/gi, 'JavaScript'],
|
|
22
|
+
[/\btypescript\b/gi, 'TypeScript'],
|
|
23
|
+
[/\bnodejs\b|\bnode\.js\b/gi, 'Node.js'],
|
|
24
|
+
[/\bnpm\b/g, 'npm'],
|
|
25
|
+
[/\bbun\b/gi, 'Bun'],
|
|
26
|
+
[/\bfastify\b/gi, 'Fastify'],
|
|
27
|
+
[/\bzod\b/gi, 'Zod'],
|
|
28
|
+
[/\bvitest\b/gi, 'Vitest'],
|
|
29
|
+
[/\bgithub\b/gi, 'GitHub'],
|
|
30
|
+
[/\bwindows\b/gi, 'Windows'],
|
|
31
|
+
[/\bmacos\b|mac os x\b/gi, 'macOS'],
|
|
32
|
+
[/\blinux\b/gi, 'Linux'],
|
|
33
|
+
];
|
|
34
|
+
/**
|
|
35
|
+
* Normalize a single atom text to canonical form.
|
|
36
|
+
*/
|
|
37
|
+
export function normalizeText(text) {
|
|
38
|
+
let t = text.trim();
|
|
39
|
+
// Collapse internal whitespace runs to single space
|
|
40
|
+
t = t.replace(/\s+/g, ' ');
|
|
41
|
+
// Apply entity dictionary
|
|
42
|
+
for (const [pattern, canonical] of ENTITY_DICT) {
|
|
43
|
+
t = t.replace(pattern, canonical);
|
|
44
|
+
}
|
|
45
|
+
return t;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Compute a stable hash for a normalized memory text.
|
|
49
|
+
* This is the dedup key used when inserting into the memories table.
|
|
50
|
+
*/
|
|
51
|
+
export function computeHash(normalizedText) {
|
|
52
|
+
return createHash('sha256').update(normalizedText, 'utf8').digest('hex');
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Apply memory normalization to all reduced atoms.
|
|
56
|
+
* Returns atoms with `normalizedText` and `finalHash` added.
|
|
57
|
+
*/
|
|
58
|
+
export function memoryNormalize(atoms) {
|
|
59
|
+
return atoms.map(atom => {
|
|
60
|
+
const normalizedText = normalizeText(atom.text);
|
|
61
|
+
const finalHash = computeHash(normalizedText);
|
|
62
|
+
return { ...atom, normalizedText, finalHash };
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=07-memory-normalize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"07-memory-normalize.js","sourceRoot":"","sources":["../../../src/distill/stages/07-memory-normalize.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAQzC;;;;GAIG;AACH,MAAM,WAAW,GAAgD;IAC/D,4EAA4E;IAC5E,CAAC,kBAAkB,EAAE,YAAY,CAAC;IAClC,CAAC,sBAAsB,EAAE,QAAQ,CAAC;IAClC,CAAC,uBAAuB,EAAE,YAAY,CAAC;IACvC,CAAC,aAAa,EAAE,OAAO,CAAC;IACxB,CAAC,kBAAkB,EAAE,YAAY,CAAC;IAClC,CAAC,kBAAkB,EAAE,YAAY,CAAC;IAClC,CAAC,2BAA2B,EAAE,SAAS,CAAC;IACxC,CAAC,UAAU,EAAE,KAAK,CAAC;IACnB,CAAC,WAAW,EAAE,KAAK,CAAC;IACpB,CAAC,eAAe,EAAE,SAAS,CAAC;IAC5B,CAAC,WAAW,EAAE,KAAK,CAAC;IACpB,CAAC,cAAc,EAAE,QAAQ,CAAC;IAC1B,CAAC,cAAc,EAAE,QAAQ,CAAC;IAC1B,CAAC,eAAe,EAAE,SAAS,CAAC;IAC5B,CAAC,wBAAwB,EAAE,OAAO,CAAC;IACnC,CAAC,aAAa,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAEpB,oDAAoD;IACpD,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAE3B,0BAA0B;IAC1B,KAAK,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,WAAW,EAAE,CAAC;QAC/C,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACpC,CAAC;IAED,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,cAAsB;IAChD,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC3E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,KAAoB;IAClD,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;QACtB,MAAM,cAAc,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,SAAS,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC;QAC9C,OAAO,EAAE,GAAG,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC;IAChD,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stage 8 — Embed + Index (provider call + DB writes)
|
|
3
|
+
*
|
|
4
|
+
* For each normalized memory:
|
|
5
|
+
* 1. Insert into memories table via MemoryRepo.insert (hash dedup built in)
|
|
6
|
+
* 2. Embed the normalizedText via EmbedProvider
|
|
7
|
+
* 3. Upsert vec row via SqliteVecStore.upsert
|
|
8
|
+
* 4. Update embedding_provider/model/dim on the memories row
|
|
9
|
+
*/
|
|
10
|
+
import type { EmbedProvider } from '../../contracts/index.js';
|
|
11
|
+
import type { NormalizedMemory } from './07-memory-normalize.js';
|
|
12
|
+
import type { DB } from '../../storage/db.js';
|
|
13
|
+
export interface IndexResult {
|
|
14
|
+
memoryId: string;
|
|
15
|
+
created: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface EmbedIndexContext {
|
|
18
|
+
db: DB;
|
|
19
|
+
embed: EmbedProvider;
|
|
20
|
+
sessionId: string | null;
|
|
21
|
+
repo: string | null;
|
|
22
|
+
project: string | null;
|
|
23
|
+
branch: string | null;
|
|
24
|
+
agent: string | null;
|
|
25
|
+
sourceHash: string | null;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Embed and index all normalized memories.
|
|
29
|
+
* Returns one IndexResult per input atom (some may be deduped by hash).
|
|
30
|
+
*/
|
|
31
|
+
export declare function embedAndIndex(memories: NormalizedMemory[], ctx: EmbedIndexContext): Promise<IndexResult[]>;
|