@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,365 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* dashboard-html.ts — server-side HTML renderer for /dashboard.
|
|
3
|
+
*
|
|
4
|
+
* FEAT-410 SLICE-410-4: Mission Control rewrite (design doc §4). Renders
|
|
5
|
+
* against the ACTUAL DashboardData/DashboardHealth shapes exported by
|
|
6
|
+
* queries/dashboard.ts (SLICE-410-1) — not the design-doc mockup's literal
|
|
7
|
+
* field names.
|
|
8
|
+
*
|
|
9
|
+
* Zero runtime dependencies: pure string concatenation.
|
|
10
|
+
* No JS in output. <meta refresh> drives auto-poll.
|
|
11
|
+
* Target: < 20 KB gzipped.
|
|
12
|
+
*/
|
|
13
|
+
import { PKG_VERSION, WIRE_VERSIONS_SUPPORTED, SCHEMA_VERSION } from '../lib/wire-meta.js';
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
// Helpers (carried over from the pre-Mission-Control renderer)
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
function esc(s) {
|
|
18
|
+
return s
|
|
19
|
+
.replace(/&/g, '&')
|
|
20
|
+
.replace(/</g, '<')
|
|
21
|
+
.replace(/>/g, '>')
|
|
22
|
+
.replace(/"/g, '"');
|
|
23
|
+
}
|
|
24
|
+
function fmtTime(epochMs) {
|
|
25
|
+
try {
|
|
26
|
+
// Local-first: the daemon runs on the operator's own machine, so the OS
|
|
27
|
+
// locale/timezone IS the client's — render local time, not UTC.
|
|
28
|
+
return new Date(epochMs).toLocaleTimeString(undefined, { hour12: false });
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return '??:??:??';
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function truncate(s, max) {
|
|
35
|
+
if (s.length <= max)
|
|
36
|
+
return s;
|
|
37
|
+
return s.slice(0, max) + '…';
|
|
38
|
+
}
|
|
39
|
+
function fmtAgeMs(ms) {
|
|
40
|
+
if (ms < 0)
|
|
41
|
+
return '0s';
|
|
42
|
+
if (ms < 60_000)
|
|
43
|
+
return `${Math.floor(ms / 1000)}s`;
|
|
44
|
+
if (ms < 3_600_000)
|
|
45
|
+
return `${Math.floor(ms / 60_000)}m`;
|
|
46
|
+
return `${Math.floor(ms / 3_600_000)}h`;
|
|
47
|
+
}
|
|
48
|
+
function fmtBytes(bytes) {
|
|
49
|
+
const gb = bytes / (1024 * 1024 * 1024);
|
|
50
|
+
if (gb >= 1)
|
|
51
|
+
return `${gb.toFixed(1)}GB`;
|
|
52
|
+
const mb = bytes / (1024 * 1024);
|
|
53
|
+
return `${mb.toFixed(0)}MB`;
|
|
54
|
+
}
|
|
55
|
+
function budgetColor(spend, cap) {
|
|
56
|
+
if (cap <= 0)
|
|
57
|
+
return '#888';
|
|
58
|
+
const pct = spend / cap;
|
|
59
|
+
if (pct >= 0.8)
|
|
60
|
+
return '#e74c3c';
|
|
61
|
+
if (pct >= 0.5)
|
|
62
|
+
return '#f39c12';
|
|
63
|
+
return '#2ecc71';
|
|
64
|
+
}
|
|
65
|
+
function fmtRate(rate) {
|
|
66
|
+
return rate === null ? 'n/a' : `${(rate * 100).toFixed(1)}%`;
|
|
67
|
+
}
|
|
68
|
+
// ---------------------------------------------------------------------------
|
|
69
|
+
// Inline CSS
|
|
70
|
+
// ---------------------------------------------------------------------------
|
|
71
|
+
const CSS = `
|
|
72
|
+
*{box-sizing:border-box;margin:0;padding:0}
|
|
73
|
+
body{background:#1a1a1a;color:#e0e0e0;font-family:monospace;font-size:13px;line-height:1.5;padding:16px}
|
|
74
|
+
h1{font-size:18px;color:#fff;display:inline-block}
|
|
75
|
+
.meta{color:#888;font-size:12px}
|
|
76
|
+
.meta span{color:#ccc}
|
|
77
|
+
nav{display:flex;align-items:center;gap:16px;margin:10px 0 16px;padding-bottom:8px;border-bottom:1px solid #333;font-size:12px}
|
|
78
|
+
nav a{color:#888;text-decoration:none}
|
|
79
|
+
nav a:hover{color:#3a7bd5}
|
|
80
|
+
nav .active{color:#fff;font-weight:bold}
|
|
81
|
+
nav .asof{margin-left:auto;color:#666}
|
|
82
|
+
section{margin-bottom:20px}
|
|
83
|
+
.banner{padding:8px 12px;border-radius:4px;font-size:13px;display:flex;gap:18px;flex-wrap:wrap;align-items:center}
|
|
84
|
+
.banner.ok{background:#132a1c;border:1px solid #1f5c34}
|
|
85
|
+
.banner.degraded{background:#2a1414;border:1px solid #5c1f1f}
|
|
86
|
+
.banner .dot{font-size:16px}
|
|
87
|
+
.pipeline-title,.strip h3{font-size:11px;color:#888;text-transform:uppercase;letter-spacing:.05em;margin-bottom:6px}
|
|
88
|
+
.pipeline{display:flex;justify-content:space-between;gap:4px;padding:10px 4px;background:#1e1e1e;border-radius:4px;overflow-x:auto}
|
|
89
|
+
.stage{flex:1;min-width:90px;text-align:center;padding:0 4px}
|
|
90
|
+
.stage .name{color:#aaa;font-size:11px;text-transform:uppercase}
|
|
91
|
+
.stage .val{font-size:14px;margin-top:4px;font-variant-numeric:tabular-nums}
|
|
92
|
+
.arrow{color:#555;align-self:center;padding:0 2px}
|
|
93
|
+
.strips{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-bottom:12px}
|
|
94
|
+
.strips2{display:grid;grid-template-columns:1fr 1fr;gap:12px}
|
|
95
|
+
.strip{background:#1e1e1e;border-radius:4px;padding:10px 12px}
|
|
96
|
+
.strip .big{font-size:18px}
|
|
97
|
+
table{width:100%;border-collapse:collapse;font-size:12px}
|
|
98
|
+
th{background:#222;color:#aaa;text-align:left;padding:5px 8px;font-weight:normal;text-transform:uppercase;letter-spacing:.04em}
|
|
99
|
+
td{padding:4px 8px;border-bottom:1px solid #252525;font-variant-numeric:tabular-nums}
|
|
100
|
+
tr:nth-child(odd) td{background:#1e1e1e}
|
|
101
|
+
.badge{display:inline-block;padding:1px 6px;border-radius:3px;font-size:11px}
|
|
102
|
+
.num{text-align:right;font-variant-numeric:tabular-nums}
|
|
103
|
+
.trunc{max-width:360px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
104
|
+
.ok{color:#2ecc71}
|
|
105
|
+
.warn{color:#f39c12}
|
|
106
|
+
.err{color:#e74c3c}
|
|
107
|
+
.muted{color:#666}
|
|
108
|
+
`.trim();
|
|
109
|
+
/** AC-1/AC-2: OK only when embed.ok===true AND worker.alive===true; any other
|
|
110
|
+
* combination (including embed.ok===false or worker.alive===false) is
|
|
111
|
+
* DEGRADED, naming the failing subsystem(s). Unlike healthState.status()
|
|
112
|
+
* (which only tracks embed), the banner also treats a dead worker as
|
|
113
|
+
* degraded per AC-2. `null` health (no HealthState wired) reports UNKNOWN
|
|
114
|
+
* rather than claiming OK — the page still renders fully either way. */
|
|
115
|
+
function bannerStatus(health) {
|
|
116
|
+
if (health === null)
|
|
117
|
+
return { label: 'UNKNOWN', failing: [] };
|
|
118
|
+
const failing = [];
|
|
119
|
+
if (health.embed.ok !== true)
|
|
120
|
+
failing.push('embed');
|
|
121
|
+
if (!health.worker.alive)
|
|
122
|
+
failing.push('worker');
|
|
123
|
+
return { label: failing.length > 0 ? 'DEGRADED' : 'OK', failing };
|
|
124
|
+
}
|
|
125
|
+
function renderBanner(health) {
|
|
126
|
+
const { label, failing } = bannerStatus(health);
|
|
127
|
+
const cls = label === 'OK' ? 'ok' : label === 'DEGRADED' ? 'degraded' : '';
|
|
128
|
+
const dotColor = label === 'OK' ? '#2ecc71' : label === 'DEGRADED' ? '#e74c3c' : '#888';
|
|
129
|
+
if (health === null) {
|
|
130
|
+
return `<div class="banner ${cls}">
|
|
131
|
+
<span class="dot" style="color:${dotColor}">●</span>
|
|
132
|
+
<span><strong>DAEMON UNKNOWN</strong></span>
|
|
133
|
+
<span class="muted">no health state wired</span>
|
|
134
|
+
</div>`;
|
|
135
|
+
}
|
|
136
|
+
const embedOk = health.embed.ok;
|
|
137
|
+
const embedLabel = embedOk === true
|
|
138
|
+
? '<span class="ok">embed:ok</span>'
|
|
139
|
+
: embedOk === false
|
|
140
|
+
? `<span class="err">embed:FAIL${health.embed.lastError ? ` (${esc(truncate(health.embed.lastError, 40))})` : ''}</span>`
|
|
141
|
+
: '<span class="muted">embed:starting</span>';
|
|
142
|
+
const workerLabel = health.worker.alive
|
|
143
|
+
? `<span class="ok">worker:alive${health.worker.lastTickAgoMs !== null ? ` (${fmtAgeMs(health.worker.lastTickAgoMs)} ago)` : ''}</span>`
|
|
144
|
+
: '<span class="err">worker:DEAD</span>';
|
|
145
|
+
const diskLabel = health.diskFreeBytes !== null
|
|
146
|
+
? `<span class="muted">disk:${fmtBytes(health.diskFreeBytes)} free</span>`
|
|
147
|
+
: '<span class="muted">disk:n/a</span>';
|
|
148
|
+
const failingNote = failing.length > 0
|
|
149
|
+
? ` <span class="err">(failing: ${failing.map(esc).join(', ')})</span>`
|
|
150
|
+
: '';
|
|
151
|
+
return `<div class="banner ${cls}">
|
|
152
|
+
<span class="dot" style="color:${dotColor}">●</span>
|
|
153
|
+
<span><strong>DAEMON ${label}</strong>${failingNote}</span>
|
|
154
|
+
${embedLabel}
|
|
155
|
+
${workerLabel}
|
|
156
|
+
${diskLabel}
|
|
157
|
+
</div>`;
|
|
158
|
+
}
|
|
159
|
+
// ---------------------------------------------------------------------------
|
|
160
|
+
// Pipeline row
|
|
161
|
+
// ---------------------------------------------------------------------------
|
|
162
|
+
function stageCounts(byKind, kind) {
|
|
163
|
+
let pending = 0;
|
|
164
|
+
let running = 0;
|
|
165
|
+
for (const row of byKind) {
|
|
166
|
+
if (row.kind !== kind)
|
|
167
|
+
continue;
|
|
168
|
+
if (row.state === 'pending')
|
|
169
|
+
pending = row.count;
|
|
170
|
+
if (row.state === 'running')
|
|
171
|
+
running = row.count;
|
|
172
|
+
}
|
|
173
|
+
return { pending, running };
|
|
174
|
+
}
|
|
175
|
+
function renderPipeline(data) {
|
|
176
|
+
const ingested24h = data.hourlyThroughput.reduce((sum, r) => sum + r.count, 0);
|
|
177
|
+
const distill = stageCounts(data.jobStatesByKind, 'distill');
|
|
178
|
+
const consolidate = stageCounts(data.jobStatesByKind, 'consolidate');
|
|
179
|
+
const reembed = stageCounts(data.jobStatesByKind, 'reembed');
|
|
180
|
+
const stages = [
|
|
181
|
+
{ name: 'ingest', val: `${ingested24h}<span class="muted"> /24h</span>` },
|
|
182
|
+
{ name: 'distill', val: `${distill.pending}p / ${distill.running}r` },
|
|
183
|
+
{ name: 'entity-link', val: `${data.entityLinkage.entityCount} ent / ${data.entityLinkage.unlinkedMemoryCount} unlinked` },
|
|
184
|
+
{ name: 'embed', val: `${reembed.pending}p / ${reembed.running}r` },
|
|
185
|
+
{ name: 'consolidate', val: `${consolidate.pending}p / ${consolidate.running}r` },
|
|
186
|
+
{ name: 'index', val: '<span class="ok">ok</span>' },
|
|
187
|
+
];
|
|
188
|
+
const cells = stages.map((s, i) => {
|
|
189
|
+
const arrow = i > 0 ? '<span class="arrow">→</span>' : '';
|
|
190
|
+
return `${arrow}<div class="stage"><div class="name">${esc(s.name)}</div><div class="val">${s.val}</div></div>`;
|
|
191
|
+
}).join('');
|
|
192
|
+
return `<div class="pipeline-title">Pipeline</div>
|
|
193
|
+
<div class="pipeline">${cells}</div>`;
|
|
194
|
+
}
|
|
195
|
+
// ---------------------------------------------------------------------------
|
|
196
|
+
// Jobs / Consolidation / Providers strip
|
|
197
|
+
// ---------------------------------------------------------------------------
|
|
198
|
+
function jobStateTotal(states, state) {
|
|
199
|
+
return states.find(s => s.state === state)?.count ?? 0;
|
|
200
|
+
}
|
|
201
|
+
function renderJobsStrip(data) {
|
|
202
|
+
const pending = jobStateTotal(data.jobStates, 'pending');
|
|
203
|
+
const running = jobStateTotal(data.jobStates, 'running');
|
|
204
|
+
const failed = jobStateTotal(data.jobStates, 'failed');
|
|
205
|
+
const poison = jobStateTotal(data.jobStates, 'poison');
|
|
206
|
+
const poisonCls = poison > 0 ? 'err' : 'muted';
|
|
207
|
+
return `<div class="strip">
|
|
208
|
+
<h3>Jobs</h3>
|
|
209
|
+
<div>pending <strong>${pending}</strong> running <strong>${running}</strong></div>
|
|
210
|
+
<div>failed <strong>${failed}</strong> poison <strong class="${poisonCls}">${poison}</strong>${poison > 0 ? ' ⚠' : ''}</div>
|
|
211
|
+
<div class="muted"><a href="/dashboard/jobs" style="color:#3a7bd5">view jobs →</a></div>
|
|
212
|
+
</div>`;
|
|
213
|
+
}
|
|
214
|
+
function renderConsolidationStrip(data) {
|
|
215
|
+
const { count, oldest } = data.consolidation;
|
|
216
|
+
const body = count === 0
|
|
217
|
+
? '<div class="muted">0 pending proposals</div>'
|
|
218
|
+
: `<div>● <strong>${count}</strong> pending proposal${count === 1 ? '' : 's'}</div>
|
|
219
|
+
<div class="muted">oldest: ${oldest !== null ? fmtAgeMs(Date.now() - oldest) : '—'}</div>`;
|
|
220
|
+
return `<div class="strip">
|
|
221
|
+
<h3>Consolidation</h3>
|
|
222
|
+
${body}
|
|
223
|
+
<div class="muted"><a href="/dashboard/consolidation" style="color:#3a7bd5">resolve →</a></div>
|
|
224
|
+
</div>`;
|
|
225
|
+
}
|
|
226
|
+
function renderProvidersStrip(data) {
|
|
227
|
+
if (data.providers.length === 0) {
|
|
228
|
+
return `<div class="strip">
|
|
229
|
+
<h3>Providers / Storage</h3>
|
|
230
|
+
<div class="muted">no providers registered</div>
|
|
231
|
+
</div>`;
|
|
232
|
+
}
|
|
233
|
+
const rows = data.providers.map(p => {
|
|
234
|
+
const ok = p.last_health_ok ? '<span class="ok">OK</span>' : '<span class="err">FAIL</span>';
|
|
235
|
+
const dim = p.dim ?? '—';
|
|
236
|
+
return `<div>${esc(p.provider)}/${esc(p.model)} <span class="muted">${dim}-dim</span> · ${ok}</div>`;
|
|
237
|
+
}).join('');
|
|
238
|
+
return `<div class="strip">
|
|
239
|
+
<h3>Providers / Storage</h3>
|
|
240
|
+
${rows}
|
|
241
|
+
</div>`;
|
|
242
|
+
}
|
|
243
|
+
// ---------------------------------------------------------------------------
|
|
244
|
+
// Budget + usefulness tiles (collapsed per AC-5)
|
|
245
|
+
// ---------------------------------------------------------------------------
|
|
246
|
+
function renderBudgetTile(data, dailyCap) {
|
|
247
|
+
const todayUsd = data.todaySpend?.usd_total ?? 0;
|
|
248
|
+
const color = budgetColor(todayUsd, dailyCap);
|
|
249
|
+
return `<div class="strip">
|
|
250
|
+
<h3>Budget</h3>
|
|
251
|
+
<div class="big" style="color:${color}">$${todayUsd.toFixed(2)} <span class="muted" style="font-size:12px">/ cap $${dailyCap.toFixed(2)}</span></div>
|
|
252
|
+
</div>`;
|
|
253
|
+
}
|
|
254
|
+
function renderUsefulnessTile(usefulness) {
|
|
255
|
+
return `<div class="strip">
|
|
256
|
+
<h3>Usefulness (7d)</h3>
|
|
257
|
+
<div class="big">${fmtRate(usefulness.rate)}</div>
|
|
258
|
+
<div class="muted">of ${usefulness.served} served recalls marked used (${usefulness.used})</div>
|
|
259
|
+
</div>`;
|
|
260
|
+
}
|
|
261
|
+
/** AC-5: replaces the old full 25-row "recent captures" table with a merged
|
|
262
|
+
* feed of failures (from recentFailedJobs) and a handful of new memories
|
|
263
|
+
* (from recentMemories), newest first. Individual consolidation proposals
|
|
264
|
+
* aren't in this feed — queryDashboard only exposes the aggregate
|
|
265
|
+
* ConsolidationSummary (count/oldest), which the Consolidation strip above
|
|
266
|
+
* already surfaces; per-row proposal entries belong to the dedicated
|
|
267
|
+
* /dashboard/consolidation page. */
|
|
268
|
+
function renderActivityFeed(data) {
|
|
269
|
+
const rows = [];
|
|
270
|
+
for (const job of data.recentFailedJobs) {
|
|
271
|
+
const stateCls = job.state === 'poison' ? 'err' : 'warn';
|
|
272
|
+
const err = job.last_error ? esc(truncate(job.last_error, 60)) : '<span class="muted">(no error text)</span>';
|
|
273
|
+
rows.push({
|
|
274
|
+
ts: job.updated_at,
|
|
275
|
+
html: `<tr>
|
|
276
|
+
<td class="muted" style="width:90px">${esc(fmtTime(job.updated_at))}</td>
|
|
277
|
+
<td><span class="badge ${stateCls}">${esc(job.state)}</span></td>
|
|
278
|
+
<td>${esc(job.kind)}</td>
|
|
279
|
+
<td class="trunc">${err}</td>
|
|
280
|
+
</tr>`,
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
for (const mem of data.recentMemories.slice(0, 8)) {
|
|
284
|
+
rows.push({
|
|
285
|
+
ts: mem.created_at,
|
|
286
|
+
html: `<tr>
|
|
287
|
+
<td class="muted" style="width:90px">${esc(fmtTime(mem.created_at))}</td>
|
|
288
|
+
<td><span class="badge" style="background:#2a2a2a;color:#aaa">memory</span></td>
|
|
289
|
+
<td>${esc(mem.type)}</td>
|
|
290
|
+
<td class="trunc">${esc(truncate(mem.text, 70))}</td>
|
|
291
|
+
</tr>`,
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
if (rows.length === 0) {
|
|
295
|
+
return '<p class="muted">No recent activity.</p>';
|
|
296
|
+
}
|
|
297
|
+
rows.sort((a, b) => b.ts - a.ts);
|
|
298
|
+
const trs = rows.slice(0, 15).map(r => r.html).join('');
|
|
299
|
+
return `<table>
|
|
300
|
+
<thead><tr><th>Time</th><th>Kind</th><th>Detail</th><th>Info</th></tr></thead>
|
|
301
|
+
<tbody>${trs}</tbody>
|
|
302
|
+
</table>`;
|
|
303
|
+
}
|
|
304
|
+
// ---------------------------------------------------------------------------
|
|
305
|
+
// Main export
|
|
306
|
+
// ---------------------------------------------------------------------------
|
|
307
|
+
export function renderDashboard(data, config) {
|
|
308
|
+
const now = new Date().toLocaleString(undefined, { hour12: false });
|
|
309
|
+
const dailyCap = config.budget.daily_usd;
|
|
310
|
+
const { label } = bannerStatus(data.health);
|
|
311
|
+
const statusColor = label === 'OK' ? '#2ecc71' : label === 'DEGRADED' ? '#e74c3c' : '#888';
|
|
312
|
+
return `<!DOCTYPE html>
|
|
313
|
+
<html lang="en">
|
|
314
|
+
<head>
|
|
315
|
+
<meta charset="utf-8">
|
|
316
|
+
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
317
|
+
<meta http-equiv="refresh" content="5">
|
|
318
|
+
<title>AstraMemory Dashboard</title>
|
|
319
|
+
<style>${CSS}</style>
|
|
320
|
+
</head>
|
|
321
|
+
<body>
|
|
322
|
+
<h1>AstraMemory Local</h1>
|
|
323
|
+
<span class="meta">
|
|
324
|
+
v${esc(PKG_VERSION)} ·
|
|
325
|
+
schema ${SCHEMA_VERSION} ·
|
|
326
|
+
wire: ${esc(WIRE_VERSIONS_SUPPORTED.join(', '))} ·
|
|
327
|
+
<span style="color:${statusColor}">${label}</span> ●
|
|
328
|
+
</span>
|
|
329
|
+
|
|
330
|
+
<nav>
|
|
331
|
+
<span class="active">Mission Control</span>
|
|
332
|
+
<a href="/dashboard/jobs">Jobs</a>
|
|
333
|
+
<a href="/dashboard/consolidation">Consolidation</a>
|
|
334
|
+
<a href="/dashboard/search">Search</a>
|
|
335
|
+
<a href="/dashboard/api">API</a>
|
|
336
|
+
<span class="asof">as of ${esc(now)}</span>
|
|
337
|
+
</nav>
|
|
338
|
+
|
|
339
|
+
<section>
|
|
340
|
+
${renderBanner(data.health)}
|
|
341
|
+
</section>
|
|
342
|
+
|
|
343
|
+
<section>
|
|
344
|
+
${renderPipeline(data)}
|
|
345
|
+
</section>
|
|
346
|
+
|
|
347
|
+
<section class="strips">
|
|
348
|
+
${renderJobsStrip(data)}
|
|
349
|
+
${renderConsolidationStrip(data)}
|
|
350
|
+
${renderProvidersStrip(data)}
|
|
351
|
+
</section>
|
|
352
|
+
|
|
353
|
+
<section class="strips2">
|
|
354
|
+
${renderBudgetTile(data, dailyCap)}
|
|
355
|
+
${renderUsefulnessTile(data.usefulness)}
|
|
356
|
+
</section>
|
|
357
|
+
|
|
358
|
+
<section>
|
|
359
|
+
<h2 style="font-size:14px;color:#aaa;margin-bottom:8px;text-transform:uppercase;letter-spacing:.05em">Recent activity / errors</h2>
|
|
360
|
+
${renderActivityFeed(data)}
|
|
361
|
+
</section>
|
|
362
|
+
</body>
|
|
363
|
+
</html>`;
|
|
364
|
+
}
|
|
365
|
+
//# sourceMappingURL=dashboard-html.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard-html.js","sourceRoot":"","sources":["../../../src/server/routes/dashboard-html.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GET /dashboard/jobs — kind × state matrix + failed/poison detail
|
|
3
|
+
* (FEAT-410 wave 2, SLICE-410-5).
|
|
4
|
+
*
|
|
5
|
+
* Backed by queryJobStatesByKind + queryRecentFailedJobs (queries/dashboard.ts,
|
|
6
|
+
* SLICE-410-1's contract). The route registration in app.ts and the auth
|
|
7
|
+
* wrapper below are unchanged from the SLICE-410-1 stub.
|
|
8
|
+
*
|
|
9
|
+
* Auth mirrors src/server/routes/dashboard.ts (Bearer header or the
|
|
10
|
+
* HttpOnly `astramem_dash` cookie bootstrapped there) but the check is
|
|
11
|
+
* duplicated locally by design — see dashboard-consolidation-html.ts for
|
|
12
|
+
* the same rationale. CSS/esc/age-formatting helpers are likewise
|
|
13
|
+
* duplicated locally rather than imported from dashboard-html.ts (out of
|
|
14
|
+
* scope for this slice).
|
|
15
|
+
*/
|
|
16
|
+
import type { FastifyInstance } from 'fastify';
|
|
17
|
+
import type { DB } from '../../storage/db.js';
|
|
18
|
+
export declare function dashboardJobsRoute(db: DB, token: string): (app: FastifyInstance) => Promise<void>;
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GET /dashboard/jobs — kind × state matrix + failed/poison detail
|
|
3
|
+
* (FEAT-410 wave 2, SLICE-410-5).
|
|
4
|
+
*
|
|
5
|
+
* Backed by queryJobStatesByKind + queryRecentFailedJobs (queries/dashboard.ts,
|
|
6
|
+
* SLICE-410-1's contract). The route registration in app.ts and the auth
|
|
7
|
+
* wrapper below are unchanged from the SLICE-410-1 stub.
|
|
8
|
+
*
|
|
9
|
+
* Auth mirrors src/server/routes/dashboard.ts (Bearer header or the
|
|
10
|
+
* HttpOnly `astramem_dash` cookie bootstrapped there) but the check is
|
|
11
|
+
* duplicated locally by design — see dashboard-consolidation-html.ts for
|
|
12
|
+
* the same rationale. CSS/esc/age-formatting helpers are likewise
|
|
13
|
+
* duplicated locally rather than imported from dashboard-html.ts (out of
|
|
14
|
+
* scope for this slice).
|
|
15
|
+
*/
|
|
16
|
+
import { queryJobStatesByKind, queryRecentFailedJobs, } from '../queries/dashboard.js';
|
|
17
|
+
const COOKIE_NAME = 'astramem_dash';
|
|
18
|
+
function readCookie(req, name) {
|
|
19
|
+
const header = req.headers.cookie;
|
|
20
|
+
if (!header)
|
|
21
|
+
return undefined;
|
|
22
|
+
for (const part of header.split(';')) {
|
|
23
|
+
const eq = part.indexOf('=');
|
|
24
|
+
if (eq === -1)
|
|
25
|
+
continue;
|
|
26
|
+
if (part.slice(0, eq).trim() === name)
|
|
27
|
+
return part.slice(eq + 1).trim();
|
|
28
|
+
}
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
function esc(s) {
|
|
32
|
+
return s
|
|
33
|
+
.replace(/&/g, '&')
|
|
34
|
+
.replace(/</g, '<')
|
|
35
|
+
.replace(/>/g, '>')
|
|
36
|
+
.replace(/"/g, '"');
|
|
37
|
+
}
|
|
38
|
+
/** Mirrors dashboard-html.ts's mockup format ("2h 4m", "40m", "12s"). */
|
|
39
|
+
function fmtAgeMs(msIn) {
|
|
40
|
+
const ms = Math.max(0, msIn);
|
|
41
|
+
if (ms < 60_000)
|
|
42
|
+
return `${Math.floor(ms / 1000)}s`;
|
|
43
|
+
if (ms < 3_600_000)
|
|
44
|
+
return `${Math.floor(ms / 60_000)}m`;
|
|
45
|
+
const h = Math.floor(ms / 3_600_000);
|
|
46
|
+
const m = Math.floor((ms % 3_600_000) / 60_000);
|
|
47
|
+
return m > 0 ? `${h}h ${m}m` : `${h}h`;
|
|
48
|
+
}
|
|
49
|
+
const CSS = `
|
|
50
|
+
*{box-sizing:border-box;margin:0;padding:0}
|
|
51
|
+
body{background:#1a1a1a;color:#e0e0e0;font-family:monospace;font-size:13px;line-height:1.5;padding:16px}
|
|
52
|
+
h1{font-size:18px;color:#fff;margin-bottom:4px}
|
|
53
|
+
h2{font-size:14px;color:#aaa;margin:20px 0 8px;border-bottom:1px solid #333;padding-bottom:4px;text-transform:uppercase;letter-spacing:.05em}
|
|
54
|
+
section{margin-bottom:24px}
|
|
55
|
+
table{width:100%;border-collapse:collapse;font-size:12px}
|
|
56
|
+
th{background:#222;color:#aaa;text-align:left;padding:5px 8px;font-weight:normal;text-transform:uppercase;letter-spacing:.04em}
|
|
57
|
+
td{padding:4px 8px;border-bottom:1px solid #252525;font-variant-numeric:tabular-nums}
|
|
58
|
+
tr:nth-child(odd) td{background:#1e1e1e}
|
|
59
|
+
tr:hover td{background:#242424}
|
|
60
|
+
.num{text-align:right;font-variant-numeric:tabular-nums}
|
|
61
|
+
.err{color:#e74c3c}
|
|
62
|
+
.warn{color:#f39c12}
|
|
63
|
+
.muted{color:#666}
|
|
64
|
+
.err-text{white-space:pre-wrap;word-break:break-word}
|
|
65
|
+
`.trim();
|
|
66
|
+
const STATE_COLUMNS = ['pending', 'running', 'completed', 'failed', 'poison'];
|
|
67
|
+
/** AC-1: kind x state matrix. Only the 5 states in STATE_COLUMNS are shown;
|
|
68
|
+
* other states (e.g. "paused") are intentionally out of scope for this view. */
|
|
69
|
+
function buildMatrix(rows) {
|
|
70
|
+
const byKind = new Map();
|
|
71
|
+
for (const row of rows) {
|
|
72
|
+
if (!byKind.has(row.kind)) {
|
|
73
|
+
byKind.set(row.kind, { pending: 0, running: 0, completed: 0, failed: 0, poison: 0 });
|
|
74
|
+
}
|
|
75
|
+
const counts = byKind.get(row.kind);
|
|
76
|
+
if (STATE_COLUMNS.includes(row.state)) {
|
|
77
|
+
counts[row.state] = row.count;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return [...byKind.entries()]
|
|
81
|
+
.sort(([a], [b]) => a.localeCompare(b))
|
|
82
|
+
.map(([kind, counts]) => ({ kind, counts }));
|
|
83
|
+
}
|
|
84
|
+
function renderMatrix(rows) {
|
|
85
|
+
const matrix = buildMatrix(rows);
|
|
86
|
+
if (matrix.length === 0) {
|
|
87
|
+
return '<p class="muted">No jobs recorded yet.</p>';
|
|
88
|
+
}
|
|
89
|
+
const trs = matrix.map(m => {
|
|
90
|
+
const cells = STATE_COLUMNS.map(state => {
|
|
91
|
+
const n = m.counts[state];
|
|
92
|
+
const cls = (state === 'failed' || state === 'poison') && n > 0 ? ' class="num err"' : ' class="num"';
|
|
93
|
+
return `<td${cls}>${n}</td>`;
|
|
94
|
+
}).join('');
|
|
95
|
+
return `<tr><td>${esc(m.kind)}</td>${cells}</tr>`;
|
|
96
|
+
}).join('');
|
|
97
|
+
return `<table>
|
|
98
|
+
<thead><tr>
|
|
99
|
+
<th>Kind</th><th class="num">Pending</th><th class="num">Running</th>
|
|
100
|
+
<th class="num">Completed (24h)</th><th class="num">Failed</th><th class="num">Poison</th>
|
|
101
|
+
</tr></thead>
|
|
102
|
+
<tbody>${trs}</tbody>
|
|
103
|
+
</table>`;
|
|
104
|
+
}
|
|
105
|
+
/** AC-2: RecentFailedJob (queries/dashboard.ts) does not carry `attempts` —
|
|
106
|
+
* a small ad-hoc lookup against the jobs table fills it in locally rather
|
|
107
|
+
* than widening the SLICE-410-1 query contract (out of scope for this slice). */
|
|
108
|
+
function queryAttemptsForIds(db, ids) {
|
|
109
|
+
if (ids.length === 0)
|
|
110
|
+
return new Map();
|
|
111
|
+
const placeholders = ids.map(() => '?').join(',');
|
|
112
|
+
const rows = db.prepare(`SELECT id, attempts FROM jobs WHERE id IN (${placeholders})`).all(...ids);
|
|
113
|
+
return new Map(rows.map(r => [r.id, r.attempts]));
|
|
114
|
+
}
|
|
115
|
+
/** AC-3: explicit empty state. AC-6: age from updated_at only. */
|
|
116
|
+
function renderDetail(jobs, attemptsById, now) {
|
|
117
|
+
if (jobs.length === 0) {
|
|
118
|
+
return '<p class="muted">No failed or poison jobs</p>';
|
|
119
|
+
}
|
|
120
|
+
const trs = jobs.map(j => {
|
|
121
|
+
const attempts = attemptsById.get(j.id) ?? '<span class="muted">—</span>';
|
|
122
|
+
const errText = j.last_error !== null ? esc(j.last_error) : '<span class="muted">—</span>';
|
|
123
|
+
const age = fmtAgeMs(now - j.updated_at);
|
|
124
|
+
const stateCls = j.state === 'poison' || j.state === 'failed' ? ' class="err"' : '';
|
|
125
|
+
return `<tr>
|
|
126
|
+
<td>${esc(j.id)}</td>
|
|
127
|
+
<td>${esc(j.kind)}</td>
|
|
128
|
+
<td${stateCls}>${esc(j.state)}</td>
|
|
129
|
+
<td class="num">${attempts}</td>
|
|
130
|
+
<td class="err-text">${errText}</td>
|
|
131
|
+
<td class="muted">${esc(age)}</td>
|
|
132
|
+
</tr>`;
|
|
133
|
+
}).join('');
|
|
134
|
+
return `<table>
|
|
135
|
+
<thead><tr>
|
|
136
|
+
<th>ID</th><th>Kind</th><th>State</th><th class="num">Attempts</th><th>Last error</th><th>Age</th>
|
|
137
|
+
</tr></thead>
|
|
138
|
+
<tbody>${trs}</tbody>
|
|
139
|
+
</table>`;
|
|
140
|
+
}
|
|
141
|
+
function renderPage(jobStatesByKind, failedJobs, attemptsById, now) {
|
|
142
|
+
return `<!DOCTYPE html>
|
|
143
|
+
<html lang="en">
|
|
144
|
+
<head>
|
|
145
|
+
<meta charset="utf-8">
|
|
146
|
+
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
147
|
+
<title>AstraMemory Dashboard — Jobs</title>
|
|
148
|
+
<style>${CSS}</style>
|
|
149
|
+
</head>
|
|
150
|
+
<body>
|
|
151
|
+
<h1>AstraMemory Local — Jobs</h1>
|
|
152
|
+
<section>
|
|
153
|
+
<h2>Kind × state</h2>
|
|
154
|
+
${renderMatrix(jobStatesByKind)}
|
|
155
|
+
</section>
|
|
156
|
+
<section>
|
|
157
|
+
<h2>Failed / poison detail</h2>
|
|
158
|
+
${renderDetail(failedJobs, attemptsById, now)}
|
|
159
|
+
</section>
|
|
160
|
+
</body>
|
|
161
|
+
</html>`;
|
|
162
|
+
}
|
|
163
|
+
export function dashboardJobsRoute(db, token) {
|
|
164
|
+
return async (app) => {
|
|
165
|
+
app.get('/dashboard/jobs', async (req, reply) => {
|
|
166
|
+
const authHeader = req.headers.authorization;
|
|
167
|
+
const bearerOk = authHeader === `Bearer ${token}`;
|
|
168
|
+
const cookieOk = readCookie(req, COOKIE_NAME) === token;
|
|
169
|
+
if (!bearerOk && !cookieOk) {
|
|
170
|
+
return reply
|
|
171
|
+
.code(401)
|
|
172
|
+
.header('content-type', 'text/plain; charset=utf-8')
|
|
173
|
+
.send('401 Unauthorized');
|
|
174
|
+
}
|
|
175
|
+
const jobStatesByKind = queryJobStatesByKind(db);
|
|
176
|
+
const failedJobs = queryRecentFailedJobs(db);
|
|
177
|
+
const attemptsById = queryAttemptsForIds(db, failedJobs.map(j => j.id));
|
|
178
|
+
return reply
|
|
179
|
+
.code(200)
|
|
180
|
+
.header('content-type', 'text/html; charset=utf-8')
|
|
181
|
+
.header('cache-control', 'no-store')
|
|
182
|
+
.send(renderPage(jobStatesByKind, failedJobs, attemptsById, Date.now()));
|
|
183
|
+
});
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=dashboard-jobs-html.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard-jobs-html.js","sourceRoot":"","sources":["../../../src/server/routes/dashboard-jobs-html.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GET /dashboard/search — search debug page (FEAT-410 wave 2, SLICE-410-6).
|
|
3
|
+
*
|
|
4
|
+
* Plain GET `<form>` (query in the URL) rendering the per-candidate fusion
|
|
5
|
+
* score table from SLICE-410-3's `debug: true` search() path, plus the
|
|
6
|
+
* current fuse.ts weights (src/config/config.ts `search` defaults). Zero JS.
|
|
7
|
+
*
|
|
8
|
+
* Auth mirrors src/server/routes/dashboard.ts (Bearer header or the
|
|
9
|
+
* HttpOnly `astramem_dash` cookie bootstrapped there) but the check is
|
|
10
|
+
* duplicated locally by design — see dashboard-consolidation-html.ts for
|
|
11
|
+
* the same rationale. HTML escaping is likewise duplicated locally rather
|
|
12
|
+
* than importing dashboard-html.ts's `esc()` (SLICE-410-6 scope: this file
|
|
13
|
+
* + its tests only).
|
|
14
|
+
*/
|
|
15
|
+
import type { FastifyInstance } from 'fastify';
|
|
16
|
+
import type { DB } from '../../storage/db.js';
|
|
17
|
+
import type { EmbedProvider } from '../../contracts/index.js';
|
|
18
|
+
export declare function dashboardSearchRoute(db: DB, embed: EmbedProvider, token: string): (app: FastifyInstance) => Promise<void>;
|