@wrongstack/cli 0.297.0 → 0.298.1
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/dist/{acp-A5OSIU2P.js → acp-S4LZQB66.js} +91 -23
- package/dist/{auth-CJWQJVRH.js → auth-NLLGEYQR.js} +3 -3
- package/dist/boot/governance-evidence-candidate.d.ts +3 -0
- package/dist/boot/governance-shadow-bridge.d.ts +19 -0
- package/dist/boot/governance-trace-context.d.ts +64 -0
- package/dist/boot/tui-session-resume.d.ts +10 -1
- package/dist/chimera-reviewer-policy.d.ts +89 -1
- package/dist/chimera-subagent-ladder.d.ts +72 -0
- package/dist/{chunk-AZESNNIC.js → chunk-4HH3YGG4.js} +3 -3
- package/dist/{chunk-QUNHS6O3.js → chunk-4U3DMA2Y.js} +2 -2
- package/dist/{chunk-IHBYBYGA.js → chunk-A6Q5KGLV.js} +51 -18
- package/dist/{chunk-ABXK4VVY.js → chunk-ARWGQUB3.js} +2 -1
- package/dist/{chunk-7JABKXET.js → chunk-C5GH4YBL.js} +1018 -175
- package/dist/{chunk-TADVX644.js → chunk-GO3TJICK.js} +11 -2
- package/dist/{chunk-JBTFWWKV.js → chunk-I2BM6FK6.js} +9 -4
- package/dist/{chunk-AXVZMEWG.js → chunk-I5MEUFDI.js} +2 -2
- package/dist/{chunk-XWEGWYDU.js → chunk-PEKUKUCH.js} +4 -71
- package/dist/chunk-U3SS4NRH.js +10 -0
- package/dist/{chunk-QZKWRNIP.js → chunk-V3XH6XBJ.js} +12 -9
- package/dist/{cli-main-GOY5YGVL.js → cli-main-7QLL2PY6.js} +957 -271
- package/dist/cli-main-helpers.d.ts +42 -2
- package/dist/{execution-A4PGK4XV.js → execution-HJ643JGZ.js} +834 -676
- package/dist/execution-chimera-cascade.d.ts +7 -1
- package/dist/execution-chimera-review.d.ts +35 -0
- package/dist/fleet/host-types.d.ts +6 -1
- package/dist/fleet-statusline.d.ts +1 -0
- package/dist/governance-V2Z42RBE.js +65 -0
- package/dist/governance-hq-telemetry.d.ts +17 -0
- package/dist/{hq-GBPGXIR5.js → hq-WO6CLUSI.js} +2 -2
- package/dist/hq-server/auth.d.ts +33 -2
- package/dist/hq-server/login-attempt-store.d.ts +73 -0
- package/dist/hq-server/routes/auth-handlers.d.ts +73 -5
- package/dist/hq-server/routes.d.ts +5 -5
- package/dist/hq-server/types.d.ts +36 -2
- package/dist/hq-server/utils.d.ts +51 -6
- package/dist/{hq-server-YQUUMTPU.js → hq-server-6TSAORAC.js} +2 -2
- package/dist/hq-server.d.ts +10 -0
- package/dist/index.js +52 -24
- package/dist/live-settings-input.d.ts +4 -3
- package/dist/plugin-management.d.ts +3 -8
- package/dist/{plugin-usage-OU6X6LM3.js → plugin-usage-VTL7ZTVC.js} +2 -2
- package/dist/{plugins-4LJ5IUBI.js → plugins-ETY6W3DC.js} +3 -3
- package/dist/settings-menu.d.ts +1 -1
- package/dist/slash-commands/fallback.d.ts +2 -0
- package/dist/slash-commands/goal-refiner.d.ts +1 -1
- package/dist/subcommands/handlers/acp-connection-gate.d.ts +20 -0
- package/dist/subcommands/handlers/governance.d.ts +8 -0
- package/dist/{update-YC4TYW2Y.js → update-MV6TUACD.js} +3 -3
- package/dist/utils/win32-cmd.d.ts +9 -6
- package/dist/{version-help-DROHZRW6.js → version-help-ASKQYXDJ.js} +2 -2
- package/dist/{webui-server-XKFUOKMJ.js → webui-server-PCLSXX6L.js} +10 -3
- package/dist/wiring/brain-and-orchestration.d.ts +2 -0
- package/dist/wiring/provider-runtime-setup.d.ts +2 -2
- package/package.json +24 -23
- package/dist/acp-A5OSIU2P.js.map +0 -7
- package/dist/acp-registry-cache.d.ts.map +0 -1
- package/dist/acp-server-agent.d.ts.map +0 -1
- package/dist/arg-parser.d.ts.map +0 -1
- package/dist/audit-2ZSFGNIF.js.map +0 -7
- package/dist/auth-CJWQJVRH.js.map +0 -7
- package/dist/auth-menu/add-provider.d.ts.map +0 -1
- package/dist/auth-menu/anthropic-oauth.d.ts.map +0 -1
- package/dist/auth-menu/auth-menu-audit.d.ts.map +0 -1
- package/dist/auth-menu/direct.d.ts.map +0 -1
- package/dist/auth-menu/github-copilot-oauth.d.ts.map +0 -1
- package/dist/auth-menu/helpers.d.ts.map +0 -1
- package/dist/auth-menu/index.d.ts.map +0 -1
- package/dist/auth-menu/local-presets.d.ts.map +0 -1
- package/dist/auth-menu/local.d.ts.map +0 -1
- package/dist/auth-menu/loopback-server.d.ts.map +0 -1
- package/dist/auth-menu/oauth-menu.d.ts.map +0 -1
- package/dist/auth-menu/openai-codex-oauth.d.ts.map +0 -1
- package/dist/auth-menu/panel-service.d.ts.map +0 -1
- package/dist/auth-menu/provider-menu.d.ts.map +0 -1
- package/dist/auth-menu/shared.d.ts.map +0 -1
- package/dist/auth-menu/top-menu.d.ts.map +0 -1
- package/dist/auth-menu/types.d.ts.map +0 -1
- package/dist/auth-menu.d.ts.map +0 -1
- package/dist/bench-7ZDWSNEF.js.map +0 -7
- package/dist/boot/auto-discover-providers.d.ts.map +0 -1
- package/dist/boot/brain-decision-log.d.ts.map +0 -1
- package/dist/boot/config-backup-recovery.d.ts.map +0 -1
- package/dist/boot/container-wiring.d.ts.map +0 -1
- package/dist/boot/dispatch-singleshot.d.ts.map +0 -1
- package/dist/boot/dispatch-tui.d.ts.map +0 -1
- package/dist/boot/dispatch-webui.d.ts.map +0 -1
- package/dist/boot/event-wiring.d.ts.map +0 -1
- package/dist/boot/execution-mode.d.ts.map +0 -1
- package/dist/boot/launch-banner.d.ts.map +0 -1
- package/dist/boot/launch-menu.d.ts.map +0 -1
- package/dist/boot/short-circuit-desktop.d.ts.map +0 -1
- package/dist/boot/short-circuit-flags.d.ts.map +0 -1
- package/dist/boot/short-circuit-hq.d.ts.map +0 -1
- package/dist/boot/simpleui-full-auto.d.ts.map +0 -1
- package/dist/boot/system-prompt-builder.d.ts.map +0 -1
- package/dist/boot/system-prompt.d.ts.map +0 -1
- package/dist/boot/tool-registry.d.ts.map +0 -1
- package/dist/boot/tui-coordinator-callbacks.d.ts.map +0 -1
- package/dist/boot/tui-coordinator-setup.d.ts.map +0 -1
- package/dist/boot/tui-debug-stream.d.ts.map +0 -1
- package/dist/boot/tui-goal-wiring.d.ts.map +0 -1
- package/dist/boot/tui-live-sessions.d.ts.map +0 -1
- package/dist/boot/tui-project-picker-callback.d.ts.map +0 -1
- package/dist/boot/tui-project-spawn.d.ts.map +0 -1
- package/dist/boot/tui-project-switch.d.ts.map +0 -1
- package/dist/boot/tui-runtime-state.d.ts.map +0 -1
- package/dist/boot/tui-sdd-callback.d.ts.map +0 -1
- package/dist/boot/tui-session-resume.d.ts.map +0 -1
- package/dist/boot/tui-settings-adapter.d.ts.map +0 -1
- package/dist/boot-config.d.ts.map +0 -1
- package/dist/boot.d.ts.map +0 -1
- package/dist/brain-menu/panel-service.d.ts.map +0 -1
- package/dist/chimera-review-task.d.ts.map +0 -1
- package/dist/chimera-reviewer-policy.d.ts.map +0 -1
- package/dist/chronicle-QQEQFSSE.js.map +0 -7
- package/dist/chunk-5N34EWJR.js.map +0 -7
- package/dist/chunk-66T43Q4Y.js.map +0 -7
- package/dist/chunk-7JABKXET.js.map +0 -7
- package/dist/chunk-7OCVIDC7.js.map +0 -7
- package/dist/chunk-ABXK4VVY.js.map +0 -7
- package/dist/chunk-AXVZMEWG.js.map +0 -7
- package/dist/chunk-AZESNNIC.js.map +0 -7
- package/dist/chunk-BGFM3PD7.js.map +0 -7
- package/dist/chunk-DPJZQCVP.js.map +0 -7
- package/dist/chunk-F4PEGAJZ.js.map +0 -7
- package/dist/chunk-IHBYBYGA.js.map +0 -7
- package/dist/chunk-JBSQ7ONN.js.map +0 -7
- package/dist/chunk-JBTFWWKV.js.map +0 -7
- package/dist/chunk-JUHRI6OV.js.map +0 -7
- package/dist/chunk-JW75HY4F.js.map +0 -7
- package/dist/chunk-OP47B3IX.js.map +0 -7
- package/dist/chunk-PJHET45A.js.map +0 -7
- package/dist/chunk-Q5GTM25S.js.map +0 -7
- package/dist/chunk-QD544J2B.js.map +0 -7
- package/dist/chunk-QUNHS6O3.js.map +0 -7
- package/dist/chunk-QZKWRNIP.js.map +0 -7
- package/dist/chunk-TADVX644.js.map +0 -7
- package/dist/chunk-TGDHN4LM.js.map +0 -7
- package/dist/chunk-TYO2OVAD.js.map +0 -7
- package/dist/chunk-VCYZ3WZV.js.map +0 -7
- package/dist/chunk-VJUEZZYB.js +0 -29
- package/dist/chunk-VJUEZZYB.js.map +0 -7
- package/dist/chunk-WHOIR577.js.map +0 -7
- package/dist/chunk-XJXDOF63.js.map +0 -7
- package/dist/chunk-XTIXVJXP.js.map +0 -7
- package/dist/chunk-XWEGWYDU.js.map +0 -7
- package/dist/chunk-YWUPHRGB.js.map +0 -7
- package/dist/cli-bundled-prompts.d.ts.map +0 -1
- package/dist/cli-bundled-skills.d.ts.map +0 -1
- package/dist/cli-context.d.ts.map +0 -1
- package/dist/cli-entry-main.d.ts.map +0 -1
- package/dist/cli-entry-point.d.ts.map +0 -1
- package/dist/cli-eternal-flag.d.ts.map +0 -1
- package/dist/cli-main-GOY5YGVL.js.map +0 -7
- package/dist/cli-main-helpers.d.ts.map +0 -1
- package/dist/cli-main.d.ts.map +0 -1
- package/dist/cli-update-notice.d.ts.map +0 -1
- package/dist/config-doctor.d.ts.map +0 -1
- package/dist/config-history.d.ts.map +0 -1
- package/dist/context-limit.d.ts.map +0 -1
- package/dist/context-overflow-diagnostic.d.ts.map +0 -1
- package/dist/diag-doctor-OQ3AA63O.js.map +0 -7
- package/dist/diff-renderer.d.ts.map +0 -1
- package/dist/execute-deps.d.ts.map +0 -1
- package/dist/execution-A4PGK4XV.js.map +0 -7
- package/dist/execution-chimera-ask.d.ts +0 -10
- package/dist/execution-chimera-ask.d.ts.map +0 -1
- package/dist/execution-chimera-cascade.d.ts.map +0 -1
- package/dist/execution-cleanup.d.ts.map +0 -1
- package/dist/execution-kanban-dispatch.d.ts.map +0 -1
- package/dist/execution-repl-fleet-callbacks.d.ts.map +0 -1
- package/dist/execution-storage-observability.d.ts.map +0 -1
- package/dist/execution-tui-next-step-callbacks.d.ts.map +0 -1
- package/dist/execution.d.ts.map +0 -1
- package/dist/export-TPORYVRZ.js.map +0 -7
- package/dist/fleet/host-acp-runner-cache.d.ts.map +0 -1
- package/dist/fleet/host-acp.d.ts.map +0 -1
- package/dist/fleet/host-concurrency.d.ts.map +0 -1
- package/dist/fleet/host-context.d.ts.map +0 -1
- package/dist/fleet/host-director-builder.d.ts.map +0 -1
- package/dist/fleet/host-director-event-bridges.d.ts.map +0 -1
- package/dist/fleet/host-director-services.d.ts.map +0 -1
- package/dist/fleet/host-event-bridge.d.ts.map +0 -1
- package/dist/fleet/host-helpers.d.ts.map +0 -1
- package/dist/fleet/host-learning-tracker.d.ts.map +0 -1
- package/dist/fleet/host-learning.d.ts.map +0 -1
- package/dist/fleet/host-lifecycle-events.d.ts.map +0 -1
- package/dist/fleet/host-paths.d.ts.map +0 -1
- package/dist/fleet/host-provider.d.ts.map +0 -1
- package/dist/fleet/host-session-writer.d.ts.map +0 -1
- package/dist/fleet/host-shadow-pass.d.ts.map +0 -1
- package/dist/fleet/host-spawn-types.d.ts.map +0 -1
- package/dist/fleet/host-status.d.ts.map +0 -1
- package/dist/fleet/host-subagent-factory.d.ts.map +0 -1
- package/dist/fleet/host-supervisor.d.ts.map +0 -1
- package/dist/fleet/host-task-result-report.d.ts.map +0 -1
- package/dist/fleet/host-types.d.ts.map +0 -1
- package/dist/fleet/host.d.ts.map +0 -1
- package/dist/fleet/routing.d.ts.map +0 -1
- package/dist/fleet/status-broadcast.d.ts.map +0 -1
- package/dist/fleet/supervisor-registry.d.ts.map +0 -1
- package/dist/fleet-statusline.d.ts.map +0 -1
- package/dist/goal-host.d.ts.map +0 -1
- package/dist/hooks-wiring.d.ts.map +0 -1
- package/dist/hq-GBPGXIR5.js.map +0 -7
- package/dist/hq-command-controller.d.ts.map +0 -1
- package/dist/hq-publisher.d.ts.map +0 -1
- package/dist/hq-recovery-html.d.ts.map +0 -1
- package/dist/hq-server/audit-actor.d.ts.map +0 -1
- package/dist/hq-server/auth-state.d.ts.map +0 -1
- package/dist/hq-server/auth.d.ts.map +0 -1
- package/dist/hq-server/preflight.d.ts.map +0 -1
- package/dist/hq-server/project-root.d.ts.map +0 -1
- package/dist/hq-server/routes/auth-handlers.d.ts.map +0 -1
- package/dist/hq-server/routes/session-handlers.d.ts.map +0 -1
- package/dist/hq-server/routes/system-handlers.d.ts.map +0 -1
- package/dist/hq-server/routes.d.ts.map +0 -1
- package/dist/hq-server/snapshot.d.ts.map +0 -1
- package/dist/hq-server/startup.d.ts.map +0 -1
- package/dist/hq-server/trust-boundary.d.ts.map +0 -1
- package/dist/hq-server/types.d.ts.map +0 -1
- package/dist/hq-server/utils.d.ts.map +0 -1
- package/dist/hq-server/ws.d.ts.map +0 -1
- package/dist/hq-server-YQUUMTPU.js.map +0 -7
- package/dist/hq-server.d.ts.map +0 -1
- package/dist/hq-static-serve.d.ts.map +0 -1
- package/dist/hq-ttl-U2FAYFAT.js.map +0 -7
- package/dist/hq-tunnel-RFKGC4HI.js.map +0 -7
- package/dist/hq-tunnel.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -7
- package/dist/init-E2NDDOHI.js.map +0 -7
- package/dist/input-reader.d.ts.map +0 -1
- package/dist/kanban-dispatch-route.d.ts.map +0 -1
- package/dist/kanban-hq-sync.d.ts.map +0 -1
- package/dist/kanban-run-mirror-EKVNGXWW.js.map +0 -7
- package/dist/launch-hints.d.ts.map +0 -1
- package/dist/live-settings-input.d.ts.map +0 -1
- package/dist/mailbox-bridge-bootstrap.d.ts.map +0 -1
- package/dist/mailbox-serve-DBOOOOWZ.js.map +0 -7
- package/dist/mcp-CYLPUEHC.js.map +0 -7
- package/dist/mcp-serve.d.ts.map +0 -1
- package/dist/modeldiag-HENYJ4N7.js.map +0 -7
- package/dist/multi-agent.d.ts.map +0 -1
- package/dist/next-task-predictor.d.ts.map +0 -1
- package/dist/permission-prompt.d.ts.map +0 -1
- package/dist/permissions-FNYLZIL4.js.map +0 -7
- package/dist/picker-key-state.d.ts.map +0 -1
- package/dist/picker-model-picker.d.ts.map +0 -1
- package/dist/picker-ui.d.ts.map +0 -1
- package/dist/picker.d.ts.map +0 -1
- package/dist/plugin-api-factory.d.ts.map +0 -1
- package/dist/plugin-management.d.ts.map +0 -1
- package/dist/plugin-usage-OU6X6LM3.js.map +0 -7
- package/dist/plugins-4LJ5IUBI.js.map +0 -7
- package/dist/pre-launch/launch-prompts.d.ts.map +0 -1
- package/dist/pre-launch/project-check.d.ts.map +0 -1
- package/dist/pre-launch.d.ts.map +0 -1
- package/dist/preflight.d.ts.map +0 -1
- package/dist/profile-config-path.d.ts.map +0 -1
- package/dist/project-BLQ3ALVL.js.map +0 -7
- package/dist/project-manifest-GE25PW4S.js.map +0 -7
- package/dist/project-picker-BOCWHBXP.js.map +0 -7
- package/dist/project-picker.d.ts.map +0 -1
- package/dist/projects-XE76NFNZ.js.map +0 -7
- package/dist/provider-config-utils.d.ts.map +0 -1
- package/dist/provider-helpers.d.ts.map +0 -1
- package/dist/provider-id.d.ts.map +0 -1
- package/dist/providers-models-GDELBHZK.js.map +0 -7
- package/dist/quick-VIO2BEHS.js.map +0 -7
- package/dist/renderer.d.ts.map +0 -1
- package/dist/repl-auto-proceed.d.ts.map +0 -1
- package/dist/repl-client-registration.d.ts.map +0 -1
- package/dist/repl-input.d.ts.map +0 -1
- package/dist/repl-options.d.ts.map +0 -1
- package/dist/repl-rendering.d.ts.map +0 -1
- package/dist/repl-suggestions.d.ts.map +0 -1
- package/dist/repl.d.ts.map +0 -1
- package/dist/replay-KCTXNMZQ.js.map +0 -7
- package/dist/rewind-EJMVFVLS.js.map +0 -7
- package/dist/sdd-runtime-AIJCJGWC.js.map +0 -7
- package/dist/services/autonomy-mode.d.ts.map +0 -1
- package/dist/services/commit-message.d.ts.map +0 -1
- package/dist/services/dispatch-classifier.d.ts.map +0 -1
- package/dist/services/mcp-management.d.ts.map +0 -1
- package/dist/services/project-facts.d.ts.map +0 -1
- package/dist/services/project-manifest.d.ts.map +0 -1
- package/dist/services/sdd/project-context.d.ts.map +0 -1
- package/dist/services/sdd/spec-detection.d.ts.map +0 -1
- package/dist/services/sdd/state.d.ts.map +0 -1
- package/dist/services/sdd/task-manager.d.ts.map +0 -1
- package/dist/services/sdd-runtime.d.ts.map +0 -1
- package/dist/services/statusline-config.d.ts.map +0 -1
- package/dist/services/suggestion-store.d.ts.map +0 -1
- package/dist/session-event-wiring.d.ts.map +0 -1
- package/dist/session-stats.d.ts.map +0 -1
- package/dist/sessions-config-NLCMK3BY.js.map +0 -7
- package/dist/settings-menu.d.ts.map +0 -1
- package/dist/shutdown-cleanup.d.ts.map +0 -1
- package/dist/simpleui-dist-JIFGUJO7.js.map +0 -7
- package/dist/simpleui-dist.d.ts.map +0 -1
- package/dist/slash-commands/acp.d.ts.map +0 -1
- package/dist/slash-commands/agent-improve.d.ts.map +0 -1
- package/dist/slash-commands/agents.d.ts.map +0 -1
- package/dist/slash-commands/audit.d.ts.map +0 -1
- package/dist/slash-commands/auth.d.ts.map +0 -1
- package/dist/slash-commands/autonomy.d.ts.map +0 -1
- package/dist/slash-commands/brain.d.ts.map +0 -1
- package/dist/slash-commands/btw.d.ts.map +0 -1
- package/dist/slash-commands/clear.d.ts.map +0 -1
- package/dist/slash-commands/codebase-reindex.d.ts.map +0 -1
- package/dist/slash-commands/collab.d.ts.map +0 -1
- package/dist/slash-commands/command-context.d.ts.map +0 -1
- package/dist/slash-commands/commit-llm.d.ts.map +0 -1
- package/dist/slash-commands/compact.d.ts.map +0 -1
- package/dist/slash-commands/context.d.ts.map +0 -1
- package/dist/slash-commands/coordinator.d.ts.map +0 -1
- package/dist/slash-commands/delegate.d.ts.map +0 -1
- package/dist/slash-commands/design.d.ts.map +0 -1
- package/dist/slash-commands/dev.d.ts.map +0 -1
- package/dist/slash-commands/diag-stats.d.ts.map +0 -1
- package/dist/slash-commands/dispatch-llm.d.ts.map +0 -1
- package/dist/slash-commands/doctor.d.ts.map +0 -1
- package/dist/slash-commands/enhance.d.ts.map +0 -1
- package/dist/slash-commands/ensemble.d.ts.map +0 -1
- package/dist/slash-commands/f-keys.d.ts.map +0 -1
- package/dist/slash-commands/fallback.d.ts.map +0 -1
- package/dist/slash-commands/fix-classifier.d.ts.map +0 -1
- package/dist/slash-commands/fix.d.ts.map +0 -1
- package/dist/slash-commands/fleet.d.ts.map +0 -1
- package/dist/slash-commands/git.d.ts.map +0 -1
- package/dist/slash-commands/gitid.d.ts.map +0 -1
- package/dist/slash-commands/goal-refiner.d.ts.map +0 -1
- package/dist/slash-commands/goal.d.ts.map +0 -1
- package/dist/slash-commands/health.d.ts.map +0 -1
- package/dist/slash-commands/help.d.ts.map +0 -1
- package/dist/slash-commands/helpers.d.ts.map +0 -1
- package/dist/slash-commands/hq.d.ts.map +0 -1
- package/dist/slash-commands/index.d.ts.map +0 -1
- package/dist/slash-commands/init.d.ts.map +0 -1
- package/dist/slash-commands/interrupt.d.ts.map +0 -1
- package/dist/slash-commands/kanban-agent-helpers.d.ts.map +0 -1
- package/dist/slash-commands/kanban-format.d.ts.map +0 -1
- package/dist/slash-commands/kanban-help.d.ts.map +0 -1
- package/dist/slash-commands/kanban.d.ts.map +0 -1
- package/dist/slash-commands/mailbox-demo.d.ts.map +0 -1
- package/dist/slash-commands/mailbox-serve.d.ts.map +0 -1
- package/dist/slash-commands/mailbox.d.ts.map +0 -1
- package/dist/slash-commands/mcp-utils.d.ts.map +0 -1
- package/dist/slash-commands/mcp.d.ts.map +0 -1
- package/dist/slash-commands/memory-compact.d.ts.map +0 -1
- package/dist/slash-commands/memory-flags.d.ts.map +0 -1
- package/dist/slash-commands/memory-formatters.d.ts.map +0 -1
- package/dist/slash-commands/memory.d.ts.map +0 -1
- package/dist/slash-commands/metrics.d.ts.map +0 -1
- package/dist/slash-commands/mode.d.ts.map +0 -1
- package/dist/slash-commands/modelcaps.d.ts.map +0 -1
- package/dist/slash-commands/models.d.ts.map +0 -1
- package/dist/slash-commands/mouse.d.ts.map +0 -1
- package/dist/slash-commands/next.d.ts.map +0 -1
- package/dist/slash-commands/plan.d.ts.map +0 -1
- package/dist/slash-commands/plugin.d.ts.map +0 -1
- package/dist/slash-commands/profile.d.ts.map +0 -1
- package/dist/slash-commands/project-utils.d.ts.map +0 -1
- package/dist/slash-commands/project.d.ts.map +0 -1
- package/dist/slash-commands/provider-status.d.ts.map +0 -1
- package/dist/slash-commands/prune.d.ts.map +0 -1
- package/dist/slash-commands/refiner.d.ts.map +0 -1
- package/dist/slash-commands/review.d.ts.map +0 -1
- package/dist/slash-commands/sdd/rendering.d.ts.map +0 -1
- package/dist/slash-commands/sdd-command-helpers.d.ts.map +0 -1
- package/dist/slash-commands/sdd-format.d.ts.map +0 -1
- package/dist/slash-commands/sdd.d.ts.map +0 -1
- package/dist/slash-commands/security.d.ts.map +0 -1
- package/dist/slash-commands/session.d.ts.map +0 -1
- package/dist/slash-commands/setmodel.d.ts.map +0 -1
- package/dist/slash-commands/settings.d.ts.map +0 -1
- package/dist/slash-commands/shadow.d.ts.map +0 -1
- package/dist/slash-commands/slash-deep-help.d.ts.map +0 -1
- package/dist/slash-commands/spawn-agents.d.ts.map +0 -1
- package/dist/slash-commands/statusline.d.ts.map +0 -1
- package/dist/slash-commands/suggest.d.ts.map +0 -1
- package/dist/slash-commands/suggestion-store.d.ts.map +0 -1
- package/dist/slash-commands/supervisor.d.ts.map +0 -1
- package/dist/slash-commands/surfaces.d.ts.map +0 -1
- package/dist/slash-commands/tasks.d.ts.map +0 -1
- package/dist/slash-commands/techstack.d.ts.map +0 -1
- package/dist/slash-commands/telegram-pairing.d.ts.map +0 -1
- package/dist/slash-commands/telegram-settings.d.ts.map +0 -1
- package/dist/slash-commands/telegram-setup.d.ts.map +0 -1
- package/dist/slash-commands/todos.d.ts.map +0 -1
- package/dist/slash-commands/tool.d.ts.map +0 -1
- package/dist/slash-commands/tools.d.ts.map +0 -1
- package/dist/slash-commands/tuneup.d.ts.map +0 -1
- package/dist/slash-commands/working-dir.d.ts.map +0 -1
- package/dist/slash-commands/worktree.d.ts.map +0 -1
- package/dist/slash-commands/yolo.d.ts.map +0 -1
- package/dist/spinner.d.ts.map +0 -1
- package/dist/subcommands/contracts.d.ts.map +0 -1
- package/dist/subcommands/handlers/acp.d.ts.map +0 -1
- package/dist/subcommands/handlers/audit.d.ts.map +0 -1
- package/dist/subcommands/handlers/auth-local-help.d.ts.map +0 -1
- package/dist/subcommands/handlers/auth.d.ts.map +0 -1
- package/dist/subcommands/handlers/bench-run-help.d.ts.map +0 -1
- package/dist/subcommands/handlers/bench.d.ts.map +0 -1
- package/dist/subcommands/handlers/chronicle.d.ts.map +0 -1
- package/dist/subcommands/handlers/config-history.d.ts.map +0 -1
- package/dist/subcommands/handlers/diag-doctor.d.ts.map +0 -1
- package/dist/subcommands/handlers/export.d.ts.map +0 -1
- package/dist/subcommands/handlers/helpers.d.ts.map +0 -1
- package/dist/subcommands/handlers/hq.d.ts.map +0 -1
- package/dist/subcommands/handlers/init.d.ts.map +0 -1
- package/dist/subcommands/handlers/mailbox-serve.d.ts.map +0 -1
- package/dist/subcommands/handlers/mcp.d.ts.map +0 -1
- package/dist/subcommands/handlers/model-smoke-test.d.ts.map +0 -1
- package/dist/subcommands/handlers/modeldiag-profiles.d.ts.map +0 -1
- package/dist/subcommands/handlers/modeldiag.d.ts.map +0 -1
- package/dist/subcommands/handlers/models-add-help.d.ts.map +0 -1
- package/dist/subcommands/handlers/per-subcommand-deep-help-table.d.ts.map +0 -1
- package/dist/subcommands/handlers/per-subcommand-help-data.d.ts.map +0 -1
- package/dist/subcommands/handlers/per-subcommand-help-table.d.ts.map +0 -1
- package/dist/subcommands/handlers/per-subcommand-help-types.d.ts.map +0 -1
- package/dist/subcommands/handlers/per-subcommand-help.d.ts.map +0 -1
- package/dist/subcommands/handlers/permissions.d.ts.map +0 -1
- package/dist/subcommands/handlers/plugin-usage.d.ts.map +0 -1
- package/dist/subcommands/handlers/project.d.ts.map +0 -1
- package/dist/subcommands/handlers/projects.d.ts.map +0 -1
- package/dist/subcommands/handlers/providers-models.d.ts.map +0 -1
- package/dist/subcommands/handlers/quick.d.ts.map +0 -1
- package/dist/subcommands/handlers/replay.d.ts.map +0 -1
- package/dist/subcommands/handlers/rewind.d.ts.map +0 -1
- package/dist/subcommands/handlers/sessions-config.d.ts.map +0 -1
- package/dist/subcommands/handlers/sessions-fleet.d.ts.map +0 -1
- package/dist/subcommands/handlers/tools-skills.d.ts.map +0 -1
- package/dist/subcommands/handlers/update.d.ts.map +0 -1
- package/dist/subcommands/handlers/version-help.d.ts.map +0 -1
- package/dist/subcommands/index.d.ts.map +0 -1
- package/dist/theme.d.ts.map +0 -1
- package/dist/tools-skills-UNKLOB7M.js.map +0 -7
- package/dist/tui-thinking-word.d.ts.map +0 -1
- package/dist/tuneup.d.ts.map +0 -1
- package/dist/update-YC4TYW2Y.js.map +0 -7
- package/dist/update-check-UMYTOH7Z.js.map +0 -7
- package/dist/update-check.d.ts.map +0 -1
- package/dist/utils/delay-format.d.ts.map +0 -1
- package/dist/utils/hq-ttl.d.ts.map +0 -1
- package/dist/utils/win32-cmd.d.ts.map +0 -1
- package/dist/utils.d.ts.map +0 -1
- package/dist/version-help-DROHZRW6.js.map +0 -7
- package/dist/version.d.ts.map +0 -1
- package/dist/webui-server/client-registration.d.ts.map +0 -1
- package/dist/webui-server/connection-handler.d.ts.map +0 -1
- package/dist/webui-server/context-breakdown.d.ts.map +0 -1
- package/dist/webui-server/contracts.d.ts.map +0 -1
- package/dist/webui-server/cost-helpers.d.ts.map +0 -1
- package/dist/webui-server/kanban-host-adapter.d.ts.map +0 -1
- package/dist/webui-server/kanban-run-mirror.d.ts.map +0 -1
- package/dist/webui-server/kanban-supervisor.d.ts.map +0 -1
- package/dist/webui-server/lifecycle.d.ts.map +0 -1
- package/dist/webui-server/listen-helpers.d.ts.map +0 -1
- package/dist/webui-server/logger-shim.d.ts.map +0 -1
- package/dist/webui-server/node-pty-loader.d.ts.map +0 -1
- package/dist/webui-server/prefs-seeding.d.ts.map +0 -1
- package/dist/webui-server/privileged-actions.d.ts.map +0 -1
- package/dist/webui-server/provider-config.d.ts.map +0 -1
- package/dist/webui-server/session-start-payload.d.ts.map +0 -1
- package/dist/webui-server/setup-events.d.ts.map +0 -1
- package/dist/webui-server/static-serve.d.ts.map +0 -1
- package/dist/webui-server/stream-coalescer.d.ts.map +0 -1
- package/dist/webui-server/terminal-log-view.d.ts.map +0 -1
- package/dist/webui-server-XKFUOKMJ.js.map +0 -7
- package/dist/webui-server-options.d.ts.map +0 -1
- package/dist/webui-server.d.ts.map +0 -1
- package/dist/wiring/brain-and-orchestration.d.ts.map +0 -1
- package/dist/wiring/codebase-index.d.ts.map +0 -1
- package/dist/wiring/command-host-adapters.d.ts.map +0 -1
- package/dist/wiring/command-host-state.d.ts.map +0 -1
- package/dist/wiring/controllers.d.ts.map +0 -1
- package/dist/wiring/dep-watcher-bridge.d.ts.map +0 -1
- package/dist/wiring/dep-watcher.d.ts.map +0 -1
- package/dist/wiring/design-studio.d.ts.map +0 -1
- package/dist/wiring/director-setup.d.ts.map +0 -1
- package/dist/wiring/eternal-command-handlers.d.ts.map +0 -1
- package/dist/wiring/fleet-command-handlers.d.ts.map +0 -1
- package/dist/wiring/hq-telemetry.d.ts.map +0 -1
- package/dist/wiring/lifecycle-plugins.d.ts.map +0 -1
- package/dist/wiring/mailbox-bridge-bootstrap.d.ts.map +0 -1
- package/dist/wiring/management-tools.d.ts.map +0 -1
- package/dist/wiring/metrics.d.ts.map +0 -1
- package/dist/wiring/pipeline.d.ts.map +0 -1
- package/dist/wiring/plugins.d.ts.map +0 -1
- package/dist/wiring/provider-runtime-setup.d.ts.map +0 -1
- package/dist/wiring/provider-runtime.d.ts.map +0 -1
- package/dist/wiring/provider-status.d.ts.map +0 -1
- package/dist/wiring/provider-utility-tools.d.ts.map +0 -1
- package/dist/wiring/provider.d.ts.map +0 -1
- package/dist/wiring/replay.d.ts.map +0 -1
- package/dist/wiring/runtime-controller-deps.d.ts.map +0 -1
- package/dist/wiring/runtime-dispatch-state.d.ts.map +0 -1
- package/dist/wiring/runtime-lifecycle-deps.d.ts.map +0 -1
- package/dist/wiring/runtime-picker-deps.d.ts.map +0 -1
- package/dist/wiring/sage.d.ts.map +0 -1
- package/dist/wiring/sdd-handlers.d.ts.map +0 -1
- package/dist/wiring/security-command.d.ts.map +0 -1
- package/dist/wiring/session-command-handlers.d.ts.map +0 -1
- package/dist/wiring/session-registry.d.ts.map +0 -1
- package/dist/wiring/session.d.ts.map +0 -1
- package/dist/wiring/slash-commands.d.ts.map +0 -1
- package/dist/wiring/to-execute-deps.d.ts.map +0 -1
- package/dist/wiring/tools.d.ts.map +0 -1
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/subcommands/handlers/version-help.ts"],
|
|
4
|
-
"sourcesContent": ["import * as os from 'node:os';\nimport { color } from '@wrongstack/core/utils';\nimport { API_VERSION, CLI_VERSION } from '../../version.js';\nimport type { SubcommandHandler } from '../index.js';\n\nexport const versionCmd: SubcommandHandler = async (_args, deps) => {\n deps.renderer.write(\n `WrongStack ${CLI_VERSION} (apiVersion ${API_VERSION}, node ${process.version}, ${os.platform()})\\n`,\n );\n return 0;\n};\n\nexport const helpCmd: SubcommandHandler = async (_args, deps) => {\n const lines = [\n color.bold('WrongStack \u2014 usage'),\n '',\n ' wstack Start REPL',\n ' wstack \"<task>\" Run task and exit',\n ' wstack desktop Open WrongStack Desktop (alias: --desktop)',\n ' wstack webui Serve the project WebUI (alias: --webui)',\n ' wstack simpleui Serve the minimal chat UI (alias: --simpleui)',\n ' wstack hq Start HQ command center (alias: --hq)',\n ' wstack --eternal \"<mission>\" Launch eternal-autonomy loop against a goal \u2014 Ctrl+C to stop',\n ' wstack resume [<id>] Resume a session',\n ' wstack sessions List recent sessions',\n ' wstack auth Interactive setup + key manager (add/edit/delete)',\n ' wstack auth <provider> Add API key for a provider',\n ' wstack auth list Quick listing of saved providers and keys',\n ' wstack auth status <id> Detailed view of one provider',\n ' wstack auth remove <id> Delete a provider (asks for confirmation)',\n ' wstack auth <provider> Add a key for a provider (--label, --family, \u2026)',\n ' wstack config [show|edit] Show or edit effective config',\n ' wstack tools List registered tools',\n ' wstack skills List discovered skills',\n ' wstack providers [--all] List providers from models.dev',\n ' wstack models [<provider>] List models',\n ' wstack models refresh Force-refresh cache',\n ' wstack models add <mid> Add/override custom model (--max-context, --tools, --vision, \u2026)',\n ' wstack models remove <mid> Remove a custom model',\n ' wstack models list List all custom models',\n ' wstack mcp [list] List MCP servers',\n ' wstack plugin [list|report|menu|official|install|toggle|remove|enable|disable] Manage plugins',\n ' wstack project id|init|rekey Manage the committed repository identity',\n ' wstack projects List tracked projects',\n ' wstack diag Full diagnostics',\n ' wstack doctor Health checks',\n ' wstack export <id> [opts] Render a session',\n ' wstack usage Token + cost summary',\n ' wstack version Print version',\n '',\n color.bold('Common flags'),\n ' --yolo / --no-yolo Force auto-approval on or off at startup',\n ' --confirm-destructive Deprecated \u2014 YOLO no longer prompts by destructiveness',\n ' --yolo-destructive Deprecated compatibility flag; YOLO no longer prompts by destructiveness',\n ' --tui / --no-tui Force or disable TUI mode',\n ' --mouse Full mouse mode in the TUI (in-app scroll + clickable UI)',\n ' --desktop Open WrongStack Desktop (requires @wrongstack/desktop)',\n ' --hq [--host <h>] [--port <n>] [--password <secret>] [--tunnel] [--open]',\n ' Start HQ; --tunnel publishes a temporary HTTPS URL',\n ' --webui [--host <h>] [--port <n>] [--webui-token <t>] [--open]',\n ' [--webui-public-url <url>] [--webui-public-ws-url <url>] [--webui-require-token]',\n ' Serve the browser UI + WS bridge (prints a token URL,',\n \" --open pops the browser; shares this terminal's agent)\",\n ' --simpleui [same network flags as --webui] [--open]',\n ' Serve the independent minimal chat UI',\n ' --full-auto SimpleUI: runtime-only YOLO + Director + autonomy override',\n ' --eternal \"<mission>\" Start an eternal-autonomy loop',\n ' --no-hints Hide launch hints',\n ' --skip-index Skip codebase indexing on startup',\n ' --chimera-auto-fix off|ask|auto',\n ' How to handle Chimera review findings (default: config value)',\n ];\n deps.renderer.write(lines.join('\\n') + '\\n');\n return 0;\n};\n"],
|
|
5
|
-
"mappings": ";;;;;;;AAAA,YAAY,QAAQ;AACpB,SAAS,aAAa;AAIf,IAAM,aAAgC,OAAO,OAAO,SAAS;AAClE,OAAK,SAAS;AAAA,IACZ,cAAc,WAAW,gBAAgB,WAAW,UAAU,QAAQ,OAAO,KAAQ,YAAS,CAAC;AAAA;AAAA,EACjG;AACA,SAAO;AACT;AAEO,IAAM,UAA6B,OAAO,OAAO,SAAS;AAC/D,QAAM,QAAQ;AAAA,IACZ,MAAM,KAAK,yBAAoB;AAAA,IAC/B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM,KAAK,cAAc;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,OAAK,SAAS,MAAM,MAAM,KAAK,IAAI,IAAI,IAAI;AAC3C,SAAO;AACT;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/subcommands/handlers/update.ts"],
|
|
4
|
-
"sourcesContent": ["import { spawn } from 'node:child_process';\nimport { existsSync, realpathSync } from 'node:fs';\nimport type { TerminalRenderer } from '../../renderer.js';\nimport { checkForUpdate, type UpdatePackageName } from '../../update-check.js';\nimport { buildWin32CmdShimInvocation } from '../../utils/win32-cmd.js';\nimport type { SubcommandDeps, SubcommandHandler } from '../index.js';\n\ntype PackageManager = 'npm' | 'pnpm' | 'yarn' | 'bun';\n\ninterface ParsedUpdateArgs {\n checkOnly: boolean;\n packageManager: PackageManager | undefined;\n /** Default false \u2014 pass --ignore-scripts to the package manager. */\n allowScripts: boolean;\n error: string | undefined;\n}\n\ninterface UpdateCommand {\n executable: string;\n args: string[];\n display: string;\n windowsVerbatimArguments?: true | undefined;\n}\n\ninterface UpdateProcessResult {\n code: number | null;\n signal: NodeJS.Signals | null;\n stdout: string;\n stderr: string;\n}\n\nconst MAX_UPDATE_OUTPUT_CHARS = 256 * 1024;\n\nexport interface UpdateCommandDeps {\n cwd: string;\n userHome: string;\n renderer: Pick<TerminalRenderer, 'write'>;\n flags?: SubcommandDeps['flags'] | undefined;\n}\n\n/** `wrongstack update` \u2014 Update the CLI via the detected global package manager. */\nexport async function runUpdateCommand(args: string[], deps: UpdateCommandDeps): Promise<number> {\n const cwd = deps.cwd;\n\n if (deps.flags?.['help'] === true || deps.flags?.['help'] === 'true') {\n writeUpdateUsage(deps.renderer);\n return 0;\n }\n const unsupportedFlag = Object.keys(deps.flags ?? {}).find(\n (flag) =>\n ![\n 'check-only',\n 'c',\n 'pm',\n 'package-manager',\n 'allow-scripts',\n 'lifecycle-scripts',\n 'npm',\n 'pnpm',\n 'yarn',\n 'bun',\n 'help',\n 'no-banner',\n 'verbose',\n 'trace',\n ].includes(flag),\n );\n if (unsupportedFlag) {\n deps.renderer.write(`Unknown update option: --${unsupportedFlag}\\n`);\n writeUpdateUsage(deps.renderer);\n return 1;\n }\n\n const parsed = parseUpdateArgs(mergeUpdateArgs(args, deps.flags));\n if (parsed.error) {\n deps.renderer.write(`${parsed.error}\\n`);\n writeUpdateUsage(deps.renderer);\n return 1;\n }\n\n const packageName = detectUpdatePackageName();\n const info = await checkForUpdate({\n packageName,\n forceRefresh: true,\n homeFn: () => deps.userHome,\n });\n\n if (info.checkFailed) {\n deps.renderer.write(\n `Update check failed for ${packageName}. Check your internet connection and try again.\\n`,\n );\n return 1;\n }\n\n if (parsed.checkOnly) {\n if (info.outdated) {\n deps.renderer.write(`Update available: v${info.current} \u2192 v${info.latest}\\n`);\n } else {\n deps.renderer.write(`You are on the latest version: v${info.current}\\n`);\n }\n return 0;\n }\n\n if (!info.outdated) {\n deps.renderer.write(`You are already on the latest version: v${info.current}\\n`);\n return 0;\n }\n\n const packageManager = parsed.packageManager ?? detectUpdatePackageManager();\n const updateCommand = buildUpdateCommand(packageManager, packageName, info.latest, {\n allowScripts: parsed.allowScripts,\n });\n\n deps.renderer.write(`Updating wrongstack from v${info.current} to v${info.latest}...\\n`);\n deps.renderer.write(`Running: ${updateCommand.display}\\n`);\n\n try {\n const result = await new Promise<UpdateProcessResult>((resolve, reject) => {\n const child = spawn(updateCommand.executable, updateCommand.args, {\n cwd,\n stdio: 'pipe',\n signal: AbortSignal.timeout(120_000),\n windowsHide: true,\n ...(updateCommand.windowsVerbatimArguments\n ? { windowsVerbatimArguments: updateCommand.windowsVerbatimArguments }\n : {}),\n });\n let stdout = '';\n let stderr = '';\n child.stdout?.on('data', (data) => {\n stdout = appendOutputTail(stdout, data);\n });\n child.stderr?.on('data', (data) => {\n stderr = appendOutputTail(stderr, data);\n });\n child.on('error', reject);\n child.on('close', (code, signal) => resolve({ code, signal, stdout, stderr }));\n });\n\n if (result.code === 0 && result.signal === null) {\n deps.renderer.write(\n `\\nUpdated to v${info.latest}. Restart wrongstack to use the new version.\\n`,\n );\n const warning = installWarningSummary(`${result.stderr}\\n${result.stdout}`);\n if (warning) deps.renderer.write(`\\n${warning}\\n`);\n } else {\n // A bare \"exit code 243\" is opaque \u2014 npm's actual reason (EACCES, a custom\n // prefix it can't write, a pnpm/yarn/bun global that npm doesn't own) lives\n // in stderr. Surface it, then show pinned equivalent commands.\n const termination =\n result.code === null\n ? `terminated by ${result.signal ?? 'an unknown signal'}`\n : `failed with exit code ${result.code}`;\n deps.renderer.write(`\\nUpdate ${termination}.\\n`);\n const detail = `${result.stderr}\\n${result.stdout}`.trim();\n if (detail) deps.renderer.write(`\\n${detail}\\n`);\n deps.renderer.write(\n `\\nTry the matching global update command manually:\\n ${updateCommand.display}\\n` +\n otherManagerCommands(packageManager, packageName, info.latest, {\n allowScripts: parsed.allowScripts,\n }),\n );\n }\n return result.code ?? 1;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (msg.includes('ENOENT')) {\n deps.renderer.write(`\\nUpdate failed: ${packageManager} not found in PATH.\\n`);\n return 1;\n }\n deps.renderer.write(`\\nUpdate failed: ${msg}\\n`);\n return 1;\n }\n}\n\nexport const updateCmd: SubcommandHandler = async (args, deps) => runUpdateCommand(args, deps);\n\nfunction writeUpdateUsage(renderer: Pick<TerminalRenderer, 'write'>): void {\n renderer.write(\n 'Usage: wrongstack update [--check-only] [--pm npm|pnpm|yarn|bun] [--allow-scripts]\\n',\n );\n}\n\n/** Rehydrate update flags stripped by the top-level parser before subcommand dispatch. */\nfunction mergeUpdateArgs(args: string[], flags: SubcommandDeps['flags'] | undefined): string[] {\n const merged = [...args];\n if (!flags) return merged;\n\n const addBoolean = (name: string, alias = name): void => {\n if (flags[name] === true || flags[name] === 'true') merged.push(`--${alias}`);\n };\n addBoolean('check-only');\n if (flags['c'] === true || flags['c'] === 'true') merged.push('-c');\n addBoolean('allow-scripts');\n addBoolean('lifecycle-scripts');\n for (const pm of ['npm', 'pnpm', 'yarn', 'bun'] as const) addBoolean(pm);\n\n const pmFlag = flags['pm'] ?? flags['package-manager'];\n if (typeof pmFlag === 'string') merged.push('--pm', pmFlag);\n else if (pmFlag === true) merged.push('--pm');\n return merged;\n}\n\nfunction parseUpdateArgs(args: string[]): ParsedUpdateArgs {\n let checkOnly = false;\n let packageManager: PackageManager | undefined;\n let allowScripts = false;\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === undefined) continue;\n if (arg === '--check-only' || arg === '-c') {\n checkOnly = true;\n continue;\n }\n if (arg === '--pm' || arg === '--package-manager') {\n const value = args[++i];\n const pm = parsePackageManager(value);\n if (!pm)\n return {\n checkOnly,\n packageManager,\n allowScripts,\n error: `Invalid package manager: ${value ?? '<missing>'}`,\n };\n packageManager = pm;\n continue;\n }\n const pmEq = arg.match(/^--(?:pm|package-manager)=(.+)$/)?.[1];\n if (pmEq) {\n const pm = parsePackageManager(pmEq);\n if (!pm)\n return { checkOnly, packageManager, allowScripts, error: `Invalid package manager: ${pmEq}` };\n packageManager = pm;\n continue;\n }\n const shorthand = arg.match(/^--(npm|pnpm|yarn|bun)$/)?.[1];\n if (shorthand) {\n packageManager = shorthand as PackageManager;\n }\n if (arg === '--allow-scripts' || arg === '--lifecycle-scripts') {\n allowScripts = true;\n }\n }\n\n return { checkOnly, packageManager, allowScripts, error: undefined };\n}\n\nfunction parsePackageManager(value: string | undefined): PackageManager | undefined {\n if (value === 'npm' || value === 'pnpm' || value === 'yarn' || value === 'bun') return value;\n return undefined;\n}\n\nexport function detectUpdatePackageManager(\n env: NodeJS.ProcessEnv = process.env,\n argv: string[] = process.argv,\n): PackageManager {\n const forced = parsePackageManager(env.WRONGSTACK_UPDATE_PM);\n if (forced) return forced;\n\n const userAgent = env.npm_config_user_agent ?? '';\n if (/\\bpnpm\\//i.test(userAgent)) return 'pnpm';\n if (/\\byarn\\//i.test(userAgent)) return 'yarn';\n if (/\\bbun\\//i.test(userAgent)) return 'bun';\n if (/\\bnpm\\//i.test(userAgent)) return 'npm';\n\n const execPath = `${env.npm_execpath ?? ''} ${argv[1] ?? ''}`;\n const realPaths = [env.npm_execpath, argv[1]]\n .filter((p): p is string => typeof p === 'string' && p.length > 0)\n .map((p) => {\n try {\n return existsSync(p) ? realpathSync(p) : p;\n } catch {\n return p;\n }\n })\n .join(' ');\n const hint = `${execPath} ${realPaths}`.replace(/\\\\/g, '/').toLowerCase();\n if (hint.includes('/pnpm/') || hint.includes('/.pnpm/') || hint.includes('pnpm-global'))\n return 'pnpm';\n if (hint.includes('/yarn/') || hint.includes('/.yarn/')) return 'yarn';\n if (hint.includes('/bun/') || hint.includes('/.bun/')) return 'bun';\n return 'npm';\n}\n\n/** Detect whether the running binary belongs to the umbrella or direct CLI package. */\nexport function detectUpdatePackageName(argv: string[] = process.argv): UpdatePackageName {\n const entry = (argv[1] ?? '').replace(/\\\\/g, '/').toLowerCase();\n return entry.includes('/node_modules/@wrongstack/cli/') || entry.includes('/packages/cli/dist/')\n ? '@wrongstack/cli'\n : 'wrongstack';\n}\n\nfunction buildUpdateCommand(\n packageManager: PackageManager,\n packageName: UpdatePackageName,\n version: string,\n opts: { allowScripts: boolean } = { allowScripts: false },\n): UpdateCommand {\n // Default to --ignore-scripts so a compromised `wrongstack@latest` cannot\n // run arbitrary code in the user's postinstall. Opt back in with\n // --allow-scripts for the legacy behavior. The flag is supported on all\n // four managers (`npm install -g`, `pnpm add -g`, `yarn global add`,\n // `bun add -g`).\n const ignoreScripts = !opts.allowScripts;\n const target = `${packageName}@${version}`;\n switch (packageManager) {\n case 'pnpm':\n return command(\n packageManager,\n ignoreScripts ? ['add', '-g', '--ignore-scripts', target] : ['add', '-g', target],\n );\n case 'yarn':\n return command(\n packageManager,\n ignoreScripts\n ? ['global', 'add', '--ignore-scripts', target]\n : ['global', 'add', target],\n );\n case 'bun':\n return command(\n packageManager,\n ignoreScripts ? ['add', '-g', '--ignore-scripts', target] : ['add', '-g', target],\n );\n case 'npm':\n return command(\n packageManager,\n ignoreScripts\n ? ['install', '-g', '--ignore-scripts', target]\n : ['install', '-g', target],\n );\n }\n}\n\nfunction command(pm: PackageManager, args: string[]): UpdateCommand {\n const display = `${pm} ${args.join(' ')}`;\n if (process.platform === 'win32' && pm !== 'bun') {\n const shim = buildWin32CmdShimInvocation(pm, args);\n return {\n executable: shim.command,\n args: shim.args,\n display,\n windowsVerbatimArguments: shim.windowsVerbatimArguments,\n };\n }\n return { executable: pm, args, display };\n}\n\nfunction otherManagerCommands(\n selected: PackageManager,\n packageName: UpdatePackageName,\n version: string,\n opts: { allowScripts: boolean } = { allowScripts: false },\n): string {\n const commands = (['npm', 'pnpm', 'yarn', 'bun'] as const)\n .filter((pm) => pm !== selected)\n .map((pm) => ` ${buildUpdateCommand(pm, packageName, version, opts).display}`);\n return commands.length > 0 ? `\\nOther package managers:\\n${commands.join('\\n')}\\n` : '';\n}\n\nfunction appendOutputTail(current: string, chunk: unknown): string {\n const next = current + String(chunk);\n return next.length <= MAX_UPDATE_OUTPUT_CHARS\n ? next\n : next.slice(next.length - MAX_UPDATE_OUTPUT_CHARS);\n}\n\nfunction installWarningSummary(output: string): string | null {\n if (!/allow-scripts|allowScripts/i.test(output)) return null;\n return (\n 'Install completed, but npm reported blocked lifecycle scripts. If a native optional ' +\n 'feature is missing, rerun the update with npm script approval for the named package.'\n );\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/acp-registry-cache.ts", "../src/shutdown-cleanup.ts", "../src/wiring/provider.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Local cache for the official ACP registry snapshot.\n *\n * `wstack acp sync` / `/acp sync` call `refreshAcpRegistry`, which fetches the\n * CDN snapshot (via `@wrongstack/acp`'s `fetchAcpRegistry`) and writes it to\n * `~/.wrongstack/cache/acp-registry.json`. `loadCachedAcpRegistry` reads it\n * back into the `AcpLiveCatalog` shape the resolver consumes. No network at\n * load time; resolution falls back to the bundled static catalog when no\n * cache exists.\n */\nimport {\n type ACPAgentDescriptor,\n type AcpLiveCatalog,\n fetchAcpRegistry,\n} from '@wrongstack/acp';\nimport type { WstackPaths } from '@wrongstack/core/utils';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\n\ninterface CacheEnvelope {\n fetchedAt: string;\n agents: ACPAgentDescriptor[];\n}\n\nexport interface LoadedAcpRegistry {\n fetchedAt: string;\n /** Resolver input: registry-id \u2192 spawn command. */\n byId: AcpLiveCatalog;\n /** Full descriptors, for listing. */\n agents: ACPAgentDescriptor[];\n}\n\n/** Where the synced registry snapshot lives. */\nexport function acpRegistryCachePath(paths: WstackPaths): string {\n return path.join(paths.cacheDir, 'acp-registry.json');\n}\n\n/** Read the cached registry, or `null` if it's missing or unreadable. */\nexport async function loadCachedAcpRegistry(\n paths: WstackPaths,\n): Promise<LoadedAcpRegistry | null> {\n try {\n const raw = await fs.readFile(acpRegistryCachePath(paths), 'utf8');\n const env = JSON.parse(raw) as CacheEnvelope;\n if (!Array.isArray(env.agents)) return null;\n const byId: AcpLiveCatalog = {};\n for (const a of env.agents) {\n if (!a?.id || !a.acp?.command) continue;\n byId[a.id] = {\n command: a.acp.command,\n args: a.acp.args ?? [],\n ...(a.acp.env ? { env: a.acp.env } : {}),\n };\n }\n return { fetchedAt: env.fetchedAt ?? '', byId, agents: env.agents };\n } catch {\n return null;\n }\n}\n\n/** Fetch the live registry and persist it. Throws on network/parse failure. */\nexport async function refreshAcpRegistry(\n paths: WstackPaths,\n opts?: { signal?: AbortSignal; timeoutMs?: number },\n): Promise<{ count: number; location: string; fetchedAt: string }> {\n const result = await fetchAcpRegistry({\n ...(opts?.signal ? { signal: opts.signal } : {}),\n ...(opts?.timeoutMs ? { timeoutMs: opts.timeoutMs } : {}),\n });\n const location = acpRegistryCachePath(paths);\n await fs.mkdir(path.dirname(location), { recursive: true });\n const env: CacheEnvelope = { fetchedAt: result.fetchedAt, agents: result.agents };\n await fs.writeFile(location, JSON.stringify(env), 'utf8');\n return { count: result.agents.length, location, fetchedAt: result.fetchedAt };\n}\n", "/**\n * Graceful shutdown for the CLI host process.\n *\n * Bug history: cli-main.ts used to call `process.exit(0)` immediately in its\n * SIGINT/SIGTERM handlers, after kicking off async cleanup with `void\n * cleanup()`. The async work (most importantly `registry.markClosing()`, an\n * awaited atomic disk write) was being cut off \u2014 leaving the cross-process\n * session registry thinking the host was still alive after Ctrl+C.\n *\n * This helper is the same pattern `webui-server/lifecycle.ts` uses\n * (`createWebuiShutdown`) and `cli-entry-point.ts` uses for its natural-exit\n * drain: idempotent guard, await the work, set `exitCode`, give the event\n * loop a bounded grace period, then force exit. A repeated signal that\n * somehow re-fires our handler (e.g. someone re-installs it, or the\n * `beforeExit` and a `SIGINT` race) short-circuits to immediate exit instead\n * of waiting for the cleanup to settle a second time.\n *\n * The cleanup function is responsible for whatever the caller needs to flush\n * \u2014 registry writes, unsubscribe, dispose, etc. The wrapper only handles the\n * process-exit handshake around it.\n */\n\nexport interface ShutdownCleanup {\n /**\n * Async cleanup. Called exactly once across all signals. May throw \u2014 errors\n * are swallowed so a stuck cleanup can't wedge the exit path.\n */\n run: () => Promise<void>;\n /** Exit code to use on a clean shutdown (default 0). */\n exitCode?: number;\n}\n\nexport interface ShutdownHandle {\n /** Install SIGINT + SIGTERM + beforeExit listeners. Idempotent. */\n install: () => void;\n /** Uninstall listeners (for tests). */\n uninstall: () => void;\n /** True iff cleanup has been kicked off (by any signal). */\n get cleanupStarted(): boolean;\n}\n\n/**\n * Build a graceful-shutdown handle. Pass the cleanup function; the wrapper\n * installs signal handlers that call it once and let the event loop drain.\n */\nexport function createGracefulShutdown(cleanup: ShutdownCleanup): ShutdownHandle {\n const exitCode = cleanup.exitCode ?? 0;\n let started = false;\n let installed = false;\n\n const runOnce = (force: boolean): void => {\n if (started) {\n if (force) process.exit(exitCode);\n return;\n }\n started = true;\n void cleanup\n .run()\n .catch(() => {\n /* swallow \u2014 a stuck cleanup cannot wedge the exit path */\n })\n .finally(() => {\n if (force) {\n // SIGINT/SIGTERM path: set exitCode and let Node drain naturally,\n // then force exit after a 500ms grace. Matches cli-entry-point.ts.\n process.exitCode = exitCode;\n const t = setTimeout(() => process.exit(exitCode), 500);\n // Allow the timer to be cleared by Node's normal exit drain if the\n // loop empties before it fires. unref prevents it from holding the\n // loop open by itself.\n t.unref();\n }\n // beforeExit path: do nothing further \u2014 Node is already draining.\n });\n };\n\n const signalHandler = (): void => runOnce(true);\n const beforeExitHandler = (): void => runOnce(false);\n\n return {\n install() {\n if (installed) return;\n installed = true;\n process.once('SIGINT', signalHandler);\n process.once('SIGTERM', signalHandler);\n process.once('beforeExit', beforeExitHandler);\n },\n uninstall() {\n if (!installed) return;\n installed = false;\n process.removeListener('SIGINT', signalHandler);\n process.removeListener('SIGTERM', signalHandler);\n process.removeListener('beforeExit', beforeExitHandler);\n },\n get cleanupStarted() {\n return started;\n },\n };\n}", "import type { ResolvedProvider } from '@wrongstack/core/types';\nimport { ConfigError, type Config, type Logger, type ModelsRegistry } from '@wrongstack/core/types';\nimport { ProviderRegistry } from '@wrongstack/core/registry';\nimport {\n buildProviderFactoriesFromRegistry,\n installCatalogModelOutputLimits,\n makeProviderFromConfig,\n withCatalogCapabilities,\n} from '@wrongstack/providers';\nimport {\n fallbackCodexProviderModels,\n filterCurrentCodexModelIds,\n isCodexCatalogModel,\n} from '../auth-menu/openai-codex-oauth.js';\n\nexport interface ProviderSetupResult {\n resolvedProvider: ResolvedProvider | undefined;\n provider: ReturnType<ProviderRegistry['create']>;\n providerRegistry: ProviderRegistry;\n}\n\nexport async function setupProvider(params: {\n config: Config;\n modelsRegistry: ModelsRegistry;\n logger: Logger;\n}): Promise<ProviderSetupResult> {\n const { config, modelsRegistry, logger } = params;\n\n // Resolve provider details from models.dev.\n const savedProviderCfg = config.providers?.[config.provider];\n let resolvedProvider = await modelsRegistry.getProvider(config.provider).catch(() => undefined);\n if (!resolvedProvider && savedProviderCfg?.type && savedProviderCfg.type !== config.provider) {\n resolvedProvider = await modelsRegistry\n .getProvider(savedProviderCfg.type)\n .catch(() => undefined);\n }\n if (!resolvedProvider) {\n if (savedProviderCfg?.family) {\n // Config-only provider not in the models.dev catalog \u2014 e.g. the OAuth\n // subscription families (openai-codex, anthropic-oauth, github-copilot)\n // or any user-defined provider with an explicit `family`. Synthesize a\n // ResolvedProvider from config so boot proceeds (the actual transport is\n // still built below via makeProviderFromConfig / the registry).\n // When the saved config carries no models but the family is one of\n // the OAuth/subscription wire families, seed with the canonical\n // model list so the provider shows up in pickers and the WebUI.\n const family = savedProviderCfg.family;\n const savedModels = savedProviderCfg.models;\n let models: Array<{ id: string; name: string }>;\n if (savedModels && savedModels.length > 0) {\n models = savedModels.map((m) => ({ id: m, name: m }));\n } else if (family === 'openai-codex') {\n // Resolve from the models.dev catalog: pick all models with\n // family=gpt-codex* under the `openai` provider. When the\n // catalog is unavailable, fall back to the documented defaults.\n const openaiProvider = await modelsRegistry.getProvider('openai').catch(() => undefined);\n if (openaiProvider) {\n const catalogById = new Map(\n openaiProvider.models\n .filter(isCodexCatalogModel)\n .map((m) => [m.id, { id: m.id, name: m.name }] as const),\n );\n const catalogModels = filterCurrentCodexModelIds(catalogById.keys())\n .map((id) => catalogById.get(id))\n .filter((m): m is { id: string; name: string } => Boolean(m));\n if (catalogModels.length > 0) {\n models = catalogModels;\n } else {\n models = fallbackCodexProviderModels();\n }\n } else {\n models = fallbackCodexProviderModels();\n }\n } else {\n models = [];\n }\n\n resolvedProvider = {\n id: config.provider,\n name: config.provider,\n family,\n apiBase: savedProviderCfg.baseUrl,\n envVars: savedProviderCfg.envVars ?? [],\n models,\n npm: undefined,\n };\n } else {\n logger.warn(\n `Provider \"${config.provider}\" not found in models.dev. Continuing with raw config.`,\n );\n }\n } else if (resolvedProvider.family === 'unsupported' && !savedProviderCfg?.family) {\n throw new ConfigError({\n message:\n `Provider \"${config.provider}\" uses an unsupported wire family (${resolvedProvider.npm}). ` +\n `Install a plugin to enable it, or pick a different provider.`,\n code: 'CONFIG_INVALID',\n context: { provider: config.provider, family: resolvedProvider.npm, kind: 'unsupported' },\n });\n }\n\n // Per-request output ceilings. The capability overlay below is resolved\n // ONCE, for `config.model`; this index is keyed on the model of the request\n // being built, so `/model` switches, fallback hops and subagents running a\n // model-matrix entry all get their own model's `limit.output` instead of the\n // adapters' 8192 last-resort literal.\n if (config.features.modelsRegistry) {\n await installCatalogModelOutputLimits({\n registry: modelsRegistry,\n getConfig: () => config,\n log: (message) => logger.debug(message),\n });\n }\n\n // Provider registry \u2014 populated dynamically from models.dev catalog.\n const providerRegistry = new ProviderRegistry();\n if (config.features.modelsRegistry) {\n try {\n const factories = await buildProviderFactoriesFromRegistry({\n registry: modelsRegistry,\n log: logger,\n });\n for (const f of factories) providerRegistry.register(f);\n } catch (err) {\n throw new ConfigError({\n message:\n `Failed to load models.dev registry: ${err instanceof Error ? err.message : err}\\n` +\n `Try \\`wstack models refresh\\` once you have network access, or run with --no-features.`,\n code: 'CONFIG_INVALID',\n context: { phase: 'registry-build', provider: config.provider },\n cause: err,\n });\n }\n }\n\n // Provider instance \u2014 registry-driven by default, falls through to config-only.\n const providerConfig = config.providers?.[config.provider] ?? {\n type: config.provider,\n apiKey: config.apiKey,\n baseUrl: config.baseUrl,\n };\n let provider: ReturnType<ProviderRegistry['create']>;\n try {\n const cfgWithType = { ...providerConfig, type: config.provider };\n if (config.features.modelsRegistry && providerRegistry.has(config.provider)) {\n provider = providerRegistry.create(cfgWithType);\n } else {\n provider = makeProviderFromConfig(config.provider, cfgWithType);\n }\n } catch (err) {\n throw new ConfigError({\n message: `Failed to create provider: ${err instanceof Error ? err.message : err}`,\n code: 'CONFIG_INVALID',\n context: { phase: 'provider-create', provider: config.provider },\n cause: err,\n });\n }\n\n // Resolve per-model capabilities (maxOutput, maxContext, etc.) from the\n // models.dev catalog and overlay them on the provider's family baseline.\n // Without this step `provider.capabilities.maxOutput` stays at the\n // family default \u2014 and Chimera / other subagents would default to a\n // conservative 8K instead of the model's actual output ceiling.\n //\n // The overlay helper is exported from @wrongstack/providers so the\n // same resolution rules (customCaps \u2192 catalog \u2192 base) are shared with\n // any other caller that constructs a Provider post-init. Failures\n // inside are swallowed inside the helper \u2014 the family default stands\n // and the per-request output-limit lookup installed above still resolves\n // the ceiling from the catalog.\n if (config.features.modelsRegistry) {\n provider = await withCatalogCapabilities(\n modelsRegistry,\n config.provider,\n provider,\n { ...providerConfig, type: config.provider, model: config.model },\n logger,\n );\n }\n\n return { resolvedProvider, provider, providerRegistry };\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/utils/hq-ttl.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Shared TTL (time-to-live) duration parser.\n *\n * Accepts:\n * \"1h\" \u2192 1 hour\n * \"7d\" \u2192 7 days\n * \"30m\" \u2192 30 minutes\n * \"3600s\" \u2192 1 hour\n * \"86400000\" \u2192 1 day (bare milliseconds)\n *\n * Compound durations (\"1h30m\") are intentionally NOT supported \u2014 a single\n * unit is always sufficient for a rotation cadence.\n *\n * @module cli/utils/hq-ttl\n */\n\nconst TTL_UNIT_MS: Record<string, number> = {\n ms: 1,\n s: 1_000,\n m: 60_000,\n h: 3_600_000,\n d: 86_400_000,\n w: 604_800_000,\n};\n\nexport interface ParsedTtl {\n value?: number | undefined;\n error?: string | undefined;\n}\n\nexport function parseTokenTtlValue(raw: string): ParsedTtl {\n const trimmed = raw.trim();\n if (trimmed.length === 0) {\n return { error: 'TTL value is empty' };\n }\n // Bare integer \u2192 milliseconds.\n if (/^\\d+$/.test(trimmed)) {\n const ms = Number.parseInt(trimmed, 10);\n if (!Number.isFinite(ms) || ms <= 0) {\n return { error: `TTL value must be positive (got ${raw})` };\n }\n return { value: ms };\n }\n // <number><unit> \u2014 capture the trailing unit suffix.\n const match = /^(?<value>\\d+)(?<unit>ms|s|m|h|d|w)$/i.exec(trimmed);\n if (match?.groups) {\n const value = Number.parseInt(match.groups.value!, 10);\n const unit = match.groups.unit!.toLowerCase();\n const multiplier = TTL_UNIT_MS[unit];\n if (!Number.isFinite(value) || value <= 0 || multiplier === undefined) {\n return { error: `TTL value must be positive with a valid unit (got ${raw})` };\n }\n return { value: value * multiplier };\n }\n return {\n error:\n `TTL must be a positive integer (milliseconds) or <number><unit> ` +\n `where unit is one of ms, s, m, h, d, w (got ${raw})`,\n };\n}\n"],
|
|
5
|
-
"mappings": ";;;AAgBA,IAAM,cAAsC;AAAA,EAC1C,IAAI;AAAA,EACJ,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL;AAOO,SAAS,mBAAmB,KAAwB;AACzD,QAAM,UAAU,IAAI,KAAK;AACzB,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO,EAAE,OAAO,qBAAqB;AAAA,EACvC;AAEA,MAAI,QAAQ,KAAK,OAAO,GAAG;AACzB,UAAM,KAAK,OAAO,SAAS,SAAS,EAAE;AACtC,QAAI,CAAC,OAAO,SAAS,EAAE,KAAK,MAAM,GAAG;AACnC,aAAO,EAAE,OAAO,mCAAmC,GAAG,IAAI;AAAA,IAC5D;AACA,WAAO,EAAE,OAAO,GAAG;AAAA,EACrB;AAEA,QAAM,QAAQ,wCAAwC,KAAK,OAAO;AAClE,MAAI,OAAO,QAAQ;AACjB,UAAM,QAAQ,OAAO,SAAS,MAAM,OAAO,OAAQ,EAAE;AACrD,UAAM,OAAO,MAAM,OAAO,KAAM,YAAY;AAC5C,UAAM,aAAa,YAAY,IAAI;AACnC,QAAI,CAAC,OAAO,SAAS,KAAK,KAAK,SAAS,KAAK,eAAe,QAAW;AACrE,aAAO,EAAE,OAAO,qDAAqD,GAAG,IAAI;AAAA,IAC9E;AACA,WAAO,EAAE,OAAO,QAAQ,WAAW;AAAA,EACrC;AACA,SAAO;AAAA,IACL,OACE,+GAC+C,GAAG;AAAA,EACtD;AACF;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/profile-config-path.ts"],
|
|
4
|
-
"sourcesContent": ["import type { Config } from '@wrongstack/core/types';\nimport type { WstackPaths } from '@wrongstack/core/utils';\n\n/** Resolve the selected profile without ever treating the root bootstrap as settings. */\nexport function activeProfileName(config: Pick<Config, 'activeProfile'>): string {\n return typeof config.activeProfile === 'string' && config.activeProfile.trim()\n ? config.activeProfile\n : 'default';\n}\n\n/** Canonical settings file for the currently selected profile. */\nexport function activeProfileConfigPath(\n paths: Pick<WstackPaths, 'profileConfig'>,\n config: Pick<Config, 'activeProfile'>,\n): string {\n return paths.profileConfig(activeProfileName(config));\n}\n"],
|
|
5
|
-
"mappings": ";;;AAIO,SAAS,kBAAkB,QAA+C;AAC/E,SAAO,OAAO,OAAO,kBAAkB,YAAY,OAAO,cAAc,KAAK,IACzE,OAAO,gBACP;AACN;AAGO,SAAS,wBACd,OACA,QACQ;AACR,SAAO,MAAM,cAAc,kBAAkB,MAAM,CAAC;AACtD;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/update-check.ts"],
|
|
4
|
-
"sourcesContent": ["import * as fs from 'node:fs/promises';\nimport { createRequire } from 'node:module';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { FetchError } from '@wrongstack/core/types';\nimport { resolveWstackPaths } from '@wrongstack/core/utils';\n\nexport interface UpdateInfo {\n current: string;\n latest: string;\n outdated: boolean;\n checkFailed: boolean;\n}\n\ntype HomeDirFn = () => string;\nconst defaultHomeDir: HomeDirFn = () => os.homedir();\n\nexport type UpdatePackageName = 'wrongstack' | '@wrongstack/cli';\n\n/** npm registry endpoint used for self-update version checks. */\nfunction npmRegistryUrl(packageName: UpdatePackageName): string {\n return `https://registry.npmjs.org/${encodeURIComponent(packageName)}/latest`;\n}\n\n/** Cache file path \u2014 homeFn is injectable for testing */\nexport function cachePath(homeFn: HomeDirFn = defaultHomeDir): string {\n const paths =\n homeFn === defaultHomeDir\n ? resolveWstackPaths({ projectRoot: process.cwd() })\n : resolveWstackPaths({ projectRoot: process.cwd(), userHome: homeFn() });\n return paths.profileUpdateCache(paths.profileName);\n}\n\n/** 24-hour TTL */\nconst CACHE_TTL_MS = 24 * 60 * 60 * 1000;\n\ninterface CacheEntry {\n timestamp: number;\n latestVersion: string;\n packageName: UpdatePackageName;\n}\n\n/** Read the current CLI version from package.json */\nexport function currentVersion(): string {\n const req = createRequire(import.meta.url);\n const candidates = ['../package.json', '../../package.json'];\n for (const rel of candidates) {\n try {\n const pkg = req(rel) as { version?: unknown | undefined };\n if (typeof pkg.version === 'string' && pkg.version.length > 0) return pkg.version;\n } catch {\n // try next\n }\n }\n return 'dev';\n}\n\ninterface ParsedSemver {\n major: number;\n minor: number;\n patch: number;\n prerelease: string[];\n}\n\nfunction parseSemver(version: string): ParsedSemver | null {\n const match = version.match(\n /^v?(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?(?:\\+[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?$/,\n );\n if (!match) return null;\n return {\n major: Number(match[1]),\n minor: Number(match[2]),\n patch: Number(match[3]),\n prerelease: match[4]?.split('.') ?? [],\n };\n}\n\nfunction comparePrerelease(a: string[], b: string[]): number {\n if (a.length === 0 || b.length === 0) {\n if (a.length === b.length) return 0;\n return a.length === 0 ? 1 : -1;\n }\n\n for (let i = 0; i < Math.max(a.length, b.length); i++) {\n const ai = a[i];\n const bi = b[i];\n if (ai === undefined || bi === undefined) return ai === undefined ? -1 : 1;\n if (ai === bi) continue;\n const aNumeric = /^\\d+$/.test(ai);\n const bNumeric = /^\\d+$/.test(bi);\n if (aNumeric && bNumeric) return Number(ai) > Number(bi) ? 1 : -1;\n if (aNumeric !== bNumeric) return aNumeric ? -1 : 1;\n return ai > bi ? 1 : -1;\n }\n return 0;\n}\n\n/** SemVer comparison \u2014 returns true if a > b. Invalid versions are never considered newer. */\nexport function isNewer(a: string, b: string): boolean {\n const av = parseSemver(a);\n const bv = parseSemver(b);\n if (!av || !bv) return false;\n for (const key of ['major', 'minor', 'patch'] as const) {\n if (av[key] > bv[key]) return true;\n if (av[key] < bv[key]) return false;\n }\n return comparePrerelease(av.prerelease, bv.prerelease) > 0;\n}\n\ninterface CacheState {\n entry: CacheEntry;\n fresh: boolean;\n}\n\n/** Read and validate cache. Expired entries remain available as a network-failure fallback. */\nasync function readCache(\n homeFn: HomeDirFn = defaultHomeDir,\n packageName: UpdatePackageName = 'wrongstack',\n): Promise<CacheState | null> {\n try {\n const raw = await fs.readFile(cachePath(homeFn), 'utf8');\n const value = JSON.parse(raw) as Record<string, unknown>;\n const cachedPackage = value['packageName'];\n if (\n typeof value['timestamp'] !== 'number' ||\n !Number.isFinite(value['timestamp']) ||\n typeof value['latestVersion'] !== 'string' ||\n !parseSemver(value['latestVersion']) ||\n (cachedPackage !== undefined && cachedPackage !== packageName) ||\n (cachedPackage === undefined && packageName !== 'wrongstack')\n ) {\n return null;\n }\n const entry: CacheEntry = {\n timestamp: value['timestamp'],\n latestVersion: value['latestVersion'],\n packageName,\n };\n return { entry, fresh: Date.now() - entry.timestamp <= CACHE_TTL_MS };\n } catch {\n return null;\n }\n}\n\n/** Write cache */\nasync function writeCache(entry: CacheEntry, homeFn: HomeDirFn = defaultHomeDir): Promise<void> {\n try {\n const dir = path.dirname(cachePath(homeFn));\n await fs.mkdir(dir, { recursive: true });\n await fs.writeFile(cachePath(homeFn), JSON.stringify(entry, null, 2), 'utf8');\n } catch {\n // best-effort\n }\n}\n\n/** Fetch latest version from npm registry. Exported for testability and for\n * callers that want to do their own version checks. Throws a structured\n * `FetchError(status, context: { op: 'checkForUpdate', registry: 'npmjs', url })`\n * on non-2xx responses so consumers can branch on the structured shape. */\nexport function fetchLatestFromNpm(timeoutMs?: number): Promise<string>;\nexport function fetchLatestFromNpm(\n packageName: UpdatePackageName,\n timeoutMs?: number,\n signal?: AbortSignal | undefined,\n): Promise<string>;\nexport async function fetchLatestFromNpm(\n packageOrTimeout: UpdatePackageName | number = 'wrongstack',\n timeoutMs = 3000,\n signal?: AbortSignal | undefined,\n): Promise<string> {\n const packageName = typeof packageOrTimeout === 'number' ? 'wrongstack' : packageOrTimeout;\n const effectiveTimeoutMs =\n typeof packageOrTimeout === 'number' ? packageOrTimeout : timeoutMs;\n const url = npmRegistryUrl(packageName);\n const timeoutSignal = AbortSignal.timeout(effectiveTimeoutMs);\n const combinedSignal = signal ? AbortSignal.any([signal, timeoutSignal]) : timeoutSignal;\n const res = await fetch(url, {\n signal: combinedSignal,\n headers: { Accept: 'application/json' },\n });\n\n if (!res.ok) {\n throw new FetchError({\n message: `npm registry responded ${res.status}`,\n status: res.status,\n context: { op: 'checkForUpdate', registry: 'npmjs', url },\n });\n }\n const data = (await res.json()) as { version?: unknown | undefined };\n if (typeof data.version === 'string' && parseSemver(data.version)) return data.version;\n throw new Error('No valid version field in npm response');\n}\n\nexport interface CheckForUpdateOptions {\n signal?: AbortSignal | undefined;\n homeFn?: HomeDirFn | undefined;\n packageName?: UpdatePackageName | undefined;\n /** Manual update commands require a live registry result rather than a notification cache hit. */\n forceRefresh?: boolean | undefined;\n}\n\n/** Return update info \u2014 cache-first for notices, fresh registry data for manual updates. */\nexport async function checkForUpdate(\n signalOrOptions?: AbortSignal | CheckForUpdateOptions | undefined,\n legacyHomeFn?: HomeDirFn | undefined,\n): Promise<UpdateInfo> {\n const options: CheckForUpdateOptions =\n signalOrOptions instanceof AbortSignal\n ? { signal: signalOrOptions, homeFn: legacyHomeFn }\n : (signalOrOptions ?? { homeFn: legacyHomeFn });\n const current = currentVersion();\n const signal = options.signal;\n const packageName = options.packageName ?? 'wrongstack';\n const aborted = () => signal?.aborted ?? false;\n const hf = options.homeFn ?? defaultHomeDir;\n\n if (aborted()) {\n return { current, latest: current, outdated: false, checkFailed: true };\n }\n\n const cached = await readCache(hf, packageName);\n if (!options.forceRefresh && cached?.fresh) {\n return {\n current,\n latest: cached.entry.latestVersion,\n outdated: isNewer(cached.entry.latestVersion, current),\n checkFailed: false,\n };\n }\n\n try {\n const latest = await fetchLatestFromNpm(packageName, 3000, signal);\n await writeCache({ timestamp: Date.now(), latestVersion: latest, packageName }, hf);\n return {\n current,\n latest,\n outdated: isNewer(latest, current),\n checkFailed: false,\n };\n } catch {\n if (aborted()) {\n return { current, latest: current, outdated: false, checkFailed: true };\n }\n if (cached) {\n return {\n current,\n latest: cached.entry.latestVersion,\n outdated: isNewer(cached.entry.latestVersion, current),\n checkFailed: true,\n };\n }\n return { current, latest: current, outdated: false, checkFailed: true };\n }\n}\n\n/** Return update notification string if available, null otherwise */\nexport async function getUpdateNotification(\n signal?: AbortSignal | undefined,\n homeFn?: HomeDirFn | undefined,\n): Promise<string | null> {\n const info = await checkForUpdate(signal, homeFn);\n if (info.outdated) {\n return `Update available: v${info.current} \u2192 v${info.latest}`;\n }\n return null;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/boot/simpleui-full-auto.ts", "../src/permission-prompt.ts", "../src/diff-renderer.ts", "../src/services/project-facts.ts"],
|
|
4
|
-
"sourcesContent": ["import type { Config } from '@wrongstack/core/types';\n\nexport type CliFlags = Record<string, string | boolean>;\n\n/**\n * Apply the explicit SimpleUI full-auto launch profile for this process only.\n *\n * The profile deliberately changes ordinary runtime preferences (YOLO,\n * Director, autonomy, and the disabled-tool list), but it does not weaken\n * absolute trust denies, `permission: 'deny'` tools, enforcement hooks, or\n * project-root containment. Those guarantees are enforced below config/flag\n * selection and continue to win over YOLO.\n */\nexport function isSimpleUiFullAuto(flags: CliFlags): boolean {\n return flags['simpleui'] === true && flags['full-auto'] === true;\n}\n\nexport function applySimpleUiFullAutoProfile(config: Config, flags: CliFlags): Config {\n if (!isSimpleUiFullAuto(flags)) return config;\n\n flags['yolo'] = true;\n flags['director'] = true;\n flags['no-director'] = false;\n flags['autonomy'] = 'auto';\n flags['no-autonomy'] = false;\n\n return Object.freeze({\n ...config,\n yolo: true,\n tools: Object.freeze({\n ...config.tools,\n disabledTools: [],\n }),\n });\n}\n\n/**\n * Mark the independent SimpleUI surface as coordination-light. Mailbox\n * heartbeat/telemetry keeps running, but routine presence and chatter stays\n * outside the model conversation. Actionable control/results are still\n * delivered by the core mailbox loop.\n */\nexport function configureSimpleUiRuntimeContext(\n meta: Record<string, unknown>,\n flags: CliFlags,\n): void {\n if (flags['simpleui'] !== true) return;\n meta['source'] = 'webui';\n meta['surface'] = 'simpleui';\n meta['coordinationContextMode'] = 'background';\n}\n", "import type { InputReader, Tool } from '@wrongstack/core/types';\nimport { color, truncate, writeOut } from '@wrongstack/core/utils';\nimport { renderDiff } from './diff-renderer.js';\nimport { theme } from './theme.js';\n\nexport type PromptDecision = 'yes' | 'no' | 'always' | 'deny';\n\n/** Signature the Agent expects for confirming tool calls. */\nexport type ConfirmAwaiter = (\n tool: Tool,\n input: unknown,\n toolUseId: string,\n suggestedPattern: string,\n) => Promise<'yes' | 'no' | 'always' | 'deny'>;\n\nexport function makePromptDelegate(reader: InputReader) {\n return async (tool: Tool, input: unknown, suggestedPattern: string): Promise<PromptDecision> => {\n // Terminal bell (\\x07) to alert the user that action is required.\n // Without this, the prompt can be easily missed when output is\n // scrolling or the user has switched to another window.\n writeOut('\\x07');\n writeOut(\n `\\n${theme.warn('\u26A0 APPROVAL REQUIRED')} ${theme.primary('\u2502')} ${theme.bold(tool.name)}\\n`,\n );\n writeOut(`${color.dim(stringifyInput(input))}\\n`);\n\n if (tool.name === 'edit' && hasDiff(input)) {\n const inp = input as { diff?: unknown | undefined };\n const diff = typeof inp.diff === 'string' ? inp.diff : '';\n if (diff) writeOut(`${renderDiff(diff)}\\n`);\n }\n\n writeOut(color.dim('\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\\n'));\n const answer = await reader.readKey(\n `${theme.bold('[y]')}es ${theme.bold('[n]')}o ${theme.bold('[a]')}lways allow (${suggestedPattern}) ${theme.bold('[d]')}eny: `,\n [\n { key: 'y', label: 'yes', value: 'yes' },\n { key: 'n', label: 'no', value: 'no' },\n { key: 'a', label: 'always', value: 'always' },\n { key: 'd', label: 'deny', value: 'deny' },\n ],\n );\n return answer as PromptDecision;\n };\n}\n\n/**\n * Create a ConfirmAwaiter for the CLI path. Wraps makePromptDelegate\n * with the ConfirmAwaiter type signature expected by the Agent.\n */\nexport function makeConfirmAwaiter(reader: InputReader): ConfirmAwaiter {\n const delegate = makePromptDelegate(reader);\n return async (tool: Tool, input: unknown, _toolUseId: string, suggestedPattern: string) => {\n const result = await delegate(tool, input, suggestedPattern);\n return result as 'yes' | 'no' | 'always' | 'deny';\n };\n}\n\nfunction stringifyInput(input: unknown): string {\n if (!input || typeof input !== 'object') return '';\n const obj = input as Record<string, unknown>;\n return Object.entries(obj)\n .filter(([k]) => k !== 'content' && k !== 'new_string')\n .map(([k, v]) => `${k}: ${truncate(JSON.stringify(v), 80)}`)\n .join(' ');\n}\n\nfunction hasDiff(input: unknown): boolean {\n return Boolean(\n input && typeof input === 'object' && 'diff' in (input as Record<string, unknown>),\n );\n}\n", "import { color } from '@wrongstack/core/utils';\n\nexport function renderDiff(diff: string): string {\n if (!diff) return '';\n const lines = diff.split('\\n');\n return lines\n .map((line) => {\n if (line.startsWith('+++') || line.startsWith('---')) return color.bold(line);\n if (line.startsWith('@@')) return color.cyan(line);\n if (line.startsWith('+')) return color.green(line);\n if (line.startsWith('-')) return color.red(line);\n return color.dim(line);\n })\n .join('\\n');\n}\n", "import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { DEFAULT_WALK_IGNORE_DIRS } from '@wrongstack/core/utils';\nimport {\n detectLanguageWorkspaces,\n languageProfileRegistry,\n planLanguageOperation,\n} from '@wrongstack/tools/languages';\n\nexport interface ProjectFacts {\n build?: string | undefined;\n test?: string | undefined;\n lint?: string | undefined;\n run?: string | undefined;\n hints: string[];\n /** Top languages by source-file count, e.g. `['Python (142)', 'Shell (8)']`.\n * Only populated by the source-tree scan fallback (no manifest matched). */\n languages?: string[] | undefined;\n /** Likely entry-point files discovered by the scan (relative paths). */\n entryPoints?: string[] | undefined;\n /** Non-ignored top-level directories discovered by the scan. */\n topDirs?: string[] | undefined;\n}\n\nasync function pathExists(file: string): Promise<boolean> {\n try {\n await fs.access(file);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Pull literal shell commands out of a GitHub Actions workflow's `run:` steps,\n * handling both inline (`run: pnpm test`) and block-scalar (`run: |` + indented\n * lines) forms. No YAML dependency \u2014 line-based, matching the Makefile parser's\n * pragmatism. Obvious non-build noise (cd/echo/export/comments) is dropped.\n */\nfunction parseCiRunCommands(yaml: string): string[] {\n const commands: string[] = [];\n const lines = yaml.split(/\\r?\\n/);\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? '';\n const m = /^(\\s*)(?:-\\s+)?run:\\s*(.*)$/.exec(line);\n if (!m) continue;\n const indent = (m[1] ?? '').length;\n const inline = (m[2] ?? '').trim();\n if (inline && inline !== '|' && inline !== '>' && !/^[|>][+-]?$/.test(inline)) {\n commands.push(inline);\n continue;\n }\n // Block scalar: collect following lines indented deeper than the `run:` key.\n for (let j = i + 1; j < lines.length; j++) {\n const body = lines[j] ?? '';\n if (body.trim() === '') continue;\n const bodyIndent = body.length - body.trimStart().length;\n if (bodyIndent <= indent) break;\n commands.push(body.trim());\n i = j;\n }\n }\n return commands.filter((c) => c !== '' && !/^(#|cd\\s|echo\\s|export\\s|set\\s|if\\s)/.test(c));\n}\n\n/** Fill missing facts from CI command candidates, matching by keyword. CI is\n * strong evidence: these commands actually run on every push. */\nfunction applyCiCommands(facts: ProjectFacts, commands: string[]): void {\n const find = (re: RegExp) => commands.find((c) => re.test(c));\n facts.test ??= find(/\\b(test|pytest|vitest|jest|go test|cargo test|mix test|rspec)\\b/i);\n facts.lint ??= find(/\\b(lint|eslint|biome|clippy|ruff|flake8|golangci-lint|fmt --check)\\b/i);\n facts.build ??= find(\n /\\b(build|compile|tsc|cargo build|go build|mvn .*package|gradle .*build)\\b/i,\n );\n}\n\nasync function detectPackageManager(root: string, declared?: string): Promise<string> {\n if (declared) {\n const name = declared.split('@')[0];\n if (name) return name;\n }\n if (await pathExists(path.join(root, 'pnpm-lock.yaml'))) return 'pnpm';\n if (await pathExists(path.join(root, 'bun.lockb'))) return 'bun';\n if (await pathExists(path.join(root, 'bun.lock'))) return 'bun';\n if (await pathExists(path.join(root, 'yarn.lock'))) return 'yarn';\n return 'npm';\n}\n\nfunction hasUsableScript(scripts: Record<string, string>, name: string): boolean {\n const script = scripts[name];\n if (typeof script !== 'string' || script.trim() === '') return false;\n if (name === 'test' && /no test specified/i.test(script)) return false;\n return true;\n}\n\nfunction parseMakeTargets(makefile: string): Set<string> {\n const targets = new Set<string>();\n for (const line of makefile.split(/\\r?\\n/)) {\n if (line.startsWith('\\t') || line.trimStart().startsWith('#')) continue;\n const match = /^([A-Za-z0-9_.-]+)\\s*:(?![=])/.exec(line);\n if (match?.[1]) targets.add(match[1]);\n }\n return targets;\n}\n\n/** Source-file extension \u2192 human language label. Used by the scan fallback to\n * name a project's stack when no manifest (package.json, go.mod, \u2026) matched. */\nconst EXT_LANG: Record<string, string> = {\n '.ts': 'TypeScript',\n '.tsx': 'TypeScript',\n '.mts': 'TypeScript',\n '.cts': 'TypeScript',\n '.js': 'JavaScript',\n '.jsx': 'JavaScript',\n '.mjs': 'JavaScript',\n '.cjs': 'JavaScript',\n '.py': 'Python',\n '.rb': 'Ruby',\n '.go': 'Go',\n '.rs': 'Rust',\n '.java': 'Java',\n '.kt': 'Kotlin',\n '.kts': 'Kotlin',\n '.c': 'C',\n '.h': 'C',\n '.cpp': 'C++',\n '.cc': 'C++',\n '.cxx': 'C++',\n '.hpp': 'C++',\n '.cs': 'C#',\n '.php': 'PHP',\n '.swift': 'Swift',\n '.scala': 'Scala',\n '.clj': 'Clojure',\n '.ex': 'Elixir',\n '.exs': 'Elixir',\n '.erl': 'Erlang',\n '.hs': 'Haskell',\n '.ml': 'OCaml',\n '.dart': 'Dart',\n '.lua': 'Lua',\n '.jl': 'Julia',\n '.sh': 'Shell',\n '.bash': 'Shell',\n '.ps1': 'PowerShell',\n '.pl': 'Perl',\n '.zig': 'Zig',\n '.nim': 'Nim',\n '.sql': 'SQL',\n '.vue': 'Vue',\n '.svelte': 'Svelte',\n};\n\n/** Directories the scan never descends into \u2014 the shared walker list plus fingerprint-only extras. */\nconst SCAN_IGNORE_DIRS = new Set([\n ...DEFAULT_WALK_IGNORE_DIRS,\n 'out',\n 'vendor',\n 'env',\n '.wrongstack',\n '.idea',\n '.vscode',\n 'obj',\n '.dart_tool',\n 'Pods',\n]);\n\n/** Basenames (sans extension) that usually mark a program entry point. */\nconst ENTRY_BASENAMES = new Set(['main', 'index', 'app', 'cli', 'server', '__main__']);\n\ninterface ScanResult {\n languages: string[];\n entryPoints: string[];\n topDirs: string[];\n}\n\n/**\n * Last-resort project fingerprint for repos that match no manifest: walk the\n * source tree (bounded by depth + file count, skipping deps/build dirs) and\n * report the dominant languages, likely entry points, and top-level layout.\n * Never invents build/test commands \u2014 it only tells the agent what's there.\n */\nasync function scanSourceTree(root: string): Promise<ScanResult | undefined> {\n const counts = new Map<string, number>();\n const entryPoints: string[] = [];\n const topDirs: string[] = [];\n let fileCount = 0;\n const MAX_FILES = 5000;\n const MAX_DEPTH = 6;\n\n async function walk(dir: string, depth: number, rel: string): Promise<void> {\n if (fileCount >= MAX_FILES || depth > MAX_DEPTH) return;\n let entries: import('node:fs').Dirent[];\n try {\n entries = await fs.readdir(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const e of entries) {\n if (fileCount >= MAX_FILES) return;\n const name = e.name;\n if (e.isDirectory()) {\n if (SCAN_IGNORE_DIRS.has(name) || name.startsWith('.')) continue;\n if (depth === 0) topDirs.push(name);\n await walk(path.join(dir, name), depth + 1, rel ? `${rel}/${name}` : name);\n } else if (e.isFile()) {\n fileCount++;\n const ext = path.extname(name).toLowerCase();\n const lang = EXT_LANG[ext];\n if (!lang) continue;\n counts.set(lang, (counts.get(lang) ?? 0) + 1);\n const base = name.slice(0, name.length - ext.length).toLowerCase();\n if (entryPoints.length < 10 && ENTRY_BASENAMES.has(base)) {\n entryPoints.push(rel ? `${rel}/${name}` : name);\n }\n }\n }\n }\n\n await walk(root, 0, '');\n if (counts.size === 0) return undefined;\n const languages = [...counts.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 5)\n .map(([lang, n]) => `${lang} (${n})`);\n return { languages, entryPoints, topDirs: topDirs.sort() };\n}\n\nexport async function detectProjectFacts(root: string): Promise<ProjectFacts> {\n const facts: ProjectFacts = { hints: [] };\n try {\n const pkg = JSON.parse(await fs.readFile(path.join(root, 'package.json'), 'utf8')) as {\n scripts?: Record<string, string>;\n packageManager?: string | undefined;\n };\n const scripts = pkg.scripts ?? {};\n const pm = await detectPackageManager(root, pkg.packageManager);\n if (hasUsableScript(scripts, 'build')) facts.build = `${pm} run build`;\n if (hasUsableScript(scripts, 'test')) facts.test = `${pm} test`;\n if (hasUsableScript(scripts, 'lint')) facts.lint = `${pm} run lint`;\n const runScript = ['dev', 'start', 'serve', 'preview'].find((name) =>\n hasUsableScript(scripts, name),\n );\n if (runScript) facts.run = `${pm} run ${runScript}`;\n facts.hints.push(Object.keys(scripts).length > 0 ? 'package.json scripts' : 'package.json');\n } catch {\n /* not node */\n }\n try {\n const makefile = await fs.readFile(path.join(root, 'Makefile'), 'utf8');\n const targets = parseMakeTargets(makefile);\n facts.build ??= targets.has('build') ? 'make build' : 'make';\n if (targets.has('test')) facts.test ??= 'make test';\n if (targets.has('lint')) facts.lint ??= 'make lint';\n const runTarget = ['run', 'dev', 'start', 'serve'].find((name) => targets.has(name));\n if (runTarget) facts.run ??= `make ${runTarget}`;\n facts.hints.push('Makefile');\n } catch {\n /* no make */\n }\n // Language registry \u2014 one pass replaces 15 ecosystem-specific try/catch blocks.\n // Fills gaps (??=) so package.json scripts and Makefile targets take priority.\n // Only fills commands when evidence is authoritative (manifest/config/lockfile),\n // NOT when the profile only matched via source-file extension heuristics \u2014 that\n // path leaves commands undefined so the source scan fallback can still run.\n const detection = await detectLanguageWorkspaces({ projectRoot: root });\n for (const workspace of detection.workspaces) {\n const profile = languageProfileRegistry.get(workspace.language);\n if (!profile) continue;\n const authoritative = workspace.evidence.some((e) => e.kind !== 'source');\n if (authoritative) {\n for (const op of ['build', 'test', 'lint', 'run'] as const) {\n if (facts[op] !== undefined) continue;\n const plan = await planLanguageOperation({\n projectRoot: root,\n operation: op,\n language: workspace.language,\n });\n if (plan.status === 'planned') {\n const cmd = [plan.plan.command, ...plan.plan.args].join(' ');\n facts[op] = cmd;\n }\n }\n }\n facts.hints.push(profile.id);\n }\n // CI workflows are the strongest evidence for projects with thin/odd manifests:\n // these commands actually run on every push. Fills only gaps left above.\n if (!facts.build || !facts.test || !facts.lint) {\n try {\n const wfDir = path.join(root, '.github', 'workflows');\n const wfNames = (await fs.readdir(wfDir)).filter((n) => /\\.ya?ml$/i.test(n));\n const commands: string[] = [];\n for (const n of wfNames) {\n commands.push(...parseCiRunCommands(await fs.readFile(path.join(wfDir, n), 'utf8')));\n }\n if (commands.length > 0) {\n const before = { build: facts.build, test: facts.test, lint: facts.lint };\n applyCiCommands(facts, commands);\n if (\n facts.build !== before.build ||\n facts.test !== before.test ||\n facts.lint !== before.lint\n ) {\n facts.hints.push('.github/workflows');\n }\n }\n } catch {\n /* no CI workflows */\n }\n }\n // No manifest produced runnable commands \u2014 fall back to scanning the source\n // tree so AGENTS.md still names the language and layout (commands stay TODO).\n if (!facts.build && !facts.test && !facts.run && !facts.lint) {\n const scan = await scanSourceTree(root);\n if (scan) {\n facts.languages = scan.languages;\n if (scan.entryPoints.length > 0) facts.entryPoints = scan.entryPoints;\n if (scan.topDirs.length > 0) facts.topDirs = scan.topDirs;\n facts.hints.push(`source scan: ${scan.languages.join(', ')}`);\n }\n }\n return facts;\n}\n\nexport function renderAgentsTemplate(f: ProjectFacts): string {\n const cmd = (s?: string) => (s ? `\\`${s}\\`` : '_TODO_');\n const hints = f.hints.length > 0 ? `\\n\\n> Auto-detected: ${f.hints.join(', ')}` : '';\n const runtime = f.languages?.length\n ? `_CLI, server, browser, worker, library, package?_ \u2014 detected: ${f.languages.join(', ')}`\n : '_CLI, server, browser, worker, library, package?_';\n\n // When the source scan found real entry points / directories, render them as\n // table rows; otherwise keep the generic placeholders.\n const keyFileRows: string[] = [];\n for (const ep of f.entryPoints ?? [])\n keyFileRows.push(`| \\`${ep}\\` | _Likely entry point (detected)_ |`);\n for (const dir of f.topDirs ?? [])\n keyFileRows.push(`| \\`${dir}/\\` | _Top-level directory (detected)_ |`);\n const keyFiles =\n keyFileRows.length > 0\n ? keyFileRows.join('\\n')\n : `| _src/_ | _Main source entry point(s)_ |\n| _tests/_ | _Test root or convention_ |\n| _docs/_ | _Architecture, runbooks, design notes_ |\n| _scripts/_ | _Automation scripts (CI, release, install, etc.)_ |`;\n\n return `# AGENTS.md\n\n> **DO NOT DELETE THIS FILE.** It is loaded into WrongStack's system prompt as\n> persistent project context. The \\`/init\\` command **regenerates** this file from\n> detected project facts and backs up any previous version to \\`AGENTS.md.bak\\`.\n> After \\`/init\\`, review the backup and merge any hand-written project context\n> back into this file \u2014 then add your conventions, architecture notes, and\n> domain knowledge below.\n\n## Project brief\n\n- **Purpose:** _What does this project do and why does it exist?_\n- **Primary users:** _Who uses it: developers, operators, customers, internal systems?_\n- **Runtime / deployment:** ${runtime}${hints}\n\n## How to work safely\n\n- _Project-specific rules the agent should always follow._\n- _Files, generated artifacts, migrations, or config the agent should not edit without asking._\n- _Preferred style or architecture choices not obvious from the code._\n- _Known fragile areas or historical bugs that deserve extra caution._\n\n## Commands\n\n| Command | Script |\n|---------|--------|\n| Build | ${cmd(f.build)} |\n| Test | ${cmd(f.test)} |\n| Lint | ${cmd(f.lint)} |\n| Run locally | ${cmd(f.run)} |\n\n## Key files and entry points\n\n| File / directory | Role |\n|---|---|\n${keyFiles}\n\n## Architecture notes\n\n_Summarize the important modules, data flow, boundaries, and ownership rules.\nMention anything a newcomer might misread or that looks unusual but is intentional._\n\n### Dependency layers\n\n_Describe the key dependency direction or layered structure, e.g.: \"core has no\nruntime deps; cli assembles everything above it.\"_\n\n### Extension points\n\n_Plugin, MCP, extension hooks, custom tools \u2014 what's wired up and how._\n\n## Domain knowledge\n\n_Business rules, acronyms, invariants, external services, and notes where the\ncode looks unusual but is intentional. E.g.: \"IDs are ULIDs, not UUIDs\", \"the\n\\`draft\\` flag means uncommitted billing metadata\", \"MCP servers are restarted\non disconnect with exponential backoff, up to 3 attempts\"._\n\n## Verification checklist\n\n- _What should be run after code changes?_\n- _What manual smoke test proves the common path still works?_\n- _What failure modes deserve extra attention?_\n- _Any known flaky tests or environment-dependent behavior?_\n\n## Useful pointers\n\n- _Docs, dashboards, runbooks, issue trackers, design notes, owner contacts._\n- _Related projects or repositories._`;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["color", "color"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/arg-parser.ts", "../src/auth-menu/local-presets.ts", "../src/picker.ts", "../src/picker-key-state.ts", "../src/picker-model-picker.ts", "../src/picker-ui.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Unified CLI argument parsing. Three parsers that were previously\n * spread across index.ts, subcommands/index.ts, and slash-commands/index.ts.\n */\n\n/** Flags that are boolean-only (no value expected after them). */\nexport const BOOLEAN_FLAGS = new Set([\n 'yolo',\n 'no-yolo',\n 'yolo-destructive',\n 'confirm-destructive',\n 'force-all-yolo',\n 'verbose',\n 'trace',\n 'help',\n 'version',\n 'yes',\n 'no-banner',\n 'no-features',\n 'tui',\n 'no-tui',\n // Legacy no-ops: every surface now starts fresh unless an explicit\n // `--resume <id>` is supplied. Keep parsing these as booleans so old\n // launch scripts do not accidentally consume the next positional token.\n 'no-recovery',\n 'recover',\n 'output-json',\n 'prompt',\n 'metrics',\n 'webui',\n 'simpleui',\n 'full-auto',\n 'desktop',\n 'open',\n 'webui-require-token',\n 'require-token',\n 'no-check',\n 'no-models-refresh',\n // (removed: 'director' and 'no-director' \u2014 Director Mode is always on)\n 'no-autonomy',\n 'no-hints',\n 'hints',\n 'no-menu',\n 'no-hooks',\n 'skip',\n 'skip-index',\n 'mouse',\n 'no-interactive',\n 'token-saving-mode',\n 'system-lite',\n 'system-pro',\n 'hq',\n 'hq-allow-exec',\n 'tunnel',\n // Opt-in to a non-loopback HQ bind with no token/password configured.\n 'insecure-open',\n 'strict-port',\n 'client',\n // `wstack update` booleans. Keeping these here prevents parseArgs from\n // consuming a following positional token as an accidental flag value.\n 'check-only',\n 'allow-scripts',\n 'lifecycle-scripts',\n 'npm',\n 'pnpm',\n 'yarn',\n 'bun',\n // `wstack acp` booleans. Without these, parseArgs treats the value after\n // `--fs`/`--echo` as the flag's value and eats a following positional\n // (e.g. the agent list in `acp bench --fs gemini-cli,codex-cli`).\n 'echo',\n 'fs',\n // `wstack modeldiag test` booleans. Keep a following positional token from\n // being consumed as the value of one of these switches.\n 'all-models',\n 'plan',\n 'json',\n]);\n\n// ------------------------------------------------------------------ main args\n\nexport interface ParsedArgs {\n flags: Record<string, string | boolean>;\n positional: string[];\n}\n\n/** Parse top-level `wstack` CLI args. */\nexport function parseArgs(argv: string[]): ParsedArgs {\n const flags: Record<string, string | boolean> = {};\n const positional: string[] = [];\n for (let i = 0; i < argv.length; i++) {\n const a = argv[i];\n if (!a) continue;\n if (a === '--') {\n positional.push(...argv.slice(i + 1));\n break;\n }\n if (a.startsWith('--')) {\n const eq = a.indexOf('=');\n if (eq !== -1) {\n flags[a.slice(2, eq)] = a.slice(eq + 1);\n continue;\n }\n const name = a.slice(2);\n if (BOOLEAN_FLAGS.has(name)) {\n flags[name] = true;\n continue;\n }\n if (i + 1 < argv.length && !(argv[i + 1] ?? '').startsWith('-')) {\n flags[name] = argv[++i] ?? '';\n } else {\n flags[name] = true;\n }\n } else if (a.startsWith('-') && a.length === 2) {\n const short = a.slice(1);\n const expand: Record<string, string> = { v: 'verbose', y: 'yes' };\n flags[expand[short] ?? short] = true;\n } else {\n positional.push(a);\n }\n }\n normalizeSurfaceAliases(flags, positional);\n return { flags, positional };\n}\n\n/**\n * Keep the user-facing launch shapes equivalent:\n * wstack --webui == wstack webui\n * wstack --simpleui == wstack simpleui\n * wstack --desktop == wstack desktop\n * wstack --hq == wstack hq / wstack hq serve\n *\n * HQ token management remains a real subcommand (`wstack hq token ...`), so\n * only the bare and explicit serve forms are normalized here.\n */\nfunction normalizeSurfaceAliases(\n flags: Record<string, string | boolean>,\n positional: string[],\n): void {\n // SimpleUI deliberately reuses the WebUI backend/runtime path. Keep its own\n // flag so dispatch can select the independent frontend build, while also\n // setting `webui` so every existing non-interactive surface guard applies.\n if (flags['simpleui']) flags['webui'] = true;\n\n const first = positional[0];\n if (first === 'simpleui') {\n flags['simpleui'] = true;\n flags['webui'] = true;\n positional.splice(0, 1);\n return;\n }\n if (first === 'webui' || first === 'desktop') {\n flags[first] = true;\n positional.splice(0, 1);\n return;\n }\n if (first === 'hq' && (positional.length === 1 || positional[1] === 'serve')) {\n flags['hq'] = true;\n positional.splice(0, positional[1] === 'serve' ? 2 : 1);\n }\n}\n\n// --------------------------------------------------------------- auth flags\n\nexport interface AuthFlags {\n positional: string[];\n label?: string | undefined;\n family?: import('@wrongstack/core/types').WireFamily | undefined;\n baseUrl?: string | undefined;\n envVars?: string[] | undefined;\n}\n\n/** Parse `wstack auth <provider> [--label ...] [--family ...] [...]` flags. */\nexport function parseAuthFlags(args: string[]): AuthFlags {\n const out: AuthFlags = { positional: [] };\n for (let i = 0; i < args.length; i++) {\n const a = args[i];\n if (a === '--label') {\n const v = args[++i];\n if (v) out.label = v;\n } else if (a === '--family') {\n const v = args[++i];\n if (v) out.family = v as AuthFlags['family'];\n } else if (a === '--base-url') {\n const v = args[++i];\n if (v) out.baseUrl = v;\n } else if (a === '--env') {\n const v = args[++i];\n if (v)\n out.envVars = v\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n } else if (a && !a.startsWith('--')) {\n out.positional.push(a);\n }\n }\n return out;\n}\n\n// -------------------------------------------------------------- spawn flags\n\nexport interface SpawnFlags {\n description: string;\n opts: {\n provider?: string | undefined;\n model?: string | undefined;\n tools?: string[] | undefined;\n name?: string | undefined;\n };\n}\n\n/**\n * Parse `/spawn` flags from the args head. Supported:\n * --provider=<id> / -p <id> override the subagent's provider id\n * --model=<id> / -m <id> override the subagent's model\n * --name=<label> / -n <label> display name\n * --tools=a,b,c restrict the subagent's tool slice\n *\n * Anything after the last flag is the task description.\n */\nexport function parseSpawnFlags(input: string): SpawnFlags {\n const opts: SpawnFlags['opts'] = {};\n let rest = input;\n const consume = (re: RegExp): RegExpMatchArray | null => {\n const m = rest.match(re);\n if (m) {\n rest = rest.slice(m[0].length).replace(/^\\s+/, '');\n return m;\n }\n return null;\n };\n while (rest.length > 0) {\n let m: RegExpMatchArray | null;\n m = consume(/^--provider=(\\S+)\\s*/);\n if (m) opts.provider = m[1];\n else {\n m = consume(/^--model=(\\S+)\\s*/);\n if (m) opts.model = m[1];\n else {\n m = consume(/^--name=(\"([^\"]+)\"|(\\S+))\\s*/);\n if (m) opts.name = m[2] ?? m[3];\n else {\n m = consume(/^--tools=(\\S+)\\s*/);\n if (m)\n opts.tools = m[1]\n ?.split(',')\n .map((t) => t.trim())\n .filter(Boolean);\n else {\n m = consume(/^-p\\s+(\\S+)\\s*/);\n if (m) opts.provider = m[1];\n else {\n m = consume(/^-m\\s+(\\S+)\\s*/);\n if (m) opts.model = m[1];\n else {\n m = consume(/^-n\\s+(\"([^\"]+)\"|(\\S+))\\s*/);\n if (m) opts.name = m[2] ?? m[3];\n else break;\n }\n }\n }\n }\n }\n }\n }\n return { description: rest.trim(), opts };\n}\n", "import { projectLocalProviderPresets } from '@wrongstack/providers/definitions';\n\nexport type { LocalProviderPresetProjection as LocalLlmPresetEntry } from '@wrongstack/providers/definitions';\nexport const LOCAL_LLM_PRESETS = projectLocalProviderPresets();\n", "import os from 'node:os';\nimport type { Config, ModelsRegistry, ResolvedProvider } from '@wrongstack/core/types';\nimport { color, expectDefined, setOutputLineGuard, setRawMode, stripAnsi, writeOut } from '@wrongstack/core/utils';\nimport { toErrorMessage } from '@wrongstack/core/utils';\nimport { LOCAL_LLM_PRESETS } from './auth-menu/local-presets.js';\nimport { appendHistory, backupCurrent } from './config-history.js';\nimport type { ReadlineInputReader } from './input-reader.js';\nimport { applyPickerKey, type ProviderPickerState } from './picker-key-state.js';\nimport {\n LIVE_PICKER_MAX_VISIBLE,\n runLiveModelPicker,\n} from './picker-model-picker.js';\nimport {\n boxBottom,\n boxDivider,\n boxRow,\n boxTop,\n codexPickerPreamble,\n keyHints,\n padVisible,\n theme,\n} from './picker-ui.js';\nimport { hasApiKey, isKeylessLocalProvider, visibleModelIds } from './provider-helpers.js';\nimport type { TerminalRenderer } from './renderer.js';\n\nexport { applyPickerKey, type ProviderPickerState } from './picker-key-state.js';\nexport { filterModels, LIVE_PICKER_MAX_VISIBLE, renderLiveModelList } from './picker-model-picker.js';\nexport { codexPickerPreamble } from './picker-ui.js';\n\n/**\n * Filter providers by a free-text query: case-insensitive substring match\n * against the provider id OR display name. An empty/whitespace query returns\n * all providers (as a copy). Input order is preserved. Powers the live\n * type-to-filter provider picker.\n */\n/**\n * Append synthetic entries for the built-in local-server presets\n * (OmniRoute / Ollama / vLLM / LM Studio) that aren't already present in\n * the merged list. These are keyless loopback gateways, so they pass the\n * `isKeylessLocalProvider` filter and become immediately selectable even\n * on a fresh install with no config and no catalog entry \u2014 mirroring the\n * `wstack auth local` shortcut. An entry is skipped when an id-match\n * already exists (catalog or saved config), so a user's customized\n * provider always wins over the preset default. Mutates and returns\n * `merged` for call-site convenience. Pure aside from the push.\n */\nexport function appendLocalPresetProviders(merged: ResolvedProvider[]): ResolvedProvider[] {\n const existing = new Set(merged.map((p) => p.id));\n for (const preset of LOCAL_LLM_PRESETS) {\n if (existing.has(preset.id)) continue;\n merged.push({\n id: preset.id,\n name: preset.label,\n family: 'openai-compatible',\n apiBase: preset.defaultBaseUrl,\n // No env vars \u2192 with a loopback apiBase this reads as a keyless\n // local gateway, so the picker offers it without a key.\n envVars: [],\n // No catalog models yet; OmniRoute/LM Studio/etc. auto-discover at\n // boot or the user picks `m` to set a list. An empty list still\n // lets the provider be chosen \u2014 pickModel surfaces the \"no models\n // listed\" hint and the user can type an id directly.\n models: [],\n });\n }\n return merged;\n}\n\nexport function filterProviders(query: string, providers: ResolvedProvider[]): ResolvedProvider[] {\n const q = query.trim().toLowerCase();\n if (!q) return [...providers];\n return providers.filter(\n (p) => p.id.toLowerCase().includes(q) || p.name.toLowerCase().includes(q),\n );\n}\n\n/** Preferred family display order; remaining families follow in insertion order. */\nconst PROVIDER_FAMILY_PREFERRED_ORDER = [\n 'anthropic',\n 'anthropic-oauth',\n 'openai',\n 'openai-codex',\n 'github-copilot',\n 'google',\n 'openai-compatible',\n];\n\n/**\n * Order providers for display: grouped by wire family in preferred order, then\n * alphabetical by id within each family. Pure. Shared by the live render and\n * the raw-stdin loop so the selection index and the rendered cursor always\n * refer to the same provider.\n */\nfunction orderProvidersForDisplay(filtered: ResolvedProvider[]): ResolvedProvider[] {\n const families = new Map<string, ResolvedProvider[]>();\n for (const p of filtered) {\n const arr = families.get(p.family) ?? [];\n arr.push(p);\n families.set(p.family, arr);\n }\n const order = [\n ...PROVIDER_FAMILY_PREFERRED_ORDER.filter((f) => families.has(f)),\n ...[...families.keys()].filter((f) => !PROVIDER_FAMILY_PREFERRED_ORDER.includes(f)),\n ];\n const flat: ResolvedProvider[] = [];\n for (const fam of order) {\n const arr = (families.get(fam) ?? [])\n .slice()\n .sort((a, b) => a.id.toLowerCase().localeCompare(b.id.toLowerCase()));\n flat.push(...arr);\n }\n return flat;\n}\n\n/**\n * Render the live type-to-filter provider view as one string: the query line,\n * providers grouped by wire family (preferred order, alphabetical within each\n * family), the selected provider marked with \u25B6, and a key hint. Capped to\n * LIVE_PICKER_MAX_VISIBLE rows so a frame always fits the viewport (the raw\n * loop redraws by moving the cursor up and clearing). Pure.\n */\nexport function renderLiveProviderList(\n query: string,\n filtered: ResolvedProvider[],\n selectedIdx: number,\n savedSet?: Set<string>,\n): string {\n const ordered = orderProvidersForDisplay(filtered);\n const scrollOffset = Math.max(0, selectedIdx - LIVE_PICKER_MAX_VISIBLE + 1);\n const visible = ordered.slice(scrollOffset, scrollOffset + LIVE_PICKER_MAX_VISIBLE);\n\n const lines: string[] = [];\n lines.push(boxTop('Select a provider'));\n // Search field. `Select provider: ${query}` is preserved verbatim (tests +\n // the raw-loop cursor math both depend on it). The prompt glyph is accented;\n // a blinking-style caret block trails the query.\n const caret = query.length > 0 ? color.dim('\u258F') : theme.cursor('\u258F');\n lines.push(boxRow(`${theme.accent('\u276F')} ${color.dim('Select provider:')} ${query}${caret}`));\n lines.push(boxDivider());\n\n if (scrollOffset > 0) {\n lines.push(boxRow(color.dim(` ${scrollOffset} more above \u2191`)));\n }\n\n let flat = 0;\n let lastFamily = '';\n for (const p of visible) {\n if (p.family !== lastFamily) {\n // Family section label \u2014 dim, small-caps feel via a leading accent tick.\n lines.push(boxRow(`${theme.accent('\u00B7')} ${color.dim(p.family.toUpperCase())}`));\n lastFamily = p.family;\n }\n const selected = flat === selectedIdx - scrollOffset;\n const sel = selected ? theme.cursor('\u25B6') : ' ';\n let marker: string;\n if (savedSet) {\n const mark = savedSet.has(p.id) ? color.cyan('\u25C9') : color.dim('\u25CB');\n marker = `${sel} ${mark}`;\n } else {\n marker = `${sel}`;\n }\n const id = selected ? theme.accent(color.bold(p.id)) : p.id;\n const name = selected ? p.name : color.dim(p.name);\n lines.push(boxRow(`${marker} ${padVisible(id, 24)} ${name}`));\n flat++;\n }\n\n if (scrollOffset + LIVE_PICKER_MAX_VISIBLE < ordered.length) {\n lines.push(\n boxRow(\n color.dim(` ${ordered.length - scrollOffset - LIVE_PICKER_MAX_VISIBLE} more below \u2193`),\n ),\n );\n }\n\n lines.push(boxDivider());\n lines.push(\n boxRow(\n keyHints([\n ['\u2191\u2193', 'scroll'],\n ['Enter', 'select'],\n ['Esc', 'clear'],\n ['Ctrl+C', 'quit'],\n ]),\n ),\n );\n lines.push(boxBottom());\n return lines.join('\\n');\n}\n\n/**\n * Save provider + model to the global config file.\n * Creates backups + history entries before writing.\n * Returns true if saved successfully.\n */\nexport async function saveToGlobalConfig(\n configPath: string,\n provider: string,\n model: string,\n homeFn: () => string = () => process.env.HOME ?? os.homedir(),\n): Promise<boolean> {\n try {\n const { atomicWrite } = await import('@wrongstack/core/utils');\n const fs = await import('node:fs/promises');\n\n let existing: Record<string, unknown> = {};\n try {\n const raw = await fs.readFile(configPath, 'utf8');\n existing = JSON.parse(raw) as Record<string, unknown>;\n } catch {\n // No existing config\n }\n\n const oldCfg = { ...existing };\n existing.provider = provider;\n existing.model = model;\n\n // Backup before writing \u2014 best-effort (never blocks save)\n try {\n await backupCurrent(homeFn, configPath);\n } catch (err) {\n console.warn(\n JSON.stringify({\n level: 'warn',\n event: 'picker.backup_failed',\n message: toErrorMessage(err),\n timestamp: new Date().toISOString(),\n }),\n );\n }\n\n await atomicWrite(configPath, JSON.stringify(existing, null, 2), { mode: 0o600 });\n\n // Record in history \u2014 best-effort (never blocks save)\n try {\n await appendHistory(\n oldCfg,\n existing,\n `Provider/model changed: ${oldCfg.provider ?? '(none)'} \u2192 ${provider}, ${oldCfg.model ?? '(none)'} \u2192 ${model}`,\n homeFn,\n configPath,\n );\n } catch {\n // best-effort\n }\n\n return true;\n } catch (err) {\n console.warn(\n JSON.stringify({\n level: 'warn',\n event: 'picker.save_failed',\n message: toErrorMessage(err),\n timestamp: new Date().toISOString(),\n }),\n );\n return false;\n }\n}\n\nexport interface PickerResult {\n provider: string;\n model: string;\n}\n\n/**\n * Interactive provider + model picker. Lists supported providers grouped\n * by wire family \u2014 by default only those with an API key (env or stored\n * config), so you see only what you can actually launch into. Falls back\n * to the full catalog when no keys are found anywhere.\n *\n * When `defaultProvider`/`defaultModel` are passed, they're pre-selected\n * so the user can press Enter to accept the previous choice.\n */\n/**\n * Live type-to-filter provider picker (TTY only). Takes over stdin in raw mode\n * and redraws the filtered, family-grouped list on every keystroke. Thin I/O\n * shell around the pure filterProviders / applyPickerKey / renderLiveProviderList\n * helpers (which are fully unit-tested). Returns the chosen provider, or\n * undefined on cancel. runPicker only calls this when stdin is a TTY; non-TTY\n * callers (CI, piped input, tests) fall through to the numbered readLine picker.\n */\n// Marker used to locate the query line within the rendered (boxed) frame.\n// renderLiveProviderList emits exactly one line containing this literal.\nconst QUERY_MARKER = 'Select provider:';\n\n/**\n * Park the terminal cursor at the end of the live query text inside the\n * boxed frame. The frame is multi-line with a border, so we (1) find which\n * physical line holds the query, (2) move up from the last line to it, then\n * (3) move to the visible column just after the typed query. Visible width\n * is measured with stripAnsi so the box border + accent colors don't offset\n * the cursor.\n */\nfunction cursorToQuery(frame: string, query: string): void {\n const rows = frame.split('\\n');\n const lastIdx = rows.length - 1;\n const queryIdx = rows.findIndex((r) => r.includes(QUERY_MARKER));\n if (queryIdx < 0) return; // frame shape changed unexpectedly \u2014 leave cursor\n const up = lastIdx - queryIdx;\n const queryLine = rows[queryIdx] ?? '';\n // Everything on the query line up to and including the typed query, minus\n // the query text itself, is the visible prefix. We locate the marker, then\n // add the marker + separator + query length in visible columns.\n const plain = stripAnsi(queryLine);\n const markerAt = plain.indexOf(QUERY_MARKER);\n // prefix = columns before the query text = markerAt + marker + ': ' gap.\n const col = markerAt + QUERY_MARKER.length + 1 + query.length + 1;\n if (up > 0) writeOut(`\\x1b[${up}A`);\n writeOut(`\\x1b[${col}G`);\n}\n\nexport async function runLiveProviderPicker(\n displayList: ResolvedProvider[],\n savedSet?: Set<string>,\n): Promise<ResolvedProvider | undefined> {\n const stdin = process.stdin;\n const out = process.stdout;\n if (!stdin.isTTY || !out.isTTY) return undefined;\n\n setOutputLineGuard(null);\n let state: ProviderPickerState = { query: '', selected: 0, status: 'typing' };\n let ordered = orderProvidersForDisplay(filterProviders(state.query, displayList));\n const visibleCount = (): number => ordered.length;\n const clamp = (): void => {\n if (state.selected >= visibleCount()) state.selected = Math.max(0, visibleCount() - 1);\n };\n clamp();\n let frame = renderLiveProviderList(state.query, ordered, state.selected, savedSet);\n writeOut(frame);\n writeOut('\\x1b7');\n cursorToQuery(frame, state.query);\n\n return new Promise<ResolvedProvider | undefined>((resolve) => {\n const wasRaw = stdin.isRaw;\n const wasPaused = stdin.isPaused();\n setRawMode(stdin, true);\n stdin.resume();\n stdin.setEncoding('utf8');\n\n const cleanup = (): void => {\n stdin.off('data', onData);\n setRawMode(stdin, wasRaw);\n if (wasPaused) stdin.pause();\n };\n const repaint = (): void => {\n writeOut('\\x1b8');\n const ups = (frame.match(/\\n/g) ?? []).length;\n writeOut(`\\x1b[${ups}A\\r\\x1b[J`);\n ordered = orderProvidersForDisplay(filterProviders(state.query, displayList));\n clamp();\n frame = renderLiveProviderList(state.query, ordered, state.selected, savedSet);\n writeOut(frame);\n writeOut('\\x1b7');\n cursorToQuery(frame, state.query);\n };\n const onData = (chunk: string): void => {\n ordered = orderProvidersForDisplay(filterProviders(state.query, displayList));\n state = applyPickerKey(state, chunk, visibleCount());\n // applyPickerKey may have changed the query (type/paste) \u2014 recompute against\n // the NEW query before resolving a selection, so a paste like \"zzz\\r\" can't\n // submit a provider from the pre-paste list.\n ordered = orderProvidersForDisplay(filterProviders(state.query, displayList));\n clamp();\n if (state.status === 'cancelled') {\n cleanup();\n writeOut('\\n');\n resolve(undefined);\n return;\n }\n if (state.status === 'submitted') {\n // Query emptied the matches mid-chunk (e.g. paste): stay in the picker.\n if (ordered.length === 0) {\n state = { ...state, status: 'typing' };\n repaint();\n return;\n }\n const pick = ordered[state.selected] ?? ordered[0];\n cleanup();\n writeOut('\\n');\n resolve(pick);\n return;\n }\n repaint();\n };\n stdin.on('data', onData);\n });\n}\n\nexport async function runPicker(deps: {\n modelsRegistry: ModelsRegistry;\n renderer: TerminalRenderer;\n reader: ReadlineInputReader;\n config?: Config | undefined;\n defaultProvider?: string | undefined;\n defaultModel?: string | undefined;\n}): Promise<PickerResult | undefined> {\n const { modelsRegistry, renderer, reader, config, defaultProvider, defaultModel } = deps;\n\n renderer.write(\n `\\n${theme.accent(color.bold('\u258C WrongStack'))} ${color.dim('Provider & Model Selection')}\\n`,\n );\n renderer.write(color.dim(`${theme.chrome('\u00B7')} Loading provider catalog\u2026\\n`));\n\n let providers: ResolvedProvider[];\n try {\n providers = await modelsRegistry.listProviders();\n } catch {\n renderer.writeError(\n 'Failed to load provider catalog. Pass --provider and --model to skip the picker.',\n );\n return undefined;\n }\n\n // Drop unsupported wire families \u2014 they need a plugin and can't be\n // selected through this path.\n const supported = providers.filter((p) => p.family !== 'unsupported');\n\n // Build the display list by overlaying saved config on top of the\n // catalog. Two kinds of saved entries matter:\n // 1. The map key matches a catalog id (`zai-coding-plan`) \u2014 the\n // user may have overridden family/baseUrl. We MUST honor those\n // overrides for grouping/display, otherwise an entry the user\n // saved as `family: \"anthropic\"` would still appear under the\n // catalog's `openai-compatible` group.\n // 2. The map key is an alias not in the catalog. Its `cfg.type` may\n // still point at a catalog id, in which case we inherit the\n // model list and display name from there.\n const catalogById = new Map(supported.map((p) => [p.id, p]));\n const overlay = config?.providers ?? {};\n const seen = new Set<string>();\n const merged: ResolvedProvider[] = [];\n for (const p of supported) {\n const cfg = overlay[p.id];\n seen.add(p.id);\n if (cfg) {\n merged.push({\n ...p,\n family: cfg.family ?? p.family,\n apiBase: cfg.baseUrl ?? p.apiBase,\n envVars: cfg.envVars && cfg.envVars.length > 0 ? cfg.envVars : p.envVars,\n // When the user has saved an explicit model list, it wins \u2014 they\n // know which models their endpoint actually serves (e.g. LM\n // Studio, vLLM, or a proxy with custom model ids). Otherwise the\n // catalog list keeps providing suggestions.\n models: visibleModelIds(\n p.id,\n config ?? ({ providers: {} } as Config),\n p.models.map((m) => m.id),\n cfg,\n ).map((m) => p.models.find((pm) => pm.id === m) ?? { id: m, name: m }),\n });\n } else {\n merged.push(p);\n }\n }\n for (const [id, cfg] of Object.entries(overlay)) {\n if (seen.has(id)) continue;\n if (!cfg?.family || cfg.family === 'unsupported') continue;\n const catalogType = cfg.type && cfg.type !== id ? cfg.type : undefined;\n const inherited = catalogType ? catalogById.get(catalogType) : undefined;\n merged.push({\n id,\n name: inherited ? `${inherited.name} ${color.dim('(alias)')}` : id,\n family: cfg.family,\n apiBase: cfg.baseUrl ?? inherited?.apiBase,\n envVars: cfg.envVars ?? inherited?.envVars ?? [],\n models: visibleModelIds(\n id,\n config ?? ({ providers: {} } as Config),\n (inherited?.models ?? []).map((m) => m.id),\n cfg,\n ).map((m) => inherited?.models.find((pm) => pm.id === m) ?? { id: m, name: m }),\n npm: inherited?.npm,\n });\n }\n\n // Filter to usable providers: those with a key, plus keyless local\n // gateways (omniroute/LiteLLM/\u2026 on a loopback address) which need no\n // credential and so are immediately launchable. If none qualify (fresh\n // install, no env vars set), fall back to the full list and prompt the\n // user to add a key \u2014 picking a keyless provider here is still useful\n // because the very next step (`wstack auth <prov>`) needs to know which.\n const keyed = merged.filter((p) => hasApiKey(p, config) || isKeylessLocalProvider(p));\n let displayList = keyed;\n let showingFallback = false;\n if (keyed.length === 0) {\n displayList = merged;\n // The full-catalog fallback only makes sense when there's actually a\n // catalog to fall back on. With an empty catalog, the only thing we'll\n // show is the keyless local presets (injected below), which need no\n // key \u2014 so don't nag the user about missing keys in that case.\n showingFallback = merged.length > 0;\n }\n\n // Surface the built-in local-server presets (OmniRoute / Ollama / vLLM /\n // LM Studio) that aren't already in the catalog or saved config. Done\n // AFTER the keyed/fallback decision so these always-keyless entries\n // don't suppress the \"no keys anywhere \u2192 show full catalog\" fallback;\n // they're simply appended to whichever list we're about to show.\n appendLocalPresetProviders(displayList);\n\n if (displayList.length === 0) {\n renderer.writeError('No supported providers found in catalog.');\n return undefined;\n }\n\n // TTY: live type-to-filter picker. Non-TTY (CI, piped, tests) falls through\n // to the numbered readLine picker below.\n if (process.stdin.isTTY) {\n const chosen = await runLiveProviderPicker(displayList);\n if (!chosen) {\n renderer.write(color.dim('Cancelled.\\n'));\n return undefined;\n }\n return pickModel(chosen, modelsRegistry, renderer, reader, defaultModel);\n }\n\n // Group by family for nicer display\n const families = new Map<string, ResolvedProvider[]>();\n for (const p of displayList) {\n const list = families.get(p.family) ?? [];\n list.push(p);\n families.set(p.family, list);\n }\n\n // Build a flat numbered list (family \u2192 providers). Track which entry\n // matches the current default so we can highlight + accept Enter.\n const ordered: Array<{ provider: ResolvedProvider; index: number }> = [];\n // Preferred grouping order, then any remaining families present in the list.\n // The trailing append is essential: OAuth / subscription families\n // (anthropic-oauth, openai-codex, github-copilot) live only in saved config,\n // never the catalog \u2014 a fixed allowlist would silently drop them from the\n // launch picker even though they have keys.\n const preferredOrder = [\n 'anthropic',\n 'anthropic-oauth',\n 'openai',\n 'openai-codex',\n 'github-copilot',\n 'google',\n 'openai-compatible',\n ];\n const familyOrder = [\n ...preferredOrder.filter((f) => families.has(f)),\n ...[...families.keys()].filter((f) => !preferredOrder.includes(f)),\n ];\n let idx = 1;\n let defaultIdx: number | undefined;\n renderer.write('\\n');\n renderer.write(`${boxTop('Select a provider')}\\n`);\n for (const fam of familyOrder) {\n // Sort within each family alphabetically (case-insensitive) by id.\n const list = [...(families.get(fam) ?? [])].sort((a, b) =>\n a.id.toLowerCase().localeCompare(b.id.toLowerCase()),\n );\n if (!list || list.length === 0) continue;\n // Family section label \u2014 dim UPPERCASE with a leading accent tick, matching\n // the live picker's grouping. `fam` (a lowercased id) stays contained.\n renderer.write(`${boxRow(`${theme.accent('\u00B7')} ${color.dim(fam.toUpperCase())}`)}\\n`);\n for (const p of list) {\n const envFound = p.envVars.some((v) => !!process.env[v]);\n const entry = config?.providers?.[p.id];\n const configKey =\n (typeof entry?.apiKey === 'string' && entry.apiKey.length > 0) ||\n (Array.isArray(entry?.apiKeys) && entry?.apiKeys?.some((k) => k?.apiKey));\n // \u25CF green = env key, \u25C9 cyan = stored in config, \u25CB dim = no key\n const marker = envFound ? color.green('\u25CF') : configKey ? color.cyan('\u25C9') : color.dim('\u25CB');\n const isDefault = p.id === defaultProvider;\n if (isDefault) defaultIdx = idx;\n const idLabel = isDefault ? theme.accent(color.bold(p.id)) : p.id;\n const suffix = isDefault ? color.dim(' (default)') : '';\n renderer.write(\n `${boxRow(`${color.dim(`${idx}.`.padStart(4))} ${marker} ${padVisible(idLabel, 22)} ${color.dim(p.name)}${suffix}`)}\\n`,\n );\n ordered.push({ provider: p, index: idx });\n idx++;\n }\n }\n\n renderer.write(`${boxDivider()}\\n`);\n if (showingFallback) {\n renderer.write(\n `${boxRow(`${color.yellow('\u26A0 No API keys detected.')} ${color.dim('Run `wstack auth <provider>` after picking.')}`)}\\n`,\n );\n } else {\n renderer.write(`${boxRow(color.dim('\u25CF env key \u25C9 stored in config \u25CB no key'))}\\n`);\n }\n renderer.write(`${boxBottom()}\\n`);\n\n // Provider prompt. Enter on an empty line accepts the default when one\n // is present; otherwise we treat it as cancel.\n const defaultHint =\n defaultIdx !== undefined && defaultProvider\n ? ` ${color.dim(`[Enter = ${defaultProvider}]`)}`\n : '';\n const providerAnswer = (\n await reader.readLine(\n `\\n${color.amber('?')} Select provider (1-${ordered.length})${defaultHint} ${color.dim('[q to quit]')}: `,\n )\n ).trim();\n\n if (providerAnswer.toLowerCase() === 'q') {\n renderer.write(color.dim('Cancelled.\\n'));\n return undefined;\n }\n\n if (!providerAnswer) {\n if (defaultIdx !== undefined) {\n const def = ordered[defaultIdx - 1];\n if (def) return pickModel(def.provider, modelsRegistry, renderer, reader, defaultModel);\n }\n renderer.write(color.dim('Cancelled.\\n'));\n return undefined;\n }\n\n const providerIdx = Number.parseInt(providerAnswer, 10);\n if (Number.isNaN(providerIdx) || providerIdx < 1 || providerIdx > ordered.length) {\n // Try matching by id\n const byId = ordered.find((o) => o.provider.id.toLowerCase() === providerAnswer.toLowerCase());\n if (!byId) {\n renderer.writeError(`Invalid selection: \"${providerAnswer}\"`);\n return undefined;\n }\n return pickModel(byId.provider, modelsRegistry, renderer, reader, defaultModel);\n }\n\n const chosen = ordered[providerIdx - 1];\n if (!chosen) return undefined;\n // Only honor the default-model hint when the user picked the default\n // provider; switching providers invalidates it.\n const modelHint = chosen.provider.id === defaultProvider ? defaultModel : undefined;\n return pickModel(chosen.provider, modelsRegistry, renderer, reader, modelHint);\n}\n\nasync function pickModel(\n provider: ResolvedProvider,\n registry: ModelsRegistry,\n renderer: TerminalRenderer,\n reader: ReadlineInputReader,\n defaultModel?: string | undefined,\n): Promise<PickerResult | undefined> {\n // Boxed header. The `<name> (<id>) models:` text is kept contiguous (a test\n // asserts it verbatim, and colors are no-ops off-TTY).\n renderer.write(`\\n${boxTop('Select a model')}\\n`);\n renderer.write(\n `${boxRow(`${color.bold(provider.name)} ${color.dim(`(${provider.id})`)} models:`)}\\n`,\n );\n renderer.write(`${boxBottom()}\\n`);\n // openai-codex picker mirrors the official Codex CLI header; only current\n // models are listed, but legacy ids remain usable via --model / config.json.\n // Uses the same helper as the live-TTY preamble so the two paths can't drift.\n const codexBlock = codexPickerPreamble(provider);\n if (codexBlock) renderer.write(codexBlock);\n\n const models = [...provider.models].sort((a, b) =>\n (b.release_date ?? '').localeCompare(a.release_date ?? ''),\n );\n\n if (models.length === 0) {\n // No catalog models \u2014 common for a freshly-picked local-server preset\n // (OmniRoute / Ollama / LM Studio / \u2026) whose model list auto-discovers\n // at boot or is known only to the user. Instead of dead-ending, let\n // them type a model id directly. Empty input cancels.\n renderer.write(\n color.dim(\n ' No models listed yet for this provider \u2014 type a model id to use it ' +\n '(local servers auto-discover models at launch).\\n',\n ),\n );\n const typed = (\n await reader.readLine(`\\n${color.amber('?')} Model id ${color.dim('(or Enter to cancel)')}: `)\n ).trim();\n if (!typed) {\n renderer.write(color.dim('Cancelled.\\n'));\n return undefined;\n }\n renderer.write(`\\n ${color.green('\u2713')} ${color.bold(provider.id)} / ${color.bold(typed)}\\n\\n`);\n return { provider: provider.id, model: typed };\n }\n\n // TTY: live type-to-filter model picker. Non-TYY (CI/piped/tests) falls\n // through to the paginated numbered picker below.\n if (process.stdin.isTTY) {\n const chosen = await runLiveModelPicker(provider, defaultModel);\n if (!chosen) {\n renderer.write(color.dim('Cancelled.\\n'));\n return undefined;\n }\n renderer.write(\n `\\n ${color.green('\u2713')} ${color.bold(provider.id)} / ${color.bold(chosen.id)}\\n\\n`,\n );\n return { provider: provider.id, model: chosen.id };\n }\n\n // Find default-model index for the \"Enter = default\" hint.\n const defaultIdxInModels =\n defaultModel !== undefined ? models.findIndex((m) => m.id === defaultModel) : -1;\n\n // Show paginated \u2014 up to 30 at a time\n const pageSize = 30;\n let offset = 0;\n\n while (offset < models.length) {\n const page = models.slice(offset, offset + pageSize);\n const pageFrom = offset + 1;\n const pageTo = Math.min(offset + page.length, models.length);\n // Each page is its own box so pagination prompts sit cleanly between boxes.\n renderer.write(`${boxTop(`Models ${pageFrom}\u2013${pageTo} of ${models.length}`)}\\n`);\n for (let i = 0; i < page.length; i++) {\n const m = expectDefined(page[i]);\n const num = offset + i + 1;\n const ctxRaw = m.limit?.context ? `${(m.limit.context / 1000).toFixed(0)}k` : '?';\n const ctx = theme.ctx(ctxRaw.padStart(6));\n const cost = m.cost?.input !== undefined ? `$${m.cost.input}/$${m.cost.output ?? '?'}` : '';\n const costCol = cost ? theme.cost(cost) : '';\n const capTags: string[] = [];\n if (m.tool_call) capTags.push('tools');\n if (m.reasoning) capTags.push('reason');\n if (m.modalities?.input?.includes('image')) capTags.push('vision');\n const capStr = capTags.map((c) => theme.caps(c)).join(color.dim(' '));\n const isDefault = m.id === defaultModel;\n const idLabel = isDefault ? theme.accent(color.bold(m.id)) : m.id;\n const suffix = isDefault ? color.dim(' (default)') : '';\n const num5 = color.dim(`${num}.`.padStart(5));\n renderer.write(\n `${boxRow(`${num5} ${padVisible(idLabel, 34)} ${ctx} ${padVisible(costCol, 11)} ${capStr}${suffix}`)}\\n`,\n );\n }\n renderer.write(`${boxBottom()}\\n`);\n offset += pageSize;\n\n if (offset < models.length) {\n const more = (\n await reader.readLine(\n `\\n${color.amber('?')} Showing ${Math.min(offset, models.length)}/${models.length} \u2014 Enter number, ${color.dim('Enter')} for more, or ${color.dim('q')} to quit: `,\n )\n ).trim();\n if (more.toLowerCase() === 'q') {\n renderer.write(color.dim('Cancelled.\\n'));\n return undefined;\n }\n if (!more) continue; // show next page\n return resolveModelSelection(more, models, provider, registry, renderer, reader);\n }\n }\n\n // All shown \u2014 final prompt. Enter accepts the default model when present.\n const defaultHint =\n defaultIdxInModels >= 0 && defaultModel ? ` ${color.dim(`[Enter = ${defaultModel}]`)}` : '';\n const answer = (\n await reader.readLine(\n `\\n${color.amber('?')} Select model (1-${models.length})${defaultHint} ${color.dim('[q to quit]')}: `,\n )\n ).trim();\n if (answer.toLowerCase() === 'q') {\n renderer.write(color.dim('Cancelled.\\n'));\n return undefined;\n }\n if (!answer) {\n if (defaultIdxInModels >= 0 && defaultModel) {\n renderer.write(\n `\\n ${color.green('\u2713')} ${color.bold(provider.id)} / ${color.bold(defaultModel)}\\n\\n`,\n );\n return { provider: provider.id, model: defaultModel };\n }\n renderer.write(color.dim('Cancelled.\\n'));\n return undefined;\n }\n return resolveModelSelection(answer, models, provider, registry, renderer, reader);\n}\n\nasync function resolveModelSelection(\n answer: string,\n models: {\n id: string;\n name: string;\n release_date?: string | undefined;\n limit?: { context?: number | undefined };\n cost?: { input?: number | undefined; output?: number | undefined };\n tool_call?: boolean | undefined;\n reasoning?: boolean | undefined;\n modalities?: { input?: string[] | undefined };\n }[],\n provider: ResolvedProvider,\n _registry: ModelsRegistry,\n renderer: TerminalRenderer,\n _reader: ReadlineInputReader,\n): Promise<PickerResult | undefined> {\n const idx = Number.parseInt(answer, 10);\n let modelId: string | undefined;\n\n if (!Number.isNaN(idx) && idx >= 1 && idx <= models.length) {\n modelId = models[idx - 1]?.id;\n } else {\n // Try fuzzy matching by id\n const lower = answer.toLowerCase();\n const match = models.find((m) => m.id.toLowerCase() === lower);\n if (match) {\n modelId = match.id;\n } else {\n // Partial match\n const partial = models.filter((m) => m.id.toLowerCase().includes(lower));\n if (partial.length === 1) {\n modelId = partial[0]?.id;\n } else if (partial.length > 1) {\n renderer.writeError(`\"${answer}\" matches multiple models. Be more specific.`);\n return undefined;\n }\n }\n }\n\n if (!modelId) {\n // Use as-is (user might know the exact model string)\n modelId = answer;\n }\n\n renderer.write(`\\n ${color.green('\u2713')} ${color.bold(provider.id)} / ${color.bold(modelId)}\\n\\n`);\n\n return { provider: provider.id, model: modelId };\n}\n\n// --- Helpers ---\n", "export interface ProviderPickerState {\n query: string;\n selected: number;\n status: 'typing' | 'submitted' | 'cancelled';\n}\n\nexport function applyPickerKey(\n state: ProviderPickerState,\n chunk: string,\n matchCount: number,\n): ProviderPickerState {\n if (chunk === '\\x1b[A') return { ...state, selected: Math.max(0, state.selected - 1) };\n if (chunk === '\\x1b[B')\n return { ...state, selected: Math.min(Math.max(0, matchCount - 1), state.selected + 1) };\n if (chunk === '\\x1b') return { ...state, query: '', selected: 0, status: 'typing' };\n if (chunk.charCodeAt(0) === 0x1b) return state;\n\n let query = state.query;\n let selected = state.selected;\n const status: ProviderPickerState['status'] = 'typing';\n for (const ch of chunk) {\n if (ch === '\\r' || ch === '\\n') {\n return { ...state, status: matchCount > 0 ? 'submitted' : 'typing' };\n }\n if (ch === '\\x03') return { ...state, status: 'cancelled' };\n if (ch === '\\x15') {\n query = '';\n selected = 0;\n continue;\n }\n if (ch === '\\x7f' || ch === '\\b') {\n query = query.slice(0, -1);\n selected = 0;\n continue;\n }\n if (ch >= ' ' && ch !== '\\x7f') {\n query += ch;\n selected = 0;\n }\n }\n return { query, selected, status };\n}\n", "import type { ModelsDevModel, ResolvedProvider } from '@wrongstack/core/types';\nimport { color, expectDefined, setOutputLineGuard, setRawMode, writeOut } from '@wrongstack/core/utils';\nimport { applyPickerKey, type ProviderPickerState } from './picker-key-state.js';\nimport {\n boxBottom,\n boxDivider,\n boxRow,\n boxTop,\n codexPickerPreamble,\n keyHints,\n padVisible,\n theme,\n} from './picker-ui.js';\n\nexport const LIVE_PICKER_MAX_VISIBLE = 15;\n\nexport function filterModels(query: string, models: ModelsDevModel[]): ModelsDevModel[] {\n const q = query.trim().toLowerCase();\n if (!q) return [...models];\n return models.filter((m) => m.id.toLowerCase().includes(q) || m.name.toLowerCase().includes(q));\n}\n\nexport function renderLiveModelList(\n query: string,\n filtered: ModelsDevModel[],\n selectedIdx: number,\n header: string,\n): string {\n const ordered = [...filtered].sort((a, b) =>\n (b.release_date ?? '').localeCompare(a.release_date ?? ''),\n );\n const visible = ordered.slice(0, LIVE_PICKER_MAX_VISIBLE);\n\n const lines: string[] = [];\n lines.push(boxTop('Select a model'));\n lines.push(boxRow(color.dim(header)));\n const caret = query.length > 0 ? color.dim('\u258F') : theme.cursor('\u258F');\n lines.push(boxRow(`${theme.accent('\u276F')} ${color.dim('Select model:')} ${query}${caret}`));\n lines.push(boxDivider());\n\n let flat = 0;\n for (const m of visible) {\n const selected = flat === selectedIdx;\n const marker = selected ? theme.cursor('\u25B6') : ' ';\n const ctxRaw = m.limit?.context ? `${(m.limit.context / 1000).toFixed(0)}k` : '?';\n const ctx = theme.ctx(ctxRaw.padStart(6));\n const costRaw = m.cost?.input !== undefined ? `$${m.cost.input}/$${m.cost.output ?? '?'}` : '';\n const cost = costRaw ? theme.cost(costRaw) : '';\n const capTags: string[] = [];\n if (m.tool_call) capTags.push('tools');\n if (m.reasoning) capTags.push('reason');\n if (m.modalities?.input?.includes('image')) capTags.push('vision');\n const caps = capTags.map((c) => theme.caps(c)).join(color.dim(' '));\n const id = selected ? theme.accent(color.bold(m.id)) : m.id;\n lines.push(boxRow(`${marker} ${padVisible(id, 34)} ${ctx} ${padVisible(cost, 12)} ${caps}`));\n flat++;\n }\n\n if (ordered.length > LIVE_PICKER_MAX_VISIBLE) {\n lines.push(\n boxRow(color.dim(` \u2026 ${ordered.length - LIVE_PICKER_MAX_VISIBLE} more \u2014 type to filter`)),\n );\n }\n lines.push(boxDivider());\n lines.push(\n boxRow(\n keyHints([\n ['\u2191\u2193', 'move'],\n ['Enter', 'select'],\n ['Esc', 'clear'],\n ['Ctrl+C', 'quit'],\n ]),\n ),\n );\n lines.push(boxBottom());\n return lines.join('\\n');\n}\n\nexport async function runLiveModelPicker(\n provider: ResolvedProvider,\n defaultModel?: string,\n): Promise<ModelsDevModel | undefined> {\n const stdin = process.stdin;\n const out = process.stdout;\n if (!stdin.isTTY || !out.isTTY) return undefined;\n\n const header = `${provider.name} (${provider.id}) models:`;\n const byNewest = (a: ModelsDevModel, b: ModelsDevModel): number =>\n (b.release_date ?? '').localeCompare(a.release_date ?? '');\n const ranked = [...provider.models].sort(byNewest);\n const defaultIdx =\n defaultModel !== undefined ? ranked.findIndex((m) => m.id === defaultModel) : -1;\n\n setOutputLineGuard(null);\n let state: ProviderPickerState = {\n query: '',\n selected: defaultIdx >= 0 ? defaultIdx : 0,\n status: 'typing',\n };\n const order = (filtered: ModelsDevModel[]): ModelsDevModel[] => [...filtered].sort(byNewest);\n let ordered = order(filterModels(state.query, provider.models));\n const visibleCount = (): number => Math.min(ordered.length, LIVE_PICKER_MAX_VISIBLE);\n const clamp = (): void => {\n if (state.selected >= visibleCount()) state.selected = Math.max(0, visibleCount() - 1);\n };\n clamp();\n const preamble = codexPickerPreamble(provider);\n if (preamble) writeOut(preamble);\n let frame = renderLiveModelList(state.query, ordered, state.selected, header);\n writeOut(frame);\n\n return new Promise<ModelsDevModel | undefined>((resolve) => {\n const wasRaw = stdin.isRaw;\n const wasPaused = stdin.isPaused();\n setRawMode(stdin, true);\n stdin.resume();\n stdin.setEncoding('utf8');\n\n const cleanup = (): void => {\n stdin.off('data', onData);\n setRawMode(stdin, wasRaw);\n if (wasPaused) stdin.pause();\n };\n const repaint = (): void => {\n const ups = (frame.match(/\\n/g) ?? []).length;\n writeOut(`\\x1b[${ups}A\\r\\x1b[J`);\n ordered = order(filterModels(state.query, provider.models));\n clamp();\n frame = renderLiveModelList(state.query, ordered, state.selected, header);\n writeOut(frame);\n };\n const onData = (chunk: string): void => {\n ordered = order(filterModels(state.query, provider.models));\n state = applyPickerKey(state, chunk, visibleCount());\n ordered = order(filterModels(state.query, provider.models));\n clamp();\n if (state.status === 'cancelled') {\n cleanup();\n writeOut('\\n');\n resolve(undefined);\n return;\n }\n if (state.status === 'submitted') {\n if (ordered.length === 0) {\n state = { ...state, status: 'typing' };\n repaint();\n return;\n }\n const pick = ordered[state.selected] ?? expectDefined(ordered[0]);\n cleanup();\n writeOut('\\n');\n resolve(pick);\n return;\n }\n repaint();\n };\n stdin.on('data', onData);\n });\n}\n", "import type { ResolvedProvider } from '@wrongstack/core/types';\nimport { color, stripAnsi } from '@wrongstack/core/utils';\n\nexport const theme = {\n accent: color.amber,\n chrome: color.gray,\n cursor: (s: string): string => color.amber(color.bold(s)),\n ctx: color.cyan,\n cost: color.green,\n caps: color.magenta,\n};\n\nconst BOX = {\n tl: '\u256D',\n tr: '\u256E',\n bl: '\u2570',\n br: '\u256F',\n h: '\u2500',\n v: '\u2502',\n} as const;\n\nconst PICKER_MIN_WIDTH = 74;\nconst PICKER_MAX_WIDTH = 100;\n\nfunction pickerWidth(): number {\n const cols = process.stdout.columns;\n if (typeof cols !== 'number' || !Number.isFinite(cols) || cols <= 0) {\n return PICKER_MIN_WIDTH;\n }\n return Math.max(PICKER_MIN_WIDTH, Math.min(PICKER_MAX_WIDTH, cols - 2));\n}\n\nfunction visibleWidth(s: string): number {\n return stripAnsi(s).length;\n}\n\nexport function padVisible(s: string, width: number): string {\n const w = visibleWidth(s);\n if (w === width) return s;\n if (w < width) return s + ' '.repeat(width - w);\n const plain = stripAnsi(s);\n return `${plain.slice(0, Math.max(0, width - 1))}\u2026`;\n}\n\nexport function boxTop(title: string): string {\n const width = pickerWidth();\n const label = ` ${title} `;\n const pad = Math.max(0, width - visibleWidth(label) - 1);\n return theme.chrome(\n `${BOX.tl}${BOX.h}${theme.accent(color.bold(label))}${theme.chrome(BOX.h.repeat(pad))}${BOX.tr}`,\n );\n}\n\nexport function boxBottom(): string {\n return theme.chrome(`${BOX.bl}${BOX.h.repeat(pickerWidth())}${BOX.br}`);\n}\n\nexport function boxRow(content: string): string {\n return `${theme.chrome(BOX.v)} ${padVisible(content, pickerWidth() - 2)} ${theme.chrome(BOX.v)}`;\n}\n\nexport function boxDivider(): string {\n return theme.chrome(`${BOX.v}${BOX.h.repeat(pickerWidth())}${BOX.v}`);\n}\n\nexport function keyHints(pairs: Array<[string, string]>): string {\n return pairs.map(([k, label]) => `${theme.accent(k)} ${color.dim(label)}`).join(color.dim(' \u00B7 '));\n}\n\nconst CODEX_PROVIDER_ID = 'openai-codex';\nconst CODEX_PICKER_HEADER = 'Select Model and Effort';\nconst CODEX_LEGACY_NOTE =\n 'Access legacy models by running `wstack -m <model_name>` or in your `config.json`.';\n\nexport function codexPickerPreamble(provider: ResolvedProvider): string {\n if (provider.id !== CODEX_PROVIDER_ID) return '';\n return ` ${color.bold(CODEX_PICKER_HEADER)}\\n${color.dim(` ${CODEX_LEGACY_NOTE}`)}\\n\\n`;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["color", "expectDefined", "setOutputLineGuard", "setRawMode", "stripAnsi", "writeOut", "color", "color", "color", "stripAnsi", "writeOut", "setOutputLineGuard", "setRawMode", "chosen", "expectDefined"]
|
|
7
|
-
}
|