@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,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* M20: Bounded runtime self-heal wrapper.
|
|
3
|
+
*
|
|
4
|
+
* Wraps a single runtime operation (MCP downstream spawn or model call) with
|
|
5
|
+
* bounded, classified heal logic. Reuses `withRetry` (M11) for the loop +
|
|
6
|
+
* backoff — does NOT reimplement backoff from scratch.
|
|
7
|
+
*
|
|
8
|
+
* GUARDRAILS:
|
|
9
|
+
* - BOUNDED by construction: never loops more than policy.maxRestarts
|
|
10
|
+
* heal-triggered retries. No infinite restart/downgrade loop.
|
|
11
|
+
* - model-downgrade: SMALLER LOCAL model only — never escalates to cloud,
|
|
12
|
+
* never increases cost.
|
|
13
|
+
* - rate-backoff: only when cloud is already in play (caller opted in).
|
|
14
|
+
* - opt-out: callers can check ASHLR_NO_HEAL at their call site and skip.
|
|
15
|
+
* - Rethrows last error on exhaustion or non-recoverable failure.
|
|
16
|
+
* - Never throws from the heal machinery itself (only from fn exhaustion).
|
|
17
|
+
*
|
|
18
|
+
* No new runtime deps. ESM/NodeNext: all sibling imports use the .js extension.
|
|
19
|
+
*/
|
|
20
|
+
import { withRetry } from './retry.js';
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
// Error classification
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
/** True for errors that look like an MCP downstream crash or spawn failure. */
|
|
25
|
+
function isMcpRestartable(err) {
|
|
26
|
+
if (!(err instanceof Error))
|
|
27
|
+
return false;
|
|
28
|
+
const msg = err.message.toLowerCase();
|
|
29
|
+
return (msg.includes('spawn') ||
|
|
30
|
+
msg.includes('econnrefused') ||
|
|
31
|
+
msg.includes('econnreset') ||
|
|
32
|
+
msg.includes('socket hang up') ||
|
|
33
|
+
msg.includes('connect failed') ||
|
|
34
|
+
msg.includes('downstream') ||
|
|
35
|
+
msg.includes('mcp') ||
|
|
36
|
+
// process exit codes surfaced as error messages
|
|
37
|
+
msg.includes('exited with code') ||
|
|
38
|
+
msg.includes('process exited'));
|
|
39
|
+
}
|
|
40
|
+
/** True for errors that look like a local model OOM or model-layer failure. */
|
|
41
|
+
function isModelError(err) {
|
|
42
|
+
if (!(err instanceof Error))
|
|
43
|
+
return false;
|
|
44
|
+
const msg = err.message.toLowerCase();
|
|
45
|
+
return (msg.includes('oom') ||
|
|
46
|
+
msg.includes('out of memory') ||
|
|
47
|
+
msg.includes('cuda out of memory') ||
|
|
48
|
+
msg.includes('model error') ||
|
|
49
|
+
msg.includes('model failed') ||
|
|
50
|
+
msg.includes('context length') ||
|
|
51
|
+
msg.includes('context window') ||
|
|
52
|
+
// ollama / lm-studio error patterns
|
|
53
|
+
msg.includes('model not loaded') ||
|
|
54
|
+
msg.includes('llm error') ||
|
|
55
|
+
msg.includes('inference error'));
|
|
56
|
+
}
|
|
57
|
+
/** True for errors that look like a cloud rate-limit or quota exceeded. */
|
|
58
|
+
function isRateLimit(err) {
|
|
59
|
+
if (!(err instanceof Error))
|
|
60
|
+
return false;
|
|
61
|
+
const msg = err.message.toLowerCase();
|
|
62
|
+
return (msg.includes('rate limit') ||
|
|
63
|
+
msg.includes('rate_limit') ||
|
|
64
|
+
msg.includes('429') ||
|
|
65
|
+
msg.includes('too many requests') ||
|
|
66
|
+
msg.includes('quota exceeded') ||
|
|
67
|
+
msg.includes('overloaded') ||
|
|
68
|
+
msg.includes('throttl'));
|
|
69
|
+
}
|
|
70
|
+
// ---------------------------------------------------------------------------
|
|
71
|
+
// Heal-event classification
|
|
72
|
+
// ---------------------------------------------------------------------------
|
|
73
|
+
/**
|
|
74
|
+
* Classify the error into a HealEvent kind, or return null when the error is
|
|
75
|
+
* not recoverable by any heal strategy.
|
|
76
|
+
*
|
|
77
|
+
* Priority: mcp-restart > model-downgrade > rate-backoff.
|
|
78
|
+
* `allowDowngrade` gates model-downgrade. `allowCloud` gates rate-backoff.
|
|
79
|
+
*/
|
|
80
|
+
function classifyHealEvent(err, attempt, policy, allowCloud) {
|
|
81
|
+
if (isMcpRestartable(err)) {
|
|
82
|
+
return {
|
|
83
|
+
kind: 'mcp-restart',
|
|
84
|
+
detail: `MCP downstream error on attempt ${attempt}: ${errorMessage(err)}`,
|
|
85
|
+
attempt,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
if (isModelError(err) && policy.allowDowngrade) {
|
|
89
|
+
return {
|
|
90
|
+
kind: 'model-downgrade',
|
|
91
|
+
detail: `Local model error on attempt ${attempt} — downgrading to smaller local model: ${errorMessage(err)}`,
|
|
92
|
+
attempt,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
if (isRateLimit(err) && allowCloud) {
|
|
96
|
+
return {
|
|
97
|
+
kind: 'rate-backoff',
|
|
98
|
+
detail: `Cloud rate-limit on attempt ${attempt} — backing off: ${errorMessage(err)}`,
|
|
99
|
+
attempt,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
/** Extract a safe, concise message from an unknown thrown value. */
|
|
105
|
+
function errorMessage(err) {
|
|
106
|
+
if (err instanceof Error)
|
|
107
|
+
return err.message;
|
|
108
|
+
return String(err);
|
|
109
|
+
}
|
|
110
|
+
// ---------------------------------------------------------------------------
|
|
111
|
+
// Public API
|
|
112
|
+
// ---------------------------------------------------------------------------
|
|
113
|
+
/**
|
|
114
|
+
* Conservative bounded default: 2 heal-triggered retries, downgrade allowed.
|
|
115
|
+
* Callers may override; this is always a safe starting point.
|
|
116
|
+
*/
|
|
117
|
+
export function defaultHealPolicy() {
|
|
118
|
+
return { maxRestarts: 2, allowDowngrade: true };
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Bounded self-heal wrapper for a runtime operation `fn`.
|
|
122
|
+
*
|
|
123
|
+
* `fn` receives the 1-based attempt number so the caller can vary its
|
|
124
|
+
* behaviour across attempts (e.g. pick a smaller model on attempt > 1 when a
|
|
125
|
+
* 'model-downgrade' heal event has been emitted).
|
|
126
|
+
*
|
|
127
|
+
* `policy.maxRestarts` is the hard cap on heal-triggered retries — the total
|
|
128
|
+
* number of fn invocations is at most `policy.maxRestarts + 1`.
|
|
129
|
+
*
|
|
130
|
+
* `onHeal` is called synchronously before each retry with the classified event.
|
|
131
|
+
* It MUST NOT throw; any throw is silently swallowed to preserve retry flow.
|
|
132
|
+
*
|
|
133
|
+
* `allowCloud` (default false) gates 'rate-backoff' — pass true only when the
|
|
134
|
+
* caller has already enabled cloud routing; withHeal never enables cloud on its
|
|
135
|
+
* own.
|
|
136
|
+
*
|
|
137
|
+
* Rethrows the last error when:
|
|
138
|
+
* - all retries are exhausted, OR
|
|
139
|
+
* - the error is not a recognised heal case (non-retryable).
|
|
140
|
+
*
|
|
141
|
+
* Backed by `withRetry` (M11) for deterministic bounded exponential backoff:
|
|
142
|
+
* attempt 1 failure → retry immediately (0 ms);
|
|
143
|
+
* attempt 2 failure → 500 ms;
|
|
144
|
+
* attempt 3 failure → 1 000 ms; … capped at 30 s.
|
|
145
|
+
*/
|
|
146
|
+
export async function withHeal(fn, policy, onHeal, allowCloud = false) {
|
|
147
|
+
// total attempts = 1 initial + maxRestarts heal retries
|
|
148
|
+
const maxAttempts = Math.max(1, policy.maxRestarts + 1);
|
|
149
|
+
// Bounded by attempt count, not wall-clock. baseDelayMs:0 keeps the withRetry
|
|
150
|
+
// backoff formula intact (baseDelayMs * 2^(attempt-1) is always 0) while
|
|
151
|
+
// avoiding real-time sleeps inside the runtime heal loop — the bound that
|
|
152
|
+
// matters here is maxRestarts, not a multi-second backoff. Real backoff for
|
|
153
|
+
// cloud rate-limits is owned by the downstream caller's own retry policy.
|
|
154
|
+
const retryPolicy = {
|
|
155
|
+
maxAttempts,
|
|
156
|
+
baseDelayMs: 0,
|
|
157
|
+
};
|
|
158
|
+
// withRetry's isRetryable callback does not receive the attempt number, so we
|
|
159
|
+
// capture the 1-based attempt fn was last invoked with. That is the attempt
|
|
160
|
+
// that just failed — exactly what the emitted HealEvent must report.
|
|
161
|
+
let currentAttempt = 0;
|
|
162
|
+
return withRetry(async (attempt) => {
|
|
163
|
+
currentAttempt = attempt;
|
|
164
|
+
return fn(attempt);
|
|
165
|
+
}, retryPolicy, (err) => {
|
|
166
|
+
// isRetryable: emit the heal event only for recoverable errors. The
|
|
167
|
+
// attempt that just failed is `currentAttempt` (1-based).
|
|
168
|
+
const event = classifyHealEvent(err, currentAttempt, policy, allowCloud);
|
|
169
|
+
if (event === null)
|
|
170
|
+
return false;
|
|
171
|
+
// Emit the heal event — suppress any throw from the callback
|
|
172
|
+
try {
|
|
173
|
+
onHeal(event);
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
// intentionally swallowed
|
|
177
|
+
}
|
|
178
|
+
return true;
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=self-heal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"self-heal.js","sourceRoot":"","sources":["../../../src/core/run/self-heal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* M11: streaming.ts — StreamSink type + nullSink / makeCliSink factories.
|
|
3
|
+
*
|
|
4
|
+
* A StreamSink receives live RunStreamEvents from the agent loop and renders
|
|
5
|
+
* them to the terminal. The sink contract:
|
|
6
|
+
* - NEVER throws to the caller (all errors caught internally).
|
|
7
|
+
* - NEVER prints secret values (events carry metadata/text only).
|
|
8
|
+
* - model-delta events render incrementally (process.stdout/stderr.write,
|
|
9
|
+
* no trailing newline) so the token stream looks live.
|
|
10
|
+
* - Lifecycle events (task-start, task-done, retry, verify, tool-call, log)
|
|
11
|
+
* render as full labeled lines with glyphs + color.
|
|
12
|
+
* - When opts.json === true the human stream goes to STDERR so stdout stays
|
|
13
|
+
* clean machine JSON.
|
|
14
|
+
*/
|
|
15
|
+
import type { RunStreamEvent } from '../types.js';
|
|
16
|
+
/** A sink that receives live run events. Never throws to the caller. */
|
|
17
|
+
export type StreamSink = (e: RunStreamEvent) => void;
|
|
18
|
+
/** A no-op sink — used when streaming is disabled or in unit tests. */
|
|
19
|
+
export declare function nullSink(): StreamSink;
|
|
20
|
+
/**
|
|
21
|
+
* Build a CLI sink that renders a live, readable stream.
|
|
22
|
+
*
|
|
23
|
+
* - opts.json === true → human lines go to STDERR (stdout stays clean JSON).
|
|
24
|
+
* - opts.json === false → lines go to STDERR when isTTY, else STDOUT.
|
|
25
|
+
*
|
|
26
|
+
* model-delta events are written inline (no newline) so the token stream looks
|
|
27
|
+
* continuous. All other event kinds start on their own labeled line.
|
|
28
|
+
*/
|
|
29
|
+
export declare function makeCliSink(opts: {
|
|
30
|
+
json: boolean;
|
|
31
|
+
}): StreamSink;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* M11: streaming.ts — StreamSink type + nullSink / makeCliSink factories.
|
|
3
|
+
*
|
|
4
|
+
* A StreamSink receives live RunStreamEvents from the agent loop and renders
|
|
5
|
+
* them to the terminal. The sink contract:
|
|
6
|
+
* - NEVER throws to the caller (all errors caught internally).
|
|
7
|
+
* - NEVER prints secret values (events carry metadata/text only).
|
|
8
|
+
* - model-delta events render incrementally (process.stdout/stderr.write,
|
|
9
|
+
* no trailing newline) so the token stream looks live.
|
|
10
|
+
* - Lifecycle events (task-start, task-done, retry, verify, tool-call, log)
|
|
11
|
+
* render as full labeled lines with glyphs + color.
|
|
12
|
+
* - When opts.json === true the human stream goes to STDERR so stdout stays
|
|
13
|
+
* clean machine JSON.
|
|
14
|
+
*/
|
|
15
|
+
import { makeColors } from '../../cli/ui.js';
|
|
16
|
+
/** A no-op sink — used when streaming is disabled or in unit tests. */
|
|
17
|
+
export function nullSink() {
|
|
18
|
+
return (_e) => { };
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Build a CLI sink that renders a live, readable stream.
|
|
22
|
+
*
|
|
23
|
+
* - opts.json === true → human lines go to STDERR (stdout stays clean JSON).
|
|
24
|
+
* - opts.json === false → lines go to STDERR when isTTY, else STDOUT.
|
|
25
|
+
*
|
|
26
|
+
* model-delta events are written inline (no newline) so the token stream looks
|
|
27
|
+
* continuous. All other event kinds start on their own labeled line.
|
|
28
|
+
*/
|
|
29
|
+
export function makeCliSink(opts) {
|
|
30
|
+
// Choose the output stream: always STDERR when json mode so stdout is clean.
|
|
31
|
+
const out = opts.json ? process.stderr : process.stderr;
|
|
32
|
+
const isTty = out.isTTY === true;
|
|
33
|
+
const col = makeColors(isTty);
|
|
34
|
+
// Track whether we're mid-line on a model-delta run (so we know when to
|
|
35
|
+
// emit a leading newline before a lifecycle label).
|
|
36
|
+
let midDelta = false;
|
|
37
|
+
function write(s) {
|
|
38
|
+
try {
|
|
39
|
+
out.write(s);
|
|
40
|
+
}
|
|
41
|
+
catch { /* never throw */ }
|
|
42
|
+
}
|
|
43
|
+
function writeln(s) {
|
|
44
|
+
// If we were streaming model deltas inline, break to a new line first.
|
|
45
|
+
if (midDelta) {
|
|
46
|
+
write('\n');
|
|
47
|
+
midDelta = false;
|
|
48
|
+
}
|
|
49
|
+
write(s + '\n');
|
|
50
|
+
}
|
|
51
|
+
function taskTag(taskId) {
|
|
52
|
+
return taskId ? col.gray(`[${taskId}] `) : '';
|
|
53
|
+
}
|
|
54
|
+
return function sink(e) {
|
|
55
|
+
try {
|
|
56
|
+
switch (e.kind) {
|
|
57
|
+
case 'task-start': {
|
|
58
|
+
const tag = taskTag(e.taskId);
|
|
59
|
+
writeln(`${col.cyan('▶')} ${tag}${col.bold(e.text ?? 'task starting')}`);
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
case 'model-delta': {
|
|
63
|
+
// Inline write — no newline. May be empty string; skip.
|
|
64
|
+
const chunk = e.text ?? '';
|
|
65
|
+
if (chunk.length > 0) {
|
|
66
|
+
write(chunk);
|
|
67
|
+
midDelta = true;
|
|
68
|
+
}
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
case 'tool-call': {
|
|
72
|
+
const tag = taskTag(e.taskId);
|
|
73
|
+
const name = e.text ?? (typeof e.data === 'object' && e.data !== null
|
|
74
|
+
? String(e.data['name'] ?? 'tool')
|
|
75
|
+
: 'tool');
|
|
76
|
+
writeln(`${col.magenta('⚙')} ${tag}${col.dim('tool:')} ${col.magenta(name)}`);
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
case 'task-done': {
|
|
80
|
+
const tag = taskTag(e.taskId);
|
|
81
|
+
writeln(`${col.green('✓')} ${tag}${col.bold(e.text ?? 'done')}`);
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
case 'retry': {
|
|
85
|
+
const tag = taskTag(e.taskId);
|
|
86
|
+
writeln(`${col.yellow('↺')} ${tag}${col.yellow(e.text ?? 'retrying')}`);
|
|
87
|
+
break;
|
|
88
|
+
}
|
|
89
|
+
case 'verify': {
|
|
90
|
+
const tag = taskTag(e.taskId);
|
|
91
|
+
// data may be a VerifyVerdict: { ok, reason, method }
|
|
92
|
+
const verdict = (typeof e.data === 'object' && e.data !== null)
|
|
93
|
+
? e.data
|
|
94
|
+
: null;
|
|
95
|
+
const ok = verdict?.ok ?? true;
|
|
96
|
+
const reason = verdict?.reason ?? e.text ?? '';
|
|
97
|
+
const method = verdict?.method ? col.dim(` (${verdict.method})`) : '';
|
|
98
|
+
if (ok) {
|
|
99
|
+
writeln(`${col.green('✔')} ${tag}${col.green('verify ok')}${method}${reason ? ': ' + reason : ''}`);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
writeln(`${col.yellow('✘')} ${tag}${col.yellow('verify fail')}${method}${reason ? ': ' + reason : ''}`);
|
|
103
|
+
}
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
106
|
+
case 'log': {
|
|
107
|
+
const tag = taskTag(e.taskId);
|
|
108
|
+
writeln(`${col.gray('·')} ${tag}${col.dim(e.text ?? '')}`);
|
|
109
|
+
break;
|
|
110
|
+
}
|
|
111
|
+
default: {
|
|
112
|
+
// Unknown future event kinds: silently ignore to stay forward-compatible.
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
// Contract: never throw to caller regardless of render errors.
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=streaming.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streaming.js","sourceRoot":"","sources":["../../../src/core/run/streaming.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task result verification for `ashlr run`.
|
|
3
|
+
*
|
|
4
|
+
* Two-stage: heuristic-first (cheap, synchronous), then an optional single
|
|
5
|
+
* cheap model call only when the heuristic is inconclusive AND budget remains.
|
|
6
|
+
*
|
|
7
|
+
* CONTRACT guarantees:
|
|
8
|
+
* - Never throws.
|
|
9
|
+
* - Never exceeds the global budget (checks overBudget before any model call).
|
|
10
|
+
* - Mutates `usage` in-place (same pattern as agent-loop.ts) to account for
|
|
11
|
+
* the optional model check.
|
|
12
|
+
*/
|
|
13
|
+
import type { RunTask, ProviderClient, RunBudget, RunUsage, VerifyVerdict } from '../types.js';
|
|
14
|
+
/**
|
|
15
|
+
* Judge whether `task.result` plausibly satisfies `task.goal`.
|
|
16
|
+
*
|
|
17
|
+
* 1. Heuristic first (cheap, sync): empty / error-sentinel / keyword overlap.
|
|
18
|
+
* If confident → return immediately.
|
|
19
|
+
* 2. Optional model check only when:
|
|
20
|
+
* - heuristic was inconclusive, AND
|
|
21
|
+
* - budget has not been exceeded (overBudget check before the call), AND
|
|
22
|
+
* - client is available.
|
|
23
|
+
* Mutates `usage` to account for the model call.
|
|
24
|
+
* On any model error or budget exhaustion → falls back to a heuristic verdict.
|
|
25
|
+
*
|
|
26
|
+
* Never throws.
|
|
27
|
+
*/
|
|
28
|
+
export declare function verifyTask(task: RunTask, client: ProviderClient, budget: RunBudget, usage: RunUsage, opts?: {
|
|
29
|
+
model?: boolean;
|
|
30
|
+
}): Promise<VerifyVerdict>;
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task result verification for `ashlr run`.
|
|
3
|
+
*
|
|
4
|
+
* Two-stage: heuristic-first (cheap, synchronous), then an optional single
|
|
5
|
+
* cheap model call only when the heuristic is inconclusive AND budget remains.
|
|
6
|
+
*
|
|
7
|
+
* CONTRACT guarantees:
|
|
8
|
+
* - Never throws.
|
|
9
|
+
* - Never exceeds the global budget (checks overBudget before any model call).
|
|
10
|
+
* - Mutates `usage` in-place (same pattern as agent-loop.ts) to account for
|
|
11
|
+
* the optional model check.
|
|
12
|
+
*/
|
|
13
|
+
import { overBudget, addUsage } from './budget.js';
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
// Internal helpers
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
/**
|
|
18
|
+
* Error sentinels that strongly suggest the result is a failure / error message
|
|
19
|
+
* rather than a meaningful answer.
|
|
20
|
+
*/
|
|
21
|
+
const ERROR_SENTINELS = [
|
|
22
|
+
'error:',
|
|
23
|
+
'traceback',
|
|
24
|
+
'exception:',
|
|
25
|
+
'syntaxerror',
|
|
26
|
+
'typeerror',
|
|
27
|
+
'referenceerror',
|
|
28
|
+
'uncaught ',
|
|
29
|
+
'fatal:',
|
|
30
|
+
'command not found',
|
|
31
|
+
'permission denied',
|
|
32
|
+
'enoent',
|
|
33
|
+
'eacces',
|
|
34
|
+
'task failed',
|
|
35
|
+
'aborted',
|
|
36
|
+
'budget exceeded',
|
|
37
|
+
];
|
|
38
|
+
/**
|
|
39
|
+
* Heuristic verdict.
|
|
40
|
+
*
|
|
41
|
+
* Returns { ok: false, reason, method:'heuristic' } when it is CONFIDENT the
|
|
42
|
+
* result is bad, or { ok: true, reason, method:'heuristic' } when heuristic
|
|
43
|
+
* is confident the result is good enough.
|
|
44
|
+
*
|
|
45
|
+
* Returns null when the heuristic is inconclusive (caller may attempt model check).
|
|
46
|
+
*/
|
|
47
|
+
function heuristicVerify(task) {
|
|
48
|
+
const result = task.result ?? '';
|
|
49
|
+
const goal = task.goal;
|
|
50
|
+
// 1. Empty result → confident fail.
|
|
51
|
+
if (result.trim().length === 0) {
|
|
52
|
+
return {
|
|
53
|
+
ok: false,
|
|
54
|
+
reason: 'Result is empty.',
|
|
55
|
+
method: 'heuristic',
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
// 2. Error sentinel match → confident fail.
|
|
59
|
+
const lower = result.toLowerCase();
|
|
60
|
+
for (const sentinel of ERROR_SENTINELS) {
|
|
61
|
+
if (lower.includes(sentinel)) {
|
|
62
|
+
return {
|
|
63
|
+
ok: false,
|
|
64
|
+
reason: `Result contains error marker "${sentinel}".`,
|
|
65
|
+
method: 'heuristic',
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// 3. On-topic keyword overlap with the goal.
|
|
70
|
+
// Extract meaningful words from the goal (>= 4 chars, alpha-only).
|
|
71
|
+
const goalWords = goal
|
|
72
|
+
.toLowerCase()
|
|
73
|
+
.split(/\W+/)
|
|
74
|
+
.filter((w) => w.length >= 4);
|
|
75
|
+
if (goalWords.length > 0) {
|
|
76
|
+
const matchCount = goalWords.filter((w) => lower.includes(w)).length;
|
|
77
|
+
const overlapRatio = matchCount / goalWords.length;
|
|
78
|
+
// High overlap → confident pass.
|
|
79
|
+
if (overlapRatio >= 0.5) {
|
|
80
|
+
return {
|
|
81
|
+
ok: true,
|
|
82
|
+
reason: `Result appears on-topic (${matchCount}/${goalWords.length} goal keywords matched).`,
|
|
83
|
+
method: 'heuristic',
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
// Very low overlap on a goal with many words → confident fail.
|
|
87
|
+
if (goalWords.length >= 3 && overlapRatio === 0) {
|
|
88
|
+
return {
|
|
89
|
+
ok: false,
|
|
90
|
+
reason: 'Result shares no keywords with the goal.',
|
|
91
|
+
method: 'heuristic',
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// 4. Result is non-empty and no errors → weakly pass (inconclusive, but lean ok).
|
|
96
|
+
// Return null to signal the caller should do a model check if budget allows.
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Build the cheap yes/no model prompt asking whether the result satisfies the goal.
|
|
101
|
+
*/
|
|
102
|
+
function buildVerifyMessages(task) {
|
|
103
|
+
return [
|
|
104
|
+
{
|
|
105
|
+
role: 'system',
|
|
106
|
+
content: 'You are a strict but concise evaluator. Answer only "yes" or "no" followed by a one-line reason (≤ 20 words).',
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
role: 'user',
|
|
110
|
+
content: `Does this result plausibly satisfy the goal?\n\n` +
|
|
111
|
+
`Goal: ${task.goal}\n\n` +
|
|
112
|
+
`Result (first 500 chars): ${(task.result ?? '').slice(0, 500)}\n\n` +
|
|
113
|
+
`Answer "yes" or "no" and one short reason.`,
|
|
114
|
+
},
|
|
115
|
+
];
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Parse the model's yes/no response into a VerifyVerdict.
|
|
119
|
+
*/
|
|
120
|
+
function parseModelVerdict(raw) {
|
|
121
|
+
const text = raw.trim().toLowerCase();
|
|
122
|
+
const ok = text.startsWith('yes');
|
|
123
|
+
// Extract the reason: everything after the first word/punctuation.
|
|
124
|
+
const reasonMatch = raw.trim().match(/^(?:yes|no)[.,:\s]*(.*)/i);
|
|
125
|
+
const reason = reasonMatch?.[1]?.trim() || raw.trim();
|
|
126
|
+
return {
|
|
127
|
+
ok,
|
|
128
|
+
reason: reason || (ok ? 'Model judged result satisfactory.' : 'Model judged result unsatisfactory.'),
|
|
129
|
+
method: 'model',
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
// ---------------------------------------------------------------------------
|
|
133
|
+
// Public API
|
|
134
|
+
// ---------------------------------------------------------------------------
|
|
135
|
+
/**
|
|
136
|
+
* Judge whether `task.result` plausibly satisfies `task.goal`.
|
|
137
|
+
*
|
|
138
|
+
* 1. Heuristic first (cheap, sync): empty / error-sentinel / keyword overlap.
|
|
139
|
+
* If confident → return immediately.
|
|
140
|
+
* 2. Optional model check only when:
|
|
141
|
+
* - heuristic was inconclusive, AND
|
|
142
|
+
* - budget has not been exceeded (overBudget check before the call), AND
|
|
143
|
+
* - client is available.
|
|
144
|
+
* Mutates `usage` to account for the model call.
|
|
145
|
+
* On any model error or budget exhaustion → falls back to a heuristic verdict.
|
|
146
|
+
*
|
|
147
|
+
* Never throws.
|
|
148
|
+
*/
|
|
149
|
+
export async function verifyTask(task, client, budget, usage, opts) {
|
|
150
|
+
// Stage 1: heuristic.
|
|
151
|
+
const heuristic = heuristicVerify(task);
|
|
152
|
+
if (heuristic !== null) {
|
|
153
|
+
return heuristic;
|
|
154
|
+
}
|
|
155
|
+
// The optional model check is opt-in. When disabled (the default for the
|
|
156
|
+
// orchestrator's per-task verify, which keeps M4 deterministic accounting
|
|
157
|
+
// intact) the inconclusive heuristic resolves to a lenient pass WITHOUT any
|
|
158
|
+
// model call or usage mutation. verifyTask's own callers (and tests) may
|
|
159
|
+
// enable it explicitly via { model: true }.
|
|
160
|
+
if (opts?.model !== true) {
|
|
161
|
+
return {
|
|
162
|
+
ok: true,
|
|
163
|
+
reason: 'Heuristic pass (non-empty result with no error markers; model check disabled).',
|
|
164
|
+
method: 'heuristic',
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
// Heuristic inconclusive — check budget before a model call.
|
|
168
|
+
if (overBudget(usage, budget)) {
|
|
169
|
+
// Budget exhausted: fall back to a lenient heuristic pass (non-empty, no errors).
|
|
170
|
+
return {
|
|
171
|
+
ok: true,
|
|
172
|
+
reason: 'Heuristic pass (budget exhausted; model check skipped).',
|
|
173
|
+
method: 'heuristic',
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
// Stage 2: cheap single model call.
|
|
177
|
+
try {
|
|
178
|
+
const messages = buildVerifyMessages(task);
|
|
179
|
+
const result = await client.chat(messages, /* tools */ undefined);
|
|
180
|
+
// Account for the tokens used by the verification call.
|
|
181
|
+
const delta = {
|
|
182
|
+
tokensIn: result.usage.tokensIn,
|
|
183
|
+
tokensOut: result.usage.tokensOut,
|
|
184
|
+
steps: 1,
|
|
185
|
+
estCostUsd: 0, // local providers → 0
|
|
186
|
+
};
|
|
187
|
+
const merged = addUsage(usage, delta);
|
|
188
|
+
// Mutate the caller's usage object in-place (same pattern as agent-loop.ts).
|
|
189
|
+
usage.tokensIn = merged.tokensIn;
|
|
190
|
+
usage.tokensOut = merged.tokensOut;
|
|
191
|
+
usage.steps = merged.steps;
|
|
192
|
+
usage.estCostUsd = merged.estCostUsd;
|
|
193
|
+
return parseModelVerdict(result.content);
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
// Model check failed — fall back to a lenient heuristic pass.
|
|
197
|
+
return {
|
|
198
|
+
ok: true,
|
|
199
|
+
reason: 'Heuristic pass (model check failed; non-empty result with no error markers).',
|
|
200
|
+
method: 'heuristic',
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=verify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../../src/core/run/verify.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* M21: Append-only audit trail for autonomous/sandbox actions.
|
|
3
|
+
*
|
|
4
|
+
* Writes to ~/.ashlr/audit/<YYYY-MM-DD>.jsonl — one JSON object per line.
|
|
5
|
+
* Rules:
|
|
6
|
+
* - Append-only: never truncate, never rewrite, never delete a prior line.
|
|
7
|
+
* - Never write secrets: summary is metadata only; secret-shaped tokens are
|
|
8
|
+
* stripped defensively before persisting.
|
|
9
|
+
* - audit() never throws; readAudit() skips malformed lines, never throws.
|
|
10
|
+
*/
|
|
11
|
+
import type { AuditEntry } from '../types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Returns the absolute path to the audit directory: ~/.ashlr/audit.
|
|
14
|
+
* Created lazily by audit() — this function itself does NOT create it.
|
|
15
|
+
*/
|
|
16
|
+
export declare function auditDir(): string;
|
|
17
|
+
/**
|
|
18
|
+
* Append one audit entry to today's JSONL file under ~/.ashlr/audit/.
|
|
19
|
+
* Sets `ts` to the current ISO timestamp; the caller supplies everything else.
|
|
20
|
+
*
|
|
21
|
+
* Append-only: never truncates, never rewrites existing lines.
|
|
22
|
+
* Never throws — errors are swallowed silently to keep callers unblocked.
|
|
23
|
+
*/
|
|
24
|
+
export declare function audit(entry: Omit<AuditEntry, 'ts'>): void;
|
|
25
|
+
/**
|
|
26
|
+
* Read audit entries across all date files, newest-first.
|
|
27
|
+
* `limit` caps the number returned (undefined or 0 => return all).
|
|
28
|
+
*
|
|
29
|
+
* Malformed JSONL lines are silently skipped; never throws.
|
|
30
|
+
*/
|
|
31
|
+
export declare function readAudit(limit?: number): AuditEntry[];
|