@ashlr/hub 2.2.0
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 +1158 -0
- package/LICENSE +21 -0
- package/README.md +833 -0
- package/bin/ashlr +8 -0
- package/dist/api/core.d.ts +28 -0
- package/dist/api/core.js +42 -0
- package/dist/api/core.js.map +1 -0
- package/dist/api/index.d.ts +9 -0
- package/dist/api/index.js +9 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/plugin.d.ts +12 -0
- package/dist/api/plugin.js +13 -0
- package/dist/api/plugin.js.map +1 -0
- package/dist/api/types.d.ts +9 -0
- package/dist/api/types.js +9 -0
- package/dist/api/types.js.map +1 -0
- package/dist/cli/args.d.ts +20 -0
- package/dist/cli/args.js +23 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/ask.d.ts +22 -0
- package/dist/cli/ask.js +240 -0
- package/dist/cli/ask.js.map +1 -0
- package/dist/cli/audit.d.ts +26 -0
- package/dist/cli/audit.js +199 -0
- package/dist/cli/audit.js.map +1 -0
- package/dist/cli/backlog.d.ts +26 -0
- package/dist/cli/backlog.js +322 -0
- package/dist/cli/backlog.js.map +1 -0
- package/dist/cli/completions.d.ts +18 -0
- package/dist/cli/completions.js +156 -0
- package/dist/cli/completions.js.map +1 -0
- package/dist/cli/daemon.d.ts +31 -0
- package/dist/cli/daemon.js +334 -0
- package/dist/cli/daemon.js.map +1 -0
- package/dist/cli/demo-sandbox.d.ts +78 -0
- package/dist/cli/demo-sandbox.js +227 -0
- package/dist/cli/demo-sandbox.js.map +1 -0
- package/dist/cli/demo.d.ts +76 -0
- package/dist/cli/demo.js +285 -0
- package/dist/cli/demo.js.map +1 -0
- package/dist/cli/digest.d.ts +46 -0
- package/dist/cli/digest.js +352 -0
- package/dist/cli/digest.js.map +1 -0
- package/dist/cli/doctor-init.d.ts +28 -0
- package/dist/cli/doctor-init.js +335 -0
- package/dist/cli/doctor-init.js.map +1 -0
- package/dist/cli/genome.d.ts +62 -0
- package/dist/cli/genome.js +1061 -0
- package/dist/cli/genome.js.map +1 -0
- package/dist/cli/gh.d.ts +27 -0
- package/dist/cli/gh.js +322 -0
- package/dist/cli/gh.js.map +1 -0
- package/dist/cli/goals.d.ts +55 -0
- package/dist/cli/goals.js +667 -0
- package/dist/cli/goals.js.map +1 -0
- package/dist/cli/health.d.ts +56 -0
- package/dist/cli/health.js +407 -0
- package/dist/cli/health.js.map +1 -0
- package/dist/cli/help.d.ts +51 -0
- package/dist/cli/help.js +436 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli/inbox.d.ts +28 -0
- package/dist/cli/inbox.js +589 -0
- package/dist/cli/inbox.js.map +1 -0
- package/dist/cli/index.d.ts +41 -0
- package/dist/cli/index.js +1208 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/knowledge.d.ts +33 -0
- package/dist/cli/knowledge.js +575 -0
- package/dist/cli/knowledge.js.map +1 -0
- package/dist/cli/mcp.d.ts +26 -0
- package/dist/cli/mcp.js +487 -0
- package/dist/cli/mcp.js.map +1 -0
- package/dist/cli/models.d.ts +26 -0
- package/dist/cli/models.js +435 -0
- package/dist/cli/models.js.map +1 -0
- package/dist/cli/new.d.ts +32 -0
- package/dist/cli/new.js +565 -0
- package/dist/cli/new.js.map +1 -0
- package/dist/cli/notify.d.ts +20 -0
- package/dist/cli/notify.js +188 -0
- package/dist/cli/notify.js.map +1 -0
- package/dist/cli/onboard.d.ts +85 -0
- package/dist/cli/onboard.js +305 -0
- package/dist/cli/onboard.js.map +1 -0
- package/dist/cli/open.d.ts +38 -0
- package/dist/cli/open.js +86 -0
- package/dist/cli/open.js.map +1 -0
- package/dist/cli/orient.d.ts +14 -0
- package/dist/cli/orient.js +110 -0
- package/dist/cli/orient.js.map +1 -0
- package/dist/cli/picker.d.ts +21 -0
- package/dist/cli/picker.js +177 -0
- package/dist/cli/picker.js.map +1 -0
- package/dist/cli/plugins.d.ts +21 -0
- package/dist/cli/plugins.js +394 -0
- package/dist/cli/plugins.js.map +1 -0
- package/dist/cli/preflight.d.ts +29 -0
- package/dist/cli/preflight.js +131 -0
- package/dist/cli/preflight.js.map +1 -0
- package/dist/cli/pulse.d.ts +26 -0
- package/dist/cli/pulse.js +482 -0
- package/dist/cli/pulse.js.map +1 -0
- package/dist/cli/reflect.d.ts +42 -0
- package/dist/cli/reflect.js +381 -0
- package/dist/cli/reflect.js.map +1 -0
- package/dist/cli/run.d.ts +29 -0
- package/dist/cli/run.js +687 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/sandbox.d.ts +20 -0
- package/dist/cli/sandbox.js +345 -0
- package/dist/cli/sandbox.js.map +1 -0
- package/dist/cli/seams.d.ts +41 -0
- package/dist/cli/seams.js +167 -0
- package/dist/cli/seams.js.map +1 -0
- package/dist/cli/serve.d.ts +25 -0
- package/dist/cli/serve.js +249 -0
- package/dist/cli/serve.js.map +1 -0
- package/dist/cli/ship.d.ts +33 -0
- package/dist/cli/ship.js +433 -0
- package/dist/cli/ship.js.map +1 -0
- package/dist/cli/spec.d.ts +19 -0
- package/dist/cli/spec.js +478 -0
- package/dist/cli/spec.js.map +1 -0
- package/dist/cli/swarm.d.ts +42 -0
- package/dist/cli/swarm.js +1365 -0
- package/dist/cli/swarm.js.map +1 -0
- package/dist/cli/telemetry.d.ts +26 -0
- package/dist/cli/telemetry.js +364 -0
- package/dist/cli/telemetry.js.map +1 -0
- package/dist/cli/tui.d.ts +17 -0
- package/dist/cli/tui.js +52 -0
- package/dist/cli/tui.js.map +1 -0
- package/dist/cli/ui.d.ts +53 -0
- package/dist/cli/ui.js +66 -0
- package/dist/cli/ui.js.map +1 -0
- package/dist/cli/update.d.ts +38 -0
- package/dist/cli/update.js +682 -0
- package/dist/cli/update.js.map +1 -0
- package/dist/cli/vercel.d.ts +20 -0
- package/dist/cli/vercel.js +193 -0
- package/dist/cli/vercel.js.map +1 -0
- package/dist/cli/verify-safety.d.ts +96 -0
- package/dist/cli/verify-safety.js +509 -0
- package/dist/cli/verify-safety.js.map +1 -0
- package/dist/cli/wire.d.ts +22 -0
- package/dist/cli/wire.js +205 -0
- package/dist/cli/wire.js.map +1 -0
- package/dist/core/classify.d.ts +51 -0
- package/dist/core/classify.js +450 -0
- package/dist/core/classify.js.map +1 -0
- package/dist/core/config.d.ts +63 -0
- package/dist/core/config.js +474 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/daemon/loop.d.ts +74 -0
- package/dist/core/daemon/loop.js +618 -0
- package/dist/core/daemon/loop.js.map +1 -0
- package/dist/core/daemon/state.d.ts +66 -0
- package/dist/core/daemon/state.js +197 -0
- package/dist/core/daemon/state.js.map +1 -0
- package/dist/core/dashboard.d.ts +40 -0
- package/dist/core/dashboard.js +463 -0
- package/dist/core/dashboard.js.map +1 -0
- package/dist/core/digest/build.d.ts +51 -0
- package/dist/core/digest/build.js +230 -0
- package/dist/core/digest/build.js.map +1 -0
- package/dist/core/digest/deliver.d.ts +47 -0
- package/dist/core/digest/deliver.js +230 -0
- package/dist/core/digest/deliver.js.map +1 -0
- package/dist/core/digest/store.d.ts +57 -0
- package/dist/core/digest/store.js +223 -0
- package/dist/core/digest/store.js.map +1 -0
- package/dist/core/doctor-fix.d.ts +21 -0
- package/dist/core/doctor-fix.js +440 -0
- package/dist/core/doctor-fix.js.map +1 -0
- package/dist/core/doctor.d.ts +18 -0
- package/dist/core/doctor.js +806 -0
- package/dist/core/doctor.js.map +1 -0
- package/dist/core/env-bridge.d.ts +64 -0
- package/dist/core/env-bridge.js +103 -0
- package/dist/core/env-bridge.js.map +1 -0
- package/dist/core/genome/capture.d.ts +49 -0
- package/dist/core/genome/capture.js +352 -0
- package/dist/core/genome/capture.js.map +1 -0
- package/dist/core/genome/consolidate.d.ts +38 -0
- package/dist/core/genome/consolidate.js +426 -0
- package/dist/core/genome/consolidate.js.map +1 -0
- package/dist/core/genome/export.d.ts +29 -0
- package/dist/core/genome/export.js +102 -0
- package/dist/core/genome/export.js.map +1 -0
- package/dist/core/genome/playbook.d.ts +33 -0
- package/dist/core/genome/playbook.js +320 -0
- package/dist/core/genome/playbook.js.map +1 -0
- package/dist/core/genome/recall.d.ts +45 -0
- package/dist/core/genome/recall.js +293 -0
- package/dist/core/genome/recall.js.map +1 -0
- package/dist/core/genome/store.d.ts +62 -0
- package/dist/core/genome/store.js +711 -0
- package/dist/core/genome/store.js.map +1 -0
- package/dist/core/git.d.ts +34 -0
- package/dist/core/git.js +115 -0
- package/dist/core/git.js.map +1 -0
- package/dist/core/goals/advance.d.ts +82 -0
- package/dist/core/goals/advance.js +263 -0
- package/dist/core/goals/advance.js.map +1 -0
- package/dist/core/goals/planner.d.ts +58 -0
- package/dist/core/goals/planner.js +233 -0
- package/dist/core/goals/planner.js.map +1 -0
- package/dist/core/goals/store.d.ts +128 -0
- package/dist/core/goals/store.js +442 -0
- package/dist/core/goals/store.js.map +1 -0
- package/dist/core/inbox/apply.d.ts +36 -0
- package/dist/core/inbox/apply.js +407 -0
- package/dist/core/inbox/apply.js.map +1 -0
- package/dist/core/inbox/notify-proposal.d.ts +13 -0
- package/dist/core/inbox/notify-proposal.js +21 -0
- package/dist/core/inbox/notify-proposal.js.map +1 -0
- package/dist/core/inbox/store.d.ts +67 -0
- package/dist/core/inbox/store.js +258 -0
- package/dist/core/inbox/store.js.map +1 -0
- package/dist/core/index-engine.d.ts +62 -0
- package/dist/core/index-engine.js +486 -0
- package/dist/core/index-engine.js.map +1 -0
- package/dist/core/integrations/desktop-notify.d.ts +18 -0
- package/dist/core/integrations/desktop-notify.js +42 -0
- package/dist/core/integrations/desktop-notify.js.map +1 -0
- package/dist/core/integrations/editors.d.ts +50 -0
- package/dist/core/integrations/editors.js +216 -0
- package/dist/core/integrations/editors.js.map +1 -0
- package/dist/core/integrations/github.d.ts +66 -0
- package/dist/core/integrations/github.js +332 -0
- package/dist/core/integrations/github.js.map +1 -0
- package/dist/core/integrations/identity.d.ts +29 -0
- package/dist/core/integrations/identity.js +359 -0
- package/dist/core/integrations/identity.js.map +1 -0
- package/dist/core/integrations/notify.d.ts +23 -0
- package/dist/core/integrations/notify.js +96 -0
- package/dist/core/integrations/notify.js.map +1 -0
- package/dist/core/integrations/vercel.d.ts +37 -0
- package/dist/core/integrations/vercel.js +192 -0
- package/dist/core/integrations/vercel.js.map +1 -0
- package/dist/core/knowledge/ask.d.ts +34 -0
- package/dist/core/knowledge/ask.js +325 -0
- package/dist/core/knowledge/ask.js.map +1 -0
- package/dist/core/knowledge/graph.d.ts +51 -0
- package/dist/core/knowledge/graph.js +564 -0
- package/dist/core/knowledge/graph.js.map +1 -0
- package/dist/core/knowledge/index.d.ts +74 -0
- package/dist/core/knowledge/index.js +586 -0
- package/dist/core/knowledge/index.js.map +1 -0
- package/dist/core/learn/playbooks.d.ts +84 -0
- package/dist/core/learn/playbooks.js +241 -0
- package/dist/core/learn/playbooks.js.map +1 -0
- package/dist/core/learn/reflect.d.ts +87 -0
- package/dist/core/learn/reflect.js +435 -0
- package/dist/core/learn/reflect.js.map +1 -0
- package/dist/core/learn/store.d.ts +51 -0
- package/dist/core/learn/store.js +165 -0
- package/dist/core/learn/store.js.map +1 -0
- package/dist/core/learn/tuning.d.ts +48 -0
- package/dist/core/learn/tuning.js +201 -0
- package/dist/core/learn/tuning.js.map +1 -0
- package/dist/core/lifecycle/scaffold.d.ts +43 -0
- package/dist/core/lifecycle/scaffold.js +260 -0
- package/dist/core/lifecycle/scaffold.js.map +1 -0
- package/dist/core/lifecycle/ship.d.ts +48 -0
- package/dist/core/lifecycle/ship.js +513 -0
- package/dist/core/lifecycle/ship.js.map +1 -0
- package/dist/core/lifecycle/templates.d.ts +20 -0
- package/dist/core/lifecycle/templates.js +605 -0
- package/dist/core/lifecycle/templates.js.map +1 -0
- package/dist/core/mcp-gateway.d.ts +59 -0
- package/dist/core/mcp-gateway.js +385 -0
- package/dist/core/mcp-gateway.js.map +1 -0
- package/dist/core/mcp-native.d.ts +53 -0
- package/dist/core/mcp-native.js +507 -0
- package/dist/core/mcp-native.js.map +1 -0
- package/dist/core/mcp-registry.d.ts +36 -0
- package/dist/core/mcp-registry.js +180 -0
- package/dist/core/mcp-registry.js.map +1 -0
- package/dist/core/observability/budget-alert.d.ts +18 -0
- package/dist/core/observability/budget-alert.js +90 -0
- package/dist/core/observability/budget-alert.js.map +1 -0
- package/dist/core/observability/estimate.d.ts +27 -0
- package/dist/core/observability/estimate.js +188 -0
- package/dist/core/observability/estimate.js.map +1 -0
- package/dist/core/observability/forecast.d.ts +19 -0
- package/dist/core/observability/forecast.js +101 -0
- package/dist/core/observability/forecast.js.map +1 -0
- package/dist/core/observability/governance.d.ts +28 -0
- package/dist/core/observability/governance.js +101 -0
- package/dist/core/observability/governance.js.map +1 -0
- package/dist/core/observability/otlp.d.ts +88 -0
- package/dist/core/observability/otlp.js +217 -0
- package/dist/core/observability/otlp.js.map +1 -0
- package/dist/core/observability/rollup.d.ts +35 -0
- package/dist/core/observability/rollup.js +311 -0
- package/dist/core/observability/rollup.js.map +1 -0
- package/dist/core/observability/telemetry-sink.d.ts +63 -0
- package/dist/core/observability/telemetry-sink.js +350 -0
- package/dist/core/observability/telemetry-sink.js.map +1 -0
- package/dist/core/observability/usage-source.d.ts +60 -0
- package/dist/core/observability/usage-source.js +347 -0
- package/dist/core/observability/usage-source.js.map +1 -0
- package/dist/core/onboard.d.ts +27 -0
- package/dist/core/onboard.js +288 -0
- package/dist/core/onboard.js.map +1 -0
- package/dist/core/orient.d.ts +23 -0
- package/dist/core/orient.js +135 -0
- package/dist/core/orient.js.map +1 -0
- package/dist/core/phantom.d.ts +23 -0
- package/dist/core/phantom.js +279 -0
- package/dist/core/phantom.js.map +1 -0
- package/dist/core/plugins/host-api.d.ts +29 -0
- package/dist/core/plugins/host-api.js +113 -0
- package/dist/core/plugins/host-api.js.map +1 -0
- package/dist/core/plugins/integrity.d.ts +36 -0
- package/dist/core/plugins/integrity.js +73 -0
- package/dist/core/plugins/integrity.js.map +1 -0
- package/dist/core/plugins/manifest.d.ts +31 -0
- package/dist/core/plugins/manifest.js +316 -0
- package/dist/core/plugins/manifest.js.map +1 -0
- package/dist/core/plugins/registry.d.ts +87 -0
- package/dist/core/plugins/registry.js +415 -0
- package/dist/core/plugins/registry.js.map +1 -0
- package/dist/core/plugins/types.d.ts +182 -0
- package/dist/core/plugins/types.js +40 -0
- package/dist/core/plugins/types.js.map +1 -0
- package/dist/core/plugins/wrappers.d.ts +40 -0
- package/dist/core/plugins/wrappers.js +229 -0
- package/dist/core/plugins/wrappers.js.map +1 -0
- package/dist/core/portfolio/backlog.d.ts +40 -0
- package/dist/core/portfolio/backlog.js +177 -0
- package/dist/core/portfolio/backlog.js.map +1 -0
- package/dist/core/portfolio/scanners.d.ts +21 -0
- package/dist/core/portfolio/scanners.js +600 -0
- package/dist/core/portfolio/scanners.js.map +1 -0
- package/dist/core/providers.d.ts +34 -0
- package/dist/core/providers.js +250 -0
- package/dist/core/providers.js.map +1 -0
- package/dist/core/quality/conventions.d.ts +35 -0
- package/dist/core/quality/conventions.js +267 -0
- package/dist/core/quality/conventions.js.map +1 -0
- package/dist/core/quality/fixes.d.ts +56 -0
- package/dist/core/quality/fixes.js +209 -0
- package/dist/core/quality/fixes.js.map +1 -0
- package/dist/core/quality/health.d.ts +69 -0
- package/dist/core/quality/health.js +350 -0
- package/dist/core/quality/health.js.map +1 -0
- package/dist/core/quality/store.d.ts +56 -0
- package/dist/core/quality/store.js +195 -0
- package/dist/core/quality/store.js.map +1 -0
- package/dist/core/readiness.d.ts +112 -0
- package/dist/core/readiness.js +431 -0
- package/dist/core/readiness.js.map +1 -0
- package/dist/core/run/agent-loop.d.ts +40 -0
- package/dist/core/run/agent-loop.js +291 -0
- package/dist/core/run/agent-loop.js.map +1 -0
- package/dist/core/run/budget.d.ts +47 -0
- package/dist/core/run/budget.js +113 -0
- package/dist/core/run/budget.js.map +1 -0
- package/dist/core/run/engines.d.ts +75 -0
- package/dist/core/run/engines.js +199 -0
- package/dist/core/run/engines.js.map +1 -0
- package/dist/core/run/model-manager.d.ts +64 -0
- package/dist/core/run/model-manager.js +339 -0
- package/dist/core/run/model-manager.js.map +1 -0
- package/dist/core/run/orchestrator.d.ts +100 -0
- package/dist/core/run/orchestrator.js +1515 -0
- package/dist/core/run/orchestrator.js.map +1 -0
- package/dist/core/run/provider-client.d.ts +46 -0
- package/dist/core/run/provider-client.js +796 -0
- package/dist/core/run/provider-client.js.map +1 -0
- package/dist/core/run/retry.d.ts +19 -0
- package/dist/core/run/retry.js +68 -0
- package/dist/core/run/retry.js.map +1 -0
- package/dist/core/run/router.d.ts +50 -0
- package/dist/core/run/router.js +257 -0
- package/dist/core/run/router.js.map +1 -0
- package/dist/core/run/self-heal.d.ts +52 -0
- package/dist/core/run/self-heal.js +181 -0
- package/dist/core/run/self-heal.js.map +1 -0
- package/dist/core/run/streaming.d.ts +31 -0
- package/dist/core/run/streaming.js +122 -0
- package/dist/core/run/streaming.js.map +1 -0
- package/dist/core/run/verify.d.ts +30 -0
- package/dist/core/run/verify.js +204 -0
- package/dist/core/run/verify.js.map +1 -0
- package/dist/core/sandbox/audit.d.ts +31 -0
- package/dist/core/sandbox/audit.js +169 -0
- package/dist/core/sandbox/audit.js.map +1 -0
- package/dist/core/sandbox/policy.d.ts +61 -0
- package/dist/core/sandbox/policy.js +211 -0
- package/dist/core/sandbox/policy.js.map +1 -0
- package/dist/core/sandbox/worktree.d.ts +175 -0
- package/dist/core/sandbox/worktree.js +673 -0
- package/dist/core/sandbox/worktree.js.map +1 -0
- package/dist/core/seams/backlog.d.ts +47 -0
- package/dist/core/seams/backlog.js +47 -0
- package/dist/core/seams/backlog.js.map +1 -0
- package/dist/core/seams/daemon-coordinator.d.ts +72 -0
- package/dist/core/seams/daemon-coordinator.js +76 -0
- package/dist/core/seams/daemon-coordinator.js.map +1 -0
- package/dist/core/seams/genome.d.ts +45 -0
- package/dist/core/seams/genome.js +53 -0
- package/dist/core/seams/genome.js.map +1 -0
- package/dist/core/seams/identity.d.ts +40 -0
- package/dist/core/seams/identity.js +44 -0
- package/dist/core/seams/identity.js.map +1 -0
- package/dist/core/seams/inbox.d.ts +60 -0
- package/dist/core/seams/inbox.js +66 -0
- package/dist/core/seams/inbox.js.map +1 -0
- package/dist/core/seams/index.d.ts +20 -0
- package/dist/core/seams/index.js +21 -0
- package/dist/core/seams/index.js.map +1 -0
- package/dist/core/seams/portfolio.d.ts +50 -0
- package/dist/core/seams/portfolio.js +61 -0
- package/dist/core/seams/portfolio.js.map +1 -0
- package/dist/core/seams/registry.d.ts +42 -0
- package/dist/core/seams/registry.js +128 -0
- package/dist/core/seams/registry.js.map +1 -0
- package/dist/core/seams/run-swarm.d.ts +66 -0
- package/dist/core/seams/run-swarm.js +74 -0
- package/dist/core/seams/run-swarm.js.map +1 -0
- package/dist/core/seams/types.d.ts +123 -0
- package/dist/core/seams/types.js +35 -0
- package/dist/core/seams/types.js.map +1 -0
- package/dist/core/spec/spec-store.d.ts +62 -0
- package/dist/core/spec/spec-store.js +359 -0
- package/dist/core/spec/spec-store.js.map +1 -0
- package/dist/core/swarm/gate.d.ts +45 -0
- package/dist/core/swarm/gate.js +114 -0
- package/dist/core/swarm/gate.js.map +1 -0
- package/dist/core/swarm/planner.d.ts +32 -0
- package/dist/core/swarm/planner.js +293 -0
- package/dist/core/swarm/planner.js.map +1 -0
- package/dist/core/swarm/rollback.d.ts +56 -0
- package/dist/core/swarm/rollback.js +266 -0
- package/dist/core/swarm/rollback.js.map +1 -0
- package/dist/core/swarm/runner.d.ts +62 -0
- package/dist/core/swarm/runner.js +1263 -0
- package/dist/core/swarm/runner.js.map +1 -0
- package/dist/core/swarm/sign.d.ts +71 -0
- package/dist/core/swarm/sign.js +362 -0
- package/dist/core/swarm/sign.js.map +1 -0
- package/dist/core/swarm/store.d.ts +52 -0
- package/dist/core/swarm/store.js +195 -0
- package/dist/core/swarm/store.js.map +1 -0
- package/dist/core/tidy.d.ts +32 -0
- package/dist/core/tidy.js +354 -0
- package/dist/core/tidy.js.map +1 -0
- package/dist/core/tools-registry.d.ts +16 -0
- package/dist/core/tools-registry.js +308 -0
- package/dist/core/tools-registry.js.map +1 -0
- package/dist/core/types.d.ts +2545 -0
- package/dist/core/types.js +9 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/web/api.d.ts +53 -0
- package/dist/core/web/api.js +698 -0
- package/dist/core/web/api.js.map +1 -0
- package/dist/core/web/public/app.js +1906 -0
- package/dist/core/web/public/index.html +721 -0
- package/dist/core/web/public/styles.css +2007 -0
- package/dist/core/web/server.d.ts +18 -0
- package/dist/core/web/server.js +122 -0
- package/dist/core/web/server.js.map +1 -0
- package/dist/core/web/static.d.ts +18 -0
- package/dist/core/web/static.js +122 -0
- package/dist/core/web/static.js.map +1 -0
- package/dist/tui/app.d.ts +33 -0
- package/dist/tui/app.js +350 -0
- package/dist/tui/app.js.map +1 -0
- package/dist/tui/render.d.ts +20 -0
- package/dist/tui/render.js +558 -0
- package/dist/tui/render.js.map +1 -0
- package/package.json +80 -0
- package/schema/config.schema.json +223 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* state.ts — Daemon state persistence.
|
|
3
|
+
*
|
|
4
|
+
* Responsibilities:
|
|
5
|
+
* - daemonStatePath(): path to ~/.ashlr/daemon.json
|
|
6
|
+
* - loadDaemonState(): read + parse; NEVER throws; returns zeroed state on
|
|
7
|
+
* missing/corrupt file.
|
|
8
|
+
* - saveDaemonState(): atomic write (tmp + rename, POSIX-atomic); mkdir -p.
|
|
9
|
+
* - resetDayIfNeeded(): pure — if todayDate has rolled over, zero daily
|
|
10
|
+
* spend and update the date. Returns (possibly new) state; caller persists.
|
|
11
|
+
*
|
|
12
|
+
* No new runtime deps; node builtins only.
|
|
13
|
+
*/
|
|
14
|
+
import type { DaemonState } from '../types.js';
|
|
15
|
+
/** Absolute path to the daemon state file. */
|
|
16
|
+
export declare function daemonStatePath(): string;
|
|
17
|
+
/**
|
|
18
|
+
* Read and parse daemonStatePath(). NEVER throws.
|
|
19
|
+
* Returns a fresh zeroed DaemonState when the file is missing or malformed.
|
|
20
|
+
*/
|
|
21
|
+
export declare function loadDaemonState(): DaemonState;
|
|
22
|
+
/**
|
|
23
|
+
* Atomically write DaemonState to daemonStatePath() via tmp-file + rename
|
|
24
|
+
* (POSIX-atomic). Creates ~/.ashlr if needed. Never throws.
|
|
25
|
+
*/
|
|
26
|
+
export declare function saveDaemonState(s: DaemonState): void;
|
|
27
|
+
/**
|
|
28
|
+
* If s.todayDate differs from today's YYYY-MM-DD, return a copy with
|
|
29
|
+
* todayDate set to today and todaySpentUsd reset to 0 (daily budget reset).
|
|
30
|
+
* itemsProcessed and ticks are preserved.
|
|
31
|
+
*
|
|
32
|
+
* Pure-ish: returns the (possibly new) state; caller is responsible for
|
|
33
|
+
* persisting via saveDaemonState().
|
|
34
|
+
*/
|
|
35
|
+
export declare function resetDayIfNeeded(s: DaemonState): DaemonState;
|
|
36
|
+
/**
|
|
37
|
+
* READ-ONLY liveness reconcile. If `s.running === true` but the recorded `pid`
|
|
38
|
+
* is NOT alive — `process.kill(pid, 0)` throws `ESRCH` (no such process) — flip
|
|
39
|
+
* `running` to false and `pid` to null so `daemon status` reports a dead daemon
|
|
40
|
+
* as stopped. Otherwise return `s` unchanged.
|
|
41
|
+
*
|
|
42
|
+
* HONEST BOUND (pid reuse): this reports a dead daemon as live ONLY in the rare
|
|
43
|
+
* case where the OS recycled the recorded pid for an unrelated live process
|
|
44
|
+
* (then `process.kill(pid,0)` succeeds and we leave the state unchanged) —
|
|
45
|
+
* inherent to pid-0 liveness. In every other case it is truthful. It is
|
|
46
|
+
* conservative-toward-alive (it NEVER force-flips a genuinely running daemon
|
|
47
|
+
* off), and since it changes no spend/guard the residual false-positive is an
|
|
48
|
+
* observability nicety only, never a safety issue.
|
|
49
|
+
*
|
|
50
|
+
* OBSERVABILITY-ONLY by construction: it touches NO spend accounting
|
|
51
|
+
* (`todaySpentUsd` / `itemsProcessed` / `ticks` are preserved byte-for-byte),
|
|
52
|
+
* NO guard (kill switch / enrollment / sandbox are unaffected), and adds NO
|
|
53
|
+
* capability. It only makes the persisted running/pid pair truthful.
|
|
54
|
+
*
|
|
55
|
+
* Liveness rules (conservative — NEVER destroy a real running daemon's state):
|
|
56
|
+
* - `running !== true` or `pid` not a number => nothing to reconcile => unchanged.
|
|
57
|
+
* - `process.kill(pid, 0)` succeeds => process alive => unchanged.
|
|
58
|
+
* - throws `ESRCH` => process is GONE => flip to { running:false, pid:null }.
|
|
59
|
+
* - throws `EPERM` (exists but not signalable by us) => process EXISTS => alive
|
|
60
|
+
* => unchanged (do NOT flip).
|
|
61
|
+
* - any other/unexpected error => treat as alive => unchanged.
|
|
62
|
+
*
|
|
63
|
+
* Pure-ish: returns the (possibly new) state; caller persists via
|
|
64
|
+
* saveDaemonState(). Never throws.
|
|
65
|
+
*/
|
|
66
|
+
export declare function reconcileDaemonState(s: DaemonState): DaemonState;
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* state.ts — Daemon state persistence.
|
|
3
|
+
*
|
|
4
|
+
* Responsibilities:
|
|
5
|
+
* - daemonStatePath(): path to ~/.ashlr/daemon.json
|
|
6
|
+
* - loadDaemonState(): read + parse; NEVER throws; returns zeroed state on
|
|
7
|
+
* missing/corrupt file.
|
|
8
|
+
* - saveDaemonState(): atomic write (tmp + rename, POSIX-atomic); mkdir -p.
|
|
9
|
+
* - resetDayIfNeeded(): pure — if todayDate has rolled over, zero daily
|
|
10
|
+
* spend and update the date. Returns (possibly new) state; caller persists.
|
|
11
|
+
*
|
|
12
|
+
* No new runtime deps; node builtins only.
|
|
13
|
+
*/
|
|
14
|
+
import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync, } from 'node:fs';
|
|
15
|
+
import { homedir } from 'node:os';
|
|
16
|
+
import { join } from 'node:path';
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
// Constants
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
/** Maximum number of tick history entries kept in daemon.json. */
|
|
21
|
+
const MAX_TICKS = 100;
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
// Path helpers (re-resolved at call time so tests can relocate HOME)
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
function ashlrDir() {
|
|
26
|
+
return join(homedir(), '.ashlr');
|
|
27
|
+
}
|
|
28
|
+
/** Absolute path to the daemon state file. */
|
|
29
|
+
export function daemonStatePath() {
|
|
30
|
+
return join(ashlrDir(), 'daemon.json');
|
|
31
|
+
}
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
// Zeroed default state
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
function freshState() {
|
|
36
|
+
return {
|
|
37
|
+
running: false,
|
|
38
|
+
pid: null,
|
|
39
|
+
startedAt: null,
|
|
40
|
+
lastTickAt: null,
|
|
41
|
+
todayDate: null,
|
|
42
|
+
todaySpentUsd: 0,
|
|
43
|
+
itemsProcessed: 0,
|
|
44
|
+
ticks: [],
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
// ---------------------------------------------------------------------------
|
|
48
|
+
// Load
|
|
49
|
+
// ---------------------------------------------------------------------------
|
|
50
|
+
/**
|
|
51
|
+
* Read and parse daemonStatePath(). NEVER throws.
|
|
52
|
+
* Returns a fresh zeroed DaemonState when the file is missing or malformed.
|
|
53
|
+
*/
|
|
54
|
+
export function loadDaemonState() {
|
|
55
|
+
const p = daemonStatePath();
|
|
56
|
+
if (!existsSync(p))
|
|
57
|
+
return freshState();
|
|
58
|
+
try {
|
|
59
|
+
const raw = readFileSync(p, 'utf8');
|
|
60
|
+
const parsed = JSON.parse(raw);
|
|
61
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
|
|
62
|
+
return freshState();
|
|
63
|
+
}
|
|
64
|
+
const obj = parsed;
|
|
65
|
+
// Validate and coerce each field with a safe fallback.
|
|
66
|
+
const state = {
|
|
67
|
+
running: typeof obj['running'] === 'boolean' ? obj['running'] : false,
|
|
68
|
+
pid: typeof obj['pid'] === 'number'
|
|
69
|
+
? obj['pid']
|
|
70
|
+
: obj['pid'] === null
|
|
71
|
+
? null
|
|
72
|
+
: null,
|
|
73
|
+
startedAt: typeof obj['startedAt'] === 'string' ? obj['startedAt'] : null,
|
|
74
|
+
lastTickAt: typeof obj['lastTickAt'] === 'string' ? obj['lastTickAt'] : null,
|
|
75
|
+
todayDate: typeof obj['todayDate'] === 'string' ? obj['todayDate'] : null,
|
|
76
|
+
todaySpentUsd: typeof obj['todaySpentUsd'] === 'number' ? obj['todaySpentUsd'] : 0,
|
|
77
|
+
itemsProcessed: typeof obj['itemsProcessed'] === 'number' ? obj['itemsProcessed'] : 0,
|
|
78
|
+
ticks: Array.isArray(obj['ticks'])
|
|
79
|
+
? obj['ticks'].filter((t) => typeof t === 'object' &&
|
|
80
|
+
t !== null &&
|
|
81
|
+
!Array.isArray(t) &&
|
|
82
|
+
typeof t['ts'] === 'string')
|
|
83
|
+
: [],
|
|
84
|
+
};
|
|
85
|
+
// Self-heal at the load chokepoint: a daemon killed -9 leaves
|
|
86
|
+
// running:true/pid:<dead> behind; reconcile (read-only liveness) flips it to
|
|
87
|
+
// a truthful stopped state so status/start/tick never see a phantom-live
|
|
88
|
+
// daemon. Observability-only — touches NO spend accounting, NO guard.
|
|
89
|
+
return reconcileDaemonState(state);
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
// Corrupt JSON or any other read error — return zeroed state.
|
|
93
|
+
return freshState();
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// ---------------------------------------------------------------------------
|
|
97
|
+
// Save (atomic)
|
|
98
|
+
// ---------------------------------------------------------------------------
|
|
99
|
+
/**
|
|
100
|
+
* Atomically write DaemonState to daemonStatePath() via tmp-file + rename
|
|
101
|
+
* (POSIX-atomic). Creates ~/.ashlr if needed. Never throws.
|
|
102
|
+
*/
|
|
103
|
+
export function saveDaemonState(s) {
|
|
104
|
+
try {
|
|
105
|
+
const dir = ashlrDir();
|
|
106
|
+
if (!existsSync(dir)) {
|
|
107
|
+
mkdirSync(dir, { recursive: true });
|
|
108
|
+
}
|
|
109
|
+
// Bound ticks history before persisting.
|
|
110
|
+
const bounded = {
|
|
111
|
+
...s,
|
|
112
|
+
ticks: s.ticks.slice(-MAX_TICKS),
|
|
113
|
+
};
|
|
114
|
+
const dest = daemonStatePath();
|
|
115
|
+
const tmp = dest + '.tmp';
|
|
116
|
+
writeFileSync(tmp, JSON.stringify(bounded, null, 2) + '\n', 'utf8');
|
|
117
|
+
renameSync(tmp, dest);
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
// Persistence failure must not crash the daemon — swallow silently.
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// ---------------------------------------------------------------------------
|
|
124
|
+
// Daily budget reset
|
|
125
|
+
// ---------------------------------------------------------------------------
|
|
126
|
+
/**
|
|
127
|
+
* If s.todayDate differs from today's YYYY-MM-DD, return a copy with
|
|
128
|
+
* todayDate set to today and todaySpentUsd reset to 0 (daily budget reset).
|
|
129
|
+
* itemsProcessed and ticks are preserved.
|
|
130
|
+
*
|
|
131
|
+
* Pure-ish: returns the (possibly new) state; caller is responsible for
|
|
132
|
+
* persisting via saveDaemonState().
|
|
133
|
+
*/
|
|
134
|
+
export function resetDayIfNeeded(s) {
|
|
135
|
+
const today = new Date().toISOString().slice(0, 10); // YYYY-MM-DD
|
|
136
|
+
if (s.todayDate === today)
|
|
137
|
+
return s;
|
|
138
|
+
return {
|
|
139
|
+
...s,
|
|
140
|
+
todayDate: today,
|
|
141
|
+
todaySpentUsd: 0,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
// ---------------------------------------------------------------------------
|
|
145
|
+
// Stale-daemon reconciliation (H5 — OBSERVABILITY-ONLY liveness check)
|
|
146
|
+
// ---------------------------------------------------------------------------
|
|
147
|
+
/**
|
|
148
|
+
* READ-ONLY liveness reconcile. If `s.running === true` but the recorded `pid`
|
|
149
|
+
* is NOT alive — `process.kill(pid, 0)` throws `ESRCH` (no such process) — flip
|
|
150
|
+
* `running` to false and `pid` to null so `daemon status` reports a dead daemon
|
|
151
|
+
* as stopped. Otherwise return `s` unchanged.
|
|
152
|
+
*
|
|
153
|
+
* HONEST BOUND (pid reuse): this reports a dead daemon as live ONLY in the rare
|
|
154
|
+
* case where the OS recycled the recorded pid for an unrelated live process
|
|
155
|
+
* (then `process.kill(pid,0)` succeeds and we leave the state unchanged) —
|
|
156
|
+
* inherent to pid-0 liveness. In every other case it is truthful. It is
|
|
157
|
+
* conservative-toward-alive (it NEVER force-flips a genuinely running daemon
|
|
158
|
+
* off), and since it changes no spend/guard the residual false-positive is an
|
|
159
|
+
* observability nicety only, never a safety issue.
|
|
160
|
+
*
|
|
161
|
+
* OBSERVABILITY-ONLY by construction: it touches NO spend accounting
|
|
162
|
+
* (`todaySpentUsd` / `itemsProcessed` / `ticks` are preserved byte-for-byte),
|
|
163
|
+
* NO guard (kill switch / enrollment / sandbox are unaffected), and adds NO
|
|
164
|
+
* capability. It only makes the persisted running/pid pair truthful.
|
|
165
|
+
*
|
|
166
|
+
* Liveness rules (conservative — NEVER destroy a real running daemon's state):
|
|
167
|
+
* - `running !== true` or `pid` not a number => nothing to reconcile => unchanged.
|
|
168
|
+
* - `process.kill(pid, 0)` succeeds => process alive => unchanged.
|
|
169
|
+
* - throws `ESRCH` => process is GONE => flip to { running:false, pid:null }.
|
|
170
|
+
* - throws `EPERM` (exists but not signalable by us) => process EXISTS => alive
|
|
171
|
+
* => unchanged (do NOT flip).
|
|
172
|
+
* - any other/unexpected error => treat as alive => unchanged.
|
|
173
|
+
*
|
|
174
|
+
* Pure-ish: returns the (possibly new) state; caller persists via
|
|
175
|
+
* saveDaemonState(). Never throws.
|
|
176
|
+
*/
|
|
177
|
+
export function reconcileDaemonState(s) {
|
|
178
|
+
if (s.running !== true || typeof s.pid !== 'number') {
|
|
179
|
+
return s;
|
|
180
|
+
}
|
|
181
|
+
try {
|
|
182
|
+
// Signal 0 performs error checking without actually sending a signal.
|
|
183
|
+
process.kill(s.pid, 0);
|
|
184
|
+
// No throw => the process exists and is signalable => treat as alive.
|
|
185
|
+
return s;
|
|
186
|
+
}
|
|
187
|
+
catch (err) {
|
|
188
|
+
const code = err?.code;
|
|
189
|
+
if (code === 'ESRCH') {
|
|
190
|
+
// No such process — the daemon is dead. Flip to a truthful stopped state.
|
|
191
|
+
return { ...s, running: false, pid: null };
|
|
192
|
+
}
|
|
193
|
+
// EPERM (exists, not ours) or any other error => conservatively alive.
|
|
194
|
+
return s;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/core/daemon/state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* core/dashboard.ts — M13 DashboardSnapshot aggregator.
|
|
3
|
+
*
|
|
4
|
+
* Builds a single bounded, read-only DashboardSnapshot by calling the
|
|
5
|
+
* existing data-source modules. Called on every TUI refresh tick (~2s) and
|
|
6
|
+
* by Raycast views; must be fast (<1s) and NEVER throw.
|
|
7
|
+
*
|
|
8
|
+
* MCP health strategy: discoverMcpServers() is synchronous and fast (file
|
|
9
|
+
* reads only). probeServer() is async and spawns child processes — far too
|
|
10
|
+
* slow to call on every tick. We use the discovered spec list as a
|
|
11
|
+
* "last-known configured" proxy: each server is reported ok:true, tools:0
|
|
12
|
+
* (configured but tool count unknown without probing). This keeps the
|
|
13
|
+
* snapshot bounded and sub-second while still surfacing which servers are
|
|
14
|
+
* configured.
|
|
15
|
+
*
|
|
16
|
+
* Genome strategy: we call loadGenome() directly (bounded, never-throws, no
|
|
17
|
+
* child process) and derive entry + distinct-project counts from it. We do
|
|
18
|
+
* NOT call genomeHealth() because it invokes probeEmbeddingsSync(), which
|
|
19
|
+
* runs execFileSync('curl', ...) with a ~2.5s timeout — a synchronous child
|
|
20
|
+
* spawn that would block the event loop (and thus keypress handling) on the
|
|
21
|
+
* ~2s refresh tick. loadGenome keeps the snapshot sub-second and non-blocking.
|
|
22
|
+
*
|
|
23
|
+
* All partial failures degrade to zeroed/empty fields — snapshot is always
|
|
24
|
+
* returned, never null.
|
|
25
|
+
*/
|
|
26
|
+
import type { AshlrConfig, DashboardSnapshot } from './types.js';
|
|
27
|
+
/**
|
|
28
|
+
* Aggregate a DashboardSnapshot from all hub data sources.
|
|
29
|
+
*
|
|
30
|
+
* Calls: loadIndex, getToolsRegistry, buildRollup('7d'), listRuns,
|
|
31
|
+
* listSwarms, discoverMcpServers, loadGenome.
|
|
32
|
+
*
|
|
33
|
+
* Contract:
|
|
34
|
+
* - Async (callers can await without blocking the event loop for I/O).
|
|
35
|
+
* - NEVER throws — any failure degrades its field to zero/empty.
|
|
36
|
+
* - Fast: all underlying calls are synchronous file reads + no child
|
|
37
|
+
* process spawns (MCP probing is skipped; genome embedding probe is
|
|
38
|
+
* skipped). Sub-1s on typical machines.
|
|
39
|
+
*/
|
|
40
|
+
export declare function buildSnapshot(cfg: AshlrConfig): Promise<DashboardSnapshot>;
|