@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,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock providers for CI / integration testing.
|
|
3
|
+
*
|
|
4
|
+
* Used when ASTRA_MEMORY_MOCK_PROVIDERS=1 is set (or injected directly in tests).
|
|
5
|
+
*
|
|
6
|
+
* - MockLLMProvider: compaction returns the input text unchanged;
|
|
7
|
+
* extraction checks a small deterministic keyword table (see below) and
|
|
8
|
+
* returns one atom per matched keyword, or an empty atoms list if none match.
|
|
9
|
+
* - MockEmbedProvider: deterministic vector (dim defaults to
|
|
10
|
+
* DEFAULT_EMBED_DIM = 1024, configurable) seeded from text hash. No
|
|
11
|
+
* network, no Ollama required.
|
|
12
|
+
*
|
|
13
|
+
* These mocks satisfy the LLMProvider / EmbedProvider contracts and make
|
|
14
|
+
* the full 8-stage distillation pipeline runnable in CI.
|
|
15
|
+
*
|
|
16
|
+
* TEST-ONLY deterministic extraction vocabulary (SLICE-SMOKE-1 orchestrator
|
|
17
|
+
* decision, 2026-07-04: extending this file additively was approved as a
|
|
18
|
+
* relaxation of "no product-code changes" for test-double code specifically
|
|
19
|
+
* — see the smoke-suite run brief. Exclusively consumed by
|
|
20
|
+
* tests/smoke/_fixtures/session-canonical.json; fixture and this table must
|
|
21
|
+
* stay in lockstep, and this file is never reachable outside
|
|
22
|
+
* ASTRA_MEMORY_MOCK_PROVIDERS=1 (CI/test only — real serving never sets it).
|
|
23
|
+
* Each row is an independent case-insensitive substring match against the
|
|
24
|
+
* full extraction input; matching keywords each append one fixed atom (no
|
|
25
|
+
* parsing, no branching beyond the match itself):
|
|
26
|
+
*
|
|
27
|
+
* trigger keyword -> atom type -> entity emitted
|
|
28
|
+
* ---------------------------------------------------------------------
|
|
29
|
+
* "sqlite-vec" / "sqlite_vec" -> decision -> none (ORIGINAL, unchanged
|
|
30
|
+
* byte-for-byte since before
|
|
31
|
+
* SLICE-SMOKE-1)
|
|
32
|
+
* "priya nair" -> fact -> person: "Priya Nair"
|
|
33
|
+
* "astramemory-local" -> fact -> repo: "astramemory-local"
|
|
34
|
+
* "typescript" -> fact -> tech: "TypeScript"
|
|
35
|
+
* "todo:" -> todo -> none
|
|
36
|
+
* "prefers markdown summaries" -> note -> none (closest valid
|
|
37
|
+
* MemoryType — the schema
|
|
38
|
+
* has no 'preference' type)
|
|
39
|
+
*/
|
|
40
|
+
import { createHash } from 'node:crypto';
|
|
41
|
+
import { DEFAULT_EMBED_DIM } from '../contracts/embed.js';
|
|
42
|
+
// ── Mock LLM ─────────────────────────────────────────────────────────────────
|
|
43
|
+
class MockLLMProvider {
|
|
44
|
+
name = 'ollama';
|
|
45
|
+
model = 'mock-llm';
|
|
46
|
+
async chat(messages, opts) {
|
|
47
|
+
const userContent = messages.find(m => m.role === 'user')?.content ?? '';
|
|
48
|
+
// Detect extraction calls (json mode or system prompt contains "atoms")
|
|
49
|
+
const systemContent = messages.find(m => m.role === 'system')?.content ?? '';
|
|
50
|
+
const isExtraction = opts?.json === true || systemContent.includes('atoms');
|
|
51
|
+
if (isExtraction) {
|
|
52
|
+
// Return a valid ExtractionSchema JSON that the Zod validator will accept.
|
|
53
|
+
// See the file-header keyword table — each check below is independent
|
|
54
|
+
// and additive; the sqlite-vec case is byte-identical to the original.
|
|
55
|
+
const lower = userContent.toLowerCase();
|
|
56
|
+
const atoms = [];
|
|
57
|
+
// ORIGINAL — unchanged since before SLICE-SMOKE-1.
|
|
58
|
+
if (lower.includes('sqlite-vec') || lower.includes('sqlite_vec')) {
|
|
59
|
+
atoms.push({
|
|
60
|
+
type: 'decision',
|
|
61
|
+
text: 'use sqlite-vec for v1 vector storage',
|
|
62
|
+
importance: 0.9,
|
|
63
|
+
confidence: 0.9,
|
|
64
|
+
evidence: 'OK let\'s go with sqlite-vec',
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
if (lower.includes('priya nair')) {
|
|
68
|
+
atoms.push({
|
|
69
|
+
type: 'fact',
|
|
70
|
+
text: 'Priya Nair is the designated reviewer for this work',
|
|
71
|
+
importance: 0.5,
|
|
72
|
+
confidence: 0.8,
|
|
73
|
+
entities: [{ name: 'Priya Nair', kind: 'person' }],
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
if (lower.includes('astramemory-local')) {
|
|
77
|
+
atoms.push({
|
|
78
|
+
type: 'fact',
|
|
79
|
+
text: 'This work belongs to the astramemory-local repo',
|
|
80
|
+
importance: 0.5,
|
|
81
|
+
confidence: 0.8,
|
|
82
|
+
entities: [{ name: 'astramemory-local', kind: 'repo' }],
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
if (lower.includes('typescript')) {
|
|
86
|
+
atoms.push({
|
|
87
|
+
type: 'fact',
|
|
88
|
+
text: 'This project is written in TypeScript',
|
|
89
|
+
importance: 0.5,
|
|
90
|
+
confidence: 0.8,
|
|
91
|
+
entities: [{ name: 'TypeScript', kind: 'tech' }],
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
if (lower.includes('todo:')) {
|
|
95
|
+
atoms.push({
|
|
96
|
+
type: 'todo',
|
|
97
|
+
text: 'Write a migration guide before shipping',
|
|
98
|
+
importance: 0.6,
|
|
99
|
+
confidence: 0.8,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
if (lower.includes('prefers markdown summaries')) {
|
|
103
|
+
atoms.push({
|
|
104
|
+
type: 'note',
|
|
105
|
+
text: 'Prefers markdown-formatted memory summaries',
|
|
106
|
+
importance: 0.4,
|
|
107
|
+
confidence: 0.7,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
return {
|
|
111
|
+
text: JSON.stringify({ atoms }),
|
|
112
|
+
usage: { in: 10, out: 10, usd: 0 }
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
// Compaction: return user content unchanged (preserves all decisions for extraction)
|
|
116
|
+
return {
|
|
117
|
+
text: userContent,
|
|
118
|
+
usage: { in: 10, out: 10, usd: 0 }
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
async health() {
|
|
122
|
+
return { ok: true, model: this.model, latency_ms: 0 };
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// ── Mock Embed ────────────────────────────────────────────────────────────────
|
|
126
|
+
class MockEmbedProvider {
|
|
127
|
+
name = 'ollama';
|
|
128
|
+
model = 'mock-embed';
|
|
129
|
+
dim;
|
|
130
|
+
constructor(dim = DEFAULT_EMBED_DIM) {
|
|
131
|
+
this.dim = dim;
|
|
132
|
+
}
|
|
133
|
+
async embed(texts) {
|
|
134
|
+
return texts.map(t => makeDeterministicVec(t, this.dim));
|
|
135
|
+
}
|
|
136
|
+
async health() {
|
|
137
|
+
return { ok: true, model: this.model, dim: this.dim };
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Deterministic vector seeded by text content hash, dim defaults to
|
|
142
|
+
* DEFAULT_EMBED_DIM (1024) — pass `dim` for a non-default schema (FEAT-409
|
|
143
|
+
* AC-2). Matches the approach used in search.ts makeFakeVec but uses
|
|
144
|
+
* SHA-256 for better distribution across similar texts.
|
|
145
|
+
*/
|
|
146
|
+
function makeDeterministicVec(text, dim = DEFAULT_EMBED_DIM) {
|
|
147
|
+
const hash = createHash('sha256').update(text, 'utf8').digest();
|
|
148
|
+
const v = new Float32Array(dim);
|
|
149
|
+
// Seed each float from hash bytes cycling
|
|
150
|
+
for (let i = 0; i < dim; i++) {
|
|
151
|
+
const b0 = hash[i % 32] ?? 0;
|
|
152
|
+
const b1 = hash[(i + 1) % 32] ?? 0;
|
|
153
|
+
// Normalize to [-1, 1]
|
|
154
|
+
v[i] = ((b0 * 256 + b1) / 32767.5) - 1.0;
|
|
155
|
+
}
|
|
156
|
+
return v;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Returns a ProviderSet backed entirely by mock providers.
|
|
160
|
+
* Safe to call multiple times — each call returns fresh instances.
|
|
161
|
+
* `dim` defaults to DEFAULT_EMBED_DIM (1024); pass e.g. cfg.embedding.dim
|
|
162
|
+
* to exercise a non-default dim under ASTRA_MEMORY_MOCK_PROVIDERS=1
|
|
163
|
+
* (FEAT-409 AC-2).
|
|
164
|
+
*/
|
|
165
|
+
export function makeMockProviders(dim = DEFAULT_EMBED_DIM) {
|
|
166
|
+
const llm = new MockLLMProvider();
|
|
167
|
+
return {
|
|
168
|
+
llm: {
|
|
169
|
+
compaction: llm,
|
|
170
|
+
extraction: llm,
|
|
171
|
+
},
|
|
172
|
+
embed: new MockEmbedProvider(dim),
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=mock-providers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock-providers.js","sourceRoot":"","sources":["../../src/pipeline/mock-providers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { JobKind } from '../contracts/index.js';
|
|
2
|
+
import type { JobHandler } from './handler.js';
|
|
3
|
+
/**
|
|
4
|
+
* Registry of job handlers keyed by JobKind.
|
|
5
|
+
* register() is idempotent — re-registering the same kind overwrites.
|
|
6
|
+
*/
|
|
7
|
+
export declare class HandlerRegistry {
|
|
8
|
+
private readonly map;
|
|
9
|
+
/** Register a handler for its declared kind. */
|
|
10
|
+
register(handler: JobHandler): void;
|
|
11
|
+
/** Look up a handler by kind. Returns undefined if none registered. */
|
|
12
|
+
get(kind: JobKind): JobHandler | undefined;
|
|
13
|
+
/** All registered kinds (for diagnostics). */
|
|
14
|
+
registeredKinds(): JobKind[];
|
|
15
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry of job handlers keyed by JobKind.
|
|
3
|
+
* register() is idempotent — re-registering the same kind overwrites.
|
|
4
|
+
*/
|
|
5
|
+
export class HandlerRegistry {
|
|
6
|
+
map = new Map();
|
|
7
|
+
/** Register a handler for its declared kind. */
|
|
8
|
+
register(handler) {
|
|
9
|
+
this.map.set(handler.kind, handler);
|
|
10
|
+
}
|
|
11
|
+
/** Look up a handler by kind. Returns undefined if none registered. */
|
|
12
|
+
get(kind) {
|
|
13
|
+
return this.map.get(kind);
|
|
14
|
+
}
|
|
15
|
+
/** All registered kinds (for diagnostics). */
|
|
16
|
+
registeredKinds() {
|
|
17
|
+
return [...this.map.keys()];
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/pipeline/registry.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,OAAO,eAAe;IACT,GAAG,GAAG,IAAI,GAAG,EAAuB,CAAC;IAEtD,gDAAgD;IAChD,QAAQ,CAAC,OAAmB;QAC1B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC;IAED,uEAAuE;IACvE,GAAG,CAAC,IAAa;QACf,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAED,8CAA8C;IAC9C,eAAe;QACb,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9B,CAAC;CACF"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { DB } from '../storage/db.js';
|
|
2
|
+
import type { Config } from '../config/config.js';
|
|
3
|
+
import type { HandlerCtx } from './handler.js';
|
|
4
|
+
import type { HandlerRegistry } from './registry.js';
|
|
5
|
+
export interface WorkerOpts {
|
|
6
|
+
pollMs: number;
|
|
7
|
+
registry: HandlerRegistry;
|
|
8
|
+
db: DB;
|
|
9
|
+
config: Config;
|
|
10
|
+
/** Optional pre-built HandlerCtx (or ExtendedHandlerCtx) to pass to handlers.
|
|
11
|
+
* When omitted, a minimal {db, config} context is constructed. */
|
|
12
|
+
ctx?: HandlerCtx;
|
|
13
|
+
/** Optional liveness sink — the worker stamps lastTickAt each tick so
|
|
14
|
+
* /health can report worker.alive. */
|
|
15
|
+
healthState?: {
|
|
16
|
+
worker: {
|
|
17
|
+
lastTickAt: number | null;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export interface WorkerHandle {
|
|
22
|
+
/**
|
|
23
|
+
* Stop the worker. Resolves AFTER the currently in-flight tick completes
|
|
24
|
+
* (if any). Callers MUST await this before closing the DB — otherwise
|
|
25
|
+
* better-sqlite3 may throw SQLITE_MISUSE if a handler is still writing.
|
|
26
|
+
*/
|
|
27
|
+
stop(): Promise<void>;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Start the worker poll loop in-process.
|
|
31
|
+
*
|
|
32
|
+
* Each tick:
|
|
33
|
+
* 1. Claim the oldest pending job (atomic state transition pending→running).
|
|
34
|
+
* 2. Dispatch to the registered handler.
|
|
35
|
+
* 3. On success → complete.
|
|
36
|
+
* 4. On throw → fail + attempts++. If attempts >= MAX_ATTEMPTS → poison.
|
|
37
|
+
* 5. Repeat immediately if a job was found; otherwise sleep pollMs.
|
|
38
|
+
*
|
|
39
|
+
* Returns a handle with stop() that terminates the loop after the current tick.
|
|
40
|
+
*/
|
|
41
|
+
export declare function startWorker(opts: WorkerOpts): WorkerHandle;
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { JobRepo } from './job-repo.js';
|
|
2
|
+
import { DistillBudgetPausedError } from './handlers/distill.js';
|
|
3
|
+
import { classifyError } from './failure-classifier.js';
|
|
4
|
+
import { logger, childLogger } from '../log/logger.js';
|
|
5
|
+
const MAX_ATTEMPTS = 3;
|
|
6
|
+
/**
|
|
7
|
+
* Start the worker poll loop in-process.
|
|
8
|
+
*
|
|
9
|
+
* Each tick:
|
|
10
|
+
* 1. Claim the oldest pending job (atomic state transition pending→running).
|
|
11
|
+
* 2. Dispatch to the registered handler.
|
|
12
|
+
* 3. On success → complete.
|
|
13
|
+
* 4. On throw → fail + attempts++. If attempts >= MAX_ATTEMPTS → poison.
|
|
14
|
+
* 5. Repeat immediately if a job was found; otherwise sleep pollMs.
|
|
15
|
+
*
|
|
16
|
+
* Returns a handle with stop() that terminates the loop after the current tick.
|
|
17
|
+
*/
|
|
18
|
+
export function startWorker(opts) {
|
|
19
|
+
const { pollMs, registry, db, config } = opts;
|
|
20
|
+
const repo = new JobRepo(db);
|
|
21
|
+
const ctx = opts.ctx ?? { db, config };
|
|
22
|
+
let stopped = false;
|
|
23
|
+
let timer = null;
|
|
24
|
+
let inFlight = null;
|
|
25
|
+
async function tick() {
|
|
26
|
+
if (stopped)
|
|
27
|
+
return;
|
|
28
|
+
if (opts.healthState)
|
|
29
|
+
opts.healthState.worker.lastTickAt = Date.now();
|
|
30
|
+
const job = repo.claimPending();
|
|
31
|
+
if (!job) {
|
|
32
|
+
// Nothing to do — schedule next poll
|
|
33
|
+
if (!stopped) {
|
|
34
|
+
timer = setTimeout(() => { launchTick(); }, pollMs);
|
|
35
|
+
}
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
// Build a per-job child logger; binds job_id + job_kind + attempt on every log line
|
|
39
|
+
const jobLog = childLogger({ job_id: job.id, job_kind: job.kind, attempt: job.attempts + 1 });
|
|
40
|
+
jobLog.info('job claimed');
|
|
41
|
+
const handler = registry.get(job.kind);
|
|
42
|
+
if (!handler) {
|
|
43
|
+
// No handler registered — treat as a permanent failure
|
|
44
|
+
const errMsg = `No handler registered for job kind '${job.kind}'`;
|
|
45
|
+
repo.fail(job.id, errMsg);
|
|
46
|
+
const updated = repo.get(job.id);
|
|
47
|
+
if (updated) {
|
|
48
|
+
if (updated.attempts >= MAX_ATTEMPTS) {
|
|
49
|
+
repo.markPoison(job.id);
|
|
50
|
+
jobLog.warn({ error_message: errMsg, error_kind: 'NoHandler' }, 'job poisoned — no handler');
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
repo.requeueForRetry(job.id);
|
|
54
|
+
jobLog.warn({ error_message: errMsg, error_kind: 'NoHandler' }, 'job requeued — no handler');
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
scheduleNext();
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
let payload;
|
|
61
|
+
try {
|
|
62
|
+
payload = JSON.parse(job.payload_json);
|
|
63
|
+
}
|
|
64
|
+
catch (e) {
|
|
65
|
+
const errMsg = `Failed to parse payload_json: ${String(e)}`;
|
|
66
|
+
repo.fail(job.id, errMsg);
|
|
67
|
+
const updated = repo.get(job.id);
|
|
68
|
+
if (updated) {
|
|
69
|
+
if (updated.attempts >= MAX_ATTEMPTS) {
|
|
70
|
+
repo.markPoison(job.id);
|
|
71
|
+
jobLog.warn({ error_message: errMsg, error_kind: 'PayloadParseError' }, 'job poisoned — bad payload');
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
repo.requeueForRetry(job.id);
|
|
75
|
+
jobLog.warn({ error_message: errMsg, error_kind: 'PayloadParseError' }, 'job requeued — bad payload');
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
scheduleNext();
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
try {
|
|
82
|
+
await handler.handle(payload, ctx);
|
|
83
|
+
repo.complete(job.id);
|
|
84
|
+
jobLog.info('job completed');
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
// Budget exceeded → pause the job (not a failure, not retried).
|
|
88
|
+
// Do NOT call fail() — that would increment attempts and eventually
|
|
89
|
+
// poison the job after repeated daily cap hits, preventing recovery
|
|
90
|
+
// when the user runs `astra-memory budget --reset`.
|
|
91
|
+
if (DistillBudgetPausedError.is(err)) {
|
|
92
|
+
const errMsg = err instanceof Error ? err.message : String(err);
|
|
93
|
+
repo.setLastError(job.id, errMsg);
|
|
94
|
+
repo.pause(job.id);
|
|
95
|
+
jobLog.warn({ error_message: errMsg, error_kind: 'BudgetPaused' }, 'job paused — budget exceeded');
|
|
96
|
+
scheduleNext();
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
const kind = classifyError(err);
|
|
100
|
+
const errMsg = err instanceof Error ? err.message : String(err);
|
|
101
|
+
if (kind === 'deterministic') {
|
|
102
|
+
// Schema / parse failures will not self-heal with another LLM call.
|
|
103
|
+
// Poison immediately to avoid burning budget on retries.
|
|
104
|
+
repo.fail(job.id, errMsg);
|
|
105
|
+
repo.markPoison(job.id);
|
|
106
|
+
jobLog.warn({ error_message: errMsg.slice(0, 200), error_kind: 'DeterministicFailure' }, 'job poisoned — deterministic failure');
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
// Transient failure — retry with exponential backoff up to MAX_ATTEMPTS.
|
|
110
|
+
repo.fail(job.id, errMsg);
|
|
111
|
+
const updated = repo.get(job.id);
|
|
112
|
+
if (updated && updated.attempts >= MAX_ATTEMPTS) {
|
|
113
|
+
repo.markPoison(job.id);
|
|
114
|
+
jobLog.warn({ error_message: errMsg.slice(0, 200), error_kind: 'TransientFailure', attempts: updated.attempts }, 'job poisoned — retries exhausted');
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
// Exponential backoff: 1s, 2s, 4s, … capped at 60s
|
|
118
|
+
const attemptsSoFar = updated?.attempts ?? 1;
|
|
119
|
+
const delay = Math.min(1000 * Math.pow(2, attemptsSoFar - 1), 60_000);
|
|
120
|
+
jobLog.info({ error_message: errMsg.slice(0, 200), delay_ms: delay }, 'job requeued for retry');
|
|
121
|
+
setTimeout(() => { repo.requeueForRetry(job.id); }, delay);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
scheduleNext();
|
|
126
|
+
}
|
|
127
|
+
function scheduleNext() {
|
|
128
|
+
if (!stopped) {
|
|
129
|
+
timer = setTimeout(() => { launchTick(); }, 0);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
function onUncaught(err) {
|
|
133
|
+
// Worker must not crash the process — log and keep polling
|
|
134
|
+
const errMsg = err instanceof Error ? err.message : String(err);
|
|
135
|
+
logger.error({ error_message: errMsg.slice(0, 200), error_kind: err instanceof Error ? err.name : 'Unknown' }, '[worker] uncaught error in tick');
|
|
136
|
+
if (!stopped) {
|
|
137
|
+
timer = setTimeout(() => { launchTick(); }, pollMs);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Wraps tick() so the resulting promise is tracked in `inFlight`.
|
|
142
|
+
* stop() awaits this promise to ensure no handler is mid-DB-write when
|
|
143
|
+
* the caller subsequently closes the database.
|
|
144
|
+
*/
|
|
145
|
+
function launchTick() {
|
|
146
|
+
inFlight = tick().catch(onUncaught).finally(() => { inFlight = null; });
|
|
147
|
+
}
|
|
148
|
+
// Kick off the first tick
|
|
149
|
+
timer = setTimeout(() => { launchTick(); }, 0);
|
|
150
|
+
return {
|
|
151
|
+
async stop() {
|
|
152
|
+
stopped = true;
|
|
153
|
+
if (timer !== null) {
|
|
154
|
+
clearTimeout(timer);
|
|
155
|
+
timer = null;
|
|
156
|
+
}
|
|
157
|
+
// Drain any in-flight tick before returning — handler may be mid-write.
|
|
158
|
+
if (inFlight) {
|
|
159
|
+
try {
|
|
160
|
+
await inFlight;
|
|
161
|
+
}
|
|
162
|
+
catch { /* already logged via onUncaught */ }
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/pipeline/worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { EmbedHealth, EmbedProvider } from '../../contracts/embed.js';
|
|
2
|
+
export interface AzureOpenAIEmbedConfig {
|
|
3
|
+
endpoint: string;
|
|
4
|
+
deployment: string;
|
|
5
|
+
apiKey: string;
|
|
6
|
+
apiVersion?: string;
|
|
7
|
+
model?: string;
|
|
8
|
+
/** FEAT-409: expected/requested output dim — defaults to
|
|
9
|
+
* DEFAULT_EMBED_DIM (1024). Set from config.embedding.dim by
|
|
10
|
+
* providers/index.ts. Sent as the Azure `dimensions` request param. */
|
|
11
|
+
dim?: number;
|
|
12
|
+
}
|
|
13
|
+
export declare class AzureOpenAIEmbedProvider implements EmbedProvider {
|
|
14
|
+
readonly name: "azure-openai";
|
|
15
|
+
readonly model: string;
|
|
16
|
+
readonly dim: number;
|
|
17
|
+
private readonly endpoint;
|
|
18
|
+
private readonly deployment;
|
|
19
|
+
private readonly apiKey;
|
|
20
|
+
private readonly apiVersion;
|
|
21
|
+
constructor(config: AzureOpenAIEmbedConfig);
|
|
22
|
+
private get embedUrl();
|
|
23
|
+
embed(texts: string[]): Promise<Float32Array[]>;
|
|
24
|
+
health(): Promise<EmbedHealth>;
|
|
25
|
+
}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { DEFAULT_EMBED_DIM } from '../../contracts/embed.js';
|
|
2
|
+
import { TransientError, DeterministicError } from '../../pipeline/errors.js';
|
|
3
|
+
const EMBED_TIMEOUT_MS = 15_000;
|
|
4
|
+
const HEALTH_TIMEOUT_MS = 15_000;
|
|
5
|
+
const DEFAULT_MODEL = 'text-embedding-3-small';
|
|
6
|
+
async function fetchWithRetry(url, init, timeoutMs) {
|
|
7
|
+
let lastError;
|
|
8
|
+
for (let i = 0; i < 2; i++) {
|
|
9
|
+
try {
|
|
10
|
+
const res = await fetch(url, { ...init, signal: AbortSignal.timeout(timeoutMs) });
|
|
11
|
+
if (res.status >= 400 && res.status < 500)
|
|
12
|
+
return res;
|
|
13
|
+
if (res.status >= 500 && i === 0) {
|
|
14
|
+
lastError = new Error(`HTTP ${res.status} from Azure embed`);
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
17
|
+
return res;
|
|
18
|
+
}
|
|
19
|
+
catch (err) {
|
|
20
|
+
if (i === 0) {
|
|
21
|
+
lastError = err;
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
throw err;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
throw lastError;
|
|
28
|
+
}
|
|
29
|
+
export class AzureOpenAIEmbedProvider {
|
|
30
|
+
name = 'azure-openai';
|
|
31
|
+
model;
|
|
32
|
+
dim;
|
|
33
|
+
endpoint;
|
|
34
|
+
deployment;
|
|
35
|
+
apiKey;
|
|
36
|
+
apiVersion;
|
|
37
|
+
constructor(config) {
|
|
38
|
+
this.endpoint = config.endpoint.replace(/\/$/, '');
|
|
39
|
+
this.deployment = config.deployment;
|
|
40
|
+
this.apiKey = config.apiKey;
|
|
41
|
+
this.apiVersion = config.apiVersion ?? '2024-10-21';
|
|
42
|
+
this.model = config.model ?? DEFAULT_MODEL;
|
|
43
|
+
this.dim = config.dim ?? DEFAULT_EMBED_DIM;
|
|
44
|
+
}
|
|
45
|
+
get embedUrl() {
|
|
46
|
+
return `${this.endpoint}/openai/deployments/${this.deployment}/embeddings?api-version=${this.apiVersion}`;
|
|
47
|
+
}
|
|
48
|
+
async embed(texts) {
|
|
49
|
+
const body = {
|
|
50
|
+
input: texts,
|
|
51
|
+
dimensions: this.dim,
|
|
52
|
+
};
|
|
53
|
+
const res = await fetchWithRetry(this.embedUrl, {
|
|
54
|
+
method: 'POST',
|
|
55
|
+
headers: {
|
|
56
|
+
'content-type': 'application/json',
|
|
57
|
+
'api-key': this.apiKey,
|
|
58
|
+
},
|
|
59
|
+
body: JSON.stringify(body),
|
|
60
|
+
}, EMBED_TIMEOUT_MS);
|
|
61
|
+
if (!res.ok) {
|
|
62
|
+
const raw = await res.text().catch(() => '');
|
|
63
|
+
let detail = raw;
|
|
64
|
+
try {
|
|
65
|
+
const parsed = JSON.parse(raw);
|
|
66
|
+
detail = parsed.error?.message ?? raw;
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// leave as raw text
|
|
70
|
+
}
|
|
71
|
+
const snippet = detail.slice(0, 200);
|
|
72
|
+
if (res.status >= 500) {
|
|
73
|
+
throw new TransientError(`Azure OpenAI embed failed: HTTP ${res.status} — ${snippet}`);
|
|
74
|
+
}
|
|
75
|
+
if (res.status === 429) {
|
|
76
|
+
throw new TransientError(`Azure OpenAI embed rate-limited (429): ${snippet}`);
|
|
77
|
+
}
|
|
78
|
+
throw new DeterministicError(`Azure OpenAI embed failed: HTTP ${res.status} — ${snippet}`);
|
|
79
|
+
}
|
|
80
|
+
const data = (await res.json());
|
|
81
|
+
if (!data.data || data.data.length === 0) {
|
|
82
|
+
throw new Error(`Azure embed response missing 'data' array`);
|
|
83
|
+
}
|
|
84
|
+
// Sort by index to preserve input order
|
|
85
|
+
const sorted = [...data.data].sort((a, b) => (a.index ?? 0) - (b.index ?? 0));
|
|
86
|
+
const results = [];
|
|
87
|
+
for (const item of sorted) {
|
|
88
|
+
const embedding = item.embedding;
|
|
89
|
+
if (!embedding) {
|
|
90
|
+
throw new Error(`Azure embed response item missing 'embedding' field`);
|
|
91
|
+
}
|
|
92
|
+
if (embedding.length !== this.dim) {
|
|
93
|
+
throw new Error(`Azure embed dimension mismatch: expected ${this.dim}, got ${embedding.length}. ` +
|
|
94
|
+
`Model: ${this.model}. Check that 'dimensions: ${this.dim}' is supported.`);
|
|
95
|
+
}
|
|
96
|
+
results.push(new Float32Array(embedding));
|
|
97
|
+
}
|
|
98
|
+
if (results.length !== texts.length) {
|
|
99
|
+
throw new Error(`Azure embed count mismatch: sent ${texts.length} texts, got ${results.length} embeddings`);
|
|
100
|
+
}
|
|
101
|
+
return results;
|
|
102
|
+
}
|
|
103
|
+
async health() {
|
|
104
|
+
// Ping with a 1-item embed request
|
|
105
|
+
const body = {
|
|
106
|
+
input: ['ping'],
|
|
107
|
+
dimensions: this.dim,
|
|
108
|
+
};
|
|
109
|
+
try {
|
|
110
|
+
const t0 = Date.now();
|
|
111
|
+
const res = await fetch(this.embedUrl, {
|
|
112
|
+
method: 'POST',
|
|
113
|
+
headers: {
|
|
114
|
+
'content-type': 'application/json',
|
|
115
|
+
'api-key': this.apiKey,
|
|
116
|
+
},
|
|
117
|
+
body: JSON.stringify(body),
|
|
118
|
+
signal: AbortSignal.timeout(HEALTH_TIMEOUT_MS),
|
|
119
|
+
});
|
|
120
|
+
void (Date.now() - t0); // latency not part of EmbedHealth interface
|
|
121
|
+
return {
|
|
122
|
+
ok: res.ok,
|
|
123
|
+
model: this.model,
|
|
124
|
+
dim: this.dim,
|
|
125
|
+
...(res.ok ? {} : { error: `HTTP ${res.status}` }),
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
return {
|
|
130
|
+
ok: false,
|
|
131
|
+
model: this.model,
|
|
132
|
+
dim: this.dim,
|
|
133
|
+
error: err instanceof Error ? err.message : String(err),
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=azure-openai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"azure-openai.js","sourceRoot":"","sources":["../../../src/providers/embed/azure-openai.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { EmbedHealth, EmbedProvider } from '../../contracts/embed.js';
|
|
2
|
+
export interface OllamaEmbedConfig {
|
|
3
|
+
baseUrl?: string;
|
|
4
|
+
model?: string;
|
|
5
|
+
/** FEAT-409: expected output dim — defaults to DEFAULT_EMBED_DIM (1024).
|
|
6
|
+
* Set from config.embedding.dim by providers/index.ts. */
|
|
7
|
+
dim?: number;
|
|
8
|
+
}
|
|
9
|
+
export declare class OllamaEmbedProvider implements EmbedProvider {
|
|
10
|
+
readonly name: "ollama";
|
|
11
|
+
readonly model: string;
|
|
12
|
+
readonly dim: number;
|
|
13
|
+
private readonly baseUrl;
|
|
14
|
+
constructor(config?: OllamaEmbedConfig);
|
|
15
|
+
embed(texts: string[]): Promise<Float32Array[]>;
|
|
16
|
+
health(): Promise<EmbedHealth>;
|
|
17
|
+
}
|