@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 @@
|
|
|
1
|
+
{"version":3,"file":"forecast.js","sourceRoot":"","sources":["../../../src/core/observability/forecast.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAE5E,8EAA8E;AAC9E,2BAA2B;AAC3B,8EAA8E;AAE9E;;;;;;;GAOG;AACH,MAAM,YAAY,GAAG,oBAAoB,CAAC;AAE1C,8EAA8E;AAC9E,gFAAgF;AAChF,iFAAiF;AACjF,mFAAmF;AACnF,8EAA8E;AAC9E,8EAA8E;AAE9E,mFAAmF;AACnF,MAAM,kBAAkB,GAAI,GAAG,CAAC;AAChC,oFAAoF;AACpF,MAAM,mBAAmB,GAAG,IAAI,CAAC;AAEjC;;;;;;;;;GASG;AACH,SAAS,YAAY,CAAC,QAAgB,EAAE,SAAiB;IACvD,IAAI,QAAQ,IAAI,CAAC,IAAI,SAAS,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IACvC,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,kBAAkB;QACzC,CAAC,OAAO,GAAG,SAAS,CAAC,GAAG,mBAAmB,CAAC;AACrD,CAAC;AAED,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa,CAC3B,MAAoB,EACpB,GAAgB;IAEhB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAExC,yDAAyD;QACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAEvD,2EAA2E;QAC3E,wEAAwE;QACxE,0EAA0E;QAC1E,mEAAmE;QACnE,IAAI,eAAe,GAAG,CAAC,CAAC;QACxB,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YAChC,IAAI,YAAY,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3B,eAAe,IAAI,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;QACD,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;QAE/C,2EAA2E;QAC3E,mDAAmD;QACnD,iDAAiD;QACjD,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,uBAAuB;QAC3E,MAAM,SAAS,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7D,MAAM,mBAAmB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,EAAE,CAAC,CAAC;QAExD,OAAO;YACL,MAAM;YACN,QAAQ;YACR,eAAe;YACf,mBAAmB;SACpB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,4DAA4D;QAC5D,OAAO;YACL,MAAM;YACN,QAAQ,EAAE,CAAC;YACX,eAAe,EAAE,CAAC;YAClB,mBAAmB,EAAE,CAAC;SACvB,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* governance.ts — spend-governance evaluation for a configured budget window.
|
|
3
|
+
*
|
|
4
|
+
* M19: evalGovernance compares actual spend (from buildForecast/buildRollup)
|
|
5
|
+
* against the configured budget cap and returns an advisory GovernanceStatus.
|
|
6
|
+
*
|
|
7
|
+
* Design rules:
|
|
8
|
+
* - ADVISORY ONLY: this function is pure-ish — it never blocks, throws, or
|
|
9
|
+
* mutates any state. Callers decide how to act on the verdict.
|
|
10
|
+
* - METADATA ONLY: no prompts, completions, tool args, file contents, or
|
|
11
|
+
* secrets are ever read or emitted here.
|
|
12
|
+
* - NEVER THROWS: all errors are caught; falls back to ok/null-cap verdict.
|
|
13
|
+
*/
|
|
14
|
+
import type { AshlrConfig, GovernanceStatus } from '../types.js';
|
|
15
|
+
/**
|
|
16
|
+
* Evaluate the spend-governance verdict for the current budget window.
|
|
17
|
+
*
|
|
18
|
+
* - When no `cfg.telemetry.budgetUsd` is configured: returns level 'ok' with
|
|
19
|
+
* capUsd null and a message indicating no cap is set.
|
|
20
|
+
* - When a cap is set: uses buildForecast (preferred, also uses buildRollup
|
|
21
|
+
* internally) for '7d' and '30d' windows, and falls back to buildRollup
|
|
22
|
+
* directly for the '1d' window (buildForecast does not support '1d').
|
|
23
|
+
* - Levels: 'over' when spentUsd >= cap, 'warn' when >= 80% of cap, else 'ok'.
|
|
24
|
+
*
|
|
25
|
+
* Pure-ish: reads local JSONL usage data but never modifies state, never
|
|
26
|
+
* throws, and never surfaces PAT or secret values.
|
|
27
|
+
*/
|
|
28
|
+
export declare function evalGovernance(cfg: AshlrConfig): GovernanceStatus;
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* governance.ts — spend-governance evaluation for a configured budget window.
|
|
3
|
+
*
|
|
4
|
+
* M19: evalGovernance compares actual spend (from buildForecast/buildRollup)
|
|
5
|
+
* against the configured budget cap and returns an advisory GovernanceStatus.
|
|
6
|
+
*
|
|
7
|
+
* Design rules:
|
|
8
|
+
* - ADVISORY ONLY: this function is pure-ish — it never blocks, throws, or
|
|
9
|
+
* mutates any state. Callers decide how to act on the verdict.
|
|
10
|
+
* - METADATA ONLY: no prompts, completions, tool args, file contents, or
|
|
11
|
+
* secrets are ever read or emitted here.
|
|
12
|
+
* - NEVER THROWS: all errors are caught; falls back to ok/null-cap verdict.
|
|
13
|
+
*/
|
|
14
|
+
import { buildForecast } from './forecast.js';
|
|
15
|
+
import { buildRollup } from './rollup.js';
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
// Governance thresholds
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
/** Fraction of cap at which the level escalates from 'ok' to 'warn'. */
|
|
20
|
+
const WARN_THRESHOLD = 0.8;
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
// evalGovernance
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
/**
|
|
25
|
+
* Evaluate the spend-governance verdict for the current budget window.
|
|
26
|
+
*
|
|
27
|
+
* - When no `cfg.telemetry.budgetUsd` is configured: returns level 'ok' with
|
|
28
|
+
* capUsd null and a message indicating no cap is set.
|
|
29
|
+
* - When a cap is set: uses buildForecast (preferred, also uses buildRollup
|
|
30
|
+
* internally) for '7d' and '30d' windows, and falls back to buildRollup
|
|
31
|
+
* directly for the '1d' window (buildForecast does not support '1d').
|
|
32
|
+
* - Levels: 'over' when spentUsd >= cap, 'warn' when >= 80% of cap, else 'ok'.
|
|
33
|
+
*
|
|
34
|
+
* Pure-ish: reads local JSONL usage data but never modifies state, never
|
|
35
|
+
* throws, and never surfaces PAT or secret values.
|
|
36
|
+
*/
|
|
37
|
+
export function evalGovernance(cfg) {
|
|
38
|
+
try {
|
|
39
|
+
const cap = cfg.telemetry?.budgetUsd;
|
|
40
|
+
// No cap configured — governance has nothing to enforce.
|
|
41
|
+
if (cap === undefined || cap === null) {
|
|
42
|
+
return {
|
|
43
|
+
level: 'ok',
|
|
44
|
+
spentUsd: 0,
|
|
45
|
+
capUsd: null,
|
|
46
|
+
window: cfg.telemetry?.budgetWindow ?? '7d',
|
|
47
|
+
message: 'No spend cap set.',
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
const rawWindow = cfg.telemetry?.budgetWindow ?? '7d';
|
|
51
|
+
// Obtain actual spend for the window. buildForecast supports '7d'|'30d';
|
|
52
|
+
// for '1d' we fall back to buildRollup directly (same underlying source).
|
|
53
|
+
let spentUsd = 0;
|
|
54
|
+
if (rawWindow === '1d') {
|
|
55
|
+
const rollup = buildRollup('1d', cfg);
|
|
56
|
+
spentUsd = Math.max(0, rollup.totals.estCostUsd);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
// rawWindow is now '7d' | '30d' — safe cast (type guard above handles '1d').
|
|
60
|
+
const forecastWindow = rawWindow;
|
|
61
|
+
const forecast = buildForecast(forecastWindow, cfg);
|
|
62
|
+
spentUsd = Math.max(0, forecast.spentUsd);
|
|
63
|
+
}
|
|
64
|
+
const capUsd = Math.max(0, cap);
|
|
65
|
+
const ratio = capUsd > 0 ? spentUsd / capUsd : (spentUsd > 0 ? Infinity : 0);
|
|
66
|
+
let level;
|
|
67
|
+
let message;
|
|
68
|
+
if (ratio >= 1) {
|
|
69
|
+
level = 'over';
|
|
70
|
+
message =
|
|
71
|
+
`Spend $${spentUsd.toFixed(4)} has exceeded the ${rawWindow} cap ` +
|
|
72
|
+
`of $${capUsd.toFixed(2)}. Use --over-budget to proceed when govAction is 'block'.`;
|
|
73
|
+
}
|
|
74
|
+
else if (ratio >= WARN_THRESHOLD) {
|
|
75
|
+
level = 'warn';
|
|
76
|
+
const pct = (ratio * 100).toFixed(1);
|
|
77
|
+
message =
|
|
78
|
+
`Spend $${spentUsd.toFixed(4)} is at ${pct}% of the ${rawWindow} cap ` +
|
|
79
|
+
`of $${capUsd.toFixed(2)}.`;
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
level = 'ok';
|
|
83
|
+
const pct = capUsd > 0 ? (ratio * 100).toFixed(1) : '0.0';
|
|
84
|
+
message =
|
|
85
|
+
`Spend $${spentUsd.toFixed(4)} is within the ${rawWindow} cap ` +
|
|
86
|
+
`of $${capUsd.toFixed(2)} (${pct}% used).`;
|
|
87
|
+
}
|
|
88
|
+
return { level, spentUsd, capUsd, window: rawWindow, message };
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
// Best-effort fallback — governance must never throw or block a run.
|
|
92
|
+
return {
|
|
93
|
+
level: 'ok',
|
|
94
|
+
spentUsd: 0,
|
|
95
|
+
capUsd: null,
|
|
96
|
+
window: cfg.telemetry?.budgetWindow ?? '7d',
|
|
97
|
+
message: 'Governance evaluation unavailable (internal error).',
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=governance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"governance.js","sourceRoot":"","sources":["../../../src/core/observability/governance.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* core/observability/otlp.ts — M19 OTLP/HTTP-JSON trace builder.
|
|
3
|
+
*
|
|
4
|
+
* Pure, dependency-free helpers that turn a completed run/swarm into:
|
|
5
|
+
* - GenAiSpan[] (spansFromRun / spansFromSwarm) — METADATA ONLY
|
|
6
|
+
* - an OTLP/HTTP-JSON trace payload (buildGenAiTrace) following the
|
|
7
|
+
* resourceSpans -> scopeSpans -> spans nesting, with GenAI
|
|
8
|
+
* semantic-convention attributes.
|
|
9
|
+
*
|
|
10
|
+
* PRIVACY INVARIANT (enforced here, asserted by m19.otlp.test.ts):
|
|
11
|
+
* Span attributes carry ONLY metadata — model id, token counts, cost, ids,
|
|
12
|
+
* provider, tier, status, duration. NEVER prompt/response text, sub-goal
|
|
13
|
+
* text, tool args, file contents, project paths, or secrets. The span
|
|
14
|
+
* `name` is the task id (a stable metadata identifier), never the goal.
|
|
15
|
+
*
|
|
16
|
+
* This module is imported statically by telemetry-sink.ts (buildGenAiTrace)
|
|
17
|
+
* and dynamically by orchestrator.ts / swarm/runner.ts (spansFromRun /
|
|
18
|
+
* spansFromSwarm). It must stay free of side effects and runtime deps.
|
|
19
|
+
*/
|
|
20
|
+
import type { GenAiSpan, RunState, SwarmRun } from '../types.js';
|
|
21
|
+
type OtlpValue = {
|
|
22
|
+
stringValue: string;
|
|
23
|
+
} | {
|
|
24
|
+
intValue: string;
|
|
25
|
+
} | {
|
|
26
|
+
doubleValue: number;
|
|
27
|
+
};
|
|
28
|
+
interface OtlpAttribute {
|
|
29
|
+
key: string;
|
|
30
|
+
value: OtlpValue;
|
|
31
|
+
}
|
|
32
|
+
interface OtlpSpan {
|
|
33
|
+
/** 32 lowercase hex chars (16 random bytes). Required by the OTLP data model. */
|
|
34
|
+
traceId: string;
|
|
35
|
+
/** 16 lowercase hex chars (8 random bytes). Required by the OTLP data model. */
|
|
36
|
+
spanId: string;
|
|
37
|
+
/** OTLP span kind. 1=INTERNAL — GenAI calls are internal work units. */
|
|
38
|
+
kind: number;
|
|
39
|
+
name: string;
|
|
40
|
+
/** Decimal string of unix-nanoseconds. */
|
|
41
|
+
startTimeUnixNano: string;
|
|
42
|
+
endTimeUnixNano: string;
|
|
43
|
+
/** OTLP status object. code 0=unset, 1=ok(unused), 2=error. */
|
|
44
|
+
status: {
|
|
45
|
+
code: number;
|
|
46
|
+
};
|
|
47
|
+
attributes: OtlpAttribute[];
|
|
48
|
+
}
|
|
49
|
+
interface OtlpScopeSpans {
|
|
50
|
+
scope: {
|
|
51
|
+
name: string;
|
|
52
|
+
version: string;
|
|
53
|
+
};
|
|
54
|
+
spans: OtlpSpan[];
|
|
55
|
+
}
|
|
56
|
+
interface OtlpResourceSpans {
|
|
57
|
+
resource: {
|
|
58
|
+
attributes: OtlpAttribute[];
|
|
59
|
+
};
|
|
60
|
+
scopeSpans: OtlpScopeSpans[];
|
|
61
|
+
}
|
|
62
|
+
export interface OtlpTrace {
|
|
63
|
+
resourceSpans: OtlpResourceSpans[];
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Build a valid OTLP/HTTP-JSON trace from GenAiSpan metadata.
|
|
67
|
+
*
|
|
68
|
+
* Shape: { resourceSpans: [ { resource, scopeSpans: [ { scope, spans } ] } ] }.
|
|
69
|
+
* Every span carries GenAI semantic-convention attributes plus ashlr.* ids.
|
|
70
|
+
* Handles an empty `spans` array gracefully (one resourceSpans entry with an
|
|
71
|
+
* empty spans list). METADATA ONLY — never content.
|
|
72
|
+
*/
|
|
73
|
+
export declare function buildGenAiTrace(spans: GenAiSpan[]): OtlpTrace;
|
|
74
|
+
/**
|
|
75
|
+
* Derive one GenAiSpan per RunTask that has usage. Pure — does not mutate the
|
|
76
|
+
* run. Span name is the task id (metadata), NEVER the sub-goal text. No
|
|
77
|
+
* result/goal text is read into the span. Timestamps fall back to the run's
|
|
78
|
+
* createdAt/updatedAt window (per-task timestamps are not tracked).
|
|
79
|
+
*/
|
|
80
|
+
export declare function spansFromRun(run: RunState): GenAiSpan[];
|
|
81
|
+
/**
|
|
82
|
+
* Derive one GenAiSpan per SwarmTaskRun that has usage. Pure — does not mutate
|
|
83
|
+
* the swarm. Span name is the task id (metadata), NEVER goal/result/project
|
|
84
|
+
* text. SwarmRun has no per-run provider, so provider/model/tier use neutral
|
|
85
|
+
* metadata defaults. Timestamps fall back to the swarm's createdAt/updatedAt.
|
|
86
|
+
*/
|
|
87
|
+
export declare function spansFromSwarm(swarm: SwarmRun): GenAiSpan[];
|
|
88
|
+
export {};
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* core/observability/otlp.ts — M19 OTLP/HTTP-JSON trace builder.
|
|
3
|
+
*
|
|
4
|
+
* Pure, dependency-free helpers that turn a completed run/swarm into:
|
|
5
|
+
* - GenAiSpan[] (spansFromRun / spansFromSwarm) — METADATA ONLY
|
|
6
|
+
* - an OTLP/HTTP-JSON trace payload (buildGenAiTrace) following the
|
|
7
|
+
* resourceSpans -> scopeSpans -> spans nesting, with GenAI
|
|
8
|
+
* semantic-convention attributes.
|
|
9
|
+
*
|
|
10
|
+
* PRIVACY INVARIANT (enforced here, asserted by m19.otlp.test.ts):
|
|
11
|
+
* Span attributes carry ONLY metadata — model id, token counts, cost, ids,
|
|
12
|
+
* provider, tier, status, duration. NEVER prompt/response text, sub-goal
|
|
13
|
+
* text, tool args, file contents, project paths, or secrets. The span
|
|
14
|
+
* `name` is the task id (a stable metadata identifier), never the goal.
|
|
15
|
+
*
|
|
16
|
+
* This module is imported statically by telemetry-sink.ts (buildGenAiTrace)
|
|
17
|
+
* and dynamically by orchestrator.ts / swarm/runner.ts (spansFromRun /
|
|
18
|
+
* spansFromSwarm). It must stay free of side effects and runtime deps.
|
|
19
|
+
*/
|
|
20
|
+
import { randomBytes } from 'node:crypto';
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
// Constants
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
/** Instrumentation scope advertised in scopeSpans[].scope. */
|
|
25
|
+
const SCOPE_NAME = 'ashlr-hub';
|
|
26
|
+
const SCOPE_VERSION = '0.1.0';
|
|
27
|
+
/** Nanoseconds per millisecond (OTLP timestamps are unix-nanoseconds). */
|
|
28
|
+
const NS_PER_MS = 1000000n;
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
// Internal attribute helpers
|
|
31
|
+
// ---------------------------------------------------------------------------
|
|
32
|
+
function strAttr(key, value) {
|
|
33
|
+
return { key, value: { stringValue: value } };
|
|
34
|
+
}
|
|
35
|
+
/** Integer attribute — OTLP intValue is a decimal string per the JSON mapping. */
|
|
36
|
+
function intAttr(key, value) {
|
|
37
|
+
const n = Number.isFinite(value) ? Math.trunc(value) : 0;
|
|
38
|
+
return { key, value: { intValue: String(n) } };
|
|
39
|
+
}
|
|
40
|
+
function doubleAttr(key, value) {
|
|
41
|
+
return { key, value: { doubleValue: Number.isFinite(value) ? value : 0 } };
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Convert an ISO timestamp to a unix-nanosecond decimal string. Invalid or
|
|
45
|
+
* missing timestamps fall back to 0 so the builder never throws.
|
|
46
|
+
*/
|
|
47
|
+
function isoToUnixNano(iso) {
|
|
48
|
+
const ms = Date.parse(iso);
|
|
49
|
+
if (Number.isNaN(ms))
|
|
50
|
+
return '0';
|
|
51
|
+
return (BigInt(ms) * NS_PER_MS).toString();
|
|
52
|
+
}
|
|
53
|
+
/** Map a terminal status string to an OTLP status code (2=error else unset). */
|
|
54
|
+
function statusCode(status) {
|
|
55
|
+
return status === 'failed' || status === 'aborted' ? 2 : 0;
|
|
56
|
+
}
|
|
57
|
+
/** OTLP SpanKind.INTERNAL — these are internal work units, not RPC client spans. */
|
|
58
|
+
const SPAN_KIND_INTERNAL = 1;
|
|
59
|
+
/** Random 16-byte trace id as 32 lowercase hex chars (OTLP-required identifier). */
|
|
60
|
+
function newTraceId() {
|
|
61
|
+
return randomBytes(16).toString('hex');
|
|
62
|
+
}
|
|
63
|
+
/** Random 8-byte span id as 16 lowercase hex chars (OTLP-required identifier). */
|
|
64
|
+
function newSpanId() {
|
|
65
|
+
return randomBytes(8).toString('hex');
|
|
66
|
+
}
|
|
67
|
+
// ---------------------------------------------------------------------------
|
|
68
|
+
// Public: buildGenAiTrace
|
|
69
|
+
// ---------------------------------------------------------------------------
|
|
70
|
+
/**
|
|
71
|
+
* Build a valid OTLP/HTTP-JSON trace from GenAiSpan metadata.
|
|
72
|
+
*
|
|
73
|
+
* Shape: { resourceSpans: [ { resource, scopeSpans: [ { scope, spans } ] } ] }.
|
|
74
|
+
* Every span carries GenAI semantic-convention attributes plus ashlr.* ids.
|
|
75
|
+
* Handles an empty `spans` array gracefully (one resourceSpans entry with an
|
|
76
|
+
* empty spans list). METADATA ONLY — never content.
|
|
77
|
+
*/
|
|
78
|
+
export function buildGenAiTrace(spans) {
|
|
79
|
+
// One trace id per emitted batch; per-span ids below. Random bytes carry no
|
|
80
|
+
// content — still METADATA ONLY. Required by the OTLP data model and by
|
|
81
|
+
// backends (Tempo/Jaeger/Honeycomb) that drop zero/empty-id spans.
|
|
82
|
+
const traceId = newTraceId();
|
|
83
|
+
const otlpSpans = spans.map((s) => {
|
|
84
|
+
const start = isoToUnixNano(s.startTs);
|
|
85
|
+
let end = isoToUnixNano(s.endTs);
|
|
86
|
+
// Guarantee end >= start even if timestamps are equal/inverted.
|
|
87
|
+
if (BigInt(end) < BigInt(start))
|
|
88
|
+
end = start;
|
|
89
|
+
return {
|
|
90
|
+
traceId,
|
|
91
|
+
spanId: newSpanId(),
|
|
92
|
+
kind: SPAN_KIND_INTERNAL,
|
|
93
|
+
// name is the task id (metadata identifier) — never goal/result text.
|
|
94
|
+
name: s.name,
|
|
95
|
+
startTimeUnixNano: start,
|
|
96
|
+
endTimeUnixNano: end,
|
|
97
|
+
status: { code: statusCode(s.status) },
|
|
98
|
+
attributes: [
|
|
99
|
+
strAttr('gen_ai.system', s.provider),
|
|
100
|
+
strAttr('gen_ai.request.model', s.model),
|
|
101
|
+
intAttr('gen_ai.usage.input_tokens', s.tokensIn),
|
|
102
|
+
intAttr('gen_ai.usage.output_tokens', s.tokensOut),
|
|
103
|
+
doubleAttr('gen_ai.usage.cost_usd', s.estCostUsd),
|
|
104
|
+
strAttr('ashlr.run.id', s.runId),
|
|
105
|
+
strAttr('ashlr.provider', s.provider),
|
|
106
|
+
strAttr('ashlr.tier', s.tier),
|
|
107
|
+
strAttr('ashlr.status', s.status),
|
|
108
|
+
],
|
|
109
|
+
};
|
|
110
|
+
});
|
|
111
|
+
return {
|
|
112
|
+
resourceSpans: [
|
|
113
|
+
{
|
|
114
|
+
resource: {
|
|
115
|
+
attributes: [
|
|
116
|
+
strAttr('service.name', SCOPE_NAME),
|
|
117
|
+
strAttr('telemetry.sdk.name', SCOPE_NAME),
|
|
118
|
+
strAttr('telemetry.sdk.language', 'nodejs'),
|
|
119
|
+
],
|
|
120
|
+
},
|
|
121
|
+
scopeSpans: [
|
|
122
|
+
{
|
|
123
|
+
scope: { name: SCOPE_NAME, version: SCOPE_VERSION },
|
|
124
|
+
spans: otlpSpans,
|
|
125
|
+
},
|
|
126
|
+
],
|
|
127
|
+
},
|
|
128
|
+
],
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
// ---------------------------------------------------------------------------
|
|
132
|
+
// Provider/model/tier derivation (metadata only)
|
|
133
|
+
// ---------------------------------------------------------------------------
|
|
134
|
+
const CLOUD_PROVIDERS = new Set(['anthropic', 'openai', 'google', 'bedrock', 'azure']);
|
|
135
|
+
/** Cloud vs local tier, inferred from the provider id (metadata only). */
|
|
136
|
+
function tierForProvider(provider) {
|
|
137
|
+
return CLOUD_PROVIDERS.has(provider.toLowerCase()) ? 'cloud' : 'local';
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* A coarse model label derived from the provider — we never expose the actual
|
|
141
|
+
* routed model name when it isn't tracked per-task, only a metadata stand-in.
|
|
142
|
+
* The provider itself is metadata and safe to surface.
|
|
143
|
+
*/
|
|
144
|
+
function modelForProvider(provider) {
|
|
145
|
+
return provider || 'unknown';
|
|
146
|
+
}
|
|
147
|
+
// ---------------------------------------------------------------------------
|
|
148
|
+
// Public: spansFromRun
|
|
149
|
+
// ---------------------------------------------------------------------------
|
|
150
|
+
/**
|
|
151
|
+
* Derive one GenAiSpan per RunTask that has usage. Pure — does not mutate the
|
|
152
|
+
* run. Span name is the task id (metadata), NEVER the sub-goal text. No
|
|
153
|
+
* result/goal text is read into the span. Timestamps fall back to the run's
|
|
154
|
+
* createdAt/updatedAt window (per-task timestamps are not tracked).
|
|
155
|
+
*/
|
|
156
|
+
export function spansFromRun(run) {
|
|
157
|
+
const provider = run.provider || 'unknown';
|
|
158
|
+
const model = modelForProvider(provider);
|
|
159
|
+
const tier = tierForProvider(provider);
|
|
160
|
+
const startTs = run.createdAt;
|
|
161
|
+
const endTs = run.updatedAt;
|
|
162
|
+
const spans = [];
|
|
163
|
+
for (const task of run.tasks) {
|
|
164
|
+
if (!task.usage)
|
|
165
|
+
continue;
|
|
166
|
+
spans.push({
|
|
167
|
+
name: task.id, // metadata id, NOT task.goal
|
|
168
|
+
runId: run.id,
|
|
169
|
+
model,
|
|
170
|
+
provider,
|
|
171
|
+
tier,
|
|
172
|
+
tokensIn: task.usage.tokensIn,
|
|
173
|
+
tokensOut: task.usage.tokensOut,
|
|
174
|
+
estCostUsd: task.usage.estCostUsd,
|
|
175
|
+
status: task.status,
|
|
176
|
+
startTs,
|
|
177
|
+
endTs,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
return spans;
|
|
181
|
+
}
|
|
182
|
+
// ---------------------------------------------------------------------------
|
|
183
|
+
// Public: spansFromSwarm
|
|
184
|
+
// ---------------------------------------------------------------------------
|
|
185
|
+
/**
|
|
186
|
+
* Derive one GenAiSpan per SwarmTaskRun that has usage. Pure — does not mutate
|
|
187
|
+
* the swarm. Span name is the task id (metadata), NEVER goal/result/project
|
|
188
|
+
* text. SwarmRun has no per-run provider, so provider/model/tier use neutral
|
|
189
|
+
* metadata defaults. Timestamps fall back to the swarm's createdAt/updatedAt.
|
|
190
|
+
*/
|
|
191
|
+
export function spansFromSwarm(swarm) {
|
|
192
|
+
const provider = 'ashlr-swarm';
|
|
193
|
+
const model = 'swarm';
|
|
194
|
+
const tier = 'local';
|
|
195
|
+
const startTs = swarm.createdAt;
|
|
196
|
+
const endTs = swarm.updatedAt;
|
|
197
|
+
const spans = [];
|
|
198
|
+
for (const task of swarm.tasks) {
|
|
199
|
+
if (!task.usage)
|
|
200
|
+
continue;
|
|
201
|
+
spans.push({
|
|
202
|
+
name: task.id, // metadata id, NOT goal/result/project
|
|
203
|
+
runId: swarm.id,
|
|
204
|
+
model,
|
|
205
|
+
provider,
|
|
206
|
+
tier,
|
|
207
|
+
tokensIn: task.usage.tokensIn,
|
|
208
|
+
tokensOut: task.usage.tokensOut,
|
|
209
|
+
estCostUsd: task.usage.estCostUsd,
|
|
210
|
+
status: task.status,
|
|
211
|
+
startTs,
|
|
212
|
+
endTs,
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
return spans;
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=otlp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"otlp.js","sourceRoot":"","sources":["../../../src/core/observability/otlp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG1C,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,8DAA8D;AAC9D,MAAM,UAAU,GAAG,WAAW,CAAC;AAC/B,MAAM,aAAa,GAAG,OAAO,CAAC;AAE9B,0EAA0E;AAC1E,MAAM,SAAS,GAAG,QAAU,CAAC;AA8C7B,8EAA8E;AAC9E,6BAA6B;AAC7B,8EAA8E;AAE9E,SAAS,OAAO,CAAC,GAAW,EAAE,KAAa;IACzC,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,CAAC;AAChD,CAAC;AAED,kFAAkF;AAClF,SAAS,OAAO,CAAC,GAAW,EAAE,KAAa;IACzC,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AACjD,CAAC;AAED,SAAS,UAAU,CAAC,GAAW,EAAE,KAAa;IAC5C,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AAC7E,CAAC;AAED;;;GAGG;AACH,SAAS,aAAa,CAAC,GAAW;IAChC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAAE,OAAO,GAAG,CAAC;IACjC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,QAAQ,EAAE,CAAC;AAC7C,CAAC;AAED,gFAAgF;AAChF,SAAS,UAAU,CAAC,MAAc;IAChC,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,oFAAoF;AACpF,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAE7B,oFAAoF;AACpF,SAAS,UAAU;IACjB,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACzC,CAAC;AAED,kFAAkF;AAClF,SAAS,SAAS;IAChB,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACxC,CAAC;AAED,8EAA8E;AAC9E,0BAA0B;AAC1B,8EAA8E;AAE9E;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,KAAkB;IAChD,4EAA4E;IAC5E,wEAAwE;IACxE,mEAAmE;IACnE,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAE7B,MAAM,SAAS,GAAe,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC5C,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACvC,IAAI,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACjC,gEAAgE;QAChE,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;YAAE,GAAG,GAAG,KAAK,CAAC;QAE7C,OAAO;YACL,OAAO;YACP,MAAM,EAAE,SAAS,EAAE;YACnB,IAAI,EAAE,kBAAkB;YACxB,sEAAsE;YACtE,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,iBAAiB,EAAE,KAAK;YACxB,eAAe,EAAE,GAAG;YACpB,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE;YACtC,UAAU,EAAE;gBACV,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC,QAAQ,CAAC;gBACpC,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAAC,KAAK,CAAC;gBACxC,OAAO,CAAC,2BAA2B,EAAE,CAAC,CAAC,QAAQ,CAAC;gBAChD,OAAO,CAAC,4BAA4B,EAAE,CAAC,CAAC,SAAS,CAAC;gBAClD,UAAU,CAAC,uBAAuB,EAAE,CAAC,CAAC,UAAU,CAAC;gBACjD,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC;gBAChC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC,QAAQ,CAAC;gBACrC,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC;gBAC7B,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,MAAM,CAAC;aAClC;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,aAAa,EAAE;YACb;gBACE,QAAQ,EAAE;oBACR,UAAU,EAAE;wBACV,OAAO,CAAC,cAAc,EAAE,UAAU,CAAC;wBACnC,OAAO,CAAC,oBAAoB,EAAE,UAAU,CAAC;wBACzC,OAAO,CAAC,wBAAwB,EAAE,QAAQ,CAAC;qBAC5C;iBACF;gBACD,UAAU,EAAE;oBACV;wBACE,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,EAAE;wBACnD,KAAK,EAAE,SAAS;qBACjB;iBACF;aACF;SACF;KACF,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,iDAAiD;AACjD,8EAA8E;AAE9E,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;AAEvF,0EAA0E;AAC1E,SAAS,eAAe,CAAC,QAAgB;IACvC,OAAO,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;AACzE,CAAC;AAED;;;;GAIG;AACH,SAAS,gBAAgB,CAAC,QAAgB;IACxC,OAAO,QAAQ,IAAI,SAAS,CAAC;AAC/B,CAAC;AAED,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,GAAa;IACxC,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,IAAI,SAAS,CAAC;IAC3C,MAAM,KAAK,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,GAAG,CAAC,SAAS,CAAC;IAC9B,MAAM,KAAK,GAAG,GAAG,CAAC,SAAS,CAAC;IAE5B,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,SAAS;QAC1B,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,6BAA6B;YAC5C,KAAK,EAAE,GAAG,CAAC,EAAE;YACb,KAAK;YACL,QAAQ;YACR,IAAI;YACJ,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ;YAC7B,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;YAC/B,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU;YACjC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO;YACP,KAAK;SACN,CAAC,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,8EAA8E;AAC9E,yBAAyB;AACzB,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,KAAe;IAC5C,MAAM,QAAQ,GAAG,aAAa,CAAC;IAC/B,MAAM,KAAK,GAAG,OAAO,CAAC;IACtB,MAAM,IAAI,GAAG,OAAO,CAAC;IACrB,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC;IAChC,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC;IAE9B,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,SAAS;QAC1B,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,uCAAuC;YACtD,KAAK,EAAE,KAAK,CAAC,EAAE;YACf,KAAK;YACL,QAAQ;YACR,IAAI;YACJ,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ;YAC7B,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;YAC/B,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU;YACjC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO;YACP,KAAK;SACN,CAAC,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* rollup.ts — build ActivityRollup from local usage events + git commit counts.
|
|
3
|
+
*
|
|
4
|
+
* Privacy: delegates to collectUsageEvents which reads METADATA ONLY.
|
|
5
|
+
* Performance: skips files outside the window (mtime filtering in usage-source),
|
|
6
|
+
* git log --since is bounded per-repo, never throws globally.
|
|
7
|
+
*/
|
|
8
|
+
import type { AshlrConfig, ActivityRollup } from '../types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Convert a window label to milliseconds.
|
|
11
|
+
* Unknown labels fall back to 7d.
|
|
12
|
+
*/
|
|
13
|
+
export declare function windowToMs(window: string): number;
|
|
14
|
+
/**
|
|
15
|
+
* Derive a provider key from a model id so estCostUsd() can match it.
|
|
16
|
+
*
|
|
17
|
+
* Examples:
|
|
18
|
+
* 'claude-3-5-sonnet-20241022' -> 'claude'
|
|
19
|
+
* 'gpt-4o' -> 'gpt'
|
|
20
|
+
* 'gemini-1.5-pro' -> 'gemini'
|
|
21
|
+
* 'ollama/llama3' -> 'ollama'
|
|
22
|
+
* unknown -> model id as-is (budget fallback applies)
|
|
23
|
+
*/
|
|
24
|
+
export declare function modelToProviderKey(model: string): string;
|
|
25
|
+
/**
|
|
26
|
+
* Local (zero-cost) provider keys. A model whose `modelToProviderKey` lands in
|
|
27
|
+
* this set is served by a LOCAL backend and costs $0. Shared with forecast.ts so
|
|
28
|
+
* the local/cloud split stays consistent across rollup and savings computation.
|
|
29
|
+
*/
|
|
30
|
+
export declare const LOCAL_PROVIDER_KEYS: ReadonlySet<string>;
|
|
31
|
+
/** True when `model` is served by a local provider (cost $0). */
|
|
32
|
+
export declare function isLocalProviderModel(model: string): boolean;
|
|
33
|
+
export declare function buildRollup(window: '1d' | '7d' | '30d', cfg: AshlrConfig, opts?: {
|
|
34
|
+
project?: string;
|
|
35
|
+
}): ActivityRollup;
|