@wrongstack/cli 0.296.4 → 0.298.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{acp-A5OSIU2P.js → acp-S4LZQB66.js} +91 -23
- package/dist/{auth-CJWQJVRH.js → auth-NLLGEYQR.js} +3 -3
- package/dist/boot/dispatch-webui.d.ts +7 -0
- 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/launch-banner.d.ts +22 -0
- package/dist/boot/tui-session-resume.d.ts +10 -1
- package/dist/chimera-leader-wake.d.ts +57 -0
- 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-IHBYBYGA.js → chunk-A6Q5KGLV.js} +51 -18
- package/dist/{chunk-ABXK4VVY.js → chunk-ARWGQUB3.js} +2 -1
- package/dist/{chunk-OI7GWJDS.js → chunk-C5GH4YBL.js} +1389 -184
- 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-WY7KKOUK.js → chunk-JW75HY4F.js} +31 -10
- package/dist/chunk-U3SS4NRH.js +10 -0
- package/dist/{chunk-Z7YGASQP.js → chunk-V3XH6XBJ.js} +30 -26
- package/dist/{chunk-BQCAJ7FI.js → chunk-XTIXVJXP.js} +16 -3
- package/dist/{cli-main-TOAWVJDY.js → cli-main-TJEU4OUY.js} +25912 -25134
- package/dist/cli-main-helpers.d.ts +42 -2
- package/dist/{execution-O7I5DYE6.js → execution-INOV5P7N.js} +1264 -650
- 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/goal-host.d.ts +1 -1
- package/dist/governance-V2Z42RBE.js +65 -0
- package/dist/governance-hq-telemetry.d.ts +17 -0
- package/dist/{hq-JUYKUNJX.js → hq-WO6CLUSI.js} +2 -2
- package/dist/hq-publisher.d.ts +3 -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 +44 -2
- package/dist/hq-server/utils.d.ts +51 -6
- package/dist/hq-server/ws.d.ts +61 -2
- package/dist/{hq-server-6AQ3BXZA.js → hq-server-6TSAORAC.js} +2 -2
- package/dist/hq-server.d.ts +10 -0
- package/dist/index.js +337 -42
- package/dist/kanban-hq-sync.d.ts +13 -1
- package/dist/live-settings-input.d.ts +10 -1
- package/dist/{mailbox-serve-2UWHEN3M.js → mailbox-serve-DBOOOOWZ.js} +50 -8
- package/dist/{sdd-runtime-JG4EEKL6.js → sdd-runtime-AIJCJGWC.js} +2 -2
- package/dist/services/sdd/state.d.ts +3 -3
- package/dist/settings-menu.d.ts +1 -1
- package/dist/slash-commands/command-context.d.ts +2 -0
- package/dist/slash-commands/fallback.d.ts +2 -0
- package/dist/slash-commands/goal-refiner.d.ts +1 -1
- package/dist/slash-commands/goal.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/kanban-host-adapter.d.ts +1 -1
- package/dist/webui-server/session-start-payload.d.ts +4 -0
- package/dist/{webui-server-ZF5KVGC5.js → webui-server-PCLSXX6L.js} +164 -134
- package/dist/webui-server-options.d.ts +7 -0
- package/dist/wiring/brain-and-orchestration.d.ts +2 -0
- package/dist/wiring/hq-telemetry.d.ts +4 -3
- package/dist/wiring/lifecycle-plugins.d.ts +5 -8
- package/dist/wiring/metrics.d.ts +1 -1
- package/dist/wiring/provider-runtime-setup.d.ts +2 -2
- package/package.json +23 -22
- 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-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-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-BQCAJ7FI.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-OI7GWJDS.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-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-WY7KKOUK.js.map +0 -7
- package/dist/chunk-XJXDOF63.js.map +0 -7
- package/dist/chunk-XWEGWYDU.js.map +0 -7
- package/dist/chunk-YWUPHRGB.js.map +0 -7
- package/dist/chunk-Z7YGASQP.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-TOAWVJDY.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-O7I5DYE6.js.map +0 -7
- 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-JUYKUNJX.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-6AQ3BXZA.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-2UWHEN3M.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-JG4EEKL6.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-ZF5KVGC5.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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tui-sdd-callback.d.ts","sourceRoot":"","sources":["../../src/boot/tui-sdd-callback.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC,CAGtD;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAkCnE"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tui-session-resume.d.ts","sourceRoot":"","sources":["../../src/boot/tui-session-resume.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAExD,OAAO,KAAK,EAAiB,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE1E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,eAAe,CAAC;IACvB,KAAK,EAAE,KAAK,CAAC;IACb,YAAY,EAAE,YAAY,CAAC;IAC3B,sBAAsB,EAClB,CAAC,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,GAClF,SAAS,CAAC;IACd,wFAAwF;IACxF,MAAM,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;CAC/B;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,oBAAoB,EACzB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CA2PrC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tui-settings-adapter.d.ts","sourceRoot":"","sources":["../../src/boot/tui-settings-adapter.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAU,WAAW,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAEtF,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAEvE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AASnE,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,WAAW,CAAC;IACzB,MAAM,EAAE,WAAW,CAAC;IACpB,qBAAqB,EAAE;QAAE,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAC,GAAG,SAAS,CAAA;KAAE,GAAG,SAAS,CAAC;IAClG,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,iBAAiB,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CACjE;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,YAAY,EAAE,CAAC,CAAC,EAAE,iBAAiB,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CAChE;AAYD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,sBAAsB,GAAG,eAAe,CAselF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"boot-config.d.ts","sourceRoot":"","sources":["../src/boot-config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,UAAU,IAAI,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAE3E,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,WAAW,CAAC;IACpB,YAAY,EAAE,mBAAmB,CAAC;CACnC;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,eAAe,CAAC;CACxB;AAED,iEAAiE;AACjE,KAAK,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;AAE3E;;;;;;GAMG;AACH,wBAAsB,UAAU,CAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GACtC,OAAO,CAAC,gBAAgB,CAAC,CAc3B"}
|
package/dist/boot.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"boot.d.ts","sourceRoot":"","sources":["../src/boot.ts"],"names":[],"mappings":"AAkCA,OAAO,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAClF,OAAO,EAAqB,KAAK,WAAW,EAAY,MAAM,wBAAwB,CAAC;AAEvF,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAWhE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAYxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAgDpD;;;;;;;;;GASG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,cAAc,GAC7B,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAAC,CAiB1D;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,WAAW,CAAC;IACnB,MAAM,EAAE,WAAW,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC;IACxC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,EAAE,cAAc,CAAC;IAC/B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,MAAM,EAAE,mBAAmB,CAAC;IAC5B,MAAM,EAAE,aAAa,CAAC;IACtB,gFAAgF;IAChF,UAAU,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IACpC,2FAA2F;IAC3F,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAClC;AAsBD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGtE;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,OAAO,EACpB,UAAU,EAAE,OAAO,GAAG,SAAS,EAC/B,IAAI,EAAE,OAAO,GACZ,OAAO,CAET;AAED;;;;;GAKG;AACH,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,GAAG,MAAM,CAAC,CAgfxE"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"panel-service.d.ts","sourceRoot":"","sources":["../../src/brain-menu/panel-service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAoB,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAEjF,OAAO,KAAK,EAAE,cAAc,EAAsB,MAAM,iBAAiB,CAAC;AAE1E,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,YAAY,CAAC;CAC5B;AAQD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,qBAAqB,GAAG,cAAc,CAkIhF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"chimera-review-task.d.ts","sourceRoot":"","sources":["../src/chimera-review-task.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,2BAA2B,EAC3B,0BAA0B,EAC3B,MAAM,yBAAyB,CAAC;AAIjC,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAQtF;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAW7D;AAED,wBAAgB,iCAAiC,CAAC,CAAC,EAAE,0BAA0B,GAAG,MAAM,CAyFvF;AAED,wBAAgB,kCAAkC,CAChD,SAAS,EAAE,gBAAgB,EAC3B,CAAC,EAAE,2BAA2B,GAC7B,MAAM,CA2CR"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"chimera-reviewer-policy.d.ts","sourceRoot":"","sources":["../src/chimera-reviewer-policy.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D;;;;;;;;GAQG;AACH,wBAAgB,6BAA6B,CAC3C,oBAAoB,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS;AACpD,0DAA0D;AAC1D,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,EAAE,CAQV;AASD,uEAAuE;AACvE,wBAAgB,+BAA+B,CAAC,KAAK,SAAI,GAAG,IAAI,CAE/D;AAED;;;;;;GAMG;AACH,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,cAAc,EAAE,SAAS,MAAM,EAAE,GAChC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,EAAE,CAAA;CAAE,CAqB/D;AAED;;;GAGG;AACH,eAAO,MAAM,8BAA8B,gFAOhC,CAAC;AAEZ,wBAAgB,kCAAkC,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc,CASzF"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/subcommands/handlers/chronicle.ts"],
|
|
4
|
-
"sourcesContent": ["import { statSync } from 'node:fs';\nimport {\n type ChronicleFacet,\n type ChronicleMetricsView,\n type ChronicleQuery,\n createChronicleProjectAccess,\n} from '@wrongstack/core/chronicle';\nimport type { SubcommandHandler } from '../index.js';\n\nconst facets = new Set<ChronicleFacet>([\n 'eventType',\n 'outcome',\n 'projectId',\n 'sessionId',\n 'agentId',\n 'taskId',\n 'providerId',\n 'modelId',\n 'resourceKind',\n 'resourcePath',\n 'toolCallId',\n]);\n\n/** `wstack chronicle` \u2014 query the cross-session provenance ledger. */\nexport const chronicleCmd: SubcommandHandler = async (args, deps) => {\n const operation = args[0] ?? 'query';\n if (operation === 'help' || operation === '--help' || operation === '-h') {\n deps.renderer.write(usage());\n return 0;\n }\n let access: ReturnType<typeof createChronicleProjectAccess> | undefined;\n try {\n access = createChronicleProjectAccess({\n projectRoot: deps.projectRoot,\n userHome: deps.userHome,\n });\n if (operation === 'status') {\n const health = await access.call('ping', {});\n deps.renderer.write(\n `${JSON.stringify(\n {\n mode: access.mode,\n owner: {\n pid: health.pid,\n uptimeMs: health.uptimeMs,\n clients: health.clients,\n activeRequests: health.activeRequests,\n endpoint: health.endpoint,\n },\n pipeline: {\n collection: 'session-event-adapters',\n processing:\n access.mode === 'server' ? 'project-chronicle-server' : 'inline-chronicle-fallback',\n storage: health.chronicleDirectory,\n serving: 'wstack-chronicle-cli',\n },\n journal: health.journal,\n watcher: health.watcher,\n },\n null,\n 2,\n )}\\n`,\n );\n return 0;\n }\n\n // `wstack chronicle prune [--dry-run] [--days N]`\n if (operation === 'prune') {\n const dryRun = args.includes('--dry-run') || args.includes('-n');\n const daysIndex = args.indexOf('--days');\n const rawDays =\n daysIndex >= 0 && daysIndex + 1 < args.length ? args[daysIndex + 1] : undefined;\n const days = rawDays ? parseInt(rawDays, 10) : 30;\n if (!Number.isFinite(days) || days < 1) {\n deps.renderer.writeError(\n `Invalid retention days: ${rawDays ?? ''}. Use --days N (positive integer).\\n`,\n );\n return 1;\n }\n const result = await access.call('purge', { retentionDays: days, dryRun });\n if (dryRun) {\n // \"entries\" rather than \"files\": SQLite purges whole day-chains, the\n // legacy store purged partition files. Both are entries to the caller.\n deps.renderer.write(`Dry-run: would delete ${result.candidates?.length ?? 0} entries`);\n if (result.candidates?.length) {\n const totalBytes = result.candidates.reduce((sum: number, f: string) => {\n try {\n return sum + statSync(f).size;\n } catch {\n return sum;\n }\n }, 0);\n deps.renderer.write(` (${formatBytes(totalBytes)}):\\n`);\n for (const file of result.candidates!) {\n const s = tryStat(file);\n const age = s ? `${Math.round((Date.now() - s.mtimeMs) / 86400000)}d` : '?';\n deps.renderer.write(` ${file} (${age}, ${formatBytes(s?.size ?? 0)})\\n`);\n }\n } else {\n deps.renderer.write('.\\n');\n }\n } else {\n const bytes = result.deletedBytes;\n deps.renderer.write(`Purged ${result.deletedCount} entries (${formatBytes(bytes)})`);\n if (result.errors.length) deps.renderer.write(`, ${result.errors.length} errors`);\n deps.renderer.write('.\\n');\n for (const err of result.errors) {\n deps.renderer.writeError(` Error: ${err.file}: ${err.reason}\\n`);\n }\n }\n return result.errors.length > 0 ? 1 : 0;\n }\n\n // `wstack chronicle metrics [providers|tasks|files|summary] [key=value ...]`\n // Incrementally ingests new journal bytes into metrics.db, then queries the\n // derived aggregates instead of streaming raw partitions.\n if (operation === 'metrics') {\n const hasView = Boolean(args[1] && !args[1].includes('='));\n const rawView = hasView ? args[1]! : 'summary';\n if (!isMetricsView(rawView)) {\n deps.renderer.writeError(\n `Unknown metrics view: ${rawView}. Use providers|tasks|files|summary.\\n`,\n );\n return 1;\n }\n const view: ChronicleMetricsView = rawView;\n const filters = parseQuery(args.slice(hasView ? 2 : 1));\n try {\n const result = await access.call('metrics', {\n view,\n ...(view === 'providers'\n ? {\n providers: {\n ...(filters.from ? { from: filters.from } : {}),\n ...(filters.to ? { to: filters.to } : {}),\n },\n }\n : {}),\n ...(view === 'tasks'\n ? {\n tasks: {\n ...(filters.sessionId ? { sessionId: filters.sessionId } : {}),\n ...(filters.limit ? { limit: filters.limit } : {}),\n },\n }\n : {}),\n ...(view === 'files'\n ? {\n files: {\n ...(filters.path ? { path: filters.path } : {}),\n ...(filters.taskId ? { taskId: filters.taskId } : {}),\n ...(filters.sessionId ? { sessionId: filters.sessionId } : {}),\n ...(filters.limit ? { limit: filters.limit } : {}),\n },\n }\n : {}),\n });\n deps.renderer.write(\n JSON.stringify({ refreshed: result.refreshed, [view]: result.data }, null, 2) + '\\n',\n );\n return 0;\n } catch (error) {\n deps.renderer.writeError(`${error instanceof Error ? error.message : String(error)}\\n`);\n return 1;\n }\n }\n\n if (operation === 'facet') {\n const field = args[1] as ChronicleFacet | undefined;\n if (!field || !facets.has(field)) {\n deps.renderer.writeError(`Unknown facet. Use: ${[...facets].join(', ')}\\n`);\n return 1;\n }\n const query = parseQuery(args.slice(2));\n const result = await access.call('facet', { field, query });\n deps.renderer.write(JSON.stringify({ field, ...result }, null, 2) + '\\n');\n return 0;\n }\n if (operation !== 'query') {\n deps.renderer.writeError(`Unknown Chronicle operation: ${operation}\\n${usage()}`);\n return 1;\n }\n const result = await access.call('query', { query: parseQuery(args.slice(1)) });\n deps.renderer.write(JSON.stringify(result, null, 2) + '\\n');\n return 0;\n } catch (error) {\n deps.renderer.writeError(`${error instanceof Error ? error.message : String(error)}\\n`);\n return 1;\n } finally {\n await access?.close();\n }\n};\n\nfunction isMetricsView(value: string): value is ChronicleMetricsView {\n return ['providers', 'tasks', 'files', 'summary'].includes(value);\n}\n\nfunction parseQuery(tokens: string[]): ChronicleQuery {\n const query: ChronicleQuery = {};\n for (const token of tokens) {\n const split = token.indexOf('=');\n if (split < 1) continue;\n const key = token.slice(0, split),\n value = token.slice(split + 1);\n if (key === 'eventType') query.eventTypes = value.split(',').filter(Boolean);\n else if (key === 'outcome')\n query.outcomes = value.split(',').filter(Boolean) as NonNullable<ChronicleQuery['outcomes']>;\n else if (key === 'resourceKind')\n query.resourceKind = value as NonNullable<ChronicleQuery['resourceKind']>;\n else if (key === 'line' || key === 'limit') query[key] = Number(value);\n else if (key === 'order' && (value === 'asc' || value === 'desc')) query.order = value;\n else if (key.startsWith('tag.')) {\n const tags = query.tags ?? {};\n tags[key.slice(4)] = value;\n query.tags = tags;\n } else if (key.startsWith('attr.')) {\n const attributes = query.attributes ?? {};\n attributes[key.slice(5)] = parseValue(value);\n query.attributes = attributes;\n } else if (isStringQueryKey(key)) query[key] = value;\n }\n return query;\n}\n\nfunction isStringQueryKey(\n key: string,\n): key is\n | 'from'\n | 'to'\n | 'projectId'\n | 'sessionId'\n | 'agentId'\n | 'taskId'\n | 'providerId'\n | 'modelId'\n | 'traceId'\n | 'logicalRequestId'\n | 'attemptId'\n | 'toolCallId'\n | 'resourceId'\n | 'path'\n | 'text'\n | 'cursor' {\n return [\n 'from',\n 'to',\n 'projectId',\n 'sessionId',\n 'agentId',\n 'taskId',\n 'providerId',\n 'modelId',\n 'traceId',\n 'logicalRequestId',\n 'attemptId',\n 'toolCallId',\n 'resourceId',\n 'path',\n 'text',\n 'cursor',\n ].includes(key);\n}\n\nfunction parseValue(value: string): unknown {\n try {\n return JSON.parse(value);\n } catch {\n return value;\n }\n}\n\nfunction usage(): string {\n return (\n 'Usage:\\n' +\n ' wstack chronicle query [field=value ...]\\n' +\n ' wstack chronicle status\\n' +\n ' wstack chronicle facet <field> [field=value ...]\\n' +\n ' wstack chronicle metrics [providers|tasks|files|summary] [field=value ...]\\n' +\n ' wstack chronicle prune [--days N] [--dry-run]\\n\\n' +\n 'Examples:\\n' +\n ' wstack chronicle status\\n' +\n ' wstack chronicle query path=src/app.ts line=42\\n' +\n ' wstack chronicle query providerId=openai outcome=failure\\n' +\n ' wstack chronicle query eventType=tool.executed sessionId=<id> limit=50\\n' +\n ' wstack chronicle query attr.tool.name=read\\n' +\n ' wstack chronicle facet modelId from=2026-07-01T00:00:00Z\\n' +\n ' wstack chronicle metrics providers from=2026-07-01\\n' +\n ' wstack chronicle metrics files path=src/app.ts\\n' +\n ' wstack chronicle metrics tasks limit=20\\n' +\n ' wstack chronicle prune --days 7 --dry-run\\n' +\n ' wstack chronicle prune --days 30\\n'\n );\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1048576) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / 1048576).toFixed(1)} MB`;\n}\n\nfunction tryStat(file: string): { size: number; mtimeMs: number } | undefined {\n try {\n const s = statSync(file);\n return { size: s.size, mtimeMs: s.mtimeMs };\n } catch {\n return undefined;\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["result"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/project-picker.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Interactive project picker for the CLI.\n *\n * Renders an arrow-navigable, scrollable menu listing known projects,\n * plus actions like \"Start new session\" and \"Previous sessions\".\n * Uses raw terminal input to capture arrow keys and Enter.\n *\n * @module project-picker\n */\nimport { color } from '@wrongstack/core/utils';\nimport type { ProjectEntry } from './services/project-manifest.js';\nimport { loadManifest } from './services/project-manifest.js';\n\n// \u2500\u2500 ANSI constants \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst CSI = '\\x1b[';\nconst CURSOR_HIDE = `${CSI}?25l`;\nconst CURSOR_SHOW = `${CSI}?25h`;\nconst CLEAR_SCREEN = `${CSI}2J`;\nconst CURSOR_HOME = `${CSI}H`;\n\nconst ARROW_UP = '\\x1b[A';\nconst ARROW_DOWN = '\\x1b[B';\nconst ARROW_UP_ALT = '\\x1bOA';\nconst ARROW_DOWN_ALT = '\\x1bOB';\nconst PAGE_UP = '\\x1b[5~';\nconst PAGE_DOWN = '\\x1b[6~';\nconst ENTER = '\\r';\nconst CTRL_C = '\\x03';\nconst ESC = '\\x1b';\nconst BS = '\\x7f';\n\n// \u2500\u2500 Types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface PickerItem {\n key: string; // unique identifier\n label: string; // primary display line\n subtitle?: string | undefined; // secondary dim line (e.g. path)\n meta?: string | undefined; // right-aligned info (e.g. \"yesterday\")\n kind: 'project' | 'action';\n}\n\nexport interface PickerConfig {\n title: string;\n items: PickerItem[];\n globalConfigPath?: string | undefined;\n}\n\nexport interface PickerResult {\n kind: 'project' | 'action';\n key: string;\n /** Resolved project entry (only set when kind === 'project') */\n project?: ProjectEntry | undefined;\n /** Action identifier: 'new-session', 'prev-sessions', 'quit' */\n action?: 'new-session' | 'prev-sessions' | 'quit' | undefined;\n}\n\n// \u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction fmtLastSeen(iso: string | undefined): string {\n if (!iso) return 'never';\n const diff = Date.now() - new Date(iso).getTime();\n const min = Math.floor(diff / 60000);\n if (min < 1) return 'just now';\n if (min < 60) return `${min}m ago`;\n const hours = Math.floor(min / 60);\n if (hours < 24) return `${hours}h ago`;\n const days = Math.floor(hours / 24);\n if (days === 1) return 'yesterday';\n if (days < 30) return `${days}d ago`;\n if (days < 365) return `${Math.floor(days / 30)}mo ago`;\n return `${Math.floor(days / 365)}y ago`;\n}\n\n/**\n * Get the terminal height, defaulting to 24 if it can't be determined.\n */\nfunction terminalHeight(): number {\n return process.stdout.rows || 24;\n}\n\n/**\n * Build the picker items from the projects manifest plus built-in actions.\n */\nexport async function buildPickerItems(opts: {\n globalConfigPath?: string | undefined;\n currentProjectRoot?: string | undefined;\n}): Promise<PickerItem[]> {\n const manifest = await loadManifest(opts.globalConfigPath);\n const sorted = [...manifest.projects].sort((a, b) => {\n if (a.lastSeen && b.lastSeen) {\n const cmp = b.lastSeen.localeCompare(a.lastSeen);\n return cmp !== 0 ? cmp : a.name.localeCompare(b.name);\n }\n if (a.lastSeen) return -1;\n if (b.lastSeen) return 1;\n return a.name.localeCompare(b.name);\n });\n\n const items: PickerItem[] = [];\n\n for (const p of sorted) {\n const isCurrent = p.root === opts.currentProjectRoot;\n const marker = isCurrent ? '\u25CF' : ' ';\n items.push({\n key: p.slug,\n label: `${marker} ${p.name}`,\n subtitle: p.root,\n meta: fmtLastSeen(p.lastSeen),\n kind: 'project',\n });\n }\n\n // Divider + action items\n items.push(\n { key: '__divider__', label: '\u2500'.repeat(32), kind: 'action' },\n { key: 'new-session', label: '+ Start new session', kind: 'action', meta: 'current project' },\n { key: 'prev-sessions', label: '\u23F1 Previous sessions', kind: 'action', meta: 'resume' },\n { key: 'quit', label: 'q Quit', kind: 'action' },\n );\n\n return items;\n}\n\n// \u2500\u2500 Rendering \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction renderPickerFrame(\n items: PickerItem[],\n selectedIdx: number,\n scrollOffset: number,\n visibleHeight: number,\n title: string,\n filter: string,\n out: NodeJS.WriteStream,\n): void {\n const width = out.columns || 80;\n const pad = ' '.repeat(2);\n\n // Clear screen and move home\n out.write(CLEAR_SCREEN);\n out.write(CURSOR_HOME);\n\n // Title\n out.write(`\\n${pad}${color.bold(color.amber(title))}\\n`);\n\n // Search/filter bar \u2014 always visible when filter is non-empty\n if (filter.length > 0) {\n out.write(`${pad}${color.cyan('Filter:')} ${filter}${color.dim('\u2588')}\\n`);\n // Divider after filter bar\n const divider = color.dim('\u2500'.repeat(Math.min(width - 4, 60)));\n out.write(`${pad}${divider}\\n`);\n } else {\n // Normal divider\n const divider = color.dim('\u2500'.repeat(Math.min(width - 4, 60)));\n out.write(`${pad}${divider}\\n`);\n }\n\n // Empty state\n if (items.length === 0) {\n if (filter.length > 0) {\n out.write(`\\n${pad}${color.dim('No projects match your filter.')}\\n`);\n out.write(`${pad}${color.dim('Press ESC to clear filter, or backspace to refine.')}\\n`);\n } else {\n out.write(`\\n${pad}${color.dim('No projects registered.')}\\n`);\n out.write(`${pad}${color.dim('Use /project add <path> to register one.')}\\n`);\n }\n return;\n }\n\n // Adjust visible height: filter bar adds 2 lines (filter line + divider)\n const filterOverhead = filter.length > 0 ? 2 : 0;\n const effectiveVisible = Math.max(3, visibleHeight - filterOverhead);\n const maxIdx = Math.min(items.length, scrollOffset + effectiveVisible);\n\n for (let i = scrollOffset; i < maxIdx; i++) {\n const item = items[i];\n if (!item) continue;\n\n const isSelected = i === selectedIdx;\n const prefix = isSelected ? color.bold(color.cyan(' \u25B8 ')) : ' ';\n\n if (item.key === '__divider__') {\n out.write(`\\n${pad}${color.dim(item.label)}\\n`);\n continue;\n }\n\n // Build the line: [marker] label \u2026 meta\n const labelText = isSelected ? color.bold(item.label) : item.label;\n const metaText = item.meta ? color.dim(` ${item.meta}`) : '';\n\n // Truncate subtitle if too long\n let sub = '';\n if (item.subtitle) {\n const maxSub = width - 10;\n const truncated =\n item.subtitle.length > maxSub\n ? `\u2026${item.subtitle.slice(item.subtitle.length - maxSub + 1)}`\n : item.subtitle;\n sub = `\\n${pad} ${color.dim(truncated)}`;\n }\n\n const line = `${prefix} ${labelText}${metaText}`;\n out.write(`${line}${sub}\\n`);\n }\n\n // Scroll indicator\n if (items.length > effectiveVisible) {\n const pct = Math.round((scrollOffset / Math.max(1, items.length - effectiveVisible)) * 100);\n out.write(\n `\\n${pad}${color.dim(`\u2191 ${scrollOffset + 1}-${Math.min(scrollOffset + effectiveVisible, items.length)} of ${items.length} (${pct}%) \u2193`)}\\n`,\n );\n }\n\n // Footer hint \u2014 context-sensitive\n if (filter.length > 0) {\n out.write(\n `\\n${pad}${color.dim('type to filter \u2191\u2193 navigate \u21B5 select ESC clear Ctrl+C quit')}\\n`,\n );\n } else {\n out.write(\n `\\n${pad}${color.dim('type to filter \u2191\u2193 navigate PgUp PgDn page \u21B5 select q quit')}\\n`,\n );\n }\n}\n\n/**\n * Filter items by a case-insensitive substring match against label and subtitle.\n * Only project items are filtered; action items and dividers always appear.\n *\n * @public \u2014 exported for testing\n */\nexport function filterItems(allItems: PickerItem[], filter: string): PickerItem[] {\n if (filter.length === 0) return allItems;\n\n const lower = filter.toLowerCase();\n const projectItems = allItems.filter((item) => {\n if (item.kind !== 'project') return true; // actions/dividers pass through\n const labelMatch = item.label.toLowerCase().includes(lower);\n const subMatch = item.subtitle?.toLowerCase().includes(lower);\n return labelMatch || subMatch;\n });\n\n // If filter yields no project results, still show action items + divider\n // So the user can ESC clear or quit\n return projectItems;\n}\n\n/**\n * Compute the effective visible height accounting for the filter bar overhead.\n *\n * @public \u2014 exported for testing\n */\nexport function effectiveVisibleHeight(baseVisibleHeight: number, filter: string): number {\n const overhead = filter.length > 0 ? 2 : 0; // filter bar + its divider\n return Math.max(3, baseVisibleHeight - overhead);\n}\n\n/**\n * Skip divider items at the given index, moving forward or backward.\n * Returns the adjusted index, clamped to bounds.\n *\n * @public \u2014 exported for testing\n */\nexport function skipDivider(items: PickerItem[], idx: number, direction: -1 | 1): number {\n let i = idx;\n while (i >= 0 && i < items.length && items[i]?.key === '__divider__') {\n i += direction;\n }\n return Math.max(0, Math.min(items.length - 1, i));\n}\n\n/**\n * Run the interactive project picker. Returns the selection or undefined on cancel.\n */\nexport async function runProjectPicker(opts: {\n globalConfigPath?: string | undefined;\n currentProjectRoot?: string | undefined;\n}): Promise<PickerResult | undefined> {\n const stdin = process.stdin;\n const out = process.stdout;\n\n if (!stdin.isTTY || !out.isTTY) {\n // Non-TTY fallback: return undefined (caller should provide a usable message)\n return undefined;\n }\n\n const allItems = await buildPickerItems(opts);\n if (allItems.length === 0) return undefined;\n\n const title = 'Project Switch';\n const reservedTop = 4; // title + divider + padding\n const reservedBottom = 3; // scroll indicator + footer\n const headerHeight = reservedTop + reservedBottom;\n const baseVisibleHeight = Math.max(5, terminalHeight() - headerHeight);\n\n return new Promise<PickerResult | undefined>((resolve) => {\n const wasRaw = stdin.isRaw;\n const wasPaused = stdin.isPaused();\n let filter = '';\n let displayItems = allItems;\n let selectedIdx = 0;\n let scrollOffset = 0;\n let buf = '';\n\n const visibleHeight = () => effectiveVisibleHeight(baseVisibleHeight, filter);\n\n const render = () => {\n renderPickerFrame(\n displayItems,\n selectedIdx,\n scrollOffset,\n visibleHeight(),\n title,\n filter,\n out,\n );\n };\n\n const applyFilter = (newFilter: string) => {\n filter = newFilter;\n displayItems = filterItems(allItems, filter);\n // Reset position to top\n selectedIdx = 0;\n scrollOffset = 0;\n // Skip divider at position 0\n if (displayItems[0]?.key === '__divider__') {\n selectedIdx = skipDivider(displayItems, selectedIdx, 1);\n }\n };\n\n const navigateDown = () => {\n if (selectedIdx < displayItems.length - 1) {\n selectedIdx = skipDivider(displayItems, selectedIdx + 1, 1);\n }\n const vh = visibleHeight();\n if (selectedIdx >= scrollOffset + vh) {\n scrollOffset = selectedIdx - vh + 1;\n }\n };\n\n const navigateUp = () => {\n if (selectedIdx > 0) {\n selectedIdx = skipDivider(displayItems, selectedIdx - 1, -1);\n }\n if (selectedIdx < scrollOffset) {\n scrollOffset = selectedIdx;\n }\n };\n\n const pageUp = () => {\n const pageSize = Math.max(1, visibleHeight() - 1);\n const target = selectedIdx - pageSize;\n selectedIdx = Math.max(0, target);\n selectedIdx = skipDivider(displayItems, selectedIdx, -1);\n if (selectedIdx < scrollOffset) {\n scrollOffset = Math.max(0, selectedIdx - 1);\n }\n };\n\n const pageDown = () => {\n const pageSize = Math.max(1, visibleHeight() - 1);\n const target = selectedIdx + pageSize;\n selectedIdx = Math.min(displayItems.length - 1, target);\n selectedIdx = skipDivider(displayItems, selectedIdx, 1);\n const vh = visibleHeight();\n if (selectedIdx >= scrollOffset + vh) {\n scrollOffset = Math.min(displayItems.length - vh, selectedIdx - vh + 1);\n if (scrollOffset < 0) scrollOffset = 0;\n }\n };\n\n const cleanup = () => {\n stdin.off('data', onData);\n if (wasRaw) {\n try {\n stdin.setRawMode(wasRaw);\n } catch {\n /* ignore */\n }\n }\n if (wasPaused) stdin.pause();\n out.write(CURSOR_SHOW);\n };\n\n /**\n * Check if a single character is printable (should be added to filter).\n * Excludes control characters (0x00-0x1F) and DEL (0x7F).\n */\n const isPrintable = (ch: string): boolean => {\n if (ch.length !== 1) return false;\n const code = ch.charCodeAt(0);\n return code >= 0x20 && code < 0x7f;\n };\n\n const onData = (chunk: Buffer) => {\n const str = chunk.toString();\n buf += str;\n\n // Escape sequences (ESC + [...])\n if (buf.startsWith(ESC) && buf.length >= 3) {\n // \u2500\u2500 4-byte sequences (PageUp/Down: ESC [ 5/6 ~) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if (buf.length >= 4) {\n if (buf === PAGE_UP) {\n buf = '';\n pageUp();\n render();\n return;\n }\n if (buf === PAGE_DOWN) {\n buf = '';\n pageDown();\n render();\n return;\n }\n }\n\n // \u2500\u2500 3-byte sequences (arrows: ESC [ A / B / O A / O B) \u2500\u2500\n if (buf.length === 3) {\n if (buf === ARROW_UP || buf === ARROW_UP_ALT) {\n buf = '';\n navigateUp();\n render();\n return;\n }\n if (buf === ARROW_DOWN || buf === ARROW_DOWN_ALT) {\n buf = '';\n navigateDown();\n render();\n return;\n }\n }\n\n // Known lengths but unknown sequence \u2014 let it buffer more\n if (buf.length < 4) return;\n\n // Unknown escape sequence \u2014 clear buffer\n buf = '';\n return;\n }\n\n // Single-byte inputs\n if (buf.length === 1) {\n const ch = buf;\n\n // Ctrl+C \u2014 always quit\n if (ch === CTRL_C) {\n cleanup();\n out.write(CURSOR_SHOW);\n out.write('\\n');\n resolve(undefined);\n return;\n }\n\n // Escape\n if (ch === ESC) {\n if (filter.length > 0) {\n // First ESC clears the filter\n applyFilter('');\n buf = '';\n render();\n return;\n }\n // No filter active \u2014 quit\n cleanup();\n out.write(CURSOR_SHOW);\n out.write('\\n');\n resolve(undefined);\n return;\n }\n\n // Backspace \u2014 remove last char from filter\n if (ch === BS || ch === '\\b') {\n if (filter.length > 0) {\n applyFilter(filter.slice(0, -1));\n }\n buf = '';\n render();\n return;\n }\n\n // Enter/Return\n if (ch === ENTER) {\n const item = displayItems[selectedIdx];\n cleanup();\n out.write(CURSOR_SHOW);\n out.write('\\n');\n\n if (!item || item.key === '__divider__') {\n resolve(undefined);\n return;\n }\n\n if (item.key === 'quit') {\n resolve(undefined);\n return;\n }\n\n if (item.key === 'new-session') {\n resolve({ kind: 'action', key: 'new-session', action: 'new-session' });\n return;\n }\n\n if (item.key === 'prev-sessions') {\n resolve({ kind: 'action', key: 'prev-sessions', action: 'prev-sessions' });\n return;\n }\n\n // Project item\n resolve({ kind: 'project', key: item.key });\n return;\n }\n\n // Special single-char navigation (only when filter is empty)\n if (filter.length === 0) {\n if (ch === 'q' || ch === 'Q') {\n cleanup();\n out.write(CURSOR_SHOW);\n out.write('\\n');\n resolve(undefined);\n return;\n }\n if (ch === 'j') {\n buf = '';\n navigateDown();\n render();\n return;\n }\n if (ch === 'k') {\n buf = '';\n navigateUp();\n render();\n return;\n }\n }\n\n // Printable character \u2192 add to filter\n if (isPrintable(ch)) {\n applyFilter(filter + ch);\n buf = '';\n render();\n return;\n }\n\n buf = '';\n return;\n }\n };\n\n // Setup raw mode\n try {\n stdin.setRawMode(true);\n } catch {\n // Can't set raw mode \u2014 fallback\n resolve(undefined);\n return;\n }\n stdin.resume();\n out.write(CURSOR_HIDE);\n\n // Skip divider items to start on a valid entry\n selectedIdx = skipDivider(displayItems, 0, 1);\n\n // Initial render\n render();\n\n stdin.on('data', onData);\n\n // Handle stdin close (pipe broken, etc.)\n stdin.once('close', () => {\n cleanup();\n out.write(CURSOR_SHOW);\n resolve(undefined);\n });\n });\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/provider-helpers.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Shared provider-config helpers used by the picker, main boot sequence,\n * and subcommands. Keeps provider key detection and alias resolution in\n * one place so the logic doesn't drift between call sites.\n */\nimport type { Config, ModelsRegistry, ProviderConfig, ResolvedProvider } from '@wrongstack/core/types';\n\n// (Removed) CATALOG_REFRESHABLE_MODEL_PROVIDERS \u2014 a four-entry hand-list that\n// decided whose models were allowed to come from models.dev. See visibleModelIds.\n\nfunction uniqueModelIds(primary: readonly string[], fallback: readonly string[]): string[] {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const id of [...primary, ...fallback]) {\n const trimmed = id.trim();\n if (!trimmed || seen.has(trimmed)) continue;\n seen.add(trimmed);\n out.push(trimmed);\n }\n return out;\n}\n\n/** Return the provider's visible model ids: models.dev plus anything the saved\n * config names that the catalog does not carry.\n *\n * `cfg.models` is ADDITIVE, never subtractive. It used to be a strict allowlist\n * for every provider except a four-entry hand-list (chatgpt/openai/codex/\n * openai-codex), which had two failure modes that showed up in real configs:\n *\n * - A saved `models: []` \u2014 written by an auth flow that had nothing to cache\n * yet \u2014 pinned the provider to ZERO selectable models forever. A configured\n * GitHub Copilot listed nothing at all.\n * - A preset's hand-maintained list went stale against the catalog and hid\n * real models on the user's own plan: `kimi-for-coding` offered 2 of the 4\n * models models.dev publishes for it, hiding `k3` (131_072 output) behind\n * `kimi-for-coding` (32_768). `alibaba-token-plan` hid 11 of 22.\n *\n * models.dev publishes a dedicated provider entry per subscription plan, so the\n * catalog already describes exactly what a plan includes \u2014 a second,\n * hand-curated copy could only ever drift below it. Narrowing what the user\n * sees is `favoriteModels`' job, not this list's.\n *\n * A model the credential cannot actually serve now surfaces as an error at\n * request time rather than being silently unselectable, which is the better\n * failure: visible and actionable. */\nexport function visibleModelIds(\n providerId: string,\n config: Config,\n catalogModelIds: string[],\n cfg?: ProviderConfig | undefined,\n): string[] {\n const entry = cfg ?? config.providers?.[providerId];\n if (entry?.models === undefined) return [...catalogModelIds];\n return uniqueModelIds(entry.models, catalogModelIds);\n}\n\n/**\n * Is `apiBase` a loopback URL (localhost / 127.0.0.0-8 / ::1 / 0.0.0.0)?\n * Such a host is a server running on the same machine, never a remote API.\n */\nfunction isLoopbackUrl(apiBase: string | undefined): boolean {\n if (!apiBase) return false;\n let host: string;\n try {\n host = new URL(apiBase).hostname.toLowerCase();\n } catch {\n return false;\n }\n // URL keeps the brackets around IPv6 hosts (e.g. \"[::1]\") \u2014 strip them.\n host = host.replace(/^\\[|\\]$/g, '');\n if (host === 'localhost' || host === '::1' || host === '0.0.0.0') return true;\n return /^127\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/.test(host);\n}\n\n/**\n * Is this a keyless local gateway \u2014 a server on a loopback address that\n * declares no API-key env vars (omniroute, LiteLLM/vLLM/LM Studio/Ollama\n * running locally, \u2026)? These need no credential, so they belong in the\n * picker even though `hasApiKey` returns false for them. Accepts the\n * minimal shape both call sites can supply.\n */\nexport function isKeylessLocalProvider(provider: {\n apiBase?: string | undefined;\n envVars?: string[] | undefined;\n}): boolean {\n if (provider.envVars && provider.envVars.length > 0) return false;\n return isLoopbackUrl(provider.apiBase);\n}\n\n/**\n * Does this provider have an API key available \u2014 either in the\n * environment (via one of its known env vars) or stored in config\n * (encrypted or plaintext)? Used to filter the picker to providers\n * the user can actually use right now.\n */\nexport function hasApiKey(provider: ResolvedProvider, config?: Config): boolean {\n if (provider.envVars.some((v) => !!process.env[v])) return true;\n const entry = config?.providers?.[provider.id];\n if (!entry) return false;\n if (typeof entry.apiKey === 'string' && entry.apiKey.length > 0) return true;\n if (Array.isArray(entry.apiKeys) && entry.apiKeys.some((k) => k?.apiKey)) return true;\n return false;\n}\n\n/**\n * Build the list of providers the user can switch to mid-session.\n * Only includes providers that have an API key available (env var or\n * stored config). Falls back to the full catalog when no keys are found.\n *\n * Models are inlined from the catalog (or from `cfg.models` for custom\n * entries) so the picker can show a real selection.\n */\nexport async function buildPickableProviders(\n modelsRegistry: ModelsRegistry,\n config: Config,\n): Promise<Array<{ id: string; family: string; models: string[] }>> {\n const overlay = config.providers ?? {};\n let catalog: Awaited<ReturnType<typeof modelsRegistry.listProviders>> = [];\n try {\n catalog = await modelsRegistry.listProviders();\n } catch {\n // catalog unavailable \u2014 keyed-by-config-only path still works\n }\n const catalogById = new Map(catalog.map((p) => [p.id, p]));\n // Selectable when the provider has a usable key OR is a keyless local\n // gateway (omniroute/LiteLLM/\u2026 on a loopback address, which needs no\n // credential). Mirrors `runPicker`'s filter so the `/model` switch and\n // the startup picker agree on what's offered.\n const isSelectable = (id: string): boolean => {\n const entry = overlay[id];\n const catalogEntry = catalogById.get(id);\n const envHit = catalogEntry?.envVars.some((v) => !!process.env[v]);\n if (envHit) return true;\n if (typeof entry?.apiKey === 'string' && entry.apiKey.length > 0) return true;\n if (Array.isArray(entry?.apiKeys) && entry.apiKeys.some((k) => k?.apiKey)) return true;\n return isKeylessLocalProvider({\n apiBase: entry?.baseUrl ?? catalogEntry?.apiBase,\n envVars: entry?.envVars ?? catalogEntry?.envVars,\n });\n };\n const seen = new Set<string>();\n const out: Array<{ id: string; family: string; models: string[] }> = [];\n for (const [id, cfg] of Object.entries(overlay)) {\n if (!isSelectable(id)) continue;\n seen.add(id);\n const catalogType = cfg.type && cfg.type !== id ? cfg.type : id;\n const inherited = catalogById.get(catalogType);\n const family = cfg.family ?? inherited?.family ?? 'unsupported';\n if (family === 'unsupported') continue;\n const models = visibleModelIds(id, config, (inherited?.models ?? []).map((m) => m.id), cfg);\n out.push({ id, family, models });\n }\n for (const p of catalog) {\n if (seen.has(p.id)) continue;\n if (p.family === 'unsupported') continue;\n if (!isSelectable(p.id)) continue;\n out.push({ id: p.id, family: p.family, models: p.models.map((m) => m.id) });\n }\n return out;\n}\n\n/**\n * Resolve a provider id that may be an alias. When the user has\n * `providers[id].type` pointing at a different catalog entry, return\n * the catalog id so downstream lookups still work. Returns the\n * original id unchanged when it's a direct catalog match.\n */\nexport function resolveProviderAlias(providerId: string, config: Config): string {\n const savedAlias = config.providers?.[providerId];\n if (savedAlias?.type && savedAlias.type !== providerId) {\n return savedAlias.type;\n }\n return providerId;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -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": ";;;;;;;;;AAAA,SAAS,aAAa;AACtB,SAAS,YAAY,oBAAoB;AA8BzC,IAAM,0BAA0B,MAAM;AAUtC,eAAsB,iBAAiB,MAAgB,MAA0C;AAC/F,QAAM,MAAM,KAAK;AAEjB,MAAI,KAAK,QAAQ,MAAM,MAAM,QAAQ,KAAK,QAAQ,MAAM,MAAM,QAAQ;AACpE,qBAAiB,KAAK,QAAQ;AAC9B,WAAO;AAAA,EACT;AACA,QAAM,kBAAkB,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,EAAE;AAAA,IACpD,CAAC,SACC,CAAC;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,SAAS,IAAI;AAAA,EACnB;AACA,MAAI,iBAAiB;AACnB,SAAK,SAAS,MAAM,4BAA4B,eAAe;AAAA,CAAI;AACnE,qBAAiB,KAAK,QAAQ;AAC9B,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,gBAAgB,gBAAgB,MAAM,KAAK,KAAK,CAAC;AAChE,MAAI,OAAO,OAAO;AAChB,SAAK,SAAS,MAAM,GAAG,OAAO,KAAK;AAAA,CAAI;AACvC,qBAAiB,KAAK,QAAQ;AAC9B,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,wBAAwB;AAC5C,QAAM,OAAO,MAAM,eAAe;AAAA,IAChC;AAAA,IACA,cAAc;AAAA,IACd,QAAQ,MAAM,KAAK;AAAA,EACrB,CAAC;AAED,MAAI,KAAK,aAAa;AACpB,SAAK,SAAS;AAAA,MACZ,2BAA2B,WAAW;AAAA;AAAA,IACxC;AACA,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,WAAW;AACpB,QAAI,KAAK,UAAU;AACjB,WAAK,SAAS,MAAM,sBAAsB,KAAK,OAAO,YAAO,KAAK,MAAM;AAAA,CAAI;AAAA,IAC9E,OAAO;AACL,WAAK,SAAS,MAAM,mCAAmC,KAAK,OAAO;AAAA,CAAI;AAAA,IACzE;AACA,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,KAAK,UAAU;AAClB,SAAK,SAAS,MAAM,2CAA2C,KAAK,OAAO;AAAA,CAAI;AAC/E,WAAO;AAAA,EACT;AAEA,QAAM,iBAAiB,OAAO,kBAAkB,2BAA2B;AAC3E,QAAM,gBAAgB,mBAAmB,gBAAgB,aAAa,KAAK,QAAQ;AAAA,IACjF,cAAc,OAAO;AAAA,EACvB,CAAC;AAED,OAAK,SAAS,MAAM,6BAA6B,KAAK,OAAO,QAAQ,KAAK,MAAM;AAAA,CAAO;AACvF,OAAK,SAAS,MAAM,YAAY,cAAc,OAAO;AAAA,CAAI;AAEzD,MAAI;AACF,UAAM,SAAS,MAAM,IAAI,QAA6B,CAAC,SAAS,WAAW;AACzE,YAAM,QAAQ,MAAM,cAAc,YAAY,cAAc,MAAM;AAAA,QAChE;AAAA,QACA,OAAO;AAAA,QACP,QAAQ,YAAY,QAAQ,IAAO;AAAA,QACnC,aAAa;AAAA,QACb,GAAI,cAAc,2BACd,EAAE,0BAA0B,cAAc,yBAAyB,IACnE,CAAC;AAAA,MACP,CAAC;AACD,UAAI,SAAS;AACb,UAAI,SAAS;AACb,YAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS;AACjC,iBAAS,iBAAiB,QAAQ,IAAI;AAAA,MACxC,CAAC;AACD,YAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS;AACjC,iBAAS,iBAAiB,QAAQ,IAAI;AAAA,MACxC,CAAC;AACD,YAAM,GAAG,SAAS,MAAM;AACxB,YAAM,GAAG,SAAS,CAAC,MAAM,WAAW,QAAQ,EAAE,MAAM,QAAQ,QAAQ,OAAO,CAAC,CAAC;AAAA,IAC/E,CAAC;AAED,QAAI,OAAO,SAAS,KAAK,OAAO,WAAW,MAAM;AAC/C,WAAK,SAAS;AAAA,QACZ;AAAA,cAAiB,KAAK,MAAM;AAAA;AAAA,MAC9B;AACA,YAAM,UAAU,sBAAsB,GAAG,OAAO,MAAM;AAAA,EAAK,OAAO,MAAM,EAAE;AAC1E,UAAI,QAAS,MAAK,SAAS,MAAM;AAAA,EAAK,OAAO;AAAA,CAAI;AAAA,IACnD,OAAO;AAIL,YAAM,cACJ,OAAO,SAAS,OACZ,iBAAiB,OAAO,UAAU,mBAAmB,KACrD,yBAAyB,OAAO,IAAI;AAC1C,WAAK,SAAS,MAAM;AAAA,SAAY,WAAW;AAAA,CAAK;AAChD,YAAM,SAAS,GAAG,OAAO,MAAM;AAAA,EAAK,OAAO,MAAM,GAAG,KAAK;AACzD,UAAI,OAAQ,MAAK,SAAS,MAAM;AAAA,EAAK,MAAM;AAAA,CAAI;AAC/C,WAAK,SAAS;AAAA,QACZ;AAAA;AAAA,IAAyD,cAAc,OAAO;AAAA,IAC5E,qBAAqB,gBAAgB,aAAa,KAAK,QAAQ;AAAA,UAC7D,cAAc,OAAO;AAAA,QACvB,CAAC;AAAA,MACL;AAAA,IACF;AACA,WAAO,OAAO,QAAQ;AAAA,EACxB,SAAS,KAAK;AACZ,UAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,QAAI,IAAI,SAAS,QAAQ,GAAG;AAC1B,WAAK,SAAS,MAAM;AAAA,iBAAoB,cAAc;AAAA,CAAuB;AAC7E,aAAO;AAAA,IACT;AACA,SAAK,SAAS,MAAM;AAAA,iBAAoB,GAAG;AAAA,CAAI;AAC/C,WAAO;AAAA,EACT;AACF;AAEO,IAAM,YAA+B,OAAO,MAAM,SAAS,iBAAiB,MAAM,IAAI;AAE7F,SAAS,iBAAiB,UAAiD;AACzE,WAAS;AAAA,IACP;AAAA,EACF;AACF;AAGA,SAAS,gBAAgB,MAAgB,OAAsD;AAC7F,QAAM,SAAS,CAAC,GAAG,IAAI;AACvB,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,aAAa,CAAC,MAAc,QAAQ,SAAe;AACvD,QAAI,MAAM,IAAI,MAAM,QAAQ,MAAM,IAAI,MAAM,OAAQ,QAAO,KAAK,KAAK,KAAK,EAAE;AAAA,EAC9E;AACA,aAAW,YAAY;AACvB,MAAI,MAAM,GAAG,MAAM,QAAQ,MAAM,GAAG,MAAM,OAAQ,QAAO,KAAK,IAAI;AAClE,aAAW,eAAe;AAC1B,aAAW,mBAAmB;AAC9B,aAAW,MAAM,CAAC,OAAO,QAAQ,QAAQ,KAAK,EAAY,YAAW,EAAE;AAEvE,QAAM,SAAS,MAAM,IAAI,KAAK,MAAM,iBAAiB;AACrD,MAAI,OAAO,WAAW,SAAU,QAAO,KAAK,QAAQ,MAAM;AAAA,WACjD,WAAW,KAAM,QAAO,KAAK,MAAM;AAC5C,SAAO;AACT;AAEA,SAAS,gBAAgB,MAAkC;AACzD,MAAI,YAAY;AAChB,MAAI;AACJ,MAAI,eAAe;AAEnB,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,MAAM,KAAK,CAAC;AAClB,QAAI,QAAQ,OAAW;AACvB,QAAI,QAAQ,kBAAkB,QAAQ,MAAM;AAC1C,kBAAY;AACZ;AAAA,IACF;AACA,QAAI,QAAQ,UAAU,QAAQ,qBAAqB;AACjD,YAAM,QAAQ,KAAK,EAAE,CAAC;AACtB,YAAM,KAAK,oBAAoB,KAAK;AACpC,UAAI,CAAC;AACH,eAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA,OAAO,4BAA4B,SAAS,WAAW;AAAA,QACzD;AACF,uBAAiB;AACjB;AAAA,IACF;AACA,UAAM,OAAO,IAAI,MAAM,iCAAiC,IAAI,CAAC;AAC7D,QAAI,MAAM;AACR,YAAM,KAAK,oBAAoB,IAAI;AACnC,UAAI,CAAC;AACH,eAAO,EAAE,WAAW,gBAAgB,cAAc,OAAO,4BAA4B,IAAI,GAAG;AAC9F,uBAAiB;AACjB;AAAA,IACF;AACA,UAAM,YAAY,IAAI,MAAM,yBAAyB,IAAI,CAAC;AAC1D,QAAI,WAAW;AACb,uBAAiB;AAAA,IACnB;AACA,QAAI,QAAQ,qBAAqB,QAAQ,uBAAuB;AAC9D,qBAAe;AAAA,IACjB;AAAA,EACF;AAEA,SAAO,EAAE,WAAW,gBAAgB,cAAc,OAAO,OAAU;AACrE;AAEA,SAAS,oBAAoB,OAAuD;AAClF,MAAI,UAAU,SAAS,UAAU,UAAU,UAAU,UAAU,UAAU,MAAO,QAAO;AACvF,SAAO;AACT;AAEO,SAAS,2BACd,MAAyB,QAAQ,KACjC,OAAiB,QAAQ,MACT;AAChB,QAAM,SAAS,oBAAoB,IAAI,oBAAoB;AAC3D,MAAI,OAAQ,QAAO;AAEnB,QAAM,YAAY,IAAI,yBAAyB;AAC/C,MAAI,YAAY,KAAK,SAAS,EAAG,QAAO;AACxC,MAAI,YAAY,KAAK,SAAS,EAAG,QAAO;AACxC,MAAI,WAAW,KAAK,SAAS,EAAG,QAAO;AACvC,MAAI,WAAW,KAAK,SAAS,EAAG,QAAO;AAEvC,QAAM,WAAW,GAAG,IAAI,gBAAgB,EAAE,IAAI,KAAK,CAAC,KAAK,EAAE;AAC3D,QAAM,YAAY,CAAC,IAAI,cAAc,KAAK,CAAC,CAAC,EACzC,OAAO,CAAC,MAAmB,OAAO,MAAM,YAAY,EAAE,SAAS,CAAC,EAChE,IAAI,CAAC,MAAM;AACV,QAAI;AACF,aAAO,WAAW,CAAC,IAAI,aAAa,CAAC,IAAI;AAAA,IAC3C,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF,CAAC,EACA,KAAK,GAAG;AACX,QAAM,OAAO,GAAG,QAAQ,IAAI,SAAS,GAAG,QAAQ,OAAO,GAAG,EAAE,YAAY;AACxE,MAAI,KAAK,SAAS,QAAQ,KAAK,KAAK,SAAS,SAAS,KAAK,KAAK,SAAS,aAAa;AACpF,WAAO;AACT,MAAI,KAAK,SAAS,QAAQ,KAAK,KAAK,SAAS,SAAS,EAAG,QAAO;AAChE,MAAI,KAAK,SAAS,OAAO,KAAK,KAAK,SAAS,QAAQ,EAAG,QAAO;AAC9D,SAAO;AACT;AAGO,SAAS,wBAAwB,OAAiB,QAAQ,MAAyB;AACxF,QAAM,SAAS,KAAK,CAAC,KAAK,IAAI,QAAQ,OAAO,GAAG,EAAE,YAAY;AAC9D,SAAO,MAAM,SAAS,gCAAgC,KAAK,MAAM,SAAS,qBAAqB,IAC3F,oBACA;AACN;AAEA,SAAS,mBACP,gBACA,aACA,SACA,OAAkC,EAAE,cAAc,MAAM,GACzC;AAMf,QAAM,gBAAgB,CAAC,KAAK;AAC5B,QAAM,SAAS,GAAG,WAAW,IAAI,OAAO;AACxC,UAAQ,gBAAgB;AAAA,IACtB,KAAK;AACH,aAAO;AAAA,QACL;AAAA,QACA,gBAAgB,CAAC,OAAO,MAAM,oBAAoB,MAAM,IAAI,CAAC,OAAO,MAAM,MAAM;AAAA,MAClF;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL;AAAA,QACA,gBACI,CAAC,UAAU,OAAO,oBAAoB,MAAM,IAC5C,CAAC,UAAU,OAAO,MAAM;AAAA,MAC9B;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL;AAAA,QACA,gBAAgB,CAAC,OAAO,MAAM,oBAAoB,MAAM,IAAI,CAAC,OAAO,MAAM,MAAM;AAAA,MAClF;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL;AAAA,QACA,gBACI,CAAC,WAAW,MAAM,oBAAoB,MAAM,IAC5C,CAAC,WAAW,MAAM,MAAM;AAAA,MAC9B;AAAA,EACJ;AACF;AAEA,SAAS,QAAQ,IAAoB,MAA+B;AAClE,QAAM,UAAU,GAAG,EAAE,IAAI,KAAK,KAAK,GAAG,CAAC;AACvC,MAAI,QAAQ,aAAa,WAAW,OAAO,OAAO;AAChD,UAAM,OAAO,4BAA4B,IAAI,IAAI;AACjD,WAAO;AAAA,MACL,YAAY,KAAK;AAAA,MACjB,MAAM,KAAK;AAAA,MACX;AAAA,MACA,0BAA0B,KAAK;AAAA,IACjC;AAAA,EACF;AACA,SAAO,EAAE,YAAY,IAAI,MAAM,QAAQ;AACzC;AAEA,SAAS,qBACP,UACA,aACA,SACA,OAAkC,EAAE,cAAc,MAAM,GAChD;AACR,QAAM,WAAY,CAAC,OAAO,QAAQ,QAAQ,KAAK,EAC5C,OAAO,CAAC,OAAO,OAAO,QAAQ,EAC9B,IAAI,CAAC,OAAO,KAAK,mBAAmB,IAAI,aAAa,SAAS,IAAI,EAAE,OAAO,EAAE;AAChF,SAAO,SAAS,SAAS,IAAI;AAAA;AAAA,EAA8B,SAAS,KAAK,IAAI,CAAC;AAAA,IAAO;AACvF;AAEA,SAAS,iBAAiB,SAAiB,OAAwB;AACjE,QAAM,OAAO,UAAU,OAAO,KAAK;AACnC,SAAO,KAAK,UAAU,0BAClB,OACA,KAAK,MAAM,KAAK,SAAS,uBAAuB;AACtD;AAEA,SAAS,sBAAsB,QAA+B;AAC5D,MAAI,CAAC,8BAA8B,KAAK,MAAM,EAAG,QAAO;AACxD,SACE;AAGJ;",
|
|
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/services/sdd/state.ts", "../src/services/sdd/project-context.ts", "../src/services/sdd/spec-detection.ts", "../src/services/sdd/task-manager.ts"],
|
|
4
|
-
"sourcesContent": ["import type { Context } from '@wrongstack/core/agent';\nimport {\n type AISpecBuilder,\n type AISpecPhase,\n type DefaultTaskStore,\n SpecVersioning,\n type TaskTracker,\n} from '@wrongstack/sdd';\n\n/** Key used to store SDD session state in ctx.meta for session isolation. */\nexport const SDD_META_KEY = 'sdd.state';\n\n/** Single shared SDD session state for the process lifetime. */\nexport class SDDState {\n private builder: AISpecBuilder | null = null;\n private taskStore: DefaultTaskStore | null = null;\n private taskTracker: TaskTracker | null = null;\n private taskGraphId: string | null = null;\n private sessionStartTime: number = Date.now();\n private phaseStartTime: number = Date.now();\n private versioning: SpecVersioning | null = null;\n\n getBuilder(): AISpecBuilder | null {\n return this.builder;\n }\n setBuilder(b: AISpecBuilder | null) {\n this.builder = b;\n }\n getTaskStore(): DefaultTaskStore | null {\n return this.taskStore;\n }\n setTaskStore(s: DefaultTaskStore | null) {\n this.taskStore = s;\n }\n getTaskTracker(): TaskTracker | null {\n return this.taskTracker;\n }\n setTaskTracker(t: TaskTracker | null) {\n this.taskTracker = t;\n }\n getTaskGraphId(): string | null {\n return this.taskGraphId;\n }\n setTaskGraphId(id: string | null) {\n this.taskGraphId = id;\n }\n getSessionStartTime(): number {\n return this.sessionStartTime;\n }\n setSessionStartTime(t: number) {\n this.sessionStartTime = t;\n }\n setPhaseStartTime(t: number) {\n this.phaseStartTime = t;\n }\n getPhaseStartTime(): number {\n return this.phaseStartTime;\n }\n getSessionElapsed(): number {\n return Date.now() - this.sessionStartTime;\n }\n getPhaseElapsed(): number {\n return Date.now() - this.phaseStartTime;\n }\n getVersioning(): SpecVersioning {\n if (this.versioning === null) this.versioning = new SpecVersioning();\n return this.versioning;\n }\n\n clearTaskState(): void {\n this.taskStore = null;\n this.taskTracker = null;\n this.taskGraphId = null;\n }\n\n getContext(): string | null {\n if (!this.builder) return null;\n const session = this.builder.getSession();\n if (session.phase === 'done') return null;\n return this.builder.getAIPrompt();\n }\n\n getPhase(): AISpecPhase | null {\n return this.builder?.getPhase() ?? null;\n }\n}\n\n/** Process-lifetime singleton \u2014 used when no Context is available (CLI single-session mode). */\nexport const sddState = new SDDState();\n\n/**\n * Get or create the SDD state for the current session.\n * Uses ctx.meta so each concurrent browser/REPL session has isolated state.\n */\nexport function getSessionState(ctx: Context | undefined): SDDState {\n if (!ctx) return sddState;\n let state = ctx.meta[SDD_META_KEY] as SDDState | undefined;\n if (!state) {\n state = new SDDState();\n ctx.meta[SDD_META_KEY] = state;\n }\n return state;\n}\n", "import type { AISpecBuilder, AISpecPhase, SpecIndexEntry, SpecStore } from '@wrongstack/sdd';\n// Shared with the WebUI wizard \u2014 single implementation in @wrongstack/sdd.\nexport { gatherProjectContext } from '@wrongstack/sdd';\nimport { sddState } from './state.js';\n\nexport function getActiveBuilder(): AISpecBuilder | null {\n return sddState.getBuilder();\n}\n\nexport function getActiveSDDContext(): string | null {\n return sddState.getContext();\n}\n\nexport function getActiveSDDPhase(): AISpecPhase | null {\n return sddState.getPhase();\n}\n\nexport async function findSpec(store: SpecStore, idOrTitle: string) {\n if (!idOrTitle) return null;\n const byId = await store.load(idOrTitle);\n if (byId) return byId;\n const all = await store.list();\n const match = all.find(\n (e: SpecIndexEntry) =>\n e.id.startsWith(idOrTitle) || e.title.toLowerCase().includes(idOrTitle.toLowerCase()),\n );\n if (match) return store.load(match.id);\n return null;\n}\n", "import { sddState } from './state.js';\n\n/**\n * Returns true if the text looks like conversational/explanatory output\n * rather than a structured implementation plan.\n */\nexport function isExplanatoryText(text: string): boolean {\n const lower = text.toLowerCase();\n return (\n lower.startsWith(\"i'\") ||\n lower.startsWith('i will') ||\n lower.startsWith('let me') ||\n lower.startsWith(\"here's my\") ||\n lower.startsWith('here is my') ||\n lower.startsWith(\"i'm going to\") ||\n lower.startsWith('first, let me') ||\n lower.startsWith('sure') ||\n lower.startsWith('of course') ||\n lower.startsWith('okay') ||\n lower.startsWith('ok,') ||\n lower.startsWith('sounds good') ||\n lower.startsWith('no problem') ||\n (text.split('\\n').length < 3 && !text.includes('.'))\n );\n}\n\n/**\n * Parse a spec from AI output text and save it to the active session.\n * Returns true if a spec was found and saved.\n */\nexport async function trySaveSpecFromAIOutput(aiOutput: string): Promise<boolean> {\n const builder = sddState.getBuilder();\n if (!builder) return false;\n const spec = builder.tryParseSpecFromOutput(aiOutput);\n if (!spec) return false;\n builder.setSpec(spec);\n return true;\n}\n\n/**\n * Try to save implementation plan from AI output during implementation phase.\n * Returns true if a plan was saved.\n */\nexport function trySaveImplementationPlan(aiOutput: string): boolean {\n const builder = sddState.getBuilder();\n if (!builder) return false;\n const session = builder.getSession();\n if (session.phase !== 'implementation') return false;\n\n const current = session.implementation ?? '';\n\n const jsonMatch = aiOutput.match(/```json\\s*\\[/);\n if (jsonMatch?.index && jsonMatch.index > 0) {\n const plan = aiOutput.substring(0, jsonMatch.index).trim();\n if (plan.length > 50 && plan !== current && !isExplanatoryText(plan)) {\n builder.setImplementation(plan);\n return true;\n }\n }\n\n if (\n aiOutput.length > 100 &&\n !aiOutput.includes('```json') &&\n aiOutput !== current &&\n !isExplanatoryText(aiOutput)\n ) {\n builder.setImplementation(aiOutput.trim());\n return true;\n }\n\n return false;\n}\n\n/**\n * Auto-detect task completion patterns in AI output and mark tasks.\n * Returns the number of tasks marked as completed.\n */\nexport function autoDetectTaskCompletion(aiOutput: string): number {\n const tracker = sddState.getTaskTracker();\n if (!tracker) return 0;\n const pending = tracker.getAllNodes({ status: ['pending', 'in_progress'] });\n if (pending.length === 0) return 0;\n\n let completed = 0;\n const lines = aiOutput.split('\\n');\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n const sddDoneMatch = trimmed.match(/\\/sdd\\s+done\\s+(.+)/i);\n if (sddDoneMatch?.[1]) {\n const target = sddDoneMatch[1].trim();\n const num = Number(target);\n if (!Number.isNaN(num) && num >= 1 && num <= pending.length) {\n const node = pending[num - 1];\n if (node && node.status !== 'completed') {\n tracker.updateNodeStatus(node.id, 'completed');\n completed++;\n }\n } else {\n const match = pending.find(\n (n) =>\n n.title.toLowerCase().includes(target.toLowerCase()) ||\n target.toLowerCase().includes(n.title.toLowerCase()),\n );\n if (match && match.status !== 'completed') {\n tracker.updateNodeStatus(match.id, 'completed');\n completed++;\n }\n }\n continue;\n }\n\n const checkmarkMatch = trimmed.match(/^\u2705\\s*(?:Task:\\s*)?(.+)/i);\n if (checkmarkMatch?.[1]) {\n const title = checkmarkMatch[1].trim();\n const match = pending.find(\n (n) =>\n n.title.toLowerCase().includes(title.toLowerCase()) ||\n title.toLowerCase().includes(n.title.toLowerCase()),\n );\n if (match && match.status !== 'completed') {\n tracker.updateNodeStatus(match.id, 'completed');\n completed++;\n }\n continue;\n }\n\n const taskNumMatch = trimmed.match(/Task\\s+(\\d+)\\s*[:]\\s*(?:complete|done|finished)/i);\n if (taskNumMatch?.[1]) {\n const num = Number(taskNumMatch[1]);\n if (num >= 1 && num <= pending.length) {\n const node = pending[num - 1];\n if (node && node.status !== 'completed') {\n tracker.updateNodeStatus(node.id, 'completed');\n completed++;\n }\n }\n continue;\n }\n\n const completedMatch = trimmed.match(/^(?:Completed|Done|Finished)\\s*[:]\\s*(.+)/i);\n if (completedMatch?.[1]) {\n const title = completedMatch[1].trim();\n const match = pending.find(\n (n) =>\n n.title.toLowerCase().includes(title.toLowerCase()) ||\n title.toLowerCase().includes(n.title.toLowerCase()),\n );\n if (match && match.status !== 'completed') {\n tracker.updateNodeStatus(match.id, 'completed');\n completed++;\n }\n }\n }\n\n return completed;\n}\n", "import { expectDefined } from '@wrongstack/core/utils';\nimport type { TaskProgress } from '@wrongstack/core/types';\nimport { DefaultTaskStore, renderProgress, TaskTracker } from '@wrongstack/sdd';\nimport { sddState } from './state.js';\n\nexport type { TaskProgress };\nexport { renderProgress };\n\n/**\n * Format elapsed milliseconds as a human-readable string.\n */\nexport function formatElapsed(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n const s = Math.floor(ms / 1000);\n if (s < 60) return `${s}s`;\n const m = Math.floor(s / 60);\n const remS = s % 60;\n if (m < 60) return remS > 0 ? `${m}m ${remS}s` : `${m}m`;\n const h = Math.floor(m / 60);\n const remM = m % 60;\n return `${h}h ${remM}m`;\n}\n\nfunction addTaskToTracker(tracker: TaskTracker, task: Record<string, unknown>): void {\n tracker.addNode({\n title: String(task.title),\n description: String(task.description ?? ''),\n type: (['feature', 'bugfix', 'refactor', 'docs', 'test', 'chore'].includes(String(task.type))\n ? String(task.type)\n : 'feature') as 'feature' | 'bugfix' | 'refactor' | 'docs' | 'test' | 'chore',\n priority: (['critical', 'high', 'medium', 'low'].includes(String(task.priority))\n ? String(task.priority)\n : 'medium') as 'critical' | 'high' | 'medium' | 'low',\n status: 'pending',\n estimateHours: Number(task.estimateHours) || 2,\n tags: Array.isArray(task.tags) ? task.tags.map(String) : [],\n });\n}\n\nexport async function trySaveTasksFromAIOutput(aiOutput: string): Promise<boolean> {\n const builder = sddState.getBuilder();\n if (!builder) return false;\n const session = builder.getSession();\n if (!session.spec) return false;\n\n const json = builder.extractJSONArray(aiOutput);\n if (!json) return false;\n\n let tasks: Array<Record<string, unknown>>;\n try {\n tasks = JSON.parse(json);\n } catch {\n return false;\n }\n if (!Array.isArray(tasks) || tasks.length === 0) return false;\n\n const validTasks = tasks.filter(\n (t) => t && typeof t === 'object' && typeof t.title === 'string' && t.title.length > 0,\n );\n if (validTasks.length === 0) return false;\n\n const existingTracker = sddState.getTaskTracker();\n if (existingTracker) {\n for (const task of validTasks) addTaskToTracker(existingTracker, task);\n return true;\n }\n\n const store = new DefaultTaskStore();\n const tracker = new TaskTracker({ store });\n const graph = await tracker.createGraph(session.spec.id, session.spec.title);\n for (const task of validTasks) addTaskToTracker(tracker, task);\n sddState.setTaskStore(store);\n sddState.setTaskTracker(tracker);\n sddState.setTaskGraphId(graph.id);\n // Fire-and-forget save is unsafe here \u2014 `setTaskGraphId` is awaited precisely\n // because the next mutation or caller's own `await saveSession()` must not\n // race a stale fire-and-forget rename that silently reverts the persisted\n // taskGraphId. The awaited save ensures the persisted snapshot matches\n // sddState.setTaskGraphId before this function returns.\n await builder.setTaskGraphId(graph.id);\n return true;\n}\n\nexport function getTaskProgress(): TaskProgress | null {\n const tracker = sddState.getTaskTracker();\n if (!tracker) return null;\n return tracker.getProgress();\n}\n\nexport function getCurrentTask(): {\n id: string;\n title: string;\n description: string;\n priority: string;\n estimateHours: number;\n tags: string[];\n startedAt: number | undefined;\n} | null {\n const tracker = sddState.getTaskTracker();\n if (!tracker) return null;\n const nodes = tracker.getAllNodes({ status: ['in_progress'] });\n if (nodes.length === 0) return null;\n const n = expectDefined(nodes[0]);\n return {\n id: n.id,\n title: n.title,\n description: n.description,\n priority: n.priority,\n estimateHours: n.estimateHours ?? 0,\n tags: n.tags ?? [],\n startedAt: n.startedAt,\n };\n}\n\nexport function advanceToNextTask(): boolean {\n const tracker = sddState.getTaskTracker();\n if (!tracker) return false;\n const pending = tracker.getAllNodes({ status: ['pending'] });\n for (const n of pending) {\n if (tracker.canStart(n.id)) {\n tracker.updateNodeStatus(n.id, 'in_progress');\n return true;\n }\n }\n return false;\n}\n\nexport function getTaskListText(): string | null {\n const tracker = sddState.getTaskTracker();\n if (!tracker) return null;\n const nodes = tracker.getAllNodes();\n if (nodes.length === 0) return null;\n return nodes\n .map((n, i) => {\n const status = n.status === 'completed' ? '\u2705' : n.status === 'in_progress' ? '\uD83D\uDD04' : '\u23F3';\n return `${i + 1}. ${status} [${n.priority}] ${n.title}`;\n })\n .join('\\n');\n}\n\nexport function renderTaskListWithProgress(): string | null {\n const tracker = sddState.getTaskTracker();\n if (!tracker) return null;\n const nodes = tracker.getAllNodes();\n if (nodes.length === 0) return null;\n\n const progress = tracker.getProgress();\n const phase = sddState.getPhase();\n const phaseLabel: Record<string, string> = {\n questioning: '\u2753 Questioning',\n spec_review: '\uD83D\uDCCB Spec Review',\n implementation: '\uD83C\uDFD7\uFE0F Implementation',\n task_review: '\uD83D\uDCDD Task Review',\n executing: '\u26A1 Executing',\n done: '\u2705 Done',\n };\n const lines = [\n `**${phaseLabel[phase ?? ''] ?? phase} \u2014 Task Status**`,\n '',\n renderProgress(progress),\n '',\n ];\n\n const sorted = [...nodes].sort((a, b) => {\n const order: Record<string, number> = {\n in_progress: 0,\n pending: 1,\n review: 2,\n blocked: 3,\n failed: 4,\n completed: 5,\n };\n return (order[a.status] ?? 6) - (order[b.status] ?? 6);\n });\n for (let i = 0; i < sorted.length; i++) {\n const n = expectDefined(sorted[i]);\n const status =\n n.status === 'completed'\n ? '\u2705'\n : n.status === 'in_progress'\n ? '\uD83D\uDD04'\n : n.status === 'failed'\n ? '\u274C'\n : n.status === 'blocked'\n ? '\uD83D\uDEAB'\n : n.status === 'review'\n ? '\uD83D\uDC41'\n : '\u23F3';\n const title = n.title.length > 50 ? n.title.slice(0, 49) + '\u2026' : n.title;\n let elapsed = '';\n if (n.status === 'in_progress' && n.startedAt)\n elapsed = ` \u00B7 ${formatElapsed(Date.now() - n.startedAt)}`;\n lines.push(`${i + 1}. ${status} ${title}${elapsed}`);\n }\n return lines.join('\\n');\n}\n\nexport function getCurrentExecutingContext(): string | null {\n const tracker = sddState.getTaskTracker();\n if (!tracker) return null;\n const nodes = tracker.getAllNodes({ status: ['in_progress'] });\n if (nodes.length === 0) return null;\n const n = expectDefined(nodes[0]);\n const elapsed = n.startedAt ? ` \u00B7 elapsed: ${formatElapsed(Date.now() - n.startedAt)}` : '';\n const progress = tracker.getProgress();\n return [\n `**NOW EXECUTING:** \"${n.title}\"${elapsed}`,\n `Description: ${n.description.split('\\n')[0] ?? '(none)'}`,\n `Priority: ${n.priority} \u00B7 Est: ${n.estimateHours ?? 0}h \u00B7 Tags: ${(n.tags ?? []).join(', ') || 'none'}`,\n `Progress: ${progress.completed}/${progress.total} tasks (${progress.percentComplete}%)`,\n ].join('\\n');\n}\n\n/**\n * Resolve a `/sdd done|skip|fail|review <N|title>` argument to a single task\n * node. Tries a 1-based index into the given (already filtered/sorted) node\n * list first, then a bidirectional case-insensitive title-substring match.\n * Centralizes the matching the four mutation subcommands used to duplicate.\n */\nexport function matchTaskNode<T extends { id: string; title: string }>(\n nodes: T[],\n query: string,\n): T | null {\n const trimmed = query.trim();\n if (!trimmed) return null;\n const num = Number(trimmed);\n if (!Number.isNaN(num) && num >= 1 && num <= nodes.length) {\n return nodes[num - 1] ?? null;\n }\n const q = trimmed.toLowerCase();\n return (\n nodes.find((n) => n.title.toLowerCase().includes(q) || q.includes(n.title.toLowerCase())) ??\n null\n );\n}\n\nexport function markTaskCompleted(taskTitle: string): boolean {\n const tracker = sddState.getTaskTracker();\n if (!tracker) return false;\n const nodes = tracker.getAllNodes({ status: ['pending', 'in_progress'] });\n const match = nodes.find(\n (n) =>\n n.title.toLowerCase().includes(taskTitle.toLowerCase()) ||\n taskTitle.toLowerCase().includes(n.title.toLowerCase()),\n );\n if (!match) return false;\n tracker.updateNodeStatus(match.id, 'completed');\n return true;\n}\n\nexport function getTaskGraphId(): string | null {\n return sddState.getTaskGraphId();\n}\nexport function getTaskTrackerExport(): TaskTracker | null {\n return sddState.getTaskTracker();\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
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
|
-
}
|