@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,203 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Search routes:
|
|
3
|
+
* GET /search?q=&type=&repo=&project=&agent=&since=&as_of=&entity=&limit=
|
|
4
|
+
* POST /recall { query, k, filters? } filters.as_of: ISO-8601 date-time,
|
|
5
|
+
* filters.entity: FEAT-402 AC-4
|
|
6
|
+
* POST /remember { text, type, metadata? }
|
|
7
|
+
*/
|
|
8
|
+
import { createHash } from 'node:crypto';
|
|
9
|
+
import { z } from 'zod';
|
|
10
|
+
import { MemoryRepo } from '../../storage/memories.js';
|
|
11
|
+
import { MemoryEventRepo } from '../../storage/memory-events.js';
|
|
12
|
+
import { recordRecallServed } from '../../storage/usefulness.js';
|
|
13
|
+
import { SqliteVecStore } from '../../vector/sqlite-vec.js';
|
|
14
|
+
import { search, parseAsOf } from '../../search/search.js';
|
|
15
|
+
import { defaultConfig } from '../../config/config.js';
|
|
16
|
+
import { childLogger } from '../../log/logger.js';
|
|
17
|
+
import { redactIfEnabled } from '../../redact/index.js';
|
|
18
|
+
import { recordRedactionEvents } from '../../storage/redaction-log.js';
|
|
19
|
+
import { clampScores } from '../lib/score-contract.js';
|
|
20
|
+
const MemoryTypeEnum = z.enum(['decision', 'fact', 'lesson', 'command', 'todo', 'note', 'event']);
|
|
21
|
+
/**
|
|
22
|
+
* FEAT-423: normalize a comma-separated query-param value into the
|
|
23
|
+
* SearchFilters shape — a single string stays a string (`col = ?`), multiple
|
|
24
|
+
* comma-separated values become a string[] (`col IN (...)`). Empty/whitespace
|
|
25
|
+
* segments are dropped; an all-empty value yields undefined (no filter).
|
|
26
|
+
*/
|
|
27
|
+
function csvFilter(raw) {
|
|
28
|
+
const parts = raw.split(',').map(s => s.trim()).filter(Boolean);
|
|
29
|
+
if (parts.length === 0)
|
|
30
|
+
return undefined;
|
|
31
|
+
return parts.length === 1 ? parts[0] : parts;
|
|
32
|
+
}
|
|
33
|
+
const RecallBodySchema = z.object({
|
|
34
|
+
query: z.string().min(1),
|
|
35
|
+
k: z.number().int().positive().default(5),
|
|
36
|
+
filters: z.object({
|
|
37
|
+
type: z.array(z.string()).optional(),
|
|
38
|
+
repo: z.string().optional(),
|
|
39
|
+
/** FEAT-423: single project or a list (OR-semantics). */
|
|
40
|
+
project: z.union([z.string(), z.array(z.string())]).optional(),
|
|
41
|
+
/** FEAT-423: single agent or a list; exact match on provenance agent/agent_type. */
|
|
42
|
+
agent: z.union([z.string(), z.array(z.string())]).optional(),
|
|
43
|
+
since: z.number().optional(),
|
|
44
|
+
/** FEAT-401: ISO-8601 date-time — bitemporal time-travel (ADR-001/ADR-005). */
|
|
45
|
+
as_of: z.string().optional(),
|
|
46
|
+
/** FEAT-402 slice 2 AC-4: entity name — resolved via the AC-9 normalize seam. */
|
|
47
|
+
entity: z.string().optional()
|
|
48
|
+
}).optional()
|
|
49
|
+
});
|
|
50
|
+
const RememberBodySchema = z.object({
|
|
51
|
+
text: z.string().min(1),
|
|
52
|
+
type: MemoryTypeEnum,
|
|
53
|
+
metadata: z.object({
|
|
54
|
+
repo: z.string().optional(),
|
|
55
|
+
project: z.string().optional(),
|
|
56
|
+
branch: z.string().optional(),
|
|
57
|
+
agent: z.string().optional(),
|
|
58
|
+
importance: z.number().min(0).max(1).optional(),
|
|
59
|
+
confidence: z.number().min(0).max(1).optional()
|
|
60
|
+
}).optional()
|
|
61
|
+
});
|
|
62
|
+
export function searchRoute(db, embed, config = defaultConfig()) {
|
|
63
|
+
const cfg = defaultConfig();
|
|
64
|
+
const weights = cfg.search;
|
|
65
|
+
return async (app) => {
|
|
66
|
+
// GET /search
|
|
67
|
+
app.get('/search', async (req, reply) => {
|
|
68
|
+
const params = req.query;
|
|
69
|
+
if (!params.q && params.q !== '') {
|
|
70
|
+
return reply.code(400).send({ error: 'q parameter is required' });
|
|
71
|
+
}
|
|
72
|
+
const q = params.q ?? '';
|
|
73
|
+
const limit = params.limit ? Math.max(1, Math.min(100, Number(params.limit))) : 10;
|
|
74
|
+
const filters = {};
|
|
75
|
+
if (params.type)
|
|
76
|
+
filters.type = params.type.split(',').map(t => t.trim());
|
|
77
|
+
if (params.repo)
|
|
78
|
+
filters.repo = params.repo;
|
|
79
|
+
if (params.project)
|
|
80
|
+
filters.project = csvFilter(params.project);
|
|
81
|
+
if (params.agent)
|
|
82
|
+
filters.agent = csvFilter(params.agent);
|
|
83
|
+
if (params.since) {
|
|
84
|
+
// Accept epoch ms directly or duration strings like "7d", "24h"
|
|
85
|
+
const sinceNum = Number(params.since);
|
|
86
|
+
if (!isNaN(sinceNum)) {
|
|
87
|
+
filters.since = sinceNum;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (params.as_of) {
|
|
91
|
+
try {
|
|
92
|
+
filters.as_of = parseAsOf(params.as_of);
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
return reply.code(400).send({ error: err instanceof Error ? err.message : 'invalid as_of' });
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (params.entity)
|
|
99
|
+
filters.entity = params.entity;
|
|
100
|
+
const hits = await search(q, filters, limit, { db, embed, weights });
|
|
101
|
+
// ADR-010: recall-usefulness capture — measure only, does not feed ranking (v1).
|
|
102
|
+
recordRecallServed(db, {
|
|
103
|
+
query: q,
|
|
104
|
+
atomIds: hits.map(h => h.id),
|
|
105
|
+
scores: hits.map(h => h.score),
|
|
106
|
+
surface: 'rest',
|
|
107
|
+
mode: 'search',
|
|
108
|
+
});
|
|
109
|
+
// SLICE-411: enforce the [0,1] wire score contract at serialization,
|
|
110
|
+
// independent of fuseScores() internal math.
|
|
111
|
+
return { hits: clampScores(hits, 'GET /search') };
|
|
112
|
+
});
|
|
113
|
+
// POST /recall
|
|
114
|
+
app.post('/recall', async (req, reply) => {
|
|
115
|
+
const parsed = RecallBodySchema.safeParse(req.body);
|
|
116
|
+
if (!parsed.success) {
|
|
117
|
+
return reply.code(400).send({ error: 'invalid', details: parsed.error.flatten() });
|
|
118
|
+
}
|
|
119
|
+
const { query, k, filters: rawFilters } = parsed.data;
|
|
120
|
+
const filters = {};
|
|
121
|
+
if (rawFilters?.type)
|
|
122
|
+
filters.type = rawFilters.type;
|
|
123
|
+
if (rawFilters?.repo)
|
|
124
|
+
filters.repo = rawFilters.repo;
|
|
125
|
+
if (rawFilters?.project)
|
|
126
|
+
filters.project = rawFilters.project;
|
|
127
|
+
if (rawFilters?.agent)
|
|
128
|
+
filters.agent = rawFilters.agent;
|
|
129
|
+
if (rawFilters?.since !== undefined)
|
|
130
|
+
filters.since = rawFilters.since;
|
|
131
|
+
if (rawFilters?.as_of !== undefined) {
|
|
132
|
+
try {
|
|
133
|
+
filters.as_of = parseAsOf(rawFilters.as_of);
|
|
134
|
+
}
|
|
135
|
+
catch (err) {
|
|
136
|
+
return reply.code(400).send({ error: err instanceof Error ? err.message : 'invalid as_of' });
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
if (rawFilters?.entity !== undefined)
|
|
140
|
+
filters.entity = rawFilters.entity;
|
|
141
|
+
const hits = await search(query, filters, k, { db, embed, weights });
|
|
142
|
+
// ADR-010: recall-usefulness capture — measure only, does not feed ranking (v1).
|
|
143
|
+
recordRecallServed(db, {
|
|
144
|
+
query,
|
|
145
|
+
atomIds: hits.map(h => h.id),
|
|
146
|
+
scores: hits.map(h => h.score),
|
|
147
|
+
surface: 'rest',
|
|
148
|
+
mode: 'recall',
|
|
149
|
+
});
|
|
150
|
+
// SLICE-411: enforce the [0,1] wire score contract at serialization,
|
|
151
|
+
// independent of fuseScores() internal math.
|
|
152
|
+
return { hits: clampScores(hits, 'POST /recall') };
|
|
153
|
+
});
|
|
154
|
+
// POST /remember — direct insert bypassing distillation pipeline
|
|
155
|
+
app.post('/remember', async (req, reply) => {
|
|
156
|
+
const parsed = RememberBodySchema.safeParse(req.body);
|
|
157
|
+
if (!parsed.success) {
|
|
158
|
+
return reply.code(400).send({ error: 'invalid', details: parsed.error.flatten() });
|
|
159
|
+
}
|
|
160
|
+
const { type, metadata } = parsed.data;
|
|
161
|
+
// Stage-0 secret redaction (SEC-3/5, OQ-2) — same choke point as ingest,
|
|
162
|
+
// applied before persistence AND before the embed call (SEC-4: no
|
|
163
|
+
// un-redacted content reaches a cloud embed provider).
|
|
164
|
+
const { text, events: redactionEvents } = redactIfEnabled(parsed.data.text, config);
|
|
165
|
+
recordRedactionEvents(db, redactionEvents, null);
|
|
166
|
+
// Compute hash for dedup
|
|
167
|
+
const hash = createHash('sha256').update(text).digest('hex').slice(0, 32);
|
|
168
|
+
const repo = new MemoryRepo(db);
|
|
169
|
+
const events = new MemoryEventRepo(db);
|
|
170
|
+
const { id } = repo.insertWithCreateEvent({
|
|
171
|
+
type,
|
|
172
|
+
text,
|
|
173
|
+
normalized_text: text.toLowerCase(),
|
|
174
|
+
repo: metadata?.repo ?? null,
|
|
175
|
+
project: metadata?.project ?? null,
|
|
176
|
+
branch: metadata?.branch ?? null,
|
|
177
|
+
agent: metadata?.agent ?? null,
|
|
178
|
+
session_id: null,
|
|
179
|
+
hash,
|
|
180
|
+
source_hash: null,
|
|
181
|
+
importance: metadata?.importance ?? 0.5,
|
|
182
|
+
confidence: metadata?.confidence ?? 0.5,
|
|
183
|
+
embedding_provider: embed.name,
|
|
184
|
+
embedding_model: embed.model,
|
|
185
|
+
embedding_dim: embed.dim
|
|
186
|
+
}, events);
|
|
187
|
+
// Embed + upsert into vec store
|
|
188
|
+
try {
|
|
189
|
+
const vecs = await embed.embed([text]);
|
|
190
|
+
const vecStore = new SqliteVecStore(db, embed.dim);
|
|
191
|
+
if (!vecs[0])
|
|
192
|
+
throw new Error('embed provider returned empty result');
|
|
193
|
+
await vecStore.upsert(id, vecs[0]);
|
|
194
|
+
}
|
|
195
|
+
catch (err) {
|
|
196
|
+
// Non-fatal: FTS still works; vec will be populated on reembed
|
|
197
|
+
childLogger({}).warn({ error_message: err instanceof Error ? err.message : String(err), id }, 'remember: embed/vec upsert failed');
|
|
198
|
+
}
|
|
199
|
+
return { id, ok: true };
|
|
200
|
+
});
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/server/routes/search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { PKG_VERSION, WIRE_VERSIONS_SUPPORTED, SCHEMA_VERSION } from '../lib/wire-meta.js';
|
|
2
|
+
export async function versionRoute(app) {
|
|
3
|
+
app.get('/version', async () => ({
|
|
4
|
+
name: 'astramemory-local',
|
|
5
|
+
version: PKG_VERSION,
|
|
6
|
+
wire_versions_supported: WIRE_VERSIONS_SUPPORTED,
|
|
7
|
+
schema_version: SCHEMA_VERSION,
|
|
8
|
+
ts: Date.now(),
|
|
9
|
+
}));
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/server/routes/version.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE3F,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAoB;IACrD,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QAC/B,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,WAAW;QACpB,uBAAuB,EAAE,uBAAuB;QAChD,cAAc,EAAE,cAAc;QAC9B,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;KACf,CAAC,CAAC,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provenance receipt route (KF-A):
|
|
3
|
+
* GET /memory/:id/why — memory + evidence + source session + transcript ref.
|
|
4
|
+
* `history` is the memory_events lifecycle log for this atom (ADR-002,
|
|
5
|
+
* Wave 2b) — empty for atoms that predate any lifecycle events.
|
|
6
|
+
*/
|
|
7
|
+
import type { FastifyInstance } from 'fastify';
|
|
8
|
+
import type { DB } from '../../storage/db.js';
|
|
9
|
+
export declare function whyRoute(db: DB): (app: FastifyInstance) => Promise<void>;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provenance receipt route (KF-A):
|
|
3
|
+
* GET /memory/:id/why — memory + evidence + source session + transcript ref.
|
|
4
|
+
* `history` is the memory_events lifecycle log for this atom (ADR-002,
|
|
5
|
+
* Wave 2b) — empty for atoms that predate any lifecycle events.
|
|
6
|
+
*/
|
|
7
|
+
import { MemoryRepo } from '../../storage/memories.js';
|
|
8
|
+
import { MemoryEventRepo } from '../../storage/memory-events.js';
|
|
9
|
+
export function whyRoute(db) {
|
|
10
|
+
return async (app) => {
|
|
11
|
+
app.get('/memory/:id/why', async (req, reply) => {
|
|
12
|
+
const { id } = req.params;
|
|
13
|
+
const memory = new MemoryRepo(db).get(id);
|
|
14
|
+
if (!memory) {
|
|
15
|
+
return reply.code(404).send({ error: 'not found', id });
|
|
16
|
+
}
|
|
17
|
+
let session = null;
|
|
18
|
+
if (memory.session_id) {
|
|
19
|
+
session = db
|
|
20
|
+
.prepare('SELECT id, repo, branch, agent, started_at FROM sessions WHERE id = ?')
|
|
21
|
+
.get(memory.session_id) ?? null;
|
|
22
|
+
}
|
|
23
|
+
return {
|
|
24
|
+
id: memory.id,
|
|
25
|
+
type: memory.type,
|
|
26
|
+
text: memory.text,
|
|
27
|
+
importance: memory.importance,
|
|
28
|
+
confidence: memory.confidence,
|
|
29
|
+
evidence: memory.evidence,
|
|
30
|
+
session,
|
|
31
|
+
transcript_ref: memory.source_hash,
|
|
32
|
+
created_at: memory.created_at,
|
|
33
|
+
history: new MemoryEventRepo(db).listForAtom(id),
|
|
34
|
+
};
|
|
35
|
+
});
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=why.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"why.js","sourceRoot":"","sources":["../../../src/server/routes/why.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAUjE,MAAM,UAAU,QAAQ,CAAC,EAAM;IAC7B,OAAO,KAAK,EAAE,GAAoB,EAAE,EAAE;QACpC,GAAG,CAAC,GAAG,CAAC,iBAAiB,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;YAC9C,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAwB,CAAC;YAC5C,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC1C,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;YAC1D,CAAC;YAED,IAAI,OAAO,GAAwB,IAAI,CAAC;YACxC,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;gBACtB,OAAO,GAAI,EAAE;qBACV,OAAO,CAAC,uEAAuE,CAAC;qBAChF,GAAG,CAAC,MAAM,CAAC,UAAU,CAA8B,IAAI,IAAI,CAAC;YACjE,CAAC;YAED,OAAO;gBACL,EAAE,EAAE,MAAM,CAAC,EAAE;gBACb,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,OAAO;gBACP,cAAc,EAAE,MAAM,CAAC,WAAW;gBAClC,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,OAAO,EAAE,IAAI,eAAe,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC;aACjD,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ServiceAdapter } from './types.js';
|
|
2
|
+
export { type ServiceAdapter, type ServiceStatus, type InstallResult } from './types.js';
|
|
3
|
+
export { SystemdAdapter } from './systemd.js';
|
|
4
|
+
export { LaunchdAdapter } from './launchd.js';
|
|
5
|
+
export { SchtasksAdapter } from './schtasks.js';
|
|
6
|
+
/**
|
|
7
|
+
* Returns the ServiceAdapter appropriate for the current OS.
|
|
8
|
+
* @param overridePlatform - inject for testing without needing to mock ESM live bindings
|
|
9
|
+
*/
|
|
10
|
+
export declare function getServiceAdapter(overridePlatform?: string): ServiceAdapter;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { platform } from 'node:os';
|
|
2
|
+
import { SystemdAdapter } from './systemd.js';
|
|
3
|
+
import { LaunchdAdapter } from './launchd.js';
|
|
4
|
+
import { SchtasksAdapter } from './schtasks.js';
|
|
5
|
+
export { SystemdAdapter } from './systemd.js';
|
|
6
|
+
export { LaunchdAdapter } from './launchd.js';
|
|
7
|
+
export { SchtasksAdapter } from './schtasks.js';
|
|
8
|
+
/**
|
|
9
|
+
* Returns the ServiceAdapter appropriate for the current OS.
|
|
10
|
+
* @param overridePlatform - inject for testing without needing to mock ESM live bindings
|
|
11
|
+
*/
|
|
12
|
+
export function getServiceAdapter(overridePlatform) {
|
|
13
|
+
const p = overridePlatform ?? platform();
|
|
14
|
+
switch (p) {
|
|
15
|
+
case 'linux':
|
|
16
|
+
return new SystemdAdapter();
|
|
17
|
+
case 'darwin':
|
|
18
|
+
return new LaunchdAdapter();
|
|
19
|
+
case 'win32':
|
|
20
|
+
return new SchtasksAdapter();
|
|
21
|
+
default:
|
|
22
|
+
throw new Error(`Unsupported platform: ${p}. AstraMemory service install supports linux, darwin, win32.`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/service/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAIhD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,gBAAyB;IACzD,MAAM,CAAC,GAAG,gBAAgB,IAAI,QAAQ,EAAE,CAAC;IACzC,QAAQ,CAAC,EAAE,CAAC;QACV,KAAK,OAAO;YACV,OAAO,IAAI,cAAc,EAAE,CAAC;QAC9B,KAAK,QAAQ;YACX,OAAO,IAAI,cAAc,EAAE,CAAC;QAC9B,KAAK,OAAO;YACV,OAAO,IAAI,eAAe,EAAE,CAAC;QAC/B;YACE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,8DAA8D,CAAC,CAAC;IAC9G,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { InstallResult, ServiceAdapter } from './types.js';
|
|
2
|
+
export interface ResolvedBuild {
|
|
3
|
+
nodeBin: string;
|
|
4
|
+
entryJs: string;
|
|
5
|
+
/** `"<node>" "<entryJs>"` — for direct (non-shim) execution, e.g. the
|
|
6
|
+
* backup timer task which must run `backup --keep N`, not the daemon. */
|
|
7
|
+
rawExecPath: string;
|
|
8
|
+
}
|
|
9
|
+
/** Resolve the running build's CLI entry from this module's own location. */
|
|
10
|
+
export declare function resolveBuild(): ResolvedBuild;
|
|
11
|
+
export interface InstallFlowOutcome {
|
|
12
|
+
result: InstallResult;
|
|
13
|
+
adapter: ServiceAdapter;
|
|
14
|
+
build: ResolvedBuild;
|
|
15
|
+
/** What the scheduler actually points at (shim on Windows). */
|
|
16
|
+
taskExecPath: string;
|
|
17
|
+
}
|
|
18
|
+
export declare function installServiceFlow(port: number): Promise<InstallFlowOutcome>;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* install-flow.ts — the ONE service-install code path (D4).
|
|
3
|
+
*
|
|
4
|
+
* Used by `service install`, `init`, and `reinstall` so there is exactly one
|
|
5
|
+
* implementation of: resolve the current build → (Windows) write the stable
|
|
6
|
+
* shim → register with the OS scheduler.
|
|
7
|
+
*
|
|
8
|
+
* On Windows the scheduler is pointed at the STABLE shim path, never at the
|
|
9
|
+
* build directly — upgrades only rewrite the shim pointer (see shim.ts).
|
|
10
|
+
*/
|
|
11
|
+
import { existsSync } from 'node:fs';
|
|
12
|
+
import { join } from 'node:path';
|
|
13
|
+
import { getServiceAdapter } from './index.js';
|
|
14
|
+
import { writeShim, shimPaths } from './shim.js';
|
|
15
|
+
import { resolveRuntimeConfig } from '../config/resolve-runtime.js';
|
|
16
|
+
/** Resolve the running build's CLI entry from this module's own location. */
|
|
17
|
+
export function resolveBuild() {
|
|
18
|
+
const nodeBin = process.execPath;
|
|
19
|
+
const thisFile = new URL(import.meta.url).pathname.replace(/^\/([A-Za-z]:)/, '$1');
|
|
20
|
+
// dist/service/install-flow.js → dist/cli/index.js (URL paths are /-separated)
|
|
21
|
+
const entryJs = thisFile.replace(/service\/install-flow\.(js|ts)$/, 'cli/index.js');
|
|
22
|
+
return { nodeBin, entryJs, rawExecPath: `"${nodeBin}" "${entryJs}"` };
|
|
23
|
+
}
|
|
24
|
+
export async function installServiceFlow(port) {
|
|
25
|
+
const adapter = getServiceAdapter();
|
|
26
|
+
const build = resolveBuild();
|
|
27
|
+
if (!existsSync(build.entryJs)) {
|
|
28
|
+
throw new Error(`CLI entry not found at ${build.entryJs} — the build is missing or partial.\n` +
|
|
29
|
+
`Run: bun install && bun run build`);
|
|
30
|
+
}
|
|
31
|
+
let taskExecPath;
|
|
32
|
+
if (adapter.platform === 'win32') {
|
|
33
|
+
// Service logs rotate under the data dir (see logger.ts ASTRA_LOG_DIR).
|
|
34
|
+
const { dataDir } = resolveRuntimeConfig({ port });
|
|
35
|
+
const logDir = join(dataDir, 'logs');
|
|
36
|
+
const paths = writeShim({ nodeBin: build.nodeBin, entryJs: build.entryJs, port, logDir }, shimPaths());
|
|
37
|
+
console.log(` · shim written: ${paths.cmdPath}`);
|
|
38
|
+
console.log(` · pointer : ${paths.pointerPath} → ${build.entryJs}`);
|
|
39
|
+
taskExecPath = `"${paths.cmdPath}"`;
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
taskExecPath = build.rawExecPath;
|
|
43
|
+
}
|
|
44
|
+
const result = await adapter.install(taskExecPath, port);
|
|
45
|
+
return { result, adapter, build, taskExecPath };
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=install-flow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-flow.js","sourceRoot":"","sources":["../../src/service/install-flow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAWpE,6EAA6E;AAC7E,MAAM,UAAU,YAAY;IAC1B,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;IACjC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;IACnF,+EAA+E;IAC/E,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,iCAAiC,EAAE,cAAc,CAAC,CAAC;IACpF,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,OAAO,MAAM,OAAO,GAAG,EAAE,CAAC;AACxE,CAAC;AAUD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAY;IACnD,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC;IACpC,MAAM,KAAK,GAAG,YAAY,EAAE,CAAC;IAE7B,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CACb,0BAA0B,KAAK,CAAC,OAAO,uCAAuC;YAC9E,mCAAmC,CACpC,CAAC;IACJ,CAAC;IAED,IAAI,YAAoB,CAAC;IACzB,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,wEAAwE;QACxE,MAAM,EAAE,OAAO,EAAE,GAAG,oBAAoB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACrC,MAAM,KAAK,GAAG,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QACvG,OAAO,CAAC,GAAG,CAAC,qBAAqB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,qBAAqB,KAAK,CAAC,WAAW,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACzE,YAAY,GAAG,IAAI,KAAK,CAAC,OAAO,GAAG,CAAC;IACtC,CAAC;SAAM,CAAC;QACN,YAAY,GAAG,KAAK,CAAC,WAAW,CAAC;IACnC,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IACzD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export interface LockInfo {
|
|
2
|
+
pid: number;
|
|
3
|
+
startedAt: string;
|
|
4
|
+
port: number;
|
|
5
|
+
version: string;
|
|
6
|
+
}
|
|
7
|
+
export interface InstanceLock {
|
|
8
|
+
path: string;
|
|
9
|
+
release(): void;
|
|
10
|
+
}
|
|
11
|
+
export declare class AlreadyRunningError extends Error {
|
|
12
|
+
readonly holder: LockInfo;
|
|
13
|
+
constructor(holder: LockInfo);
|
|
14
|
+
}
|
|
15
|
+
export declare function lockPath(dataDir: string): string;
|
|
16
|
+
/** Read the current lock holder for a data dir (null when absent/corrupt). */
|
|
17
|
+
export declare function readLockInfo(dataDir: string): LockInfo | null;
|
|
18
|
+
/**
|
|
19
|
+
* Acquire the single-instance lock for `dataDir`.
|
|
20
|
+
*
|
|
21
|
+
* Throws AlreadyRunningError when a healthy daemon already holds it.
|
|
22
|
+
* Returns a handle whose release() is idempotent and safe from crash handlers.
|
|
23
|
+
*/
|
|
24
|
+
export declare function acquireInstanceLock(dataDir: string, port: number, version: string, opts?: {
|
|
25
|
+
healthProbe?: (port: number) => Promise<boolean>;
|
|
26
|
+
}): Promise<InstanceLock>;
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* instance-lock.ts — single-instance protection for the daemon (D2).
|
|
3
|
+
*
|
|
4
|
+
* The lock protects the DATA DIRECTORY (the real single-writer invariant),
|
|
5
|
+
* not just the TCP port: a second daemon on a different port pointed at the
|
|
6
|
+
* same memory.sqlite would race the job queue and contend for writes.
|
|
7
|
+
*
|
|
8
|
+
* Lock file: <dataDir>/daemon.lock — JSON { pid, startedAt, port, version }.
|
|
9
|
+
*
|
|
10
|
+
* Acquisition:
|
|
11
|
+
* 1. Exclusive create ('wx') succeeds → we own the lock.
|
|
12
|
+
* 2. Exists → read holder. Dead PID → stale, steal.
|
|
13
|
+
* 3. Holder PID alive → probe its /health (2s timeout, 3 attempts). Healthy
|
|
14
|
+
* → AlreadyRunningError (caller exits 0 — this makes schtasks keepalive
|
|
15
|
+
* re-runs cheap no-ops). Unhealthy 3× → zombie (hung process or a
|
|
16
|
+
* foreign PID that recycled the id) → steal loudly.
|
|
17
|
+
*
|
|
18
|
+
* Steal = atomic tmp+rename overwrite, same pattern as migrate-encrypt.ts.
|
|
19
|
+
*/
|
|
20
|
+
import { openSync, closeSync, writeSync, readFileSync, writeFileSync, renameSync, unlinkSync, existsSync } from 'node:fs';
|
|
21
|
+
import { join } from 'node:path';
|
|
22
|
+
export class AlreadyRunningError extends Error {
|
|
23
|
+
holder;
|
|
24
|
+
constructor(holder) {
|
|
25
|
+
super(`astramem-local already running (pid ${holder.pid}, port ${holder.port}, since ${holder.startedAt})`);
|
|
26
|
+
this.holder = holder;
|
|
27
|
+
this.name = 'AlreadyRunningError';
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export function lockPath(dataDir) {
|
|
31
|
+
return join(dataDir, 'daemon.lock');
|
|
32
|
+
}
|
|
33
|
+
function pidAlive(pid) {
|
|
34
|
+
try {
|
|
35
|
+
process.kill(pid, 0);
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
async function healthOk(port, timeoutMs = 2000) {
|
|
43
|
+
try {
|
|
44
|
+
const res = await fetch(`http://127.0.0.1:${port}/health`, {
|
|
45
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
46
|
+
});
|
|
47
|
+
return res.ok;
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function writeLock(path, info, exclusive) {
|
|
54
|
+
const body = JSON.stringify(info);
|
|
55
|
+
if (exclusive) {
|
|
56
|
+
const fd = openSync(path, 'wx');
|
|
57
|
+
try {
|
|
58
|
+
writeSync(fd, body);
|
|
59
|
+
}
|
|
60
|
+
finally {
|
|
61
|
+
closeSync(fd);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
// Steal: atomic tmp+rename so a concurrent reader never sees a torn file.
|
|
66
|
+
const tmp = `${path}.tmp`;
|
|
67
|
+
writeFileSync(tmp, body);
|
|
68
|
+
renameSync(tmp, path);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/** Read the current lock holder for a data dir (null when absent/corrupt). */
|
|
72
|
+
export function readLockInfo(dataDir) {
|
|
73
|
+
return readLock(lockPath(dataDir));
|
|
74
|
+
}
|
|
75
|
+
function readLock(path) {
|
|
76
|
+
try {
|
|
77
|
+
const parsed = JSON.parse(readFileSync(path, 'utf8'));
|
|
78
|
+
if (typeof parsed.pid !== 'number' || typeof parsed.port !== 'number')
|
|
79
|
+
return null;
|
|
80
|
+
return {
|
|
81
|
+
pid: parsed.pid,
|
|
82
|
+
port: parsed.port,
|
|
83
|
+
startedAt: typeof parsed.startedAt === 'string' ? parsed.startedAt : '',
|
|
84
|
+
version: typeof parsed.version === 'string' ? parsed.version : '',
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
// Unreadable/corrupt lock → treat as stale.
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Acquire the single-instance lock for `dataDir`.
|
|
94
|
+
*
|
|
95
|
+
* Throws AlreadyRunningError when a healthy daemon already holds it.
|
|
96
|
+
* Returns a handle whose release() is idempotent and safe from crash handlers.
|
|
97
|
+
*/
|
|
98
|
+
export async function acquireInstanceLock(dataDir, port, version, opts = {}) {
|
|
99
|
+
const path = lockPath(dataDir);
|
|
100
|
+
const probe = opts.healthProbe ?? healthOk;
|
|
101
|
+
const mine = { pid: process.pid, startedAt: new Date().toISOString(), port, version };
|
|
102
|
+
let exclusive = true;
|
|
103
|
+
if (existsSync(path)) {
|
|
104
|
+
const holder = readLock(path);
|
|
105
|
+
if (holder && pidAlive(holder.pid) && holder.pid !== process.pid) {
|
|
106
|
+
// PID alive — is it actually serving?
|
|
107
|
+
let healthy = false;
|
|
108
|
+
for (let i = 0; i < 3 && !healthy; i++) {
|
|
109
|
+
healthy = await probe(holder.port);
|
|
110
|
+
}
|
|
111
|
+
if (healthy)
|
|
112
|
+
throw new AlreadyRunningError(holder);
|
|
113
|
+
console.warn(`[astramem-local] daemon.lock held by pid ${holder.pid} but /health on port ${holder.port} ` +
|
|
114
|
+
`is unresponsive (3 probes) — treating as zombie and taking over the lock.`);
|
|
115
|
+
}
|
|
116
|
+
exclusive = false; // stale/zombie/corrupt → steal via tmp+rename
|
|
117
|
+
}
|
|
118
|
+
try {
|
|
119
|
+
writeLock(path, mine, exclusive);
|
|
120
|
+
}
|
|
121
|
+
catch (err) {
|
|
122
|
+
if (err.code === 'EEXIST') {
|
|
123
|
+
// Raced another starting daemon between existsSync and open('wx') —
|
|
124
|
+
// the other process won; defer to it.
|
|
125
|
+
const holder = readLock(path);
|
|
126
|
+
throw new AlreadyRunningError(holder ?? { pid: -1, port, startedAt: '', version: '' });
|
|
127
|
+
}
|
|
128
|
+
throw err;
|
|
129
|
+
}
|
|
130
|
+
let released = false;
|
|
131
|
+
return {
|
|
132
|
+
path,
|
|
133
|
+
release() {
|
|
134
|
+
if (released)
|
|
135
|
+
return;
|
|
136
|
+
released = true;
|
|
137
|
+
try {
|
|
138
|
+
// Only remove the lock if we still own it (a zombie-steal by a newer
|
|
139
|
+
// process must not be deleted by the old holder on its way out).
|
|
140
|
+
const current = readLock(path);
|
|
141
|
+
if (current && current.pid === process.pid)
|
|
142
|
+
unlinkSync(path);
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
/* best-effort — lock steal handles leftovers */
|
|
146
|
+
}
|
|
147
|
+
},
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=instance-lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instance-lock.js","sourceRoot":"","sources":["../../src/service/instance-lock.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ServiceAdapter, ServiceStatus, InstallResult } from './types.js';
|
|
2
|
+
export declare class LaunchdAdapter implements ServiceAdapter {
|
|
3
|
+
readonly platform: "darwin";
|
|
4
|
+
install(execPath: string, port: number): Promise<InstallResult>;
|
|
5
|
+
uninstall(): Promise<void>;
|
|
6
|
+
start(): Promise<void>;
|
|
7
|
+
stop(): Promise<void>;
|
|
8
|
+
status(): Promise<ServiceStatus>;
|
|
9
|
+
installBackupTimer(execPath: string, keep: number): Promise<void>;
|
|
10
|
+
uninstallBackupTimer(): Promise<void>;
|
|
11
|
+
}
|