@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,558 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/tui/render.ts
|
|
3
|
+
*
|
|
4
|
+
* PURE renderer for the interactive TUI dashboard.
|
|
5
|
+
*
|
|
6
|
+
* renderFrame(snap, state) → complete ANSI frame string sized to
|
|
7
|
+
* state.cols × state.rows. No I/O, no side-effects, no timers.
|
|
8
|
+
* Fully testable by snapshotting the returned string.
|
|
9
|
+
*
|
|
10
|
+
* Uses ONLY src/cli/ui.ts helpers (C, stripAnsi, pad, makeColors)
|
|
11
|
+
* and Node built-ins. Zero new runtime deps.
|
|
12
|
+
*/
|
|
13
|
+
import { C, stripAnsi, pad, makeColors } from '../cli/ui.js';
|
|
14
|
+
export function renderFrame(snap, state) {
|
|
15
|
+
const { tab, selected, cols, rows } = state;
|
|
16
|
+
// Always render with color (we're building an ANSI string; callers decide
|
|
17
|
+
// whether to write it to a TTY).
|
|
18
|
+
const col = makeColors(true);
|
|
19
|
+
const lines = [];
|
|
20
|
+
// 1. Header (logo + tab bar + clock)
|
|
21
|
+
lines.push(...buildHeader(snap, tab, cols, col));
|
|
22
|
+
// 2. Body (tab-specific content)
|
|
23
|
+
const headerRows = lines.length;
|
|
24
|
+
const footerRows = 1;
|
|
25
|
+
const bodyRows = Math.max(0, rows - headerRows - footerRows);
|
|
26
|
+
lines.push(...buildBody(snap, tab, selected, cols, bodyRows, col));
|
|
27
|
+
// 3. Footer (key hints)
|
|
28
|
+
lines.push(buildFooter(cols, col));
|
|
29
|
+
// Clip to rows (never overflow terminal height)
|
|
30
|
+
const clipped = lines.slice(0, rows);
|
|
31
|
+
// Pad to exactly `rows` lines so the alt-screen is fully painted
|
|
32
|
+
while (clipped.length < rows) {
|
|
33
|
+
clipped.push(fitLine('', cols));
|
|
34
|
+
}
|
|
35
|
+
return clipped.join('\n');
|
|
36
|
+
}
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
// Header
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
const TABS = [
|
|
41
|
+
{ id: 'overview', label: 'Overview', key: '1' },
|
|
42
|
+
{ id: 'runs', label: 'Runs', key: '2' },
|
|
43
|
+
{ id: 'swarms', label: 'Swarms', key: '3' },
|
|
44
|
+
{ id: 'pulse', label: 'Pulse', key: '4' },
|
|
45
|
+
{ id: 'mcp', label: 'MCP', key: '5' },
|
|
46
|
+
{ id: 'inbox', label: 'Inbox', key: '6' },
|
|
47
|
+
// M29: read-only org-level portfolio tab.
|
|
48
|
+
{ id: 'portfolio', label: 'Portfolio', key: '7' },
|
|
49
|
+
];
|
|
50
|
+
function buildHeader(snap, activeTab, cols, col) {
|
|
51
|
+
// Row 1: Logo + clock
|
|
52
|
+
const logo = col.bold(col.cyan(' ashlr hub'));
|
|
53
|
+
const clock = col.dim(formatClock(snap.generatedAt));
|
|
54
|
+
const logoLine = fitLine(logo + ' '.repeat(Math.max(1, cols - stripAnsi(logo).length - stripAnsi(clock).length)) + clock, cols);
|
|
55
|
+
// Row 2: Tab bar
|
|
56
|
+
const tabParts = TABS.map(t => {
|
|
57
|
+
const label = ` ${t.key}:${t.label} `;
|
|
58
|
+
return t.id === activeTab
|
|
59
|
+
? col.bold(`\x1b[7m${label}${C.reset}`) // reverse-video for active tab
|
|
60
|
+
: col.dim(label);
|
|
61
|
+
});
|
|
62
|
+
const tabLine = fitLine(tabParts.join(col.dim('│')), cols);
|
|
63
|
+
// Row 3: separator
|
|
64
|
+
const sep = col.dim('─'.repeat(cols));
|
|
65
|
+
return [logoLine, tabLine, sep];
|
|
66
|
+
}
|
|
67
|
+
// ---------------------------------------------------------------------------
|
|
68
|
+
// Body dispatch
|
|
69
|
+
// ---------------------------------------------------------------------------
|
|
70
|
+
function buildBody(snap, tab, selected, cols, bodyRows, col) {
|
|
71
|
+
switch (tab) {
|
|
72
|
+
case 'overview': return bodyOverview(snap, cols, bodyRows, col);
|
|
73
|
+
case 'runs': return bodyRuns(snap, selected, cols, bodyRows, col);
|
|
74
|
+
case 'swarms': return bodySwarms(snap, selected, cols, bodyRows, col);
|
|
75
|
+
case 'pulse': return bodyPulse(snap, cols, bodyRows, col);
|
|
76
|
+
case 'mcp': return bodyMcp(snap, selected, cols, bodyRows, col);
|
|
77
|
+
case 'inbox': return bodyInbox(snap, cols, bodyRows, col);
|
|
78
|
+
// M29: read-only org-level portfolio view (health/goals/backlog/cost/today).
|
|
79
|
+
case 'portfolio': return bodyPortfolio(snap, cols, bodyRows, col);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// ---------------------------------------------------------------------------
|
|
83
|
+
// Tab: Overview
|
|
84
|
+
// ---------------------------------------------------------------------------
|
|
85
|
+
function bodyOverview(snap, cols, bodyRows, col) {
|
|
86
|
+
const lines = [];
|
|
87
|
+
const add = (s) => lines.push(fitLine(s, cols));
|
|
88
|
+
const blank = () => add('');
|
|
89
|
+
blank();
|
|
90
|
+
// ── Repos ─────────────────────────────────────────────────────────────────
|
|
91
|
+
add(col.bold(col.blue(' ◆ Repos')));
|
|
92
|
+
add(` Total: ${col.cyan(String(snap.repos.total))}` +
|
|
93
|
+
` Dirty: ${snap.repos.dirty > 0 ? col.yellow(String(snap.repos.dirty)) : col.green('0')}` +
|
|
94
|
+
` Stale: ${snap.repos.stale > 0 ? col.dim(String(snap.repos.stale)) : col.green('0')}`);
|
|
95
|
+
blank();
|
|
96
|
+
// ── Tools ─────────────────────────────────────────────────────────────────
|
|
97
|
+
add(col.bold(col.blue(' ◆ Ecosystem Tools')));
|
|
98
|
+
const toolBar = progressBar(snap.tools.installed, snap.tools.total, 20, col);
|
|
99
|
+
add(` ${toolBar} ${col.cyan(String(snap.tools.installed))}/${snap.tools.total} installed`);
|
|
100
|
+
blank();
|
|
101
|
+
// ── Activity ──────────────────────────────────────────────────────────────
|
|
102
|
+
add(col.bold(col.blue(' ◆ Activity (7d)')));
|
|
103
|
+
add(` Sessions: ${col.cyan(String(snap.activity.sessions))}` +
|
|
104
|
+
` Tokens: ${col.cyan(fmtNum(snap.activity.tokens))}` +
|
|
105
|
+
` Cost: ${col.yellow('$' + snap.activity.estCostUsd.toFixed(2))}` +
|
|
106
|
+
` Commits: ${col.cyan(String(snap.activity.commits))}`);
|
|
107
|
+
blank();
|
|
108
|
+
// ── Genome ────────────────────────────────────────────────────────────────
|
|
109
|
+
add(col.bold(col.blue(' ◆ Genome')));
|
|
110
|
+
add(` Entries: ${col.cyan(String(snap.genome.entries))}` +
|
|
111
|
+
` Projects: ${col.cyan(String(snap.genome.projects))}`);
|
|
112
|
+
blank();
|
|
113
|
+
// ── Quick counts ──────────────────────────────────────────────────────────
|
|
114
|
+
const runCount = snap.runs.length;
|
|
115
|
+
const swarmCount = snap.swarms.length;
|
|
116
|
+
const mcpCount = snap.mcp.filter(m => m.ok).length;
|
|
117
|
+
const inboxPend = snap.inbox?.pending ?? 0;
|
|
118
|
+
add(col.dim(` Runs: ${runCount} Swarms: ${swarmCount} MCP servers up: ${mcpCount}/${snap.mcp.length}`));
|
|
119
|
+
if (inboxPend > 0) {
|
|
120
|
+
blank();
|
|
121
|
+
add(col.bold(col.yellow(' ⚠ Inbox: ')) +
|
|
122
|
+
col.yellow(String(inboxPend)) +
|
|
123
|
+
col.yellow(inboxPend === 1 ? ' proposal awaiting approval' : ' proposals awaiting approval') +
|
|
124
|
+
col.dim(' (use `ashlr inbox approve <id>` to act)'));
|
|
125
|
+
}
|
|
126
|
+
// ── Daemon status (M24) ──────────────────────────────────────────────────
|
|
127
|
+
// snap.daemon is optional — absent when daemon/state.ts not yet present.
|
|
128
|
+
if (snap.daemon) {
|
|
129
|
+
const d = snap.daemon;
|
|
130
|
+
const statusStr = d.running
|
|
131
|
+
? col.green('running')
|
|
132
|
+
: col.dim('idle');
|
|
133
|
+
blank();
|
|
134
|
+
add(col.bold(col.blue(' ◆ Daemon')));
|
|
135
|
+
add(` Status: ${statusStr}` +
|
|
136
|
+
` Spend today: ${col.yellow('$' + d.todaySpentUsd.toFixed(4))}` +
|
|
137
|
+
` Pending proposals: ${d.pendingProposals > 0 ? col.yellow(String(d.pendingProposals)) : col.dim('0')}`);
|
|
138
|
+
}
|
|
139
|
+
return padToRows(lines, bodyRows, cols);
|
|
140
|
+
}
|
|
141
|
+
// ---------------------------------------------------------------------------
|
|
142
|
+
// Tab: Runs
|
|
143
|
+
// ---------------------------------------------------------------------------
|
|
144
|
+
function bodyRuns(snap, selected, cols, bodyRows, col) {
|
|
145
|
+
const lines = [];
|
|
146
|
+
if (snap.runs.length === 0) {
|
|
147
|
+
lines.push(fitLine(col.dim(' (no runs)'), cols));
|
|
148
|
+
return padToRows(lines, bodyRows, cols);
|
|
149
|
+
}
|
|
150
|
+
// Column widths (fixed, then goal gets the rest)
|
|
151
|
+
const idW = 12;
|
|
152
|
+
const statusW = 10;
|
|
153
|
+
const tokW = 10;
|
|
154
|
+
const sep = ' ';
|
|
155
|
+
const goalW = Math.max(8, cols - idW - statusW - tokW - sep.length * 3 - 1);
|
|
156
|
+
// Header row
|
|
157
|
+
lines.push(fitLine(col.bold(pad(' ID', idW) + sep +
|
|
158
|
+
pad('Goal', goalW) + sep +
|
|
159
|
+
pad('Status', statusW) + sep +
|
|
160
|
+
pad('Tokens', tokW, 'right')), cols));
|
|
161
|
+
lines.push(fitLine(col.dim('─'.repeat(cols)), cols));
|
|
162
|
+
snap.runs.forEach((r, i) => {
|
|
163
|
+
const isSelected = i === selected;
|
|
164
|
+
const statusColor = statusColorize(r.status, col);
|
|
165
|
+
const id = trunc(r.id, idW);
|
|
166
|
+
const goal = trunc(r.goal, goalW);
|
|
167
|
+
const status = trunc(r.status, statusW);
|
|
168
|
+
const tokens = fmtNum(r.tokens);
|
|
169
|
+
const rowText = pad(id, idW) + sep +
|
|
170
|
+
pad(goal, goalW) + sep +
|
|
171
|
+
pad(statusColor(status), statusW) + sep +
|
|
172
|
+
pad(tokens, tokW, 'right');
|
|
173
|
+
lines.push(fitLine(isSelected ? `\x1b[7m${rowText}${C.reset}` : rowText, cols));
|
|
174
|
+
});
|
|
175
|
+
return padToRows(lines, bodyRows, cols);
|
|
176
|
+
}
|
|
177
|
+
// ---------------------------------------------------------------------------
|
|
178
|
+
// Tab: Swarms
|
|
179
|
+
// ---------------------------------------------------------------------------
|
|
180
|
+
function bodySwarms(snap, selected, cols, bodyRows, col) {
|
|
181
|
+
const lines = [];
|
|
182
|
+
if (snap.swarms.length === 0) {
|
|
183
|
+
lines.push(fitLine(col.dim(' (no swarms)'), cols));
|
|
184
|
+
return padToRows(lines, bodyRows, cols);
|
|
185
|
+
}
|
|
186
|
+
const idW = 12;
|
|
187
|
+
const statusW = 10;
|
|
188
|
+
const phaseW = 12;
|
|
189
|
+
const barW = 18;
|
|
190
|
+
const sep = ' ';
|
|
191
|
+
const goalW = Math.max(8, cols - idW - statusW - phaseW - barW - sep.length * 4 - 1);
|
|
192
|
+
lines.push(fitLine(col.bold(pad(' ID', idW) + sep +
|
|
193
|
+
pad('Goal', goalW) + sep +
|
|
194
|
+
pad('Status', statusW) + sep +
|
|
195
|
+
pad('Phase', phaseW) + sep +
|
|
196
|
+
pad('Progress', barW)), cols));
|
|
197
|
+
lines.push(fitLine(col.dim('─'.repeat(cols)), cols));
|
|
198
|
+
snap.swarms.forEach((s, i) => {
|
|
199
|
+
const isSelected = i === selected;
|
|
200
|
+
const statusColor = statusColorize(s.status, col);
|
|
201
|
+
const bar = progressBar(s.tasksDone, s.tasksTotal, barW - 8, col);
|
|
202
|
+
const prog = `${bar} ${s.tasksDone}/${s.tasksTotal}`;
|
|
203
|
+
const id = trunc(s.id, idW);
|
|
204
|
+
const goal = trunc(s.goal, goalW);
|
|
205
|
+
const status = trunc(s.status, statusW);
|
|
206
|
+
const phase = trunc(s.phase ?? '—', phaseW);
|
|
207
|
+
const rowText = pad(id, idW) + sep +
|
|
208
|
+
pad(goal, goalW) + sep +
|
|
209
|
+
pad(statusColor(status), statusW) + sep +
|
|
210
|
+
pad(col.dim(phase), phaseW) + sep +
|
|
211
|
+
prog;
|
|
212
|
+
lines.push(fitLine(isSelected ? `\x1b[7m${rowText}${C.reset}` : rowText, cols));
|
|
213
|
+
});
|
|
214
|
+
return padToRows(lines, bodyRows, cols);
|
|
215
|
+
}
|
|
216
|
+
// ---------------------------------------------------------------------------
|
|
217
|
+
// Tab: Pulse
|
|
218
|
+
// ---------------------------------------------------------------------------
|
|
219
|
+
function bodyPulse(snap, cols, bodyRows, col) {
|
|
220
|
+
const lines = [];
|
|
221
|
+
const add = (s) => lines.push(fitLine(s, cols));
|
|
222
|
+
const blank = () => add('');
|
|
223
|
+
blank();
|
|
224
|
+
add(col.bold(col.blue(' ◆ Activity — 7d Totals')));
|
|
225
|
+
blank();
|
|
226
|
+
const { sessions, tokens, estCostUsd, commits } = snap.activity;
|
|
227
|
+
add(` Sessions : ${col.cyan(String(sessions))}`);
|
|
228
|
+
add(` Tokens : ${col.cyan(fmtNum(tokens))}`);
|
|
229
|
+
add(` Est. Cost: ${col.yellow('$' + estCostUsd.toFixed(4))}`);
|
|
230
|
+
add(` Commits : ${col.cyan(String(commits))}`);
|
|
231
|
+
blank();
|
|
232
|
+
// Mini token bar (visual proportion relative to a reference scale).
|
|
233
|
+
// Clamp to a non-negative floor (defense in depth — fullBar is the
|
|
234
|
+
// load-bearing clamp, but this keeps BAR_W sane on narrow terminals).
|
|
235
|
+
const BAR_W = Math.max(0, Math.min(40, cols - 16));
|
|
236
|
+
if (tokens > 0) {
|
|
237
|
+
add(col.bold(col.blue(' ◆ Token Usage Bar')));
|
|
238
|
+
const bar = fullBar(tokens, BAR_W, col);
|
|
239
|
+
add(` ${bar} ${fmtNum(tokens)} tok`);
|
|
240
|
+
blank();
|
|
241
|
+
}
|
|
242
|
+
// Cost breakdown note
|
|
243
|
+
add(col.dim(' Tip: use `ashlr pulse` for full per-project / per-day breakdown.'));
|
|
244
|
+
return padToRows(lines, bodyRows, cols);
|
|
245
|
+
}
|
|
246
|
+
// ---------------------------------------------------------------------------
|
|
247
|
+
// Tab: MCP
|
|
248
|
+
// ---------------------------------------------------------------------------
|
|
249
|
+
function bodyMcp(snap, selected, cols, bodyRows, col) {
|
|
250
|
+
const lines = [];
|
|
251
|
+
if (snap.mcp.length === 0) {
|
|
252
|
+
lines.push(fitLine(col.dim(' (no MCP servers discovered)'), cols));
|
|
253
|
+
return padToRows(lines, bodyRows, cols);
|
|
254
|
+
}
|
|
255
|
+
const statusW = 6;
|
|
256
|
+
const toolsW = 7;
|
|
257
|
+
const sep = ' ';
|
|
258
|
+
const nameW = Math.max(10, cols - statusW - toolsW - sep.length * 2 - 1);
|
|
259
|
+
lines.push(fitLine(col.bold(pad(' Name', nameW) + sep +
|
|
260
|
+
pad('Status', statusW) + sep +
|
|
261
|
+
pad('Tools', toolsW, 'right')), cols));
|
|
262
|
+
lines.push(fitLine(col.dim('─'.repeat(cols)), cols));
|
|
263
|
+
snap.mcp.forEach((m, i) => {
|
|
264
|
+
const isSelected = i === selected;
|
|
265
|
+
const statusStr = m.ok ? col.green(' ●') : col.red(' ●');
|
|
266
|
+
const nameStr = trunc(m.name, nameW);
|
|
267
|
+
const toolsStr = String(m.tools);
|
|
268
|
+
const rowText = pad(nameStr, nameW) + sep +
|
|
269
|
+
pad(statusStr, statusW) + sep +
|
|
270
|
+
pad(toolsStr, toolsW, 'right');
|
|
271
|
+
lines.push(fitLine(isSelected ? `\x1b[7m${rowText}${C.reset}` : rowText, cols));
|
|
272
|
+
});
|
|
273
|
+
// Summary
|
|
274
|
+
const upCount = snap.mcp.filter(m => m.ok).length;
|
|
275
|
+
lines.push('');
|
|
276
|
+
lines.push(fitLine(col.dim(` ${upCount}/${snap.mcp.length} servers online`), cols));
|
|
277
|
+
return padToRows(lines, bodyRows, cols);
|
|
278
|
+
}
|
|
279
|
+
// ---------------------------------------------------------------------------
|
|
280
|
+
// Tab: Inbox (M23 — read-only; approve via `ashlr inbox approve <id>`)
|
|
281
|
+
// ---------------------------------------------------------------------------
|
|
282
|
+
// ---------------------------------------------------------------------------
|
|
283
|
+
// Tab: Portfolio (M29) — READ-ONLY org-level view
|
|
284
|
+
// ---------------------------------------------------------------------------
|
|
285
|
+
/**
|
|
286
|
+
* M29: render the org-level portfolio tab from the OPTIONAL
|
|
287
|
+
* `snap.portfolio` section. READ-ONLY display only — renders the health
|
|
288
|
+
* summary (avg + worst repos), in-flight goals, top backlog, cost + forecast,
|
|
289
|
+
* the effectiveness headline, and the "today" day-over-day delta block. When
|
|
290
|
+
* `snap.portfolio` is absent (older producer / empty enrollment) it renders a
|
|
291
|
+
* single "no portfolio data" line. This function performs NO I/O and mutates
|
|
292
|
+
* nothing.
|
|
293
|
+
*/
|
|
294
|
+
function bodyPortfolio(snap, cols, bodyRows, col) {
|
|
295
|
+
const lines = [];
|
|
296
|
+
const add = (s) => lines.push(fitLine(s, cols));
|
|
297
|
+
const blank = () => add('');
|
|
298
|
+
const p = snap.portfolio;
|
|
299
|
+
// Degrade gracefully when no portfolio section was populated (older producer
|
|
300
|
+
// or empty enrollment with no sources). Read-only: this function performs no
|
|
301
|
+
// I/O and mutates nothing.
|
|
302
|
+
if (!p) {
|
|
303
|
+
blank();
|
|
304
|
+
add(col.bold(col.blue(' ◆ Portfolio')));
|
|
305
|
+
blank();
|
|
306
|
+
add(col.dim(' No portfolio data. Enroll repos and run `ashlr health`'));
|
|
307
|
+
add(col.dim(' / `ashlr goals` to populate the org-level view.'));
|
|
308
|
+
return padToRows(lines, bodyRows, cols);
|
|
309
|
+
}
|
|
310
|
+
blank();
|
|
311
|
+
add(col.bold(col.blue(' ◆ Portfolio — Org Health')));
|
|
312
|
+
// ── Health (M27 — enrollment-scoped) ────────────────────────────────────
|
|
313
|
+
const h = p.health;
|
|
314
|
+
if (h.reposScored > 0) {
|
|
315
|
+
add(` Repos scored: ${col.cyan(String(h.reposScored))}` +
|
|
316
|
+
` Avg score: ${col.cyan(String(Math.round(h.averageScore)))}` +
|
|
317
|
+
` Grade: ${gradeColorize(h.averageGrade, col)(h.averageGrade)}`);
|
|
318
|
+
if (h.worstRepos.length > 0) {
|
|
319
|
+
add(col.dim(' Needs attention:'));
|
|
320
|
+
for (const w of h.worstRepos) {
|
|
321
|
+
add(` ${col.dim(repoLabel(w.repo))}` +
|
|
322
|
+
` ${gradeColorize(w.grade, col)(w.grade)}` +
|
|
323
|
+
` ${col.dim('(' + Math.round(w.score) + ')')}`);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
else {
|
|
328
|
+
add(col.dim(' No enrolled repos scored.'));
|
|
329
|
+
}
|
|
330
|
+
blank();
|
|
331
|
+
// ── In-flight goals (M28) ────────────────────────────────────────────────
|
|
332
|
+
add(col.bold(col.blue(' ◆ Goals in flight')));
|
|
333
|
+
if (p.goalsInFlight.length === 0) {
|
|
334
|
+
add(col.dim(' None active.'));
|
|
335
|
+
}
|
|
336
|
+
else {
|
|
337
|
+
for (const g of p.goalsInFlight) {
|
|
338
|
+
const pct = Math.round(clamp01(g.fractionDone) * 100);
|
|
339
|
+
const bar = progressBar(Math.round(clamp01(g.fractionDone) * 10), 10, 12, col);
|
|
340
|
+
add(` ${bar} ${col.cyan(String(pct) + '%')} ` +
|
|
341
|
+
`${trunc(g.objective, Math.max(8, cols - 28))}`);
|
|
342
|
+
if (g.nextActionable) {
|
|
343
|
+
add(col.dim(` next: ${trunc(g.nextActionable, Math.max(8, cols - 14))}`));
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
blank();
|
|
348
|
+
// ── Top backlog (M22) ────────────────────────────────────────────────────
|
|
349
|
+
add(col.bold(col.blue(' ◆ Top backlog')));
|
|
350
|
+
if (p.backlogTop.length === 0) {
|
|
351
|
+
add(col.dim(' Empty.'));
|
|
352
|
+
}
|
|
353
|
+
else {
|
|
354
|
+
for (const item of p.backlogTop) {
|
|
355
|
+
add(` ${col.dim(String(Math.round(item.score)).padStart(4))} ` +
|
|
356
|
+
`${trunc(item.title, Math.max(8, cols - 10))}`);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
blank();
|
|
360
|
+
// ── Cost + forecast (M19) ────────────────────────────────────────────────
|
|
361
|
+
add(col.bold(col.blue(' ◆ Cost (' + p.cost.window + ')')));
|
|
362
|
+
add(` Spent: ${col.yellow('$' + p.cost.spentUsd.toFixed(2))}` +
|
|
363
|
+
` Saved (local): ${col.green('$' + p.cost.localSavingsUsd.toFixed(2))}` +
|
|
364
|
+
` Proj./mo: ${col.yellow('$' + p.cost.projectedMonthlyUsd.toFixed(2))}`);
|
|
365
|
+
// ── Effectiveness (M26) ──────────────────────────────────────────────────
|
|
366
|
+
if (p.effectiveness) {
|
|
367
|
+
blank();
|
|
368
|
+
add(col.bold(col.blue(' ◆ Effectiveness')));
|
|
369
|
+
add(` ${col.dim(trunc(p.effectiveness.headline, Math.max(8, cols - 4)))}`);
|
|
370
|
+
}
|
|
371
|
+
// ── Today (day-over-day deltas; null until a prior digest exists) ────────
|
|
372
|
+
blank();
|
|
373
|
+
add(col.bold(col.blue(' ◆ Today')));
|
|
374
|
+
const t = p.today;
|
|
375
|
+
if (t.previousAt === null) {
|
|
376
|
+
add(col.dim(' No prior digest to compare against yet.'));
|
|
377
|
+
}
|
|
378
|
+
else {
|
|
379
|
+
add(` Pending: ${signedDelta(t.pendingProposalsDelta, col)}` +
|
|
380
|
+
` Dirty: ${signedDelta(t.dirtyReposDelta, col)}` +
|
|
381
|
+
` Spend: ${signedUsdDelta(t.spendUsdDelta, col)}` +
|
|
382
|
+
` Health: ${signedDelta(t.healthScoreDelta, col)}` +
|
|
383
|
+
` Goals: ${signedDelta(t.goalsInFlightDelta, col)}`);
|
|
384
|
+
}
|
|
385
|
+
return padToRows(lines, bodyRows, cols);
|
|
386
|
+
}
|
|
387
|
+
function bodyInbox(snap, cols, bodyRows, col) {
|
|
388
|
+
const lines = [];
|
|
389
|
+
const add = (s) => lines.push(fitLine(s, cols));
|
|
390
|
+
const blank = () => add('');
|
|
391
|
+
blank();
|
|
392
|
+
add(col.bold(col.blue(' ◆ Inbox — Pending Approvals')));
|
|
393
|
+
blank();
|
|
394
|
+
const pending = snap.inbox?.pending ?? 0;
|
|
395
|
+
if (pending === 0) {
|
|
396
|
+
add(col.dim(' No pending proposals. The inbox is clear.'));
|
|
397
|
+
blank();
|
|
398
|
+
add(col.dim(' Tip: use `ashlr inbox` to list all proposals.'));
|
|
399
|
+
return padToRows(lines, bodyRows, cols);
|
|
400
|
+
}
|
|
401
|
+
// Pending count summary.
|
|
402
|
+
add(` ${col.yellow(String(pending))} ` +
|
|
403
|
+
col.yellow(pending === 1 ? 'proposal' : 'proposals') +
|
|
404
|
+
' awaiting approval.');
|
|
405
|
+
blank();
|
|
406
|
+
// Instructions — approval is CLI-only, not from the TUI.
|
|
407
|
+
add(col.bold(' To act on a proposal:'));
|
|
408
|
+
add(col.dim(' ashlr inbox — list pending proposals'));
|
|
409
|
+
add(col.dim(' ashlr inbox show <id> — view full diff'));
|
|
410
|
+
add(col.dim(' ashlr inbox approve <id> — approve and apply'));
|
|
411
|
+
add(col.dim(' ashlr inbox reject <id> — reject and discard'));
|
|
412
|
+
blank();
|
|
413
|
+
add(col.dim(' Approval is CLI-only. Nothing applies automatically.'));
|
|
414
|
+
return padToRows(lines, bodyRows, cols);
|
|
415
|
+
}
|
|
416
|
+
// ---------------------------------------------------------------------------
|
|
417
|
+
// Footer
|
|
418
|
+
// ---------------------------------------------------------------------------
|
|
419
|
+
function buildFooter(cols, col) {
|
|
420
|
+
const hints = [
|
|
421
|
+
'1-7 tabs',
|
|
422
|
+
'j/k move',
|
|
423
|
+
'r refresh',
|
|
424
|
+
'enter detail',
|
|
425
|
+
'q quit',
|
|
426
|
+
].map(h => col.dim(h)).join(col.dim(' · '));
|
|
427
|
+
return fitLine(' ' + hints, cols);
|
|
428
|
+
}
|
|
429
|
+
// ---------------------------------------------------------------------------
|
|
430
|
+
// Helpers
|
|
431
|
+
// ---------------------------------------------------------------------------
|
|
432
|
+
/** Truncate a string to `max` visible characters. */
|
|
433
|
+
function trunc(s, max) {
|
|
434
|
+
const vis = stripAnsi(s);
|
|
435
|
+
if (vis.length <= max)
|
|
436
|
+
return s;
|
|
437
|
+
return vis.slice(0, Math.max(0, max - 1)) + '…';
|
|
438
|
+
}
|
|
439
|
+
/** Fit a line to exactly `cols` visible characters (truncate or right-pad). */
|
|
440
|
+
function fitLine(s, cols) {
|
|
441
|
+
const vis = stripAnsi(s).length;
|
|
442
|
+
if (vis === cols)
|
|
443
|
+
return s;
|
|
444
|
+
if (vis > cols) {
|
|
445
|
+
// Hard-truncate (strip ANSI first to avoid cutting in the middle of a code)
|
|
446
|
+
return stripAnsi(s).slice(0, cols);
|
|
447
|
+
}
|
|
448
|
+
return s + ' '.repeat(cols - vis);
|
|
449
|
+
}
|
|
450
|
+
/** Pad body lines to exactly `rows` rows. */
|
|
451
|
+
function padToRows(lines, rows, cols) {
|
|
452
|
+
const out = lines.slice(0, rows);
|
|
453
|
+
while (out.length < rows) {
|
|
454
|
+
out.push(' '.repeat(cols));
|
|
455
|
+
}
|
|
456
|
+
return out;
|
|
457
|
+
}
|
|
458
|
+
/** A simple ASCII progress bar. */
|
|
459
|
+
function progressBar(done, total, width, col) {
|
|
460
|
+
const w = Math.max(4, width);
|
|
461
|
+
if (total <= 0)
|
|
462
|
+
return col.dim('[' + '─'.repeat(w) + ']');
|
|
463
|
+
const fill = Math.round((done / total) * w);
|
|
464
|
+
const filled = '█'.repeat(Math.min(fill, w));
|
|
465
|
+
const empty = '░'.repeat(Math.max(0, w - fill));
|
|
466
|
+
return '[' + col.green(filled) + col.dim(empty) + ']';
|
|
467
|
+
}
|
|
468
|
+
/** A full-width decorative bar (for the pulse tab). */
|
|
469
|
+
function fullBar(value, width, col) {
|
|
470
|
+
// Visual: filled relative to reference of 1M tokens.
|
|
471
|
+
// Total-safe: clamp width to a non-negative floor and clamp fill into
|
|
472
|
+
// [0, w] so '█'/'░'.repeat() can never receive a negative count and throw
|
|
473
|
+
// a RangeError, no matter how narrow the terminal is. This is the
|
|
474
|
+
// load-bearing fix: renderFrame must never throw from the SIGWINCH /
|
|
475
|
+
// keypress / refresh paths (none of which are wrapped in try/catch).
|
|
476
|
+
const REF = 1_000_000;
|
|
477
|
+
const w = Math.max(0, width);
|
|
478
|
+
const fill = w === 0 ? 0 : Math.max(0, Math.min(w, Math.round(Math.min(1, value / REF) * w)));
|
|
479
|
+
return '[' + col.cyan('█'.repeat(fill)) + col.dim('░'.repeat(w - fill)) + ']';
|
|
480
|
+
}
|
|
481
|
+
/**
|
|
482
|
+
* Color a status string based on known run/swarm lifecycle values.
|
|
483
|
+
* Returns a function that applies the appropriate color.
|
|
484
|
+
*/
|
|
485
|
+
function statusColorize(status, col) {
|
|
486
|
+
switch (status) {
|
|
487
|
+
case 'done': return col.green;
|
|
488
|
+
case 'running': return col.cyan;
|
|
489
|
+
case 'planning': return col.blue;
|
|
490
|
+
case 'failed':
|
|
491
|
+
case 'aborted': return col.red;
|
|
492
|
+
default: return col.dim;
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
/**
|
|
496
|
+
* Color a portfolio health letter grade (M29). A/B green, C yellow, D/F red.
|
|
497
|
+
* Returns a function so callers can apply it to any label string.
|
|
498
|
+
*/
|
|
499
|
+
function gradeColorize(grade, col) {
|
|
500
|
+
switch (grade) {
|
|
501
|
+
case 'A':
|
|
502
|
+
case 'B': return col.green;
|
|
503
|
+
case 'C': return col.yellow;
|
|
504
|
+
case 'D':
|
|
505
|
+
case 'F': return col.red;
|
|
506
|
+
default: return col.dim;
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
/** Compact repo label: basename only (read-only display handle). */
|
|
510
|
+
function repoLabel(repo) {
|
|
511
|
+
const parts = repo.split('/').filter(Boolean);
|
|
512
|
+
return parts.length > 0 ? parts[parts.length - 1] : repo;
|
|
513
|
+
}
|
|
514
|
+
/** Clamp a fraction into [0, 1]. */
|
|
515
|
+
function clamp01(n) {
|
|
516
|
+
if (!Number.isFinite(n))
|
|
517
|
+
return 0;
|
|
518
|
+
return Math.max(0, Math.min(1, n));
|
|
519
|
+
}
|
|
520
|
+
/**
|
|
521
|
+
* Render a signed integer-ish delta (M29 "today" block). null → an em-dash;
|
|
522
|
+
* negative red, positive/zero green. Pure, never throws.
|
|
523
|
+
*/
|
|
524
|
+
function signedDelta(n, col) {
|
|
525
|
+
if (n === null || !Number.isFinite(n))
|
|
526
|
+
return col.dim('—');
|
|
527
|
+
const s = (n > 0 ? '+' : '') + String(n);
|
|
528
|
+
return n < 0 ? col.red(s) : col.green(s);
|
|
529
|
+
}
|
|
530
|
+
/** Render a signed USD delta (M29 "today" block). null → em-dash. */
|
|
531
|
+
function signedUsdDelta(n, col) {
|
|
532
|
+
if (n === null || !Number.isFinite(n))
|
|
533
|
+
return col.dim('—');
|
|
534
|
+
const s = (n > 0 ? '+$' : n < 0 ? '-$' : '$') + Math.abs(n).toFixed(2);
|
|
535
|
+
return n < 0 ? col.red(s) : col.green(s);
|
|
536
|
+
}
|
|
537
|
+
/** Format a large number with k/M suffixes. */
|
|
538
|
+
function fmtNum(n) {
|
|
539
|
+
if (n >= 1_000_000)
|
|
540
|
+
return (n / 1_000_000).toFixed(1) + 'M';
|
|
541
|
+
if (n >= 1_000)
|
|
542
|
+
return (n / 1_000).toFixed(1) + 'k';
|
|
543
|
+
return String(n);
|
|
544
|
+
}
|
|
545
|
+
/** Format an ISO timestamp as a short wall-clock string (HH:MM:SS). */
|
|
546
|
+
function formatClock(iso) {
|
|
547
|
+
try {
|
|
548
|
+
const d = new Date(iso);
|
|
549
|
+
const hh = String(d.getHours()).padStart(2, '0');
|
|
550
|
+
const mm = String(d.getMinutes()).padStart(2, '0');
|
|
551
|
+
const ss = String(d.getSeconds()).padStart(2, '0');
|
|
552
|
+
return `${hh}:${mm}:${ss}`;
|
|
553
|
+
}
|
|
554
|
+
catch {
|
|
555
|
+
return '';
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
//# sourceMappingURL=render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/tui/render.ts"],"names":[],"mappings":"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"}
|