@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,311 @@
|
|
|
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 { execFileSync } from 'node:child_process';
|
|
9
|
+
import { existsSync } from 'node:fs';
|
|
10
|
+
import { basename } from 'node:path';
|
|
11
|
+
import { collectUsageEvents, dashNormalize } from './usage-source.js';
|
|
12
|
+
import { evalBudget } from './budget-alert.js';
|
|
13
|
+
import { estCostUsd } from '../run/budget.js';
|
|
14
|
+
import { loadIndex } from '../index-engine.js';
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// windowToMs
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
/**
|
|
19
|
+
* Convert a window label to milliseconds.
|
|
20
|
+
* Unknown labels fall back to 7d.
|
|
21
|
+
*/
|
|
22
|
+
export function windowToMs(window) {
|
|
23
|
+
switch (window) {
|
|
24
|
+
case '1d': return 86_400_000;
|
|
25
|
+
case '7d': return 7 * 86_400_000;
|
|
26
|
+
case '30d': return 30 * 86_400_000;
|
|
27
|
+
default: return 7 * 86_400_000;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
// Git commit counting (best-effort, never throws)
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
const GIT_TIMEOUT = 5_000;
|
|
34
|
+
/**
|
|
35
|
+
* Count commits in `repoPath` with author date >= sinceMs.
|
|
36
|
+
* Returns 0 on any error (git unavailable, not a repo, timeout, etc.).
|
|
37
|
+
*/
|
|
38
|
+
function countCommitsSince(repoPath, sinceMs) {
|
|
39
|
+
try {
|
|
40
|
+
if (!existsSync(repoPath))
|
|
41
|
+
return 0;
|
|
42
|
+
const since = new Date(sinceMs).toISOString();
|
|
43
|
+
const out = execFileSync('git', ['log', '--oneline', `--after=${since}`], { cwd: repoPath, timeout: GIT_TIMEOUT, stdio: 'pipe', encoding: 'utf8' });
|
|
44
|
+
return out.trim() === '' ? 0 : out.trim().split('\n').length;
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return 0;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// ---------------------------------------------------------------------------
|
|
51
|
+
// Cost estimation — map model id to a provider key for estCostUsd()
|
|
52
|
+
// ---------------------------------------------------------------------------
|
|
53
|
+
/**
|
|
54
|
+
* Derive a provider key from a model id so estCostUsd() can match it.
|
|
55
|
+
*
|
|
56
|
+
* Examples:
|
|
57
|
+
* 'claude-3-5-sonnet-20241022' -> 'claude'
|
|
58
|
+
* 'gpt-4o' -> 'gpt'
|
|
59
|
+
* 'gemini-1.5-pro' -> 'gemini'
|
|
60
|
+
* 'ollama/llama3' -> 'ollama'
|
|
61
|
+
* unknown -> model id as-is (budget fallback applies)
|
|
62
|
+
*/
|
|
63
|
+
export function modelToProviderKey(model) {
|
|
64
|
+
const m = model.toLowerCase();
|
|
65
|
+
if (m.startsWith('claude'))
|
|
66
|
+
return 'claude';
|
|
67
|
+
if (m.startsWith('gpt'))
|
|
68
|
+
return 'gpt';
|
|
69
|
+
if (m.startsWith('gemini'))
|
|
70
|
+
return 'gemini';
|
|
71
|
+
if (m.startsWith('mistral'))
|
|
72
|
+
return 'mistral';
|
|
73
|
+
if (m.startsWith('cohere'))
|
|
74
|
+
return 'cohere';
|
|
75
|
+
if (m.includes('ollama'))
|
|
76
|
+
return 'ollama';
|
|
77
|
+
if (m.includes('lmstudio'))
|
|
78
|
+
return 'lmstudio';
|
|
79
|
+
// Pass through: estCostUsd will fallback to conservative $3/$15
|
|
80
|
+
return model;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Local (zero-cost) provider keys. A model whose `modelToProviderKey` lands in
|
|
84
|
+
* this set is served by a LOCAL backend and costs $0. Shared with forecast.ts so
|
|
85
|
+
* the local/cloud split stays consistent across rollup and savings computation.
|
|
86
|
+
*/
|
|
87
|
+
export const LOCAL_PROVIDER_KEYS = new Set(['ollama', 'lmstudio']);
|
|
88
|
+
/** True when `model` is served by a local provider (cost $0). */
|
|
89
|
+
export function isLocalProviderModel(model) {
|
|
90
|
+
return LOCAL_PROVIDER_KEYS.has(modelToProviderKey(model));
|
|
91
|
+
}
|
|
92
|
+
// ---------------------------------------------------------------------------
|
|
93
|
+
// buildRollup
|
|
94
|
+
// ---------------------------------------------------------------------------
|
|
95
|
+
export function buildRollup(window, cfg, opts) {
|
|
96
|
+
const now = Date.now();
|
|
97
|
+
const sinceMs = now - windowToMs(window);
|
|
98
|
+
const sinceIso = new Date(sinceMs).toISOString();
|
|
99
|
+
// ── Collect usage events ─────────────────────────────────────────────────
|
|
100
|
+
let events = [];
|
|
101
|
+
try {
|
|
102
|
+
events = collectUsageEvents(sinceMs);
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
// partial data ok
|
|
106
|
+
}
|
|
107
|
+
// ── Load the index ONCE ───────────────────────────────────────────────────
|
|
108
|
+
// Reused for (a) reconciling mangled transcript paths to real repo paths and
|
|
109
|
+
// (b) git commit counting — avoids the previous double loadIndex().
|
|
110
|
+
let index = null;
|
|
111
|
+
try {
|
|
112
|
+
index = loadIndex();
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
// missing index is fine — degrade to best-effort decode + no commits
|
|
116
|
+
}
|
|
117
|
+
// Build a lookup from the dash-normalized form of each indexed repo path to
|
|
118
|
+
// its REAL path. Transcript events carry a LOSSY decode (every '-' became
|
|
119
|
+
// '/'), but dashNormalize collapses both the real and the lossy form to the
|
|
120
|
+
// same key, so we can recover the correct real path for dashed repo names.
|
|
121
|
+
const realByNorm = new Map();
|
|
122
|
+
if (index) {
|
|
123
|
+
for (const item of index.items) {
|
|
124
|
+
if (item.kind !== 'repo')
|
|
125
|
+
continue;
|
|
126
|
+
realByNorm.set(dashNormalize(item.path), item.path);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// Reconcile each event's (possibly mangled) project path to the real index
|
|
130
|
+
// path so token activity joins the git-commit activity on the SAME key and
|
|
131
|
+
// by-project labels/--project matching work for dashed repos. Falls back to
|
|
132
|
+
// the original decode when there is no index match.
|
|
133
|
+
if (realByNorm.size > 0) {
|
|
134
|
+
for (const ev of events) {
|
|
135
|
+
if (!ev.project)
|
|
136
|
+
continue;
|
|
137
|
+
const real = realByNorm.get(dashNormalize(ev.project));
|
|
138
|
+
if (real)
|
|
139
|
+
ev.project = real;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// ── Optional project filter ──────────────────────────────────────────────
|
|
143
|
+
const projectFilter = opts?.project?.trim();
|
|
144
|
+
if (projectFilter) {
|
|
145
|
+
events = events.filter((e) => {
|
|
146
|
+
if (!e.project)
|
|
147
|
+
return false;
|
|
148
|
+
return (e.project === projectFilter ||
|
|
149
|
+
basename(e.project) === projectFilter ||
|
|
150
|
+
e.project.includes(projectFilter));
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
// ── Aggregation maps ─────────────────────────────────────────────────────
|
|
154
|
+
// project key -> ProjectActivity accumulator
|
|
155
|
+
const projectMap = new Map();
|
|
156
|
+
// YYYY-MM-DD -> DailyUsage accumulator
|
|
157
|
+
const dayMap = new Map();
|
|
158
|
+
// model id -> ModelUsage accumulator
|
|
159
|
+
const modelMap = new Map();
|
|
160
|
+
// Grand totals
|
|
161
|
+
let totalTokensIn = 0;
|
|
162
|
+
let totalTokensOut = 0;
|
|
163
|
+
let totalCost = 0;
|
|
164
|
+
// Track distinct session files globally for totals.sessions
|
|
165
|
+
const allSessions = new Set();
|
|
166
|
+
for (const ev of events) {
|
|
167
|
+
const cost = estCostUsd(modelToProviderKey(ev.model), ev.tokensIn, ev.tokensOut);
|
|
168
|
+
// Grand totals
|
|
169
|
+
totalTokensIn += ev.tokensIn;
|
|
170
|
+
totalTokensOut += ev.tokensOut;
|
|
171
|
+
totalCost += cost;
|
|
172
|
+
// Session key: for 'claude' events the session file is implicit per-event
|
|
173
|
+
// grouping; we use (project + day) as a session proxy when we don't have
|
|
174
|
+
// the actual filename, but usage-source may embed it in model/ts combos.
|
|
175
|
+
// For simplicity, use a session key = project + ISO-day to count sessions.
|
|
176
|
+
const day = ev.ts.slice(0, 10); // YYYY-MM-DD
|
|
177
|
+
const sessionKey = `${ev.project ?? '__none__'}::${day}`;
|
|
178
|
+
allSessions.add(sessionKey);
|
|
179
|
+
// ── Per-project ────────────────────────────────────────────────────────
|
|
180
|
+
const proj = ev.project ?? '__unknown__';
|
|
181
|
+
if (!projectMap.has(proj)) {
|
|
182
|
+
projectMap.set(proj, { sessions: new Set(), tokensIn: 0, tokensOut: 0, estCostUsd: 0, lastActive: null });
|
|
183
|
+
}
|
|
184
|
+
const pa = projectMap.get(proj);
|
|
185
|
+
pa.sessions.add(sessionKey);
|
|
186
|
+
pa.tokensIn += ev.tokensIn;
|
|
187
|
+
pa.tokensOut += ev.tokensOut;
|
|
188
|
+
pa.estCostUsd += cost;
|
|
189
|
+
if (pa.lastActive === null || ev.ts > pa.lastActive) {
|
|
190
|
+
pa.lastActive = ev.ts;
|
|
191
|
+
}
|
|
192
|
+
// ── Per-day ────────────────────────────────────────────────────────────
|
|
193
|
+
if (!dayMap.has(day)) {
|
|
194
|
+
dayMap.set(day, { tokensIn: 0, tokensOut: 0, estCostUsd: 0, sessions: new Set() });
|
|
195
|
+
}
|
|
196
|
+
const du = dayMap.get(day);
|
|
197
|
+
du.tokensIn += ev.tokensIn;
|
|
198
|
+
du.tokensOut += ev.tokensOut;
|
|
199
|
+
du.estCostUsd += cost;
|
|
200
|
+
du.sessions.add(sessionKey);
|
|
201
|
+
// ── Per-model ──────────────────────────────────────────────────────────
|
|
202
|
+
const modelKey = ev.model || 'unknown';
|
|
203
|
+
if (!modelMap.has(modelKey)) {
|
|
204
|
+
modelMap.set(modelKey, { tokensIn: 0, tokensOut: 0, estCostUsd: 0, calls: 0 });
|
|
205
|
+
}
|
|
206
|
+
const mu = modelMap.get(modelKey);
|
|
207
|
+
mu.tokensIn += ev.tokensIn;
|
|
208
|
+
mu.tokensOut += ev.tokensOut;
|
|
209
|
+
mu.estCostUsd += cost;
|
|
210
|
+
mu.calls++;
|
|
211
|
+
}
|
|
212
|
+
// ── Git commit counts (single pass) ──────────────────────────────────────
|
|
213
|
+
// For each indexed repo matching the (optional) project filter, count commits
|
|
214
|
+
// within the window EXACTLY ONCE. Derive totalCommits by summing the map, and
|
|
215
|
+
// seed commit-only project buckets in the same pass. Reuses the index loaded
|
|
216
|
+
// above — no second loadIndex(), no second countCommitsSince() per repo.
|
|
217
|
+
const commitsByProject = new Map();
|
|
218
|
+
let totalCommits = 0;
|
|
219
|
+
if (index) {
|
|
220
|
+
for (const item of index.items) {
|
|
221
|
+
if (item.kind !== 'repo')
|
|
222
|
+
continue;
|
|
223
|
+
// Apply project filter to repos
|
|
224
|
+
if (projectFilter) {
|
|
225
|
+
const matches = item.path === projectFilter ||
|
|
226
|
+
item.name === projectFilter ||
|
|
227
|
+
item.path.includes(projectFilter);
|
|
228
|
+
if (!matches)
|
|
229
|
+
continue;
|
|
230
|
+
}
|
|
231
|
+
const repoCommits = countCommitsSince(item.path, sinceMs);
|
|
232
|
+
if (repoCommits <= 0)
|
|
233
|
+
continue;
|
|
234
|
+
commitsByProject.set(item.path, repoCommits);
|
|
235
|
+
totalCommits += repoCommits;
|
|
236
|
+
// Seed a minimal project entry for commit-only repos (no token events),
|
|
237
|
+
// carrying lastActive from the repo's last commit. Token-active repos
|
|
238
|
+
// already have an entry keyed on the reconciled real path.
|
|
239
|
+
if (!projectMap.has(item.path)) {
|
|
240
|
+
projectMap.set(item.path, {
|
|
241
|
+
sessions: new Set(),
|
|
242
|
+
tokensIn: 0,
|
|
243
|
+
tokensOut: 0,
|
|
244
|
+
estCostUsd: 0,
|
|
245
|
+
lastActive: item.git?.lastCommit ?? null,
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
// ── Freeze byProject ─────────────────────────────────────────────────────
|
|
251
|
+
const byProject = [];
|
|
252
|
+
for (const [proj, pa] of projectMap.entries()) {
|
|
253
|
+
byProject.push({
|
|
254
|
+
project: proj,
|
|
255
|
+
sessions: pa.sessions.size,
|
|
256
|
+
commits: commitsByProject.get(proj) ?? 0,
|
|
257
|
+
tokensIn: pa.tokensIn,
|
|
258
|
+
tokensOut: pa.tokensOut,
|
|
259
|
+
estCostUsd: pa.estCostUsd,
|
|
260
|
+
lastActive: pa.lastActive,
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
// Sort by cost desc, then tokens desc
|
|
264
|
+
byProject.sort((a, b) => b.estCostUsd !== a.estCostUsd
|
|
265
|
+
? b.estCostUsd - a.estCostUsd
|
|
266
|
+
: (b.tokensIn + b.tokensOut) - (a.tokensIn + a.tokensOut));
|
|
267
|
+
// ── Freeze byDay (ascending) ──────────────────────────────────────────────
|
|
268
|
+
const byDay = [];
|
|
269
|
+
for (const [day, du] of dayMap.entries()) {
|
|
270
|
+
byDay.push({
|
|
271
|
+
day,
|
|
272
|
+
tokensIn: du.tokensIn,
|
|
273
|
+
tokensOut: du.tokensOut,
|
|
274
|
+
estCostUsd: du.estCostUsd,
|
|
275
|
+
sessions: du.sessions.size,
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
byDay.sort((a, b) => a.day.localeCompare(b.day));
|
|
279
|
+
// ── Freeze byModel (desc by cost) ────────────────────────────────────────
|
|
280
|
+
const byModel = [];
|
|
281
|
+
for (const [model, mu] of modelMap.entries()) {
|
|
282
|
+
byModel.push({
|
|
283
|
+
model,
|
|
284
|
+
tokensIn: mu.tokensIn,
|
|
285
|
+
tokensOut: mu.tokensOut,
|
|
286
|
+
estCostUsd: mu.estCostUsd,
|
|
287
|
+
calls: mu.calls,
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
byModel.sort((a, b) => b.estCostUsd !== a.estCostUsd
|
|
291
|
+
? b.estCostUsd - a.estCostUsd
|
|
292
|
+
: (b.tokensIn + b.tokensOut) - (a.tokensIn + a.tokensOut));
|
|
293
|
+
// ── Budget alert ──────────────────────────────────────────────────────────
|
|
294
|
+
const budget = evalBudget({ spentUsd: totalCost, spentTokens: totalTokensIn + totalTokensOut }, cfg, window);
|
|
295
|
+
return {
|
|
296
|
+
window,
|
|
297
|
+
since: sinceIso,
|
|
298
|
+
totals: {
|
|
299
|
+
tokensIn: totalTokensIn,
|
|
300
|
+
tokensOut: totalTokensOut,
|
|
301
|
+
estCostUsd: totalCost,
|
|
302
|
+
sessions: allSessions.size,
|
|
303
|
+
commits: totalCommits,
|
|
304
|
+
},
|
|
305
|
+
byProject,
|
|
306
|
+
byDay,
|
|
307
|
+
byModel,
|
|
308
|
+
budget,
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
//# sourceMappingURL=rollup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rollup.js","sourceRoot":"","sources":["../../../src/core/observability/rollup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* core/observability/telemetry-sink.ts — M19 telemetry sink seam.
|
|
3
|
+
*
|
|
4
|
+
* Two implementations:
|
|
5
|
+
* LocalFileSink — default (no endpoint / no PAT). Appends spans as JSONL
|
|
6
|
+
* to a daily file under ~/.ashlr/telemetry/. What `ashlr
|
|
7
|
+
* pulse` already aggregates locally.
|
|
8
|
+
* OtlpHttpSink — opt-in, only when cfg.telemetry.pulse AND a PAT are
|
|
9
|
+
* both present. Builds an OTLP/HTTP-JSON trace and POSTs
|
|
10
|
+
* it to the configured endpoint. Fire-and-forget, bounded
|
|
11
|
+
* timeout, never throws/blocks.
|
|
12
|
+
*
|
|
13
|
+
* GUARDRAILS:
|
|
14
|
+
* - PRIVACY: JSONL records and span attributes are METADATA ONLY (model,
|
|
15
|
+
* token counts, cost, ids, provider, tier, status, duration). NEVER
|
|
16
|
+
* prompt/response text, tool args, file contents, or secrets.
|
|
17
|
+
* - PAT/SECRET SAFETY: PAT lives ONLY in the Authorization header. It is
|
|
18
|
+
* NEVER logged, printed, returned, placed in span attrs or `detail`, or
|
|
19
|
+
* committed. Source: phantom (preferred) or ASHLR_PULSE_TOKEN env var.
|
|
20
|
+
* - All emits are best-effort: ok:false is logged to stderr only and NEVER
|
|
21
|
+
* blocks or propagates out of a run/swarm.
|
|
22
|
+
*/
|
|
23
|
+
import type { AshlrConfig, GenAiSpan, TelemetryEmitResult } from '../types.js';
|
|
24
|
+
/**
|
|
25
|
+
* Returns the absolute path to the local telemetry directory:
|
|
26
|
+
* ~/.ashlr/telemetry
|
|
27
|
+
*
|
|
28
|
+
* Re-resolves homedir() at call time so a relocated HOME in tests is honored.
|
|
29
|
+
*/
|
|
30
|
+
export declare function localTelemetryDir(): string;
|
|
31
|
+
/**
|
|
32
|
+
* Returns true when a Pulse PAT is discoverable — either via the
|
|
33
|
+
* ASHLR_PULSE_TOKEN environment variable or via phantom (when installed,
|
|
34
|
+
* initialized, and the key is present in the vault).
|
|
35
|
+
*
|
|
36
|
+
* NEVER reads, returns, or logs the PAT value — boolean only.
|
|
37
|
+
*
|
|
38
|
+
* `allowPhantomProbe` (default true) controls the blocking spawnSync phantom
|
|
39
|
+
* probe. The doctor / `ashlr telemetry status` callers want the full probe
|
|
40
|
+
* (they are NOT on a run's completion path). The emit hot path
|
|
41
|
+
* (getSink -> patAvailable) MUST pass `false`: the spawnSync probe freezes the
|
|
42
|
+
* event loop for up to ~10s (2x5s) and is redundant there — OtlpHttpSink.emit
|
|
43
|
+
* resolves the PAT itself via the async, bounded resolvePatAsync. With the
|
|
44
|
+
* probe off, patAvailable is a pure env-var check (no blocking).
|
|
45
|
+
*/
|
|
46
|
+
export declare function patAvailable(cfg: AshlrConfig, allowPhantomProbe?: boolean): boolean;
|
|
47
|
+
export interface TelemetrySink {
|
|
48
|
+
emit(spans: GenAiSpan[]): Promise<TelemetryEmitResult>;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Returns the appropriate TelemetrySink for the given config:
|
|
52
|
+
* - OtlpHttpSink when cfg.telemetry.pulse is set AND a PAT is available.
|
|
53
|
+
* - LocalFileSink (default, 100% local) otherwise.
|
|
54
|
+
*
|
|
55
|
+
* `allowPhantomProbe` (default true) is forwarded to patAvailable. On the
|
|
56
|
+
* emit hot path (orchestrator/swarm completion) callers MUST pass `false` so
|
|
57
|
+
* the selection never runs a blocking spawnSync phantom probe: when an
|
|
58
|
+
* endpoint is configured we hand off to OtlpHttpSink, which resolves the PAT
|
|
59
|
+
* asynchronously with a bounded timeout (and degrades to a logged
|
|
60
|
+
* 'PAT unavailable' no-op if none is found) — never freezing the event loop.
|
|
61
|
+
* The CLI (`telemetry test`/`status`) keeps the default probe.
|
|
62
|
+
*/
|
|
63
|
+
export declare function getSink(cfg: AshlrConfig, allowPhantomProbe?: boolean): TelemetrySink;
|