@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,291 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agent-loop.ts — bounded ReAct-style loop for a single RunTask.
|
|
3
|
+
*
|
|
4
|
+
* Runs the task against a ProviderClient, handling tool calls when supported,
|
|
5
|
+
* enforcing the hard budget ceiling, and emitting RunStep events per step.
|
|
6
|
+
* Never throws out of runTask — all errors are captured into task.status/error.
|
|
7
|
+
*
|
|
8
|
+
* M11: accepts an optional StreamSink in ctx for live progress streaming.
|
|
9
|
+
* Emits model-delta events via client.chatStream() when available (falls back
|
|
10
|
+
* to client.chat() with a single delta of the full content). Also emits
|
|
11
|
+
* tool-call events per tool execution.
|
|
12
|
+
*/
|
|
13
|
+
import { addUsage, overBudget, newUsage } from './budget.js';
|
|
14
|
+
import { nullSink } from './streaming.js';
|
|
15
|
+
/** Maximum steps per task, regardless of budget (safety backstop). */
|
|
16
|
+
const TASK_STEP_CAP = 20;
|
|
17
|
+
/**
|
|
18
|
+
* Execute a single RunTask to completion using `client`.
|
|
19
|
+
*
|
|
20
|
+
* - Runs a bounded chat loop (ReAct-style).
|
|
21
|
+
* - When ctx.tools is present AND client.supportsTools, may issue tool calls
|
|
22
|
+
* and feed results back as role:'tool' messages.
|
|
23
|
+
* - Accumulates per-step usage into ctx.usage (mutated in place via addUsage).
|
|
24
|
+
* - Emits one RunStep per model call (kind:'model') and per tool execution
|
|
25
|
+
* batch (kind:'tool') via ctx.onStep.
|
|
26
|
+
* - M11: emits RunStreamEvents via ctx.sink for live CLI progress:
|
|
27
|
+
* model-delta (via chatStream if available, else single onDelta of full content),
|
|
28
|
+
* tool-call per tool execution.
|
|
29
|
+
* - HARD STOP: if overBudget(ctx.usage, ctx.budget) at any point, stops the
|
|
30
|
+
* loop. Sets task.status='failed' (no result) or 'done' (partial result).
|
|
31
|
+
* - On success: task.status='done', task.result=<text>, task.usage=<delta>.
|
|
32
|
+
* - On error: task.status='failed', task.error=<message>.
|
|
33
|
+
* - Returns the SAME task object (mutated) for caller convenience.
|
|
34
|
+
*/
|
|
35
|
+
export async function runTask(task, client, ctx) {
|
|
36
|
+
// Track per-task usage delta so we can set task.usage at end.
|
|
37
|
+
let taskUsage = newUsage();
|
|
38
|
+
let stepCount = 0;
|
|
39
|
+
// M11: resolve sink — default to nullSink when not provided.
|
|
40
|
+
const sink = ctx.sink ?? nullSink();
|
|
41
|
+
// Helper: emit a RunStreamEvent. Never throws.
|
|
42
|
+
function emitStream(event) {
|
|
43
|
+
try {
|
|
44
|
+
sink({ ...event, ts: new Date().toISOString() });
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
// Sinks must never crash the loop.
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Helper: accumulate ONLY into the local per-task delta.
|
|
51
|
+
//
|
|
52
|
+
// IMPORTANT: ctx.usage is the orchestrator-owned cumulative usage object and
|
|
53
|
+
// the SINGLE source of truth. We deliberately do NOT write to it here.
|
|
54
|
+
// Instead the orchestrator mutates ctx.usage IN PLACE inside its onStep
|
|
55
|
+
// callback (orchestrator.ts) when it receives the model step we emit below.
|
|
56
|
+
// Keeping a single writer (a) prevents double-counting (previously the loop
|
|
57
|
+
// added the delta here AND the orchestrator added the same step.usage again),
|
|
58
|
+
// and (b) preserves the object identity that every in-flight runTask holds,
|
|
59
|
+
// so the in-loop hard-ceiling check overBudget(ctx.usage, ctx.budget) always
|
|
60
|
+
// reads the true global total even under --parallel > 1.
|
|
61
|
+
function accumulateUsage(delta) {
|
|
62
|
+
taskUsage = addUsage(taskUsage, delta);
|
|
63
|
+
}
|
|
64
|
+
// Helper: emit a RunStep.
|
|
65
|
+
function emitStep(kind, summary, usage) {
|
|
66
|
+
const step = {
|
|
67
|
+
ts: new Date().toISOString(),
|
|
68
|
+
taskId: task.id,
|
|
69
|
+
kind,
|
|
70
|
+
summary,
|
|
71
|
+
...(usage !== undefined ? { usage } : {}),
|
|
72
|
+
};
|
|
73
|
+
try {
|
|
74
|
+
ctx.onStep(step);
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// onStep must never crash the loop.
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// Resolve tools: only use them if client supports them AND tools provided.
|
|
81
|
+
const useTools = client.supportsTools &&
|
|
82
|
+
ctx.tools !== undefined &&
|
|
83
|
+
ctx.tools.length > 0;
|
|
84
|
+
const toolSpecs = useTools ? ctx.tools : undefined;
|
|
85
|
+
// Build a tool executor map keyed by name (best-effort; tools may lack fn).
|
|
86
|
+
const toolExecutors = new Map();
|
|
87
|
+
if (useTools && ctx.tools) {
|
|
88
|
+
for (const t of ctx.tools) {
|
|
89
|
+
const spec = t;
|
|
90
|
+
if (spec.name && typeof spec.fn === 'function') {
|
|
91
|
+
toolExecutors.set(spec.name, spec.fn);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// Build the initial message list.
|
|
96
|
+
const messages = [
|
|
97
|
+
{
|
|
98
|
+
role: 'system',
|
|
99
|
+
content: 'You are an Ashlr sub-agent. Be concise and focused. ' +
|
|
100
|
+
'Complete the given task directly. ' +
|
|
101
|
+
(useTools
|
|
102
|
+
? 'You may call tools to gather information; always follow up with a final answer.'
|
|
103
|
+
: 'Do not request tools — respond with a final textual answer only.'),
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
role: 'user',
|
|
107
|
+
content: task.goal,
|
|
108
|
+
},
|
|
109
|
+
];
|
|
110
|
+
task.status = 'running';
|
|
111
|
+
try {
|
|
112
|
+
// Main agent loop.
|
|
113
|
+
while (true) {
|
|
114
|
+
// Pre-step budget check.
|
|
115
|
+
if (overBudget(ctx.usage, ctx.budget)) {
|
|
116
|
+
const partial = lastAssistantContent(messages);
|
|
117
|
+
if (partial) {
|
|
118
|
+
task.status = 'done';
|
|
119
|
+
task.result = `[budget exceeded — partial result]\n${partial}`;
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
task.status = 'failed';
|
|
123
|
+
task.error = 'Budget exceeded before any result was produced.';
|
|
124
|
+
}
|
|
125
|
+
break;
|
|
126
|
+
}
|
|
127
|
+
// Per-task step cap (safety backstop independent of global budget).
|
|
128
|
+
if (stepCount >= TASK_STEP_CAP) {
|
|
129
|
+
const partial = lastAssistantContent(messages);
|
|
130
|
+
if (partial) {
|
|
131
|
+
task.status = 'done';
|
|
132
|
+
task.result = `[step cap reached — partial result]\n${partial}`;
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
task.status = 'failed';
|
|
136
|
+
task.error = `Step cap of ${TASK_STEP_CAP} reached without producing a result.`;
|
|
137
|
+
}
|
|
138
|
+
break;
|
|
139
|
+
}
|
|
140
|
+
stepCount++;
|
|
141
|
+
// M11: Call the model via chatStream when available for live token streaming.
|
|
142
|
+
// Falls back to client.chat() when chatStream is not implemented.
|
|
143
|
+
let result;
|
|
144
|
+
try {
|
|
145
|
+
if (typeof client.chatStream === 'function') {
|
|
146
|
+
// Stream mode: onDelta emits model-delta events for each token chunk.
|
|
147
|
+
result = await client.chatStream(messages, toolSpecs, (chunk) => {
|
|
148
|
+
if (chunk.length > 0) {
|
|
149
|
+
emitStream({ kind: 'model-delta', taskId: task.id, text: chunk });
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
// Non-streaming fallback: emit the full content as a single delta.
|
|
155
|
+
result = await client.chat(messages, toolSpecs);
|
|
156
|
+
if (result.content.length > 0) {
|
|
157
|
+
emitStream({ kind: 'model-delta', taskId: task.id, text: result.content });
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
catch (err) {
|
|
162
|
+
task.status = 'failed';
|
|
163
|
+
task.error = `Model call failed: ${String(err)}`;
|
|
164
|
+
break;
|
|
165
|
+
}
|
|
166
|
+
// Accumulate usage for this model step.
|
|
167
|
+
const stepUsageDelta = {
|
|
168
|
+
tokensIn: result.usage.tokensIn,
|
|
169
|
+
tokensOut: result.usage.tokensOut,
|
|
170
|
+
steps: 1,
|
|
171
|
+
};
|
|
172
|
+
accumulateUsage(stepUsageDelta);
|
|
173
|
+
// Emit model step.
|
|
174
|
+
const modelSummary = result.content
|
|
175
|
+
? truncate(result.content, 120)
|
|
176
|
+
: result.toolCalls && result.toolCalls.length > 0
|
|
177
|
+
? `tool calls: ${result.toolCalls.map((tc) => tc.name).join(', ')}`
|
|
178
|
+
: '(empty response)';
|
|
179
|
+
emitStep('model', modelSummary, { ...newUsage(), ...stepUsageDelta, steps: 1 });
|
|
180
|
+
// Append assistant message.
|
|
181
|
+
messages.push({
|
|
182
|
+
role: 'assistant',
|
|
183
|
+
content: result.content,
|
|
184
|
+
});
|
|
185
|
+
// Post-step budget check.
|
|
186
|
+
if (overBudget(ctx.usage, ctx.budget)) {
|
|
187
|
+
const partial = result.content || lastAssistantContent(messages);
|
|
188
|
+
if (partial) {
|
|
189
|
+
task.status = 'done';
|
|
190
|
+
task.result = `[budget exceeded — partial result]\n${partial}`;
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
task.status = 'failed';
|
|
194
|
+
task.error = 'Budget exceeded after model call; no usable result.';
|
|
195
|
+
}
|
|
196
|
+
break;
|
|
197
|
+
}
|
|
198
|
+
// Handle tool calls if present.
|
|
199
|
+
if (result.toolCalls && result.toolCalls.length > 0 && useTools) {
|
|
200
|
+
for (const tc of result.toolCalls) {
|
|
201
|
+
// M11: emit tool-call stream event before execution.
|
|
202
|
+
emitStream({
|
|
203
|
+
kind: 'tool-call',
|
|
204
|
+
taskId: task.id,
|
|
205
|
+
text: tc.name,
|
|
206
|
+
data: { name: tc.name, arguments: tc.arguments },
|
|
207
|
+
});
|
|
208
|
+
let toolResultContent;
|
|
209
|
+
const executor = toolExecutors.get(tc.name);
|
|
210
|
+
if (executor) {
|
|
211
|
+
try {
|
|
212
|
+
const rawResult = await executor(tc.arguments);
|
|
213
|
+
toolResultContent =
|
|
214
|
+
typeof rawResult === 'string'
|
|
215
|
+
? rawResult
|
|
216
|
+
: JSON.stringify(rawResult);
|
|
217
|
+
}
|
|
218
|
+
catch (toolErr) {
|
|
219
|
+
toolResultContent = `Tool execution error: ${String(toolErr)}`;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
// No executor — report the tool as unavailable.
|
|
224
|
+
toolResultContent = `Tool '${tc.name}' is not available in this context. Please proceed without it.`;
|
|
225
|
+
}
|
|
226
|
+
messages.push({
|
|
227
|
+
role: 'tool',
|
|
228
|
+
content: toolResultContent,
|
|
229
|
+
toolCallId: tc.id,
|
|
230
|
+
name: tc.name,
|
|
231
|
+
});
|
|
232
|
+
// Emit a tool step.
|
|
233
|
+
emitStep('tool', `${tc.name}: ${truncate(toolResultContent, 80)}`);
|
|
234
|
+
}
|
|
235
|
+
// Continue the loop to let the model react to tool results.
|
|
236
|
+
continue;
|
|
237
|
+
}
|
|
238
|
+
// If there were tool calls but tools are not supported by the client,
|
|
239
|
+
// ask the model to proceed without tools.
|
|
240
|
+
if (result.toolCalls && result.toolCalls.length > 0 && !useTools) {
|
|
241
|
+
messages.push({
|
|
242
|
+
role: 'user',
|
|
243
|
+
content: 'Tool calls are not available in this context. Please provide your final answer using only your existing knowledge.',
|
|
244
|
+
});
|
|
245
|
+
continue;
|
|
246
|
+
}
|
|
247
|
+
// No tool calls — this is a final answer.
|
|
248
|
+
if (result.content && result.content.trim().length > 0) {
|
|
249
|
+
task.status = 'done';
|
|
250
|
+
task.result = result.content;
|
|
251
|
+
break;
|
|
252
|
+
}
|
|
253
|
+
// Empty content and no tool calls — nudge the model once more.
|
|
254
|
+
messages.push({
|
|
255
|
+
role: 'user',
|
|
256
|
+
content: 'Please provide your answer.',
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
catch (unexpectedErr) {
|
|
261
|
+
// Catch-all: should not reach here, but ensure we never propagate.
|
|
262
|
+
task.status = 'failed';
|
|
263
|
+
task.error = `Unexpected error in agent loop: ${String(unexpectedErr)}`;
|
|
264
|
+
}
|
|
265
|
+
// Attach accumulated task-level usage.
|
|
266
|
+
task.usage = taskUsage;
|
|
267
|
+
return task;
|
|
268
|
+
}
|
|
269
|
+
// ---------------------------------------------------------------------------
|
|
270
|
+
// Internal helpers
|
|
271
|
+
// ---------------------------------------------------------------------------
|
|
272
|
+
/** Truncate a string to maxLen, appending '…' if cut. */
|
|
273
|
+
function truncate(s, maxLen) {
|
|
274
|
+
if (s.length <= maxLen)
|
|
275
|
+
return s;
|
|
276
|
+
return s.slice(0, maxLen - 1) + '…';
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Find the last assistant message content in the message list, if any.
|
|
280
|
+
* Used to preserve partial results when budget runs out mid-loop.
|
|
281
|
+
*/
|
|
282
|
+
function lastAssistantContent(messages) {
|
|
283
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
284
|
+
const m = messages[i];
|
|
285
|
+
if (m.role === 'assistant' && m.content && m.content.trim().length > 0) {
|
|
286
|
+
return m.content;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
return undefined;
|
|
290
|
+
}
|
|
291
|
+
//# sourceMappingURL=agent-loop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-loop.js","sourceRoot":"","sources":["../../../src/core/run/agent-loop.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Budget accounting for `ashlr run`.
|
|
3
|
+
*
|
|
4
|
+
* Pure, deterministic functions — no I/O, no side effects. All functions
|
|
5
|
+
* return new objects; RunUsage is never mutated in place.
|
|
6
|
+
*/
|
|
7
|
+
import type { RunUsage, RunBudget } from '../types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Return a fresh, zeroed RunUsage.
|
|
10
|
+
*/
|
|
11
|
+
export declare function newUsage(): RunUsage;
|
|
12
|
+
/**
|
|
13
|
+
* Return a NEW RunUsage = a + b.
|
|
14
|
+
* `b` is partial — missing fields are treated as 0.
|
|
15
|
+
* `estCostUsd` is RECOMPUTED from the merged token totals using a neutral
|
|
16
|
+
* provider label; callers that track the provider should use estCostUsd()
|
|
17
|
+
* directly and store the result, rather than relying on the summed field.
|
|
18
|
+
* In practice the orchestrator stores per-task provider and sets estCostUsd
|
|
19
|
+
* independently; this function sums the existing estCostUsd fields to
|
|
20
|
+
* preserve already-computed values.
|
|
21
|
+
*/
|
|
22
|
+
export declare function addUsage(a: RunUsage, b: Partial<RunUsage>): RunUsage;
|
|
23
|
+
/**
|
|
24
|
+
* Returns true when usage has EXCEEDED the budget.
|
|
25
|
+
*
|
|
26
|
+
* Triggers:
|
|
27
|
+
* - (tokensIn + tokensOut) >= budget.maxTokens, OR
|
|
28
|
+
* - steps >= budget.maxSteps
|
|
29
|
+
*
|
|
30
|
+
* Using >= (not >) means: once we hit the ceiling we stop BEFORE attempting
|
|
31
|
+
* another step, which is the conservative / safe behaviour.
|
|
32
|
+
*/
|
|
33
|
+
export declare function overBudget(usage: RunUsage, budget: RunBudget): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Estimated USD cost for a single model call.
|
|
36
|
+
*
|
|
37
|
+
* - Local providers (ollama, lmstudio) → always 0.
|
|
38
|
+
* - Cloud providers → looked up from the static price table by matching
|
|
39
|
+
* the provider id (case-insensitive prefix match against known keys).
|
|
40
|
+
* Falls back to a conservative $3/$15 per-M-token estimate when unknown.
|
|
41
|
+
*
|
|
42
|
+
* @param provider Provider id string (e.g. 'ollama', 'anthropic', 'openai').
|
|
43
|
+
* @param tokensIn Number of prompt/input tokens.
|
|
44
|
+
* @param tokensOut Number of completion/output tokens.
|
|
45
|
+
* @returns Estimated USD cost as a number (0 for local).
|
|
46
|
+
*/
|
|
47
|
+
export declare function estCostUsd(provider: string, tokensIn: number, tokensOut: number): number;
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Budget accounting for `ashlr run`.
|
|
3
|
+
*
|
|
4
|
+
* Pure, deterministic functions — no I/O, no side effects. All functions
|
|
5
|
+
* return new objects; RunUsage is never mutated in place.
|
|
6
|
+
*/
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
// Static price table (rough $/M-token estimates for cloud providers).
|
|
9
|
+
// Local providers always return 0. Cloud prices are ESTIMATES only — used
|
|
10
|
+
// for informational cost summaries, not billing.
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
/** $/M input tokens */
|
|
13
|
+
const PRICE_IN = {
|
|
14
|
+
// Anthropic Claude models
|
|
15
|
+
anthropic: 3.0, // conservative mid-tier estimate
|
|
16
|
+
claude: 3.0,
|
|
17
|
+
// OpenAI
|
|
18
|
+
openai: 2.5, // gpt-4o-mini ballpark
|
|
19
|
+
gpt: 2.5,
|
|
20
|
+
// Google
|
|
21
|
+
google: 1.25,
|
|
22
|
+
gemini: 1.25,
|
|
23
|
+
// Mistral
|
|
24
|
+
mistral: 2.0,
|
|
25
|
+
// Cohere
|
|
26
|
+
cohere: 1.0,
|
|
27
|
+
};
|
|
28
|
+
/** $/M output tokens */
|
|
29
|
+
const PRICE_OUT = {
|
|
30
|
+
anthropic: 15.0,
|
|
31
|
+
claude: 15.0,
|
|
32
|
+
openai: 10.0,
|
|
33
|
+
gpt: 10.0,
|
|
34
|
+
google: 5.0,
|
|
35
|
+
gemini: 5.0,
|
|
36
|
+
mistral: 6.0,
|
|
37
|
+
cohere: 3.0,
|
|
38
|
+
};
|
|
39
|
+
/** Providers that are always local (zero cost). */
|
|
40
|
+
const LOCAL_PROVIDERS = new Set(['ollama', 'lmstudio']);
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
// Public API
|
|
43
|
+
// ---------------------------------------------------------------------------
|
|
44
|
+
/**
|
|
45
|
+
* Return a fresh, zeroed RunUsage.
|
|
46
|
+
*/
|
|
47
|
+
export function newUsage() {
|
|
48
|
+
return { tokensIn: 0, tokensOut: 0, steps: 0, estCostUsd: 0 };
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Return a NEW RunUsage = a + b.
|
|
52
|
+
* `b` is partial — missing fields are treated as 0.
|
|
53
|
+
* `estCostUsd` is RECOMPUTED from the merged token totals using a neutral
|
|
54
|
+
* provider label; callers that track the provider should use estCostUsd()
|
|
55
|
+
* directly and store the result, rather than relying on the summed field.
|
|
56
|
+
* In practice the orchestrator stores per-task provider and sets estCostUsd
|
|
57
|
+
* independently; this function sums the existing estCostUsd fields to
|
|
58
|
+
* preserve already-computed values.
|
|
59
|
+
*/
|
|
60
|
+
export function addUsage(a, b) {
|
|
61
|
+
const tokensIn = a.tokensIn + (b.tokensIn ?? 0);
|
|
62
|
+
const tokensOut = a.tokensOut + (b.tokensOut ?? 0);
|
|
63
|
+
const steps = a.steps + (b.steps ?? 0);
|
|
64
|
+
const estCostUsdVal = a.estCostUsd + (b.estCostUsd ?? 0);
|
|
65
|
+
return { tokensIn, tokensOut, steps, estCostUsd: estCostUsdVal };
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Returns true when usage has EXCEEDED the budget.
|
|
69
|
+
*
|
|
70
|
+
* Triggers:
|
|
71
|
+
* - (tokensIn + tokensOut) >= budget.maxTokens, OR
|
|
72
|
+
* - steps >= budget.maxSteps
|
|
73
|
+
*
|
|
74
|
+
* Using >= (not >) means: once we hit the ceiling we stop BEFORE attempting
|
|
75
|
+
* another step, which is the conservative / safe behaviour.
|
|
76
|
+
*/
|
|
77
|
+
export function overBudget(usage, budget) {
|
|
78
|
+
const totalTokens = usage.tokensIn + usage.tokensOut;
|
|
79
|
+
return totalTokens >= budget.maxTokens || usage.steps >= budget.maxSteps;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Estimated USD cost for a single model call.
|
|
83
|
+
*
|
|
84
|
+
* - Local providers (ollama, lmstudio) → always 0.
|
|
85
|
+
* - Cloud providers → looked up from the static price table by matching
|
|
86
|
+
* the provider id (case-insensitive prefix match against known keys).
|
|
87
|
+
* Falls back to a conservative $3/$15 per-M-token estimate when unknown.
|
|
88
|
+
*
|
|
89
|
+
* @param provider Provider id string (e.g. 'ollama', 'anthropic', 'openai').
|
|
90
|
+
* @param tokensIn Number of prompt/input tokens.
|
|
91
|
+
* @param tokensOut Number of completion/output tokens.
|
|
92
|
+
* @returns Estimated USD cost as a number (0 for local).
|
|
93
|
+
*/
|
|
94
|
+
export function estCostUsd(provider, tokensIn, tokensOut) {
|
|
95
|
+
const key = provider.toLowerCase();
|
|
96
|
+
// Fast path: known local providers
|
|
97
|
+
if (LOCAL_PROVIDERS.has(key))
|
|
98
|
+
return 0;
|
|
99
|
+
// Prefix match against the price table keys
|
|
100
|
+
let priceIn = 3.0; // conservative fallback
|
|
101
|
+
let priceOut = 15.0; // conservative fallback
|
|
102
|
+
for (const tableKey of Object.keys(PRICE_IN)) {
|
|
103
|
+
if (key.includes(tableKey) || tableKey.includes(key)) {
|
|
104
|
+
priceIn = PRICE_IN[tableKey];
|
|
105
|
+
priceOut = PRICE_OUT[tableKey] ?? priceOut;
|
|
106
|
+
break;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
const costIn = (tokensIn / 1_000_000) * priceIn;
|
|
110
|
+
const costOut = (tokensOut / 1_000_000) * priceOut;
|
|
111
|
+
return costIn + costOut;
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=budget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"budget.js","sourceRoot":"","sources":["../../../src/core/run/budget.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* engines.ts — M11: hardened per-engine adapters.
|
|
3
|
+
*
|
|
4
|
+
* Each engine maps a goal to its REAL CLI argv. This is the source of truth
|
|
5
|
+
* for external engine invocations and MUST be unit-tested for exact argv.
|
|
6
|
+
*
|
|
7
|
+
* Confirmed real CLIs (probed via --help where installed):
|
|
8
|
+
* - claude (INSTALLED): `claude -p "<goal>" --model <M> --output-format json`
|
|
9
|
+
* - aw (INSTALLED): `aw auto "<goal>" --cwd <D>` [+ `--model <M>` when given]
|
|
10
|
+
* - ashlrcode (ABSENT): `ac --goal "<goal>"` style (fallback to builtin when absent)
|
|
11
|
+
*
|
|
12
|
+
* GUARDRAILS:
|
|
13
|
+
* - buildEngineCommand is PURE: no spawn, no PATH probe, no network.
|
|
14
|
+
* - spawnEngine MUST NOT be called against a real delegated agent during
|
|
15
|
+
* build/integrate/verify (unit-tests assert argv only, never spawn).
|
|
16
|
+
* - phantomWrap is a pure arg transform; never logs secret values.
|
|
17
|
+
* - withToolEnv is allowlist-only (no secrets in env).
|
|
18
|
+
*/
|
|
19
|
+
import type { AshlrConfig, EngineId, EngineCommand } from '../types.js';
|
|
20
|
+
/**
|
|
21
|
+
* Whether the engine's real binary is on PATH.
|
|
22
|
+
* - 'builtin' => always true (no external binary needed).
|
|
23
|
+
* - 'claude' => checks for 'claude' binary.
|
|
24
|
+
* - 'aw' => checks for 'aw' binary.
|
|
25
|
+
* - 'ashlrcode' => checks for 'ac' (primary alias) or 'ashlrcode'.
|
|
26
|
+
*
|
|
27
|
+
* Best-effort, never throws.
|
|
28
|
+
*/
|
|
29
|
+
export declare function engineInstalled(engine: EngineId): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Build the EXACT external command for an engine, or null for the builtin loop.
|
|
32
|
+
*
|
|
33
|
+
* Returns null when `engine === 'builtin'`.
|
|
34
|
+
* Returns a fully-resolved EngineCommand for 'ashlrcode' | 'aw' | 'claude'.
|
|
35
|
+
*
|
|
36
|
+
* This function is PURE: it does not spawn, probe PATH, or touch the network.
|
|
37
|
+
* opts.model is the hub-selected model; opts.cwd the target dir (default process.cwd()).
|
|
38
|
+
*
|
|
39
|
+
* EXACT argvs (asserted in unit tests):
|
|
40
|
+
* claude: bin='claude', args=['-p', G, '--model', M, '--output-format', 'json']
|
|
41
|
+
* aw: bin='aw', args=['auto', G, '--cwd', D] [+ '--model', M when given]
|
|
42
|
+
* ashlrcode: bin='ac', args=['--goal', G]
|
|
43
|
+
*/
|
|
44
|
+
export declare function buildEngineCommand(engine: EngineId, goal: string, _cfg: AshlrConfig, opts?: {
|
|
45
|
+
cwd?: string;
|
|
46
|
+
model?: string;
|
|
47
|
+
}): EngineCommand | null;
|
|
48
|
+
/**
|
|
49
|
+
* Wrap an EngineCommand to run under `phantom exec -- <bin> <args...>`.
|
|
50
|
+
*
|
|
51
|
+
* PURE arg transform — never logs secret values.
|
|
52
|
+
* Caller decides when to apply it (only when cfg.phantom?.enabled && phantomInstalled).
|
|
53
|
+
*/
|
|
54
|
+
export declare function phantomWrap(cmd: EngineCommand, _cfg: AshlrConfig): EngineCommand;
|
|
55
|
+
/**
|
|
56
|
+
* Spawn a resolved EngineCommand and capture its result.
|
|
57
|
+
*
|
|
58
|
+
* - Applies withToolEnv(cfg) (M10 env-bridge; allowlist, NON-SECRET only).
|
|
59
|
+
* - Wraps via phantomWrap when cfg.phantom?.enabled AND phantom is installed.
|
|
60
|
+
* - Captures stdout as `output`.
|
|
61
|
+
* - For claude with --output-format json: parses usage/cost from stdout JSON.
|
|
62
|
+
* - Never throws; failures reported as { ok: false, error }.
|
|
63
|
+
*
|
|
64
|
+
* GUARDRAIL: MUST NOT be called against a real delegated agent during
|
|
65
|
+
* build/integrate/verify — unit tests assert argv builders only.
|
|
66
|
+
*/
|
|
67
|
+
export declare function spawnEngine(cmd: EngineCommand, cfg: AshlrConfig): {
|
|
68
|
+
ok: boolean;
|
|
69
|
+
output: string;
|
|
70
|
+
usage?: {
|
|
71
|
+
tokensIn: number;
|
|
72
|
+
tokensOut: number;
|
|
73
|
+
};
|
|
74
|
+
error?: string;
|
|
75
|
+
};
|