@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,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* engines.ts — M11: hardened per-engine adapters.
|
|
3
|
+
*
|
|
4
|
+
* Each engine maps a goal to its REAL CLI argv. This is the source of truth
|
|
5
|
+
* for external engine invocations and MUST be unit-tested for exact argv.
|
|
6
|
+
*
|
|
7
|
+
* Confirmed real CLIs (probed via --help where installed):
|
|
8
|
+
* - claude (INSTALLED): `claude -p "<goal>" --model <M> --output-format json`
|
|
9
|
+
* - aw (INSTALLED): `aw auto "<goal>" --cwd <D>` [+ `--model <M>` when given]
|
|
10
|
+
* - ashlrcode (ABSENT): `ac --goal "<goal>"` style (fallback to builtin when absent)
|
|
11
|
+
*
|
|
12
|
+
* GUARDRAILS:
|
|
13
|
+
* - buildEngineCommand is PURE: no spawn, no PATH probe, no network.
|
|
14
|
+
* - spawnEngine MUST NOT be called against a real delegated agent during
|
|
15
|
+
* build/integrate/verify (unit-tests assert argv only, never spawn).
|
|
16
|
+
* - phantomWrap is a pure arg transform; never logs secret values.
|
|
17
|
+
* - withToolEnv is allowlist-only (no secrets in env).
|
|
18
|
+
*/
|
|
19
|
+
import { spawnSync, execFileSync } from 'node:child_process';
|
|
20
|
+
import { withToolEnv } from '../env-bridge.js';
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
// Phantom detection (cached, best-effort)
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
let _phantomInstalled;
|
|
25
|
+
function phantomInstalled() {
|
|
26
|
+
if (_phantomInstalled === undefined) {
|
|
27
|
+
try {
|
|
28
|
+
execFileSync('which', ['phantom'], { stdio: 'ignore' });
|
|
29
|
+
_phantomInstalled = true;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
_phantomInstalled = false;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return _phantomInstalled;
|
|
36
|
+
}
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
// engineInstalled
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
/**
|
|
41
|
+
* Whether the engine's real binary is on PATH.
|
|
42
|
+
* - 'builtin' => always true (no external binary needed).
|
|
43
|
+
* - 'claude' => checks for 'claude' binary.
|
|
44
|
+
* - 'aw' => checks for 'aw' binary.
|
|
45
|
+
* - 'ashlrcode' => checks for 'ac' (primary alias) or 'ashlrcode'.
|
|
46
|
+
*
|
|
47
|
+
* Best-effort, never throws.
|
|
48
|
+
*/
|
|
49
|
+
export function engineInstalled(engine) {
|
|
50
|
+
if (engine === 'builtin')
|
|
51
|
+
return true;
|
|
52
|
+
const bins = {
|
|
53
|
+
claude: ['claude'],
|
|
54
|
+
aw: ['aw'],
|
|
55
|
+
ashlrcode: ['ac', 'ashlrcode'],
|
|
56
|
+
};
|
|
57
|
+
const candidates = bins[engine] ?? [engine];
|
|
58
|
+
for (const bin of candidates) {
|
|
59
|
+
try {
|
|
60
|
+
execFileSync('which', [bin], { stdio: 'ignore' });
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
// try next
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
// ---------------------------------------------------------------------------
|
|
70
|
+
// buildEngineCommand — PURE, no side effects
|
|
71
|
+
// ---------------------------------------------------------------------------
|
|
72
|
+
/**
|
|
73
|
+
* Build the EXACT external command for an engine, or null for the builtin loop.
|
|
74
|
+
*
|
|
75
|
+
* Returns null when `engine === 'builtin'`.
|
|
76
|
+
* Returns a fully-resolved EngineCommand for 'ashlrcode' | 'aw' | 'claude'.
|
|
77
|
+
*
|
|
78
|
+
* This function is PURE: it does not spawn, probe PATH, or touch the network.
|
|
79
|
+
* opts.model is the hub-selected model; opts.cwd the target dir (default process.cwd()).
|
|
80
|
+
*
|
|
81
|
+
* EXACT argvs (asserted in unit tests):
|
|
82
|
+
* claude: bin='claude', args=['-p', G, '--model', M, '--output-format', 'json']
|
|
83
|
+
* aw: bin='aw', args=['auto', G, '--cwd', D] [+ '--model', M when given]
|
|
84
|
+
* ashlrcode: bin='ac', args=['--goal', G]
|
|
85
|
+
*/
|
|
86
|
+
export function buildEngineCommand(engine, goal, _cfg, opts) {
|
|
87
|
+
if (engine === 'builtin')
|
|
88
|
+
return null;
|
|
89
|
+
const cwd = opts?.cwd ?? process.cwd();
|
|
90
|
+
const model = opts?.model?.trim();
|
|
91
|
+
switch (engine) {
|
|
92
|
+
case 'claude': {
|
|
93
|
+
const args = ['-p', goal, '--output-format', 'json'];
|
|
94
|
+
if (model) {
|
|
95
|
+
// --model must come before --output-format per claude's -p mode
|
|
96
|
+
args.splice(2, 0, '--model', model);
|
|
97
|
+
}
|
|
98
|
+
return { bin: 'claude', args, cwd };
|
|
99
|
+
}
|
|
100
|
+
case 'aw': {
|
|
101
|
+
const args = ['auto', goal, '--cwd', cwd];
|
|
102
|
+
if (model) {
|
|
103
|
+
args.push('--model', model);
|
|
104
|
+
}
|
|
105
|
+
return { bin: 'aw', args, cwd };
|
|
106
|
+
}
|
|
107
|
+
case 'ashlrcode': {
|
|
108
|
+
// Real CLI is 'ac' (alias 'ashlrcode'). Arg builder must be correct for
|
|
109
|
+
// when present; absence routes to builtin per M9/M10.
|
|
110
|
+
const args = ['--goal', goal];
|
|
111
|
+
return { bin: 'ac', args, cwd };
|
|
112
|
+
}
|
|
113
|
+
default:
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// ---------------------------------------------------------------------------
|
|
118
|
+
// phantomWrap — pure arg transform
|
|
119
|
+
// ---------------------------------------------------------------------------
|
|
120
|
+
/**
|
|
121
|
+
* Wrap an EngineCommand to run under `phantom exec -- <bin> <args...>`.
|
|
122
|
+
*
|
|
123
|
+
* PURE arg transform — never logs secret values.
|
|
124
|
+
* Caller decides when to apply it (only when cfg.phantom?.enabled && phantomInstalled).
|
|
125
|
+
*/
|
|
126
|
+
export function phantomWrap(cmd, _cfg) {
|
|
127
|
+
return {
|
|
128
|
+
bin: 'phantom',
|
|
129
|
+
args: ['exec', '--', cmd.bin, ...cmd.args],
|
|
130
|
+
cwd: cmd.cwd,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
// ---------------------------------------------------------------------------
|
|
134
|
+
// spawnEngine
|
|
135
|
+
// ---------------------------------------------------------------------------
|
|
136
|
+
/**
|
|
137
|
+
* Spawn a resolved EngineCommand and capture its result.
|
|
138
|
+
*
|
|
139
|
+
* - Applies withToolEnv(cfg) (M10 env-bridge; allowlist, NON-SECRET only).
|
|
140
|
+
* - Wraps via phantomWrap when cfg.phantom?.enabled AND phantom is installed.
|
|
141
|
+
* - Captures stdout as `output`.
|
|
142
|
+
* - For claude with --output-format json: parses usage/cost from stdout JSON.
|
|
143
|
+
* - Never throws; failures reported as { ok: false, error }.
|
|
144
|
+
*
|
|
145
|
+
* GUARDRAIL: MUST NOT be called against a real delegated agent during
|
|
146
|
+
* build/integrate/verify — unit tests assert argv builders only.
|
|
147
|
+
*/
|
|
148
|
+
export function spawnEngine(cmd, cfg) {
|
|
149
|
+
// CONTRACT: spawnEngine NEVER throws. Any synchronous failure (spawnSync
|
|
150
|
+
// throwing, env-bridge/phantom probe errors, etc.) is reported as
|
|
151
|
+
// { ok:false, error } rather than propagated to the caller.
|
|
152
|
+
try {
|
|
153
|
+
return spawnEngineInner(cmd, cfg);
|
|
154
|
+
}
|
|
155
|
+
catch (err) {
|
|
156
|
+
return { ok: false, output: '', error: err instanceof Error ? err.message : String(err) };
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
function spawnEngineInner(cmd, cfg) {
|
|
160
|
+
// Apply phantom-exec wrap when enabled and installed (best-effort)
|
|
161
|
+
let effective = cmd;
|
|
162
|
+
if (cfg.phantom?.enabled && phantomInstalled()) {
|
|
163
|
+
effective = phantomWrap(cmd, cfg);
|
|
164
|
+
}
|
|
165
|
+
const childEnv = withToolEnv(cfg);
|
|
166
|
+
const result = spawnSync(effective.bin, effective.args, {
|
|
167
|
+
encoding: 'utf8',
|
|
168
|
+
maxBuffer: 10 * 1024 * 1024, // 10 MB
|
|
169
|
+
timeout: 5 * 60 * 1000, // 5 min hard wall-clock limit
|
|
170
|
+
cwd: effective.cwd,
|
|
171
|
+
env: childEnv,
|
|
172
|
+
});
|
|
173
|
+
if (result.error || result.status !== 0) {
|
|
174
|
+
const errMsg = result.error?.message ??
|
|
175
|
+
(result.stderr ? String(result.stderr).trim() : `exit ${result.status ?? 'unknown'}`);
|
|
176
|
+
return { ok: false, output: '', error: errMsg };
|
|
177
|
+
}
|
|
178
|
+
const rawOutput = String(result.stdout ?? '').trim();
|
|
179
|
+
// Attempt to parse usage from claude --output-format json output
|
|
180
|
+
let usage;
|
|
181
|
+
if (cmd.bin === 'claude') {
|
|
182
|
+
try {
|
|
183
|
+
const parsed = JSON.parse(rawOutput);
|
|
184
|
+
// Claude JSON output shape: { cost_usd, usage: { input_tokens, output_tokens }, result, ... }
|
|
185
|
+
const u = parsed['usage'];
|
|
186
|
+
if (u && typeof u['input_tokens'] === 'number' && typeof u['output_tokens'] === 'number') {
|
|
187
|
+
usage = {
|
|
188
|
+
tokensIn: u['input_tokens'],
|
|
189
|
+
tokensOut: u['output_tokens'],
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
// Not JSON or unexpected shape — usage stays undefined; caller estimates
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return { ok: true, output: rawOutput, usage };
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=engines.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engines.js","sourceRoot":"","sources":["../../../src/core/run/engines.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* model-manager.ts — local model discovery and opt-in management.
|
|
3
|
+
*
|
|
4
|
+
* GUARDRAILS (non-negotiable):
|
|
5
|
+
* - `listLocalModels` and `ollamaInstalled` are PURE READ — no spawning work.
|
|
6
|
+
* - `pullModel` is EXPLICIT ONLY — called exclusively from `ashlr models pull`.
|
|
7
|
+
* Never invoked during routing or runs.
|
|
8
|
+
* - `startOllama` is EXPLICIT ONLY — called exclusively from `ashlr models start`.
|
|
9
|
+
* Never invoked during routing or runs.
|
|
10
|
+
* - Never throws — all failures surface as ok:false / empty arrays.
|
|
11
|
+
* - No new runtime dependencies.
|
|
12
|
+
*/
|
|
13
|
+
import type { AshlrConfig, LocalModelInfo } from '../types.js';
|
|
14
|
+
/**
|
|
15
|
+
* Probe Ollama (:11434 /api/tags) and LM Studio (:1234 /v1/models) and return
|
|
16
|
+
* all discovered local models with their `active` flag set (matching the
|
|
17
|
+
* configured default model per provider in cfg.models).
|
|
18
|
+
*
|
|
19
|
+
* Unreachable providers silently yield no entries — never throws.
|
|
20
|
+
*/
|
|
21
|
+
export declare function listLocalModels(cfg: AshlrConfig): Promise<LocalModelInfo[]>;
|
|
22
|
+
/**
|
|
23
|
+
* Detect whether the `ollama` binary is available on PATH.
|
|
24
|
+
*
|
|
25
|
+
* Synchronous, no I/O beyond a single `which` call. Returns false on any
|
|
26
|
+
* error (binary not found, PATH issues, etc.). Never throws.
|
|
27
|
+
*/
|
|
28
|
+
export declare function ollamaInstalled(): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* EXPLICIT pull of a named Ollama model.
|
|
31
|
+
*
|
|
32
|
+
* Called ONLY from `ashlr models pull <name>` — NEVER from routing or runs.
|
|
33
|
+
*
|
|
34
|
+
* Validates the model name is a safe ref (no shell-special chars), then runs
|
|
35
|
+
* `ollama pull <name>` via execFile (NOT a shell — no injection risk). Returns
|
|
36
|
+
* a progress summary. Allows up to 10 minutes for the download.
|
|
37
|
+
*
|
|
38
|
+
* Returns { ok: false, detail: <reason> } when:
|
|
39
|
+
* - ollama is not installed
|
|
40
|
+
* - the model name fails validation
|
|
41
|
+
* - the pull command exits non-zero
|
|
42
|
+
*/
|
|
43
|
+
export declare function pullModel(name: string): Promise<{
|
|
44
|
+
ok: boolean;
|
|
45
|
+
detail: string;
|
|
46
|
+
}>;
|
|
47
|
+
/**
|
|
48
|
+
* Best-effort start of a LOCAL installed Ollama.
|
|
49
|
+
*
|
|
50
|
+
* Called ONLY from `ashlr models start` — NEVER from routing or runs.
|
|
51
|
+
*
|
|
52
|
+
* Strategy (macOS-first, matching the target platform):
|
|
53
|
+
* 1. If Ollama is already responding on :11434, return ok immediately.
|
|
54
|
+
* 2. If not installed, return ok:false immediately.
|
|
55
|
+
* 3. Try `open -a Ollama` (macOS app) first — this launches the menu-bar app.
|
|
56
|
+
* 4. Fall back to spawning `ollama serve` detached if the app open fails or
|
|
57
|
+
* if we're on non-macOS.
|
|
58
|
+
* 5. Poll :11434 up to START_WAIT_TIMEOUT_MS for the server to come up.
|
|
59
|
+
* 6. Return { ok, detail } — never throws.
|
|
60
|
+
*/
|
|
61
|
+
export declare function startOllama(): Promise<{
|
|
62
|
+
ok: boolean;
|
|
63
|
+
detail: string;
|
|
64
|
+
}>;
|
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* model-manager.ts — local model discovery and opt-in management.
|
|
3
|
+
*
|
|
4
|
+
* GUARDRAILS (non-negotiable):
|
|
5
|
+
* - `listLocalModels` and `ollamaInstalled` are PURE READ — no spawning work.
|
|
6
|
+
* - `pullModel` is EXPLICIT ONLY — called exclusively from `ashlr models pull`.
|
|
7
|
+
* Never invoked during routing or runs.
|
|
8
|
+
* - `startOllama` is EXPLICIT ONLY — called exclusively from `ashlr models start`.
|
|
9
|
+
* Never invoked during routing or runs.
|
|
10
|
+
* - Never throws — all failures surface as ok:false / empty arrays.
|
|
11
|
+
* - No new runtime dependencies.
|
|
12
|
+
*/
|
|
13
|
+
import { execFile, execFileSync, spawn } from 'node:child_process';
|
|
14
|
+
import { promisify } from 'node:util';
|
|
15
|
+
import { probeEndpoint } from '../providers.js';
|
|
16
|
+
const execFileAsync = promisify(execFile);
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
// Constants
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
/** Bounded timeout for the Ollama /api/tags and LM Studio /v1/models probes. */
|
|
21
|
+
const PROBE_TIMEOUT_MS = 5_000;
|
|
22
|
+
/** Bounded timeout for waiting for Ollama to come up after `startOllama`. */
|
|
23
|
+
const START_WAIT_TIMEOUT_MS = 15_000;
|
|
24
|
+
const START_POLL_INTERVAL_MS = 500;
|
|
25
|
+
/** Maximum time allowed for `ollama pull` (large downloads; up to 10 min). */
|
|
26
|
+
const PULL_TIMEOUT_MS = 600_000;
|
|
27
|
+
/**
|
|
28
|
+
* Valid model name characters for Ollama: alphanumeric, hyphen, underscore,
|
|
29
|
+
* colon (for tag), period, and forward-slash (for namespace). No shell-special
|
|
30
|
+
* characters. Must not be empty.
|
|
31
|
+
*/
|
|
32
|
+
const SAFE_MODEL_NAME_RE = /^[a-zA-Z0-9][a-zA-Z0-9_./:@-]{0,254}$/;
|
|
33
|
+
// ---------------------------------------------------------------------------
|
|
34
|
+
// listLocalModels
|
|
35
|
+
// ---------------------------------------------------------------------------
|
|
36
|
+
/**
|
|
37
|
+
* Probe Ollama (:11434 /api/tags) and LM Studio (:1234 /v1/models) and return
|
|
38
|
+
* all discovered local models with their `active` flag set (matching the
|
|
39
|
+
* configured default model per provider in cfg.models).
|
|
40
|
+
*
|
|
41
|
+
* Unreachable providers silently yield no entries — never throws.
|
|
42
|
+
*/
|
|
43
|
+
export async function listLocalModels(cfg) {
|
|
44
|
+
const [ollamaResult, lmResult] = await Promise.allSettled([
|
|
45
|
+
probeEndpoint('ollama', cfg.models.ollama),
|
|
46
|
+
probeEndpoint('lmstudio', cfg.models.lmstudio),
|
|
47
|
+
]);
|
|
48
|
+
const results = [];
|
|
49
|
+
// --- Ollama ---
|
|
50
|
+
if (ollamaResult.status === 'fulfilled' && ollamaResult.value.up) {
|
|
51
|
+
const endpoint = ollamaResult.value;
|
|
52
|
+
// Also attempt to get size info from /api/tags raw JSON
|
|
53
|
+
const sizeMap = await fetchOllamaModelSizes(cfg.models.ollama);
|
|
54
|
+
// Mark the model that pickModel() would actually select as the active
|
|
55
|
+
// default for this provider (mirrors provider-client.ts so `ashlr models`
|
|
56
|
+
// shows what a run would really use). ASHLR_MODEL override wins.
|
|
57
|
+
const activeName = defaultModelFor(endpoint.models, process.env['ASHLR_MODEL']);
|
|
58
|
+
for (const name of endpoint.models) {
|
|
59
|
+
const sizeLabel = sizeMap.get(name);
|
|
60
|
+
const entry = { provider: 'ollama', name, active: name === activeName };
|
|
61
|
+
if (sizeLabel)
|
|
62
|
+
entry.sizeLabel = sizeLabel;
|
|
63
|
+
results.push(entry);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// --- LM Studio ---
|
|
67
|
+
if (lmResult.status === 'fulfilled' && lmResult.value.up) {
|
|
68
|
+
const endpoint = lmResult.value;
|
|
69
|
+
const activeName = defaultModelFor(endpoint.models, process.env['ASHLR_MODEL']);
|
|
70
|
+
for (const name of endpoint.models) {
|
|
71
|
+
const entry = { provider: 'lmstudio', name, active: name === activeName };
|
|
72
|
+
results.push(entry);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return results;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Determine which model in `models` is the active default for a provider.
|
|
79
|
+
*
|
|
80
|
+
* This mirrors `pickModel` in provider-client.ts EXACTLY so that the model
|
|
81
|
+
* marked active by `ashlr models` is the same one a run would actually use:
|
|
82
|
+
* 1. ASHLR_MODEL override (exact match, else first substring match, else the
|
|
83
|
+
* verbatim override — which won't match any listed name, so nothing is
|
|
84
|
+
* marked active when the override names a model that isn't installed).
|
|
85
|
+
* 2. Otherwise the local-first/cost-efficient default: the smallest/fastest
|
|
86
|
+
* non-embedding chat model, biased slightly toward coder models.
|
|
87
|
+
*
|
|
88
|
+
* Returns undefined when the list is empty.
|
|
89
|
+
*/
|
|
90
|
+
function defaultModelFor(models, override) {
|
|
91
|
+
if (models.length === 0)
|
|
92
|
+
return undefined;
|
|
93
|
+
const trimmed = override?.trim();
|
|
94
|
+
if (trimmed) {
|
|
95
|
+
return (models.find((m) => m === trimmed) ??
|
|
96
|
+
models.find((m) => m.toLowerCase().includes(trimmed.toLowerCase())) ??
|
|
97
|
+
trimmed // names a model not in the list → no entry will match → none active
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
const isEmbed = (m) => /embed|bge|e5|nomic/i.test(m);
|
|
101
|
+
const pool = models.filter((m) => !isEmbed(m));
|
|
102
|
+
const ranked = (pool.length ? pool : models).slice();
|
|
103
|
+
const sizeOf = (m) => {
|
|
104
|
+
const b = m.match(/(\d+(?:\.\d+)?)\s*b\b/i); // "3b" / "7b" / "72b"
|
|
105
|
+
if (b)
|
|
106
|
+
return parseFloat(b[1]);
|
|
107
|
+
if (/mini|small|tiny|nano|phi/i.test(m))
|
|
108
|
+
return 3; // unlabeled small models
|
|
109
|
+
return 999; // unknown size -> deprioritize
|
|
110
|
+
};
|
|
111
|
+
const score = (m) => sizeOf(m) - (/coder|code/i.test(m) ? 0.5 : 0);
|
|
112
|
+
ranked.sort((a, b) => score(a) - score(b));
|
|
113
|
+
return ranked[0];
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Fetch Ollama /api/tags with a bounded timeout and extract model size labels.
|
|
117
|
+
* Returns an empty Map on any failure — never throws.
|
|
118
|
+
*/
|
|
119
|
+
async function fetchOllamaModelSizes(ollamaBase) {
|
|
120
|
+
const map = new Map();
|
|
121
|
+
try {
|
|
122
|
+
const controller = new AbortController();
|
|
123
|
+
const timer = setTimeout(() => controller.abort(), PROBE_TIMEOUT_MS);
|
|
124
|
+
let response;
|
|
125
|
+
try {
|
|
126
|
+
const url = ollamaBase.replace(/\/+$/, '') + '/api/tags';
|
|
127
|
+
response = await fetch(url, { signal: controller.signal });
|
|
128
|
+
}
|
|
129
|
+
finally {
|
|
130
|
+
clearTimeout(timer);
|
|
131
|
+
}
|
|
132
|
+
if (!response.ok)
|
|
133
|
+
return map;
|
|
134
|
+
const body = (await response.json());
|
|
135
|
+
if (typeof body !== 'object' ||
|
|
136
|
+
body === null ||
|
|
137
|
+
!Array.isArray(body['models'])) {
|
|
138
|
+
return map;
|
|
139
|
+
}
|
|
140
|
+
const models = body.models;
|
|
141
|
+
for (const m of models) {
|
|
142
|
+
if (typeof m !== 'object' || m === null)
|
|
143
|
+
continue;
|
|
144
|
+
const entry = m;
|
|
145
|
+
const name = typeof entry['name'] === 'string' ? entry['name'] : undefined;
|
|
146
|
+
if (!name)
|
|
147
|
+
continue;
|
|
148
|
+
// Ollama reports size in bytes under `size`
|
|
149
|
+
const sizeBytes = typeof entry['size'] === 'number' ? entry['size'] : undefined;
|
|
150
|
+
if (sizeBytes !== undefined) {
|
|
151
|
+
map.set(name, formatBytes(sizeBytes));
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
// Silently return empty map
|
|
157
|
+
}
|
|
158
|
+
return map;
|
|
159
|
+
}
|
|
160
|
+
/** Format a byte count into a compact human-readable label (e.g. "4.7 GB"). */
|
|
161
|
+
function formatBytes(bytes) {
|
|
162
|
+
if (bytes >= 1_073_741_824) {
|
|
163
|
+
return (bytes / 1_073_741_824).toFixed(1) + ' GB';
|
|
164
|
+
}
|
|
165
|
+
if (bytes >= 1_048_576) {
|
|
166
|
+
return (bytes / 1_048_576).toFixed(0) + ' MB';
|
|
167
|
+
}
|
|
168
|
+
return bytes + ' B';
|
|
169
|
+
}
|
|
170
|
+
// ---------------------------------------------------------------------------
|
|
171
|
+
// ollamaInstalled
|
|
172
|
+
// ---------------------------------------------------------------------------
|
|
173
|
+
/**
|
|
174
|
+
* Detect whether the `ollama` binary is available on PATH.
|
|
175
|
+
*
|
|
176
|
+
* Synchronous, no I/O beyond a single `which` call. Returns false on any
|
|
177
|
+
* error (binary not found, PATH issues, etc.). Never throws.
|
|
178
|
+
*/
|
|
179
|
+
export function ollamaInstalled() {
|
|
180
|
+
try {
|
|
181
|
+
// `which` on POSIX; `where` on Windows — use `which` since the target
|
|
182
|
+
// platform is macOS (darwin). execFileSync throws when exit code != 0.
|
|
183
|
+
execFileSync('which', ['ollama'], { stdio: 'pipe' });
|
|
184
|
+
return true;
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
return false;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
// ---------------------------------------------------------------------------
|
|
191
|
+
// pullModel
|
|
192
|
+
// ---------------------------------------------------------------------------
|
|
193
|
+
/**
|
|
194
|
+
* EXPLICIT pull of a named Ollama model.
|
|
195
|
+
*
|
|
196
|
+
* Called ONLY from `ashlr models pull <name>` — NEVER from routing or runs.
|
|
197
|
+
*
|
|
198
|
+
* Validates the model name is a safe ref (no shell-special chars), then runs
|
|
199
|
+
* `ollama pull <name>` via execFile (NOT a shell — no injection risk). Returns
|
|
200
|
+
* a progress summary. Allows up to 10 minutes for the download.
|
|
201
|
+
*
|
|
202
|
+
* Returns { ok: false, detail: <reason> } when:
|
|
203
|
+
* - ollama is not installed
|
|
204
|
+
* - the model name fails validation
|
|
205
|
+
* - the pull command exits non-zero
|
|
206
|
+
*/
|
|
207
|
+
export async function pullModel(name) {
|
|
208
|
+
// 1. Validate model name — reject anything with shell-special chars.
|
|
209
|
+
if (!name || !SAFE_MODEL_NAME_RE.test(name)) {
|
|
210
|
+
return {
|
|
211
|
+
ok: false,
|
|
212
|
+
detail: `Invalid model name: "${name}". Use only alphanumeric characters, hyphens, underscores, colons, dots, and slashes (e.g. "llama3:8b").`,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
// 2. Require ollama binary.
|
|
216
|
+
if (!ollamaInstalled()) {
|
|
217
|
+
return {
|
|
218
|
+
ok: false,
|
|
219
|
+
detail: 'ollama binary not found on PATH. Install Ollama from https://ollama.com and retry.',
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
// 3. Run `ollama pull <name>` — NO shell; execFile passes args directly.
|
|
223
|
+
try {
|
|
224
|
+
const { stdout, stderr } = await execFileAsync('ollama', ['pull', name], {
|
|
225
|
+
timeout: PULL_TIMEOUT_MS,
|
|
226
|
+
maxBuffer: 10 * 1024 * 1024, // 10 MB output buffer
|
|
227
|
+
});
|
|
228
|
+
const combined = [stdout, stderr].filter(Boolean).join('\n').trim();
|
|
229
|
+
const summary = combined.length > 0 ? combined : `Pull of '${name}' completed.`;
|
|
230
|
+
return { ok: true, detail: summary };
|
|
231
|
+
}
|
|
232
|
+
catch (err) {
|
|
233
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
234
|
+
return { ok: false, detail: `ollama pull ${name} failed: ${msg}` };
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
// ---------------------------------------------------------------------------
|
|
238
|
+
// startOllama
|
|
239
|
+
// ---------------------------------------------------------------------------
|
|
240
|
+
/**
|
|
241
|
+
* Best-effort start of a LOCAL installed Ollama.
|
|
242
|
+
*
|
|
243
|
+
* Called ONLY from `ashlr models start` — NEVER from routing or runs.
|
|
244
|
+
*
|
|
245
|
+
* Strategy (macOS-first, matching the target platform):
|
|
246
|
+
* 1. If Ollama is already responding on :11434, return ok immediately.
|
|
247
|
+
* 2. If not installed, return ok:false immediately.
|
|
248
|
+
* 3. Try `open -a Ollama` (macOS app) first — this launches the menu-bar app.
|
|
249
|
+
* 4. Fall back to spawning `ollama serve` detached if the app open fails or
|
|
250
|
+
* if we're on non-macOS.
|
|
251
|
+
* 5. Poll :11434 up to START_WAIT_TIMEOUT_MS for the server to come up.
|
|
252
|
+
* 6. Return { ok, detail } — never throws.
|
|
253
|
+
*/
|
|
254
|
+
export async function startOllama() {
|
|
255
|
+
// 1. Already up?
|
|
256
|
+
if (await isOllamaUp()) {
|
|
257
|
+
return { ok: true, detail: 'Ollama is already running.' };
|
|
258
|
+
}
|
|
259
|
+
// 2. Installed?
|
|
260
|
+
if (!ollamaInstalled()) {
|
|
261
|
+
return {
|
|
262
|
+
ok: false,
|
|
263
|
+
detail: 'ollama binary not found on PATH. Install Ollama from https://ollama.com.',
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
// 3. Try launching the macOS app bundle first (silent on non-mac).
|
|
267
|
+
const isMac = process.platform === 'darwin';
|
|
268
|
+
let launchAttempted = false;
|
|
269
|
+
if (isMac) {
|
|
270
|
+
try {
|
|
271
|
+
await execFileAsync('open', ['-a', 'Ollama'], { timeout: 5_000 });
|
|
272
|
+
launchAttempted = true;
|
|
273
|
+
}
|
|
274
|
+
catch {
|
|
275
|
+
// App not installed or open failed — fall through to `ollama serve`.
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
// 4. If the app launch didn't work (or non-mac), spawn `ollama serve` detached.
|
|
279
|
+
if (!launchAttempted) {
|
|
280
|
+
try {
|
|
281
|
+
const child = spawn('ollama', ['serve'], {
|
|
282
|
+
detached: true,
|
|
283
|
+
stdio: 'ignore',
|
|
284
|
+
});
|
|
285
|
+
// Unref so the parent can exit independently of this background process.
|
|
286
|
+
child.unref();
|
|
287
|
+
}
|
|
288
|
+
catch (err) {
|
|
289
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
290
|
+
return { ok: false, detail: `Failed to start Ollama: ${msg}` };
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
// 5. Poll :11434 until up or timeout.
|
|
294
|
+
const deadline = Date.now() + START_WAIT_TIMEOUT_MS;
|
|
295
|
+
while (Date.now() < deadline) {
|
|
296
|
+
await sleep(START_POLL_INTERVAL_MS);
|
|
297
|
+
if (await isOllamaUp()) {
|
|
298
|
+
return { ok: true, detail: 'Ollama started and is now responding.' };
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
return {
|
|
302
|
+
ok: false,
|
|
303
|
+
detail: `Ollama was started but did not respond on :11434 within ${START_WAIT_TIMEOUT_MS / 1000}s. ` +
|
|
304
|
+
'It may still be loading — retry in a moment.',
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
// ---------------------------------------------------------------------------
|
|
308
|
+
// Internal helpers
|
|
309
|
+
// ---------------------------------------------------------------------------
|
|
310
|
+
/**
|
|
311
|
+
* Quick liveness check for Ollama at the default :11434 address.
|
|
312
|
+
* Returns true if GET /api/tags responds with HTTP 200.
|
|
313
|
+
* Never throws.
|
|
314
|
+
*/
|
|
315
|
+
async function isOllamaUp() {
|
|
316
|
+
try {
|
|
317
|
+
const controller = new AbortController();
|
|
318
|
+
const timer = setTimeout(() => controller.abort(), 2_000);
|
|
319
|
+
let response;
|
|
320
|
+
try {
|
|
321
|
+
response = await fetch('http://127.0.0.1:11434/api/tags', {
|
|
322
|
+
method: 'GET',
|
|
323
|
+
signal: controller.signal,
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
finally {
|
|
327
|
+
clearTimeout(timer);
|
|
328
|
+
}
|
|
329
|
+
return response.ok;
|
|
330
|
+
}
|
|
331
|
+
catch {
|
|
332
|
+
return false;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
/** Simple promise-based sleep. */
|
|
336
|
+
function sleep(ms) {
|
|
337
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
338
|
+
}
|
|
339
|
+
//# sourceMappingURL=model-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-manager.js","sourceRoot":"","sources":["../../../src/core/run/model-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,gFAAgF;AAChF,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAE/B,6EAA6E;AAC7E,MAAM,qBAAqB,GAAG,MAAM,CAAC;AACrC,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAEnC,8EAA8E;AAC9E,MAAM,eAAe,GAAG,OAAO,CAAC;AAEhC;;;;GAIG;AACH,MAAM,kBAAkB,GAAG,uCAAuC,CAAC;AAEnE,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAgB;IACpD,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC;QACxD,aAAa,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;QAC1C,aAAa,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC;KAC/C,CAAC,CAAC;IAEH,MAAM,OAAO,GAAqB,EAAE,CAAC;IAErC,iBAAiB;IACjB,IAAI,YAAY,CAAC,MAAM,KAAK,WAAW,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;QACjE,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC;QACpC,wDAAwD;QACxD,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAE/D,sEAAsE;QACtE,0EAA0E;QAC1E,iEAAiE;QACjE,MAAM,UAAU,GAAG,eAAe,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;QAEhF,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YACnC,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACpC,MAAM,KAAK,GAAmB,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,KAAK,UAAU,EAAE,CAAC;YACxF,IAAI,SAAS;gBAAE,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;YAC3C,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,IAAI,QAAQ,CAAC,MAAM,KAAK,WAAW,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;QACzD,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC;QAChC,MAAM,UAAU,GAAG,eAAe,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;QAEhF,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YACnC,MAAM,KAAK,GAAmB,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,KAAK,UAAU,EAAE,CAAC;YAC1F,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,SAAS,eAAe,CAAC,MAAgB,EAAE,QAA4B;IACrE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAE1C,MAAM,OAAO,GAAG,QAAQ,EAAE,IAAI,EAAE,CAAC;IACjC,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CACL,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,OAAO,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;YACnE,OAAO,CAAC,oEAAoE;SAC7E,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7D,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;IACrD,MAAM,MAAM,GAAG,CAAC,CAAS,EAAU,EAAE;QACnC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC,sBAAsB;QACnE,IAAI,CAAC;YAAE,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC;QAChC,IAAI,2BAA2B,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC,CAAC,yBAAyB;QAC5E,OAAO,GAAG,CAAC,CAAC,+BAA+B;IAC7C,CAAC,CAAC;IACF,MAAM,KAAK,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnF,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,qBAAqB,CAAC,UAAkB;IACrD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,gBAAgB,CAAC,CAAC;QACrE,IAAI,QAAkB,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,WAAW,CAAC;YACzD,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7D,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,OAAO,GAAG,CAAC;QAC7B,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAY,CAAC;QAChD,IACE,OAAO,IAAI,KAAK,QAAQ;YACxB,IAAI,KAAK,IAAI;YACb,CAAC,KAAK,CAAC,OAAO,CAAE,IAAgC,CAAC,QAAQ,CAAC,CAAC,EAC3D,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC;QACD,MAAM,MAAM,GAAI,IAA8B,CAAC,MAAM,CAAC;QACtD,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI;gBAAE,SAAS;YAClD,MAAM,KAAK,GAAG,CAA4B,CAAC;YAC3C,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC3E,IAAI,CAAC,IAAI;gBAAE,SAAS;YACpB,4CAA4C;YAC5C,MAAM,SAAS,GAAG,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAChF,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;gBAC5B,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,4BAA4B;IAC9B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,+EAA+E;AAC/E,SAAS,WAAW,CAAC,KAAa;IAChC,IAAI,KAAK,IAAI,aAAa,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,GAAG,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;IACpD,CAAC;IACD,IAAI,KAAK,IAAI,SAAS,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;IAChD,CAAC;IACD,OAAO,KAAK,GAAG,IAAI,CAAC;AACtB,CAAC;AAED,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC;QACH,sEAAsE;QACtE,uEAAuE;QACvE,YAAY,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAY;IAC1C,qEAAqE;IACrE,IAAI,CAAC,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5C,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,wBAAwB,IAAI,0GAA0G;SAC/I,CAAC;IACJ,CAAC;IAED,4BAA4B;IAC5B,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;QACvB,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,oFAAoF;SAC7F,CAAC;IACJ,CAAC;IAED,yEAAyE;IACzE,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE;YACvE,OAAO,EAAE,eAAe;YACxB,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,sBAAsB;SACpD,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QACpE,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,IAAI,cAAc,CAAC;QAChF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IACvC,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,IAAI,YAAY,GAAG,EAAE,EAAE,CAAC;IACrE,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,iBAAiB;IACjB,IAAI,MAAM,UAAU,EAAE,EAAE,CAAC;QACvB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,4BAA4B,EAAE,CAAC;IAC5D,CAAC;IAED,gBAAgB;IAChB,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;QACvB,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,0EAA0E;SACnF,CAAC;IACJ,CAAC;IAED,mEAAmE;IACnE,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC;IAC5C,IAAI,eAAe,GAAG,KAAK,CAAC;IAE5B,IAAI,KAAK,EAAE,CAAC;QACV,IAAI,CAAC;YACH,MAAM,aAAa,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YAClE,eAAe,GAAG,IAAI,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,qEAAqE;QACvE,CAAC;IACH,CAAC;IAED,gFAAgF;IAChF,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE;gBACvC,QAAQ,EAAE,IAAI;gBACd,KAAK,EAAE,QAAQ;aAChB,CAAC,CAAC;YACH,yEAAyE;YACzE,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,2BAA2B,GAAG,EAAE,EAAE,CAAC;QACjE,CAAC;IACH,CAAC;IAED,sCAAsC;IACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,qBAAqB,CAAC;IACpD,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,MAAM,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACpC,IAAI,MAAM,UAAU,EAAE,EAAE,CAAC;YACvB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,uCAAuC,EAAE,CAAC;QACvE,CAAC;IACH,CAAC;IAED,OAAO;QACL,EAAE,EAAE,KAAK;QACT,MAAM,EAAE,2DAA2D,qBAAqB,GAAG,IAAI,KAAK;YAClG,8CAA8C;KACjD,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E;;;;GAIG;AACH,KAAK,UAAU,UAAU;IACvB,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC;QAC1D,IAAI,QAAkB,CAAC;QACvB,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,KAAK,CAAC,iCAAiC,EAAE;gBACxD,MAAM,EAAE,KAAK;gBACb,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;QACD,OAAO,QAAQ,CAAC,EAAE,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,kCAAkC;AAClC,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC"}
|