@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,626 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Doctor check registry.
|
|
3
|
+
*
|
|
4
|
+
* Track C owns the registry and the 7 core checks below.
|
|
5
|
+
* Other tracks (A, B, D) add checks via register() in their own modules —
|
|
6
|
+
* they call register() at module load time, before the CLI runs runChecks().
|
|
7
|
+
*
|
|
8
|
+
* Registry API:
|
|
9
|
+
* register(check: Check): void
|
|
10
|
+
* getChecks(): Check[]
|
|
11
|
+
*
|
|
12
|
+
* Example (Track A adds its check):
|
|
13
|
+
* import { register } from '../doctor/checks.js';
|
|
14
|
+
* register({ name: 'No stuck jobs', run: async () => { ... } });
|
|
15
|
+
*/
|
|
16
|
+
import { statfsSync, existsSync, accessSync, constants, mkdirSync, writeFileSync, unlinkSync, readdirSync, statSync, readFileSync } from 'node:fs';
|
|
17
|
+
import { join } from 'node:path';
|
|
18
|
+
import { tmpdir, platform } from 'node:os';
|
|
19
|
+
import { randomUUID } from 'node:crypto';
|
|
20
|
+
import { llmChatProbe } from './probes/llm-chat-probe.js';
|
|
21
|
+
import { embedProbe } from './probes/embed-probe.js';
|
|
22
|
+
import { pluginCoexistenceProbe } from './probes/plugin-coexistence.js';
|
|
23
|
+
import { defaultConfigDir, legacyConfigDir } from '../config/datadir.js';
|
|
24
|
+
import { getOrCreateKey, readBearer } from '../storage/keystore.js';
|
|
25
|
+
import { readBearerFromSecretsFile } from '../storage/bearer-keystore.js';
|
|
26
|
+
import { usefulnessRate, usefulnessByType } from '../storage/usefulness.js';
|
|
27
|
+
// ─── Registry ────────────────────────────────────────────────────────────────
|
|
28
|
+
const _registry = [];
|
|
29
|
+
/**
|
|
30
|
+
* Register an additional doctor check. Called by other tracks to extend the
|
|
31
|
+
* doctor command without modifying this file.
|
|
32
|
+
*
|
|
33
|
+
* @param check - A Check object with `name` and `run()`.
|
|
34
|
+
*/
|
|
35
|
+
export function register(check) {
|
|
36
|
+
_registry.push(check);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Returns all currently registered checks (core + any added via register()).
|
|
40
|
+
* The CLI doctor command passes this to runChecks().
|
|
41
|
+
*/
|
|
42
|
+
export function getChecks(opts = {}) {
|
|
43
|
+
return [...coreChecks(opts), ..._registry];
|
|
44
|
+
}
|
|
45
|
+
// ─── Shared: open the real memory.sqlite read-only, key-aware ───────────────
|
|
46
|
+
/**
|
|
47
|
+
* Opens `dbPath` read-only using the production cipher driver
|
|
48
|
+
* (better-sqlite3-multiple-ciphers). When `encryptionEnabled` is true,
|
|
49
|
+
* fetches the key from the keystore (credential store, or key-file fallback)
|
|
50
|
+
* and applies `PRAGMA key` before returning — otherwise a plain
|
|
51
|
+
* better-sqlite3 probe against an encrypted file would fail with
|
|
52
|
+
* "file is not a database", turning every doctor read-check into a false
|
|
53
|
+
* failure on encrypted installs (SEC-8/AC-5).
|
|
54
|
+
*
|
|
55
|
+
* getOrCreateKey() is idempotent — if the DB is genuinely encrypted the key
|
|
56
|
+
* already exists (created at first `serve`), so this call reads it back
|
|
57
|
+
* rather than minting a new one.
|
|
58
|
+
*/
|
|
59
|
+
export async function openProductionDbReadonly(dbPath, encryptionEnabled) {
|
|
60
|
+
const { default: Database } = await import('better-sqlite3-multiple-ciphers');
|
|
61
|
+
const db = new Database(dbPath, { readonly: true });
|
|
62
|
+
if (encryptionEnabled) {
|
|
63
|
+
const { key } = getOrCreateKey(defaultConfigDir());
|
|
64
|
+
db.pragma(`key='${key.replace(/'/g, "''")}'`);
|
|
65
|
+
}
|
|
66
|
+
return db;
|
|
67
|
+
}
|
|
68
|
+
// ─── Check 1: SQLite writable + WAL ──────────────────────────────────────────
|
|
69
|
+
function checkSqliteWritable(dataDir, encryptionEnabled) {
|
|
70
|
+
return {
|
|
71
|
+
name: 'SQLite writable + WAL',
|
|
72
|
+
async run() {
|
|
73
|
+
// Try to write a probe file in the datadir
|
|
74
|
+
const probePath = join(dataDir, `.doctor-probe-${randomUUID()}`);
|
|
75
|
+
try {
|
|
76
|
+
mkdirSync(dataDir, { recursive: true });
|
|
77
|
+
writeFileSync(probePath, 'probe', 'utf8');
|
|
78
|
+
unlinkSync(probePath);
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
return {
|
|
82
|
+
ok: false,
|
|
83
|
+
message: `datadir not writable: ${dataDir}`,
|
|
84
|
+
fix: `chmod u+w "${dataDir}" or set ASTRA_MEMORY_DATADIR to a writable path`,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
// Check WAL by opening a test DB — key-aware so this doesn't false-fail
|
|
88
|
+
// on an encrypted production DB (SEC-8).
|
|
89
|
+
try {
|
|
90
|
+
const dbPath = join(dataDir, 'memory.sqlite');
|
|
91
|
+
// DB may not exist yet — only check WAL if it does
|
|
92
|
+
if (existsSync(dbPath)) {
|
|
93
|
+
const db = await openProductionDbReadonly(dbPath, encryptionEnabled);
|
|
94
|
+
const row = db.prepare('PRAGMA journal_mode').get();
|
|
95
|
+
db.close();
|
|
96
|
+
if (row.journal_mode !== 'wal') {
|
|
97
|
+
return {
|
|
98
|
+
ok: false,
|
|
99
|
+
message: `journal_mode is '${row.journal_mode}', expected 'wal'`,
|
|
100
|
+
fix: 'Run: astramem-local serve (will apply WAL pragma on open)',
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return { ok: true, message: `datadir writable, WAL ok (${dataDir})` };
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
return { ok: false, message: `SQLite probe error: ${err}` };
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
// ─── Check 2: sqlite-vec extension loadable ───────────────────────────────────
|
|
113
|
+
function checkSqliteVec() {
|
|
114
|
+
return {
|
|
115
|
+
name: 'sqlite-vec extension loadable',
|
|
116
|
+
async run() {
|
|
117
|
+
try {
|
|
118
|
+
const { default: Database } = await import('better-sqlite3-multiple-ciphers');
|
|
119
|
+
const { load } = await import('sqlite-vec');
|
|
120
|
+
const db = new Database(':memory:');
|
|
121
|
+
load(db);
|
|
122
|
+
const row = db.prepare("SELECT vec_version() AS v").get();
|
|
123
|
+
db.close();
|
|
124
|
+
if (!row)
|
|
125
|
+
return { ok: false, message: 'sqlite-vec loaded but vec_version() returned nothing' };
|
|
126
|
+
return { ok: true, message: `sqlite-vec ${row.v} loaded` };
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
return {
|
|
130
|
+
ok: false,
|
|
131
|
+
message: `sqlite-vec not loadable: ${err}`,
|
|
132
|
+
fix: 'npm install sqlite-vec (or reinstall native deps for this OS/arch)',
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
// ─── Check 3: FTS5 available ──────────────────────────────────────────────────
|
|
139
|
+
function checkFts5() {
|
|
140
|
+
return {
|
|
141
|
+
name: 'FTS5 available',
|
|
142
|
+
async run() {
|
|
143
|
+
try {
|
|
144
|
+
const { default: Database } = await import('better-sqlite3-multiple-ciphers');
|
|
145
|
+
const db = new Database(':memory:');
|
|
146
|
+
db.exec(`CREATE VIRTUAL TABLE _fts5_probe USING fts5(content)`);
|
|
147
|
+
db.exec(`DROP TABLE _fts5_probe`);
|
|
148
|
+
db.close();
|
|
149
|
+
return { ok: true, message: 'FTS5 available' };
|
|
150
|
+
}
|
|
151
|
+
catch (err) {
|
|
152
|
+
return {
|
|
153
|
+
ok: false,
|
|
154
|
+
message: `FTS5 not available: ${err}`,
|
|
155
|
+
fix: 'Ensure better-sqlite3-multiple-ciphers was compiled with FTS5 (default in prebuilt binaries)',
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
},
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
// ─── Check 4: Daemon reachable on configured port ────────────────────────────
|
|
162
|
+
function checkDaemonReachable(port) {
|
|
163
|
+
return {
|
|
164
|
+
name: `Daemon reachable on :${port}`,
|
|
165
|
+
async run() {
|
|
166
|
+
try {
|
|
167
|
+
const controller = new AbortController();
|
|
168
|
+
const timeout = setTimeout(() => controller.abort(), 3_000);
|
|
169
|
+
try {
|
|
170
|
+
const res = await fetch(`http://127.0.0.1:${port}/health`, {
|
|
171
|
+
signal: controller.signal,
|
|
172
|
+
});
|
|
173
|
+
clearTimeout(timeout);
|
|
174
|
+
if (res.ok) {
|
|
175
|
+
const body = await res.json();
|
|
176
|
+
return { ok: true, message: `daemon healthy on port ${port}` };
|
|
177
|
+
}
|
|
178
|
+
return {
|
|
179
|
+
ok: false,
|
|
180
|
+
message: `daemon returned HTTP ${res.status} on :${port}`,
|
|
181
|
+
fix: `astramem-local serve --port ${port}`,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
finally {
|
|
185
|
+
clearTimeout(timeout);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
return {
|
|
190
|
+
ok: false,
|
|
191
|
+
message: `daemon not reachable on port ${port}`,
|
|
192
|
+
fix: `astramem-local serve --port ${port}`,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
},
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
// ─── Check 5: Disk free > 1GB in datadir ─────────────────────────────────────
|
|
199
|
+
const ONE_GB = 1024 * 1024 * 1024;
|
|
200
|
+
function checkDiskFree(dataDir) {
|
|
201
|
+
return {
|
|
202
|
+
name: 'Disk free > 1GB in datadir',
|
|
203
|
+
async run() {
|
|
204
|
+
try {
|
|
205
|
+
mkdirSync(dataDir, { recursive: true });
|
|
206
|
+
const stats = statfsSync(dataDir);
|
|
207
|
+
const freeBytes = stats.bfree * stats.bsize;
|
|
208
|
+
const freeGb = (freeBytes / ONE_GB).toFixed(2);
|
|
209
|
+
if (freeBytes < ONE_GB) {
|
|
210
|
+
return {
|
|
211
|
+
ok: false,
|
|
212
|
+
message: `Only ${freeGb}GB free in ${dataDir} (need > 1GB)`,
|
|
213
|
+
fix: `Free disk space in the volume containing ${dataDir}`,
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
return { ok: true, message: `${freeGb}GB free in datadir` };
|
|
217
|
+
}
|
|
218
|
+
catch (err) {
|
|
219
|
+
return { ok: false, message: `Cannot check disk space: ${err}` };
|
|
220
|
+
}
|
|
221
|
+
},
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
// ─── Check 6: Service unit present if installed ───────────────────────────────
|
|
225
|
+
function checkServiceUnit(serviceUnitPath) {
|
|
226
|
+
return {
|
|
227
|
+
name: 'Service unit present',
|
|
228
|
+
async run() {
|
|
229
|
+
if (!serviceUnitPath) {
|
|
230
|
+
return { ok: true, message: 'service install not checked (no unit path configured)' };
|
|
231
|
+
}
|
|
232
|
+
if (existsSync(serviceUnitPath)) {
|
|
233
|
+
return { ok: true, message: `service unit found at ${serviceUnitPath}` };
|
|
234
|
+
}
|
|
235
|
+
return {
|
|
236
|
+
ok: false,
|
|
237
|
+
message: `service unit not found at ${serviceUnitPath}`,
|
|
238
|
+
fix: 'astramem-local service install',
|
|
239
|
+
};
|
|
240
|
+
},
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
// ─── Check 7: Configured datadir exists and is writable ───────────────────────
|
|
244
|
+
function checkDatadirWritable(dataDir) {
|
|
245
|
+
return {
|
|
246
|
+
name: 'Datadir exists and writable',
|
|
247
|
+
async run() {
|
|
248
|
+
try {
|
|
249
|
+
mkdirSync(dataDir, { recursive: true });
|
|
250
|
+
accessSync(dataDir, constants.W_OK);
|
|
251
|
+
return { ok: true, message: `datadir writable: ${dataDir}` };
|
|
252
|
+
}
|
|
253
|
+
catch (err) {
|
|
254
|
+
return {
|
|
255
|
+
ok: false,
|
|
256
|
+
message: `datadir not writable: ${dataDir}`,
|
|
257
|
+
fix: `mkdir -p "${dataDir}" && chmod u+w "${dataDir}"`,
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
},
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
// ─── Check 8: Today's budget vs cap ──────────────────────────────────────────
|
|
264
|
+
function checkBudget(dataDir, dailyBudgetUsd, encryptionEnabled) {
|
|
265
|
+
return {
|
|
266
|
+
name: 'Daily budget vs cap',
|
|
267
|
+
async run() {
|
|
268
|
+
try {
|
|
269
|
+
const dbPath = join(dataDir, 'memory.sqlite');
|
|
270
|
+
if (!existsSync(dbPath)) {
|
|
271
|
+
return { ok: true, message: 'budget check skipped (no DB yet)' };
|
|
272
|
+
}
|
|
273
|
+
const db = await openProductionDbReadonly(dbPath, encryptionEnabled);
|
|
274
|
+
const day = new Date().toISOString().slice(0, 10);
|
|
275
|
+
const row = db.prepare('SELECT usd_total, calls FROM budget_spend WHERE day = ?').get(day);
|
|
276
|
+
db.close();
|
|
277
|
+
const usd = row?.usd_total ?? 0;
|
|
278
|
+
const calls = row?.calls ?? 0;
|
|
279
|
+
const pct = dailyBudgetUsd > 0 ? ((usd / dailyBudgetUsd) * 100).toFixed(1) : '0.0';
|
|
280
|
+
if (usd >= dailyBudgetUsd && dailyBudgetUsd > 0) {
|
|
281
|
+
return {
|
|
282
|
+
ok: false,
|
|
283
|
+
message: `Budget cap reached: $${usd.toFixed(4)} / $${dailyBudgetUsd.toFixed(2)} (${calls} calls) — distillation paused`,
|
|
284
|
+
fix: 'astramem-local budget --reset to override for today',
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
return {
|
|
288
|
+
ok: true,
|
|
289
|
+
message: `Budget: $${usd.toFixed(4)} / $${dailyBudgetUsd.toFixed(2)} (${pct}%, ${calls} calls today)`,
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
catch (err) {
|
|
293
|
+
return { ok: false, message: `Budget check error: ${err}` };
|
|
294
|
+
}
|
|
295
|
+
},
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
// ─── Check: Secret redaction (SEC-6/8) ────────────────────────────────────────
|
|
299
|
+
const SEVEN_DAYS_MS = 7 * 24 * 60 * 60 * 1000;
|
|
300
|
+
function checkRedaction(dataDir, enabled, encryptionEnabled) {
|
|
301
|
+
return {
|
|
302
|
+
name: 'Secret redaction',
|
|
303
|
+
async run() {
|
|
304
|
+
if (!enabled) {
|
|
305
|
+
return {
|
|
306
|
+
ok: false,
|
|
307
|
+
message: 'redaction: OFF — secrets are NOT scrubbed before persistence (security.redaction.enabled=false)',
|
|
308
|
+
fix: 'Set security.redaction.enabled=true (default) unless you have a deliberate reason to disable it.',
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
try {
|
|
312
|
+
const dbPath = join(dataDir, 'memory.sqlite');
|
|
313
|
+
if (!existsSync(dbPath)) {
|
|
314
|
+
return { ok: true, message: 'redaction: on (no DB yet — 0 secrets redacted)' };
|
|
315
|
+
}
|
|
316
|
+
const db = await openProductionDbReadonly(dbPath, encryptionEnabled);
|
|
317
|
+
const since = Date.now() - SEVEN_DAYS_MS;
|
|
318
|
+
const rows = db
|
|
319
|
+
.prepare('SELECT type, SUM(count) AS n FROM redaction_log WHERE created_at >= ? GROUP BY type ORDER BY n DESC')
|
|
320
|
+
.all(since);
|
|
321
|
+
db.close();
|
|
322
|
+
const total = rows.reduce((sum, r) => sum + r.n, 0);
|
|
323
|
+
if (total === 0) {
|
|
324
|
+
return { ok: true, message: 'redaction: on — 0 secrets redacted in last 7d' };
|
|
325
|
+
}
|
|
326
|
+
const breakdown = rows.map(r => `${r.n} ${r.type}`).join(', ');
|
|
327
|
+
return { ok: true, message: `redaction: on — ${total} secrets redacted (${breakdown}) in last 7d` };
|
|
328
|
+
}
|
|
329
|
+
catch (err) {
|
|
330
|
+
return { ok: false, message: `Redaction check error: ${err}` };
|
|
331
|
+
}
|
|
332
|
+
},
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
// ─── Check: Recall usefulness (ADR-010) ───────────────────────────────────────
|
|
336
|
+
function checkUsefulness(dataDir, encryptionEnabled) {
|
|
337
|
+
return {
|
|
338
|
+
name: 'Recall usefulness',
|
|
339
|
+
async run() {
|
|
340
|
+
try {
|
|
341
|
+
const dbPath = join(dataDir, 'memory.sqlite');
|
|
342
|
+
if (!existsSync(dbPath)) {
|
|
343
|
+
return { ok: true, message: 'recall usefulness: no DB yet (0 served, 0 used)' };
|
|
344
|
+
}
|
|
345
|
+
const db = await openProductionDbReadonly(dbPath, encryptionEnabled);
|
|
346
|
+
const since = Date.now() - SEVEN_DAYS_MS;
|
|
347
|
+
const overall = usefulnessRate(db, { sinceMs: since });
|
|
348
|
+
const byType = usefulnessByType(db, { sinceMs: since });
|
|
349
|
+
db.close();
|
|
350
|
+
const rateStr = overall.rate === null ? 'n/a' : `${(overall.rate * 100).toFixed(1)}%`;
|
|
351
|
+
const breakdown = byType.length > 0
|
|
352
|
+
? ' — ' + byType.map(t => `${t.type}: ${t.rate === null ? 'n/a' : `${(t.rate * 100).toFixed(1)}%`} (${t.used}/${t.served})`).join(', ')
|
|
353
|
+
: '';
|
|
354
|
+
return {
|
|
355
|
+
ok: true,
|
|
356
|
+
message: `recall usefulness (7d): ${rateStr} (${overall.used}/${overall.served} atoms used/served)${breakdown}`,
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
catch (err) {
|
|
360
|
+
// Informational check — never fail doctor over a metric query error.
|
|
361
|
+
return { ok: true, message: `Recall usefulness check error (non-fatal): ${err}` };
|
|
362
|
+
}
|
|
363
|
+
},
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
// ─── Check: Encryption at rest (SEC-1/2/8) ────────────────────────────────────
|
|
367
|
+
function checkEncryption(dataDir, enabled) {
|
|
368
|
+
return {
|
|
369
|
+
name: 'Encryption at rest',
|
|
370
|
+
async run() {
|
|
371
|
+
if (!enabled) {
|
|
372
|
+
return {
|
|
373
|
+
ok: false,
|
|
374
|
+
message: 'encryption: OFF — memory.sqlite is stored in PLAINTEXT (security.encryption.enabled=false)',
|
|
375
|
+
fix: 'Set security.encryption.enabled=true (default) unless you have a deliberate reason to disable it.',
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
try {
|
|
379
|
+
const { source } = getOrCreateKey(defaultConfigDir());
|
|
380
|
+
const label = source === 'credential-store' ? 'keychain' : 'key-file';
|
|
381
|
+
const dbPath = join(dataDir, 'memory.sqlite');
|
|
382
|
+
if (existsSync(dbPath)) {
|
|
383
|
+
const header = readFileSync(dbPath).subarray(0, 16).toString('latin1');
|
|
384
|
+
if (header.startsWith('SQLite format 3')) {
|
|
385
|
+
return {
|
|
386
|
+
ok: false,
|
|
387
|
+
message: `encryption: on (${label}) but memory.sqlite header is still PLAINTEXT — auto-migration has not run yet`,
|
|
388
|
+
fix: 'astramem-local serve (auto-migrates a plaintext DB to encrypted form on next start)',
|
|
389
|
+
};
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
return { ok: true, message: `encryption: on (${label})` };
|
|
393
|
+
}
|
|
394
|
+
catch (err) {
|
|
395
|
+
return { ok: false, message: `Encryption check error: ${err}` };
|
|
396
|
+
}
|
|
397
|
+
},
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
// ─── Check: Bearer token location (SEC-10) ────────────────────────────────────
|
|
401
|
+
function checkBearerLocation() {
|
|
402
|
+
return {
|
|
403
|
+
name: 'Bearer token location',
|
|
404
|
+
async run() {
|
|
405
|
+
try {
|
|
406
|
+
if (readBearer()) {
|
|
407
|
+
return { ok: true, message: 'bearer: OS credential store' };
|
|
408
|
+
}
|
|
409
|
+
if (readBearerFromSecretsFile()) {
|
|
410
|
+
return {
|
|
411
|
+
ok: false,
|
|
412
|
+
message: 'bearer: secrets.env (plaintext fallback) — OS credential store unavailable or not yet migrated',
|
|
413
|
+
fix: 'Run "astramem-local token rotate" to migrate the bearer into the OS credential store.',
|
|
414
|
+
};
|
|
415
|
+
}
|
|
416
|
+
return {
|
|
417
|
+
ok: false,
|
|
418
|
+
message: 'bearer: missing — no MEMORY_BEARER in credential store or secrets.env',
|
|
419
|
+
fix: 'Run "astramem-local init" or "astramem-local token rotate" to generate one.',
|
|
420
|
+
};
|
|
421
|
+
}
|
|
422
|
+
catch (err) {
|
|
423
|
+
return { ok: false, message: `Bearer location check error: ${err}` };
|
|
424
|
+
}
|
|
425
|
+
},
|
|
426
|
+
};
|
|
427
|
+
}
|
|
428
|
+
// ─── Core check list builder ──────────────────────────────────────────────────
|
|
429
|
+
// ─── Check 9: LLM chat probe (real 1-token call) ─────────────────────────────
|
|
430
|
+
function checkLLMChat(provider, label) {
|
|
431
|
+
return {
|
|
432
|
+
name: `LLM chat probe (${label})`,
|
|
433
|
+
async run() {
|
|
434
|
+
return llmChatProbe(provider);
|
|
435
|
+
},
|
|
436
|
+
};
|
|
437
|
+
}
|
|
438
|
+
// ─── Check 10: Embed probe (real embed call + dim assert) ─────────────────────
|
|
439
|
+
function checkEmbed(provider) {
|
|
440
|
+
return {
|
|
441
|
+
name: `Embed probe (${provider.dim}-dim)`,
|
|
442
|
+
async run() {
|
|
443
|
+
return embedProbe(provider);
|
|
444
|
+
},
|
|
445
|
+
};
|
|
446
|
+
}
|
|
447
|
+
// ─── Check 11: Plugin coexistence ────────────────────────────────────────────
|
|
448
|
+
function checkPluginCoexistence(port) {
|
|
449
|
+
return {
|
|
450
|
+
name: 'Plugin config coexistence',
|
|
451
|
+
async run() {
|
|
452
|
+
return pluginCoexistenceProbe(port);
|
|
453
|
+
},
|
|
454
|
+
};
|
|
455
|
+
}
|
|
456
|
+
// ─── Check 12: Backup recency ─────────────────────────────────────────────────
|
|
457
|
+
const TWENTY_FOUR_HOURS_MS = 24 * 60 * 60 * 1000;
|
|
458
|
+
function checkBackupRecency(backupsDir) {
|
|
459
|
+
return {
|
|
460
|
+
name: 'Backup recency',
|
|
461
|
+
async run() {
|
|
462
|
+
if (!existsSync(backupsDir)) {
|
|
463
|
+
return {
|
|
464
|
+
ok: false,
|
|
465
|
+
message: `No backups directory found at ${backupsDir}`,
|
|
466
|
+
fix: 'astramem-local backup to create the first snapshot',
|
|
467
|
+
};
|
|
468
|
+
}
|
|
469
|
+
let entries;
|
|
470
|
+
try {
|
|
471
|
+
entries = readdirSync(backupsDir).filter(n => /^memory-.*\.sqlite$/.test(n));
|
|
472
|
+
}
|
|
473
|
+
catch {
|
|
474
|
+
return { ok: false, message: `Cannot read backups directory: ${backupsDir}` };
|
|
475
|
+
}
|
|
476
|
+
if (entries.length === 0) {
|
|
477
|
+
return {
|
|
478
|
+
ok: false,
|
|
479
|
+
message: 'No backup snapshots found',
|
|
480
|
+
fix: 'astramem-local backup to create the first snapshot',
|
|
481
|
+
};
|
|
482
|
+
}
|
|
483
|
+
// Find the most-recently modified backup
|
|
484
|
+
let newestMtime = 0;
|
|
485
|
+
for (const name of entries) {
|
|
486
|
+
try {
|
|
487
|
+
const mtime = statSync(join(backupsDir, name)).mtimeMs;
|
|
488
|
+
if (mtime > newestMtime)
|
|
489
|
+
newestMtime = mtime;
|
|
490
|
+
}
|
|
491
|
+
catch { /* skip files that disappeared */ }
|
|
492
|
+
}
|
|
493
|
+
const ageMs = Date.now() - newestMtime;
|
|
494
|
+
const ageH = (ageMs / 3_600_000).toFixed(1);
|
|
495
|
+
if (ageMs > TWENTY_FOUR_HOURS_MS) {
|
|
496
|
+
return {
|
|
497
|
+
ok: false,
|
|
498
|
+
message: `Newest backup is ${ageH}h old (> 24h)`,
|
|
499
|
+
fix: 'astramem-local backup or enable nightly timer: astramem-local service install --with-backup-timer',
|
|
500
|
+
};
|
|
501
|
+
}
|
|
502
|
+
return { ok: true, message: `Newest backup is ${ageH}h old (within 24h)` };
|
|
503
|
+
},
|
|
504
|
+
};
|
|
505
|
+
}
|
|
506
|
+
// ─── Check 13: Config dir divergence (Windows) ───────────────────────────────
|
|
507
|
+
/**
|
|
508
|
+
* Warns when both the legacy (%APPDATA%\AstraMemory) and canonical
|
|
509
|
+
* (%APPDATA%\Astramem) config dirs are present simultaneously. This indicates
|
|
510
|
+
* a partially-migrated install and can cause bearer mismatches with the plugin.
|
|
511
|
+
*
|
|
512
|
+
* Also warns when the canonical dir's bearer differs from the plugin dir's
|
|
513
|
+
* bearer (legacy dir = proxy for plugin if migration hasn't run yet), which is
|
|
514
|
+
* the exact root cause of the v0.2.2 401 bug.
|
|
515
|
+
*/
|
|
516
|
+
function checkConfigDirDivergence() {
|
|
517
|
+
return {
|
|
518
|
+
name: 'Config dir divergence (Windows)',
|
|
519
|
+
async run() {
|
|
520
|
+
// Only meaningful on Windows; canonical and legacy are identical elsewhere.
|
|
521
|
+
if (platform() !== 'win32') {
|
|
522
|
+
return { ok: true, message: 'Config dir divergence check: N/A (non-Windows)' };
|
|
523
|
+
}
|
|
524
|
+
const canonical = defaultConfigDir();
|
|
525
|
+
const legacy = legacyConfigDir();
|
|
526
|
+
const canonicalExists = existsSync(canonical);
|
|
527
|
+
const legacyExists = existsSync(legacy);
|
|
528
|
+
// Both dirs present → migration hasn't cleaned up yet.
|
|
529
|
+
if (canonicalExists && legacyExists) {
|
|
530
|
+
// Additionally check whether the bearers differ.
|
|
531
|
+
let bearerMismatch = false;
|
|
532
|
+
let bearerDetail = '';
|
|
533
|
+
try {
|
|
534
|
+
const readBearer = (dir) => {
|
|
535
|
+
const p = join(dir, 'secrets.env');
|
|
536
|
+
if (!existsSync(p))
|
|
537
|
+
return null;
|
|
538
|
+
const line = readFileSync(p, 'utf8')
|
|
539
|
+
.split('\n')
|
|
540
|
+
.find(l => l.startsWith('MEMORY_BEARER='));
|
|
541
|
+
if (!line)
|
|
542
|
+
return null;
|
|
543
|
+
return line.slice('MEMORY_BEARER='.length).trim() || null;
|
|
544
|
+
};
|
|
545
|
+
const canonicalBearer = readBearer(canonical);
|
|
546
|
+
const legacyBearer = readBearer(legacy);
|
|
547
|
+
if (canonicalBearer !== null &&
|
|
548
|
+
legacyBearer !== null &&
|
|
549
|
+
canonicalBearer !== legacyBearer) {
|
|
550
|
+
bearerMismatch = true;
|
|
551
|
+
bearerDetail =
|
|
552
|
+
' Bearer mismatch detected — plugin will send the legacy bearer and get 401.';
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
catch { /* non-fatal */ }
|
|
556
|
+
return {
|
|
557
|
+
ok: false,
|
|
558
|
+
message: `Two config dirs present: "${legacy}" (legacy <=0.2.2) and "${canonical}" (canonical).` +
|
|
559
|
+
bearerDetail,
|
|
560
|
+
fix: bearerMismatch
|
|
561
|
+
? `Run "astramem-local init" in the canonical dir to unify bearers, ` +
|
|
562
|
+
`then delete "${legacy}" manually.`
|
|
563
|
+
: `Delete "${legacy}" after verifying all data has migrated to "${canonical}".`,
|
|
564
|
+
};
|
|
565
|
+
}
|
|
566
|
+
// Only canonical → healthy.
|
|
567
|
+
if (canonicalExists && !legacyExists) {
|
|
568
|
+
return { ok: true, message: `Config dir canonical (${canonical})` };
|
|
569
|
+
}
|
|
570
|
+
// Only legacy → migration hasn't run yet (daemon not booted since upgrade).
|
|
571
|
+
if (!canonicalExists && legacyExists) {
|
|
572
|
+
return {
|
|
573
|
+
ok: false,
|
|
574
|
+
message: `Legacy config dir found at "${legacy}" but canonical "${canonical}" is absent. ` +
|
|
575
|
+
`Migration will run on next "astramem-local serve".`,
|
|
576
|
+
fix: 'Run "astramem-local serve" once to auto-migrate.',
|
|
577
|
+
};
|
|
578
|
+
}
|
|
579
|
+
// Neither exists → fresh install.
|
|
580
|
+
return { ok: true, message: 'Config dir: fresh install (no dirs yet)' };
|
|
581
|
+
},
|
|
582
|
+
};
|
|
583
|
+
}
|
|
584
|
+
function coreChecks(opts) {
|
|
585
|
+
const port = opts.port ?? 7777;
|
|
586
|
+
const dataDir = opts.dataDir ?? join(tmpdir(), 'astramem');
|
|
587
|
+
const dailyBudgetUsd = opts.dailyBudgetUsd ?? 10;
|
|
588
|
+
const encryptionEnabled = opts.encryptionEnabled ?? true;
|
|
589
|
+
const checks = [
|
|
590
|
+
checkDatadirWritable(dataDir),
|
|
591
|
+
checkSqliteWritable(dataDir, encryptionEnabled),
|
|
592
|
+
checkSqliteVec(),
|
|
593
|
+
checkFts5(),
|
|
594
|
+
checkDaemonReachable(port),
|
|
595
|
+
checkDiskFree(dataDir),
|
|
596
|
+
checkServiceUnit(opts.serviceUnitPath),
|
|
597
|
+
checkBudget(dataDir, dailyBudgetUsd, encryptionEnabled),
|
|
598
|
+
checkConfigDirDivergence(),
|
|
599
|
+
checkRedaction(dataDir, opts.redactionEnabled ?? true, encryptionEnabled),
|
|
600
|
+
checkEncryption(dataDir, encryptionEnabled),
|
|
601
|
+
checkBearerLocation(),
|
|
602
|
+
checkUsefulness(dataDir, encryptionEnabled),
|
|
603
|
+
];
|
|
604
|
+
// LLM chat probes — real 1-token call, replaces surface-only /api/tags checks.
|
|
605
|
+
// Run extraction separately only when it uses a different provider/model.
|
|
606
|
+
if (opts.llmProviders) {
|
|
607
|
+
const { compaction, extraction } = opts.llmProviders;
|
|
608
|
+
checks.push(checkLLMChat(compaction, 'compaction'));
|
|
609
|
+
const sameProvider = compaction.name === extraction.name && compaction.model === extraction.model;
|
|
610
|
+
if (!sameProvider) {
|
|
611
|
+
checks.push(checkLLMChat(extraction, 'extraction'));
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
// Embed probe — real embed call + config-derived dim assertion (FEAT-409).
|
|
615
|
+
if (opts.embedProvider) {
|
|
616
|
+
checks.push(checkEmbed(opts.embedProvider));
|
|
617
|
+
}
|
|
618
|
+
// Plugin coexistence — warn if MEMORY_API_URL or .mcp.json points elsewhere.
|
|
619
|
+
checks.push(checkPluginCoexistence(port));
|
|
620
|
+
// Backup recency — optional; only added when caller supplies a backupsDir.
|
|
621
|
+
if (opts.backupsDir) {
|
|
622
|
+
checks.push(checkBackupRecency(opts.backupsDir));
|
|
623
|
+
}
|
|
624
|
+
return checks;
|
|
625
|
+
}
|
|
626
|
+
//# sourceMappingURL=checks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checks.js","sourceRoot":"","sources":["../../src/doctor/checks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Check } from './types.js';
|
|
2
|
+
import type { DB } from '../storage/db.js';
|
|
3
|
+
export interface HardeningCheckOpts {
|
|
4
|
+
dataDir: string;
|
|
5
|
+
port: number;
|
|
6
|
+
/** Same key-aware read-only opener the core checks use. */
|
|
7
|
+
openDbReadonly: () => Promise<DB>;
|
|
8
|
+
}
|
|
9
|
+
export declare function getHardeningChecks(opts: HardeningCheckOpts): Check[];
|