@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,364 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { mkdirSync, statSync, unlinkSync } from 'node:fs';
|
|
3
|
+
import { buildApp } from '../server/app.js';
|
|
4
|
+
import { openDb } from '../storage/db.js';
|
|
5
|
+
import { migrate, getVecSchemaDim } from '../storage/migrate.js';
|
|
6
|
+
import { getOrCreateKey, readSyncToken } from '../storage/keystore.js';
|
|
7
|
+
import { resolveBearerToken } from '../storage/bearer-keystore.js';
|
|
8
|
+
import { startShipper, getOrCreateDeviceId } from '../sync/shipper.js';
|
|
9
|
+
import { encryptIfPlaintext } from '../storage/migrate-encrypt.js';
|
|
10
|
+
import { defaultConfigDir } from '../config/datadir.js';
|
|
11
|
+
import { resolveRuntimeConfig } from '../config/resolve-runtime.js';
|
|
12
|
+
import { acquireInstanceLock, AlreadyRunningError } from '../service/instance-lock.js';
|
|
13
|
+
import { PKG_VERSION } from '../server/lib/wire-meta.js';
|
|
14
|
+
import { createHealthState } from '../server/health-state.js';
|
|
15
|
+
import { HandlerRegistry } from '../pipeline/registry.js';
|
|
16
|
+
import { startWorker } from '../pipeline/worker.js';
|
|
17
|
+
import { JobRepo } from '../pipeline/job-repo.js';
|
|
18
|
+
import { distillHandler } from '../pipeline/handlers/distill.js';
|
|
19
|
+
import { distillEventsHandler } from '../pipeline/handlers/distill-events.js';
|
|
20
|
+
import { cleanupHandler } from '../pipeline/handlers/cleanup.js';
|
|
21
|
+
import { consolidateHandler } from '../pipeline/handlers/consolidate.js';
|
|
22
|
+
import { reembedHandler } from '../pipeline/handlers/reembed.js';
|
|
23
|
+
import { makeMockProviders } from '../pipeline/mock-providers.js';
|
|
24
|
+
import { MemoryRepo } from '../storage/memories.js';
|
|
25
|
+
import { SqliteVecStore } from '../vector/sqlite-vec.js';
|
|
26
|
+
export async function serve(opts) {
|
|
27
|
+
// Shared resolver: migrate-dirs + config.yaml + sync.json merge + the
|
|
28
|
+
// canonical precedence (CLI > ASTRA_MEMORY_DATADIR > config.yaml > default).
|
|
29
|
+
// doctor/backup/reinstall use the same resolver so diagnostics always look
|
|
30
|
+
// at the same files as the daemon.
|
|
31
|
+
const { cfg, port, dataDir } = resolveRuntimeConfig({ port: opts.port, dataDir: opts.dataDir });
|
|
32
|
+
// SEC-10: CLI flag > env var > OS credential store > secrets.env
|
|
33
|
+
// (canonical dir, then legacy dir) > 'devtok' default. A secrets.env-only
|
|
34
|
+
// bearer is opportunistically promoted into the credential store.
|
|
35
|
+
const { token } = resolveBearerToken({
|
|
36
|
+
cliToken: opts.token,
|
|
37
|
+
envToken: process.env.ASTRA_MEMORY_TOKEN,
|
|
38
|
+
});
|
|
39
|
+
const dbPath = dataDir === ':memory:' ? ':memory:' : join(dataDir, 'memory.sqlite');
|
|
40
|
+
if (dataDir !== ':memory:')
|
|
41
|
+
mkdirSync(dataDir, { recursive: true });
|
|
42
|
+
// Single-instance lock (D2): protects the data dir, not just the port —
|
|
43
|
+
// a second daemon on a different port would still race the job queue.
|
|
44
|
+
// A healthy holder → exit 0 so schtasks keepalive re-runs are cheap no-ops.
|
|
45
|
+
let lock = null;
|
|
46
|
+
if (dataDir !== ':memory:') {
|
|
47
|
+
try {
|
|
48
|
+
lock = await acquireInstanceLock(dataDir, port, PKG_VERSION);
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
if (err instanceof AlreadyRunningError) {
|
|
52
|
+
console.log(`[astramem-local] ${err.message} — exiting (single-instance).`);
|
|
53
|
+
process.exit(0);
|
|
54
|
+
}
|
|
55
|
+
throw err;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// Global crash handlers (serve path only): a stray rejection must not kill
|
|
59
|
+
// the process silently — log, release the lock, close the DB, exit 1 so
|
|
60
|
+
// the abnormal exit is visible in task history. Restart comes from the
|
|
61
|
+
// scheduler's repetition trigger, not from exit-code semantics.
|
|
62
|
+
const crashExit = (kind) => (err) => {
|
|
63
|
+
console.error(`[astramem-local] FATAL ${kind}:`, err);
|
|
64
|
+
try {
|
|
65
|
+
lock?.release();
|
|
66
|
+
}
|
|
67
|
+
catch { /* best-effort */ }
|
|
68
|
+
try {
|
|
69
|
+
dbForCrash?.close();
|
|
70
|
+
}
|
|
71
|
+
catch { /* best-effort */ }
|
|
72
|
+
process.exit(1);
|
|
73
|
+
};
|
|
74
|
+
let dbForCrash = null;
|
|
75
|
+
process.on('uncaughtException', crashExit('uncaughtException'));
|
|
76
|
+
process.on('unhandledRejection', crashExit('unhandledRejection'));
|
|
77
|
+
// SEC-1/2/7/9: in-memory databases can never be encrypted (SQLCipher
|
|
78
|
+
// rejects PRAGMA key on :memory:, confirmed by the 1a spike) — the
|
|
79
|
+
// ASTRA_MEMORY_DATADIR=':memory:' test/dev path always stays plaintext
|
|
80
|
+
// and never touches the keystore.
|
|
81
|
+
let db;
|
|
82
|
+
if (dataDir === ':memory:') {
|
|
83
|
+
db = openDb(dbPath);
|
|
84
|
+
}
|
|
85
|
+
else if (cfg.security.encryption.enabled) {
|
|
86
|
+
const key = getOrCreateKey(defaultConfigDir()).key;
|
|
87
|
+
encryptIfPlaintext(dbPath, key);
|
|
88
|
+
db = openDb(dbPath, { key });
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
// SEC-9: disabling encryption is a deliberate trust trade-off — make it loud.
|
|
92
|
+
console.warn('[astramem-local] WARNING: encryption at rest is DISABLED (security.encryption.enabled=false). ' +
|
|
93
|
+
`memory.sqlite at ${dbPath} will be stored in PLAINTEXT.`);
|
|
94
|
+
db = openDb(dbPath);
|
|
95
|
+
}
|
|
96
|
+
dbForCrash = db;
|
|
97
|
+
// FEAT-409: dim only matters for a genuinely fresh DB — migrate() skips
|
|
98
|
+
// already-applied migrations regardless, so this stays correct across
|
|
99
|
+
// upgrades and restarts of an existing (already at some dim) DB.
|
|
100
|
+
migrate(db, cfg.embedding.dim);
|
|
101
|
+
// FEAT-409 AC-3: the dim the embed preflight checks against is the
|
|
102
|
+
// PERSISTED schema dim (what memories_vec was actually created with),
|
|
103
|
+
// not just cfg.embedding.dim — a config/provider dim that drifted from
|
|
104
|
+
// the real schema (edited config.yaml without running `reembed-dim`)
|
|
105
|
+
// must fail loud here, not deep inside the first ingest's sqlite-vec
|
|
106
|
+
// dimension mismatch. Falls back to cfg.embedding.dim on a genuinely
|
|
107
|
+
// fresh DB (memories_vec doesn't exist yet — migrate() just created it
|
|
108
|
+
// at that dim, so they agree by construction).
|
|
109
|
+
const schemaDim = getVecSchemaDim(db) ?? cfg.embedding.dim;
|
|
110
|
+
// Boot job recovery (P1.1): requeue jobs orphaned by a non-graceful death
|
|
111
|
+
// ('running' from a mid-handle kill; 'failed' whose in-memory retry timer
|
|
112
|
+
// died with the process). Purge old completed/poison bookkeeping (P1.2).
|
|
113
|
+
const bootRepo = new JobRepo(db);
|
|
114
|
+
const recovered = bootRepo.recoverOrphans();
|
|
115
|
+
if (recovered.requeuedRunning + recovered.requeuedFailed > 0) {
|
|
116
|
+
console.log(`[astramem-local] job recovery: requeued ${recovered.requeuedRunning} orphaned running, ` +
|
|
117
|
+
`${recovered.requeuedFailed} interrupted retries`);
|
|
118
|
+
}
|
|
119
|
+
const purged = bootRepo.purgeOld();
|
|
120
|
+
if (purged.completed + purged.poison > 0) {
|
|
121
|
+
console.log(`[astramem-local] job retention: purged ${purged.completed} completed, ${purged.poison} poison`);
|
|
122
|
+
}
|
|
123
|
+
// Encryption-migration backup cleanup (P1.5): once the encrypted DB has
|
|
124
|
+
// been opening successfully for 7+ days, the plaintext copy is pure
|
|
125
|
+
// data-at-rest exposure — delete it. Doctor surfaces it during the window.
|
|
126
|
+
if (dataDir !== ':memory:' && cfg.security.encryption.enabled) {
|
|
127
|
+
cleanupPreEncryptionBak(dbPath);
|
|
128
|
+
}
|
|
129
|
+
// SEC-9: disabling redaction is a deliberate trust trade-off — make it loud.
|
|
130
|
+
if (!cfg.security.redaction.enabled) {
|
|
131
|
+
console.warn('[astramem-local] WARNING: secret redaction is DISABLED (security.redaction.enabled=false). ' +
|
|
132
|
+
'Transcripts and memories will be persisted WITHOUT stage-0 secret scrubbing.');
|
|
133
|
+
}
|
|
134
|
+
// Resolve providers: mock mode (CI/test) or real providers
|
|
135
|
+
const healthState = createHealthState();
|
|
136
|
+
if (dataDir !== ':memory:')
|
|
137
|
+
healthState.dataDir = dataDir;
|
|
138
|
+
let providers;
|
|
139
|
+
const useMock = process.env.ASTRA_MEMORY_MOCK_PROVIDERS === '1';
|
|
140
|
+
if (useMock) {
|
|
141
|
+
providers = makeMockProviders(cfg.embedding.dim);
|
|
142
|
+
healthState.embed.ok = true; // mock embed is always available
|
|
143
|
+
healthState.embed.lastOkAt = Date.now();
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
// Real providers from config — only imported when not in mock mode
|
|
147
|
+
const { getProviders } = await import('../providers/index.js');
|
|
148
|
+
providers = getProviders(cfg);
|
|
149
|
+
if (opts.strictPreflight) {
|
|
150
|
+
// Legacy fail-fast behavior (CI / scripted checks): probe once with the
|
|
151
|
+
// historical 5s timeout and exit 1 before accepting traffic.
|
|
152
|
+
const { embedProbe } = await import('../doctor/probes/embed-probe.js');
|
|
153
|
+
const preflightResult = await embedProbe(providers.embed, 5000, schemaDim);
|
|
154
|
+
if (!preflightResult.ok) {
|
|
155
|
+
const model = providers.embed.model;
|
|
156
|
+
console.error(`[astramem-local] embed preflight FAILED: ${preflightResult.message}`);
|
|
157
|
+
console.error(` Model : ${model}`);
|
|
158
|
+
console.error(` Fix : ${preflightResult.fix ?? 'Check embed provider config'}`);
|
|
159
|
+
console.error(` Install : ollama pull ${model}`);
|
|
160
|
+
console.error(` Docs : https://ollama.com/library/mxbai-embed-large`);
|
|
161
|
+
process.exit(1);
|
|
162
|
+
}
|
|
163
|
+
healthState.embed.ok = true;
|
|
164
|
+
healthState.embed.lastOkAt = Date.now();
|
|
165
|
+
}
|
|
166
|
+
// Degraded-start (D3): the non-strict preflight runs in the BACKGROUND
|
|
167
|
+
// after app.listen — see startEmbedPreflight below. A daemon that can
|
|
168
|
+
// serve recall-from-cache and queue ingest beats a dead one; cold Ollama
|
|
169
|
+
// model loads at logon no longer kill the boot.
|
|
170
|
+
}
|
|
171
|
+
const app = await buildApp({ db, token, embed: providers.embed, config: cfg, healthState });
|
|
172
|
+
// Wire up the worker with extended context so distillation runs
|
|
173
|
+
const registry = new HandlerRegistry();
|
|
174
|
+
registry.register(distillHandler);
|
|
175
|
+
registry.register(distillEventsHandler);
|
|
176
|
+
registry.register(cleanupHandler);
|
|
177
|
+
registry.register(consolidateHandler);
|
|
178
|
+
registry.register(reembedHandler);
|
|
179
|
+
const extCtx = {
|
|
180
|
+
db,
|
|
181
|
+
config: cfg,
|
|
182
|
+
providers,
|
|
183
|
+
memoryRepo: new MemoryRepo(db),
|
|
184
|
+
vecStore: new SqliteVecStore(db, cfg.embedding.dim),
|
|
185
|
+
};
|
|
186
|
+
// startWorker takes HandlerCtx but we pass ExtendedHandlerCtx (structural subtype)
|
|
187
|
+
const worker = startWorker({
|
|
188
|
+
pollMs: 500,
|
|
189
|
+
registry,
|
|
190
|
+
db,
|
|
191
|
+
config: cfg,
|
|
192
|
+
ctx: extCtx,
|
|
193
|
+
healthState,
|
|
194
|
+
});
|
|
195
|
+
// Sync shipper (ADR-003): one-way log shipping to the cloud ledger.
|
|
196
|
+
// Requires explicit opt-in + url + workspace + device token; personal
|
|
197
|
+
// atoms never ship regardless (scope filter inside the shipper).
|
|
198
|
+
let shipper = null;
|
|
199
|
+
if (cfg.sync.enabled && dataDir !== ':memory:') {
|
|
200
|
+
const syncToken = process.env.ASTRA_SYNC_TOKEN ?? readSyncToken();
|
|
201
|
+
if (!cfg.sync.url || !cfg.sync.workspaceId || !syncToken) {
|
|
202
|
+
console.warn('[astramem-local] sync.enabled=true but url/workspaceId/device-token incomplete — shipper NOT started.');
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
shipper = startShipper({
|
|
206
|
+
db,
|
|
207
|
+
url: cfg.sync.url,
|
|
208
|
+
workspaceId: cfg.sync.workspaceId,
|
|
209
|
+
deviceId: getOrCreateDeviceId(defaultConfigDir()),
|
|
210
|
+
token: syncToken,
|
|
211
|
+
batchSize: cfg.sync.batchSize,
|
|
212
|
+
intervalMs: cfg.sync.intervalMs,
|
|
213
|
+
});
|
|
214
|
+
console.log(`astramem-local sync shipper active -> ${cfg.sync.url}`);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
// FEAT-406: host is config-driven (default '127.0.0.1'). buildApp derives
|
|
218
|
+
// the /health + /version auth boundary from the SAME cfg.network.host, so
|
|
219
|
+
// a non-local bind here always implies Bearer-gated health/version there.
|
|
220
|
+
const host = cfg.network.host;
|
|
221
|
+
await app.listen({ port, host });
|
|
222
|
+
console.log(`astramem-local serving on ${host}:${port}`);
|
|
223
|
+
// Degraded-start (D3): probe the embed provider in the background with
|
|
224
|
+
// backoff. /health reports status starting -> ok | degraded meanwhile.
|
|
225
|
+
let stopPreflight = null;
|
|
226
|
+
if (!useMock && !opts.strictPreflight) {
|
|
227
|
+
stopPreflight = startEmbedPreflight(providers.embed, healthState, schemaDim);
|
|
228
|
+
}
|
|
229
|
+
// Consolidation cadence: the `consolidate` handler existed since Wave 4b
|
|
230
|
+
// but nothing ever enqueued it — near-duplicate memories accumulated until
|
|
231
|
+
// someone called POST /consolidation/run by hand. The pass is deterministic
|
|
232
|
+
// and ~60ms at a few hundred memories, so run it at boot and every 6h.
|
|
233
|
+
// Enqueued through the jobs table (not called inline) so it serializes with
|
|
234
|
+
// distills and shows up in `queue` forensics like every other stage.
|
|
235
|
+
let consolidateTimer = null;
|
|
236
|
+
if (dataDir !== ':memory:') {
|
|
237
|
+
const CONSOLIDATE_INTERVAL_MS = 6 * 60 * 60 * 1000;
|
|
238
|
+
const enqueueConsolidate = () => {
|
|
239
|
+
try {
|
|
240
|
+
bootRepo.enqueue('consolidate', {});
|
|
241
|
+
}
|
|
242
|
+
catch (err) {
|
|
243
|
+
console.warn(`[astramem-local] consolidate enqueue failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
244
|
+
}
|
|
245
|
+
};
|
|
246
|
+
enqueueConsolidate(); // boot pass — catches anything a downtime window skipped
|
|
247
|
+
consolidateTimer = setInterval(enqueueConsolidate, CONSOLIDATE_INTERVAL_MS);
|
|
248
|
+
consolidateTimer.unref();
|
|
249
|
+
}
|
|
250
|
+
// WAL discipline (W1.5): with synchronous=NORMAL a hard crash loses the
|
|
251
|
+
// un-checkpointed WAL tail. Truncate hourly so the at-risk window stays
|
|
252
|
+
// small, and once more on graceful shutdown. Timer unref'd — never holds
|
|
253
|
+
// the process open.
|
|
254
|
+
let walTimer = null;
|
|
255
|
+
if (dataDir !== ':memory:') {
|
|
256
|
+
const WAL_CHECKPOINT_MS = 60 * 60 * 1000;
|
|
257
|
+
walTimer = setInterval(() => {
|
|
258
|
+
try {
|
|
259
|
+
db.pragma('wal_checkpoint(TRUNCATE)');
|
|
260
|
+
}
|
|
261
|
+
catch (err) {
|
|
262
|
+
console.warn(`[astramem-local] periodic WAL checkpoint failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
263
|
+
}
|
|
264
|
+
}, WAL_CHECKPOINT_MS);
|
|
265
|
+
walTimer.unref();
|
|
266
|
+
}
|
|
267
|
+
const shutdown = async () => {
|
|
268
|
+
try {
|
|
269
|
+
stopPreflight?.();
|
|
270
|
+
if (walTimer)
|
|
271
|
+
clearInterval(walTimer);
|
|
272
|
+
if (consolidateTimer)
|
|
273
|
+
clearInterval(consolidateTimer);
|
|
274
|
+
if (shipper)
|
|
275
|
+
await shipper.stop();
|
|
276
|
+
await worker.stop(); // drain in-flight tick before closing DB
|
|
277
|
+
try {
|
|
278
|
+
if (dataDir !== ':memory:')
|
|
279
|
+
db.pragma('wal_checkpoint(TRUNCATE)');
|
|
280
|
+
}
|
|
281
|
+
catch { /* close() below still checkpoints on last connection */ }
|
|
282
|
+
await app.close();
|
|
283
|
+
}
|
|
284
|
+
finally {
|
|
285
|
+
db.close();
|
|
286
|
+
lock?.release();
|
|
287
|
+
}
|
|
288
|
+
process.exit(0);
|
|
289
|
+
};
|
|
290
|
+
process.on('SIGTERM', shutdown);
|
|
291
|
+
process.on('SIGINT', shutdown);
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Background embed preflight with backoff (5s → 10s → 30s → 60s cap) and a
|
|
295
|
+
* 30s per-probe timeout (cold Ollama model loads routinely exceed the old 5s
|
|
296
|
+
* limit). Never hard-exits: persistent failure shows up as status=degraded
|
|
297
|
+
* in /health and doctor, and embedding jobs retry through the queue anyway.
|
|
298
|
+
* Returns a canceller; the retry timer is unref'd so it never holds the
|
|
299
|
+
* process open during shutdown.
|
|
300
|
+
*/
|
|
301
|
+
/**
|
|
302
|
+
* Delete the plaintext `.pre-encryption.bak` left by the one-shot encryption
|
|
303
|
+
* migration once it is older than 7 days — by then the encrypted DB has
|
|
304
|
+
* proven itself across restarts, and a lingering plaintext copy of the whole
|
|
305
|
+
* database is pure data-at-rest exposure. Doctor reports it during the
|
|
306
|
+
* grace window so the user knows it exists.
|
|
307
|
+
*/
|
|
308
|
+
function cleanupPreEncryptionBak(dbPath) {
|
|
309
|
+
const bakPath = `${dbPath}.pre-encryption.bak`;
|
|
310
|
+
try {
|
|
311
|
+
const st = statSync(bakPath);
|
|
312
|
+
const ageDays = (Date.now() - st.mtimeMs) / (24 * 60 * 60 * 1000);
|
|
313
|
+
if (ageDays > 7) {
|
|
314
|
+
unlinkSync(bakPath);
|
|
315
|
+
console.log(`[astramem-local] removed plaintext pre-encryption backup (${Math.floor(ageDays)}d old): ${bakPath}`);
|
|
316
|
+
}
|
|
317
|
+
else {
|
|
318
|
+
console.warn(`[astramem-local] plaintext pre-encryption backup still present (${ageDays.toFixed(1)}d old, ` +
|
|
319
|
+
`auto-removed after 7d): ${bakPath}`);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
catch {
|
|
323
|
+
/* absent — nothing to do */
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
function startEmbedPreflight(embed, healthState, expectedDim = embed.dim) {
|
|
327
|
+
const BACKOFF_MS = [5_000, 10_000, 30_000, 60_000];
|
|
328
|
+
const PROBE_TIMEOUT_MS = 30_000;
|
|
329
|
+
let cancelled = false;
|
|
330
|
+
let timer = null;
|
|
331
|
+
const attempt = async () => {
|
|
332
|
+
if (cancelled)
|
|
333
|
+
return;
|
|
334
|
+
const { embedProbe } = await import('../doctor/probes/embed-probe.js');
|
|
335
|
+
const result = await embedProbe(embed, PROBE_TIMEOUT_MS, expectedDim);
|
|
336
|
+
if (cancelled)
|
|
337
|
+
return;
|
|
338
|
+
healthState.embed.attempts++;
|
|
339
|
+
if (result.ok) {
|
|
340
|
+
healthState.embed.ok = true;
|
|
341
|
+
healthState.embed.lastOkAt = Date.now();
|
|
342
|
+
healthState.embed.lastError = null;
|
|
343
|
+
console.log(`[astramem-local] embed preflight ok (attempt ${healthState.embed.attempts}): ${result.message}`);
|
|
344
|
+
return;
|
|
345
|
+
}
|
|
346
|
+
healthState.embed.ok = false;
|
|
347
|
+
healthState.embed.lastError = result.message;
|
|
348
|
+
if (healthState.embed.attempts === 1) {
|
|
349
|
+
console.warn(`[astramem-local] embed preflight failing — serving DEGRADED while retrying: ${result.message}`);
|
|
350
|
+
console.warn(` Fix : ${result.fix ?? 'Check embed provider config'}`);
|
|
351
|
+
console.warn(` Install : ollama pull ${embed.model}`);
|
|
352
|
+
}
|
|
353
|
+
const delay = BACKOFF_MS[Math.min(healthState.embed.attempts - 1, BACKOFF_MS.length - 1)];
|
|
354
|
+
timer = setTimeout(() => { void attempt(); }, delay);
|
|
355
|
+
timer.unref();
|
|
356
|
+
};
|
|
357
|
+
void attempt();
|
|
358
|
+
return () => {
|
|
359
|
+
cancelled = true;
|
|
360
|
+
if (timer)
|
|
361
|
+
clearTimeout(timer);
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
//# sourceMappingURL=serve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/cli/serve.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function serviceCommand(args: string[]): Promise<void>;
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { getServiceAdapter } from '../service/index.js';
|
|
2
|
+
import { installServiceFlow } from '../service/install-flow.js';
|
|
3
|
+
import { resolveRuntimeConfig } from '../config/resolve-runtime.js';
|
|
4
|
+
import { reinstallCommand } from './reinstall.js';
|
|
5
|
+
function parseArg(args, flag) {
|
|
6
|
+
const i = args.indexOf(flag);
|
|
7
|
+
return i >= 0 ? args[i + 1] : undefined;
|
|
8
|
+
}
|
|
9
|
+
export async function serviceCommand(args) {
|
|
10
|
+
const [subCmd, ...rest] = args;
|
|
11
|
+
const adapter = getServiceAdapter();
|
|
12
|
+
switch (subCmd) {
|
|
13
|
+
case 'install': {
|
|
14
|
+
const portArg = parseArg(rest, '--port');
|
|
15
|
+
const keepArg = parseArg(rest, '--keep');
|
|
16
|
+
const withBackupTimer = rest.includes('--with-backup-timer');
|
|
17
|
+
const { port: cfgPort } = resolveRuntimeConfig({
|
|
18
|
+
port: portArg ? Number(portArg) : undefined,
|
|
19
|
+
});
|
|
20
|
+
const port = cfgPort;
|
|
21
|
+
const keep = keepArg ? Number(keepArg) : 7;
|
|
22
|
+
console.log(`Installing AstraMemory service for ${adapter.platform}...`);
|
|
23
|
+
// Single shared install path (shim + XML task on Windows) — same code
|
|
24
|
+
// that `init` and `reinstall` use.
|
|
25
|
+
const { result, build } = await installServiceFlow(port);
|
|
26
|
+
if (result.kind === 'task') {
|
|
27
|
+
console.log("Service installed. Run 'astramem-local service start' to start it.");
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
// Startup-shortcut fallback — be honest about limitations.
|
|
31
|
+
console.log(`Startup shortcut installed at ${result.path}.`);
|
|
32
|
+
console.log('It will run the daemon at next logon.');
|
|
33
|
+
console.log(`To start now: astramem-local serve --port ${port}`);
|
|
34
|
+
console.log("NOTE: 'astramem-local service start' will NOT work — no scheduled task exists.\n" +
|
|
35
|
+
" Re-run 'astramem-local service install' from an elevated shell to install a proper task.");
|
|
36
|
+
}
|
|
37
|
+
if (withBackupTimer) {
|
|
38
|
+
console.log('Installing nightly backup timer (03:00)...');
|
|
39
|
+
// The backup timer runs `backup --keep N` — it needs the direct
|
|
40
|
+
// node+entry command, NOT the daemon shim.
|
|
41
|
+
await adapter.installBackupTimer(build.rawExecPath, keep);
|
|
42
|
+
console.log(`Backup timer installed (keep=${keep} snapshots).`);
|
|
43
|
+
}
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
case 'repair': {
|
|
47
|
+
// Alias for the full reinstall ceremony.
|
|
48
|
+
await reinstallCommand(rest);
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
case 'uninstall': {
|
|
52
|
+
console.log('Uninstalling AstraMemory service...');
|
|
53
|
+
await adapter.uninstall();
|
|
54
|
+
try {
|
|
55
|
+
await adapter.uninstallBackupTimer();
|
|
56
|
+
}
|
|
57
|
+
catch { /* timer may not be installed */ }
|
|
58
|
+
console.log('Service uninstalled.');
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
case 'start': {
|
|
62
|
+
console.log('Starting AstraMemory service...');
|
|
63
|
+
try {
|
|
64
|
+
await adapter.start();
|
|
65
|
+
console.log('Service started.');
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
console.error(err.message);
|
|
69
|
+
process.exit(1);
|
|
70
|
+
}
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
case 'stop': {
|
|
74
|
+
console.log('Stopping AstraMemory service...');
|
|
75
|
+
try {
|
|
76
|
+
await adapter.stop();
|
|
77
|
+
console.log('Service stopped.');
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
console.error(err.message);
|
|
81
|
+
process.exit(1);
|
|
82
|
+
}
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
case 'status': {
|
|
86
|
+
const status = await adapter.status();
|
|
87
|
+
if (status.installed) {
|
|
88
|
+
const state = status.running ? 'running' : 'stopped';
|
|
89
|
+
console.log(`Service: installed, ${state}${status.pid ? ` (pid ${status.pid})` : ''}`);
|
|
90
|
+
if (status.detail)
|
|
91
|
+
console.log(` Detail: ${status.detail}`);
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
console.log('Service: not installed');
|
|
95
|
+
if (status.detail)
|
|
96
|
+
console.log(` ${status.detail}`);
|
|
97
|
+
console.log(" Run 'astramem-local service install' to install.");
|
|
98
|
+
}
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
case undefined:
|
|
102
|
+
case '--help':
|
|
103
|
+
case '-h':
|
|
104
|
+
console.log(`astramem-local service <subcommand>
|
|
105
|
+
|
|
106
|
+
Subcommands:
|
|
107
|
+
install [--port N] [--with-backup-timer] [--keep N]
|
|
108
|
+
Install OS service (systemd/launchd/schtasks)
|
|
109
|
+
--with-backup-timer also install nightly 03:00 backup timer
|
|
110
|
+
--keep N retain N snapshots (default: 7)
|
|
111
|
+
uninstall Remove OS service (also removes backup timer if present)
|
|
112
|
+
start Start service via OS init
|
|
113
|
+
stop Stop service via OS init
|
|
114
|
+
status Show service status`);
|
|
115
|
+
break;
|
|
116
|
+
default:
|
|
117
|
+
console.error(`unknown service subcommand: ${subCmd}`);
|
|
118
|
+
process.exit(1);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/cli/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `astramem-local sync pull [--json] [--batch-size N]` — FEAT-407, one-shot
|
|
3
|
+
* cloud -> local pull. Opens the runtime DB directly (same pattern as
|
|
4
|
+
* queue/budget/rebuild — see open-runtime-db.ts), unlike consolidate.ts
|
|
5
|
+
* which proxies over HTTP to a running daemon: pull is a merge operation
|
|
6
|
+
* against the local event log/watermark, not a daemon-only in-memory
|
|
7
|
+
* concern, so a one-shot CLI invocation (daemon running or not) is the
|
|
8
|
+
* right shape, mirroring how `backup`/`restore` work directly against the
|
|
9
|
+
* DB file.
|
|
10
|
+
*
|
|
11
|
+
* Requires the same sync config the shipper uses (cfg.sync.url/workspaceId
|
|
12
|
+
* + a device token) — pull piggybacks on the existing pairing flow
|
|
13
|
+
* (`astramem-local pair`), no separate credential story.
|
|
14
|
+
*/
|
|
15
|
+
export declare function syncCommand(args: string[]): Promise<void>;
|
package/dist/cli/sync.js
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `astramem-local sync pull [--json] [--batch-size N]` — FEAT-407, one-shot
|
|
3
|
+
* cloud -> local pull. Opens the runtime DB directly (same pattern as
|
|
4
|
+
* queue/budget/rebuild — see open-runtime-db.ts), unlike consolidate.ts
|
|
5
|
+
* which proxies over HTTP to a running daemon: pull is a merge operation
|
|
6
|
+
* against the local event log/watermark, not a daemon-only in-memory
|
|
7
|
+
* concern, so a one-shot CLI invocation (daemon running or not) is the
|
|
8
|
+
* right shape, mirroring how `backup`/`restore` work directly against the
|
|
9
|
+
* DB file.
|
|
10
|
+
*
|
|
11
|
+
* Requires the same sync config the shipper uses (cfg.sync.url/workspaceId
|
|
12
|
+
* + a device token) — pull piggybacks on the existing pairing flow
|
|
13
|
+
* (`astramem-local pair`), no separate credential story.
|
|
14
|
+
*/
|
|
15
|
+
import { openRuntimeDb } from './open-runtime-db.js';
|
|
16
|
+
import { readSyncToken } from '../storage/keystore.js';
|
|
17
|
+
import { drainPull, httpPullFetcher, getPullWatermark } from '../sync/puller.js';
|
|
18
|
+
export async function syncCommand(args) {
|
|
19
|
+
const [sub, ...rest] = args;
|
|
20
|
+
const jsonMode = rest.includes('--json') || args.includes('--json');
|
|
21
|
+
switch (sub) {
|
|
22
|
+
case 'pull': {
|
|
23
|
+
const { db, cfg } = openRuntimeDb();
|
|
24
|
+
const token = process.env.ASTRA_SYNC_TOKEN ?? readSyncToken();
|
|
25
|
+
if (!cfg.sync.url || !cfg.sync.workspaceId || !token) {
|
|
26
|
+
console.error('sync pull: sync.enabled url/workspaceId/device-token incomplete — run `astramem-local pair` first.');
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
const fetcher = httpPullFetcher(cfg.sync.url, token);
|
|
30
|
+
const result = await drainPull({ db, fetcher, batchSize: cfg.sync.batchSize });
|
|
31
|
+
if (jsonMode) {
|
|
32
|
+
console.log(JSON.stringify(result));
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
console.log(`Pull complete: ${result.rounds} round(s), ${result.totalFetched} event(s) fetched, ${result.totalInserted} new.`);
|
|
36
|
+
console.log(`Watermark: ${result.cursor ?? '(none)'}`);
|
|
37
|
+
}
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
case 'watermark': {
|
|
41
|
+
const { db } = openRuntimeDb();
|
|
42
|
+
const watermark = getPullWatermark(db);
|
|
43
|
+
console.log(jsonMode ? JSON.stringify({ watermark }) : `Pull watermark: ${watermark ?? '(none — pull has never run)'}`);
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
default:
|
|
47
|
+
console.log(`astramem-local sync <subcommand>
|
|
48
|
+
|
|
49
|
+
Subcommands:
|
|
50
|
+
pull [--json] Pull events from the cloud since the last watermark,
|
|
51
|
+
merge (dedup by event_id, ADR-011 conflict resolve),
|
|
52
|
+
advance + persist the watermark.
|
|
53
|
+
watermark [--json] Show the current persisted pull watermark.
|
|
54
|
+
|
|
55
|
+
Push (local -> cloud) runs automatically inside the daemon when
|
|
56
|
+
sync.enabled=true (see \`astramem-local pair\`) — it has no CLI subcommand.`);
|
|
57
|
+
if (sub !== undefined && sub !== '--help' && sub !== '-h')
|
|
58
|
+
process.exit(1);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/cli/sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAEjF,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAc;IAC9C,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAEpE,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,aAAa,EAAE,CAAC;YACpC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,aAAa,EAAE,CAAC;YAC9D,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,KAAK,EAAE,CAAC;gBACrD,OAAO,CAAC,KAAK,CAAC,oGAAoG,CAAC,CAAC;gBACpH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,KAAe,CAAC,CAAC;YAC/D,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;YAC/E,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;YACtC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,MAAM,cAAc,MAAM,CAAC,YAAY,sBAAsB,MAAM,CAAC,aAAa,OAAO,CAAC,CAAC;gBAC/H,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,MAAM,IAAI,QAAQ,EAAE,CAAC,CAAC;YACzD,CAAC;YACD,MAAM;QACR,CAAC;QAED,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,MAAM,EAAE,EAAE,EAAE,GAAG,aAAa,EAAE,CAAC;YAC/B,MAAM,SAAS,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,mBAAmB,SAAS,IAAI,6BAA6B,EAAE,CAAC,CAAC;YACxH,MAAM;QACR,CAAC;QAED;YACE,OAAO,CAAC,GAAG,CAAC;;;;;;;;;4EAS0D,CAAC,CAAC;YACxE,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;gBAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* token subcommand — `astramem-local token rotate`
|
|
3
|
+
*
|
|
4
|
+
* Generates a fresh 32-byte (64 hex char) random Bearer token, stores it in
|
|
5
|
+
* the OS credential store (SEC-10), and prints the `export MEMORY_BEARER=...`
|
|
6
|
+
* line so the user can paste it. secrets.env is written ONLY as a fallback
|
|
7
|
+
* when the credential store is unavailable (mode 0600 on Unix) — mirrors the
|
|
8
|
+
* db-key degradation pattern in storage/keystore.ts.
|
|
9
|
+
*/
|
|
10
|
+
/** Generate a cryptographically secure 32-byte hex token (64 chars). */
|
|
11
|
+
export declare function generateToken(): string;
|
|
12
|
+
/**
|
|
13
|
+
* Rotate the Bearer token stored in secrets.env.
|
|
14
|
+
*
|
|
15
|
+
* Reads any existing secrets.env to preserve azure keys, then overwrites
|
|
16
|
+
* with a freshly generated MEMORY_BEARER.
|
|
17
|
+
*
|
|
18
|
+
* @param secretsPath - Absolute path to secrets.env. Defaults to
|
|
19
|
+
* `defaultConfigDir()/secrets.env`.
|
|
20
|
+
* @returns The new Bearer token string (64 hex chars).
|
|
21
|
+
*/
|
|
22
|
+
export declare function rotateToken(secretsPath?: string): string;
|
|
23
|
+
/** CLI entry for `astramem-local token <subcommand>`. */
|
|
24
|
+
export declare function tokenCommand(args: string[]): Promise<void>;
|