@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,132 @@
|
|
|
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
|
+
import { existsSync, renameSync, copyFileSync } from 'node:fs';
|
|
20
|
+
import { join } from 'node:path';
|
|
21
|
+
import { platform } from 'node:os';
|
|
22
|
+
import { defaultConfigDir, defaultDataDir, legacyConfigDir, legacyDataDir } from './datadir.js';
|
|
23
|
+
/**
|
|
24
|
+
* Migrate legacy Windows config/data dirs to canonical names if needed.
|
|
25
|
+
*
|
|
26
|
+
* Rules for each dir pair (legacy → canonical):
|
|
27
|
+
* - canonical exists → no-op (already migrated or user did fresh init)
|
|
28
|
+
* - only legacy exists → rename legacy to canonical (log migration)
|
|
29
|
+
* - both exist → no-op, emit warning (user must reconcile manually)
|
|
30
|
+
* - neither exists → no-op (fresh install, nothing to migrate)
|
|
31
|
+
*
|
|
32
|
+
* IMPORTANT: never overwrites canonical if it already contains data. This
|
|
33
|
+
* preserves any bearer the user wrote via `astramem-local init` after upgrading.
|
|
34
|
+
*/
|
|
35
|
+
export function migrateLegacyDirsIfPresent() {
|
|
36
|
+
const result = {
|
|
37
|
+
configMigrated: false,
|
|
38
|
+
dataMigrated: false,
|
|
39
|
+
warnings: [],
|
|
40
|
+
};
|
|
41
|
+
// Non-Windows: legacy and canonical paths are identical — nothing to do.
|
|
42
|
+
if (platform() !== 'win32') {
|
|
43
|
+
return result;
|
|
44
|
+
}
|
|
45
|
+
const pairs = [
|
|
46
|
+
{
|
|
47
|
+
label: 'config',
|
|
48
|
+
legacy: legacyConfigDir(),
|
|
49
|
+
canonical: defaultConfigDir(),
|
|
50
|
+
migratedKey: 'configMigrated',
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
label: 'data',
|
|
54
|
+
legacy: legacyDataDir(),
|
|
55
|
+
canonical: defaultDataDir(),
|
|
56
|
+
migratedKey: 'dataMigrated',
|
|
57
|
+
},
|
|
58
|
+
];
|
|
59
|
+
for (const { label, legacy, canonical, migratedKey } of pairs) {
|
|
60
|
+
const legacyExists = existsSync(legacy);
|
|
61
|
+
const canonicalExists = existsSync(canonical);
|
|
62
|
+
if (!legacyExists) {
|
|
63
|
+
// Fresh install or already migrated (canonical may or may not exist). No-op.
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
if (canonicalExists) {
|
|
67
|
+
// Both exist. Reconcile per-file: copy (never move, never overwrite)
|
|
68
|
+
// any file the canonical dir LACKS that the legacy dir has. This
|
|
69
|
+
// rescues the stranded-data case — e.g. a fresh canonical dir created
|
|
70
|
+
// next to a legacy dir that still holds the real memory.sqlite —
|
|
71
|
+
// while never clobbering a valid canonical bearer or database.
|
|
72
|
+
const candidates = label === 'config'
|
|
73
|
+
? ['secrets.env', 'config.yaml']
|
|
74
|
+
: ['memory.sqlite', 'memory.sqlite-wal', 'memory.sqlite-shm'];
|
|
75
|
+
// Data pair: the DB and its WAL/SHM are one consistency unit — only
|
|
76
|
+
// copy when the canonical dir has NONE of them (a mismatched WAL
|
|
77
|
+
// corrupts the database). Config pair: copy per-file.
|
|
78
|
+
let copyable;
|
|
79
|
+
if (label === 'data') {
|
|
80
|
+
const canonicalHasAny = candidates.some(f => existsSync(join(canonical, f)));
|
|
81
|
+
copyable = canonicalHasAny ? [] : candidates.filter(f => existsSync(join(legacy, f)));
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
copyable = candidates.filter(f => existsSync(join(legacy, f)) && !existsSync(join(canonical, f)));
|
|
85
|
+
}
|
|
86
|
+
let copied = 0;
|
|
87
|
+
for (const f of copyable) {
|
|
88
|
+
try {
|
|
89
|
+
// tmp + rename so a crash mid-copy never leaves a torn file at the
|
|
90
|
+
// canonical path (same pattern as migrate-encrypt.ts).
|
|
91
|
+
const tmp = join(canonical, `${f}.migrating-tmp`);
|
|
92
|
+
copyFileSync(join(legacy, f), tmp);
|
|
93
|
+
renameSync(tmp, join(canonical, f));
|
|
94
|
+
copied++;
|
|
95
|
+
console.log(`[astramem-local] reconciled ${label} file from legacy dir: ${f}`);
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
result.warnings.push(`Failed to copy legacy ${label} file "${f}": ${err}`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (copied > 0)
|
|
102
|
+
result[migratedKey] = true;
|
|
103
|
+
const bothHaveDb = label === 'data' &&
|
|
104
|
+
existsSync(join(legacy, 'memory.sqlite')) &&
|
|
105
|
+
existsSync(join(canonical, 'memory.sqlite'));
|
|
106
|
+
const warning = bothHaveDb
|
|
107
|
+
? `Two ${label} dirs BOTH contain memory.sqlite: "${legacy}" and "${canonical}". ` +
|
|
108
|
+
`Using canonical — verify it holds your real data (run 'astramem-local doctor'); ` +
|
|
109
|
+
`the legacy copy was left untouched.`
|
|
110
|
+
: `Two ${label} dirs detected: "${legacy}" and "${canonical}". Using canonical` +
|
|
111
|
+
(copied > 0 ? ` (${copied} missing file(s) copied from legacy).` : '.') +
|
|
112
|
+
` Legacy dir left untouched; delete manually after verifying.`;
|
|
113
|
+
result.warnings.push(warning);
|
|
114
|
+
console.warn(`[astramem-local] WARN: ${warning}`);
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
// Only legacy exists → rename to canonical.
|
|
118
|
+
try {
|
|
119
|
+
renameSync(legacy, canonical);
|
|
120
|
+
result[migratedKey] = true;
|
|
121
|
+
console.log(`[astramem-local] migrated legacy ${label} dir: "${legacy}" → "${canonical}"`);
|
|
122
|
+
}
|
|
123
|
+
catch (err) {
|
|
124
|
+
const warning = `Failed to migrate legacy ${label} dir from "${legacy}" to "${canonical}": ${err}. ` +
|
|
125
|
+
`Manual rename required to restore bearer compatibility with the plugin.`;
|
|
126
|
+
result.warnings.push(warning);
|
|
127
|
+
console.warn(`[astramem-local] WARN: ${warning}`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return result;
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=migrate-dirs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate-dirs.js","sourceRoot":"","sources":["../../src/config/migrate-dirs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAQhG;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,0BAA0B;IACxC,MAAM,MAAM,GAAoB;QAC9B,cAAc,EAAE,KAAK;QACrB,YAAY,EAAE,KAAK;QACnB,QAAQ,EAAE,EAAE;KACb,CAAC;IAEF,yEAAyE;IACzE,IAAI,QAAQ,EAAE,KAAK,OAAO,EAAE,CAAC;QAC3B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,KAAK,GAKN;QACH;YACE,KAAK,EAAE,QAAQ;YACf,MAAM,EAAE,eAAe,EAAE;YACzB,SAAS,EAAE,gBAAgB,EAAE;YAC7B,WAAW,EAAE,gBAAgB;SAC9B;QACD;YACE,KAAK,EAAE,MAAM;YACb,MAAM,EAAE,aAAa,EAAE;YACvB,SAAS,EAAE,cAAc,EAAE;YAC3B,WAAW,EAAE,cAAc;SAC5B;KACF,CAAC;IAEF,KAAK,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,KAAK,EAAE,CAAC;QAC9D,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QACxC,MAAM,eAAe,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;QAE9C,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,6EAA6E;YAC7E,SAAS;QACX,CAAC;QAED,IAAI,eAAe,EAAE,CAAC;YACpB,qEAAqE;YACrE,iEAAiE;YACjE,sEAAsE;YACtE,iEAAiE;YACjE,+DAA+D;YAC/D,MAAM,UAAU,GACd,KAAK,KAAK,QAAQ;gBAChB,CAAC,CAAC,CAAC,aAAa,EAAE,aAAa,CAAC;gBAChC,CAAC,CAAC,CAAC,eAAe,EAAE,mBAAmB,EAAE,mBAAmB,CAAC,CAAC;YAClE,oEAAoE;YACpE,iEAAiE;YACjE,sDAAsD;YACtD,IAAI,QAAkB,CAAC;YACvB,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;gBACrB,MAAM,eAAe,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7E,QAAQ,GAAG,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACxF,CAAC;iBAAM,CAAC;gBACN,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACpG,CAAC;YACD,IAAI,MAAM,GAAG,CAAC,CAAC;YACf,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACzB,IAAI,CAAC;oBACH,mEAAmE;oBACnE,uDAAuD;oBACvD,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;oBAClD,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;oBACnC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;oBACpC,MAAM,EAAE,CAAC;oBACT,OAAO,CAAC,GAAG,CAAC,+BAA+B,KAAK,0BAA0B,CAAC,EAAE,CAAC,CAAC;gBACjF,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,yBAAyB,KAAK,UAAU,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;gBAC7E,CAAC;YACH,CAAC;YACD,IAAI,MAAM,GAAG,CAAC;gBAAE,MAAM,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC;YAE3C,MAAM,UAAU,GACd,KAAK,KAAK,MAAM;gBAChB,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;gBACzC,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC;YAC/C,MAAM,OAAO,GAAG,UAAU;gBACxB,CAAC,CAAC,OAAO,KAAK,sCAAsC,MAAM,UAAU,SAAS,KAAK;oBAChF,kFAAkF;oBAClF,qCAAqC;gBACvC,CAAC,CAAC,OAAO,KAAK,oBAAoB,MAAM,UAAU,SAAS,oBAAoB;oBAC7E,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,MAAM,uCAAuC,CAAC,CAAC,CAAC,GAAG,CAAC;oBACvE,8DAA8D,CAAC;YACnE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,0BAA0B,OAAO,EAAE,CAAC,CAAC;YAClD,SAAS;QACX,CAAC;QAED,4CAA4C;QAC5C,IAAI,CAAC;YACH,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAC9B,MAAM,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC;YAC3B,OAAO,CAAC,GAAG,CACT,oCAAoC,KAAK,UAAU,MAAM,QAAQ,SAAS,GAAG,CAC9E,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GACX,4BAA4B,KAAK,cAAc,MAAM,SAAS,SAAS,MAAM,GAAG,IAAI;gBACpF,yEAAyE,CAAC;YAC5E,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,0BAA0B,OAAO,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-platform persistence of environment variables for the user's shell.
|
|
3
|
+
*
|
|
4
|
+
* Windows: SetEnvironmentVariable(key, value, "User") via spawned PowerShell.
|
|
5
|
+
* Equivalent to `setx KEY VAL` but doesn't truncate at 1024 chars.
|
|
6
|
+
*
|
|
7
|
+
* Linux/macOS: append/replace an idempotent block to the user's shell rc:
|
|
8
|
+
* - bash → ~/.bashrc
|
|
9
|
+
* - zsh → ~/.zshrc
|
|
10
|
+
* - fish → ~/.config/fish/config.fish
|
|
11
|
+
* Defaults to ~/.profile if shell can't be detected.
|
|
12
|
+
*
|
|
13
|
+
* The block is wrapped in begin/end markers so re-running init does not
|
|
14
|
+
* accumulate duplicate exports.
|
|
15
|
+
*/
|
|
16
|
+
export interface PersistResult {
|
|
17
|
+
ok: boolean;
|
|
18
|
+
target: string;
|
|
19
|
+
message: string;
|
|
20
|
+
/** True when the caller likely needs to open a new shell for envs to take effect. */
|
|
21
|
+
requiresNewShell: boolean;
|
|
22
|
+
}
|
|
23
|
+
export declare function persistEnvVars(vars: Record<string, string>): Promise<PersistResult>;
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-platform persistence of environment variables for the user's shell.
|
|
3
|
+
*
|
|
4
|
+
* Windows: SetEnvironmentVariable(key, value, "User") via spawned PowerShell.
|
|
5
|
+
* Equivalent to `setx KEY VAL` but doesn't truncate at 1024 chars.
|
|
6
|
+
*
|
|
7
|
+
* Linux/macOS: append/replace an idempotent block to the user's shell rc:
|
|
8
|
+
* - bash → ~/.bashrc
|
|
9
|
+
* - zsh → ~/.zshrc
|
|
10
|
+
* - fish → ~/.config/fish/config.fish
|
|
11
|
+
* Defaults to ~/.profile if shell can't be detected.
|
|
12
|
+
*
|
|
13
|
+
* The block is wrapped in begin/end markers so re-running init does not
|
|
14
|
+
* accumulate duplicate exports.
|
|
15
|
+
*/
|
|
16
|
+
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
17
|
+
import { join, dirname } from 'node:path';
|
|
18
|
+
import { homedir, platform } from 'node:os';
|
|
19
|
+
import { execSync } from 'node:child_process';
|
|
20
|
+
import { mkdirSync } from 'node:fs';
|
|
21
|
+
const MARKER_BEGIN = '# >>> astra-memory env >>>';
|
|
22
|
+
const MARKER_END = '# <<< astra-memory env <<<';
|
|
23
|
+
export async function persistEnvVars(vars) {
|
|
24
|
+
if (platform() === 'win32')
|
|
25
|
+
return persistWindows(vars);
|
|
26
|
+
return persistUnix(vars);
|
|
27
|
+
}
|
|
28
|
+
// ─── Windows ─────────────────────────────────────────────────────────────────
|
|
29
|
+
function persistWindows(vars) {
|
|
30
|
+
// Use [Environment]::SetEnvironmentVariable so values longer than 1024 chars
|
|
31
|
+
// are accepted (setx truncates).
|
|
32
|
+
//
|
|
33
|
+
// PowerShell quoting strategy: build the script with SINGLE-quoted string
|
|
34
|
+
// literals so embedded double-quotes do not collide with the outer
|
|
35
|
+
// `powershell -Command "..."` shell quoting. Single-quoted PS strings do
|
|
36
|
+
// not expand $vars or backticks — values pass through literally. Escape
|
|
37
|
+
// embedded single quotes by doubling them (PS rule).
|
|
38
|
+
const ps = Object.entries(vars)
|
|
39
|
+
.map(([k, v]) => {
|
|
40
|
+
const esc = v.replace(/'/g, "''");
|
|
41
|
+
return `[Environment]::SetEnvironmentVariable('${k}', '${esc}', 'User')`;
|
|
42
|
+
})
|
|
43
|
+
.join('; ');
|
|
44
|
+
try {
|
|
45
|
+
execSync(`powershell -NoProfile -Command "${ps}"`, { stdio: 'pipe', timeout: 10_000 });
|
|
46
|
+
return {
|
|
47
|
+
ok: true,
|
|
48
|
+
target: 'Windows User environment',
|
|
49
|
+
message: `Wrote ${Object.keys(vars).length} env var(s) to User scope`,
|
|
50
|
+
requiresNewShell: true,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
55
|
+
return {
|
|
56
|
+
ok: false,
|
|
57
|
+
target: 'Windows User environment',
|
|
58
|
+
message: `Failed: ${msg.slice(0, 200)}`,
|
|
59
|
+
requiresNewShell: false,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// ─── Unix (Linux + macOS) ────────────────────────────────────────────────────
|
|
64
|
+
function detectRcPath() {
|
|
65
|
+
const shell = process.env['SHELL'] ?? '';
|
|
66
|
+
const home = homedir();
|
|
67
|
+
if (shell.includes('zsh'))
|
|
68
|
+
return { path: join(home, '.zshrc'), shell: 'zsh' };
|
|
69
|
+
if (shell.includes('fish'))
|
|
70
|
+
return { path: join(home, '.config', 'fish', 'config.fish'), shell: 'fish' };
|
|
71
|
+
if (shell.includes('bash'))
|
|
72
|
+
return { path: join(home, '.bashrc'), shell: 'bash' };
|
|
73
|
+
return { path: join(home, '.profile'), shell: 'sh' };
|
|
74
|
+
}
|
|
75
|
+
function buildExportBlock(vars, shell) {
|
|
76
|
+
const lines = [MARKER_BEGIN];
|
|
77
|
+
for (const [k, v] of Object.entries(vars)) {
|
|
78
|
+
if (shell === 'fish') {
|
|
79
|
+
// single-quoted on fish too — fish doesn't expand inside single quotes
|
|
80
|
+
lines.push(`set -gx ${k} '${v.replace(/'/g, "'\\''")}'`);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
// POSIX shells — single-quote to avoid expansion of $ etc.
|
|
84
|
+
lines.push(`export ${k}='${v.replace(/'/g, "'\\''")}'`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
lines.push(MARKER_END);
|
|
88
|
+
return lines.join('\n');
|
|
89
|
+
}
|
|
90
|
+
function persistUnix(vars) {
|
|
91
|
+
const { path, shell } = detectRcPath();
|
|
92
|
+
try {
|
|
93
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
94
|
+
const existing = existsSync(path) ? readFileSync(path, 'utf8') : '';
|
|
95
|
+
const block = buildExportBlock(vars, shell);
|
|
96
|
+
// Replace if the markers exist; otherwise append.
|
|
97
|
+
const re = new RegExp(`${MARKER_BEGIN}[\\s\\S]*?${MARKER_END}`, 'm');
|
|
98
|
+
const next = re.test(existing)
|
|
99
|
+
? existing.replace(re, block)
|
|
100
|
+
: (existing.endsWith('\n') || existing === '' ? existing : existing + '\n') + '\n' + block + '\n';
|
|
101
|
+
writeFileSync(path, next, 'utf8');
|
|
102
|
+
return {
|
|
103
|
+
ok: true,
|
|
104
|
+
target: path,
|
|
105
|
+
message: `Wrote ${Object.keys(vars).length} env var(s) to ${shell} rc`,
|
|
106
|
+
requiresNewShell: true,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
111
|
+
return {
|
|
112
|
+
ok: false,
|
|
113
|
+
target: path,
|
|
114
|
+
message: `Failed: ${msg.slice(0, 200)}`,
|
|
115
|
+
requiresNewShell: false,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=persist-envs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persist-envs.js","sourceRoot":"","sources":["../../src/config/persist-envs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Config } from './config.js';
|
|
2
|
+
export type ValueSource = 'cli' | 'env' | 'config.yaml' | 'default';
|
|
3
|
+
export interface RuntimeConfig {
|
|
4
|
+
cfg: Config;
|
|
5
|
+
port: number;
|
|
6
|
+
dataDir: string;
|
|
7
|
+
configDir: string;
|
|
8
|
+
/** Where each resolved value came from — surfaced by `reinstall` so users
|
|
9
|
+
* can see WHY the daemon is using a given directory/port. */
|
|
10
|
+
sources: {
|
|
11
|
+
port: ValueSource;
|
|
12
|
+
dataDir: ValueSource;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export interface RuntimeOverrides {
|
|
16
|
+
port?: number;
|
|
17
|
+
dataDir?: string;
|
|
18
|
+
}
|
|
19
|
+
export declare function resolveRuntimeConfig(overrides?: RuntimeOverrides): RuntimeConfig;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* resolve-runtime.ts — single source of truth for runtime config resolution.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from serve.ts so that serve, doctor, backup, and reinstall all
|
|
5
|
+
* resolve port/dataDir from the SAME inputs with the SAME precedence:
|
|
6
|
+
*
|
|
7
|
+
* port : CLI flag > config.yaml > default
|
|
8
|
+
* dataDir: CLI flag > ASTRA_MEMORY_DATADIR env > config.yaml > default
|
|
9
|
+
*
|
|
10
|
+
* Historically doctor and backup used `defaultConfig()` (never reading
|
|
11
|
+
* config.yaml), so when config.yaml carried a non-default `dataDir` they
|
|
12
|
+
* probed/backed-up a DIFFERENT directory than the daemon was serving from —
|
|
13
|
+
* producing false "file is not a database" doctor failures and backups of
|
|
14
|
+
* the wrong database.
|
|
15
|
+
*/
|
|
16
|
+
import { loadConfigFromDisk } from './loader.js';
|
|
17
|
+
import { defaultConfigDir, defaultDataDir } from './datadir.js';
|
|
18
|
+
import { readSyncSettings } from './sync-settings.js';
|
|
19
|
+
import { migrateLegacyDirsIfPresent } from './migrate-dirs.js';
|
|
20
|
+
export function resolveRuntimeConfig(overrides = {}) {
|
|
21
|
+
// Legacy Windows dir rename (AstraMemory → Astramem) must run before any
|
|
22
|
+
// config read so the canonical config.yaml is the one we load. Idempotent.
|
|
23
|
+
migrateLegacyDirsIfPresent();
|
|
24
|
+
const configDir = defaultConfigDir();
|
|
25
|
+
const cfg = loadConfigFromDisk(configDir);
|
|
26
|
+
// `astramem-local pair` persists sync settings to sync.json — merge them
|
|
27
|
+
// over config.yaml so pairing survives restarts.
|
|
28
|
+
const pairedSync = readSyncSettings(configDir);
|
|
29
|
+
if (pairedSync) {
|
|
30
|
+
cfg.sync = { ...cfg.sync, enabled: pairedSync.enabled, url: pairedSync.url, workspaceId: pairedSync.workspaceId };
|
|
31
|
+
}
|
|
32
|
+
// ASTRA_MEMORY_PORT sits between the CLI flag and config.yaml — the
|
|
33
|
+
// systemd unit has always set it (it was a dead env until W1.4).
|
|
34
|
+
const envPort = process.env.ASTRA_MEMORY_PORT ? Number(process.env.ASTRA_MEMORY_PORT) : undefined;
|
|
35
|
+
const port = overrides.port ?? (Number.isInteger(envPort) ? envPort : undefined) ?? cfg.port;
|
|
36
|
+
const portSource = overrides.port !== undefined ? 'cli' : Number.isInteger(envPort) ? 'env' : 'config.yaml';
|
|
37
|
+
let dataDir;
|
|
38
|
+
let dataDirSource;
|
|
39
|
+
if (overrides.dataDir !== undefined) {
|
|
40
|
+
dataDir = overrides.dataDir;
|
|
41
|
+
dataDirSource = 'cli';
|
|
42
|
+
}
|
|
43
|
+
else if (process.env.ASTRA_MEMORY_DATADIR) {
|
|
44
|
+
dataDir = process.env.ASTRA_MEMORY_DATADIR;
|
|
45
|
+
dataDirSource = 'env';
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
dataDir = cfg.dataDir;
|
|
49
|
+
dataDirSource = cfg.dataDir === defaultDataDir() ? 'default' : 'config.yaml';
|
|
50
|
+
}
|
|
51
|
+
return { cfg, port, dataDir, configDir, sources: { port: portSource, dataDir: dataDirSource } };
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=resolve-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-runtime.js","sourceRoot":"","sources":["../../src/config/resolve-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAoB/D,MAAM,UAAU,oBAAoB,CAAC,YAA8B,EAAE;IACnE,yEAAyE;IACzE,2EAA2E;IAC3E,0BAA0B,EAAE,CAAC;IAE7B,MAAM,SAAS,GAAG,gBAAgB,EAAE,CAAC;IACrC,MAAM,GAAG,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAE1C,yEAAyE;IACzE,iDAAiD;IACjD,MAAM,UAAU,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC/C,IAAI,UAAU,EAAE,CAAC;QACf,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,WAAW,EAAE,UAAU,CAAC,WAAW,EAAE,CAAC;IACpH,CAAC;IAED,oEAAoE;IACpE,iEAAiE;IACjE,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAClG,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAE,OAAkB,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC;IACzG,MAAM,UAAU,GACd,SAAS,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC;IAE3F,IAAI,OAAe,CAAC;IACpB,IAAI,aAA0B,CAAC;IAC/B,IAAI,SAAS,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACpC,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC;QAC5B,aAAa,GAAG,KAAK,CAAC;IACxB,CAAC;SAAM,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,CAAC;QAC5C,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;QAC3C,aAAa,GAAG,KAAK,CAAC;IACxB,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;QACtB,aAAa,GAAG,GAAG,CAAC,OAAO,KAAK,cAAc,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC;IAC/E,CAAC;IAED,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,CAAC;AAClG,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* writeSecrets — write secrets.env to disk with mode 0600 (Unix).
|
|
3
|
+
*
|
|
4
|
+
* Format is shell-sourceable: KEY=value lines.
|
|
5
|
+
* On Windows, chmod is a no-op (NTFS uses ACLs; warn user instead).
|
|
6
|
+
*/
|
|
7
|
+
export interface SecretsPayload {
|
|
8
|
+
/**
|
|
9
|
+
* 64-character hex Bearer token (32 random bytes). Optional as of SEC-10:
|
|
10
|
+
* callers omit this when the bearer was already stored in the OS
|
|
11
|
+
* credential store — secrets.env is a fallback persistence layer, not the
|
|
12
|
+
* bearer's primary home. See storage/keystore.ts storeBearer().
|
|
13
|
+
*/
|
|
14
|
+
bearer?: string;
|
|
15
|
+
/** Azure OpenAI API key, if azure provider selected. */
|
|
16
|
+
azureKey?: string;
|
|
17
|
+
/** Azure endpoint URL, if azure provider selected. */
|
|
18
|
+
azureEndpoint?: string;
|
|
19
|
+
/** Azure deployment name, if azure provider selected. */
|
|
20
|
+
azureDeployment?: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Write secrets.env to `path`.
|
|
24
|
+
*
|
|
25
|
+
* Sets mode 0600 on Unix. On Windows the file is created with default ACL
|
|
26
|
+
* (current user only) — a warning is printed if stdout is TTY.
|
|
27
|
+
*/
|
|
28
|
+
export declare function writeSecrets(payload: SecretsPayload, path: string): void;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* writeSecrets — write secrets.env to disk with mode 0600 (Unix).
|
|
3
|
+
*
|
|
4
|
+
* Format is shell-sourceable: KEY=value lines.
|
|
5
|
+
* On Windows, chmod is a no-op (NTFS uses ACLs; warn user instead).
|
|
6
|
+
*/
|
|
7
|
+
import { writeFileSync, chmodSync, mkdirSync } from 'node:fs';
|
|
8
|
+
import { dirname } from 'node:path';
|
|
9
|
+
import { platform } from 'node:os';
|
|
10
|
+
/**
|
|
11
|
+
* Write secrets.env to `path`.
|
|
12
|
+
*
|
|
13
|
+
* Sets mode 0600 on Unix. On Windows the file is created with default ACL
|
|
14
|
+
* (current user only) — a warning is printed if stdout is TTY.
|
|
15
|
+
*/
|
|
16
|
+
export function writeSecrets(payload, path) {
|
|
17
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
18
|
+
const lines = [];
|
|
19
|
+
if (payload.bearer)
|
|
20
|
+
lines.push(`MEMORY_BEARER=${payload.bearer}`);
|
|
21
|
+
if (payload.azureKey)
|
|
22
|
+
lines.push(`AZURE_OPENAI_API_KEY=${payload.azureKey}`);
|
|
23
|
+
if (payload.azureEndpoint)
|
|
24
|
+
lines.push(`AZURE_OPENAI_ENDPOINT=${payload.azureEndpoint}`);
|
|
25
|
+
if (payload.azureDeployment)
|
|
26
|
+
lines.push(`AZURE_OPENAI_DEPLOYMENT=${payload.azureDeployment}`);
|
|
27
|
+
lines.push(''); // trailing newline
|
|
28
|
+
writeFileSync(path, lines.join('\n'), { encoding: 'utf8' });
|
|
29
|
+
if (platform() !== 'win32') {
|
|
30
|
+
try {
|
|
31
|
+
chmodSync(path, 0o600);
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// Rare on normal FS; ignore — caller should warn.
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=secrets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/config/secrets.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAkBnC;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,OAAuB,EAAE,IAAY;IAChE,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE9C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,OAAO,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,iBAAiB,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAClE,IAAI,OAAO,CAAC,QAAQ;QAAE,KAAK,CAAC,IAAI,CAAC,wBAAwB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC7E,IAAI,OAAO,CAAC,aAAa;QAAE,KAAK,CAAC,IAAI,CAAC,yBAAyB,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IACxF,IAAI,OAAO,CAAC,eAAe;QAAE,KAAK,CAAC,IAAI,CAAC,2BAA2B,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IAC9F,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,mBAAmB;IAEnC,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IAE5D,IAAI,QAAQ,EAAE,KAAK,OAAO,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,kDAAkD;QACpD,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persisted sync settings — written by `astramem-local pair`, merged into
|
|
3
|
+
* Config.sync at daemon boot (Wave 3e). Kept as a small JSON file beside
|
|
4
|
+
* config.yaml because pairing happens after init and must survive restarts;
|
|
5
|
+
* the device token itself never lands here — it lives in the OS credential
|
|
6
|
+
* store (keystore.ts storeSyncToken) or ASTRA_SYNC_TOKEN.
|
|
7
|
+
*/
|
|
8
|
+
export interface SyncSettings {
|
|
9
|
+
enabled: boolean;
|
|
10
|
+
url: string;
|
|
11
|
+
workspaceId: string;
|
|
12
|
+
tenantId?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function syncSettingsPath(configDir: string): string;
|
|
15
|
+
export declare function readSyncSettings(configDir: string): SyncSettings | null;
|
|
16
|
+
export declare function writeSyncSettings(configDir: string, settings: SyncSettings): void;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persisted sync settings — written by `astramem-local pair`, merged into
|
|
3
|
+
* Config.sync at daemon boot (Wave 3e). Kept as a small JSON file beside
|
|
4
|
+
* config.yaml because pairing happens after init and must survive restarts;
|
|
5
|
+
* the device token itself never lands here — it lives in the OS credential
|
|
6
|
+
* store (keystore.ts storeSyncToken) or ASTRA_SYNC_TOKEN.
|
|
7
|
+
*/
|
|
8
|
+
import { readFileSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
9
|
+
import { join } from 'node:path';
|
|
10
|
+
const FILE = 'sync.json';
|
|
11
|
+
export function syncSettingsPath(configDir) {
|
|
12
|
+
return join(configDir, FILE);
|
|
13
|
+
}
|
|
14
|
+
export function readSyncSettings(configDir) {
|
|
15
|
+
try {
|
|
16
|
+
const raw = JSON.parse(readFileSync(syncSettingsPath(configDir), 'utf8'));
|
|
17
|
+
if (typeof raw.url !== 'string' || typeof raw.workspaceId !== 'string')
|
|
18
|
+
return null;
|
|
19
|
+
return {
|
|
20
|
+
enabled: raw.enabled === true,
|
|
21
|
+
url: raw.url,
|
|
22
|
+
workspaceId: raw.workspaceId,
|
|
23
|
+
...(typeof raw.tenantId === 'string' ? { tenantId: raw.tenantId } : {}),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return null; // missing or corrupt — daemon falls back to config defaults
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export function writeSyncSettings(configDir, settings) {
|
|
31
|
+
mkdirSync(configDir, { recursive: true });
|
|
32
|
+
writeFileSync(syncSettingsPath(configDir), JSON.stringify(settings, null, 2), 'utf8');
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=sync-settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-settings.js","sourceRoot":"","sources":["../../src/config/sync-settings.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AASjC,MAAM,IAAI,GAAG,WAAW,CAAC;AAEzB,MAAM,UAAU,gBAAgB,CAAC,SAAiB;IAChD,OAAO,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,SAAiB;IAChD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,gBAAgB,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,CAA0B,CAAC;QACnG,IAAI,OAAO,GAAG,CAAC,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,WAAW,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACpF,OAAO;YACL,OAAO,EAAE,GAAG,CAAC,OAAO,KAAK,IAAI;YAC7B,GAAG,EAAE,GAAG,CAAC,GAAG;YACZ,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,GAAG,CAAC,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxE,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,CAAC,4DAA4D;IAC3E,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,SAAiB,EAAE,QAAsB;IACzE,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,aAAa,CAAC,gBAAgB,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AACxF,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* writeConfig — serialise a Config object to YAML and write it to disk.
|
|
3
|
+
*
|
|
4
|
+
* No external yaml package required. The Config shape is flat enough that
|
|
5
|
+
* a purpose-built emitter is both simpler and faster to load than a full
|
|
6
|
+
* YAML library. Add the `yaml` package when Config grows nested lists.
|
|
7
|
+
*/
|
|
8
|
+
import type { Config } from './config.js';
|
|
9
|
+
/**
|
|
10
|
+
* Serialise Config to a YAML string.
|
|
11
|
+
*
|
|
12
|
+
* The emitted YAML is intentionally hand-readable and round-trippable by
|
|
13
|
+
* `js-yaml` / `yaml` if the user installs one later.
|
|
14
|
+
*/
|
|
15
|
+
export declare function configToYaml(cfg: Config): string;
|
|
16
|
+
/**
|
|
17
|
+
* Write config.yaml to `path`, creating parent directories as needed.
|
|
18
|
+
*/
|
|
19
|
+
export declare function writeConfig(cfg: Config, path: string): void;
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* writeConfig — serialise a Config object to YAML and write it to disk.
|
|
3
|
+
*
|
|
4
|
+
* No external yaml package required. The Config shape is flat enough that
|
|
5
|
+
* a purpose-built emitter is both simpler and faster to load than a full
|
|
6
|
+
* YAML library. Add the `yaml` package when Config grows nested lists.
|
|
7
|
+
*/
|
|
8
|
+
import { writeFileSync, mkdirSync } from 'node:fs';
|
|
9
|
+
import { dirname } from 'node:path';
|
|
10
|
+
/** Emit a scalar value as a YAML-safe string (no quoting for safe values). */
|
|
11
|
+
function yamlScalar(v) {
|
|
12
|
+
if (typeof v === 'boolean')
|
|
13
|
+
return v ? 'true' : 'false';
|
|
14
|
+
if (typeof v === 'number')
|
|
15
|
+
return String(v);
|
|
16
|
+
if (typeof v === 'string') {
|
|
17
|
+
// Quote strings that contain special YAML chars or are booleans/numbers.
|
|
18
|
+
if (v === '' ||
|
|
19
|
+
/[:#{}\[\],&*?|<>=!%@`]/.test(v) ||
|
|
20
|
+
/^(true|false|null|~)$/i.test(v) ||
|
|
21
|
+
/^\d/.test(v)) {
|
|
22
|
+
return `'${v.replace(/'/g, "''")}'`;
|
|
23
|
+
}
|
|
24
|
+
return v;
|
|
25
|
+
}
|
|
26
|
+
return String(v);
|
|
27
|
+
}
|
|
28
|
+
/** Emit one YAML line with optional indent. */
|
|
29
|
+
function line(indent, key, value) {
|
|
30
|
+
const pad = ' '.repeat(indent);
|
|
31
|
+
if (value === undefined)
|
|
32
|
+
return `${pad}${key}:`;
|
|
33
|
+
return `${pad}${key}: ${yamlScalar(value)}`;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Serialise Config to a YAML string.
|
|
37
|
+
*
|
|
38
|
+
* The emitted YAML is intentionally hand-readable and round-trippable by
|
|
39
|
+
* `js-yaml` / `yaml` if the user installs one later.
|
|
40
|
+
*/
|
|
41
|
+
export function configToYaml(cfg) {
|
|
42
|
+
const lines = [
|
|
43
|
+
'# AstraMemory Local — config.yaml',
|
|
44
|
+
'# Generated by `astramem-local init`. Edit manually or re-run init.',
|
|
45
|
+
'',
|
|
46
|
+
line(0, 'port', cfg.port),
|
|
47
|
+
line(0, 'dataDir', cfg.dataDir),
|
|
48
|
+
'',
|
|
49
|
+
// FEAT-406: leave at 127.0.0.1 unless you intend remote /health scraping.
|
|
50
|
+
// Any other value requires Bearer auth on /health + /version too — see
|
|
51
|
+
// docs/security/remote-health-threat-model.md before changing this.
|
|
52
|
+
line(0, 'network'),
|
|
53
|
+
line(1, 'host', cfg.network.host),
|
|
54
|
+
'',
|
|
55
|
+
line(0, 'llm'),
|
|
56
|
+
line(1, 'compaction'),
|
|
57
|
+
line(2, 'provider', cfg.llm.compaction.provider),
|
|
58
|
+
line(2, 'model', cfg.llm.compaction.model),
|
|
59
|
+
line(1, 'extraction'),
|
|
60
|
+
line(2, 'provider', cfg.llm.extraction.provider),
|
|
61
|
+
line(2, 'model', cfg.llm.extraction.model),
|
|
62
|
+
'',
|
|
63
|
+
line(0, 'embedding'),
|
|
64
|
+
line(1, 'provider', cfg.embedding.provider),
|
|
65
|
+
line(1, 'model', cfg.embedding.model),
|
|
66
|
+
line(1, 'dim', cfg.embedding.dim),
|
|
67
|
+
'',
|
|
68
|
+
line(0, 'vector'),
|
|
69
|
+
line(1, 'store', cfg.vector.store),
|
|
70
|
+
'',
|
|
71
|
+
line(0, 'budget'),
|
|
72
|
+
line(1, 'daily_usd', cfg.budget.daily_usd),
|
|
73
|
+
'',
|
|
74
|
+
line(0, 'ollama'),
|
|
75
|
+
line(1, 'baseUrl', cfg.ollama.baseUrl),
|
|
76
|
+
'',
|
|
77
|
+
line(0, 'azure'),
|
|
78
|
+
line(1, 'apiVersion', cfg.azure.apiVersion),
|
|
79
|
+
...(cfg.azure.endpoint ? [line(1, 'endpoint', cfg.azure.endpoint)] : []),
|
|
80
|
+
...(cfg.azure.deployment ? [line(1, 'deployment', cfg.azure.deployment)] : []),
|
|
81
|
+
'',
|
|
82
|
+
line(0, 'search'),
|
|
83
|
+
line(1, 'alpha', cfg.search.alpha),
|
|
84
|
+
line(1, 'beta', cfg.search.beta),
|
|
85
|
+
line(1, 'gamma', cfg.search.gamma),
|
|
86
|
+
line(1, 'delta', cfg.search.delta),
|
|
87
|
+
line(1, 'epsilon', cfg.search.epsilon),
|
|
88
|
+
line(1, 'zeta', cfg.search.zeta),
|
|
89
|
+
'',
|
|
90
|
+
line(0, 'recallPack'),
|
|
91
|
+
line(1, 'enabled', cfg.recallPack.enabled),
|
|
92
|
+
line(1, 'budgetTokens', cfg.recallPack.budgetTokens),
|
|
93
|
+
line(1, 'policy'),
|
|
94
|
+
line(2, 'enabled', cfg.recallPack.policy.enabled),
|
|
95
|
+
line(2, 'minScore', cfg.recallPack.policy.minScore),
|
|
96
|
+
line(2, 'minPromptChars', cfg.recallPack.policy.minPromptChars),
|
|
97
|
+
'',
|
|
98
|
+
// sync is deliberately NOT emitted here — `astramem-local pair` owns it
|
|
99
|
+
// via sync.json (single source of truth, merged at serve boot).
|
|
100
|
+
line(0, 'security'),
|
|
101
|
+
line(1, 'redaction'),
|
|
102
|
+
line(2, 'enabled', cfg.security.redaction.enabled),
|
|
103
|
+
line(2, 'entropyThreshold', cfg.security.redaction.entropyThreshold),
|
|
104
|
+
line(1, 'encryption'),
|
|
105
|
+
line(2, 'enabled', cfg.security.encryption.enabled),
|
|
106
|
+
'',
|
|
107
|
+
line(0, 'tagHygiene'),
|
|
108
|
+
line(1, 'tier2Enabled', cfg.tagHygiene.tier2Enabled),
|
|
109
|
+
line(1, 'tier2ConfidenceThreshold', cfg.tagHygiene.tier2ConfidenceThreshold),
|
|
110
|
+
'',
|
|
111
|
+
];
|
|
112
|
+
return lines.join('\n');
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Write config.yaml to `path`, creating parent directories as needed.
|
|
116
|
+
*/
|
|
117
|
+
export function writeConfig(cfg, path) {
|
|
118
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
119
|
+
writeFileSync(path, configToYaml(cfg), 'utf8');
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=writer.js.map
|