@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,269 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anthropic memory-tool backend adapter (ADR-007 Wave 4a, migration-map 4a).
|
|
3
|
+
*
|
|
4
|
+
* Anthropic's client-side memory tool (docs.claude.com memory-tool) expects
|
|
5
|
+
* the HARNESS to execute file-like commands (view/create/str_replace/insert/
|
|
6
|
+
* delete/rename) against a virtual `/memories` filesystem. This module maps
|
|
7
|
+
* those commands onto astramem memories so any Claude app using the memory
|
|
8
|
+
* tool can be backed by the daemon — see docs/memory-tool-adapter.md for the
|
|
9
|
+
* full command-mapping table and limitations.
|
|
10
|
+
*
|
|
11
|
+
* Virtual filesystem shape:
|
|
12
|
+
* /memories -> directory listing of "<type>.md" files
|
|
13
|
+
* /memories/<type>.md -> markdown bullet list of current valid
|
|
14
|
+
* memories of that type, one line per
|
|
15
|
+
* memory: "- [<id>] <text>"
|
|
16
|
+
* /memories/<type>.md/<id> -> addresses a single memory (delete only)
|
|
17
|
+
*
|
|
18
|
+
* `<type>` must be one of the MemoryType enum values (decision, fact,
|
|
19
|
+
* lesson, command, todo, note, event). For create/insert, an unrecognized
|
|
20
|
+
* type slug in the path falls back to 'note' rather than erroring — the
|
|
21
|
+
* model may invent filenames the harness has never seen before.
|
|
22
|
+
*
|
|
23
|
+
* Design rulings (binding, see dispatch prompt for Wave 4a):
|
|
24
|
+
* - create/insert: file_text/insert_text becomes ONE memory's text (no
|
|
25
|
+
* bullet parsing — parsing markdown bullets back into memories is lossy
|
|
26
|
+
* and was explicitly rejected). Redacted via redactIfEnabled, inserted
|
|
27
|
+
* via MemoryRepo.insertWithCreateEvent (mirrors POST /remember), but
|
|
28
|
+
* WITHOUT embedding metadata — embedding is not required synchronously,
|
|
29
|
+
* the memory is FTS-searchable immediately and vec-indexed on reembed.
|
|
30
|
+
* - str_replace: finds the single valid memory of that type whose text
|
|
31
|
+
* contains old_str, then supersedes it (insert new + MemoryEventRepo
|
|
32
|
+
* .supersede) rather than mutating the row in place — every memory
|
|
33
|
+
* write goes through the ADR-002 event log.
|
|
34
|
+
* - delete: whole-file (`/memories/<type>.md`) erases every current
|
|
35
|
+
* memory of that type; per-id (`/memories/<type>.md/<id>`) erases just
|
|
36
|
+
* that one. Both use MemoryEventRepo.erase (hard delete + tombstone
|
|
37
|
+
* event, ADR-006 W5) — never a soft invalidate.
|
|
38
|
+
* - rename: NOT supported v1 (a "rename" would mean changing an atom's
|
|
39
|
+
* type, which isn't modeled) — always returns an error result.
|
|
40
|
+
* - Unknown paths/commands never throw; they return { error }.
|
|
41
|
+
*/
|
|
42
|
+
import { createHash } from 'node:crypto';
|
|
43
|
+
import { MemoryRepo } from '../storage/memories.js';
|
|
44
|
+
import { MemoryEventRepo, MemoryNotFoundError, MemoryConflictError } from '../storage/memory-events.js';
|
|
45
|
+
import { redactIfEnabled } from '../redact/index.js';
|
|
46
|
+
import { recordRedactionEvents } from '../storage/redaction-log.js';
|
|
47
|
+
const MEMORY_TYPES = ['decision', 'fact', 'lesson', 'command', 'todo', 'note', 'event'];
|
|
48
|
+
function isMemoryType(x) {
|
|
49
|
+
return MEMORY_TYPES.includes(x);
|
|
50
|
+
}
|
|
51
|
+
/** Parses a virtual path under /memories. Returns null for anything outside that tree. */
|
|
52
|
+
function parseMemoriesPath(path) {
|
|
53
|
+
if (path === '/memories' || path === '/memories/')
|
|
54
|
+
return { kind: 'root' };
|
|
55
|
+
const m = /^\/memories\/([^/]+)\.md(?:\/(.+))?$/.exec(path);
|
|
56
|
+
if (!m || !m[1])
|
|
57
|
+
return null;
|
|
58
|
+
return m[2] ? { kind: 'type-file-item', typeSlug: m[1], itemId: m[2] } : { kind: 'type-file', typeSlug: m[1] };
|
|
59
|
+
}
|
|
60
|
+
function listValidMemoriesByType(db, type) {
|
|
61
|
+
return db
|
|
62
|
+
.prepare(`SELECT id, type, text, created_at FROM memories WHERE type = ? AND valid_to IS NULL ORDER BY created_at ASC`)
|
|
63
|
+
.all(type);
|
|
64
|
+
}
|
|
65
|
+
function listTypesWithValidMemories(db) {
|
|
66
|
+
const rows = db.prepare(`SELECT DISTINCT type FROM memories WHERE valid_to IS NULL ORDER BY type ASC`).all();
|
|
67
|
+
return rows.map(r => r.type);
|
|
68
|
+
}
|
|
69
|
+
function renderTypeFile(rows) {
|
|
70
|
+
return rows.map(r => `- [${r.id}] ${r.text}`).join('\n');
|
|
71
|
+
}
|
|
72
|
+
/** Applies text-editor-style view_range (1-indexed, inclusive; end === -1 means to EOF). */
|
|
73
|
+
function applyViewRange(content, range) {
|
|
74
|
+
if (!range)
|
|
75
|
+
return { content };
|
|
76
|
+
const lines = content.split('\n');
|
|
77
|
+
const [start, endRaw] = range;
|
|
78
|
+
const end = endRaw === -1 ? lines.length : endRaw;
|
|
79
|
+
if (!Number.isInteger(start) || !Number.isInteger(end) || start < 1 || start > lines.length || end < start) {
|
|
80
|
+
return { error: `invalid view_range: [${start}, ${endRaw}] for a ${lines.length}-line file` };
|
|
81
|
+
}
|
|
82
|
+
return { content: lines.slice(start - 1, end).join('\n') };
|
|
83
|
+
}
|
|
84
|
+
function handleView(db, cmd) {
|
|
85
|
+
const parsed = parseMemoriesPath(cmd.path);
|
|
86
|
+
if (!parsed)
|
|
87
|
+
return { error: `no such file: ${cmd.path}` };
|
|
88
|
+
if (parsed.kind === 'root') {
|
|
89
|
+
const listing = listTypesWithValidMemories(db)
|
|
90
|
+
.map(t => `${t}.md`)
|
|
91
|
+
.join('\n');
|
|
92
|
+
return applyViewRange(listing, cmd.view_range);
|
|
93
|
+
}
|
|
94
|
+
if (parsed.kind === 'type-file') {
|
|
95
|
+
if (!isMemoryType(parsed.typeSlug))
|
|
96
|
+
return { error: `no such file: ${cmd.path}` };
|
|
97
|
+
const rows = listValidMemoriesByType(db, parsed.typeSlug);
|
|
98
|
+
return applyViewRange(renderTypeFile(rows), cmd.view_range);
|
|
99
|
+
}
|
|
100
|
+
// type-file-item: viewing a single memory by id is not part of the v1
|
|
101
|
+
// contract (view is documented only for the root and whole type files).
|
|
102
|
+
return { error: `view does not support a single memory id — view /memories/${parsed.typeSlug}.md instead` };
|
|
103
|
+
}
|
|
104
|
+
function handleCreateOrInsert(db, config, cmd) {
|
|
105
|
+
const parsed = parseMemoriesPath(cmd.path);
|
|
106
|
+
if (!parsed || parsed.kind !== 'type-file') {
|
|
107
|
+
return { error: `invalid path for ${cmd.command}: ${cmd.path}` };
|
|
108
|
+
}
|
|
109
|
+
const rawText = cmd.command === 'create' ? cmd.file_text : cmd.insert_text;
|
|
110
|
+
if (typeof rawText !== 'string' || rawText.length === 0) {
|
|
111
|
+
const field = cmd.command === 'create' ? 'file_text' : 'insert_text';
|
|
112
|
+
return { error: `missing ${field} for ${cmd.command}` };
|
|
113
|
+
}
|
|
114
|
+
const type = isMemoryType(parsed.typeSlug) ? parsed.typeSlug : 'note';
|
|
115
|
+
// Same choke point as POST /remember (SEC-3/5): redact before persistence.
|
|
116
|
+
const { text, events: redactionEvents } = redactIfEnabled(rawText, config);
|
|
117
|
+
recordRedactionEvents(db, redactionEvents, null);
|
|
118
|
+
const hash = createHash('sha256').update(text).digest('hex').slice(0, 32);
|
|
119
|
+
const repo = new MemoryRepo(db);
|
|
120
|
+
const events = new MemoryEventRepo(db);
|
|
121
|
+
const { id } = repo.insertWithCreateEvent({
|
|
122
|
+
type,
|
|
123
|
+
text,
|
|
124
|
+
normalized_text: text.toLowerCase(),
|
|
125
|
+
repo: null,
|
|
126
|
+
project: null,
|
|
127
|
+
branch: null,
|
|
128
|
+
agent: null,
|
|
129
|
+
session_id: null,
|
|
130
|
+
hash,
|
|
131
|
+
source_hash: null,
|
|
132
|
+
importance: 0.5,
|
|
133
|
+
confidence: 0.5,
|
|
134
|
+
// Deliberately no embedding metadata (KF-B/Wave-4a ruling): FTS-searchable
|
|
135
|
+
// immediately; vec index catches up on reembed rather than blocking here.
|
|
136
|
+
embedding_provider: null,
|
|
137
|
+
embedding_model: null,
|
|
138
|
+
embedding_dim: null,
|
|
139
|
+
}, events);
|
|
140
|
+
return { content: `created memory ${id} in ${type}.md` };
|
|
141
|
+
}
|
|
142
|
+
function handleStrReplace(db, config, cmd) {
|
|
143
|
+
const parsed = parseMemoriesPath(cmd.path);
|
|
144
|
+
if (!parsed || parsed.kind !== 'type-file') {
|
|
145
|
+
return { error: `invalid path for str_replace: ${cmd.path}` };
|
|
146
|
+
}
|
|
147
|
+
if (!isMemoryType(parsed.typeSlug))
|
|
148
|
+
return { error: `no such file: ${cmd.path}` };
|
|
149
|
+
if (typeof cmd.old_str !== 'string' || cmd.old_str.length === 0)
|
|
150
|
+
return { error: 'missing old_str' };
|
|
151
|
+
if (typeof cmd.new_str !== 'string')
|
|
152
|
+
return { error: 'missing new_str' };
|
|
153
|
+
const type = parsed.typeSlug;
|
|
154
|
+
const rows = listValidMemoriesByType(db, type);
|
|
155
|
+
const matches = rows.filter(r => r.text.includes(cmd.old_str));
|
|
156
|
+
if (matches.length === 0)
|
|
157
|
+
return { error: `old_str not found in ${cmd.path}` };
|
|
158
|
+
if (matches.length > 1) {
|
|
159
|
+
return { error: `old_str matches ${matches.length} memories in ${cmd.path} — must match exactly one` };
|
|
160
|
+
}
|
|
161
|
+
const old = matches[0];
|
|
162
|
+
const occurrences = old.text.split(cmd.old_str).length - 1;
|
|
163
|
+
if (occurrences !== 1) {
|
|
164
|
+
return { error: `old_str must occur exactly once within the matched memory (found ${occurrences})` };
|
|
165
|
+
}
|
|
166
|
+
const replacedText = old.text.replace(cmd.old_str, cmd.new_str);
|
|
167
|
+
const { text, events: redactionEvents } = redactIfEnabled(replacedText, config);
|
|
168
|
+
recordRedactionEvents(db, redactionEvents, null);
|
|
169
|
+
const hash = createHash('sha256').update(text).digest('hex').slice(0, 32);
|
|
170
|
+
const repo = new MemoryRepo(db);
|
|
171
|
+
const events = new MemoryEventRepo(db);
|
|
172
|
+
const { id: newId } = repo.insertWithCreateEvent({
|
|
173
|
+
type,
|
|
174
|
+
text,
|
|
175
|
+
normalized_text: text.toLowerCase(),
|
|
176
|
+
repo: null,
|
|
177
|
+
project: null,
|
|
178
|
+
branch: null,
|
|
179
|
+
agent: null,
|
|
180
|
+
session_id: null,
|
|
181
|
+
hash,
|
|
182
|
+
source_hash: null,
|
|
183
|
+
importance: 0.5,
|
|
184
|
+
confidence: 0.5,
|
|
185
|
+
embedding_provider: null,
|
|
186
|
+
embedding_model: null,
|
|
187
|
+
embedding_dim: null,
|
|
188
|
+
}, events);
|
|
189
|
+
if (newId !== old.id) {
|
|
190
|
+
try {
|
|
191
|
+
events.supersede(old.id, newId);
|
|
192
|
+
}
|
|
193
|
+
catch (err) {
|
|
194
|
+
if (err instanceof MemoryNotFoundError || err instanceof MemoryConflictError) {
|
|
195
|
+
return { error: err.message };
|
|
196
|
+
}
|
|
197
|
+
throw err;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return { content: `superseded memory ${old.id} with ${newId} in ${type}.md` };
|
|
201
|
+
}
|
|
202
|
+
function handleDelete(db, cmd) {
|
|
203
|
+
const parsed = parseMemoriesPath(cmd.path);
|
|
204
|
+
if (!parsed)
|
|
205
|
+
return { error: `no such file: ${cmd.path}` };
|
|
206
|
+
const events = new MemoryEventRepo(db);
|
|
207
|
+
if (parsed.kind === 'type-file-item') {
|
|
208
|
+
if (!isMemoryType(parsed.typeSlug))
|
|
209
|
+
return { error: `no such file: ${cmd.path}` };
|
|
210
|
+
const memory = new MemoryRepo(db).get(parsed.itemId);
|
|
211
|
+
if (!memory || memory.type !== parsed.typeSlug || memory.valid_to !== null) {
|
|
212
|
+
return { error: `no such memory: ${cmd.path}` };
|
|
213
|
+
}
|
|
214
|
+
try {
|
|
215
|
+
events.erase(parsed.itemId);
|
|
216
|
+
}
|
|
217
|
+
catch (err) {
|
|
218
|
+
if (err instanceof MemoryNotFoundError)
|
|
219
|
+
return { error: err.message };
|
|
220
|
+
throw err;
|
|
221
|
+
}
|
|
222
|
+
return { content: `erased memory ${parsed.itemId}` };
|
|
223
|
+
}
|
|
224
|
+
if (parsed.kind === 'type-file') {
|
|
225
|
+
if (!isMemoryType(parsed.typeSlug))
|
|
226
|
+
return { error: `no such file: ${cmd.path}` };
|
|
227
|
+
const rows = listValidMemoriesByType(db, parsed.typeSlug);
|
|
228
|
+
for (const row of rows) {
|
|
229
|
+
events.erase(row.id);
|
|
230
|
+
}
|
|
231
|
+
return { content: `erased ${rows.length} memories from ${parsed.typeSlug}.md` };
|
|
232
|
+
}
|
|
233
|
+
return { error: `cannot delete: ${cmd.path}` };
|
|
234
|
+
}
|
|
235
|
+
function handleRename() {
|
|
236
|
+
return {
|
|
237
|
+
error: 'rename is not supported by the memory-tool adapter (v1) — a rename would mean changing a memory\'s type, ' +
|
|
238
|
+
'which is not modeled; delete and re-create under the new type instead',
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Maps one Anthropic memory-tool command onto astramem memories. Never
|
|
243
|
+
* throws — every failure path (bad path, unknown command, storage error)
|
|
244
|
+
* comes back as { error } so the caller can relay it straight into a
|
|
245
|
+
* tool_result without its own try/catch.
|
|
246
|
+
*/
|
|
247
|
+
export function handleMemoryToolCommand(db, config, cmd) {
|
|
248
|
+
try {
|
|
249
|
+
switch (cmd.command) {
|
|
250
|
+
case 'view':
|
|
251
|
+
return handleView(db, cmd);
|
|
252
|
+
case 'create':
|
|
253
|
+
case 'insert':
|
|
254
|
+
return handleCreateOrInsert(db, config, cmd);
|
|
255
|
+
case 'str_replace':
|
|
256
|
+
return handleStrReplace(db, config, cmd);
|
|
257
|
+
case 'delete':
|
|
258
|
+
return handleDelete(db, cmd);
|
|
259
|
+
case 'rename':
|
|
260
|
+
return handleRename();
|
|
261
|
+
default:
|
|
262
|
+
return { error: `unknown command: ${String(cmd.command)}` };
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
catch (err) {
|
|
266
|
+
return { error: err instanceof Error ? err.message : String(err) };
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/memory-tool/adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed pipeline errors for failure classification.
|
|
3
|
+
*
|
|
4
|
+
* Throw TransientError for recoverable conditions (network failures, rate limits,
|
|
5
|
+
* server-side 5xx) where retrying has a meaningful chance of success.
|
|
6
|
+
*
|
|
7
|
+
* Throw DeterministicError for conditions that will not self-heal (bad schema,
|
|
8
|
+
* parse failure, 4xx auth/validation) where retrying wastes LLM budget.
|
|
9
|
+
*/
|
|
10
|
+
export declare class TransientError extends Error {
|
|
11
|
+
readonly cause?: unknown | undefined;
|
|
12
|
+
readonly kind: "transient";
|
|
13
|
+
constructor(message: string, cause?: unknown | undefined);
|
|
14
|
+
static is(err: unknown): err is TransientError;
|
|
15
|
+
}
|
|
16
|
+
export declare class DeterministicError extends Error {
|
|
17
|
+
readonly cause?: unknown | undefined;
|
|
18
|
+
readonly kind: "deterministic";
|
|
19
|
+
constructor(message: string, cause?: unknown | undefined);
|
|
20
|
+
static is(err: unknown): err is DeterministicError;
|
|
21
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed pipeline errors for failure classification.
|
|
3
|
+
*
|
|
4
|
+
* Throw TransientError for recoverable conditions (network failures, rate limits,
|
|
5
|
+
* server-side 5xx) where retrying has a meaningful chance of success.
|
|
6
|
+
*
|
|
7
|
+
* Throw DeterministicError for conditions that will not self-heal (bad schema,
|
|
8
|
+
* parse failure, 4xx auth/validation) where retrying wastes LLM budget.
|
|
9
|
+
*/
|
|
10
|
+
export class TransientError extends Error {
|
|
11
|
+
cause;
|
|
12
|
+
kind = 'transient';
|
|
13
|
+
constructor(message, cause) {
|
|
14
|
+
super(message);
|
|
15
|
+
this.cause = cause;
|
|
16
|
+
this.name = 'TransientError';
|
|
17
|
+
}
|
|
18
|
+
static is(err) {
|
|
19
|
+
return err instanceof Error && err.kind === 'transient';
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export class DeterministicError extends Error {
|
|
23
|
+
cause;
|
|
24
|
+
kind = 'deterministic';
|
|
25
|
+
constructor(message, cause) {
|
|
26
|
+
super(message);
|
|
27
|
+
this.cause = cause;
|
|
28
|
+
this.name = 'DeterministicError';
|
|
29
|
+
}
|
|
30
|
+
static is(err) {
|
|
31
|
+
return err instanceof Error && err.kind === 'deterministic';
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/pipeline/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,OAAO,cAAe,SAAQ,KAAK;IAGM;IAFpC,IAAI,GAAG,WAAoB,CAAC;IAErC,YAAY,OAAe,EAAkB,KAAe;QAC1D,KAAK,CAAC,OAAO,CAAC,CAAC;QAD4B,UAAK,GAAL,KAAK,CAAU;QAE1D,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;IAED,MAAM,CAAC,EAAE,CAAC,GAAY;QACpB,OAAO,GAAG,YAAY,KAAK,IAAK,GAA0B,CAAC,IAAI,KAAK,WAAW,CAAC;IAClF,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAGE;IAFpC,IAAI,GAAG,eAAwB,CAAC;IAEzC,YAAY,OAAe,EAAkB,KAAe;QAC1D,KAAK,CAAC,OAAO,CAAC,CAAC;QAD4B,UAAK,GAAL,KAAK,CAAU;QAE1D,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;IAED,MAAM,CAAC,EAAE,CAAC,GAAY;QACpB,OAAO,GAAG,YAAY,KAAK,IAAK,GAA0B,CAAC,IAAI,KAAK,eAAe,CAAC;IACtF,CAAC;CACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Failure classifier for the worker retry router.
|
|
3
|
+
*
|
|
4
|
+
* Distinguishes transient failures (retry with backoff) from deterministic
|
|
5
|
+
* failures (immediate poison — no further LLM budget spent).
|
|
6
|
+
*
|
|
7
|
+
* Priority:
|
|
8
|
+
* 1. Explicit typed errors (TransientError / DeterministicError) — authoritative.
|
|
9
|
+
* 2. Message heuristics — cover unwrapped errors from providers / stages.
|
|
10
|
+
* 3. Default: transient (conservative — retry rather than silently drop).
|
|
11
|
+
*/
|
|
12
|
+
export type FailureKind = 'transient' | 'deterministic';
|
|
13
|
+
export declare function classifyError(err: unknown): FailureKind;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Failure classifier for the worker retry router.
|
|
3
|
+
*
|
|
4
|
+
* Distinguishes transient failures (retry with backoff) from deterministic
|
|
5
|
+
* failures (immediate poison — no further LLM budget spent).
|
|
6
|
+
*
|
|
7
|
+
* Priority:
|
|
8
|
+
* 1. Explicit typed errors (TransientError / DeterministicError) — authoritative.
|
|
9
|
+
* 2. Message heuristics — cover unwrapped errors from providers / stages.
|
|
10
|
+
* 3. Default: transient (conservative — retry rather than silently drop).
|
|
11
|
+
*/
|
|
12
|
+
import { TransientError, DeterministicError } from './errors.js';
|
|
13
|
+
/** Heuristic substrings that classify a message as transient. */
|
|
14
|
+
const TRANSIENT_PATTERNS = [
|
|
15
|
+
'econnrefused',
|
|
16
|
+
'etimedout',
|
|
17
|
+
'econnreset',
|
|
18
|
+
'enetunreach',
|
|
19
|
+
'ehostunreach',
|
|
20
|
+
'epipe',
|
|
21
|
+
'rate limit',
|
|
22
|
+
'rate-limit',
|
|
23
|
+
'ratelimit',
|
|
24
|
+
'429',
|
|
25
|
+
'500',
|
|
26
|
+
'502',
|
|
27
|
+
'503',
|
|
28
|
+
'504',
|
|
29
|
+
];
|
|
30
|
+
/** Heuristic substrings that classify a message as deterministic. */
|
|
31
|
+
const DETERMINISTIC_PATTERNS = [
|
|
32
|
+
'zod',
|
|
33
|
+
'safeParse',
|
|
34
|
+
'json parse',
|
|
35
|
+
'json.parse',
|
|
36
|
+
'unexpected token',
|
|
37
|
+
'unexpected end of json',
|
|
38
|
+
'invalid json',
|
|
39
|
+
'parse error',
|
|
40
|
+
'parse fail',
|
|
41
|
+
'schema',
|
|
42
|
+
'validation fail',
|
|
43
|
+
'validation error',
|
|
44
|
+
'400',
|
|
45
|
+
'401',
|
|
46
|
+
'403',
|
|
47
|
+
'404',
|
|
48
|
+
'422',
|
|
49
|
+
];
|
|
50
|
+
export function classifyError(err) {
|
|
51
|
+
// Explicit typed errors — highest authority
|
|
52
|
+
if (TransientError.is(err))
|
|
53
|
+
return 'transient';
|
|
54
|
+
if (DeterministicError.is(err))
|
|
55
|
+
return 'deterministic';
|
|
56
|
+
if (!(err instanceof Error))
|
|
57
|
+
return 'transient'; // conservative default
|
|
58
|
+
const m = err.message.toLowerCase();
|
|
59
|
+
// Check transient patterns first (rate-limit / network errors should not be
|
|
60
|
+
// misclassified as deterministic even if the message also contains "400").
|
|
61
|
+
for (const p of TRANSIENT_PATTERNS) {
|
|
62
|
+
if (m.includes(p))
|
|
63
|
+
return 'transient';
|
|
64
|
+
}
|
|
65
|
+
for (const p of DETERMINISTIC_PATTERNS) {
|
|
66
|
+
if (m.includes(p))
|
|
67
|
+
return 'deterministic';
|
|
68
|
+
}
|
|
69
|
+
// Conservative default: retry rather than silently poison
|
|
70
|
+
return 'transient';
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=failure-classifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"failure-classifier.js","sourceRoot":"","sources":["../../src/pipeline/failure-classifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAIjE,iEAAiE;AACjE,MAAM,kBAAkB,GAAa;IACnC,cAAc;IACd,WAAW;IACX,YAAY;IACZ,aAAa;IACb,cAAc;IACd,OAAO;IACP,YAAY;IACZ,YAAY;IACZ,WAAW;IACX,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;CACN,CAAC;AAEF,qEAAqE;AACrE,MAAM,sBAAsB,GAAa;IACvC,KAAK;IACL,WAAW;IACX,YAAY;IACZ,YAAY;IACZ,kBAAkB;IAClB,wBAAwB;IACxB,cAAc;IACd,aAAa;IACb,YAAY;IACZ,QAAQ;IACR,iBAAiB;IACjB,kBAAkB;IAClB,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;CACN,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,GAAY;IACxC,4CAA4C;IAC5C,IAAI,cAAc,CAAC,EAAE,CAAC,GAAG,CAAC;QAAE,OAAO,WAAW,CAAC;IAC/C,IAAI,kBAAkB,CAAC,EAAE,CAAC,GAAG,CAAC;QAAE,OAAO,eAAe,CAAC;IAEvD,IAAI,CAAC,CAAC,GAAG,YAAY,KAAK,CAAC;QAAE,OAAO,WAAW,CAAC,CAAC,uBAAuB;IAExE,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;IAEpC,4EAA4E;IAC5E,2EAA2E;IAC3E,KAAK,MAAM,CAAC,IAAI,kBAAkB,EAAE,CAAC;QACnC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,OAAO,WAAW,CAAC;IACxC,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,sBAAsB,EAAE,CAAC;QACvC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,OAAO,eAAe,CAAC;IAC5C,CAAC;IAED,0DAA0D;IAC1D,OAAO,WAAW,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extended HandlerCtx for Wave 3 distillation.
|
|
3
|
+
*
|
|
4
|
+
* Wave 3 adds providers, vector store, and repos to the handler context.
|
|
5
|
+
* We define an extended type here WITHOUT editing the frozen src/contracts/*
|
|
6
|
+
* or the base HandlerCtx in handler.ts.
|
|
7
|
+
*
|
|
8
|
+
* The startWorker() call in serve.ts/worker will be updated to pass an
|
|
9
|
+
* ExtendedHandlerCtx. Handlers that need providers type-assert to this.
|
|
10
|
+
*/
|
|
11
|
+
import type { HandlerCtx } from './handler.js';
|
|
12
|
+
import type { MemoryRepo } from '../storage/memories.js';
|
|
13
|
+
import type { SqliteVecStore } from '../vector/sqlite-vec.js';
|
|
14
|
+
import type { ProviderSet } from '../providers/index.js';
|
|
15
|
+
export interface ExtendedHandlerCtx extends HandlerCtx {
|
|
16
|
+
providers: ProviderSet;
|
|
17
|
+
memoryRepo: MemoryRepo;
|
|
18
|
+
vecStore: SqliteVecStore;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Type guard — true when ctx has the Wave 3 provider extensions.
|
|
22
|
+
*/
|
|
23
|
+
export declare function isExtendedCtx(ctx: HandlerCtx): ctx is ExtendedHandlerCtx;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extended HandlerCtx for Wave 3 distillation.
|
|
3
|
+
*
|
|
4
|
+
* Wave 3 adds providers, vector store, and repos to the handler context.
|
|
5
|
+
* We define an extended type here WITHOUT editing the frozen src/contracts/*
|
|
6
|
+
* or the base HandlerCtx in handler.ts.
|
|
7
|
+
*
|
|
8
|
+
* The startWorker() call in serve.ts/worker will be updated to pass an
|
|
9
|
+
* ExtendedHandlerCtx. Handlers that need providers type-assert to this.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Type guard — true when ctx has the Wave 3 provider extensions.
|
|
13
|
+
*/
|
|
14
|
+
export function isExtendedCtx(ctx) {
|
|
15
|
+
return ('providers' in ctx &&
|
|
16
|
+
ctx.providers !== null &&
|
|
17
|
+
typeof ctx.providers === 'object');
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=handler-ctx-ext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler-ctx-ext.js","sourceRoot":"","sources":["../../src/pipeline/handler-ctx-ext.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAcH;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,GAAe;IAC3C,OAAO,CACL,WAAW,IAAI,GAAG;QAClB,GAAG,CAAC,SAAS,KAAK,IAAI;QACtB,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,CAClC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { DB } from '../storage/db.js';
|
|
2
|
+
import type { Config } from '../config/config.js';
|
|
3
|
+
import type { JobKind } from '../contracts/index.js';
|
|
4
|
+
/**
|
|
5
|
+
* Context passed to every job handler.
|
|
6
|
+
* Wave 3 extends this via module augmentation to add:
|
|
7
|
+
* llm: LLMProvider, embed: EmbedProvider, vector: VectorStore, memoryRepo: MemoryRepo
|
|
8
|
+
*/
|
|
9
|
+
export interface HandlerCtx {
|
|
10
|
+
db: DB;
|
|
11
|
+
config: Config;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* A job handler is a named unit of async work keyed to a JobKind.
|
|
15
|
+
* Throw to signal failure; the worker increments attempts and transitions state.
|
|
16
|
+
*/
|
|
17
|
+
export interface JobHandler {
|
|
18
|
+
kind: JobKind;
|
|
19
|
+
handle(payload: unknown, ctx: HandlerCtx): Promise<void>;
|
|
20
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/pipeline/handler.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { JobHandler } from '../handler.js';
|
|
2
|
+
/**
|
|
3
|
+
* Cleanup handler — IMPLEMENTED.
|
|
4
|
+
*
|
|
5
|
+
* Prunes jobs in the 'completed' state whose updated_at is older than
|
|
6
|
+
* `older_than_days` (default 30). Other states (pending, running, failed,
|
|
7
|
+
* poison, paused) are never touched so the operator can inspect them.
|
|
8
|
+
*
|
|
9
|
+
* Also runs the memory TTL/archival policy pass (FEAT-404) on the same
|
|
10
|
+
* cadence — config.archival.enabled === false (the default) makes it a
|
|
11
|
+
* no-op, so existing cleanup-job behavior is unchanged unless an operator
|
|
12
|
+
* opts in.
|
|
13
|
+
*/
|
|
14
|
+
export declare const cleanupHandler: JobHandler;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { CleanupPayloadSchema } from '../../contracts/index.js';
|
|
2
|
+
import { runArchivalPass } from '../../storage/archival.js';
|
|
3
|
+
/**
|
|
4
|
+
* Cleanup handler — IMPLEMENTED.
|
|
5
|
+
*
|
|
6
|
+
* Prunes jobs in the 'completed' state whose updated_at is older than
|
|
7
|
+
* `older_than_days` (default 30). Other states (pending, running, failed,
|
|
8
|
+
* poison, paused) are never touched so the operator can inspect them.
|
|
9
|
+
*
|
|
10
|
+
* Also runs the memory TTL/archival policy pass (FEAT-404) on the same
|
|
11
|
+
* cadence — config.archival.enabled === false (the default) makes it a
|
|
12
|
+
* no-op, so existing cleanup-job behavior is unchanged unless an operator
|
|
13
|
+
* opts in.
|
|
14
|
+
*/
|
|
15
|
+
export const cleanupHandler = {
|
|
16
|
+
kind: 'cleanup',
|
|
17
|
+
async handle(payload, ctx) {
|
|
18
|
+
const parsed = CleanupPayloadSchema.safeParse(payload);
|
|
19
|
+
if (!parsed.success) {
|
|
20
|
+
throw new Error(`Invalid cleanup payload: ${parsed.error.message}`);
|
|
21
|
+
}
|
|
22
|
+
const { older_than_days } = parsed.data;
|
|
23
|
+
const cutoffMs = Date.now() - older_than_days * 24 * 60 * 60 * 1000;
|
|
24
|
+
const result = ctx.db.prepare(`
|
|
25
|
+
DELETE FROM jobs
|
|
26
|
+
WHERE state = 'completed'
|
|
27
|
+
AND updated_at < ?
|
|
28
|
+
`).run(cutoffMs);
|
|
29
|
+
// Poison jobs are kept 30 days for `queue` forensics, then purged —
|
|
30
|
+
// without this they accumulate forever (nothing else ever re-reads them).
|
|
31
|
+
const POISON_RETENTION_DAYS = 30;
|
|
32
|
+
const poisonCutoffMs = Date.now() - POISON_RETENTION_DAYS * 24 * 60 * 60 * 1000;
|
|
33
|
+
const poisonResult = ctx.db.prepare(`
|
|
34
|
+
DELETE FROM jobs
|
|
35
|
+
WHERE state = 'poison'
|
|
36
|
+
AND updated_at < ?
|
|
37
|
+
`).run(poisonCutoffMs);
|
|
38
|
+
console.log(`[cleanup] pruned ${result.changes} completed job(s) older than ${older_than_days} day(s), ` +
|
|
39
|
+
`${poisonResult.changes} poison job(s) older than ${POISON_RETENTION_DAYS} day(s)`);
|
|
40
|
+
const archival = runArchivalPass(ctx.db, ctx.config);
|
|
41
|
+
if (archival.candidates > 0) {
|
|
42
|
+
console.log(`[cleanup] archival pass: ${archival.archived}/${archival.candidates} stale low-usefulness ` +
|
|
43
|
+
`memories archived`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
//# sourceMappingURL=cleanup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cleanup.js","sourceRoot":"","sources":["../../../src/pipeline/handlers/cleanup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAEhE,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,cAAc,GAAe;IACxC,IAAI,EAAE,SAAS;IAEf,KAAK,CAAC,MAAM,CAAC,OAAgB,EAAE,GAAe;QAC5C,MAAM,MAAM,GAAG,oBAAoB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACvD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,4BAA4B,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,eAAe,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QAEpE,MAAM,MAAM,GAAG,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC;;;;KAI7B,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAEjB,oEAAoE;QACpE,0EAA0E;QAC1E,MAAM,qBAAqB,GAAG,EAAE,CAAC;QACjC,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,qBAAqB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QAChF,MAAM,YAAY,GAAG,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC;;;;KAInC,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAEvB,OAAO,CAAC,GAAG,CACT,oBAAoB,MAAM,CAAC,OAAO,gCAAgC,eAAe,WAAW;YAC5F,GAAG,YAAY,CAAC,OAAO,6BAA6B,qBAAqB,SAAS,CACnF,CAAC;QAEF,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QACrD,IAAI,QAAQ,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CACT,4BAA4B,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,UAAU,wBAAwB;gBAC5F,mBAAmB,CACpB,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `consolidate` job handler — scheduled/queued entry point for the ADR-004
|
|
3
|
+
* stage 9 pass. The pass itself is deterministic and synchronous (no LLM in
|
|
4
|
+
* v1); this wrapper exists so consolidation can ride the jobs table like
|
|
5
|
+
* every other pipeline stage.
|
|
6
|
+
*/
|
|
7
|
+
import type { JobHandler } from '../handler.js';
|
|
8
|
+
export declare const consolidateHandler: JobHandler;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `consolidate` job handler — scheduled/queued entry point for the ADR-004
|
|
3
|
+
* stage 9 pass. The pass itself is deterministic and synchronous (no LLM in
|
|
4
|
+
* v1); this wrapper exists so consolidation can ride the jobs table like
|
|
5
|
+
* every other pipeline stage.
|
|
6
|
+
*/
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
import { runConsolidation } from '../../consolidate/consolidate.js';
|
|
9
|
+
const ConsolidatePayloadSchema = z.object({
|
|
10
|
+
merge_threshold: z.number().min(0).max(1).optional(),
|
|
11
|
+
propose_threshold: z.number().min(0).max(1).optional(),
|
|
12
|
+
});
|
|
13
|
+
export const consolidateHandler = {
|
|
14
|
+
kind: 'consolidate',
|
|
15
|
+
async handle(payload, ctx) {
|
|
16
|
+
const parsed = ConsolidatePayloadSchema.parse(payload ?? {});
|
|
17
|
+
runConsolidation(ctx.db, {
|
|
18
|
+
mergeThreshold: parsed.merge_threshold,
|
|
19
|
+
proposeThreshold: parsed.propose_threshold,
|
|
20
|
+
});
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=consolidate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consolidate.js","sourceRoot":"","sources":["../../../src/pipeline/handlers/consolidate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAEpE,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACpD,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CACvD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAe;IAC5C,IAAI,EAAE,aAAa;IACnB,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG;QACvB,MAAM,MAAM,GAAG,wBAAwB,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QAC7D,gBAAgB,CAAC,GAAG,CAAC,EAAE,EAAE;YACvB,cAAc,EAAE,MAAM,CAAC,eAAe;YACtC,gBAAgB,EAAE,MAAM,CAAC,iBAAiB;SAC3C,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Distill-events handler — ADR-008 `events` capture kind.
|
|
3
|
+
*
|
|
4
|
+
* Pre-typed atom candidates (runner-plugin grades/lessons/review verdicts)
|
|
5
|
+
* are already atom-shaped when they hit the wire, so this handler skips
|
|
6
|
+
* pipeline stages 1-5 (cleanup/normalize/chunk/compact/extract — the raw-text
|
|
7
|
+
* and LLM stages) and enters directly at stage 6 (reduce), chaining straight
|
|
8
|
+
* through stage 7 (memory-normalize) and stage 8 (embed+index), mirroring
|
|
9
|
+
* the same three-stage tail src/distill/pipeline.ts runs for the transcript
|
|
10
|
+
* path. No LLMProvider is used here (no compaction/extraction call), so the
|
|
11
|
+
* BudgetExceeded semantics distillHandler has for stages 4/5 do not apply —
|
|
12
|
+
* only the embed provider is exercised (stage 8).
|
|
13
|
+
*/
|
|
14
|
+
import type { JobHandler } from '../handler.js';
|
|
15
|
+
export declare const distillEventsHandler: JobHandler;
|