@wrongstack/cli 0.295.1 → 0.296.3
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/data/providers.json +0 -24
- package/dist/acp-A5OSIU2P.js +824 -0
- package/dist/acp-A5OSIU2P.js.map +7 -0
- package/dist/acp-server-agent.d.ts.map +1 -1
- package/dist/arg-parser.d.ts.map +1 -1
- package/dist/audit-2ZSFGNIF.js +102 -0
- package/dist/audit-2ZSFGNIF.js.map +7 -0
- package/dist/auth-CJWQJVRH.js +504 -0
- package/dist/auth-CJWQJVRH.js.map +7 -0
- package/dist/auth-menu/auth-menu-audit.d.ts +0 -4
- package/dist/auth-menu/auth-menu-audit.d.ts.map +1 -1
- package/dist/bench-7ZDWSNEF.js +278 -0
- package/dist/bench-7ZDWSNEF.js.map +7 -0
- package/dist/boot/brain-decision-log.d.ts +7 -5
- package/dist/boot/brain-decision-log.d.ts.map +1 -1
- package/dist/boot/dispatch-webui.d.ts +5 -8
- package/dist/boot/dispatch-webui.d.ts.map +1 -1
- package/dist/boot/system-prompt-builder.d.ts +3 -0
- package/dist/boot/system-prompt-builder.d.ts.map +1 -1
- package/dist/boot/tui-coordinator-callbacks.d.ts +45 -0
- package/dist/boot/tui-coordinator-callbacks.d.ts.map +1 -0
- package/dist/boot/tui-project-switch.d.ts +2 -3
- package/dist/boot/tui-project-switch.d.ts.map +1 -1
- package/dist/boot/tui-runtime-state.d.ts +5 -6
- package/dist/boot/tui-runtime-state.d.ts.map +1 -1
- package/dist/boot/tui-session-resume.d.ts.map +1 -1
- package/dist/boot/tui-settings-adapter.d.ts +2 -3
- package/dist/boot/tui-settings-adapter.d.ts.map +1 -1
- package/dist/boot.d.ts.map +1 -1
- package/dist/brain-menu/panel-service.d.ts.map +1 -1
- package/dist/chimera-review-task.d.ts +6 -0
- package/dist/chimera-review-task.d.ts.map +1 -0
- package/dist/chimera-reviewer-policy.d.ts +34 -0
- package/dist/chimera-reviewer-policy.d.ts.map +1 -0
- package/dist/chronicle-QQEQFSSE.js +256 -0
- package/dist/chronicle-QQEQFSSE.js.map +7 -0
- package/dist/chunk-5N34EWJR.js +418 -0
- package/dist/chunk-5N34EWJR.js.map +7 -0
- package/dist/chunk-66T43Q4Y.js +90 -0
- package/dist/chunk-66T43Q4Y.js.map +7 -0
- package/dist/chunk-7OCVIDC7.js +11 -0
- package/dist/chunk-7OCVIDC7.js.map +7 -0
- package/dist/chunk-ABXK4VVY.js +84 -0
- package/dist/chunk-ABXK4VVY.js.map +7 -0
- package/dist/chunk-AXVZMEWG.js +306 -0
- package/dist/chunk-AXVZMEWG.js.map +7 -0
- package/dist/chunk-AZESNNIC.js +216 -0
- package/dist/chunk-AZESNNIC.js.map +7 -0
- package/dist/chunk-BGFM3PD7.js +41 -0
- package/dist/chunk-BGFM3PD7.js.map +7 -0
- package/dist/chunk-BQCAJ7FI.js +425 -0
- package/dist/chunk-BQCAJ7FI.js.map +7 -0
- package/dist/chunk-DPJZQCVP.js +13 -0
- package/dist/chunk-DPJZQCVP.js.map +7 -0
- package/dist/chunk-F4PEGAJZ.js +176 -0
- package/dist/chunk-F4PEGAJZ.js.map +7 -0
- package/dist/chunk-IHBYBYGA.js +443 -0
- package/dist/chunk-IHBYBYGA.js.map +7 -0
- package/dist/chunk-JBSQ7ONN.js +1023 -0
- package/dist/chunk-JBSQ7ONN.js.map +7 -0
- package/dist/chunk-JBTFWWKV.js +1325 -0
- package/dist/chunk-JBTFWWKV.js.map +7 -0
- package/dist/chunk-JUHRI6OV.js +100 -0
- package/dist/chunk-JUHRI6OV.js.map +7 -0
- package/dist/chunk-OI7GWJDS.js +3303 -0
- package/dist/chunk-OI7GWJDS.js.map +7 -0
- package/dist/chunk-OP47B3IX.js +142 -0
- package/dist/chunk-OP47B3IX.js.map +7 -0
- package/dist/chunk-PJHET45A.js +158 -0
- package/dist/chunk-PJHET45A.js.map +7 -0
- package/dist/chunk-Q5GTM25S.js +17 -0
- package/dist/chunk-Q5GTM25S.js.map +7 -0
- package/dist/chunk-QD544J2B.js +19 -0
- package/dist/chunk-QD544J2B.js.map +7 -0
- package/dist/chunk-QUNHS6O3.js +258 -0
- package/dist/chunk-QUNHS6O3.js.map +7 -0
- package/dist/chunk-TADVX644.js +480 -0
- package/dist/chunk-TADVX644.js.map +7 -0
- package/dist/chunk-TGDHN4LM.js +81 -0
- package/dist/chunk-TGDHN4LM.js.map +7 -0
- package/dist/chunk-TYO2OVAD.js +50 -0
- package/dist/chunk-TYO2OVAD.js.map +7 -0
- package/dist/chunk-VCYZ3WZV.js +14 -0
- package/dist/chunk-VCYZ3WZV.js.map +7 -0
- package/dist/chunk-VJUEZZYB.js +29 -0
- package/dist/chunk-VJUEZZYB.js.map +7 -0
- package/dist/chunk-WHOIR577.js +1 -0
- package/dist/chunk-WHOIR577.js.map +7 -0
- package/dist/chunk-WY7KKOUK.js +460 -0
- package/dist/chunk-WY7KKOUK.js.map +7 -0
- package/dist/chunk-XJXDOF63.js +28 -0
- package/dist/chunk-XJXDOF63.js.map +7 -0
- package/dist/chunk-XWEGWYDU.js +560 -0
- package/dist/chunk-XWEGWYDU.js.map +7 -0
- package/dist/chunk-YWUPHRGB.js +346 -0
- package/dist/chunk-YWUPHRGB.js.map +7 -0
- package/dist/chunk-Z7YGASQP.js +313 -0
- package/dist/chunk-Z7YGASQP.js.map +7 -0
- package/dist/cli-entry-main.d.ts +2 -0
- package/dist/cli-entry-main.d.ts.map +1 -0
- package/dist/cli-entry-point.d.ts +3 -3
- package/dist/cli-entry-point.d.ts.map +1 -1
- package/dist/cli-main-RTY35OPD.js +29268 -0
- package/dist/cli-main-RTY35OPD.js.map +7 -0
- package/dist/cli-main-helpers.d.ts +21 -0
- package/dist/cli-main-helpers.d.ts.map +1 -0
- package/dist/cli-main.d.ts +25 -1
- package/dist/cli-main.d.ts.map +1 -1
- package/dist/context-limit.d.ts +48 -0
- package/dist/context-limit.d.ts.map +1 -1
- package/dist/diag-doctor-OQ3AA63O.js +170 -0
- package/dist/diag-doctor-OQ3AA63O.js.map +7 -0
- package/dist/execute-deps.d.ts +11 -12
- package/dist/execute-deps.d.ts.map +1 -1
- package/dist/execution-O7I5DYE6.js +4682 -0
- package/dist/execution-O7I5DYE6.js.map +7 -0
- package/dist/execution-chimera-ask.d.ts +10 -0
- package/dist/execution-chimera-ask.d.ts.map +1 -0
- package/dist/execution-chimera-cascade.d.ts +15 -0
- package/dist/execution-chimera-cascade.d.ts.map +1 -0
- package/dist/execution-cleanup.d.ts +23 -0
- package/dist/execution-cleanup.d.ts.map +1 -0
- package/dist/execution-kanban-dispatch.d.ts +10 -0
- package/dist/execution-kanban-dispatch.d.ts.map +1 -0
- package/dist/execution-repl-fleet-callbacks.d.ts +11 -0
- package/dist/execution-repl-fleet-callbacks.d.ts.map +1 -0
- package/dist/execution-storage-observability.d.ts +3 -0
- package/dist/execution-storage-observability.d.ts.map +1 -0
- package/dist/execution-tui-next-step-callbacks.d.ts +20 -0
- package/dist/execution-tui-next-step-callbacks.d.ts.map +1 -0
- package/dist/execution.d.ts +2 -139
- package/dist/execution.d.ts.map +1 -1
- package/dist/export-TPORYVRZ.js +64 -0
- package/dist/export-TPORYVRZ.js.map +7 -0
- package/dist/fleet/host-acp-runner-cache.d.ts +9 -0
- package/dist/fleet/host-acp-runner-cache.d.ts.map +1 -0
- package/dist/fleet/host-acp.d.ts +3 -0
- package/dist/fleet/host-acp.d.ts.map +1 -0
- package/dist/fleet/host-concurrency.d.ts +2 -0
- package/dist/fleet/host-concurrency.d.ts.map +1 -0
- package/dist/fleet/host-context.d.ts +5 -0
- package/dist/fleet/host-context.d.ts.map +1 -0
- package/dist/fleet/host-director-builder.d.ts +24 -0
- package/dist/fleet/host-director-builder.d.ts.map +1 -0
- package/dist/fleet/host-director-event-bridges.d.ts +37 -0
- package/dist/fleet/host-director-event-bridges.d.ts.map +1 -0
- package/dist/fleet/host-director-services.d.ts +20 -0
- package/dist/fleet/host-director-services.d.ts.map +1 -0
- package/dist/fleet/host-event-bridge.d.ts +17 -0
- package/dist/fleet/host-event-bridge.d.ts.map +1 -0
- package/dist/fleet/host-helpers.d.ts +22 -0
- package/dist/fleet/host-helpers.d.ts.map +1 -0
- package/dist/fleet/host-learning-tracker.d.ts +11 -0
- package/dist/fleet/host-learning-tracker.d.ts.map +1 -0
- package/dist/fleet/host-learning.d.ts +4 -0
- package/dist/fleet/host-learning.d.ts.map +1 -0
- package/dist/fleet/host-lifecycle-events.d.ts +4 -0
- package/dist/fleet/host-lifecycle-events.d.ts.map +1 -0
- package/dist/fleet/host-paths.d.ts +3 -0
- package/dist/fleet/host-paths.d.ts.map +1 -0
- package/dist/fleet/host-provider.d.ts +22 -0
- package/dist/fleet/host-provider.d.ts.map +1 -0
- package/dist/fleet/host-session-writer.d.ts +3 -0
- package/dist/fleet/host-session-writer.d.ts.map +1 -0
- package/dist/fleet/host-shadow-pass.d.ts +21 -0
- package/dist/fleet/host-shadow-pass.d.ts.map +1 -0
- package/dist/fleet/host-spawn-types.d.ts +25 -0
- package/dist/fleet/host-spawn-types.d.ts.map +1 -0
- package/dist/fleet/host-status.d.ts +48 -0
- package/dist/fleet/host-status.d.ts.map +1 -0
- package/dist/fleet/host-subagent-factory.d.ts +16 -0
- package/dist/fleet/host-subagent-factory.d.ts.map +1 -0
- package/dist/fleet/host-supervisor.d.ts +16 -0
- package/dist/fleet/host-supervisor.d.ts.map +1 -0
- package/dist/fleet/host-task-result-report.d.ts +11 -0
- package/dist/fleet/host-task-result-report.d.ts.map +1 -0
- package/dist/fleet/host-types.d.ts +89 -0
- package/dist/fleet/host-types.d.ts.map +1 -0
- package/dist/fleet/host.d.ts +10 -357
- package/dist/fleet/host.d.ts.map +1 -1
- package/dist/hq-JUYKUNJX.js +547 -0
- package/dist/hq-JUYKUNJX.js.map +7 -0
- package/dist/hq-command-controller.d.ts +2 -2
- package/dist/hq-command-controller.d.ts.map +1 -1
- package/dist/hq-server/auth.d.ts +15 -4
- package/dist/hq-server/auth.d.ts.map +1 -1
- package/dist/hq-server/project-root.d.ts +5 -0
- package/dist/hq-server/project-root.d.ts.map +1 -0
- package/dist/hq-server/routes/auth-handlers.d.ts +25 -0
- package/dist/hq-server/routes/auth-handlers.d.ts.map +1 -0
- package/dist/hq-server/routes/session-handlers.d.ts +8 -0
- package/dist/hq-server/routes/session-handlers.d.ts.map +1 -0
- package/dist/hq-server/routes.d.ts +8 -6
- package/dist/hq-server/routes.d.ts.map +1 -1
- package/dist/hq-server/snapshot.d.ts +44 -0
- package/dist/hq-server/snapshot.d.ts.map +1 -1
- package/dist/hq-server/types.d.ts +22 -4
- package/dist/hq-server/types.d.ts.map +1 -1
- package/dist/hq-server/utils.d.ts +8 -0
- package/dist/hq-server/utils.d.ts.map +1 -1
- package/dist/hq-server/ws.d.ts +1 -1
- package/dist/hq-server/ws.d.ts.map +1 -1
- package/dist/hq-server-6AQ3BXZA.js +39 -0
- package/dist/hq-server-6AQ3BXZA.js.map +7 -0
- package/dist/hq-server.d.ts +3 -3
- package/dist/hq-server.d.ts.map +1 -1
- package/dist/hq-ttl-U2FAYFAT.js +8 -0
- package/dist/hq-ttl-U2FAYFAT.js.map +7 -0
- package/dist/hq-tunnel-RFKGC4HI.js +114 -0
- package/dist/hq-tunnel-RFKGC4HI.js.map +7 -0
- package/dist/hq-tunnel.d.ts +1 -1
- package/dist/hq-tunnel.d.ts.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2503 -53026
- package/dist/index.js.map +4 -4
- package/dist/init-E2NDDOHI.js +27 -0
- package/dist/init-E2NDDOHI.js.map +7 -0
- package/dist/kanban-dispatch-route.d.ts +14 -0
- package/dist/kanban-dispatch-route.d.ts.map +1 -0
- package/dist/kanban-hq-sync.d.ts +2 -0
- package/dist/kanban-hq-sync.d.ts.map +1 -1
- package/dist/kanban-run-mirror-EKVNGXWW.js +12 -0
- package/dist/kanban-run-mirror-EKVNGXWW.js.map +7 -0
- package/dist/live-settings-input.d.ts +69 -0
- package/dist/live-settings-input.d.ts.map +1 -0
- package/dist/mailbox-serve-2UWHEN3M.js +302 -0
- package/dist/mailbox-serve-2UWHEN3M.js.map +7 -0
- package/dist/mcp-CYLPUEHC.js +413 -0
- package/dist/mcp-CYLPUEHC.js.map +7 -0
- package/dist/modeldiag-HENYJ4N7.js +1290 -0
- package/dist/modeldiag-HENYJ4N7.js.map +7 -0
- package/dist/permissions-FNYLZIL4.js +115 -0
- package/dist/permissions-FNYLZIL4.js.map +7 -0
- package/dist/picker-key-state.d.ts +7 -0
- package/dist/picker-key-state.d.ts.map +1 -0
- package/dist/picker-model-picker.d.ts +6 -0
- package/dist/picker-model-picker.d.ts.map +1 -0
- package/dist/picker-ui.d.ts +17 -0
- package/dist/picker-ui.d.ts.map +1 -0
- package/dist/picker.d.ts +4 -37
- package/dist/picker.d.ts.map +1 -1
- package/dist/plugin-usage-OU6X6LM3.js +40 -0
- package/dist/plugin-usage-OU6X6LM3.js.map +7 -0
- package/dist/plugins-4LJ5IUBI.js +24 -0
- package/dist/plugins-4LJ5IUBI.js.map +7 -0
- package/dist/pre-launch.d.ts +0 -1
- package/dist/pre-launch.d.ts.map +1 -1
- package/dist/project-BLQ3ALVL.js +76 -0
- package/dist/project-BLQ3ALVL.js.map +7 -0
- package/dist/project-manifest-GE25PW4S.js +18 -0
- package/dist/project-manifest-GE25PW4S.js.map +7 -0
- package/dist/project-picker-BOCWHBXP.js +17 -0
- package/dist/project-picker-BOCWHBXP.js.map +7 -0
- package/dist/projects-XE76NFNZ.js +38 -0
- package/dist/projects-XE76NFNZ.js.map +7 -0
- package/dist/provider-helpers.d.ts +22 -6
- package/dist/provider-helpers.d.ts.map +1 -1
- package/dist/providers-models-GDELBHZK.js +589 -0
- package/dist/providers-models-GDELBHZK.js.map +7 -0
- package/dist/quick-VIO2BEHS.js +10 -0
- package/dist/quick-VIO2BEHS.js.map +7 -0
- package/dist/repl-auto-proceed.d.ts +19 -0
- package/dist/repl-auto-proceed.d.ts.map +1 -0
- package/dist/repl-client-registration.d.ts +7 -0
- package/dist/repl-client-registration.d.ts.map +1 -0
- package/dist/repl-input.d.ts +11 -0
- package/dist/repl-input.d.ts.map +1 -0
- package/dist/repl-options.d.ts +54 -0
- package/dist/repl-options.d.ts.map +1 -0
- package/dist/repl-rendering.d.ts +4 -0
- package/dist/repl-rendering.d.ts.map +1 -0
- package/dist/repl-suggestions.d.ts +21 -0
- package/dist/repl-suggestions.d.ts.map +1 -0
- package/dist/repl.d.ts +3 -162
- package/dist/repl.d.ts.map +1 -1
- package/dist/replay-KCTXNMZQ.js +75 -0
- package/dist/replay-KCTXNMZQ.js.map +7 -0
- package/dist/rewind-EJMVFVLS.js +185 -0
- package/dist/rewind-EJMVFVLS.js.map +7 -0
- package/dist/sdd-runtime-JG4EEKL6.js +54 -0
- package/dist/sdd-runtime-JG4EEKL6.js.map +7 -0
- package/dist/services/sdd/project-context.d.ts +1 -1
- package/dist/services/sdd/project-context.d.ts.map +1 -1
- package/dist/services/sdd/task-manager.d.ts.map +1 -1
- package/dist/services/statusline-config.d.ts +1 -1
- package/dist/services/statusline-config.d.ts.map +1 -1
- package/dist/session-event-wiring.d.ts +2 -2
- package/dist/session-event-wiring.d.ts.map +1 -1
- package/dist/sessions-config-NLCMK3BY.js +409 -0
- package/dist/sessions-config-NLCMK3BY.js.map +7 -0
- package/dist/settings-menu.d.ts +3 -18
- package/dist/settings-menu.d.ts.map +1 -1
- package/dist/simpleui-dist-JIFGUJO7.js +93 -0
- package/dist/simpleui-dist-JIFGUJO7.js.map +7 -0
- package/dist/slash-commands/brain.d.ts.map +1 -1
- package/dist/slash-commands/clear.d.ts.map +1 -1
- package/dist/slash-commands/fallback.d.ts.map +1 -1
- package/dist/slash-commands/kanban-agent-helpers.d.ts +18 -0
- package/dist/slash-commands/kanban-agent-helpers.d.ts.map +1 -0
- package/dist/slash-commands/kanban-format.d.ts +16 -0
- package/dist/slash-commands/kanban-format.d.ts.map +1 -0
- package/dist/slash-commands/kanban-help.d.ts +2 -0
- package/dist/slash-commands/kanban-help.d.ts.map +1 -0
- package/dist/slash-commands/kanban.d.ts.map +1 -1
- package/dist/slash-commands/mailbox-demo.d.ts.map +1 -1
- package/dist/slash-commands/mailbox.d.ts +2 -1
- package/dist/slash-commands/mailbox.d.ts.map +1 -1
- package/dist/slash-commands/memory-compact.d.ts +5 -0
- package/dist/slash-commands/memory-compact.d.ts.map +1 -0
- package/dist/slash-commands/memory-flags.d.ts +36 -0
- package/dist/slash-commands/memory-flags.d.ts.map +1 -0
- package/dist/slash-commands/memory-formatters.d.ts +16 -0
- package/dist/slash-commands/memory-formatters.d.ts.map +1 -0
- package/dist/slash-commands/memory.d.ts.map +1 -1
- package/dist/slash-commands/mouse.d.ts +2 -2
- package/dist/slash-commands/review.d.ts.map +1 -1
- package/dist/slash-commands/sdd-command-helpers.d.ts +23 -0
- package/dist/slash-commands/sdd-command-helpers.d.ts.map +1 -0
- package/dist/slash-commands/sdd-format.d.ts +32 -0
- package/dist/slash-commands/sdd-format.d.ts.map +1 -0
- package/dist/slash-commands/sdd.d.ts.map +1 -1
- package/dist/slash-commands/settings.d.ts.map +1 -1
- package/dist/subcommands/handlers/chronicle.d.ts.map +1 -1
- package/dist/subcommands/handlers/mailbox-serve.d.ts.map +1 -1
- package/dist/subcommands/handlers/model-smoke-test.d.ts +51 -0
- package/dist/subcommands/handlers/model-smoke-test.d.ts.map +1 -0
- package/dist/subcommands/handlers/modeldiag-profiles.d.ts +64 -0
- package/dist/subcommands/handlers/modeldiag-profiles.d.ts.map +1 -0
- package/dist/subcommands/handlers/modeldiag.d.ts.map +1 -1
- package/dist/subcommands/handlers/per-subcommand-deep-help-table.d.ts +3 -0
- package/dist/subcommands/handlers/per-subcommand-deep-help-table.d.ts.map +1 -0
- package/dist/subcommands/handlers/per-subcommand-help-data.d.ts +3 -0
- package/dist/subcommands/handlers/per-subcommand-help-data.d.ts.map +1 -0
- package/dist/subcommands/handlers/per-subcommand-help-table.d.ts +36 -0
- package/dist/subcommands/handlers/per-subcommand-help-table.d.ts.map +1 -0
- package/dist/subcommands/handlers/per-subcommand-help-types.d.ts +18 -0
- package/dist/subcommands/handlers/per-subcommand-help-types.d.ts.map +1 -0
- package/dist/subcommands/handlers/per-subcommand-help.d.ts +2 -80
- package/dist/subcommands/handlers/per-subcommand-help.d.ts.map +1 -1
- package/dist/subcommands/handlers/rewind.d.ts.map +1 -1
- package/dist/subcommands/index.d.ts +7 -0
- package/dist/subcommands/index.d.ts.map +1 -1
- package/dist/tools-skills-UNKLOB7M.js +29 -0
- package/dist/tools-skills-UNKLOB7M.js.map +7 -0
- package/dist/update-YC4TYW2Y.js +16 -0
- package/dist/update-YC4TYW2Y.js.map +7 -0
- package/dist/update-check-UMYTOH7Z.js +18 -0
- package/dist/update-check-UMYTOH7Z.js.map +7 -0
- package/dist/version-help-DROHZRW6.js +11 -0
- package/dist/version-help-DROHZRW6.js.map +7 -0
- package/dist/webui-server/connection-handler.d.ts.map +1 -1
- package/dist/webui-server/kanban-host-adapter.d.ts +5 -1
- package/dist/webui-server/kanban-host-adapter.d.ts.map +1 -1
- package/dist/webui-server/listen-helpers.d.ts +18 -0
- package/dist/webui-server/listen-helpers.d.ts.map +1 -0
- package/dist/webui-server/node-pty-loader.d.ts +6 -0
- package/dist/webui-server/node-pty-loader.d.ts.map +1 -0
- package/dist/webui-server-ZF5KVGC5.js +1460 -0
- package/dist/webui-server-ZF5KVGC5.js.map +7 -0
- package/dist/webui-server-options.d.ts +191 -0
- package/dist/webui-server-options.d.ts.map +1 -0
- package/dist/webui-server.d.ts +2 -178
- package/dist/webui-server.d.ts.map +1 -1
- package/dist/wiring/brain-and-orchestration.d.ts.map +1 -1
- package/dist/wiring/codebase-index.d.ts.map +1 -1
- package/dist/wiring/command-host-state.d.ts +4 -4
- package/dist/wiring/dep-watcher-bridge.d.ts +23 -0
- package/dist/wiring/dep-watcher-bridge.d.ts.map +1 -0
- package/dist/wiring/dep-watcher.d.ts.map +1 -1
- package/dist/wiring/hq-telemetry.d.ts +2 -2
- package/dist/wiring/lifecycle-plugins.d.ts +4 -3
- package/dist/wiring/lifecycle-plugins.d.ts.map +1 -1
- package/dist/wiring/mailbox-bridge-bootstrap.d.ts +1 -1
- package/dist/wiring/management-tools.d.ts +15 -0
- package/dist/wiring/management-tools.d.ts.map +1 -0
- package/dist/wiring/pipeline.d.ts +2 -1
- package/dist/wiring/pipeline.d.ts.map +1 -1
- package/dist/wiring/plugins.d.ts +1 -1
- package/dist/wiring/plugins.d.ts.map +1 -1
- package/dist/wiring/provider-runtime-setup.d.ts +14 -1
- package/dist/wiring/provider-runtime-setup.d.ts.map +1 -1
- package/dist/wiring/provider.d.ts.map +1 -1
- package/dist/wiring/runtime-controller-deps.d.ts +1 -1
- package/dist/wiring/runtime-controller-deps.d.ts.map +1 -1
- package/dist/wiring/sage.d.ts.map +1 -1
- package/dist/wiring/session-registry.d.ts +38 -0
- package/dist/wiring/session-registry.d.ts.map +1 -0
- package/dist/wiring/session.d.ts +10 -6
- package/dist/wiring/session.d.ts.map +1 -1
- package/dist/wiring/tools.d.ts.map +1 -1
- package/package.json +22 -22
- package/dist/cli-recovery-prompt.d.ts +0 -19
- package/dist/cli-recovery-prompt.d.ts.map +0 -1
- package/dist/first-run-auth-gate.d.ts +0 -20
- package/dist/first-run-auth-gate.d.ts.map +0 -1
- package/dist/pre-launch/indexing-question.d.ts +0 -28
- package/dist/pre-launch/indexing-question.d.ts.map +0 -1
|
@@ -0,0 +1,413 @@
|
|
|
1
|
+
import {
|
|
2
|
+
activeProfileConfigPath
|
|
3
|
+
} from "./chunk-DPJZQCVP.js";
|
|
4
|
+
import "./chunk-7OCVIDC7.js";
|
|
5
|
+
|
|
6
|
+
// src/subcommands/handlers/mcp.ts
|
|
7
|
+
import { expectDefined } from "@wrongstack/core/utils";
|
|
8
|
+
import {
|
|
9
|
+
jsonObjectFileExists,
|
|
10
|
+
readJsonObjectFile,
|
|
11
|
+
removeJsonPath,
|
|
12
|
+
setJsonPath,
|
|
13
|
+
updateJsonObjectFile
|
|
14
|
+
} from "@wrongstack/core/utils";
|
|
15
|
+
import { allServers } from "@wrongstack/core/infrastructure";
|
|
16
|
+
|
|
17
|
+
// src/mcp-serve.ts
|
|
18
|
+
import * as fs from "node:fs/promises";
|
|
19
|
+
import * as path from "node:path";
|
|
20
|
+
import { pathToFileURL } from "node:url";
|
|
21
|
+
import { AutoApprovePermissionPolicy, DefaultSecretScrubber } from "@wrongstack/core/security";
|
|
22
|
+
import { Context } from "@wrongstack/core/agent";
|
|
23
|
+
import { normalizeTokenSavingTier } from "@wrongstack/core/types";
|
|
24
|
+
import { ToolRegistry } from "@wrongstack/core/registry";
|
|
25
|
+
import { ToolExecutor } from "@wrongstack/core/execution";
|
|
26
|
+
import {
|
|
27
|
+
DEFAULT_MCP_INSERTION_MAX_BYTES,
|
|
28
|
+
MCPServer,
|
|
29
|
+
serveHttp,
|
|
30
|
+
serveStdio
|
|
31
|
+
} from "@wrongstack/mcp";
|
|
32
|
+
import { registerBuiltinToolTier } from "@wrongstack/tools/tool-tier";
|
|
33
|
+
var AllowAllPermissionPolicy = class extends AutoApprovePermissionPolicy {
|
|
34
|
+
async evaluate() {
|
|
35
|
+
return { permission: "auto", source: "default" };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
function parseToolsFlag(flags) {
|
|
39
|
+
const raw = flags["tools"];
|
|
40
|
+
if (typeof raw !== "string") return null;
|
|
41
|
+
const set = new Set(
|
|
42
|
+
raw.split(",").map((s) => s.trim()).filter(Boolean)
|
|
43
|
+
);
|
|
44
|
+
return set.size > 0 ? set : null;
|
|
45
|
+
}
|
|
46
|
+
async function loadSelectedMcpServeContent(flags, cwd) {
|
|
47
|
+
const resources = [];
|
|
48
|
+
const prompts = [];
|
|
49
|
+
const resourceUris = /* @__PURE__ */ new Set();
|
|
50
|
+
const promptNames = /* @__PURE__ */ new Set();
|
|
51
|
+
for (const selected of commaSeparatedFlag(flags, "resources")) {
|
|
52
|
+
const file = path.resolve(cwd, selected);
|
|
53
|
+
const data = await readSelectedFile(file);
|
|
54
|
+
const uri = pathToFileURL(file).toString();
|
|
55
|
+
if (resourceUris.has(uri)) throw new Error(`Duplicate MCP resource selection: ${selected}`);
|
|
56
|
+
resourceUris.add(uri);
|
|
57
|
+
const mimeType = mimeTypeFor(file);
|
|
58
|
+
resources.push({
|
|
59
|
+
uri,
|
|
60
|
+
name: path.basename(file),
|
|
61
|
+
mimeType,
|
|
62
|
+
size: data.byteLength,
|
|
63
|
+
contents: [
|
|
64
|
+
isTextMime(mimeType) ? { uri, mimeType, text: data.toString("utf8") } : { uri, mimeType, blob: data.toString("base64") }
|
|
65
|
+
]
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
for (const selected of commaSeparatedFlag(flags, "prompts")) {
|
|
69
|
+
const file = path.resolve(cwd, selected);
|
|
70
|
+
const data = await readSelectedFile(file);
|
|
71
|
+
const name = path.basename(file, path.extname(file)).replace(/[^A-Za-z0-9_.-]+/g, "-").replace(/^-+|-+$/g, "");
|
|
72
|
+
if (!name) throw new Error(`Cannot derive an MCP prompt name from: ${selected}`);
|
|
73
|
+
if (promptNames.has(name)) throw new Error(`Duplicate MCP prompt name: ${name}`);
|
|
74
|
+
promptNames.add(name);
|
|
75
|
+
const template = data.toString("utf8");
|
|
76
|
+
const argumentNames = Array.from(
|
|
77
|
+
template.matchAll(/\{\{([A-Za-z_][A-Za-z0-9_.-]*)\}\}/g),
|
|
78
|
+
(match) => match[1]
|
|
79
|
+
).filter((value, index, all) => !!value && all.indexOf(value) === index);
|
|
80
|
+
prompts.push({
|
|
81
|
+
name,
|
|
82
|
+
description: `Explicitly selected local prompt: ${path.basename(file)}`,
|
|
83
|
+
arguments: argumentNames.map((argument) => ({ name: argument, required: true })),
|
|
84
|
+
template
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
return { resources, prompts };
|
|
88
|
+
}
|
|
89
|
+
function commaSeparatedFlag(flags, name) {
|
|
90
|
+
const value = flags[name];
|
|
91
|
+
if (value === void 0) return [];
|
|
92
|
+
if (typeof value !== "string" || value.trim() === "") {
|
|
93
|
+
throw new Error(`--${name} requires a comma-separated file list`);
|
|
94
|
+
}
|
|
95
|
+
return value.split(",").map((item) => item.trim()).filter(Boolean);
|
|
96
|
+
}
|
|
97
|
+
async function readSelectedFile(file) {
|
|
98
|
+
const stat2 = await fs.stat(file);
|
|
99
|
+
if (!stat2.isFile()) throw new Error(`Selected MCP content is not a regular file: ${file}`);
|
|
100
|
+
if (stat2.size > DEFAULT_MCP_INSERTION_MAX_BYTES) {
|
|
101
|
+
throw new Error(
|
|
102
|
+
`Selected MCP content exceeds ${DEFAULT_MCP_INSERTION_MAX_BYTES} bytes: ${file}`
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
return fs.readFile(file);
|
|
106
|
+
}
|
|
107
|
+
function mimeTypeFor(file) {
|
|
108
|
+
switch (path.extname(file).toLowerCase()) {
|
|
109
|
+
case ".md":
|
|
110
|
+
case ".mdx":
|
|
111
|
+
return "text/markdown";
|
|
112
|
+
case ".json":
|
|
113
|
+
return "application/json";
|
|
114
|
+
case ".yaml":
|
|
115
|
+
case ".yml":
|
|
116
|
+
return "application/yaml";
|
|
117
|
+
case ".html":
|
|
118
|
+
return "text/html";
|
|
119
|
+
case ".css":
|
|
120
|
+
return "text/css";
|
|
121
|
+
case ".js":
|
|
122
|
+
case ".mjs":
|
|
123
|
+
return "text/javascript";
|
|
124
|
+
case ".ts":
|
|
125
|
+
case ".tsx":
|
|
126
|
+
return "text/typescript";
|
|
127
|
+
case ".txt":
|
|
128
|
+
case ".log":
|
|
129
|
+
return "text/plain";
|
|
130
|
+
case ".png":
|
|
131
|
+
return "image/png";
|
|
132
|
+
case ".jpg":
|
|
133
|
+
case ".jpeg":
|
|
134
|
+
return "image/jpeg";
|
|
135
|
+
case ".gif":
|
|
136
|
+
return "image/gif";
|
|
137
|
+
case ".webp":
|
|
138
|
+
return "image/webp";
|
|
139
|
+
default:
|
|
140
|
+
return "application/octet-stream";
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
function isTextMime(mimeType) {
|
|
144
|
+
return mimeType.startsWith("text/") || mimeType === "application/json" || mimeType === "application/yaml";
|
|
145
|
+
}
|
|
146
|
+
function makeServeContext(cwd, projectRoot, signal, restrictFsToRoot = true) {
|
|
147
|
+
const provider = {
|
|
148
|
+
id: "mcp-serve",
|
|
149
|
+
capabilities: { maxContext: 0 },
|
|
150
|
+
complete: async () => {
|
|
151
|
+
throw new Error("no model provider in `mcp serve` mode");
|
|
152
|
+
},
|
|
153
|
+
stream: () => {
|
|
154
|
+
throw new Error("no model provider in `mcp serve` mode");
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
const session = { append: async () => {
|
|
158
|
+
} };
|
|
159
|
+
const tokenCounter = {
|
|
160
|
+
account: () => {
|
|
161
|
+
},
|
|
162
|
+
total: () => ({ input: 0, output: 0 }),
|
|
163
|
+
estimateCost: () => ({ total: 0 })
|
|
164
|
+
};
|
|
165
|
+
return new Context({
|
|
166
|
+
systemPrompt: [],
|
|
167
|
+
provider,
|
|
168
|
+
session,
|
|
169
|
+
signal,
|
|
170
|
+
tokenCounter,
|
|
171
|
+
cwd,
|
|
172
|
+
projectRoot,
|
|
173
|
+
allowOutsideProjectRoot: !restrictFsToRoot,
|
|
174
|
+
model: "mcp-serve",
|
|
175
|
+
tools: []
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
async function selectExposedTools(registry, ctx, policy, whitelist) {
|
|
179
|
+
const allowed = [];
|
|
180
|
+
for (const tool of registry.list()) {
|
|
181
|
+
if (whitelist && !whitelist.has(tool.name)) continue;
|
|
182
|
+
const decision = await policy.evaluate(tool, {}, ctx);
|
|
183
|
+
if (decision.permission === "auto") allowed.push(tool);
|
|
184
|
+
}
|
|
185
|
+
return allowed;
|
|
186
|
+
}
|
|
187
|
+
async function serveMcpStdio(deps) {
|
|
188
|
+
const flags = deps.flags ?? {};
|
|
189
|
+
const yolo = flags["yolo"] === true || flags["allow-all"] === true;
|
|
190
|
+
const whitelist = parseToolsFlag(flags);
|
|
191
|
+
const log = (m) => process.stderr.write(`${m}
|
|
192
|
+
`);
|
|
193
|
+
let selectedContent;
|
|
194
|
+
try {
|
|
195
|
+
selectedContent = await loadSelectedMcpServeContent(flags, deps.cwd);
|
|
196
|
+
} catch (err) {
|
|
197
|
+
log(`wrongstack MCP server: ${err instanceof Error ? err.message : String(err)}`);
|
|
198
|
+
return 1;
|
|
199
|
+
}
|
|
200
|
+
let registry = deps.toolRegistry;
|
|
201
|
+
if (!registry) {
|
|
202
|
+
registry = new ToolRegistry();
|
|
203
|
+
registerBuiltinToolTier({
|
|
204
|
+
registry,
|
|
205
|
+
tier: normalizeTokenSavingTier(deps.config.features.tokenSavingMode)
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
const controller = new AbortController();
|
|
209
|
+
const ctx = makeServeContext(
|
|
210
|
+
deps.cwd,
|
|
211
|
+
deps.projectRoot,
|
|
212
|
+
controller.signal,
|
|
213
|
+
deps.config.tools?.restrictToProjectRoot ?? false
|
|
214
|
+
);
|
|
215
|
+
const permissionPolicy = yolo ? new AllowAllPermissionPolicy() : new AutoApprovePermissionPolicy();
|
|
216
|
+
const executor = new ToolExecutor(registry, {
|
|
217
|
+
permissionPolicy,
|
|
218
|
+
secretScrubber: new DefaultSecretScrubber(),
|
|
219
|
+
maxToolTimeoutMs: deps.config.tools?.maxToolTimeoutMs ?? 3e5,
|
|
220
|
+
perIterationOutputCapBytes: 1e6
|
|
221
|
+
});
|
|
222
|
+
const allowed = await selectExposedTools(registry, ctx, permissionPolicy, whitelist);
|
|
223
|
+
const allowedNames = new Set(allowed.map((t) => t.name));
|
|
224
|
+
if (allowed.length === 0) {
|
|
225
|
+
log(
|
|
226
|
+
"wrongstack MCP server: no tools to expose (all withheld by policy or filtered out). Pass --yolo to expose write/exec tools, or --tools <names> to whitelist."
|
|
227
|
+
);
|
|
228
|
+
}
|
|
229
|
+
let counter = 0;
|
|
230
|
+
const host = {
|
|
231
|
+
listTools: () => allowed.map((t) => ({
|
|
232
|
+
name: t.name,
|
|
233
|
+
description: t.description,
|
|
234
|
+
inputSchema: t.inputSchema ?? { type: "object" }
|
|
235
|
+
})),
|
|
236
|
+
callTool: async (name, callArgs) => {
|
|
237
|
+
if (!allowedNames.has(name)) {
|
|
238
|
+
return { content: `Tool "${name}" is not exposed by this server`, isError: true };
|
|
239
|
+
}
|
|
240
|
+
const use = {
|
|
241
|
+
type: "tool_use",
|
|
242
|
+
id: `srv_${++counter}`,
|
|
243
|
+
name,
|
|
244
|
+
input: callArgs
|
|
245
|
+
};
|
|
246
|
+
const batch = await executor.executeBatch([use], ctx, "sequential");
|
|
247
|
+
const result = batch.outputs[0]?.result;
|
|
248
|
+
if (!result || result.type === "tool_confirm_pending") {
|
|
249
|
+
return {
|
|
250
|
+
content: `Tool "${name}" requires interactive confirmation, which is unavailable over MCP`,
|
|
251
|
+
isError: true
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
return { content: result.content, isError: Boolean(result.is_error) };
|
|
255
|
+
}
|
|
256
|
+
};
|
|
257
|
+
const server = new MCPServer({
|
|
258
|
+
host,
|
|
259
|
+
resources: selectedContent.resources,
|
|
260
|
+
prompts: selectedContent.prompts,
|
|
261
|
+
logger: { warn: (m) => log(`[mcp-serve] ${m}`) }
|
|
262
|
+
});
|
|
263
|
+
const mode = yolo ? "yolo: all tools" : "safe: read-only tools";
|
|
264
|
+
if (flags["http"] === true || typeof flags["http"] === "string" || flags["port"] || flags["host"]) {
|
|
265
|
+
const port = Number(flags["port"] ?? flags["http"] ?? 0) || 0;
|
|
266
|
+
const httpHost = typeof flags["host"] === "string" ? flags["host"] : "127.0.0.1";
|
|
267
|
+
const token = typeof flags["token"] === "string" ? flags["token"] : void 0;
|
|
268
|
+
let handle2;
|
|
269
|
+
try {
|
|
270
|
+
handle2 = await serveHttp(server, {
|
|
271
|
+
port,
|
|
272
|
+
host: httpHost,
|
|
273
|
+
token,
|
|
274
|
+
logger: { warn: (m) => log(`[mcp-serve] ${m}`) }
|
|
275
|
+
});
|
|
276
|
+
} catch (err) {
|
|
277
|
+
log(`wrongstack MCP server: ${err instanceof Error ? err.message : String(err)}`);
|
|
278
|
+
return 1;
|
|
279
|
+
}
|
|
280
|
+
log(
|
|
281
|
+
`wrongstack MCP server ready at ${handle2.url} \u2014 exposing ${allowed.length} tool(s), ${selectedContent.resources.length} resource(s), ${selectedContent.prompts.length} prompt(s) (${mode})${token ? " [token auth]" : ""}.`
|
|
282
|
+
);
|
|
283
|
+
await new Promise((resolve2) => {
|
|
284
|
+
const stop = () => resolve2();
|
|
285
|
+
process.once("SIGINT", stop);
|
|
286
|
+
process.once("SIGTERM", stop);
|
|
287
|
+
});
|
|
288
|
+
await handle2.close();
|
|
289
|
+
controller.abort();
|
|
290
|
+
return 0;
|
|
291
|
+
}
|
|
292
|
+
log(
|
|
293
|
+
`wrongstack MCP server ready on stdio \u2014 exposing ${allowed.length} tool(s), ${selectedContent.resources.length} resource(s), ${selectedContent.prompts.length} prompt(s) (${mode}).`
|
|
294
|
+
);
|
|
295
|
+
const handle = serveStdio(server);
|
|
296
|
+
await handle.done;
|
|
297
|
+
controller.abort();
|
|
298
|
+
return 0;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
// src/subcommands/handlers/mcp.ts
|
|
302
|
+
var BUILT_IN_MCP = allServers();
|
|
303
|
+
var mcpCmd = async (args, deps) => {
|
|
304
|
+
const sub = args[0];
|
|
305
|
+
if (sub === "serve") {
|
|
306
|
+
return serveMcpStdio(deps);
|
|
307
|
+
}
|
|
308
|
+
if (!sub || sub === "list") {
|
|
309
|
+
const servers = deps.config.mcpServers ?? {};
|
|
310
|
+
if (Object.keys(servers).length === 0) {
|
|
311
|
+
deps.renderer.write("No MCP servers configured.\n");
|
|
312
|
+
deps.renderer.write("Use `wstack mcp add <name>` or set mcpServers in your config.\n");
|
|
313
|
+
return 0;
|
|
314
|
+
}
|
|
315
|
+
for (const [name, cfg] of Object.entries(servers)) {
|
|
316
|
+
const status = cfg.enabled === false ? "disabled" : "enabled";
|
|
317
|
+
const desc = cfg.description ? ` # ${cfg.description}` : "";
|
|
318
|
+
deps.renderer.write(` ${name.padEnd(20)} ${cfg.transport.padEnd(16)} ${status}${desc}
|
|
319
|
+
`);
|
|
320
|
+
}
|
|
321
|
+
return 0;
|
|
322
|
+
}
|
|
323
|
+
if (sub === "add") {
|
|
324
|
+
return addMcpServer(args, deps);
|
|
325
|
+
}
|
|
326
|
+
if (sub === "remove") {
|
|
327
|
+
const name = args[1];
|
|
328
|
+
if (!name) {
|
|
329
|
+
deps.renderer.writeError("Usage: wstack mcp remove <name>\n");
|
|
330
|
+
return 1;
|
|
331
|
+
}
|
|
332
|
+
return removeMcpServer(name, deps);
|
|
333
|
+
}
|
|
334
|
+
if (sub === "restart") {
|
|
335
|
+
deps.renderer.writeWarning(
|
|
336
|
+
"mcp restart is only available in REPL mode. Use /mcp restart instead."
|
|
337
|
+
);
|
|
338
|
+
return 0;
|
|
339
|
+
}
|
|
340
|
+
deps.renderer.writeError(`Unknown mcp subcommand: ${sub}`);
|
|
341
|
+
return 1;
|
|
342
|
+
};
|
|
343
|
+
async function addMcpServer(args, deps) {
|
|
344
|
+
const configPath = activeProfileConfigPath(deps.paths, deps.config);
|
|
345
|
+
const name = args[1];
|
|
346
|
+
const enable = args.includes("--enable") || args.includes("-e");
|
|
347
|
+
if (!name) {
|
|
348
|
+
deps.renderer.writeError("Usage: wstack mcp add <name>\n");
|
|
349
|
+
deps.renderer.write("Available servers:\n");
|
|
350
|
+
for (const [sname, scfg] of Object.entries(deps.config.mcpServers ?? {}))
|
|
351
|
+
deps.renderer.write(` ${sname.padEnd(20)} ${scfg.description ?? scfg.transport}
|
|
352
|
+
`);
|
|
353
|
+
if (Object.keys(deps.config.mcpServers ?? {}).length === 0)
|
|
354
|
+
for (const k of Object.keys(BUILT_IN_MCP)) {
|
|
355
|
+
const s = expectDefined(BUILT_IN_MCP[k]);
|
|
356
|
+
deps.renderer.write(` ${k.padEnd(20)} ${s.description}
|
|
357
|
+
`);
|
|
358
|
+
}
|
|
359
|
+
deps.renderer.write("\nRun `wstack mcp add <name> --enable` to enable immediately.\n");
|
|
360
|
+
return 1;
|
|
361
|
+
}
|
|
362
|
+
const factory = BUILT_IN_MCP[name];
|
|
363
|
+
if (!factory) {
|
|
364
|
+
deps.renderer.writeError(
|
|
365
|
+
`Unknown server "${name}". Run \`wstack mcp add\` without args to see available servers.
|
|
366
|
+
`
|
|
367
|
+
);
|
|
368
|
+
return 1;
|
|
369
|
+
}
|
|
370
|
+
const serverCfg = { ...factory };
|
|
371
|
+
serverCfg.enabled = enable;
|
|
372
|
+
const existing = await readJsonObjectFile(configPath);
|
|
373
|
+
const mcpServers = isRecord(existing.mcpServers) ? existing.mcpServers : {};
|
|
374
|
+
if (mcpServers[name])
|
|
375
|
+
deps.renderer.writeWarning(`Server "${name}" already in config. Updating.
|
|
376
|
+
`);
|
|
377
|
+
await updateJsonObjectFile(configPath, (config) => {
|
|
378
|
+
setJsonPath(config, ["mcpServers", name], serverCfg);
|
|
379
|
+
});
|
|
380
|
+
const verb = enable ? "Enabled" : "Added (disabled \u2014 set enabled:true to activate)";
|
|
381
|
+
deps.renderer.writeInfo(
|
|
382
|
+
`${verb} "${name}" (${serverCfg.transport}). Config written to ${configPath}.
|
|
383
|
+
`
|
|
384
|
+
);
|
|
385
|
+
return 0;
|
|
386
|
+
}
|
|
387
|
+
async function removeMcpServer(name, deps) {
|
|
388
|
+
const configPath = activeProfileConfigPath(deps.paths, deps.config);
|
|
389
|
+
if (!await jsonObjectFileExists(configPath)) {
|
|
390
|
+
deps.renderer.writeError("No config file found.\n");
|
|
391
|
+
return 1;
|
|
392
|
+
}
|
|
393
|
+
const existing = await readJsonObjectFile(configPath);
|
|
394
|
+
const mcpServers = isRecord(existing.mcpServers) ? existing.mcpServers : {};
|
|
395
|
+
if (!mcpServers[name]) {
|
|
396
|
+
deps.renderer.writeError(`Server "${name}" not in config.
|
|
397
|
+
`);
|
|
398
|
+
return 1;
|
|
399
|
+
}
|
|
400
|
+
await updateJsonObjectFile(configPath, (config) => {
|
|
401
|
+
removeJsonPath(config, ["mcpServers", name]);
|
|
402
|
+
});
|
|
403
|
+
deps.renderer.writeInfo(`Removed "${name}" from config.
|
|
404
|
+
`);
|
|
405
|
+
return 0;
|
|
406
|
+
}
|
|
407
|
+
function isRecord(value) {
|
|
408
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
409
|
+
}
|
|
410
|
+
export {
|
|
411
|
+
mcpCmd
|
|
412
|
+
};
|
|
413
|
+
//# sourceMappingURL=mcp-CYLPUEHC.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/subcommands/handlers/mcp.ts", "../src/mcp-serve.ts"],
|
|
4
|
+
"sourcesContent": ["import { expectDefined } from '@wrongstack/core/utils';\nimport {\n jsonObjectFileExists,\n readJsonObjectFile,\n removeJsonPath,\n setJsonPath,\n updateJsonObjectFile,\n} from '@wrongstack/core/utils';\nimport { allServers } from '@wrongstack/core/infrastructure';\nimport { serveMcpStdio } from '../../mcp-serve.js';\nimport { activeProfileConfigPath } from '../../profile-config-path.js';\nimport type { SubcommandDeps, SubcommandHandler } from '../index.js';\n\nconst BUILT_IN_MCP = allServers();\n\nexport const mcpCmd: SubcommandHandler = async (args, deps) => {\n const sub = args[0];\n if (sub === 'serve') {\n // Run WrongStack as an MCP server over stdio. Blocks until stdin closes.\n // Flags (--yolo/--tools) come via deps.flags \u2014 the dispatcher strips them\n // from positional args.\n return serveMcpStdio(deps);\n }\n if (!sub || sub === 'list') {\n const servers = deps.config.mcpServers ?? {};\n if (Object.keys(servers).length === 0) {\n deps.renderer.write('No MCP servers configured.\\n');\n deps.renderer.write('Use `wstack mcp add <name>` or set mcpServers in your config.\\n');\n return 0;\n }\n for (const [name, cfg] of Object.entries(servers)) {\n const status = cfg.enabled === false ? 'disabled' : 'enabled';\n const desc = cfg.description ? ` # ${cfg.description}` : '';\n deps.renderer.write(` ${name.padEnd(20)} ${cfg.transport.padEnd(16)} ${status}${desc}\\n`);\n }\n return 0;\n }\n if (sub === 'add') {\n return addMcpServer(args, deps);\n }\n if (sub === 'remove') {\n const name = args[1];\n if (!name) {\n deps.renderer.writeError('Usage: wstack mcp remove <name>\\n');\n return 1;\n }\n return removeMcpServer(name, deps);\n }\n if (sub === 'restart') {\n deps.renderer.writeWarning(\n 'mcp restart is only available in REPL mode. Use /mcp restart instead.',\n );\n return 0;\n }\n deps.renderer.writeError(`Unknown mcp subcommand: ${sub}`);\n return 1;\n};\n\nasync function addMcpServer(args: string[], deps: SubcommandDeps): Promise<number> {\n const configPath = activeProfileConfigPath(deps.paths, deps.config);\n const name = args[1];\n const enable = args.includes('--enable') || args.includes('-e');\n if (!name) {\n deps.renderer.writeError('Usage: wstack mcp add <name>\\n');\n deps.renderer.write('Available servers:\\n');\n for (const [sname, scfg] of Object.entries(deps.config.mcpServers ?? {}))\n deps.renderer.write(` ${sname.padEnd(20)} ${scfg.description ?? scfg.transport}\\n`);\n if (Object.keys(deps.config.mcpServers ?? {}).length === 0)\n for (const k of Object.keys(BUILT_IN_MCP)) {\n const s = expectDefined(BUILT_IN_MCP[k]);\n deps.renderer.write(` ${k.padEnd(20)} ${s.description}\\n`);\n }\n deps.renderer.write('\\nRun `wstack mcp add <name> --enable` to enable immediately.\\n');\n return 1;\n }\n const factory = BUILT_IN_MCP[name];\n if (!factory) {\n deps.renderer.writeError(\n `Unknown server \"${name}\". Run \\`wstack mcp add\\` without args to see available servers.\\n`,\n );\n return 1;\n }\n const serverCfg = { ...factory };\n serverCfg.enabled = enable;\n const existing = await readJsonObjectFile(configPath);\n const mcpServers = isRecord(existing.mcpServers) ? existing.mcpServers : {};\n if (mcpServers[name])\n deps.renderer.writeWarning(`Server \"${name}\" already in config. Updating.\\n`);\n await updateJsonObjectFile(configPath, (config) => {\n setJsonPath(config, ['mcpServers', name], serverCfg);\n });\n const verb = enable ? 'Enabled' : 'Added (disabled \u2014 set enabled:true to activate)';\n deps.renderer.writeInfo(\n `${verb} \"${name}\" (${serverCfg.transport}). Config written to ${configPath}.\\n`,\n );\n return 0;\n}\n\nasync function removeMcpServer(name: string, deps: SubcommandDeps): Promise<number> {\n const configPath = activeProfileConfigPath(deps.paths, deps.config);\n if (!(await jsonObjectFileExists(configPath))) {\n deps.renderer.writeError('No config file found.\\n');\n return 1;\n }\n const existing = await readJsonObjectFile(configPath);\n const mcpServers = isRecord(existing.mcpServers) ? existing.mcpServers : {};\n if (!mcpServers[name]) {\n deps.renderer.writeError(`Server \"${name}\" not in config.\\n`);\n return 1;\n }\n await updateJsonObjectFile(configPath, (config) => {\n removeJsonPath(config, ['mcpServers', name]);\n });\n deps.renderer.writeInfo(`Removed \"${name}\" from config.\\n`);\n return 0;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n", "/**\n * `wstack mcp serve` \u2014 run WrongStack itself as an MCP server over stdio.\n *\n * Exposes the built-in tool registry to any MCP client (Claude Desktop, another\n * agent, an IDE). stdout is the JSON-RPC channel \u2014 every status/log line goes to\n * stderr. By default a safe `AutoApprovePermissionPolicy` is used: read-only\n * tools are exposed, while shell/write/edit and dangerous-capability tools are\n * withheld. `--yolo` exposes everything; `--tools a,b,c` restricts the set.\n */\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { AutoApprovePermissionPolicy, DefaultSecretScrubber } from '@wrongstack/core/security';\nimport { Context } from '@wrongstack/core/agent';\nimport { normalizeTokenSavingTier } from '@wrongstack/core/types';\nimport type { PermissionPolicy, Provider, SessionWriter, TokenCounter, Tool } from '@wrongstack/core/types';\nimport { ToolRegistry } from '@wrongstack/core/registry';\nimport { ToolExecutor } from '@wrongstack/core/execution';\nimport {\n DEFAULT_MCP_INSERTION_MAX_BYTES,\n MCPServer,\n type MCPServerPrompt,\n type MCPServerResource,\n type MCPServerToolHost,\n serveHttp,\n serveStdio,\n} from '@wrongstack/mcp';\nimport { registerBuiltinToolTier } from '@wrongstack/tools/tool-tier';\nimport type { SubcommandDeps } from './subcommands/index.js';\n\n/** `--yolo` policy: auto-approve everything (inherits the rest of the contract). */\nclass AllowAllPermissionPolicy extends AutoApprovePermissionPolicy {\n override async evaluate(): ReturnType<AutoApprovePermissionPolicy['evaluate']> {\n return { permission: 'auto', source: 'default' };\n }\n}\n\nfunction parseToolsFlag(flags: Record<string, string | boolean>): Set<string> | null {\n const raw = flags['tools'];\n if (typeof raw !== 'string') return null;\n const set = new Set(\n raw\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean),\n );\n return set.size > 0 ? set : null;\n}\n\nexport interface SelectedMcpServeContent {\n resources: MCPServerResource[];\n prompts: MCPServerPrompt[];\n}\n\n/** Load only files explicitly named by trusted CLI flags; nothing is auto-discovered. */\nexport async function loadSelectedMcpServeContent(\n flags: Record<string, string | boolean>,\n cwd: string,\n): Promise<SelectedMcpServeContent> {\n const resources: MCPServerResource[] = [];\n const prompts: MCPServerPrompt[] = [];\n const resourceUris = new Set<string>();\n const promptNames = new Set<string>();\n for (const selected of commaSeparatedFlag(flags, 'resources')) {\n const file = path.resolve(cwd, selected);\n const data = await readSelectedFile(file);\n const uri = pathToFileURL(file).toString();\n if (resourceUris.has(uri)) throw new Error(`Duplicate MCP resource selection: ${selected}`);\n resourceUris.add(uri);\n const mimeType = mimeTypeFor(file);\n resources.push({\n uri,\n name: path.basename(file),\n mimeType,\n size: data.byteLength,\n contents: [\n isTextMime(mimeType)\n ? { uri, mimeType, text: data.toString('utf8') }\n : { uri, mimeType, blob: data.toString('base64') },\n ],\n });\n }\n for (const selected of commaSeparatedFlag(flags, 'prompts')) {\n const file = path.resolve(cwd, selected);\n const data = await readSelectedFile(file);\n const name = path\n .basename(file, path.extname(file))\n .replace(/[^A-Za-z0-9_.-]+/g, '-')\n .replace(/^-+|-+$/g, '');\n if (!name) throw new Error(`Cannot derive an MCP prompt name from: ${selected}`);\n if (promptNames.has(name)) throw new Error(`Duplicate MCP prompt name: ${name}`);\n promptNames.add(name);\n const template = data.toString('utf8');\n const argumentNames = Array.from(\n template.matchAll(/\\{\\{([A-Za-z_][A-Za-z0-9_.-]*)\\}\\}/g),\n (match) => match[1],\n ).filter((value, index, all): value is string => !!value && all.indexOf(value) === index);\n prompts.push({\n name,\n description: `Explicitly selected local prompt: ${path.basename(file)}`,\n arguments: argumentNames.map((argument) => ({ name: argument, required: true })),\n template,\n });\n }\n return { resources, prompts };\n}\n\nfunction commaSeparatedFlag(\n flags: Record<string, string | boolean>,\n name: 'resources' | 'prompts',\n): string[] {\n const value = flags[name];\n if (value === undefined) return [];\n if (typeof value !== 'string' || value.trim() === '') {\n throw new Error(`--${name} requires a comma-separated file list`);\n }\n return value\n .split(',')\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nasync function readSelectedFile(file: string): Promise<Buffer> {\n const stat = await fs.stat(file);\n if (!stat.isFile()) throw new Error(`Selected MCP content is not a regular file: ${file}`);\n if (stat.size > DEFAULT_MCP_INSERTION_MAX_BYTES) {\n throw new Error(\n `Selected MCP content exceeds ${DEFAULT_MCP_INSERTION_MAX_BYTES} bytes: ${file}`,\n );\n }\n return fs.readFile(file);\n}\n\nfunction mimeTypeFor(file: string): string {\n switch (path.extname(file).toLowerCase()) {\n case '.md':\n case '.mdx':\n return 'text/markdown';\n case '.json':\n return 'application/json';\n case '.yaml':\n case '.yml':\n return 'application/yaml';\n case '.html':\n return 'text/html';\n case '.css':\n return 'text/css';\n case '.js':\n case '.mjs':\n return 'text/javascript';\n case '.ts':\n case '.tsx':\n return 'text/typescript';\n case '.txt':\n case '.log':\n return 'text/plain';\n case '.png':\n return 'image/png';\n case '.jpg':\n case '.jpeg':\n return 'image/jpeg';\n case '.gif':\n return 'image/gif';\n case '.webp':\n return 'image/webp';\n default:\n return 'application/octet-stream';\n }\n}\n\nfunction isTextMime(mimeType: string): boolean {\n return (\n mimeType.startsWith('text/') ||\n mimeType === 'application/json' ||\n mimeType === 'application/yaml'\n );\n}\n\n/** Minimal run context \u2014 tools read cwd/projectRoot/signal; provider/session are stubs. */\nexport function makeServeContext(\n cwd: string,\n projectRoot: string,\n signal: AbortSignal,\n restrictFsToRoot = true,\n): Context {\n const provider = {\n id: 'mcp-serve',\n capabilities: { maxContext: 0 },\n complete: async () => {\n throw new Error('no model provider in `mcp serve` mode');\n },\n stream: () => {\n throw new Error('no model provider in `mcp serve` mode');\n },\n } as never as Provider;\n const session = { append: async () => {} } as never as SessionWriter;\n const tokenCounter = {\n account: () => {},\n total: () => ({ input: 0, output: 0 }),\n estimateCost: () => ({ total: 0 }),\n } as never as TokenCounter;\n return new Context({\n systemPrompt: [],\n provider,\n session,\n signal,\n tokenCounter,\n cwd,\n projectRoot,\n allowOutsideProjectRoot: !restrictFsToRoot,\n model: 'mcp-serve',\n tools: [],\n });\n}\n\n/**\n * Compute the set of tools an MCP-serve session exposes: a tool is included\n * only if it passes the whitelist (when set) AND the permission policy returns\n * `auto`. With `AutoApprovePermissionPolicy` this withholds shell/write/edit and\n * dangerous-capability tools; with the `--yolo` policy everything passes.\n * Exported for testing \u2014 the live path calls it inside `serveMcpStdio`.\n */\nexport async function selectExposedTools(\n registry: ToolRegistry,\n ctx: Context,\n policy: PermissionPolicy,\n whitelist: Set<string> | null,\n): Promise<Tool[]> {\n const allowed: Tool[] = [];\n for (const tool of registry.list()) {\n if (whitelist && !whitelist.has(tool.name)) continue;\n const decision = await policy.evaluate(tool, {}, ctx);\n if (decision.permission === 'auto') allowed.push(tool);\n }\n return allowed;\n}\n\nexport async function serveMcpStdio(deps: SubcommandDeps): Promise<number> {\n const flags = deps.flags ?? {};\n const yolo = flags['yolo'] === true || flags['allow-all'] === true;\n const whitelist = parseToolsFlag(flags);\n const log = (m: string) => process.stderr.write(`${m}\\n`);\n let selectedContent: SelectedMcpServeContent;\n try {\n selectedContent = await loadSelectedMcpServeContent(flags, deps.cwd);\n } catch (err) {\n log(`wrongstack MCP server: ${err instanceof Error ? err.message : String(err)}`);\n return 1;\n }\n\n // Reuse the subcommand's pre-populated registry; fall back to a fresh one.\n let registry = deps.toolRegistry as ToolRegistry | undefined;\n if (!registry) {\n registry = new ToolRegistry();\n registerBuiltinToolTier({\n registry,\n tier: normalizeTokenSavingTier(deps.config.features.tokenSavingMode),\n });\n }\n\n const controller = new AbortController();\n const ctx = makeServeContext(\n deps.cwd,\n deps.projectRoot,\n controller.signal,\n deps.config.tools?.restrictToProjectRoot ?? false,\n );\n const permissionPolicy: PermissionPolicy = yolo\n ? new AllowAllPermissionPolicy()\n : new AutoApprovePermissionPolicy();\n const executor = new ToolExecutor(registry, {\n permissionPolicy,\n secretScrubber: new DefaultSecretScrubber(),\n maxToolTimeoutMs: deps.config.tools?.maxToolTimeoutMs ?? 300_000,\n perIterationOutputCapBytes: 1_000_000,\n });\n\n // Pre-compute the exposed set so tools/list and tools/call agree, and so a\n // withheld tool can never be invoked even if a client guesses its name.\n const allowed = await selectExposedTools(registry, ctx, permissionPolicy, whitelist);\n const allowedNames = new Set(allowed.map((t) => t.name));\n\n if (allowed.length === 0) {\n log(\n 'wrongstack MCP server: no tools to expose (all withheld by policy or filtered out). ' +\n 'Pass --yolo to expose write/exec tools, or --tools <names> to whitelist.',\n );\n }\n\n let counter = 0;\n const host: MCPServerToolHost = {\n listTools: () =>\n allowed.map((t) => ({\n name: t.name,\n description: t.description,\n inputSchema: (t.inputSchema as Record<string, unknown>) ?? { type: 'object' },\n })),\n callTool: async (name, callArgs) => {\n if (!allowedNames.has(name)) {\n return { content: `Tool \"${name}\" is not exposed by this server`, isError: true };\n }\n const use = {\n type: 'tool_use' as const,\n id: `srv_${++counter}`,\n name,\n input: callArgs,\n };\n const batch = await executor.executeBatch([use], ctx, 'sequential');\n const result = batch.outputs[0]?.result;\n if (!result || result.type === 'tool_confirm_pending') {\n return {\n content: `Tool \"${name}\" requires interactive confirmation, which is unavailable over MCP`,\n isError: true,\n };\n }\n return { content: result.content, isError: Boolean(result.is_error) };\n },\n };\n\n const server = new MCPServer({\n host,\n resources: selectedContent.resources,\n prompts: selectedContent.prompts,\n logger: { warn: (m) => log(`[mcp-serve] ${m}`) },\n });\n\n const mode = yolo ? 'yolo: all tools' : 'safe: read-only tools';\n\n // HTTP transport \u2014 network-reachable. Loopback by default; non-loopback\n // requires a token (enforced in serveHttp).\n if (\n flags['http'] === true ||\n typeof flags['http'] === 'string' ||\n flags['port'] ||\n flags['host']\n ) {\n const port = Number(flags['port'] ?? flags['http'] ?? 0) || 0;\n const httpHost = typeof flags['host'] === 'string' ? flags['host'] : '127.0.0.1';\n const token = typeof flags['token'] === 'string' ? flags['token'] : undefined;\n let handle: Awaited<ReturnType<typeof serveHttp>>;\n try {\n handle = await serveHttp(server, {\n port,\n host: httpHost,\n token,\n logger: { warn: (m) => log(`[mcp-serve] ${m}`) },\n });\n } catch (err) {\n log(`wrongstack MCP server: ${err instanceof Error ? err.message : String(err)}`);\n return 1;\n }\n log(\n `wrongstack MCP server ready at ${handle.url} \u2014 exposing ${allowed.length} tool(s), ` +\n `${selectedContent.resources.length} resource(s), ${selectedContent.prompts.length} prompt(s) (${mode})` +\n `${token ? ' [token auth]' : ''}.`,\n );\n await new Promise<void>((resolve) => {\n const stop = () => resolve();\n process.once('SIGINT', stop);\n process.once('SIGTERM', stop);\n });\n await handle.close();\n controller.abort();\n return 0;\n }\n\n log(\n `wrongstack MCP server ready on stdio \u2014 exposing ${allowed.length} tool(s), ` +\n `${selectedContent.resources.length} resource(s), ${selectedContent.prompts.length} prompt(s) (${mode}).`,\n );\n\n const handle = serveStdio(server);\n await handle.done;\n controller.abort();\n return 0;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["stat", "handle", "resolve"]
|
|
7
|
+
}
|