@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,77 @@
|
|
|
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
|
+
import { randomBytes } from 'node:crypto';
|
|
11
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
12
|
+
import { join } from 'node:path';
|
|
13
|
+
import { writeSecrets } from '../config/secrets.js';
|
|
14
|
+
import { defaultConfigDir } from '../config/datadir.js';
|
|
15
|
+
import { storeBearer } from '../storage/keystore.js';
|
|
16
|
+
/** Generate a cryptographically secure 32-byte hex token (64 chars). */
|
|
17
|
+
export function generateToken() {
|
|
18
|
+
return randomBytes(32).toString('hex');
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Rotate the Bearer token stored in secrets.env.
|
|
22
|
+
*
|
|
23
|
+
* Reads any existing secrets.env to preserve azure keys, then overwrites
|
|
24
|
+
* with a freshly generated MEMORY_BEARER.
|
|
25
|
+
*
|
|
26
|
+
* @param secretsPath - Absolute path to secrets.env. Defaults to
|
|
27
|
+
* `defaultConfigDir()/secrets.env`.
|
|
28
|
+
* @returns The new Bearer token string (64 hex chars).
|
|
29
|
+
*/
|
|
30
|
+
export function rotateToken(secretsPath) {
|
|
31
|
+
const path = secretsPath ?? join(defaultConfigDir(), 'secrets.env');
|
|
32
|
+
const newToken = generateToken();
|
|
33
|
+
// Preserve any existing azure keys from the current secrets.env.
|
|
34
|
+
let azureKey;
|
|
35
|
+
let azureEndpoint;
|
|
36
|
+
let azureDeployment;
|
|
37
|
+
if (existsSync(path)) {
|
|
38
|
+
const content = readFileSync(path, 'utf8');
|
|
39
|
+
for (const rawLine of content.split('\n')) {
|
|
40
|
+
const trimmed = rawLine.trim();
|
|
41
|
+
if (trimmed.startsWith('AZURE_OPENAI_API_KEY=')) {
|
|
42
|
+
azureKey = trimmed.slice('AZURE_OPENAI_API_KEY='.length);
|
|
43
|
+
}
|
|
44
|
+
else if (trimmed.startsWith('AZURE_OPENAI_ENDPOINT=')) {
|
|
45
|
+
azureEndpoint = trimmed.slice('AZURE_OPENAI_ENDPOINT='.length);
|
|
46
|
+
}
|
|
47
|
+
else if (trimmed.startsWith('AZURE_OPENAI_DEPLOYMENT=')) {
|
|
48
|
+
azureDeployment = trimmed.slice('AZURE_OPENAI_DEPLOYMENT='.length);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// SEC-10: try the OS credential store first; only fall back to writing the
|
|
53
|
+
// bearer into secrets.env when the store is unavailable. Azure keys (if
|
|
54
|
+
// any) are unaffected — they still live in secrets.env regardless.
|
|
55
|
+
const { stored } = storeBearer(newToken);
|
|
56
|
+
writeSecrets({ bearer: stored ? undefined : newToken, azureKey, azureEndpoint, azureDeployment }, path);
|
|
57
|
+
return newToken;
|
|
58
|
+
}
|
|
59
|
+
/** CLI entry for `astramem-local token <subcommand>`. */
|
|
60
|
+
export async function tokenCommand(args) {
|
|
61
|
+
const sub = args[0];
|
|
62
|
+
switch (sub) {
|
|
63
|
+
case 'rotate': {
|
|
64
|
+
const token = rotateToken();
|
|
65
|
+
console.log(`Token rotated. Add to your shell rc:\n`);
|
|
66
|
+
console.log(` export MEMORY_BEARER=${token}`);
|
|
67
|
+
console.log('');
|
|
68
|
+
console.log('The old token is now invalid. Restart the daemon to pick up the new token.');
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
default:
|
|
72
|
+
console.error(`token: unknown subcommand '${sub ?? ''}'`);
|
|
73
|
+
console.error('Usage: astramem-local token rotate');
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token.js","sourceRoot":"","sources":["../../src/cli/token.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Poll the daemon's /health endpoint until it returns 200 or timeout.
|
|
3
|
+
*/
|
|
4
|
+
export async function waitForHealth(port, timeoutMs) {
|
|
5
|
+
const url = `http://127.0.0.1:${port}/health`;
|
|
6
|
+
const deadline = Date.now() + timeoutMs;
|
|
7
|
+
while (Date.now() < deadline) {
|
|
8
|
+
try {
|
|
9
|
+
const ctrl = new AbortController();
|
|
10
|
+
const t = setTimeout(() => ctrl.abort(), 1500);
|
|
11
|
+
const res = await fetch(url, { signal: ctrl.signal });
|
|
12
|
+
clearTimeout(t);
|
|
13
|
+
if (res.ok)
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
// keep polling
|
|
18
|
+
}
|
|
19
|
+
await new Promise(r => setTimeout(r, 250));
|
|
20
|
+
}
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=wait-health.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wait-health.js","sourceRoot":"","sources":["../../src/cli/wait-health.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,SAAiB;IACjE,MAAM,GAAG,GAAG,oBAAoB,IAAI,SAAS,CAAC;IAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IACxC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,eAAe,EAAE,CAAC;YACnC,MAAM,CAAC,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;YAC/C,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YACtD,YAAY,CAAC,CAAC,CAAC,CAAC;YAChB,IAAI,GAAG,CAAC,EAAE;gBAAE,OAAO,IAAI,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,eAAe;QACjB,CAAC;QACD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
export interface Config {
|
|
2
|
+
port: number;
|
|
3
|
+
dataDir: string;
|
|
4
|
+
/** FEAT-406: HTTP bind + the derived auth boundary for /health + /version.
|
|
5
|
+
* Default host is loopback-only — changing it is a deliberate opt-in, not
|
|
6
|
+
* a two-flag combination that can drift out of sync (see
|
|
7
|
+
* `isLoopbackHost` in server/lib/network.ts, the single predicate that
|
|
8
|
+
* decides both bind exposure and whether /health + /version require a
|
|
9
|
+
* Bearer token). */
|
|
10
|
+
network: {
|
|
11
|
+
host: string;
|
|
12
|
+
};
|
|
13
|
+
llm: {
|
|
14
|
+
compaction: {
|
|
15
|
+
provider: 'ollama' | 'azure-openai';
|
|
16
|
+
model: string;
|
|
17
|
+
};
|
|
18
|
+
extraction: {
|
|
19
|
+
provider: 'ollama' | 'azure-openai';
|
|
20
|
+
model: string;
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
embedding: {
|
|
24
|
+
provider: 'ollama' | 'azure-openai';
|
|
25
|
+
model: string;
|
|
26
|
+
/** FEAT-409: parameterized — single source of truth is
|
|
27
|
+
* DEFAULT_EMBED_DIM (src/contracts/embed.ts). Changing this for a
|
|
28
|
+
* fresh DB is a plain config edit; changing it against an existing DB
|
|
29
|
+
* with live data requires `astramem-local reembed-dim`
|
|
30
|
+
* (docs/embed-dim-migration.md). */
|
|
31
|
+
dim: number;
|
|
32
|
+
};
|
|
33
|
+
vector: {
|
|
34
|
+
store: 'sqlite-vec' | 'lancedb';
|
|
35
|
+
};
|
|
36
|
+
budget: {
|
|
37
|
+
daily_usd: number;
|
|
38
|
+
};
|
|
39
|
+
ollama: {
|
|
40
|
+
baseUrl: string;
|
|
41
|
+
};
|
|
42
|
+
azure: {
|
|
43
|
+
endpoint?: string;
|
|
44
|
+
deployment?: string;
|
|
45
|
+
apiVersion: string;
|
|
46
|
+
};
|
|
47
|
+
/** Fusion weights — α bm25, β cosine, γ importance, δ freshness,
|
|
48
|
+
* ε usefulness (ADR-010 v1.x: recall_used/memory_corrected events feed
|
|
49
|
+
* ranking; atoms with no signal score a neutral 0.5, so ε never reshuffles
|
|
50
|
+
* an unsignaled corpus), ζ entity-relevance bonus (FEAT-402 AC-6: DEFAULT
|
|
51
|
+
* 0 = OFF; a candidate entity-linked to an entity mentioned in the query
|
|
52
|
+
* text gets +ζ. At zeta=0 ranking is byte-identical to no-entity ranking —
|
|
53
|
+
* see the AC-6 snapshot test in tests/eval/retrieval-eval.test.ts). */
|
|
54
|
+
search: {
|
|
55
|
+
alpha: number;
|
|
56
|
+
beta: number;
|
|
57
|
+
gamma: number;
|
|
58
|
+
delta: number;
|
|
59
|
+
epsilon: number;
|
|
60
|
+
zeta: number;
|
|
61
|
+
};
|
|
62
|
+
recallPack: {
|
|
63
|
+
enabled: boolean;
|
|
64
|
+
budgetTokens: number;
|
|
65
|
+
/** Injection-policy v1 (ADR-005 when-to-recall, Wave 4d). */
|
|
66
|
+
policy: {
|
|
67
|
+
enabled: boolean;
|
|
68
|
+
/** Minimum selection score a memory needs to be injected. */
|
|
69
|
+
minScore: number;
|
|
70
|
+
/** Prompts shorter than this get no injection (unless they reference memory). */
|
|
71
|
+
minPromptChars: number;
|
|
72
|
+
};
|
|
73
|
+
};
|
|
74
|
+
/** One-way log shipping to the cloud ledger (ADR-003). Off by default;
|
|
75
|
+
* requires url + workspaceId + a device token in the keystore
|
|
76
|
+
* (or ASTRA_SYNC_TOKEN). personal-scoped atoms never ship (ADR-009). */
|
|
77
|
+
sync: {
|
|
78
|
+
enabled: boolean;
|
|
79
|
+
url: string;
|
|
80
|
+
workspaceId: string | null;
|
|
81
|
+
batchSize: number;
|
|
82
|
+
intervalMs: number;
|
|
83
|
+
};
|
|
84
|
+
security: {
|
|
85
|
+
redaction: {
|
|
86
|
+
enabled: boolean;
|
|
87
|
+
/** Shannon-entropy threshold in bits/char for the fallback secret detector. */
|
|
88
|
+
entropyThreshold: number;
|
|
89
|
+
/** Org-specific regex sources applied as detector type 'custom'. */
|
|
90
|
+
customPatterns: string[];
|
|
91
|
+
};
|
|
92
|
+
/** Encryption at rest (SEC-1/2/7/9). Disabling is a deliberate trust
|
|
93
|
+
* trade-off — the daemon logs a prominent WARN at startup (AC-6). */
|
|
94
|
+
encryption: {
|
|
95
|
+
enabled: boolean;
|
|
96
|
+
};
|
|
97
|
+
};
|
|
98
|
+
/** Repo/project tag-hygiene backfill (FEAT-403, W4.3). */
|
|
99
|
+
tagHygiene: {
|
|
100
|
+
/** Tier-2 prompt-assisted inference is opt-in — a data-mutating heuristic
|
|
101
|
+
* pass over legacy rows carries real mis-tag risk (PM pre-mortem), so it
|
|
102
|
+
* never runs silently. Enable via config or the CLI's `--tier2` flag. */
|
|
103
|
+
tier2Enabled: boolean;
|
|
104
|
+
/** Minimum tier-2 confidence required to apply an inferred tag; below
|
|
105
|
+
* this the memory is left untagged rather than risk a mis-tag (AC-4). */
|
|
106
|
+
tier2ConfidenceThreshold: number;
|
|
107
|
+
};
|
|
108
|
+
/** Memory TTL / archival tiers (FEAT-404, W4.4). Both conditions are
|
|
109
|
+
* required to archive an atom: older than ageThresholdDays AND its
|
|
110
|
+
* trailing-7-day usefulness rate at/below usefulnessFloor. Off by default
|
|
111
|
+
* — the PM pre-mortem risk is silently archiving a rarely-used-but-
|
|
112
|
+
* critical memory, so enabling is a deliberate opt-in. Runs on the
|
|
113
|
+
* cleanup job's cadence (src/pipeline/handlers/cleanup.ts). */
|
|
114
|
+
archival: {
|
|
115
|
+
enabled: boolean;
|
|
116
|
+
/** Age is measured from created_at (how old the atom itself is), not
|
|
117
|
+
* valid_from (which supersede() can advance). Default 183 days (~6
|
|
118
|
+
* months), per the FEAT-404 AC-6 proposal. */
|
|
119
|
+
ageThresholdDays: number;
|
|
120
|
+
/** rate_7d <= this floor makes an atom archival-eligible (combined
|
|
121
|
+
* with the age check). Default 0.0 — no explicit recall_used signal
|
|
122
|
+
* in the trailing 7 days. */
|
|
123
|
+
usefulnessFloor: number;
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
export declare function defaultConfig(): Config;
|
|
127
|
+
export declare function loadConfig(overrides: Partial<Config> | undefined): Config;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { defaultDataDir } from './datadir.js';
|
|
2
|
+
import { DEFAULT_EMBED_DIM } from '../contracts/embed.js';
|
|
3
|
+
export function defaultConfig() {
|
|
4
|
+
return {
|
|
5
|
+
port: 7777,
|
|
6
|
+
dataDir: defaultDataDir(),
|
|
7
|
+
network: { host: '127.0.0.1' },
|
|
8
|
+
llm: {
|
|
9
|
+
compaction: { provider: 'ollama', model: 'qwen2.5-coder:7b' },
|
|
10
|
+
extraction: { provider: 'ollama', model: 'qwen2.5-coder:7b' }
|
|
11
|
+
},
|
|
12
|
+
embedding: { provider: 'ollama', model: 'mxbai-embed-large', dim: DEFAULT_EMBED_DIM },
|
|
13
|
+
vector: { store: 'sqlite-vec' },
|
|
14
|
+
budget: { daily_usd: 10 },
|
|
15
|
+
ollama: { baseUrl: 'http://127.0.0.1:11434' },
|
|
16
|
+
azure: { apiVersion: '2024-10-21' },
|
|
17
|
+
search: { alpha: 0.4, beta: 0.4, gamma: 0.1, delta: 0.1, epsilon: 0.1, zeta: 0 },
|
|
18
|
+
recallPack: {
|
|
19
|
+
enabled: false,
|
|
20
|
+
budgetTokens: 1500,
|
|
21
|
+
policy: { enabled: true, minScore: 0.15, minPromptChars: 12 },
|
|
22
|
+
},
|
|
23
|
+
sync: { enabled: false, url: '', workspaceId: null, batchSize: 200, intervalMs: 30_000 },
|
|
24
|
+
security: {
|
|
25
|
+
redaction: { enabled: true, entropyThreshold: 4.0, customPatterns: [] },
|
|
26
|
+
encryption: { enabled: true }
|
|
27
|
+
},
|
|
28
|
+
tagHygiene: { tier2Enabled: false, tier2ConfidenceThreshold: 0.7 },
|
|
29
|
+
archival: { enabled: false, ageThresholdDays: 183, usefulnessFloor: 0.0 }
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export function loadConfig(overrides) {
|
|
33
|
+
const base = defaultConfig();
|
|
34
|
+
if (!overrides)
|
|
35
|
+
return base;
|
|
36
|
+
return { ...base, ...overrides };
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAuG1D,MAAM,UAAU,aAAa;IAC3B,OAAO;QACL,IAAI,EAAE,IAAI;QACV,OAAO,EAAE,cAAc,EAAE;QACzB,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;QAC9B,GAAG,EAAE;YACH,UAAU,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,kBAAkB,EAAE;YAC7D,UAAU,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,kBAAkB,EAAE;SAC9D;QACD,SAAS,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,mBAAmB,EAAE,GAAG,EAAE,iBAAiB,EAAE;QACrF,MAAM,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE;QAC/B,MAAM,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;QACzB,MAAM,EAAE,EAAE,OAAO,EAAE,wBAAwB,EAAE;QAC7C,KAAK,EAAE,EAAE,UAAU,EAAE,YAAY,EAAE;QACnC,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE;QAChF,UAAU,EAAE;YACV,OAAO,EAAE,KAAK;YACd,YAAY,EAAE,IAAI;YAClB,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE;SAC9D;QACD,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE;QACxF,QAAQ,EAAE;YACR,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,GAAG,EAAE,cAAc,EAAE,EAAE,EAAE;YACvE,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;SAC9B;QACD,UAAU,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,wBAAwB,EAAE,GAAG,EAAE;QAClE,QAAQ,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE;KAC1E,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,SAAsC;IAC/D,MAAM,IAAI,GAAG,aAAa,EAAE,CAAC;IAC7B,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAC5B,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,SAAS,EAAE,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns the canonical data directory for astramemory-local.
|
|
3
|
+
*
|
|
4
|
+
* Windows: %LOCALAPPDATA%\Astramem (matches plugin convention; was AstraMemory in <=0.2.2)
|
|
5
|
+
* macOS : ~/Library/Application Support/astra-memory
|
|
6
|
+
* Linux : $XDG_DATA_HOME/astra-memory (default ~/.local/share/astra-memory)
|
|
7
|
+
*/
|
|
8
|
+
export declare function defaultDataDir(): string;
|
|
9
|
+
/**
|
|
10
|
+
* Returns the canonical config directory for astramemory-local.
|
|
11
|
+
*
|
|
12
|
+
* Windows: %APPDATA%\Astramem (matches plugin convention; was AstraMemory in <=0.2.2)
|
|
13
|
+
* macOS : ~/Library/Application Support/astra-memory
|
|
14
|
+
* Linux : $XDG_CONFIG_HOME/astra-memory (default ~/.config/astra-memory)
|
|
15
|
+
*/
|
|
16
|
+
export declare function defaultConfigDir(): string;
|
|
17
|
+
/**
|
|
18
|
+
* Returns the LEGACY config directory used by daemon <=0.2.2 on Windows.
|
|
19
|
+
* Non-Windows returns the same value as defaultConfigDir() (no legacy split).
|
|
20
|
+
*
|
|
21
|
+
* Used exclusively by migration and fallback bearer-reader code.
|
|
22
|
+
*/
|
|
23
|
+
export declare function legacyConfigDir(): string;
|
|
24
|
+
/**
|
|
25
|
+
* Returns the LEGACY data directory used by daemon <=0.2.2 on Windows.
|
|
26
|
+
* Non-Windows returns the same value as defaultDataDir() (no legacy split).
|
|
27
|
+
*
|
|
28
|
+
* Used exclusively by migration and fallback bearer-reader code.
|
|
29
|
+
*/
|
|
30
|
+
export declare function legacyDataDir(): string;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { homedir, platform } from 'node:os';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
/**
|
|
4
|
+
* Returns the canonical data directory for astramemory-local.
|
|
5
|
+
*
|
|
6
|
+
* Windows: %LOCALAPPDATA%\Astramem (matches plugin convention; was AstraMemory in <=0.2.2)
|
|
7
|
+
* macOS : ~/Library/Application Support/astra-memory
|
|
8
|
+
* Linux : $XDG_DATA_HOME/astra-memory (default ~/.local/share/astra-memory)
|
|
9
|
+
*/
|
|
10
|
+
export function defaultDataDir() {
|
|
11
|
+
const home = homedir();
|
|
12
|
+
switch (platform()) {
|
|
13
|
+
case 'win32':
|
|
14
|
+
return join(process.env.LOCALAPPDATA ?? join(home, 'AppData', 'Local'), 'Astramem');
|
|
15
|
+
case 'darwin':
|
|
16
|
+
return join(home, 'Library', 'Application Support', 'astra-memory');
|
|
17
|
+
default:
|
|
18
|
+
return join(process.env.XDG_DATA_HOME ?? join(home, '.local', 'share'), 'astra-memory');
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Returns the canonical config directory for astramemory-local.
|
|
23
|
+
*
|
|
24
|
+
* Windows: %APPDATA%\Astramem (matches plugin convention; was AstraMemory in <=0.2.2)
|
|
25
|
+
* macOS : ~/Library/Application Support/astra-memory
|
|
26
|
+
* Linux : $XDG_CONFIG_HOME/astra-memory (default ~/.config/astra-memory)
|
|
27
|
+
*/
|
|
28
|
+
export function defaultConfigDir() {
|
|
29
|
+
const home = homedir();
|
|
30
|
+
switch (platform()) {
|
|
31
|
+
case 'win32':
|
|
32
|
+
return join(process.env.APPDATA ?? join(home, 'AppData', 'Roaming'), 'Astramem');
|
|
33
|
+
case 'darwin':
|
|
34
|
+
return join(home, 'Library', 'Application Support', 'astra-memory');
|
|
35
|
+
default:
|
|
36
|
+
return join(process.env.XDG_CONFIG_HOME ?? join(home, '.config'), 'astra-memory');
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Returns the LEGACY config directory used by daemon <=0.2.2 on Windows.
|
|
41
|
+
* Non-Windows returns the same value as defaultConfigDir() (no legacy split).
|
|
42
|
+
*
|
|
43
|
+
* Used exclusively by migration and fallback bearer-reader code.
|
|
44
|
+
*/
|
|
45
|
+
export function legacyConfigDir() {
|
|
46
|
+
const home = homedir();
|
|
47
|
+
if (platform() === 'win32') {
|
|
48
|
+
return join(process.env.APPDATA ?? join(home, 'AppData', 'Roaming'), 'AstraMemory');
|
|
49
|
+
}
|
|
50
|
+
return defaultConfigDir();
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Returns the LEGACY data directory used by daemon <=0.2.2 on Windows.
|
|
54
|
+
* Non-Windows returns the same value as defaultDataDir() (no legacy split).
|
|
55
|
+
*
|
|
56
|
+
* Used exclusively by migration and fallback bearer-reader code.
|
|
57
|
+
*/
|
|
58
|
+
export function legacyDataDir() {
|
|
59
|
+
const home = homedir();
|
|
60
|
+
if (platform() === 'win32') {
|
|
61
|
+
return join(process.env.LOCALAPPDATA ?? join(home, 'AppData', 'Local'), 'AstraMemory');
|
|
62
|
+
}
|
|
63
|
+
return defaultDataDir();
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=datadir.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"datadir.js","sourceRoot":"","sources":["../../src/config/datadir.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC;;;;;;GAMG;AACH,MAAM,UAAU,cAAc;IAC5B,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,QAAQ,QAAQ,EAAE,EAAE,CAAC;QACnB,KAAK,OAAO;YACV,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,UAAU,CAAC,CAAC;QACtF,KAAK,QAAQ;YACX,OAAO,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,qBAAqB,EAAE,cAAc,CAAC,CAAC;QACtE;YACE,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,cAAc,CAAC,CAAC;IAC5F,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,QAAQ,QAAQ,EAAE,EAAE,CAAC;QACnB,KAAK,OAAO;YACV,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,UAAU,CAAC,CAAC;QACnF,KAAK,QAAQ;YACX,OAAO,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,qBAAqB,EAAE,cAAc,CAAC,CAAC;QACtE;YACE,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,cAAc,CAAC,CAAC;IACtF,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,IAAI,QAAQ,EAAE,KAAK,OAAO,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,aAAa,CAAC,CAAC;IACtF,CAAC;IACD,OAAO,gBAAgB,EAAE,CAAC;AAC5B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,IAAI,QAAQ,EAAE,KAAK,OAAO,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,aAAa,CAAC,CAAC;IACzF,CAAC;IACD,OAAO,cAAc,EAAE,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* loadConfigFromDisk — read <configDir>/config.yaml (written by `init` /
|
|
3
|
+
* writer.ts) and merge it over defaultConfig(). Until now the file was
|
|
4
|
+
* write-only: init produced it but the daemon booted from defaults, so user
|
|
5
|
+
* edits were silently ignored.
|
|
6
|
+
*
|
|
7
|
+
* The parser handles exactly the subset writer.ts emits — nested maps of
|
|
8
|
+
* scalars (string/number/boolean, single-quoted strings), '#' comments,
|
|
9
|
+
* blank lines. No lists, no multi-line strings, no anchors; if the file
|
|
10
|
+
* grows past that, swap in a real YAML package (see writer.ts header).
|
|
11
|
+
* Unknown keys are ignored; a malformed file logs a warning and falls back
|
|
12
|
+
* to defaults rather than blocking daemon boot.
|
|
13
|
+
*/
|
|
14
|
+
import { type Config } from './config.js';
|
|
15
|
+
type PlainObject = Record<string, unknown>;
|
|
16
|
+
/** Parse the writer.ts YAML subset into a nested plain object. */
|
|
17
|
+
export declare function parseConfigYaml(text: string): PlainObject;
|
|
18
|
+
/**
|
|
19
|
+
* defaultConfig() with config.yaml (if present and well-formed) merged over
|
|
20
|
+
* it. Never throws — daemon boot must not be blocked by a bad config file.
|
|
21
|
+
*/
|
|
22
|
+
export declare function loadConfigFromDisk(configDir: string): Config;
|
|
23
|
+
export {};
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* loadConfigFromDisk — read <configDir>/config.yaml (written by `init` /
|
|
3
|
+
* writer.ts) and merge it over defaultConfig(). Until now the file was
|
|
4
|
+
* write-only: init produced it but the daemon booted from defaults, so user
|
|
5
|
+
* edits were silently ignored.
|
|
6
|
+
*
|
|
7
|
+
* The parser handles exactly the subset writer.ts emits — nested maps of
|
|
8
|
+
* scalars (string/number/boolean, single-quoted strings), '#' comments,
|
|
9
|
+
* blank lines. No lists, no multi-line strings, no anchors; if the file
|
|
10
|
+
* grows past that, swap in a real YAML package (see writer.ts header).
|
|
11
|
+
* Unknown keys are ignored; a malformed file logs a warning and falls back
|
|
12
|
+
* to defaults rather than blocking daemon boot.
|
|
13
|
+
*/
|
|
14
|
+
import { readFileSync } from 'node:fs';
|
|
15
|
+
import { join } from 'node:path';
|
|
16
|
+
import { defaultConfig } from './config.js';
|
|
17
|
+
function parseScalar(raw) {
|
|
18
|
+
const v = raw.trim();
|
|
19
|
+
if (v === '')
|
|
20
|
+
return undefined;
|
|
21
|
+
if (v.startsWith("'") && v.endsWith("'"))
|
|
22
|
+
return v.slice(1, -1).replace(/''/g, "'");
|
|
23
|
+
if (v === 'true')
|
|
24
|
+
return true;
|
|
25
|
+
if (v === 'false')
|
|
26
|
+
return false;
|
|
27
|
+
if (v === 'null' || v === '~')
|
|
28
|
+
return null;
|
|
29
|
+
if (/^-?\d+(\.\d+)?$/.test(v))
|
|
30
|
+
return Number(v);
|
|
31
|
+
return v;
|
|
32
|
+
}
|
|
33
|
+
/** Parse the writer.ts YAML subset into a nested plain object. */
|
|
34
|
+
export function parseConfigYaml(text) {
|
|
35
|
+
const root = {};
|
|
36
|
+
// Stack of (indent level → object) for nesting; root is indent -1.
|
|
37
|
+
const stack = [{ indent: -1, obj: root }];
|
|
38
|
+
for (const rawLine of text.split('\n')) {
|
|
39
|
+
const withoutComment = rawLine.replace(/(^|\s)#.*$/, '');
|
|
40
|
+
if (!withoutComment.trim())
|
|
41
|
+
continue;
|
|
42
|
+
const indent = withoutComment.length - withoutComment.trimStart().length;
|
|
43
|
+
const line = withoutComment.trim();
|
|
44
|
+
const colon = line.indexOf(':');
|
|
45
|
+
if (colon <= 0)
|
|
46
|
+
continue; // not a key line — ignore rather than throw
|
|
47
|
+
const key = line.slice(0, colon).trim();
|
|
48
|
+
const rest = line.slice(colon + 1);
|
|
49
|
+
while (stack.length > 1 && indent <= stack[stack.length - 1].indent) {
|
|
50
|
+
stack.pop();
|
|
51
|
+
}
|
|
52
|
+
const parent = stack[stack.length - 1].obj;
|
|
53
|
+
if (rest.trim() === '') {
|
|
54
|
+
const child = {};
|
|
55
|
+
parent[key] = child;
|
|
56
|
+
stack.push({ indent, obj: child });
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
const value = parseScalar(rest);
|
|
60
|
+
if (value !== undefined)
|
|
61
|
+
parent[key] = value;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return root;
|
|
65
|
+
}
|
|
66
|
+
/** Deep-merge `overrides` into `base`, only following keys base already has structure for. */
|
|
67
|
+
function deepMerge(base, overrides) {
|
|
68
|
+
const out = { ...base };
|
|
69
|
+
for (const [key, value] of Object.entries(overrides)) {
|
|
70
|
+
const existing = out[key];
|
|
71
|
+
if (value !== null && typeof value === 'object' && !Array.isArray(value) &&
|
|
72
|
+
existing !== null && typeof existing === 'object' && !Array.isArray(existing)) {
|
|
73
|
+
out[key] = deepMerge(existing, value);
|
|
74
|
+
}
|
|
75
|
+
else if (value !== undefined) {
|
|
76
|
+
out[key] = value;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return out;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* defaultConfig() with config.yaml (if present and well-formed) merged over
|
|
83
|
+
* it. Never throws — daemon boot must not be blocked by a bad config file.
|
|
84
|
+
*/
|
|
85
|
+
export function loadConfigFromDisk(configDir) {
|
|
86
|
+
const base = defaultConfig();
|
|
87
|
+
let text;
|
|
88
|
+
try {
|
|
89
|
+
text = readFileSync(join(configDir, 'config.yaml'), 'utf8');
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return base; // no file — defaults
|
|
93
|
+
}
|
|
94
|
+
try {
|
|
95
|
+
return deepMerge(base, parseConfigYaml(text));
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
console.warn(`[astramem-local] WARNING: config.yaml could not be parsed (${String(err)}) — using defaults.`);
|
|
99
|
+
return base;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* migrate-dirs.ts
|
|
3
|
+
*
|
|
4
|
+
* One-shot, idempotent migration for daemon installs upgrading from <=0.2.2.
|
|
5
|
+
*
|
|
6
|
+
* Background: daemon <=0.2.2 used `%APPDATA%\AstraMemory` (config) and
|
|
7
|
+
* `%LOCALAPPDATA%\AstraMemory` (data) on Windows. The plugin has always used
|
|
8
|
+
* `%APPDATA%\Astramem`. This divergence caused a bearer mismatch (401 on every
|
|
9
|
+
* ingest) because each product's `init` wizard writes its own `secrets.env`
|
|
10
|
+
* to its own directory.
|
|
11
|
+
*
|
|
12
|
+
* Fix: daemon now uses `Astramem` as the canonical dir name (matching the
|
|
13
|
+
* plugin). This module renames the legacy dirs to canonical on first boot
|
|
14
|
+
* after the upgrade. It is safe to call on every boot.
|
|
15
|
+
*
|
|
16
|
+
* Windows-only. On macOS/Linux the legacy and canonical paths are identical
|
|
17
|
+
* (no migration needed) and this function returns immediately.
|
|
18
|
+
*/
|
|
19
|
+
export interface MigrationResult {
|
|
20
|
+
configMigrated: boolean;
|
|
21
|
+
dataMigrated: boolean;
|
|
22
|
+
warnings: string[];
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Migrate legacy Windows config/data dirs to canonical names if needed.
|
|
26
|
+
*
|
|
27
|
+
* Rules for each dir pair (legacy → canonical):
|
|
28
|
+
* - canonical exists → no-op (already migrated or user did fresh init)
|
|
29
|
+
* - only legacy exists → rename legacy to canonical (log migration)
|
|
30
|
+
* - both exist → no-op, emit warning (user must reconcile manually)
|
|
31
|
+
* - neither exists → no-op (fresh install, nothing to migrate)
|
|
32
|
+
*
|
|
33
|
+
* IMPORTANT: never overwrites canonical if it already contains data. This
|
|
34
|
+
* preserves any bearer the user wrote via `astramem-local init` after upgrading.
|
|
35
|
+
*/
|
|
36
|
+
export declare function migrateLegacyDirsIfPresent(): MigrationResult;
|