@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
package/dist/cli/init.js
ADDED
|
@@ -0,0 +1,431 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* init wizard — `astramem-local init`
|
|
3
|
+
*
|
|
4
|
+
* Interactive setup using @inquirer/prompts.
|
|
5
|
+
* Non-TTY / CI mode: set ASTRA_MEMORY_INIT_NONINTERACTIVE=1 and supply
|
|
6
|
+
* answers via env vars (see NON_INTERACTIVE_ENV below).
|
|
7
|
+
*
|
|
8
|
+
* Final actions:
|
|
9
|
+
* 1. Write config.yaml → defaultConfigDir()/config.yaml
|
|
10
|
+
* 2. Write secrets.env → defaultConfigDir()/secrets.env (mode 0600)
|
|
11
|
+
* 3. Run migrations → ensure DB schema at dataDir/memory.sqlite
|
|
12
|
+
* 4. Run doctor checks → print table (skip daemon-reachable check)
|
|
13
|
+
* 5. Print next steps
|
|
14
|
+
*/
|
|
15
|
+
import { join } from 'node:path';
|
|
16
|
+
import { execSync, execFileSync } from 'node:child_process';
|
|
17
|
+
import { defaultConfig } from '../config/config.js';
|
|
18
|
+
import { defaultConfigDir, defaultDataDir } from '../config/datadir.js';
|
|
19
|
+
import { writeConfig } from '../config/writer.js';
|
|
20
|
+
import { writeSecrets } from '../config/secrets.js';
|
|
21
|
+
import { generateToken } from './token.js';
|
|
22
|
+
import { storeBearer } from '../storage/keystore.js';
|
|
23
|
+
import { openDb } from '../storage/db.js';
|
|
24
|
+
import { migrate } from '../storage/migrate.js';
|
|
25
|
+
import { getChecks } from '../doctor/checks.js';
|
|
26
|
+
import { runChecks, formatTable } from '../doctor/runner.js';
|
|
27
|
+
import { mkdirSync } from 'node:fs';
|
|
28
|
+
import { persistEnvVars } from '../config/persist-envs.js';
|
|
29
|
+
import { waitForHealth } from './wait-health.js';
|
|
30
|
+
import { installServiceFlow } from '../service/install-flow.js';
|
|
31
|
+
import { installMemoryPackHook } from './hook-install.js';
|
|
32
|
+
// ─── Non-interactive env var map ─────────────────────────────────────────────
|
|
33
|
+
const NON_INTERACTIVE_ENV = {
|
|
34
|
+
vector: 'ASTRA_MEMORY_INIT_VECTOR',
|
|
35
|
+
embedProvider: 'ASTRA_MEMORY_INIT_EMBED_PROVIDER',
|
|
36
|
+
llmProvider: 'ASTRA_MEMORY_INIT_LLM_PROVIDER',
|
|
37
|
+
dataDir: 'ASTRA_MEMORY_INIT_DATADIR',
|
|
38
|
+
port: 'ASTRA_MEMORY_INIT_PORT',
|
|
39
|
+
budget: 'ASTRA_MEMORY_INIT_BUDGET',
|
|
40
|
+
installService: 'ASTRA_MEMORY_INIT_INSTALL_SERVICE',
|
|
41
|
+
installHook: 'ASTRA_MEMORY_INIT_INSTALL_HOOK',
|
|
42
|
+
};
|
|
43
|
+
/** Test-only injection point for the hook install target (see hook-install.ts). */
|
|
44
|
+
const SETTINGS_PATH_ENV = 'ASTRA_MEMORY_INIT_SETTINGS_PATH';
|
|
45
|
+
function isNonInteractive() {
|
|
46
|
+
return process.env['ASTRA_MEMORY_INIT_NONINTERACTIVE'] === '1';
|
|
47
|
+
}
|
|
48
|
+
// ─── Inquirer lazy import (skip in non-TTY to avoid ESM overhead) ─────────────
|
|
49
|
+
async function promptSelect(message, choices, defaultValue) {
|
|
50
|
+
const { select } = await import('@inquirer/prompts');
|
|
51
|
+
return select({ message, choices, default: defaultValue });
|
|
52
|
+
}
|
|
53
|
+
async function promptInput(message, defaultValue) {
|
|
54
|
+
const { input } = await import('@inquirer/prompts');
|
|
55
|
+
return input({ message, default: defaultValue });
|
|
56
|
+
}
|
|
57
|
+
async function promptPassword(message) {
|
|
58
|
+
const { password } = await import('@inquirer/prompts');
|
|
59
|
+
return password({ message, mask: '*' });
|
|
60
|
+
}
|
|
61
|
+
async function promptConfirm(message, defaultValue) {
|
|
62
|
+
const { confirm } = await import('@inquirer/prompts');
|
|
63
|
+
return confirm({ message, default: defaultValue });
|
|
64
|
+
}
|
|
65
|
+
// ─── Gather answers (interactive path) ───────────────────────────────────────
|
|
66
|
+
async function gatherInteractive() {
|
|
67
|
+
console.log('\nAstraMemory Local — setup wizard\n');
|
|
68
|
+
const vector = (await promptSelect('Vector store:', [
|
|
69
|
+
{ name: 'sqlite-vec (recommended)', value: 'sqlite-vec' },
|
|
70
|
+
{ name: 'lancedb (not yet implemented)', value: 'lancedb' },
|
|
71
|
+
], 'sqlite-vec'));
|
|
72
|
+
const embedProvider = (await promptSelect('Embedding provider:', [
|
|
73
|
+
{ name: 'ollama (local, free)', value: 'ollama' },
|
|
74
|
+
{ name: 'azure-openai (cloud, ~$0)', value: 'azure-openai' },
|
|
75
|
+
], 'ollama'));
|
|
76
|
+
const llmProvider = (await promptSelect('LLM provider:', [
|
|
77
|
+
{ name: 'ollama (qwen2.5-coder:7b)', value: 'ollama' },
|
|
78
|
+
{ name: 'azure-openai (gpt-4.1)', value: 'azure-openai' },
|
|
79
|
+
], 'ollama'));
|
|
80
|
+
const dataDir = await promptInput('Data directory:', defaultDataDir());
|
|
81
|
+
const portStr = await promptInput('Daemon port:', '7777');
|
|
82
|
+
const budgetStr = await promptInput('Daily LLM budget cap (USD):', '10');
|
|
83
|
+
const installService = await promptConfirm('Install as OS service?', true);
|
|
84
|
+
const answers = {
|
|
85
|
+
vector,
|
|
86
|
+
embedProvider,
|
|
87
|
+
llmProvider,
|
|
88
|
+
dataDir,
|
|
89
|
+
port: parseInt(portStr, 10) || 7777,
|
|
90
|
+
budget: parseFloat(budgetStr) || 10,
|
|
91
|
+
installService,
|
|
92
|
+
};
|
|
93
|
+
// Azure-specific prompts
|
|
94
|
+
if (embedProvider === 'azure-openai' || llmProvider === 'azure-openai') {
|
|
95
|
+
answers.azureEndpoint = await promptInput('Azure OpenAI endpoint (https://your-resource.openai.azure.com):', '');
|
|
96
|
+
answers.azureDeployment = await promptInput('Azure OpenAI deployment name:', '');
|
|
97
|
+
answers.azureApiKey = await promptPassword('Azure OpenAI API key:');
|
|
98
|
+
}
|
|
99
|
+
return answers;
|
|
100
|
+
}
|
|
101
|
+
// ─── Gather answers (non-interactive / test path) ─────────────────────────────
|
|
102
|
+
function gatherNonInteractive() {
|
|
103
|
+
const vector = (process.env[NON_INTERACTIVE_ENV.vector] ?? 'sqlite-vec');
|
|
104
|
+
const embedProvider = (process.env[NON_INTERACTIVE_ENV.embedProvider] ?? 'ollama');
|
|
105
|
+
const llmProvider = (process.env[NON_INTERACTIVE_ENV.llmProvider] ?? 'ollama');
|
|
106
|
+
const dataDir = process.env[NON_INTERACTIVE_ENV.dataDir] ?? defaultDataDir();
|
|
107
|
+
const port = parseInt(process.env[NON_INTERACTIVE_ENV.port] ?? '7777', 10) || 7777;
|
|
108
|
+
const budget = parseFloat(process.env[NON_INTERACTIVE_ENV.budget] ?? '10') || 10;
|
|
109
|
+
const installService = (process.env[NON_INTERACTIVE_ENV.installService] ?? 'false') === 'true';
|
|
110
|
+
return { vector, embedProvider, llmProvider, dataDir, port, budget, installService };
|
|
111
|
+
}
|
|
112
|
+
// ─── Conditional provider checks ─────────────────────────────────────────────
|
|
113
|
+
/**
|
|
114
|
+
* Query the local Ollama daemon and report whether `model` is present.
|
|
115
|
+
* Shared by the initial detection pass and the post-pull re-validation
|
|
116
|
+
* so there is a single source of truth for "is this model here".
|
|
117
|
+
*/
|
|
118
|
+
async function isOllamaModelPresent(model) {
|
|
119
|
+
const controller = new AbortController();
|
|
120
|
+
const tid = setTimeout(() => controller.abort(), 5_000);
|
|
121
|
+
try {
|
|
122
|
+
const res = await fetch('http://127.0.0.1:11434/api/tags', { signal: controller.signal });
|
|
123
|
+
if (!res.ok)
|
|
124
|
+
return false;
|
|
125
|
+
const body = await res.json();
|
|
126
|
+
const names = (body.models ?? []).map((m) => m.name);
|
|
127
|
+
return names.some((n) => n === model || n.startsWith(model + ':'));
|
|
128
|
+
}
|
|
129
|
+
finally {
|
|
130
|
+
clearTimeout(tid);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
export async function checkOllama(llmModel, embedModel, nonInteractive) {
|
|
134
|
+
if (nonInteractive)
|
|
135
|
+
return; // skip live HTTP in test mode
|
|
136
|
+
// Check ollama binary
|
|
137
|
+
let ollamaFound = false;
|
|
138
|
+
try {
|
|
139
|
+
execSync('ollama --version', { stdio: 'ignore' });
|
|
140
|
+
ollamaFound = true;
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
console.warn('\n Warning: `ollama` binary not found. Install from https://ollama.com\n');
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
if (!ollamaFound)
|
|
147
|
+
return;
|
|
148
|
+
// Check models present — auto-pull anything missing so the daemon
|
|
149
|
+
// doesn't fail later at embed/LLM preflight with a 404 "model not found".
|
|
150
|
+
const modelsToCheck = [...new Set([llmModel, embedModel])];
|
|
151
|
+
for (const model of modelsToCheck) {
|
|
152
|
+
let found;
|
|
153
|
+
try {
|
|
154
|
+
found = await isOllamaModelPresent(model);
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
console.warn(`\n Warning: Could not reach Ollama at :11434. Is it running?\n`);
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
if (found) {
|
|
161
|
+
console.log(` ✓ Ollama model '${model}' present`);
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
console.log(`\n Model '${model}' not found locally.`);
|
|
165
|
+
console.log(` Pulling ${model} (required)...`);
|
|
166
|
+
try {
|
|
167
|
+
execFileSync('ollama', ['pull', model], { stdio: 'inherit' });
|
|
168
|
+
}
|
|
169
|
+
catch (err) {
|
|
170
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
171
|
+
throw new Error(`Failed to pull Ollama model '${model}': ${msg}\n Run manually: ollama pull ${model}`);
|
|
172
|
+
}
|
|
173
|
+
let pulled;
|
|
174
|
+
try {
|
|
175
|
+
pulled = await isOllamaModelPresent(model);
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
pulled = false;
|
|
179
|
+
}
|
|
180
|
+
if (!pulled) {
|
|
181
|
+
throw new Error(`Ollama model '${model}' still not found after pull.\n Run manually: ollama pull ${model}`);
|
|
182
|
+
}
|
|
183
|
+
console.log(` ✓ Ollama model '${model}' pulled successfully`);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
async function checkAzure(endpoint, deployment, apiKey, nonInteractive) {
|
|
187
|
+
if (nonInteractive)
|
|
188
|
+
return; // skip live HTTP in test mode
|
|
189
|
+
if (!endpoint || !deployment || !apiKey) {
|
|
190
|
+
console.warn(' Warning: Azure credentials incomplete — skipping connectivity check.');
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
try {
|
|
194
|
+
const url = `${endpoint.replace(/\/$/, '')}/openai/deployments/${deployment}/chat/completions?api-version=2024-10-21`;
|
|
195
|
+
const controller = new AbortController();
|
|
196
|
+
const tid = setTimeout(() => controller.abort(), 10_000);
|
|
197
|
+
const res = await fetch(url, {
|
|
198
|
+
method: 'POST',
|
|
199
|
+
headers: {
|
|
200
|
+
'Content-Type': 'application/json',
|
|
201
|
+
'api-key': apiKey,
|
|
202
|
+
},
|
|
203
|
+
body: JSON.stringify({
|
|
204
|
+
messages: [{ role: 'user', content: 'hi' }],
|
|
205
|
+
max_tokens: 1,
|
|
206
|
+
}),
|
|
207
|
+
signal: controller.signal,
|
|
208
|
+
});
|
|
209
|
+
clearTimeout(tid);
|
|
210
|
+
if (res.ok || res.status === 400) {
|
|
211
|
+
// 400 can mean bad request but creds are valid
|
|
212
|
+
console.log(' ✓ Azure OpenAI endpoint reachable');
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
console.warn(` Warning: Azure endpoint returned HTTP ${res.status}`);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
catch (err) {
|
|
219
|
+
console.warn(` Warning: Could not reach Azure endpoint: ${err instanceof Error ? err.message : err}`);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
// ─── Build config from answers ────────────────────────────────────────────────
|
|
223
|
+
function buildConfig(answers) {
|
|
224
|
+
const base = defaultConfig();
|
|
225
|
+
const llmModel = answers.llmProvider === 'azure-openai' ? 'gpt-4.1' : 'qwen2.5-coder:7b';
|
|
226
|
+
const embedModel = answers.embedProvider === 'azure-openai' ? 'text-embedding-3-small' : 'mxbai-embed-large';
|
|
227
|
+
return {
|
|
228
|
+
...base,
|
|
229
|
+
port: answers.port,
|
|
230
|
+
dataDir: answers.dataDir,
|
|
231
|
+
llm: {
|
|
232
|
+
compaction: { provider: answers.llmProvider, model: llmModel },
|
|
233
|
+
extraction: { provider: answers.llmProvider, model: llmModel },
|
|
234
|
+
},
|
|
235
|
+
embedding: {
|
|
236
|
+
provider: answers.embedProvider,
|
|
237
|
+
model: embedModel,
|
|
238
|
+
// FEAT-409: derived from base.embedding.dim (DEFAULT_EMBED_DIM) —
|
|
239
|
+
// the wizard doesn't yet expose a dim override, so this stays the
|
|
240
|
+
// default until a future non-default-dim onboarding flow is added.
|
|
241
|
+
dim: base.embedding.dim,
|
|
242
|
+
},
|
|
243
|
+
vector: { store: answers.vector === 'lancedb' ? 'sqlite-vec' : answers.vector },
|
|
244
|
+
budget: { daily_usd: answers.budget },
|
|
245
|
+
azure: {
|
|
246
|
+
...base.azure,
|
|
247
|
+
endpoint: answers.azureEndpoint,
|
|
248
|
+
deployment: answers.azureDeployment,
|
|
249
|
+
},
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
// ─── SessionStart memory-pack hook offer ──────────────────────────────────────
|
|
253
|
+
/**
|
|
254
|
+
* Decide whether to install the SessionStart memory-pack hook (KF-B
|
|
255
|
+
* follow-up, docs/hooks/memory-pack.md). Offered after the token/provider
|
|
256
|
+
* setup steps so the daemon port + bearer are already settled.
|
|
257
|
+
*
|
|
258
|
+
* - `--no-hook` on the CLI, or non-interactive mode without the
|
|
259
|
+
* `ASTRA_MEMORY_INIT_INSTALL_HOOK=true` override → skip silently (no
|
|
260
|
+
* prompt, no console output).
|
|
261
|
+
* - Interactive TTY → confirm prompt, default NO.
|
|
262
|
+
*/
|
|
263
|
+
async function promptHookInstall(nonInteractive, noHookFlag) {
|
|
264
|
+
if (nonInteractive) {
|
|
265
|
+
return process.env[NON_INTERACTIVE_ENV.installHook] === 'true';
|
|
266
|
+
}
|
|
267
|
+
if (noHookFlag)
|
|
268
|
+
return false;
|
|
269
|
+
return promptConfirm('Install the SessionStart memory-pack hook? (auto-injects a repo-scoped memory pack into new Claude Code sessions)', false);
|
|
270
|
+
}
|
|
271
|
+
// ─── Main wizard flow ─────────────────────────────────────────────────────────
|
|
272
|
+
export async function init(argv = []) {
|
|
273
|
+
const nonInteractive = isNonInteractive();
|
|
274
|
+
const noHookFlag = argv.includes('--no-hook');
|
|
275
|
+
// 1. Gather answers
|
|
276
|
+
const answers = nonInteractive ? gatherNonInteractive() : await gatherInteractive();
|
|
277
|
+
// 2. lancedb fallback
|
|
278
|
+
if (answers.vector === 'lancedb') {
|
|
279
|
+
console.log('\n lancedb v1 not yet shipped — falling back to sqlite-vec.\n');
|
|
280
|
+
answers.vector = 'sqlite-vec';
|
|
281
|
+
}
|
|
282
|
+
// 3. Provider checks
|
|
283
|
+
if (answers.llmProvider === 'ollama' || answers.embedProvider === 'ollama') {
|
|
284
|
+
const llmModel = answers.llmProvider === 'azure-openai' ? 'gpt-4.1' : 'qwen2.5-coder:7b';
|
|
285
|
+
const embedModel = answers.embedProvider === 'azure-openai' ? 'text-embedding-3-small' : 'mxbai-embed-large';
|
|
286
|
+
await checkOllama(llmModel, embedModel, nonInteractive);
|
|
287
|
+
}
|
|
288
|
+
if (answers.azureApiKey || answers.azureEndpoint) {
|
|
289
|
+
await checkAzure(answers.azureEndpoint ?? '', answers.azureDeployment ?? '', answers.azureApiKey ?? '', nonInteractive);
|
|
290
|
+
}
|
|
291
|
+
// 4. Build config
|
|
292
|
+
const cfg = buildConfig(answers);
|
|
293
|
+
// 5. Write config.yaml
|
|
294
|
+
const configDir = defaultConfigDir();
|
|
295
|
+
const configPath = join(configDir, 'config.yaml');
|
|
296
|
+
writeConfig(cfg, configPath);
|
|
297
|
+
if (!nonInteractive)
|
|
298
|
+
console.log(`\n ✓ config.yaml written to ${configPath}`);
|
|
299
|
+
// 6. Generate bearer + store it (SEC-10: credential store first, secrets.env
|
|
300
|
+
// ONLY as fallback when the store is unavailable — mirrors keystore.ts).
|
|
301
|
+
const secretsPath = join(configDir, 'secrets.env');
|
|
302
|
+
const bearer = generateToken();
|
|
303
|
+
const { stored } = storeBearer(bearer);
|
|
304
|
+
writeSecrets({
|
|
305
|
+
bearer: stored ? undefined : bearer,
|
|
306
|
+
azureKey: answers.azureApiKey,
|
|
307
|
+
azureEndpoint: answers.azureEndpoint,
|
|
308
|
+
azureDeployment: answers.azureDeployment,
|
|
309
|
+
}, secretsPath);
|
|
310
|
+
if (!nonInteractive) {
|
|
311
|
+
console.log(stored
|
|
312
|
+
? ` ✓ bearer token stored in OS credential store`
|
|
313
|
+
: ` ✓ secrets.env written to ${secretsPath} (mode 0600, bearer fallback — OS credential store unavailable)`);
|
|
314
|
+
}
|
|
315
|
+
// 6b. Offer to install the SessionStart memory-pack hook (KF-B follow-up).
|
|
316
|
+
const installHook = await promptHookInstall(nonInteractive, noHookFlag);
|
|
317
|
+
if (installHook) {
|
|
318
|
+
const hookResult = installMemoryPackHook({
|
|
319
|
+
port: answers.port,
|
|
320
|
+
settingsPath: process.env[SETTINGS_PATH_ENV],
|
|
321
|
+
});
|
|
322
|
+
cfg.recallPack.enabled = true;
|
|
323
|
+
writeConfig(cfg, configPath); // persist the flag flip — config.yaml now round-trips recallPack
|
|
324
|
+
if (!nonInteractive) {
|
|
325
|
+
if (hookResult.outcome === 'installed') {
|
|
326
|
+
console.log(` ✓ SessionStart memory-pack hook installed → ${hookResult.settingsPath}`);
|
|
327
|
+
}
|
|
328
|
+
else {
|
|
329
|
+
console.log(` · SessionStart memory-pack hook already installed → ${hookResult.settingsPath} (skipped)`);
|
|
330
|
+
}
|
|
331
|
+
console.log(` recallPack.enabled=true persisted to config.yaml`);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
// 7. Run migrations — this is the fresh-DB creation path, so
|
|
335
|
+
// cfg.embedding.dim (FEAT-409) is what actually bakes into memories_vec.
|
|
336
|
+
const dbPath = join(answers.dataDir, 'memory.sqlite');
|
|
337
|
+
mkdirSync(answers.dataDir, { recursive: true });
|
|
338
|
+
const db = openDb(dbPath);
|
|
339
|
+
migrate(db, cfg.embedding.dim);
|
|
340
|
+
db.close();
|
|
341
|
+
if (!nonInteractive)
|
|
342
|
+
console.log(` ✓ DB migrations applied at ${dbPath}`);
|
|
343
|
+
// 8. Run doctor (skip daemon-reachable check — daemon not yet started)
|
|
344
|
+
// We pass a dummy port that won't be running, then filter out the
|
|
345
|
+
// daemon check to avoid noisy failure during init.
|
|
346
|
+
const allChecks = getChecks({ dataDir: answers.dataDir, port: answers.port, dailyBudgetUsd: answers.budget });
|
|
347
|
+
const checksToRun = allChecks.filter(c => !c.name.startsWith('Daemon reachable'));
|
|
348
|
+
const results = await runChecks(checksToRun);
|
|
349
|
+
if (!nonInteractive) {
|
|
350
|
+
console.log('\nDoctor:\n');
|
|
351
|
+
console.log(formatTable(results));
|
|
352
|
+
console.log('');
|
|
353
|
+
}
|
|
354
|
+
// 9. Persist env vars so the plugin sees them in future shells
|
|
355
|
+
const apiUrl = `http://127.0.0.1:${answers.port}`;
|
|
356
|
+
if (!nonInteractive) {
|
|
357
|
+
const persistResult = await persistEnvVars({
|
|
358
|
+
MEMORY_BEARER: bearer,
|
|
359
|
+
MEMORY_API_URL: apiUrl,
|
|
360
|
+
});
|
|
361
|
+
if (persistResult.ok) {
|
|
362
|
+
console.log(` ✓ env vars persisted (${persistResult.target})`);
|
|
363
|
+
}
|
|
364
|
+
else {
|
|
365
|
+
console.log(` ⚠ could not persist env vars: ${persistResult.message}`);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
// Always echo the export lines so users (and CI tests) can pick them up.
|
|
369
|
+
console.log('');
|
|
370
|
+
console.log(` export MEMORY_BEARER=${bearer}`);
|
|
371
|
+
console.log(` export MEMORY_API_URL=${apiUrl}`);
|
|
372
|
+
// 10. Install + start service if requested. Works in non-interactive mode
|
|
373
|
+
// too (ASTRA_MEMORY_INIT_INSTALL_SERVICE=true) — previously the block was
|
|
374
|
+
// gated on interactivity, so there was no scriptable install path at all.
|
|
375
|
+
let serviceStarted = false;
|
|
376
|
+
if (answers.installService) {
|
|
377
|
+
try {
|
|
378
|
+
// Single shared install path (shim + XML task on Windows) — same code
|
|
379
|
+
// that `service install` and `reinstall` use.
|
|
380
|
+
const { result, adapter } = await installServiceFlow(answers.port);
|
|
381
|
+
console.log(` · installing OS service (${adapter.platform})...`);
|
|
382
|
+
if (result.kind === 'task') {
|
|
383
|
+
console.log(` · starting service...`);
|
|
384
|
+
await adapter.start();
|
|
385
|
+
console.log(` ✓ service installed and started`);
|
|
386
|
+
serviceStarted = true;
|
|
387
|
+
}
|
|
388
|
+
else {
|
|
389
|
+
console.log(` ⚠ scheduler registration failed — Startup shortcut installed at ${result.path}`);
|
|
390
|
+
console.log(` The daemon will start at next logon; 'service start/stop' will not work.`);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
catch (err) {
|
|
394
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
395
|
+
console.log(` ⚠ service install failed: ${msg}`);
|
|
396
|
+
console.log(` Retry manually: astramem-local reinstall`);
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
// 11. Verify daemon health if we started one
|
|
400
|
+
if (serviceStarted) {
|
|
401
|
+
const up = await waitForHealth(answers.port, 5_000);
|
|
402
|
+
if (up) {
|
|
403
|
+
console.log(` ✓ daemon healthy at ${apiUrl}`);
|
|
404
|
+
}
|
|
405
|
+
else {
|
|
406
|
+
console.log(` ⚠ daemon did not respond to /health within 5s — check 'astramem-local service status'`);
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
// 12. Print final next steps
|
|
410
|
+
console.log('');
|
|
411
|
+
console.log('✓ AstraMemory Local initialized.');
|
|
412
|
+
console.log('');
|
|
413
|
+
if (!serviceStarted && !nonInteractive) {
|
|
414
|
+
console.log('Start the daemon:');
|
|
415
|
+
console.log('');
|
|
416
|
+
if (answers.installService) {
|
|
417
|
+
console.log(' astramem-local service install && astramem-local service start');
|
|
418
|
+
}
|
|
419
|
+
else {
|
|
420
|
+
console.log(' astramem-local serve');
|
|
421
|
+
}
|
|
422
|
+
console.log('');
|
|
423
|
+
}
|
|
424
|
+
console.log('Open a new shell so env vars take effect, then verify:');
|
|
425
|
+
console.log('');
|
|
426
|
+
console.log(' astramem-local doctor');
|
|
427
|
+
console.log(' astramem-local remember "test memory" --type fact');
|
|
428
|
+
console.log(' astramem-local search "test"');
|
|
429
|
+
console.log('');
|
|
430
|
+
}
|
|
431
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `astramem-local mcp-stdio` — MCP server over the stdio transport.
|
|
3
|
+
*
|
|
4
|
+
* Everything HTTP/POST-/mcp gets from buildMcpServer() (src/mcp/server.ts),
|
|
5
|
+
* this subcommand gets too — same tool set, same db/embed wiring — just
|
|
6
|
+
* connected to a StdioServerTransport instead of a Fastify route. No daemon
|
|
7
|
+
* lifecycle (no instance lock, no worker, no shipper, no timers): this
|
|
8
|
+
* process is meant to be spawned per-client-session by an MCP host and to
|
|
9
|
+
* exit when that host closes stdin, not to run as a long-lived service.
|
|
10
|
+
*
|
|
11
|
+
* Reuses the same config/datadir resolution and mock-provider opt-in
|
|
12
|
+
* (ASTRA_MEMORY_MOCK_PROVIDERS=1) as `serve` so tests can drive it without
|
|
13
|
+
* Ollama — see tests/smoke/mcp-stdio.e2e.test.ts.
|
|
14
|
+
*/
|
|
15
|
+
export interface McpStdioOpts {
|
|
16
|
+
dataDir?: string;
|
|
17
|
+
}
|
|
18
|
+
export declare function mcpStdio(opts?: McpStdioOpts): Promise<void>;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `astramem-local mcp-stdio` — MCP server over the stdio transport.
|
|
3
|
+
*
|
|
4
|
+
* Everything HTTP/POST-/mcp gets from buildMcpServer() (src/mcp/server.ts),
|
|
5
|
+
* this subcommand gets too — same tool set, same db/embed wiring — just
|
|
6
|
+
* connected to a StdioServerTransport instead of a Fastify route. No daemon
|
|
7
|
+
* lifecycle (no instance lock, no worker, no shipper, no timers): this
|
|
8
|
+
* process is meant to be spawned per-client-session by an MCP host and to
|
|
9
|
+
* exit when that host closes stdin, not to run as a long-lived service.
|
|
10
|
+
*
|
|
11
|
+
* Reuses the same config/datadir resolution and mock-provider opt-in
|
|
12
|
+
* (ASTRA_MEMORY_MOCK_PROVIDERS=1) as `serve` so tests can drive it without
|
|
13
|
+
* Ollama — see tests/smoke/mcp-stdio.e2e.test.ts.
|
|
14
|
+
*/
|
|
15
|
+
import { join } from 'node:path';
|
|
16
|
+
import { mkdirSync } from 'node:fs';
|
|
17
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
18
|
+
import { buildMcpServer } from '../mcp/server.js';
|
|
19
|
+
import { openDb } from '../storage/db.js';
|
|
20
|
+
import { migrate } from '../storage/migrate.js';
|
|
21
|
+
import { getOrCreateKey } from '../storage/keystore.js';
|
|
22
|
+
import { encryptIfPlaintext } from '../storage/migrate-encrypt.js';
|
|
23
|
+
import { defaultConfigDir } from '../config/datadir.js';
|
|
24
|
+
import { resolveRuntimeConfig } from '../config/resolve-runtime.js';
|
|
25
|
+
import { makeMockProviders } from '../pipeline/mock-providers.js';
|
|
26
|
+
export async function mcpStdio(opts = {}) {
|
|
27
|
+
const { cfg, dataDir } = resolveRuntimeConfig({ dataDir: opts.dataDir });
|
|
28
|
+
const dbPath = dataDir === ':memory:' ? ':memory:' : join(dataDir, 'memory.sqlite');
|
|
29
|
+
if (dataDir !== ':memory:')
|
|
30
|
+
mkdirSync(dataDir, { recursive: true });
|
|
31
|
+
// Same encryption-at-rest handling as serve.ts: in-memory never encrypts,
|
|
32
|
+
// otherwise fetch/create the key and transparently migrate a plaintext DB.
|
|
33
|
+
let db;
|
|
34
|
+
if (dataDir === ':memory:') {
|
|
35
|
+
db = openDb(dbPath);
|
|
36
|
+
}
|
|
37
|
+
else if (cfg.security.encryption.enabled) {
|
|
38
|
+
const key = getOrCreateKey(defaultConfigDir()).key;
|
|
39
|
+
encryptIfPlaintext(dbPath, key);
|
|
40
|
+
db = openDb(dbPath, { key });
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
db = openDb(dbPath);
|
|
44
|
+
}
|
|
45
|
+
migrate(db, cfg.embedding.dim);
|
|
46
|
+
let embed;
|
|
47
|
+
if (process.env.ASTRA_MEMORY_MOCK_PROVIDERS === '1') {
|
|
48
|
+
embed = makeMockProviders(cfg.embedding.dim).embed;
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
const { getProviders } = await import('../providers/index.js');
|
|
52
|
+
embed = getProviders(cfg).embed;
|
|
53
|
+
}
|
|
54
|
+
const server = buildMcpServer({ db, embed, config: cfg });
|
|
55
|
+
const transport = new StdioServerTransport();
|
|
56
|
+
await server.connect(transport);
|
|
57
|
+
// Exit cleanly when the client closes stdin (EOF) — StdioServerTransport
|
|
58
|
+
// only calls onclose from its own close(), it does not watch stdin 'end'
|
|
59
|
+
// itself, so we drive the shutdown from here.
|
|
60
|
+
process.stdin.on('end', () => {
|
|
61
|
+
void server.close().finally(() => {
|
|
62
|
+
db.close();
|
|
63
|
+
process.exit(0);
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=mcp-stdio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-stdio.js","sourceRoot":"","sources":["../../src/cli/mcp-stdio.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI command: `astramem-local memory restore <id>` (FEAT-416)
|
|
3
|
+
*
|
|
4
|
+
* Thin HTTP client, same pattern as src/cli/search.ts — talks to a running
|
|
5
|
+
* daemon via HTTP (ASTRA_MEMORY_URL / ASTRA_MEMORY_TOKEN).
|
|
6
|
+
*
|
|
7
|
+
* Lives in its own file rather than search.ts because it seeds a `memory
|
|
8
|
+
* <verb> <id>` subcommand group for lifecycle operations. Note there is no
|
|
9
|
+
* prior CLI convention for lifecycle ops to mirror: invalidate/supersede/
|
|
10
|
+
* promote/erase are exposed via REST + MCP only, never CLI (grep confirms).
|
|
11
|
+
* `restore` also can't be a bare top-level command — that name is already
|
|
12
|
+
* the DB-snapshot restore (src/cli/restore.ts, W2.2) — hence `memory restore`.
|
|
13
|
+
*/
|
|
14
|
+
/** `astramem-local memory restore <id>` — un-archive a memory (FEAT-416 AC-4). */
|
|
15
|
+
export declare function cliMemoryRestore(id: string): Promise<void>;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI command: `astramem-local memory restore <id>` (FEAT-416)
|
|
3
|
+
*
|
|
4
|
+
* Thin HTTP client, same pattern as src/cli/search.ts — talks to a running
|
|
5
|
+
* daemon via HTTP (ASTRA_MEMORY_URL / ASTRA_MEMORY_TOKEN).
|
|
6
|
+
*
|
|
7
|
+
* Lives in its own file rather than search.ts because it seeds a `memory
|
|
8
|
+
* <verb> <id>` subcommand group for lifecycle operations. Note there is no
|
|
9
|
+
* prior CLI convention for lifecycle ops to mirror: invalidate/supersede/
|
|
10
|
+
* promote/erase are exposed via REST + MCP only, never CLI (grep confirms).
|
|
11
|
+
* `restore` also can't be a bare top-level command — that name is already
|
|
12
|
+
* the DB-snapshot restore (src/cli/restore.ts, W2.2) — hence `memory restore`.
|
|
13
|
+
*/
|
|
14
|
+
function getBaseUrl() {
|
|
15
|
+
return process.env.ASTRA_MEMORY_URL ?? 'http://127.0.0.1:7777';
|
|
16
|
+
}
|
|
17
|
+
function getToken() {
|
|
18
|
+
return process.env.ASTRA_MEMORY_TOKEN ?? 'devtok';
|
|
19
|
+
}
|
|
20
|
+
async function postRestore(id) {
|
|
21
|
+
const base = getBaseUrl();
|
|
22
|
+
const res = await fetch(`${base}/memory/${encodeURIComponent(id)}/restore`, {
|
|
23
|
+
method: 'POST',
|
|
24
|
+
headers: { 'content-type': 'application/json', authorization: `Bearer ${getToken()}` },
|
|
25
|
+
});
|
|
26
|
+
const body = await res.json().catch(() => ({}));
|
|
27
|
+
return { status: res.status, body };
|
|
28
|
+
}
|
|
29
|
+
/** `astramem-local memory restore <id>` — un-archive a memory (FEAT-416 AC-4). */
|
|
30
|
+
export async function cliMemoryRestore(id) {
|
|
31
|
+
if (!id) {
|
|
32
|
+
console.error('memory restore: id argument is required');
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
const { status, body } = await postRestore(id);
|
|
36
|
+
if (status === 200) {
|
|
37
|
+
console.log(`Restored: ${id}`);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
if (status === 404) {
|
|
41
|
+
console.error(`memory restore: no such memory ${id}`);
|
|
42
|
+
process.exit(1);
|
|
43
|
+
}
|
|
44
|
+
if (status === 409) {
|
|
45
|
+
const msg = body.error ?? 'memory is not archived';
|
|
46
|
+
console.error(`memory restore: ${msg}`);
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
console.error(`memory restore: HTTP ${status}: ${JSON.stringify(body)}`);
|
|
50
|
+
process.exit(1);
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/cli/memory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,SAAS,UAAU;IACjB,OAAO,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,uBAAuB,CAAC;AACjE,CAAC;AAED,SAAS,QAAQ;IACf,OAAO,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,QAAQ,CAAC;AACpD,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,EAAU;IACnC,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;IAC1B,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,WAAW,kBAAkB,CAAC,EAAE,CAAC,UAAU,EAAE;QAC1E,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa,EAAE,UAAU,QAAQ,EAAE,EAAE,EAAE;KACvF,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAChD,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;AACtC,CAAC;AAED,kFAAkF;AAClF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,EAAU;IAC/C,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,OAAO,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;QACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,WAAW,CAAC,EAAE,CAAC,CAAC;IAE/C,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;QAC/B,OAAO;IACT,CAAC;IACD,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACnB,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,EAAE,CAAC,CAAC;QACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACnB,MAAM,GAAG,GAAI,IAA2B,CAAC,KAAK,IAAI,wBAAwB,CAAC;QAC3E,OAAO,CAAC,KAAK,CAAC,mBAAmB,GAAG,EAAE,CAAC,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,wBAAwB,MAAM,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type DB } from '../storage/db.js';
|
|
2
|
+
import type { Config } from '../config/config.js';
|
|
3
|
+
export interface RuntimeDb {
|
|
4
|
+
db: DB;
|
|
5
|
+
cfg: Config;
|
|
6
|
+
dataDir: string;
|
|
7
|
+
}
|
|
8
|
+
/** Resolve config the same way serve does, open key-aware, run migrations.
|
|
9
|
+
*
|
|
10
|
+
* Key is applied only when the file on disk is actually encrypted: a
|
|
11
|
+
* plaintext DB (fresh test dir, encryption recently toggled on but serve's
|
|
12
|
+
* auto-migration not yet run) must be opened WITHOUT a key — PRAGMA key on
|
|
13
|
+
* a plaintext file makes every read fail with "file is not a database".
|
|
14
|
+
* serve owns the plaintext→encrypted migration; one-shot commands do not. */
|
|
15
|
+
export declare function openRuntimeDb(): RuntimeDb;
|