@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,507 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* M31: Native MCP tools — ashlr's own intelligence served by the gateway.
|
|
3
|
+
*
|
|
4
|
+
* SDK-FREE by contract: this module returns plain objects; mcp-gateway.ts is
|
|
5
|
+
* the only adapter (and, with mcp-registry, the only module allowed to import
|
|
6
|
+
* @modelcontextprotocol/sdk). Everything here is independently unit-testable
|
|
7
|
+
* without a transport.
|
|
8
|
+
*
|
|
9
|
+
* Safety model (CONTRACT-M31) — the gate is STRUCTURAL, enforced in
|
|
10
|
+
* callNativeTool before any handler runs:
|
|
11
|
+
* 'read' — pure read of local stores; allowed even when KILL is on.
|
|
12
|
+
* 'append' — append-only write under ~/.ashlr/ (genome hub); REFUSED on KILL.
|
|
13
|
+
* 'proposal' — creates a PENDING inbox Proposal; REFUSED on KILL.
|
|
14
|
+
*
|
|
15
|
+
* There is deliberately NO approve/reject/apply tool: approval stays human-only
|
|
16
|
+
* via `ashlr inbox`. `ashlr_ask` hardcodes allowCloud:false — agent sessions
|
|
17
|
+
* bring their own model; ashlr code never leaves the machine via this surface.
|
|
18
|
+
*
|
|
19
|
+
* Every call (ok / refused / error) is audited as 'mcp:native-call' with the
|
|
20
|
+
* tool name + argument KEYS only (never values). Output is secret-scrubbed and
|
|
21
|
+
* size-capped so a tool reply can never blow agent context or leak credentials.
|
|
22
|
+
*/
|
|
23
|
+
import { loadConfig } from './config.js';
|
|
24
|
+
import { killSwitchOn } from './sandbox/policy.js';
|
|
25
|
+
import { audit } from './sandbox/audit.js';
|
|
26
|
+
import { scrubSecrets } from './knowledge/index.js';
|
|
27
|
+
import { recall } from './genome/recall.js';
|
|
28
|
+
import { ask } from './knowledge/ask.js';
|
|
29
|
+
import { impact } from './knowledge/graph.js';
|
|
30
|
+
import { computeHealth } from './quality/health.js';
|
|
31
|
+
import { loadPreviousReport } from './quality/store.js';
|
|
32
|
+
import { buildRollup } from './observability/rollup.js';
|
|
33
|
+
import { buildSnapshot } from './dashboard.js';
|
|
34
|
+
import { buildOrientation } from './orient.js';
|
|
35
|
+
import { selectGenomeSync, selectInboxStore, selectBacklogSource } from './seams/index.js';
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
// Constants
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
/** Hard cap on a serialized tool result (chars ≈ bytes for ASCII JSON). */
|
|
40
|
+
const MAX_OUTPUT_CHARS = 32 * 1024;
|
|
41
|
+
/** Cap on an individual proposal diff echoed back through ashlr_inbox_list. */
|
|
42
|
+
const MAX_DIFF_CHARS = 4 * 1024;
|
|
43
|
+
/** Marker inserted where output was truncated. */
|
|
44
|
+
const TRUNCATION_MARK = '\n…[ashlr: output truncated]…\n';
|
|
45
|
+
const TOOLS = [
|
|
46
|
+
{
|
|
47
|
+
name: 'ashlr_orient',
|
|
48
|
+
description: 'Session-start orientation: genome memory hits, repo health, top backlog items, ' +
|
|
49
|
+
'pending proposal count, and portfolio attention. Call this once when starting ' +
|
|
50
|
+
'work in a repo. Read-only.',
|
|
51
|
+
inputSchema: {
|
|
52
|
+
type: 'object',
|
|
53
|
+
properties: {
|
|
54
|
+
repo: { type: 'string', description: 'Absolute repo path to scope to (optional).' },
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
safety: 'read',
|
|
58
|
+
handler: async (args, cfg) => buildOrientation(cfg, typeof args['repo'] === 'string' ? args['repo'] : undefined),
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
name: 'ashlr_ask',
|
|
62
|
+
description: 'Ask a question about the indexed portfolio (local RAG, cites repo/file:line). ' +
|
|
63
|
+
'Runs entirely on local models — code never leaves the machine. Read-only.',
|
|
64
|
+
inputSchema: {
|
|
65
|
+
type: 'object',
|
|
66
|
+
properties: {
|
|
67
|
+
question: { type: 'string', description: 'The question to answer.' },
|
|
68
|
+
repo: { type: 'string', description: 'Limit retrieval to one repo (optional).' },
|
|
69
|
+
},
|
|
70
|
+
required: ['question'],
|
|
71
|
+
},
|
|
72
|
+
safety: 'read',
|
|
73
|
+
handler: async (args) =>
|
|
74
|
+
// allowCloud is HARDCODED false (CONTRACT-M31 invariant 3).
|
|
75
|
+
ask(String(args['question']), {
|
|
76
|
+
repo: typeof args['repo'] === 'string' ? args['repo'] : undefined,
|
|
77
|
+
allowCloud: false,
|
|
78
|
+
}),
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
name: 'ashlr_recall',
|
|
82
|
+
description: 'Search ashlr shared memory (genome) for prior decisions, conventions, and ' +
|
|
83
|
+
'learnings relevant to a query. Read-only.',
|
|
84
|
+
inputSchema: {
|
|
85
|
+
type: 'object',
|
|
86
|
+
properties: {
|
|
87
|
+
query: { type: 'string', description: 'What to recall.' },
|
|
88
|
+
limit: { type: 'number', description: 'Max hits, 1–20 (default 5).' },
|
|
89
|
+
},
|
|
90
|
+
required: ['query'],
|
|
91
|
+
},
|
|
92
|
+
safety: 'read',
|
|
93
|
+
handler: async (args, cfg) => {
|
|
94
|
+
const rawLimit = typeof args['limit'] === 'number' ? args['limit'] : 5;
|
|
95
|
+
const limit = Math.max(1, Math.min(20, Math.floor(rawLimit)));
|
|
96
|
+
const hits = await recall(String(args['query']), cfg, { limit });
|
|
97
|
+
return hits.map((h) => ({
|
|
98
|
+
title: h.entry.title,
|
|
99
|
+
text: h.entry.text,
|
|
100
|
+
tags: h.entry.tags,
|
|
101
|
+
project: h.entry.project,
|
|
102
|
+
score: h.score,
|
|
103
|
+
method: h.method,
|
|
104
|
+
}));
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
name: 'ashlr_learn',
|
|
109
|
+
description: 'Append a learning/decision/convention to ashlr shared memory (genome hub). ' +
|
|
110
|
+
'Append-only; writes ONLY under ~/.ashlr/ — never into a repo working tree.',
|
|
111
|
+
inputSchema: {
|
|
112
|
+
type: 'object',
|
|
113
|
+
properties: {
|
|
114
|
+
text: { type: 'string', description: 'The learning to store.' },
|
|
115
|
+
title: { type: 'string', description: 'Short title (derived when omitted).' },
|
|
116
|
+
project: { type: 'string', description: 'Project name to scope to (optional).' },
|
|
117
|
+
tags: { type: 'array', items: { type: 'string' }, description: 'Tags (optional).' },
|
|
118
|
+
},
|
|
119
|
+
required: ['text'],
|
|
120
|
+
},
|
|
121
|
+
safety: 'append',
|
|
122
|
+
handler: async (args, cfg) => {
|
|
123
|
+
const genome = selectGenomeSync(cfg);
|
|
124
|
+
// hubOnly FORCED true: an agent can never drop a note file into a repo
|
|
125
|
+
// working tree via this surface (CONTRACT-M31 invariant 4).
|
|
126
|
+
const entry = genome.append({
|
|
127
|
+
text: String(args['text']),
|
|
128
|
+
title: typeof args['title'] === 'string' ? args['title'] : undefined,
|
|
129
|
+
project: typeof args['project'] === 'string' ? args['project'] : undefined,
|
|
130
|
+
tags: Array.isArray(args['tags']) ? args['tags'].map(String) : undefined,
|
|
131
|
+
hubOnly: true,
|
|
132
|
+
});
|
|
133
|
+
return { stored: true, id: entry.id, title: entry.title };
|
|
134
|
+
},
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
name: 'ashlr_backlog',
|
|
138
|
+
description: 'Top scored work items from the persisted portfolio backlog (issues, TODOs, ' +
|
|
139
|
+
'failing tests, dep/security findings). Read-only; never scans — run ' +
|
|
140
|
+
'`ashlr backlog refresh` to rebuild.',
|
|
141
|
+
inputSchema: {
|
|
142
|
+
type: 'object',
|
|
143
|
+
properties: {
|
|
144
|
+
repo: { type: 'string', description: 'Filter to one repo (optional).' },
|
|
145
|
+
limit: { type: 'number', description: 'Max items (default 10).' },
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
safety: 'read',
|
|
149
|
+
handler: async (args, cfg) => {
|
|
150
|
+
const backlog = selectBacklogSource(cfg).load();
|
|
151
|
+
if (!backlog) {
|
|
152
|
+
return {
|
|
153
|
+
items: [],
|
|
154
|
+
note: 'No backlog persisted — run `ashlr backlog refresh` (CLI) to build one.',
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
const rawLimit = typeof args['limit'] === 'number' ? args['limit'] : 10;
|
|
158
|
+
const limit = Math.max(1, Math.min(50, Math.floor(rawLimit)));
|
|
159
|
+
const repo = typeof args['repo'] === 'string' ? args['repo'] : null;
|
|
160
|
+
const items = (repo ? backlog.items.filter((it) => it.repo === repo || it.repo.endsWith(`/${repo}`)) : backlog.items)
|
|
161
|
+
.slice(0, limit)
|
|
162
|
+
.map((it) => ({
|
|
163
|
+
id: it.id,
|
|
164
|
+
repo: it.repo,
|
|
165
|
+
source: it.source,
|
|
166
|
+
title: it.title,
|
|
167
|
+
score: it.score,
|
|
168
|
+
value: it.value,
|
|
169
|
+
effort: it.effort,
|
|
170
|
+
}));
|
|
171
|
+
return { generatedAt: backlog.generatedAt, items };
|
|
172
|
+
},
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
name: 'ashlr_health',
|
|
176
|
+
description: 'Quality/health score for an enrolled repo (tests, docs, deps, security, debt), ' +
|
|
177
|
+
'or the latest portfolio report when no repo is given. Read-only.',
|
|
178
|
+
inputSchema: {
|
|
179
|
+
type: 'object',
|
|
180
|
+
properties: {
|
|
181
|
+
repo: { type: 'string', description: 'Absolute path of an ENROLLED repo (optional).' },
|
|
182
|
+
},
|
|
183
|
+
},
|
|
184
|
+
safety: 'read',
|
|
185
|
+
handler: async (args) => {
|
|
186
|
+
const repo = typeof args['repo'] === 'string' ? args['repo'] : null;
|
|
187
|
+
if (repo) {
|
|
188
|
+
// computeHealth hard-errors on non-enrolled repos (core invariant);
|
|
189
|
+
// surface that as a normal message, not a tool crash.
|
|
190
|
+
try {
|
|
191
|
+
const score = await computeHealth(repo);
|
|
192
|
+
return {
|
|
193
|
+
repo: score.repo,
|
|
194
|
+
score: score.score,
|
|
195
|
+
grade: score.grade,
|
|
196
|
+
dimensions: score.dimensions.map((d) => ({
|
|
197
|
+
dimension: d.dimension,
|
|
198
|
+
score: d.score,
|
|
199
|
+
summary: d.summary,
|
|
200
|
+
})),
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
catch (err) {
|
|
204
|
+
return { error: err instanceof Error ? err.message : String(err) };
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
const report = loadPreviousReport();
|
|
208
|
+
if (!report) {
|
|
209
|
+
return { note: 'No health report recorded — run `ashlr health` (CLI) first.' };
|
|
210
|
+
}
|
|
211
|
+
return {
|
|
212
|
+
generatedAt: report.generatedAt,
|
|
213
|
+
averageScore: report.averageScore,
|
|
214
|
+
averageGrade: report.averageGrade,
|
|
215
|
+
repos: report.scores.map((s) => ({ repo: s.repo, score: s.score, grade: s.grade })),
|
|
216
|
+
};
|
|
217
|
+
},
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
name: 'ashlr_status',
|
|
221
|
+
description: 'Portfolio snapshot: repo counts (dirty/stale), recent runs and swarms, ' +
|
|
222
|
+
'activity roll-up. Read-only metadata.',
|
|
223
|
+
inputSchema: { type: 'object', properties: {} },
|
|
224
|
+
safety: 'read',
|
|
225
|
+
handler: async (_args, cfg) => {
|
|
226
|
+
const snap = await buildSnapshot(cfg);
|
|
227
|
+
return {
|
|
228
|
+
generatedAt: snap.generatedAt,
|
|
229
|
+
repos: snap.repos,
|
|
230
|
+
tools: snap.tools,
|
|
231
|
+
activity: snap.activity,
|
|
232
|
+
runs: snap.runs.slice(0, 5),
|
|
233
|
+
swarms: snap.swarms.slice(0, 5),
|
|
234
|
+
};
|
|
235
|
+
},
|
|
236
|
+
},
|
|
237
|
+
{
|
|
238
|
+
name: 'ashlr_impact',
|
|
239
|
+
description: 'Impact analysis for a file or symbol: references and dependents within and ' +
|
|
240
|
+
'across enrolled repos (from the knowledge graph). Read-only.',
|
|
241
|
+
inputSchema: {
|
|
242
|
+
type: 'object',
|
|
243
|
+
properties: {
|
|
244
|
+
target: { type: 'string', description: 'File path or symbol name.' },
|
|
245
|
+
},
|
|
246
|
+
required: ['target'],
|
|
247
|
+
},
|
|
248
|
+
safety: 'read',
|
|
249
|
+
handler: async (args) => impact(String(args['target'])),
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
name: 'ashlr_pulse',
|
|
253
|
+
description: 'Token/cost/activity roll-up for a time window (sessions, tokens, est. cost, ' +
|
|
254
|
+
'commits). Read-only metadata.',
|
|
255
|
+
inputSchema: {
|
|
256
|
+
type: 'object',
|
|
257
|
+
properties: {
|
|
258
|
+
window: { type: 'string', enum: ['1d', '7d', '30d'], description: "Window (default '7d')." },
|
|
259
|
+
},
|
|
260
|
+
},
|
|
261
|
+
safety: 'read',
|
|
262
|
+
handler: async (args, cfg) => {
|
|
263
|
+
const w = args['window'];
|
|
264
|
+
const window = w === '1d' || w === '7d' || w === '30d' ? w : '7d';
|
|
265
|
+
return buildRollup(window, cfg);
|
|
266
|
+
},
|
|
267
|
+
},
|
|
268
|
+
{
|
|
269
|
+
name: 'ashlr_inbox_list',
|
|
270
|
+
description: 'List inbox proposals (the human approval gate). Read-only — approval and ' +
|
|
271
|
+
'rejection are HUMAN-ONLY via the `ashlr inbox` CLI.',
|
|
272
|
+
inputSchema: {
|
|
273
|
+
type: 'object',
|
|
274
|
+
properties: {
|
|
275
|
+
status: {
|
|
276
|
+
type: 'string',
|
|
277
|
+
enum: ['pending', 'approved', 'rejected', 'applied', 'failed'],
|
|
278
|
+
description: 'Filter by status (optional).',
|
|
279
|
+
},
|
|
280
|
+
},
|
|
281
|
+
},
|
|
282
|
+
safety: 'read',
|
|
283
|
+
handler: async (args, cfg) => {
|
|
284
|
+
const status = typeof args['status'] === 'string' ? args['status'] : undefined;
|
|
285
|
+
const proposals = selectInboxStore(cfg).list(status ? { status } : undefined);
|
|
286
|
+
return proposals.map((p) => ({
|
|
287
|
+
id: p.id,
|
|
288
|
+
repo: p.repo,
|
|
289
|
+
origin: p.origin,
|
|
290
|
+
kind: p.kind,
|
|
291
|
+
title: p.title,
|
|
292
|
+
summary: p.summary,
|
|
293
|
+
status: p.status,
|
|
294
|
+
createdAt: p.createdAt,
|
|
295
|
+
diff: p.diff && p.diff.length > MAX_DIFF_CHARS
|
|
296
|
+
? p.diff.slice(0, MAX_DIFF_CHARS) + TRUNCATION_MARK
|
|
297
|
+
: p.diff,
|
|
298
|
+
}));
|
|
299
|
+
},
|
|
300
|
+
},
|
|
301
|
+
{
|
|
302
|
+
name: 'ashlr_inbox_propose',
|
|
303
|
+
description: 'Propose an outward action (patch / pr / note) into the approval inbox. The ' +
|
|
304
|
+
'proposal is created PENDING and applies ONLY after explicit human approval ' +
|
|
305
|
+
'via `ashlr inbox`. Nothing is executed by this call.',
|
|
306
|
+
inputSchema: {
|
|
307
|
+
type: 'object',
|
|
308
|
+
properties: {
|
|
309
|
+
kind: {
|
|
310
|
+
type: 'string',
|
|
311
|
+
// 'deploy' is deliberately EXCLUDED from the agent surface.
|
|
312
|
+
enum: ['patch', 'pr', 'note'],
|
|
313
|
+
description: 'What kind of outward action is proposed.',
|
|
314
|
+
},
|
|
315
|
+
title: { type: 'string', description: 'Short title for the inbox list.' },
|
|
316
|
+
summary: { type: 'string', description: 'What + why (no secrets).' },
|
|
317
|
+
repo: { type: 'string', description: 'Absolute target repo path (optional for notes).' },
|
|
318
|
+
diff: { type: 'string', description: 'Unified diff for patch/pr proposals (optional).' },
|
|
319
|
+
},
|
|
320
|
+
required: ['kind', 'title', 'summary'],
|
|
321
|
+
},
|
|
322
|
+
safety: 'proposal',
|
|
323
|
+
handler: async (args, cfg) => {
|
|
324
|
+
const kind = String(args['kind']);
|
|
325
|
+
if (kind !== 'patch' && kind !== 'pr' && kind !== 'note') {
|
|
326
|
+
return { error: `invalid kind "${kind}" — agent proposals may be patch | pr | note` };
|
|
327
|
+
}
|
|
328
|
+
const proposal = selectInboxStore(cfg).create({
|
|
329
|
+
repo: typeof args['repo'] === 'string' ? args['repo'] : null,
|
|
330
|
+
origin: 'agent',
|
|
331
|
+
kind,
|
|
332
|
+
title: String(args['title']),
|
|
333
|
+
summary: String(args['summary']),
|
|
334
|
+
...(typeof args['diff'] === 'string' ? { diff: args['diff'] } : {}),
|
|
335
|
+
});
|
|
336
|
+
return {
|
|
337
|
+
created: true,
|
|
338
|
+
id: proposal.id,
|
|
339
|
+
status: proposal.status,
|
|
340
|
+
note: 'Pending human review — approve/reject via `ashlr inbox` (CLI).',
|
|
341
|
+
};
|
|
342
|
+
},
|
|
343
|
+
},
|
|
344
|
+
];
|
|
345
|
+
// ---------------------------------------------------------------------------
|
|
346
|
+
// Public registry surface
|
|
347
|
+
// ---------------------------------------------------------------------------
|
|
348
|
+
/** The native tool definitions (no handlers) for diagnostics/docs surfaces. */
|
|
349
|
+
export function nativeToolDefs() {
|
|
350
|
+
return TOOLS.map(({ name, description, inputSchema, safety }) => ({
|
|
351
|
+
name,
|
|
352
|
+
description,
|
|
353
|
+
inputSchema,
|
|
354
|
+
safety,
|
|
355
|
+
}));
|
|
356
|
+
}
|
|
357
|
+
/** tools/list shape: name + description + inputSchema (gateway prepends these). */
|
|
358
|
+
export function listNativeTools() {
|
|
359
|
+
return TOOLS.map((t) => ({
|
|
360
|
+
name: t.name,
|
|
361
|
+
description: t.description,
|
|
362
|
+
inputSchema: t.inputSchema,
|
|
363
|
+
}));
|
|
364
|
+
}
|
|
365
|
+
/** True when `name` is a native tool (used by the gateway router). */
|
|
366
|
+
export function isNativeTool(name) {
|
|
367
|
+
return TOOLS.some((t) => t.name === name);
|
|
368
|
+
}
|
|
369
|
+
// ---------------------------------------------------------------------------
|
|
370
|
+
// Argument validation (lightweight, zero-dep)
|
|
371
|
+
// ---------------------------------------------------------------------------
|
|
372
|
+
/**
|
|
373
|
+
* Validate args against the tool's JSON Schema: required presence + primitive
|
|
374
|
+
* type checks + enum membership. Returns an error message or null. Unknown
|
|
375
|
+
* properties are tolerated (forward compatibility).
|
|
376
|
+
*/
|
|
377
|
+
function validateArgs(schema, args) {
|
|
378
|
+
const s = schema;
|
|
379
|
+
for (const req of s.required ?? []) {
|
|
380
|
+
if (args[req] === undefined || args[req] === null || args[req] === '') {
|
|
381
|
+
return `missing required argument "${req}"`;
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
for (const [key, value] of Object.entries(args)) {
|
|
385
|
+
const prop = s.properties?.[key];
|
|
386
|
+
if (!prop || value === undefined || value === null)
|
|
387
|
+
continue;
|
|
388
|
+
if (prop.type === 'string' && typeof value !== 'string') {
|
|
389
|
+
return `argument "${key}" must be a string`;
|
|
390
|
+
}
|
|
391
|
+
if (prop.type === 'number' && typeof value !== 'number') {
|
|
392
|
+
return `argument "${key}" must be a number`;
|
|
393
|
+
}
|
|
394
|
+
if (prop.type === 'array' && !Array.isArray(value)) {
|
|
395
|
+
return `argument "${key}" must be an array`;
|
|
396
|
+
}
|
|
397
|
+
if (prop.enum && !prop.enum.includes(value)) {
|
|
398
|
+
return `argument "${key}" must be one of: ${prop.enum.join(', ')}`;
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
return null;
|
|
402
|
+
}
|
|
403
|
+
/** Exported for tests: serialize + scrub + cap exactly as tool results do. */
|
|
404
|
+
export function renderToolText(payload) {
|
|
405
|
+
return textResult(payload).content[0]?.text ?? '';
|
|
406
|
+
}
|
|
407
|
+
function textResult(payload, isError = false) {
|
|
408
|
+
let text;
|
|
409
|
+
try {
|
|
410
|
+
text = typeof payload === 'string' ? payload : JSON.stringify(payload, null, 2);
|
|
411
|
+
}
|
|
412
|
+
catch {
|
|
413
|
+
text = String(payload);
|
|
414
|
+
}
|
|
415
|
+
// Scrub BEFORE capping so a secret straddling the cap boundary can't survive.
|
|
416
|
+
text = scrubSecrets(text);
|
|
417
|
+
if (text.length > MAX_OUTPUT_CHARS) {
|
|
418
|
+
const head = text.slice(0, Math.floor(MAX_OUTPUT_CHARS * 0.75));
|
|
419
|
+
const tail = text.slice(-Math.floor(MAX_OUTPUT_CHARS * 0.2));
|
|
420
|
+
text = head + TRUNCATION_MARK + tail;
|
|
421
|
+
}
|
|
422
|
+
return isError ? { content: [{ type: 'text', text }], isError: true } : { content: [{ type: 'text', text }] };
|
|
423
|
+
}
|
|
424
|
+
/**
|
|
425
|
+
* Execute a native tool through the full safety pipeline. NEVER throws:
|
|
426
|
+
* unknown tools, invalid args, kill-switch refusals, and handler failures all
|
|
427
|
+
* surface as isError text results. Every outcome is audited.
|
|
428
|
+
*/
|
|
429
|
+
export async function callNativeTool(name, rawArgs) {
|
|
430
|
+
const tool = TOOLS.find((t) => t.name === name);
|
|
431
|
+
const args = rawArgs !== null && typeof rawArgs === 'object' && !Array.isArray(rawArgs)
|
|
432
|
+
? rawArgs
|
|
433
|
+
: {};
|
|
434
|
+
const argKeys = Object.keys(args).sort().join(',') || '(none)';
|
|
435
|
+
if (!tool) {
|
|
436
|
+
audit({
|
|
437
|
+
action: 'mcp:native-call',
|
|
438
|
+
repo: null,
|
|
439
|
+
sandboxId: null,
|
|
440
|
+
summary: `${name} keys=${argKeys} — unknown native tool`,
|
|
441
|
+
result: 'error',
|
|
442
|
+
});
|
|
443
|
+
return textResult(`Unknown native tool "${name}".`, true);
|
|
444
|
+
}
|
|
445
|
+
// ── Validate ───────────────────────────────────────────────────────────────
|
|
446
|
+
const invalid = validateArgs(tool.inputSchema, args);
|
|
447
|
+
if (invalid) {
|
|
448
|
+
audit({
|
|
449
|
+
action: 'mcp:native-call',
|
|
450
|
+
repo: null,
|
|
451
|
+
sandboxId: null,
|
|
452
|
+
summary: `${tool.name} keys=${argKeys} — invalid args: ${invalid}`,
|
|
453
|
+
result: 'error',
|
|
454
|
+
});
|
|
455
|
+
return textResult(`Invalid arguments for ${tool.name}: ${invalid}`, true);
|
|
456
|
+
}
|
|
457
|
+
// ── Safety gate: KILL refuses all writes (CONTRACT-M31 invariant 2) ───────
|
|
458
|
+
if (tool.safety !== 'read' && killSwitchOn()) {
|
|
459
|
+
audit({
|
|
460
|
+
action: 'mcp:native-call',
|
|
461
|
+
repo: null,
|
|
462
|
+
sandboxId: null,
|
|
463
|
+
summary: `${tool.name} keys=${argKeys} — refused: kill switch on`,
|
|
464
|
+
result: 'refused',
|
|
465
|
+
});
|
|
466
|
+
return textResult(`${tool.name} refused: the ashlr kill switch is engaged (~/.ashlr/KILL). ` +
|
|
467
|
+
'Read-only tools still work; writes are disabled until `ashlr enroll kill off`.', true);
|
|
468
|
+
}
|
|
469
|
+
// ── Execute ────────────────────────────────────────────────────────────────
|
|
470
|
+
let cfg;
|
|
471
|
+
try {
|
|
472
|
+
cfg = loadConfig();
|
|
473
|
+
}
|
|
474
|
+
catch (err) {
|
|
475
|
+
audit({
|
|
476
|
+
action: 'mcp:native-call',
|
|
477
|
+
repo: null,
|
|
478
|
+
sandboxId: null,
|
|
479
|
+
summary: `${tool.name} keys=${argKeys} — config load failed`,
|
|
480
|
+
result: 'error',
|
|
481
|
+
});
|
|
482
|
+
return textResult(`${tool.name} failed: could not load ~/.ashlr/config.json (${err instanceof Error ? err.message : String(err)})`, true);
|
|
483
|
+
}
|
|
484
|
+
try {
|
|
485
|
+
const payload = await tool.handler(args, cfg);
|
|
486
|
+
audit({
|
|
487
|
+
action: 'mcp:native-call',
|
|
488
|
+
repo: null,
|
|
489
|
+
sandboxId: null,
|
|
490
|
+
summary: `${tool.name} keys=${argKeys} — ok`,
|
|
491
|
+
result: 'ok',
|
|
492
|
+
});
|
|
493
|
+
return textResult(payload);
|
|
494
|
+
}
|
|
495
|
+
catch (err) {
|
|
496
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
497
|
+
audit({
|
|
498
|
+
action: 'mcp:native-call',
|
|
499
|
+
repo: null,
|
|
500
|
+
sandboxId: null,
|
|
501
|
+
summary: `${tool.name} keys=${argKeys} — error: ${msg}`,
|
|
502
|
+
result: 'error',
|
|
503
|
+
});
|
|
504
|
+
return textResult(`${tool.name} failed: ${msg}`, true);
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
//# sourceMappingURL=mcp-native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-native.js","sourceRoot":"","sources":["../../src/core/mcp-native.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* core/mcp-registry.ts — MCP server discovery registry.
|
|
3
|
+
*
|
|
4
|
+
* Scans known config file locations on this machine, extracts mcpServers
|
|
5
|
+
* entries, deduplicates by name (first occurrence wins), and returns a
|
|
6
|
+
* typed McpRegistry. Never throws — unreadable or malformed files are
|
|
7
|
+
* silently skipped. Never prints or returns real env values; use
|
|
8
|
+
* redactEnv() before displaying any spec.
|
|
9
|
+
*/
|
|
10
|
+
import type { McpRegistry, McpServerSpec } from './types.js';
|
|
11
|
+
/**
|
|
12
|
+
* The known config file paths discovery scans, in scan order. Absolute paths:
|
|
13
|
+
* ~/.claude.json, ~/.claude/settings.json, ~/.mcp.json,
|
|
14
|
+
* ~/.ashlrcode/settings.json, and ashlr-workbench agent settings.
|
|
15
|
+
*/
|
|
16
|
+
export declare function knownConfigPaths(): string[];
|
|
17
|
+
/**
|
|
18
|
+
* Discover MCP servers already configured on this machine.
|
|
19
|
+
*
|
|
20
|
+
* Reads the known config paths (see knownConfigPaths), parses each
|
|
21
|
+
* `mcpServers` object ({ <name>: { command, args, env? } }), and returns
|
|
22
|
+
* deduped specs (dedupe by `name`; first occurrence wins, stable order).
|
|
23
|
+
* Recognises the ashlr-plugin server (name "ashlr") and phantom
|
|
24
|
+
* (name "phantom-secrets") when present.
|
|
25
|
+
*
|
|
26
|
+
* Never throws: unreadable/malformed configs are skipped silently.
|
|
27
|
+
* When producing ANY printed/displayed form, redact every env value to '<set>'
|
|
28
|
+
* via redactEnv().
|
|
29
|
+
*/
|
|
30
|
+
export declare function discoverMcpServers(paths?: string[]): McpRegistry;
|
|
31
|
+
/**
|
|
32
|
+
* Return a copy of the spec with all env values replaced by the literal
|
|
33
|
+
* string '<set>'. Use this before printing or serialising for display.
|
|
34
|
+
* Non-env fields are returned unchanged.
|
|
35
|
+
*/
|
|
36
|
+
export declare function redactEnv(spec: McpServerSpec): McpServerSpec;
|