@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,463 @@
|
|
|
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 { loadIndex } from './index-engine.js';
|
|
27
|
+
import { getToolsRegistry } from './tools-registry.js';
|
|
28
|
+
import { buildRollup } from './observability/rollup.js';
|
|
29
|
+
import { listRuns } from './run/orchestrator.js';
|
|
30
|
+
import { listSwarms } from './swarm/store.js';
|
|
31
|
+
import { discoverMcpServers } from './mcp-registry.js';
|
|
32
|
+
import { loadGenome } from './genome/store.js';
|
|
33
|
+
import { pendingCount as inboxPendingCount } from './inbox/store.js';
|
|
34
|
+
// M29: portfolio roll-up sources — all READ-ONLY + enrollment/index-scoped.
|
|
35
|
+
// quality/store.loadPreviousReport (M27) reads the latest PERSISTED HealthReport
|
|
36
|
+
// from ~/.ashlr/quality/ — a bounded file read, NO child process, NO network,
|
|
37
|
+
// NO scan; tick-safe (we never run the live scanners here, see buildPortfolio).
|
|
38
|
+
// listGoals/progressOf/nextActionableMilestone (M28) read
|
|
39
|
+
// ~/.ashlr/goals. loadBacklog (M22) reads ~/.ashlr/backlog.json (no scan; null
|
|
40
|
+
// when absent). buildForecast (M19) reads the local observability rollup.
|
|
41
|
+
// listReports (M26) reads the latest persisted reflection snapshot.
|
|
42
|
+
//
|
|
43
|
+
// These are imported LAZILY (dynamic import inside each sub-block below) rather
|
|
44
|
+
// than statically, so the portfolio sources never enter dashboard.ts's static
|
|
45
|
+
// module graph. This (a) keeps the base buildSnapshot path lean, and (b) avoids
|
|
46
|
+
// pulling a source's transitive module-load side effects (e.g. forecast.ts's
|
|
47
|
+
// top-level binding off observability/rollup.js) into every existing
|
|
48
|
+
// buildSnapshot test — those pre-M29 tests mock only the base sources, so a
|
|
49
|
+
// static import here would crash them at module-load before any try/catch runs.
|
|
50
|
+
// Each call below is wrapped in its own try/catch and degrades to its empty/
|
|
51
|
+
// zeroed default; NO new disk scan is introduced, the M13 index roll-up stands.
|
|
52
|
+
// M24: load daemon state for snapshot — bounded, never-throws
|
|
53
|
+
// Import is a lazy dynamic require so the module resolves only at runtime;
|
|
54
|
+
// if core/daemon/state.ts is absent (e.g. earlier milestone) it degrades to
|
|
55
|
+
// undefined via the try/catch below.
|
|
56
|
+
import { loadDaemonState } from './daemon/state.js';
|
|
57
|
+
// ---------------------------------------------------------------------------
|
|
58
|
+
// Caps — keep snapshot fast and memory-bounded
|
|
59
|
+
// ---------------------------------------------------------------------------
|
|
60
|
+
/** Max recent runs to include in the snapshot. */
|
|
61
|
+
const MAX_RUNS = 8;
|
|
62
|
+
/** Max recent swarms to include in the snapshot. */
|
|
63
|
+
const MAX_SWARMS = 8;
|
|
64
|
+
// ── M29 portfolio caps (keep the org roll-up bounded + sub-second) ──────────
|
|
65
|
+
/** Max worst-scoring repos surfaced in the portfolio health summary. */
|
|
66
|
+
const MAX_WORST_REPOS = 5;
|
|
67
|
+
/** Max in-flight goals surfaced in the portfolio. */
|
|
68
|
+
const MAX_GOALS_IN_FLIGHT = 8;
|
|
69
|
+
/** Max top backlog items surfaced in the portfolio. */
|
|
70
|
+
const MAX_BACKLOG_TOP = 8;
|
|
71
|
+
/** Cost/forecast window used for the portfolio cost block (matches the 7d activity window). */
|
|
72
|
+
const PORTFOLIO_WINDOW = '7d';
|
|
73
|
+
// ---------------------------------------------------------------------------
|
|
74
|
+
// M29: empty/zeroed portfolio defaults (never-throws degradation targets)
|
|
75
|
+
// ---------------------------------------------------------------------------
|
|
76
|
+
/** A zeroed health summary — the default on empty enrollment or M27 failure. */
|
|
77
|
+
function emptyPortfolioHealth() {
|
|
78
|
+
return { reposScored: 0, averageScore: 0, averageGrade: 'F', worstRepos: [] };
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* A fully zeroed/empty PortfolioSummary. Each sub-source overwrites its own
|
|
82
|
+
* field on success; on failure the field keeps this default. The `today` delta
|
|
83
|
+
* block is left null-filled here — the snapshot has no prior to diff against;
|
|
84
|
+
* buildDigest fills it against loadPreviousDigest().
|
|
85
|
+
*/
|
|
86
|
+
function emptyPortfolio() {
|
|
87
|
+
return {
|
|
88
|
+
health: emptyPortfolioHealth(),
|
|
89
|
+
goalsInFlight: [],
|
|
90
|
+
backlogTop: [],
|
|
91
|
+
cost: { window: PORTFOLIO_WINDOW, spentUsd: 0, localSavingsUsd: 0, projectedMonthlyUsd: 0 },
|
|
92
|
+
effectiveness: null,
|
|
93
|
+
today: {
|
|
94
|
+
previousAt: null,
|
|
95
|
+
pendingProposalsDelta: null,
|
|
96
|
+
dirtyReposDelta: null,
|
|
97
|
+
spendUsdDelta: null,
|
|
98
|
+
healthScoreDelta: null,
|
|
99
|
+
goalsInFlightDelta: null,
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
// ---------------------------------------------------------------------------
|
|
104
|
+
// M29: portfolio aggregation — READ-ONLY org roll-up over already-local state.
|
|
105
|
+
//
|
|
106
|
+
// SAFETY: each sub-source is wrapped in its own try/catch (the buildSnapshot
|
|
107
|
+
// model) and degrades to its empty/zeroed default; the whole block can never
|
|
108
|
+
// fail the snapshot. The health source reads the latest PERSISTED snapshot only
|
|
109
|
+
// (no live scan); the goals source is ENROLLMENT-SCOPED (empty enrollment =>
|
|
110
|
+
// empty sections, NO portfolio disk scan). NOTHING here writes —
|
|
111
|
+
// no proposal apply/approve, no config write, no repo mutation, no outward call.
|
|
112
|
+
// ---------------------------------------------------------------------------
|
|
113
|
+
/**
|
|
114
|
+
* Build the OPTIONAL portfolio section. Async only because each sub-source is
|
|
115
|
+
* imported lazily (dynamic import); all the source reads themselves are
|
|
116
|
+
* synchronous, bounded file reads — NO child process, NO network. NEVER throws.
|
|
117
|
+
*/
|
|
118
|
+
async function buildPortfolio(cfg) {
|
|
119
|
+
const portfolio = emptyPortfolio();
|
|
120
|
+
// ── Health (M27) — TICK-SAFE: read the LATEST PERSISTED snapshot, never run
|
|
121
|
+
// the live scanners. computeReport() -> computeHealth() -> runScanners()
|
|
122
|
+
// spawns ~6 child processes PER ENROLLED REPO (rg/grep, `npm outdated`,
|
|
123
|
+
// `npm audit` — both NETWORK to the npm registry, `gh run list`, `find`).
|
|
124
|
+
// buildSnapshot is invoked on EVERY ~2s TUI refresh tick, so recomputing
|
|
125
|
+
// here would hammer the machine and silently break the "sub-1s / no child
|
|
126
|
+
// process spawns" snapshot contract AND invariant #4 (zero non-localhost
|
|
127
|
+
// connections on the default path). Instead we read the persisted
|
|
128
|
+
// HealthReport (a bounded file read; no child process, no network) —
|
|
129
|
+
// mirroring how the genome/MCP sections were made tick-safe. Empty / no
|
|
130
|
+
// prior snapshot => reposScored:0, worstRepos:[], NO scan. The live
|
|
131
|
+
// computeReport() is reserved for the on-demand `ashlr health` run.
|
|
132
|
+
try {
|
|
133
|
+
const { loadPreviousReport } = await import('./quality/store.js');
|
|
134
|
+
const report = loadPreviousReport();
|
|
135
|
+
const reposScored = report ? report.scores.length : 0;
|
|
136
|
+
if (report && reposScored > 0) {
|
|
137
|
+
// computeReport ranks scores worst-first; take the worst N defensively.
|
|
138
|
+
const worst = [...report.scores].sort((a, b) => a.score - b.score).slice(0, MAX_WORST_REPOS);
|
|
139
|
+
portfolio.health = {
|
|
140
|
+
reposScored,
|
|
141
|
+
averageScore: report.averageScore,
|
|
142
|
+
averageGrade: report.averageGrade,
|
|
143
|
+
worstRepos: worst.map((s) => ({ repo: s.repo, score: s.score, grade: s.grade })),
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
portfolio.health = emptyPortfolioHealth();
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
portfolio.health = emptyPortfolioHealth();
|
|
152
|
+
}
|
|
153
|
+
// ── In-flight goals (M28) — active goals only, bounded; most-progressed first.
|
|
154
|
+
try {
|
|
155
|
+
const { listGoals } = await import('./goals/store.js');
|
|
156
|
+
const { progressOf, nextActionableMilestone } = await import('./goals/advance.js');
|
|
157
|
+
const active = listGoals({ status: 'active' });
|
|
158
|
+
const inFlight = [];
|
|
159
|
+
for (const goal of active) {
|
|
160
|
+
const progress = progressOf(goal);
|
|
161
|
+
const next = nextActionableMilestone(goal);
|
|
162
|
+
inFlight.push({
|
|
163
|
+
goalId: goal.id,
|
|
164
|
+
objective: goal.objective,
|
|
165
|
+
status: goal.status,
|
|
166
|
+
fractionDone: progress.fractionDone,
|
|
167
|
+
proposed: progress.proposed,
|
|
168
|
+
totalMilestones: progress.total,
|
|
169
|
+
nextActionable: next ? next.title : null,
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
inFlight.sort((a, b) => b.fractionDone - a.fractionDone);
|
|
173
|
+
portfolio.goalsInFlight = inFlight.slice(0, MAX_GOALS_IN_FLIGHT);
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
portfolio.goalsInFlight = [];
|
|
177
|
+
}
|
|
178
|
+
// ── Top backlog items (M22) — highest score first, bounded. null => empty.
|
|
179
|
+
try {
|
|
180
|
+
const { loadBacklog } = await import('./portfolio/backlog.js');
|
|
181
|
+
const backlog = loadBacklog();
|
|
182
|
+
if (backlog) {
|
|
183
|
+
const top = [...backlog.items]
|
|
184
|
+
.sort((a, b) => b.score - a.score)
|
|
185
|
+
.slice(0, MAX_BACKLOG_TOP)
|
|
186
|
+
.map((item) => ({
|
|
187
|
+
title: item.title,
|
|
188
|
+
repo: item.repo ?? null,
|
|
189
|
+
score: item.score,
|
|
190
|
+
}));
|
|
191
|
+
portfolio.backlogTop = top;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
portfolio.backlogTop = [];
|
|
196
|
+
}
|
|
197
|
+
// ── Cost + forecast (M19) — buildForecast is synchronous + never-throws,
|
|
198
|
+
// but wrap defensively. Reads the local observability rollup only.
|
|
199
|
+
try {
|
|
200
|
+
const { buildForecast } = await import('./observability/forecast.js');
|
|
201
|
+
const forecast = buildForecast(PORTFOLIO_WINDOW, cfg);
|
|
202
|
+
portfolio.cost = {
|
|
203
|
+
window: forecast.window,
|
|
204
|
+
spentUsd: forecast.spentUsd,
|
|
205
|
+
localSavingsUsd: forecast.localSavingsUsd,
|
|
206
|
+
projectedMonthlyUsd: forecast.projectedMonthlyUsd,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
portfolio.cost = { window: PORTFOLIO_WINDOW, spentUsd: 0, localSavingsUsd: 0, projectedMonthlyUsd: 0 };
|
|
211
|
+
}
|
|
212
|
+
// ── Effectiveness headline (M26) — latest reflection report, or null.
|
|
213
|
+
try {
|
|
214
|
+
const { listReports } = await import('./learn/store.js');
|
|
215
|
+
const reports = listReports();
|
|
216
|
+
const latest = reports[0];
|
|
217
|
+
if (latest) {
|
|
218
|
+
const eff = {
|
|
219
|
+
successRate: latest.successRate,
|
|
220
|
+
effectivenessDeltaPct: latest.delta?.effectivenessPct ?? null,
|
|
221
|
+
headline: latest.delta?.headline ?? '',
|
|
222
|
+
};
|
|
223
|
+
portfolio.effectiveness = eff;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
catch {
|
|
227
|
+
portfolio.effectiveness = null;
|
|
228
|
+
}
|
|
229
|
+
return portfolio;
|
|
230
|
+
}
|
|
231
|
+
// ---------------------------------------------------------------------------
|
|
232
|
+
// buildSnapshot
|
|
233
|
+
// ---------------------------------------------------------------------------
|
|
234
|
+
/**
|
|
235
|
+
* Aggregate a DashboardSnapshot from all hub data sources.
|
|
236
|
+
*
|
|
237
|
+
* Calls: loadIndex, getToolsRegistry, buildRollup('7d'), listRuns,
|
|
238
|
+
* listSwarms, discoverMcpServers, loadGenome.
|
|
239
|
+
*
|
|
240
|
+
* Contract:
|
|
241
|
+
* - Async (callers can await without blocking the event loop for I/O).
|
|
242
|
+
* - NEVER throws — any failure degrades its field to zero/empty.
|
|
243
|
+
* - Fast: all underlying calls are synchronous file reads + no child
|
|
244
|
+
* process spawns (MCP probing is skipped; genome embedding probe is
|
|
245
|
+
* skipped). Sub-1s on typical machines.
|
|
246
|
+
*/
|
|
247
|
+
export async function buildSnapshot(cfg) {
|
|
248
|
+
const generatedAt = new Date().toISOString();
|
|
249
|
+
// ── Repos roll-up (from index) ──────────────────────────────────────────
|
|
250
|
+
let reposTotal = 0;
|
|
251
|
+
let reposDirty = 0;
|
|
252
|
+
let reposStale = 0;
|
|
253
|
+
try {
|
|
254
|
+
const index = loadIndex();
|
|
255
|
+
if (index) {
|
|
256
|
+
for (const item of index.items) {
|
|
257
|
+
if (item.kind !== 'repo')
|
|
258
|
+
continue;
|
|
259
|
+
reposTotal++;
|
|
260
|
+
if ((item.git?.dirty ?? 0) > 0)
|
|
261
|
+
reposDirty++;
|
|
262
|
+
if (!item.active)
|
|
263
|
+
reposStale++;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
catch {
|
|
268
|
+
// Degrade to zeros.
|
|
269
|
+
}
|
|
270
|
+
// ── Tools roll-up ────────────────────────────────────────────────────────
|
|
271
|
+
let toolsInstalled = 0;
|
|
272
|
+
let toolsTotal = 0;
|
|
273
|
+
try {
|
|
274
|
+
const registry = getToolsRegistry();
|
|
275
|
+
toolsInstalled = registry.installedCount;
|
|
276
|
+
toolsTotal = registry.tools.length;
|
|
277
|
+
}
|
|
278
|
+
catch {
|
|
279
|
+
// Degrade to zeros.
|
|
280
|
+
}
|
|
281
|
+
// ── Activity roll-up (7d observability) ─────────────────────────────────
|
|
282
|
+
let activitySessions = 0;
|
|
283
|
+
let activityTokens = 0;
|
|
284
|
+
let activityCostUsd = 0;
|
|
285
|
+
let activityCommits = 0;
|
|
286
|
+
try {
|
|
287
|
+
const rollup = buildRollup('7d', cfg);
|
|
288
|
+
activitySessions = rollup.totals.sessions;
|
|
289
|
+
activityTokens = rollup.totals.tokensIn + rollup.totals.tokensOut;
|
|
290
|
+
activityCostUsd = rollup.totals.estCostUsd;
|
|
291
|
+
activityCommits = rollup.totals.commits;
|
|
292
|
+
}
|
|
293
|
+
catch {
|
|
294
|
+
// Degrade to zeros.
|
|
295
|
+
}
|
|
296
|
+
// ── Recent runs ─────────────────────────────────────────────────────────
|
|
297
|
+
const runs = [];
|
|
298
|
+
try {
|
|
299
|
+
const allRuns = listRuns();
|
|
300
|
+
for (const run of allRuns.slice(0, MAX_RUNS)) {
|
|
301
|
+
runs.push({
|
|
302
|
+
id: run.id,
|
|
303
|
+
goal: run.goal,
|
|
304
|
+
status: run.status,
|
|
305
|
+
tokens: (run.usage?.tokensIn ?? 0) + (run.usage?.tokensOut ?? 0),
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
catch {
|
|
310
|
+
// Degrade to empty array.
|
|
311
|
+
}
|
|
312
|
+
// ── Recent swarms ────────────────────────────────────────────────────────
|
|
313
|
+
const swarms = [];
|
|
314
|
+
try {
|
|
315
|
+
const allSwarms = listSwarms();
|
|
316
|
+
for (const swarm of allSwarms.slice(0, MAX_SWARMS)) {
|
|
317
|
+
// Compute burndown from per-task execution state.
|
|
318
|
+
const tasksDone = swarm.tasks.filter((t) => t.status === 'done' || t.status === 'skipped').length;
|
|
319
|
+
const tasksTotal = swarm.tasks.length;
|
|
320
|
+
// Current phase: the phase of the first running task, or the last
|
|
321
|
+
// non-pending phase seen (i.e. the most advanced phase in progress).
|
|
322
|
+
let currentPhase;
|
|
323
|
+
const runningTask = swarm.tasks.find((t) => t.status === 'running');
|
|
324
|
+
if (runningTask) {
|
|
325
|
+
currentPhase = runningTask.phase;
|
|
326
|
+
}
|
|
327
|
+
else {
|
|
328
|
+
// Pick the phase of the most recently completed/failed task.
|
|
329
|
+
for (let i = swarm.tasks.length - 1; i >= 0; i--) {
|
|
330
|
+
const t = swarm.tasks[i];
|
|
331
|
+
if (t.status === 'done' || t.status === 'failed') {
|
|
332
|
+
currentPhase = t.phase;
|
|
333
|
+
break;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
swarms.push({
|
|
338
|
+
id: swarm.id,
|
|
339
|
+
goal: swarm.goal,
|
|
340
|
+
status: swarm.status,
|
|
341
|
+
tasksDone,
|
|
342
|
+
tasksTotal,
|
|
343
|
+
...(currentPhase !== undefined ? { phase: currentPhase } : {}),
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
catch {
|
|
348
|
+
// Degrade to empty array.
|
|
349
|
+
}
|
|
350
|
+
// ── MCP servers (discovered, not probed) ─────────────────────────────────
|
|
351
|
+
// We use the fast synchronous discovery path only. Each configured server
|
|
352
|
+
// is reported ok:true (configured = likely functional), tools:0 (unknown
|
|
353
|
+
// without spawning). This keeps the snapshot sub-second.
|
|
354
|
+
const mcp = [];
|
|
355
|
+
try {
|
|
356
|
+
const registry = discoverMcpServers();
|
|
357
|
+
for (const server of registry.servers) {
|
|
358
|
+
mcp.push({
|
|
359
|
+
name: server.name,
|
|
360
|
+
ok: true,
|
|
361
|
+
tools: 0,
|
|
362
|
+
});
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
catch {
|
|
366
|
+
// Degrade to empty array.
|
|
367
|
+
}
|
|
368
|
+
// ── Genome roll-up ───────────────────────────────────────────────────────
|
|
369
|
+
// Use the probe-free loadGenome() (bounded, never-throws, no child
|
|
370
|
+
// process) rather than genomeHealth(), which would synchronously spawn
|
|
371
|
+
// curl to probe Ollama embeddings and block the refresh/keypress loop.
|
|
372
|
+
let genomeEntries = 0;
|
|
373
|
+
let genomeProjects = 0;
|
|
374
|
+
try {
|
|
375
|
+
const entries = loadGenome(cfg);
|
|
376
|
+
genomeEntries = entries.length;
|
|
377
|
+
const projectSet = new Set();
|
|
378
|
+
for (const e of entries) {
|
|
379
|
+
if (e.project)
|
|
380
|
+
projectSet.add(e.project);
|
|
381
|
+
}
|
|
382
|
+
genomeProjects = projectSet.size;
|
|
383
|
+
}
|
|
384
|
+
catch {
|
|
385
|
+
// Degrade to zeros.
|
|
386
|
+
}
|
|
387
|
+
// ── Inbox roll-up (M23) ──────────────────────────────────────────────────
|
|
388
|
+
// pendingCount() is bounded, synchronous, never-throws — returns 0 on any
|
|
389
|
+
// error. We wrap defensively anyway since snapshot must never throw.
|
|
390
|
+
let inboxPending = 0;
|
|
391
|
+
try {
|
|
392
|
+
inboxPending = inboxPendingCount();
|
|
393
|
+
}
|
|
394
|
+
catch {
|
|
395
|
+
// Degrade to 0.
|
|
396
|
+
}
|
|
397
|
+
// ── Daemon roll-up (M24) ─────────────────────────────────────────────────
|
|
398
|
+
// loadDaemonState() is bounded, synchronous, never-throws — returns a
|
|
399
|
+
// fresh zeroed state on missing/corrupt file. We wrap defensively anyway.
|
|
400
|
+
// We reuse inboxPendingCount() already computed above for pendingProposals.
|
|
401
|
+
let daemonRunning = false;
|
|
402
|
+
let daemonSpentUsd = 0;
|
|
403
|
+
try {
|
|
404
|
+
const ds = loadDaemonState();
|
|
405
|
+
daemonRunning = ds.running;
|
|
406
|
+
daemonSpentUsd = ds.todaySpentUsd;
|
|
407
|
+
}
|
|
408
|
+
catch {
|
|
409
|
+
// Degrade to zeroed fields — daemon not yet initialised.
|
|
410
|
+
}
|
|
411
|
+
// ── M29 portfolio roll-up (OPTIONAL org view) ────────────────────────────
|
|
412
|
+
// Runs after all base sections. READ-ONLY aggregation, enrollment-scoped,
|
|
413
|
+
// never-throws — buildPortfolio wraps every sub-source and degrades to its
|
|
414
|
+
// empty/zeroed default. We still wrap the whole call defensively so the base
|
|
415
|
+
// snapshot (and all pre-M29 producers/tests) is unaffected on any failure.
|
|
416
|
+
let portfolio;
|
|
417
|
+
try {
|
|
418
|
+
portfolio = await buildPortfolio(cfg);
|
|
419
|
+
}
|
|
420
|
+
catch {
|
|
421
|
+
// Leave portfolio undefined — absent => "not populated", base snapshot intact.
|
|
422
|
+
portfolio = undefined;
|
|
423
|
+
}
|
|
424
|
+
return {
|
|
425
|
+
generatedAt,
|
|
426
|
+
repos: {
|
|
427
|
+
total: reposTotal,
|
|
428
|
+
dirty: reposDirty,
|
|
429
|
+
stale: reposStale,
|
|
430
|
+
},
|
|
431
|
+
tools: {
|
|
432
|
+
installed: toolsInstalled,
|
|
433
|
+
total: toolsTotal,
|
|
434
|
+
},
|
|
435
|
+
activity: {
|
|
436
|
+
sessions: activitySessions,
|
|
437
|
+
tokens: activityTokens,
|
|
438
|
+
estCostUsd: activityCostUsd,
|
|
439
|
+
commits: activityCommits,
|
|
440
|
+
},
|
|
441
|
+
runs,
|
|
442
|
+
swarms,
|
|
443
|
+
mcp,
|
|
444
|
+
genome: {
|
|
445
|
+
entries: genomeEntries,
|
|
446
|
+
projects: genomeProjects,
|
|
447
|
+
},
|
|
448
|
+
inbox: {
|
|
449
|
+
pending: inboxPending,
|
|
450
|
+
},
|
|
451
|
+
// M24: daemon status — READ-ONLY surface; absent == not running / no spend.
|
|
452
|
+
daemon: {
|
|
453
|
+
running: daemonRunning,
|
|
454
|
+
todaySpentUsd: daemonSpentUsd,
|
|
455
|
+
pendingProposals: inboxPending,
|
|
456
|
+
},
|
|
457
|
+
// M29: OPTIONAL portfolio section — omitted entirely when the roll-up
|
|
458
|
+
// could not be built, so existing producers/tests (which never set it)
|
|
459
|
+
// stay valid and `portfolio === undefined` reads as "not populated".
|
|
460
|
+
...(portfolio !== undefined ? { portfolio } : {}),
|
|
461
|
+
};
|
|
462
|
+
}
|
|
463
|
+
//# sourceMappingURL=dashboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/core/dashboard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* core/digest/build.ts — M29 deterministic daily digest builder.
|
|
3
|
+
*
|
|
4
|
+
* buildDigest(cfg, opts) computes a deterministic DAILY DIGEST from the M13/M24
|
|
5
|
+
* DashboardSnapshot (incl. its M29 `portfolio` section, populated by
|
|
6
|
+
* core/dashboard.ts) plus day-over-day deltas vs the previous persisted digest
|
|
7
|
+
* (loadPreviousDigest). An OPTIONAL LLM narrative is OFF unless opts.narrative
|
|
8
|
+
* is explicitly set; when on it routes through getActiveClient — local-only
|
|
9
|
+
* unless allowCloud + a key.
|
|
10
|
+
*
|
|
11
|
+
* HARD SAFETY INVARIANTS (M29) enforced here:
|
|
12
|
+
* - READ-ONLY AGGREGATION: reads ONLY buildSnapshot(cfg) (which itself only
|
|
13
|
+
* reads local state) + loadPreviousDigest() (local disk). Writes NOTHING —
|
|
14
|
+
* persistence is deliver.ts's job. Never mutates a repo, never writes config.
|
|
15
|
+
* - NO OUTWARD ACTION BY DEFAULT: building a digest makes ZERO non-localhost
|
|
16
|
+
* connections on the default path. Narrative is the only egress and only when
|
|
17
|
+
* opts.allowCloud + a cloud key; local providers are localhost-only.
|
|
18
|
+
* - ENROLLMENT-SCOPED: the portfolio's health/goals sub-sections are sourced
|
|
19
|
+
* from buildSnapshot, which is enrollment-scoped (empty enrollment => empty).
|
|
20
|
+
* buildDigest introduces NO new path scan of its own.
|
|
21
|
+
* - LOCAL-FIRST: all numeric aggregation + the headline are deterministic with
|
|
22
|
+
* NO model. Narrative is EXPLICITLY OPT-IN (opts.narrative); the default path
|
|
23
|
+
* constructs NO model at all (not even a reachable local one). When opted in,
|
|
24
|
+
* it routes through getActiveClient(cfg, { allowCloud }) — local-only unless
|
|
25
|
+
* allowCloud + a cloud key (mirror M26 reflect's `narrative` gate).
|
|
26
|
+
* - BOUNDED + NEVER-THROWS: every step is wrapped; a missing snapshot/portfolio
|
|
27
|
+
* degrades to a zeroed digest. List sizes are inherited from the snapshot's
|
|
28
|
+
* already-capped portfolio lists.
|
|
29
|
+
*/
|
|
30
|
+
import type { AshlrConfig, DigestOptions, DigestReport } from '../types.js';
|
|
31
|
+
/**
|
|
32
|
+
* Build a deterministic DigestReport for "today".
|
|
33
|
+
*
|
|
34
|
+
* Contract:
|
|
35
|
+
* - Async; NEVER throws — any failed step degrades to its zeroed default.
|
|
36
|
+
* - Default path (no allowCloud) makes ZERO non-localhost connections.
|
|
37
|
+
* - Deterministic given the same snapshot + prior digest.
|
|
38
|
+
*
|
|
39
|
+
* Steps (TODO bodies):
|
|
40
|
+
* 1. snapshot = await buildSnapshot(cfg) (read-only; never throws).
|
|
41
|
+
* 2. portfolio = snapshot.portfolio ?? emptyPortfolio(window).
|
|
42
|
+
* 3. previous = loadPreviousDigest(generatedAt) — the prior day's digest.
|
|
43
|
+
* 4. Compute portfolio.today deltas vs `previous` (pending/dirty/spend/health/
|
|
44
|
+
* goals); leave each null when there is no prior.
|
|
45
|
+
* 5. Compose the deterministic `headline` (templated; no LLM).
|
|
46
|
+
* 6. OPTIONAL narrative — ONLY when opts.narrative === true (else NO model is
|
|
47
|
+
* constructed). Then getActiveClient(cfg, { allowCloud }) opens a provider
|
|
48
|
+
* (local-only unless allowCloud + key); set narrative + narrativeLocal.
|
|
49
|
+
* On any model error keep the deterministic report (no narrative).
|
|
50
|
+
*/
|
|
51
|
+
export declare function buildDigest(cfg: AshlrConfig, opts?: DigestOptions): Promise<DigestReport>;
|