@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,196 @@
|
|
|
1
|
+
import { exec } from 'node:child_process';
|
|
2
|
+
import { mkdirSync, writeFileSync, existsSync, unlinkSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { homedir } from 'node:os';
|
|
5
|
+
const LABEL = 'com.astragenie.astra-memoryd';
|
|
6
|
+
const PLIST_FILENAME = `${LABEL}.plist`;
|
|
7
|
+
const BACKUP_LABEL = 'com.astragenie.astra-memoryd-backup';
|
|
8
|
+
const BACKUP_PLIST_FILENAME = `${BACKUP_LABEL}.plist`;
|
|
9
|
+
function agentsDir() {
|
|
10
|
+
return join(homedir(), 'Library', 'LaunchAgents');
|
|
11
|
+
}
|
|
12
|
+
function plistPath() {
|
|
13
|
+
return join(agentsDir(), PLIST_FILENAME);
|
|
14
|
+
}
|
|
15
|
+
function backupPlistPath() {
|
|
16
|
+
return join(agentsDir(), BACKUP_PLIST_FILENAME);
|
|
17
|
+
}
|
|
18
|
+
function xmlEscape(s) {
|
|
19
|
+
return s
|
|
20
|
+
.replace(/&/g, '&')
|
|
21
|
+
.replace(/</g, '<')
|
|
22
|
+
.replace(/>/g, '>')
|
|
23
|
+
.replace(/"/g, '"')
|
|
24
|
+
.replace(/'/g, ''');
|
|
25
|
+
}
|
|
26
|
+
function buildBackupPlist(args, keep) {
|
|
27
|
+
const argItems = args.map(a => ` <string>${xmlEscape(a)}</string>`).join('\n');
|
|
28
|
+
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
29
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
30
|
+
<plist version="1.0">
|
|
31
|
+
<dict>
|
|
32
|
+
<key>Label</key>
|
|
33
|
+
<string>${BACKUP_LABEL}</string>
|
|
34
|
+
|
|
35
|
+
<key>ProgramArguments</key>
|
|
36
|
+
<array>
|
|
37
|
+
${argItems}
|
|
38
|
+
<string>backup</string>
|
|
39
|
+
<string>--keep</string>
|
|
40
|
+
<string>${keep}</string>
|
|
41
|
+
</array>
|
|
42
|
+
|
|
43
|
+
<key>StartCalendarInterval</key>
|
|
44
|
+
<dict>
|
|
45
|
+
<key>Hour</key>
|
|
46
|
+
<integer>3</integer>
|
|
47
|
+
<key>Minute</key>
|
|
48
|
+
<integer>0</integer>
|
|
49
|
+
</dict>
|
|
50
|
+
|
|
51
|
+
<key>StandardOutPath</key>
|
|
52
|
+
<string>${homedir()}/Library/Logs/astra-memoryd-backup.out.log</string>
|
|
53
|
+
<key>StandardErrorPath</key>
|
|
54
|
+
<string>${homedir()}/Library/Logs/astra-memoryd-backup.err.log</string>
|
|
55
|
+
</dict>
|
|
56
|
+
</plist>
|
|
57
|
+
`;
|
|
58
|
+
}
|
|
59
|
+
function buildPlist(args, port) {
|
|
60
|
+
const argItems = args.map(a => ` <string>${xmlEscape(a)}</string>`).join('\n');
|
|
61
|
+
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
62
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
63
|
+
<plist version="1.0">
|
|
64
|
+
<dict>
|
|
65
|
+
<key>Label</key>
|
|
66
|
+
<string>${LABEL}</string>
|
|
67
|
+
|
|
68
|
+
<key>ProgramArguments</key>
|
|
69
|
+
<array>
|
|
70
|
+
${argItems}
|
|
71
|
+
<string>serve</string>
|
|
72
|
+
<string>--port</string>
|
|
73
|
+
<string>${port}</string>
|
|
74
|
+
</array>
|
|
75
|
+
|
|
76
|
+
<key>RunAtLoad</key>
|
|
77
|
+
<true/>
|
|
78
|
+
|
|
79
|
+
<key>KeepAlive</key>
|
|
80
|
+
<dict>
|
|
81
|
+
<key>SuccessfulExit</key>
|
|
82
|
+
<false/>
|
|
83
|
+
</dict>
|
|
84
|
+
|
|
85
|
+
<key>StandardOutPath</key>
|
|
86
|
+
<string>${homedir()}/Library/Logs/astra-memoryd.out.log</string>
|
|
87
|
+
<key>StandardErrorPath</key>
|
|
88
|
+
<string>${homedir()}/Library/Logs/astra-memoryd.err.log</string>
|
|
89
|
+
</dict>
|
|
90
|
+
</plist>
|
|
91
|
+
`;
|
|
92
|
+
}
|
|
93
|
+
function runCmd(cmd) {
|
|
94
|
+
return new Promise((resolve, reject) => {
|
|
95
|
+
exec(cmd, { timeout: 10_000 }, (err, stdout, stderr) => {
|
|
96
|
+
if (err)
|
|
97
|
+
reject(new Error(`Command failed: ${cmd}\n${stderr || err.message}`));
|
|
98
|
+
else
|
|
99
|
+
resolve(stdout.trim());
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
/** Best-effort launchctl load/bootstrap for current macOS version. */
|
|
104
|
+
async function launchctlLoad(path) {
|
|
105
|
+
// macOS 10.15+ prefers bootstrap gui/$UID; older supports load
|
|
106
|
+
const uid = process.getuid?.() ?? '';
|
|
107
|
+
try {
|
|
108
|
+
await runCmd(`launchctl bootstrap gui/${uid} "${path}"`);
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
await runCmd(`launchctl load -w "${path}"`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
async function launchctlUnload(path) {
|
|
115
|
+
const uid = process.getuid?.() ?? '';
|
|
116
|
+
try {
|
|
117
|
+
await runCmd(`launchctl bootout gui/${uid} "${path}"`);
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
await runCmd(`launchctl unload -w "${path}"`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
export class LaunchdAdapter {
|
|
124
|
+
platform = 'darwin';
|
|
125
|
+
async install(execPath, port) {
|
|
126
|
+
mkdirSync(agentsDir(), { recursive: true });
|
|
127
|
+
// execPath formatted by resolveCliExecPath() as: "<nodeBin>" "<indexJs>"
|
|
128
|
+
// Parse double-quoted tokens so paths with spaces (e.g. /Users/Jane Smith/...)
|
|
129
|
+
// survive intact. Unquoted execPath falls back to whitespace split.
|
|
130
|
+
const args = Array.from(execPath.matchAll(/"([^"]+)"|(\S+)/g))
|
|
131
|
+
.map(m => m[1] ?? m[2] ?? '')
|
|
132
|
+
.filter(a => a.length > 0);
|
|
133
|
+
writeFileSync(plistPath(), buildPlist(args, port), 'utf8');
|
|
134
|
+
await launchctlLoad(plistPath());
|
|
135
|
+
return { kind: 'task' };
|
|
136
|
+
}
|
|
137
|
+
async uninstall() {
|
|
138
|
+
if (existsSync(plistPath())) {
|
|
139
|
+
try {
|
|
140
|
+
await launchctlUnload(plistPath());
|
|
141
|
+
}
|
|
142
|
+
catch { /* ignore if not loaded */ }
|
|
143
|
+
unlinkSync(plistPath());
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
async start() {
|
|
147
|
+
const uid = process.getuid?.() ?? '';
|
|
148
|
+
try {
|
|
149
|
+
await runCmd(`launchctl kickstart -k gui/${uid}/${LABEL}`);
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
await runCmd(`launchctl start ${LABEL}`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
async stop() {
|
|
156
|
+
const uid = process.getuid?.() ?? '';
|
|
157
|
+
try {
|
|
158
|
+
await runCmd(`launchctl kill TERM gui/${uid}/${LABEL}`);
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
await runCmd(`launchctl stop ${LABEL}`);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
async status() {
|
|
165
|
+
const installed = existsSync(plistPath());
|
|
166
|
+
if (!installed)
|
|
167
|
+
return { installed: false, running: false };
|
|
168
|
+
try {
|
|
169
|
+
const out = await runCmd(`launchctl list ${LABEL}`);
|
|
170
|
+
const running = out.includes('"PID"') || /\bPID\b.*=\s*[0-9]+/.test(out) || out.includes('running = 1');
|
|
171
|
+
return { installed, running, detail: out };
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
return { installed, running: false, detail: 'not loaded' };
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
async installBackupTimer(execPath, keep) {
|
|
178
|
+
mkdirSync(agentsDir(), { recursive: true });
|
|
179
|
+
const args = Array.from(execPath.matchAll(/"([^"]+)"|(\S+)/g))
|
|
180
|
+
.map(m => m[1] ?? m[2] ?? '')
|
|
181
|
+
.filter(a => a.length > 0);
|
|
182
|
+
writeFileSync(backupPlistPath(), buildBackupPlist(args, keep), 'utf8');
|
|
183
|
+
await launchctlLoad(backupPlistPath());
|
|
184
|
+
}
|
|
185
|
+
async uninstallBackupTimer() {
|
|
186
|
+
const bp = backupPlistPath();
|
|
187
|
+
if (existsSync(bp)) {
|
|
188
|
+
try {
|
|
189
|
+
await launchctlUnload(bp);
|
|
190
|
+
}
|
|
191
|
+
catch { /* ignore if not loaded */ }
|
|
192
|
+
unlinkSync(bp);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=launchd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launchd.js","sourceRoot":"","sources":["../../src/service/launchd.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { ServiceAdapter, ServiceStatus, InstallResult } from './types.js';
|
|
2
|
+
declare function startupScriptPath(): string;
|
|
3
|
+
declare function backupStartupScriptPath(): string;
|
|
4
|
+
export declare function runCmd(cmd: string): Promise<string>;
|
|
5
|
+
/**
|
|
6
|
+
* Best-effort elevation probe. `net session` succeeds only in an elevated
|
|
7
|
+
* shell; exit code 2 (access denied) means non-elevated. Used for DIAGNOSTICS
|
|
8
|
+
* only — never as a gate: schtasks is always attempted regardless.
|
|
9
|
+
*/
|
|
10
|
+
export declare function isElevated(): Promise<boolean>;
|
|
11
|
+
/**
|
|
12
|
+
* Split a possibly-quoted command line into executable + argument string.
|
|
13
|
+
* `"C:\Program Files\nodejs\node.exe" "C:\x\index.js"` →
|
|
14
|
+
* { command: 'C:\Program Files\nodejs\node.exe', args: '"C:\x\index.js"' }
|
|
15
|
+
*/
|
|
16
|
+
export declare function splitCommand(execPath: string): {
|
|
17
|
+
command: string;
|
|
18
|
+
args: string;
|
|
19
|
+
};
|
|
20
|
+
export declare class SchtasksAdapter implements ServiceAdapter {
|
|
21
|
+
readonly platform: "win32";
|
|
22
|
+
install(execPath: string, port: number): Promise<InstallResult>;
|
|
23
|
+
uninstall(): Promise<void>;
|
|
24
|
+
start(): Promise<void>;
|
|
25
|
+
stop(): Promise<void>;
|
|
26
|
+
status(): Promise<ServiceStatus>;
|
|
27
|
+
installBackupTimer(execPath: string, keep: number): Promise<void>;
|
|
28
|
+
uninstallBackupTimer(): Promise<void>;
|
|
29
|
+
}
|
|
30
|
+
/** Exported for tests — resolve the startup-shortcut path without constructing an adapter instance. */
|
|
31
|
+
export { startupScriptPath, backupStartupScriptPath };
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
import { exec } from 'node:child_process';
|
|
2
|
+
import { writeFileSync, unlinkSync, existsSync, mkdirSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { tmpdir } from 'node:os';
|
|
5
|
+
import { buildTaskXml, buildDailyTaskXml } from './task-xml.js';
|
|
6
|
+
const TASK_NAME = 'AstraMemoryD';
|
|
7
|
+
const BACKUP_TASK_NAME = 'AstraMemoryDBackup';
|
|
8
|
+
/** User-scope Startup folder. Files placed here auto-run at logon — no admin. */
|
|
9
|
+
function startupDir() {
|
|
10
|
+
const appdata = process.env['APPDATA'] ?? '';
|
|
11
|
+
return join(appdata, 'Microsoft', 'Windows', 'Start Menu', 'Programs', 'Startup');
|
|
12
|
+
}
|
|
13
|
+
function startupScriptPath() {
|
|
14
|
+
return join(startupDir(), 'AstraMemoryD.cmd');
|
|
15
|
+
}
|
|
16
|
+
function backupStartupScriptPath() {
|
|
17
|
+
return join(startupDir(), 'AstraMemoryDBackup.cmd');
|
|
18
|
+
}
|
|
19
|
+
export function runCmd(cmd) {
|
|
20
|
+
return new Promise((resolve, reject) => {
|
|
21
|
+
exec(cmd, { timeout: 15_000 }, (err, stdout, stderr) => {
|
|
22
|
+
if (err)
|
|
23
|
+
reject(new Error(`Command failed: ${cmd}\n${stderr || err.message}`));
|
|
24
|
+
else
|
|
25
|
+
resolve(stdout.trim());
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Best-effort elevation probe. `net session` succeeds only in an elevated
|
|
31
|
+
* shell; exit code 2 (access denied) means non-elevated. Used for DIAGNOSTICS
|
|
32
|
+
* only — never as a gate: schtasks is always attempted regardless.
|
|
33
|
+
*/
|
|
34
|
+
export async function isElevated() {
|
|
35
|
+
try {
|
|
36
|
+
await runCmd('net session');
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Properly quote a Windows command for schtasks /tr.
|
|
45
|
+
* schtasks requires the /tr value to be a single quoted string when it
|
|
46
|
+
* contains spaces. We wrap in double-quotes and escape internal double-quotes.
|
|
47
|
+
*/
|
|
48
|
+
function quoteForSchtasks(cmd) {
|
|
49
|
+
// Escape backslashes then double-quotes
|
|
50
|
+
const escaped = cmd.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
|
|
51
|
+
return `"${escaped}"`;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Split a possibly-quoted command line into executable + argument string.
|
|
55
|
+
* `"C:\Program Files\nodejs\node.exe" "C:\x\index.js"` →
|
|
56
|
+
* { command: 'C:\Program Files\nodejs\node.exe', args: '"C:\x\index.js"' }
|
|
57
|
+
*/
|
|
58
|
+
export function splitCommand(execPath) {
|
|
59
|
+
const trimmed = execPath.trim();
|
|
60
|
+
if (trimmed.startsWith('"')) {
|
|
61
|
+
const end = trimmed.indexOf('"', 1);
|
|
62
|
+
if (end > 0)
|
|
63
|
+
return { command: trimmed.slice(1, end), args: trimmed.slice(end + 1).trim() };
|
|
64
|
+
}
|
|
65
|
+
const sp = trimmed.indexOf(' ');
|
|
66
|
+
if (sp === -1)
|
|
67
|
+
return { command: trimmed, args: '' };
|
|
68
|
+
return { command: trimmed.slice(0, sp), args: trimmed.slice(sp + 1).trim() };
|
|
69
|
+
}
|
|
70
|
+
/** Current user's task-principal id: DOMAIN\user from whoami, else USERNAME. */
|
|
71
|
+
async function resolveUserId() {
|
|
72
|
+
try {
|
|
73
|
+
const out = await runCmd('whoami');
|
|
74
|
+
if (out)
|
|
75
|
+
return out;
|
|
76
|
+
}
|
|
77
|
+
catch { /* fall through */ }
|
|
78
|
+
return process.env['USERNAME'] ?? '';
|
|
79
|
+
}
|
|
80
|
+
/** Return true when the named scheduled task exists (regardless of state). */
|
|
81
|
+
async function taskExists(name) {
|
|
82
|
+
try {
|
|
83
|
+
await runCmd(`schtasks /query /tn "${name}" /fo LIST`);
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
export class SchtasksAdapter {
|
|
91
|
+
platform = 'win32';
|
|
92
|
+
async install(execPath, port) {
|
|
93
|
+
const tr = quoteForSchtasks(`${execPath} serve --port ${port}`);
|
|
94
|
+
const errors = [];
|
|
95
|
+
// Tier 0 — XML registration. The ONLY form that can express:
|
|
96
|
+
// ExecutionTimeLimit=PT0S (CLI-created tasks default to 72h — Task
|
|
97
|
+
// Scheduler silently kills the daemon after 3 days),
|
|
98
|
+
// logon trigger WITH a PT5M repetition (no-admin watchdog: re-run is a
|
|
99
|
+
// <100ms no-op while healthy thanks to the instance lock, and a dead
|
|
100
|
+
// daemon restarts within 5 minutes),
|
|
101
|
+
// MultipleInstancesPolicy=IgnoreNew, StartWhenAvailable.
|
|
102
|
+
try {
|
|
103
|
+
const userId = await resolveUserId();
|
|
104
|
+
const { command, args } = splitCommand(execPath);
|
|
105
|
+
const xml = buildTaskXml({
|
|
106
|
+
command,
|
|
107
|
+
args: [args, `serve --port ${port}`].filter(Boolean).join(' '),
|
|
108
|
+
userId,
|
|
109
|
+
});
|
|
110
|
+
const xmlPath = join(tmpdir(), 'AstraMemoryD.xml');
|
|
111
|
+
// Task Scheduler XML declares UTF-16 — write utf16le with an explicit
|
|
112
|
+
// BOM (FF FE) so schtasks parses the file as declared.
|
|
113
|
+
const bom = Buffer.from([0xff, 0xfe]);
|
|
114
|
+
writeFileSync(xmlPath, Buffer.concat([bom, Buffer.from(xml, 'utf16le')]));
|
|
115
|
+
await runCmd(`schtasks /create /tn "${TASK_NAME}" /xml "${xmlPath}" /f`);
|
|
116
|
+
return { kind: 'task' };
|
|
117
|
+
}
|
|
118
|
+
catch (err0) {
|
|
119
|
+
// Keep the FULL message — the actionable stderr (e.g. "ERROR: Access is
|
|
120
|
+
// denied.") is on line 2 and truncating it hides the root cause.
|
|
121
|
+
errors.push(`Tier 0 (XML): ${err0.message}`);
|
|
122
|
+
}
|
|
123
|
+
// Tier A — simplest CLI form: no /RU, no /IT. Task runs in the invoker's
|
|
124
|
+
// security context at logon. NOTE: carries the default 72h
|
|
125
|
+
// ExecutionTimeLimit — the keepalive that XML provides is absent, so this
|
|
126
|
+
// is strictly a fallback.
|
|
127
|
+
const cmdA = `schtasks /create /sc onlogon /tn "${TASK_NAME}" /tr ${tr} /RL LIMITED /f`;
|
|
128
|
+
try {
|
|
129
|
+
await runCmd(cmdA);
|
|
130
|
+
console.log(' · NOTE: task registered via CLI fallback — Task Scheduler applies a default');
|
|
131
|
+
console.log(' 72-hour execution limit and no keepalive. Prefer fixing the XML-tier error above.');
|
|
132
|
+
return { kind: 'task' };
|
|
133
|
+
}
|
|
134
|
+
catch (errA) {
|
|
135
|
+
errors.push(`Tier A: ${errA.message}`);
|
|
136
|
+
}
|
|
137
|
+
// Tier B — retry with /RU <user> /IT (current legacy behaviour). Some
|
|
138
|
+
// environments refuse Tier A but allow this form.
|
|
139
|
+
const user = process.env['USERNAME'] ?? '';
|
|
140
|
+
const ruFlag = user ? `/RU "${user}" /IT` : '';
|
|
141
|
+
const cmdB = `schtasks /create /sc onlogon /tn "${TASK_NAME}" /tr ${tr} ${ruFlag} /RL LIMITED /f`;
|
|
142
|
+
try {
|
|
143
|
+
await runCmd(cmdB);
|
|
144
|
+
return { kind: 'task' };
|
|
145
|
+
}
|
|
146
|
+
catch (errB) {
|
|
147
|
+
errors.push(`Tier B: ${errB.message}`);
|
|
148
|
+
}
|
|
149
|
+
// Tier C — Startup-folder shortcut. No admin required. Runs at next logon.
|
|
150
|
+
// Neither schtasks form worked — surface all errors so the user can
|
|
151
|
+
// diagnose WHY, then fall back gracefully.
|
|
152
|
+
const dir = startupDir();
|
|
153
|
+
if (!existsSync(dir))
|
|
154
|
+
mkdirSync(dir, { recursive: true });
|
|
155
|
+
const script = `@echo off\nstart "" /B ${execPath} serve --port ${port}\n`;
|
|
156
|
+
const scriptPath = startupScriptPath();
|
|
157
|
+
writeFileSync(scriptPath, script, 'utf8');
|
|
158
|
+
const elevated = await isElevated();
|
|
159
|
+
console.log(' · schtasks unavailable — tried two forms, both failed:');
|
|
160
|
+
for (const msg of errors) {
|
|
161
|
+
for (const line of msg.split('\n'))
|
|
162
|
+
console.log(` ${line}`);
|
|
163
|
+
}
|
|
164
|
+
console.log(` · running elevated: ${elevated ? 'yes' : 'no'}${elevated ? '' : ' — schtasks /create may require an Administrator shell on this system'}`);
|
|
165
|
+
console.log(` · installed Startup shortcut at:\n ${scriptPath}`);
|
|
166
|
+
return { kind: 'startup', path: scriptPath };
|
|
167
|
+
}
|
|
168
|
+
async uninstall() {
|
|
169
|
+
// Remove scheduled task if present (idempotent).
|
|
170
|
+
try {
|
|
171
|
+
await runCmd(`schtasks /delete /tn "${TASK_NAME}" /f`);
|
|
172
|
+
}
|
|
173
|
+
catch { /* not present */ }
|
|
174
|
+
// Remove Startup shortcut if present (idempotent).
|
|
175
|
+
const p = startupScriptPath();
|
|
176
|
+
if (existsSync(p)) {
|
|
177
|
+
try {
|
|
178
|
+
unlinkSync(p);
|
|
179
|
+
}
|
|
180
|
+
catch { /* ignore — parent process lock on Windows */ }
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
async start() {
|
|
184
|
+
if (!(await taskExists(TASK_NAME))) {
|
|
185
|
+
const startupPath = startupScriptPath();
|
|
186
|
+
if (existsSync(startupPath)) {
|
|
187
|
+
throw new Error(`AstraMemoryD scheduled task not found.\n` +
|
|
188
|
+
`This install used the Startup-shortcut fallback (schtasks was unavailable at install time).\n` +
|
|
189
|
+
`To start now: astramem-local serve --port <port>\n` +
|
|
190
|
+
`To install a proper scheduled task, re-run 'astramem-local service install' from an elevated shell.`);
|
|
191
|
+
}
|
|
192
|
+
throw new Error(`AstraMemoryD scheduled task not found.\n` +
|
|
193
|
+
`Run 'astramem-local service install' first.`);
|
|
194
|
+
}
|
|
195
|
+
await runCmd(`schtasks /run /tn "${TASK_NAME}"`);
|
|
196
|
+
}
|
|
197
|
+
async stop() {
|
|
198
|
+
if (!(await taskExists(TASK_NAME))) {
|
|
199
|
+
const startupPath = startupScriptPath();
|
|
200
|
+
if (existsSync(startupPath)) {
|
|
201
|
+
throw new Error(`AstraMemoryD scheduled task not found.\n` +
|
|
202
|
+
`This install used the Startup-shortcut fallback (schtasks was unavailable at install time).\n` +
|
|
203
|
+
`The daemon process was started outside schtasks — stop it with: astramem-local serve (Ctrl-C)\n` +
|
|
204
|
+
`Or kill the node process directly via Task Manager.`);
|
|
205
|
+
}
|
|
206
|
+
throw new Error(`AstraMemoryD scheduled task not found.\n` +
|
|
207
|
+
`Run 'astramem-local service install' first.`);
|
|
208
|
+
}
|
|
209
|
+
await runCmd(`schtasks /end /tn "${TASK_NAME}"`);
|
|
210
|
+
}
|
|
211
|
+
async status() {
|
|
212
|
+
const taskFound = await taskExists(TASK_NAME);
|
|
213
|
+
const startupPath = startupScriptPath();
|
|
214
|
+
const startupFound = existsSync(startupPath);
|
|
215
|
+
if (taskFound) {
|
|
216
|
+
try {
|
|
217
|
+
const out = await runCmd(`schtasks /query /tn "${TASK_NAME}" /fo LIST`);
|
|
218
|
+
const running = /Status:\s*Running/i.test(out);
|
|
219
|
+
return { installed: true, running, detail: out };
|
|
220
|
+
}
|
|
221
|
+
catch (err) {
|
|
222
|
+
return { installed: false, running: false, detail: String(err) };
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
if (startupFound) {
|
|
226
|
+
// Startup-shortcut fallback — no task, but logon autostart is present.
|
|
227
|
+
return {
|
|
228
|
+
installed: true,
|
|
229
|
+
running: false,
|
|
230
|
+
detail: `Installed via Startup shortcut (no scheduled task): ${startupPath}\n` +
|
|
231
|
+
`'service start/stop' will NOT work. To start: astramem-local serve --port <port>`,
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
return { installed: false, running: false, detail: 'Neither scheduled task nor Startup shortcut found.' };
|
|
235
|
+
}
|
|
236
|
+
async installBackupTimer(execPath, keep) {
|
|
237
|
+
// XML-first, same reason as the daemon task: the CLI /create form needs
|
|
238
|
+
// elevation on some boxes; a current-user XML registration does not.
|
|
239
|
+
try {
|
|
240
|
+
const userId = await resolveUserId();
|
|
241
|
+
const { command, args } = splitCommand(execPath);
|
|
242
|
+
const xml = buildDailyTaskXml({
|
|
243
|
+
command,
|
|
244
|
+
args: [args, `backup --keep ${keep}`].filter(Boolean).join(' '),
|
|
245
|
+
userId,
|
|
246
|
+
description: 'AstraMemory nightly verified backup. Managed by astramem-local reinstall / service install.',
|
|
247
|
+
});
|
|
248
|
+
const xmlPath = join(tmpdir(), 'AstraMemoryDBackup.xml');
|
|
249
|
+
const bom = Buffer.from([0xff, 0xfe]);
|
|
250
|
+
writeFileSync(xmlPath, Buffer.concat([bom, Buffer.from(xml, 'utf16le')]));
|
|
251
|
+
await runCmd(`schtasks /create /tn "${BACKUP_TASK_NAME}" /xml "${xmlPath}" /f`);
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
catch {
|
|
255
|
+
// fall through to legacy CLI form
|
|
256
|
+
}
|
|
257
|
+
const tr = quoteForSchtasks(`${execPath} backup --keep ${keep}`);
|
|
258
|
+
const user = process.env['USERNAME'] ?? '';
|
|
259
|
+
const ruFlag = user ? `/RU "${user}" /IT` : '';
|
|
260
|
+
const cmd = `schtasks /create /sc DAILY /st 03:00 /tn "${BACKUP_TASK_NAME}" /tr ${tr} ${ruFlag} /RL LIMITED /f`;
|
|
261
|
+
await runCmd(cmd);
|
|
262
|
+
}
|
|
263
|
+
async uninstallBackupTimer() {
|
|
264
|
+
try {
|
|
265
|
+
await runCmd(`schtasks /delete /tn "${BACKUP_TASK_NAME}" /f`);
|
|
266
|
+
}
|
|
267
|
+
catch {
|
|
268
|
+
// Task may not exist — ignore
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
/** Exported for tests — resolve the startup-shortcut path without constructing an adapter instance. */
|
|
273
|
+
export { startupScriptPath, backupStartupScriptPath };
|
|
274
|
+
//# sourceMappingURL=schtasks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schtasks.js","sourceRoot":"","sources":["../../src/service/schtasks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface ShimPointer {
|
|
2
|
+
nodeBin: string;
|
|
3
|
+
entryJs: string;
|
|
4
|
+
port: number;
|
|
5
|
+
/** When set, the launcher exports ASTRA_LOG_DIR so the daemon rotates its
|
|
6
|
+
* JSON logs there (service mode) instead of writing to a discarded stdout. */
|
|
7
|
+
logDir?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface ShimPaths {
|
|
10
|
+
binDir: string;
|
|
11
|
+
cmdPath: string;
|
|
12
|
+
launcherPath: string;
|
|
13
|
+
pointerPath: string;
|
|
14
|
+
}
|
|
15
|
+
/** Stable bin dir: <localAppData>\Astramem\bin (same root as the data dir). */
|
|
16
|
+
export declare function shimPaths(localAppData?: string): ShimPaths;
|
|
17
|
+
/**
|
|
18
|
+
* Write (or overwrite) the stable shim trio. Idempotent — we own the whole
|
|
19
|
+
* file contents, so a plain overwrite is safe and self-healing.
|
|
20
|
+
*/
|
|
21
|
+
export declare function writeShim(pointer: ShimPointer, paths?: ShimPaths): ShimPaths;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* shim.ts — stable launcher shim for the Windows service (D1).
|
|
3
|
+
*
|
|
4
|
+
* The scheduled task points FOREVER at a stable path:
|
|
5
|
+
* %LOCALAPPDATA%\Astramem\bin\astramemd.cmd
|
|
6
|
+
* which runs
|
|
7
|
+
* %LOCALAPPDATA%\Astramem\bin\launch.cjs
|
|
8
|
+
* which reads
|
|
9
|
+
* %LOCALAPPDATA%\Astramem\bin\current.json { nodeBin, entryJs, port }
|
|
10
|
+
* and spawns the daemon.
|
|
11
|
+
*
|
|
12
|
+
* Upgrades rewrite current.json only — schtasks is never touched again, so
|
|
13
|
+
* the one failure mode that requires elevation (task registration) can only
|
|
14
|
+
* occur once, at first install. This also kills the stale-baked-path bug
|
|
15
|
+
* where the task kept launching whichever build happened to run
|
|
16
|
+
* `service install`.
|
|
17
|
+
*/
|
|
18
|
+
import { writeFileSync, mkdirSync } from 'node:fs';
|
|
19
|
+
import { join } from 'node:path';
|
|
20
|
+
/** Stable bin dir: <localAppData>\Astramem\bin (same root as the data dir). */
|
|
21
|
+
export function shimPaths(localAppData) {
|
|
22
|
+
const base = localAppData ?? process.env['LOCALAPPDATA'] ?? '';
|
|
23
|
+
const binDir = join(base, 'Astramem', 'bin');
|
|
24
|
+
return {
|
|
25
|
+
binDir,
|
|
26
|
+
cmdPath: join(binDir, 'astramemd.cmd'),
|
|
27
|
+
launcherPath: join(binDir, 'launch.cjs'),
|
|
28
|
+
pointerPath: join(binDir, 'current.json'),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* launch.cjs — plain CommonJS so the shim works with any Node the pointer
|
|
33
|
+
* names, regardless of the package's ESM setup. Kept dependency-free.
|
|
34
|
+
*
|
|
35
|
+
* Uses spawnSync (not detached spawn): the scheduled task's own process
|
|
36
|
+
* lifetime then matches the daemon's, so Task Scheduler status reflects
|
|
37
|
+
* reality and `schtasks /end` can actually stop the daemon.
|
|
38
|
+
*/
|
|
39
|
+
const LAUNCHER_SOURCE = `// astramem-local service launcher — generated by 'service install' / 'reinstall'.
|
|
40
|
+
// Reads current.json (written on every install/upgrade) and runs the daemon.
|
|
41
|
+
'use strict';
|
|
42
|
+
const { readFileSync } = require('node:fs');
|
|
43
|
+
const { spawnSync } = require('node:child_process');
|
|
44
|
+
const { join } = require('node:path');
|
|
45
|
+
|
|
46
|
+
const pointerPath = join(__dirname, 'current.json');
|
|
47
|
+
let ptr;
|
|
48
|
+
try {
|
|
49
|
+
ptr = JSON.parse(readFileSync(pointerPath, 'utf8'));
|
|
50
|
+
} catch (err) {
|
|
51
|
+
console.error('[astramemd-shim] cannot read ' + pointerPath + ': ' + err.message);
|
|
52
|
+
console.error('[astramemd-shim] run: astramem-local reinstall');
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
if (!ptr.nodeBin || !ptr.entryJs) {
|
|
56
|
+
console.error('[astramemd-shim] current.json missing nodeBin/entryJs — run: astramem-local reinstall');
|
|
57
|
+
process.exit(1);
|
|
58
|
+
}
|
|
59
|
+
const env = { ...process.env };
|
|
60
|
+
if (ptr.logDir) env.ASTRA_LOG_DIR = ptr.logDir; // service mode: rotated file logs
|
|
61
|
+
const args = [ptr.entryJs, 'serve', '--port', String(ptr.port || 7777)];
|
|
62
|
+
const res = spawnSync(ptr.nodeBin, args, { stdio: 'inherit', env });
|
|
63
|
+
process.exit(res.status === null ? 1 : res.status);
|
|
64
|
+
`;
|
|
65
|
+
/**
|
|
66
|
+
* Write (or overwrite) the stable shim trio. Idempotent — we own the whole
|
|
67
|
+
* file contents, so a plain overwrite is safe and self-healing.
|
|
68
|
+
*/
|
|
69
|
+
export function writeShim(pointer, paths = shimPaths()) {
|
|
70
|
+
mkdirSync(paths.binDir, { recursive: true });
|
|
71
|
+
// The cmd resolves node from the pointer at run time via launch.cjs; the
|
|
72
|
+
// cmd itself only needs SOME node on PATH-less systems, so it uses the
|
|
73
|
+
// pointer's nodeBin directly to run the launcher too.
|
|
74
|
+
const cmd = `@echo off\r\n"${pointer.nodeBin}" "${paths.launcherPath}"\r\n`;
|
|
75
|
+
writeFileSync(paths.cmdPath, cmd, 'utf8');
|
|
76
|
+
writeFileSync(paths.launcherPath, LAUNCHER_SOURCE, 'utf8');
|
|
77
|
+
writeFileSync(paths.pointerPath, JSON.stringify(pointer, null, 2) + '\n', 'utf8');
|
|
78
|
+
return paths;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=shim.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shim.js","sourceRoot":"","sources":["../../src/service/shim.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAkBjC,+EAA+E;AAC/E,MAAM,UAAU,SAAS,CAAC,YAAqB;IAC7C,MAAM,IAAI,GAAG,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;IAC7C,OAAO;QACL,MAAM;QACN,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC;QACtC,YAAY,EAAE,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC;QACxC,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC;KAC1C,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;CAyBvB,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,OAAoB,EAAE,QAAmB,SAAS,EAAE;IAC5E,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,yEAAyE;IACzE,uEAAuE;IACvE,sDAAsD;IACtD,MAAM,GAAG,GAAG,iBAAiB,OAAO,CAAC,OAAO,MAAM,KAAK,CAAC,YAAY,OAAO,CAAC;IAC5E,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IAC1C,aAAa,CAAC,KAAK,CAAC,YAAY,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;IAC3D,aAAa,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;IAClF,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ServiceAdapter, ServiceStatus, InstallResult } from './types.js';
|
|
2
|
+
export declare class SystemdAdapter implements ServiceAdapter {
|
|
3
|
+
readonly platform: "linux";
|
|
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
|
+
}
|