@wrongstack/cli 0.295.1 → 0.296.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/data/providers.json +0 -24
- package/dist/acp-A5OSIU2P.js +824 -0
- package/dist/acp-A5OSIU2P.js.map +7 -0
- package/dist/acp-server-agent.d.ts.map +1 -1
- package/dist/arg-parser.d.ts.map +1 -1
- package/dist/audit-2ZSFGNIF.js +102 -0
- package/dist/audit-2ZSFGNIF.js.map +7 -0
- package/dist/auth-CJWQJVRH.js +504 -0
- package/dist/auth-CJWQJVRH.js.map +7 -0
- package/dist/auth-menu/auth-menu-audit.d.ts +0 -4
- package/dist/auth-menu/auth-menu-audit.d.ts.map +1 -1
- package/dist/bench-7ZDWSNEF.js +278 -0
- package/dist/bench-7ZDWSNEF.js.map +7 -0
- package/dist/boot/brain-decision-log.d.ts +7 -5
- package/dist/boot/brain-decision-log.d.ts.map +1 -1
- package/dist/boot/dispatch-webui.d.ts +4 -8
- package/dist/boot/dispatch-webui.d.ts.map +1 -1
- package/dist/boot/system-prompt-builder.d.ts +3 -0
- package/dist/boot/system-prompt-builder.d.ts.map +1 -1
- package/dist/boot/tui-coordinator-callbacks.d.ts +45 -0
- package/dist/boot/tui-coordinator-callbacks.d.ts.map +1 -0
- package/dist/boot/tui-project-switch.d.ts +2 -3
- package/dist/boot/tui-project-switch.d.ts.map +1 -1
- package/dist/boot/tui-runtime-state.d.ts +5 -6
- package/dist/boot/tui-runtime-state.d.ts.map +1 -1
- package/dist/boot/tui-session-resume.d.ts.map +1 -1
- package/dist/boot/tui-settings-adapter.d.ts +2 -3
- package/dist/boot/tui-settings-adapter.d.ts.map +1 -1
- package/dist/boot.d.ts.map +1 -1
- package/dist/brain-menu/panel-service.d.ts.map +1 -1
- package/dist/chimera-review-task.d.ts +6 -0
- package/dist/chimera-review-task.d.ts.map +1 -0
- package/dist/chimera-reviewer-policy.d.ts +34 -0
- package/dist/chimera-reviewer-policy.d.ts.map +1 -0
- package/dist/chronicle-QQEQFSSE.js +256 -0
- package/dist/chronicle-QQEQFSSE.js.map +7 -0
- package/dist/chunk-5N34EWJR.js +418 -0
- package/dist/chunk-5N34EWJR.js.map +7 -0
- package/dist/chunk-66T43Q4Y.js +90 -0
- package/dist/chunk-66T43Q4Y.js.map +7 -0
- package/dist/chunk-7OCVIDC7.js +11 -0
- package/dist/chunk-7OCVIDC7.js.map +7 -0
- package/dist/chunk-ABXK4VVY.js +84 -0
- package/dist/chunk-ABXK4VVY.js.map +7 -0
- package/dist/chunk-AXVZMEWG.js +306 -0
- package/dist/chunk-AXVZMEWG.js.map +7 -0
- package/dist/chunk-AZESNNIC.js +216 -0
- package/dist/chunk-AZESNNIC.js.map +7 -0
- package/dist/chunk-BGFM3PD7.js +41 -0
- package/dist/chunk-BGFM3PD7.js.map +7 -0
- package/dist/chunk-DPJZQCVP.js +13 -0
- package/dist/chunk-DPJZQCVP.js.map +7 -0
- package/dist/chunk-F4PEGAJZ.js +176 -0
- package/dist/chunk-F4PEGAJZ.js.map +7 -0
- package/dist/chunk-IHBYBYGA.js +443 -0
- package/dist/chunk-IHBYBYGA.js.map +7 -0
- package/dist/chunk-IN4GXGYW.js +425 -0
- package/dist/chunk-IN4GXGYW.js.map +7 -0
- package/dist/chunk-JBSQ7ONN.js +1023 -0
- package/dist/chunk-JBSQ7ONN.js.map +7 -0
- package/dist/chunk-JBTFWWKV.js +1325 -0
- package/dist/chunk-JBTFWWKV.js.map +7 -0
- package/dist/chunk-JUHRI6OV.js +100 -0
- package/dist/chunk-JUHRI6OV.js.map +7 -0
- package/dist/chunk-OP47B3IX.js +142 -0
- package/dist/chunk-OP47B3IX.js.map +7 -0
- package/dist/chunk-PJHET45A.js +158 -0
- package/dist/chunk-PJHET45A.js.map +7 -0
- package/dist/chunk-Q5GTM25S.js +17 -0
- package/dist/chunk-Q5GTM25S.js.map +7 -0
- package/dist/chunk-QD544J2B.js +19 -0
- package/dist/chunk-QD544J2B.js.map +7 -0
- package/dist/chunk-QUNHS6O3.js +258 -0
- package/dist/chunk-QUNHS6O3.js.map +7 -0
- package/dist/chunk-TADVX644.js +480 -0
- package/dist/chunk-TADVX644.js.map +7 -0
- package/dist/chunk-TGDHN4LM.js +81 -0
- package/dist/chunk-TGDHN4LM.js.map +7 -0
- package/dist/chunk-TYO2OVAD.js +50 -0
- package/dist/chunk-TYO2OVAD.js.map +7 -0
- package/dist/chunk-VCYZ3WZV.js +14 -0
- package/dist/chunk-VCYZ3WZV.js.map +7 -0
- package/dist/chunk-VJUEZZYB.js +29 -0
- package/dist/chunk-VJUEZZYB.js.map +7 -0
- package/dist/chunk-WHOIR577.js +1 -0
- package/dist/chunk-WHOIR577.js.map +7 -0
- package/dist/chunk-WY7KKOUK.js +460 -0
- package/dist/chunk-WY7KKOUK.js.map +7 -0
- package/dist/chunk-X5DQTPXT.js +3059 -0
- package/dist/chunk-X5DQTPXT.js.map +7 -0
- package/dist/chunk-XJXDOF63.js +28 -0
- package/dist/chunk-XJXDOF63.js.map +7 -0
- package/dist/chunk-XWEGWYDU.js +560 -0
- package/dist/chunk-XWEGWYDU.js.map +7 -0
- package/dist/chunk-YWUPHRGB.js +346 -0
- package/dist/chunk-YWUPHRGB.js.map +7 -0
- package/dist/chunk-Z7YGASQP.js +313 -0
- package/dist/chunk-Z7YGASQP.js.map +7 -0
- package/dist/cli-entry-main.d.ts +2 -0
- package/dist/cli-entry-main.d.ts.map +1 -0
- package/dist/cli-entry-point.d.ts +3 -3
- package/dist/cli-entry-point.d.ts.map +1 -1
- package/dist/cli-main-6AU6E4XZ.js +29126 -0
- package/dist/cli-main-6AU6E4XZ.js.map +7 -0
- package/dist/cli-main-helpers.d.ts +21 -0
- package/dist/cli-main-helpers.d.ts.map +1 -0
- package/dist/cli-main.d.ts +25 -1
- package/dist/cli-main.d.ts.map +1 -1
- package/dist/context-limit.d.ts +48 -0
- package/dist/context-limit.d.ts.map +1 -1
- package/dist/diag-doctor-OQ3AA63O.js +170 -0
- package/dist/diag-doctor-OQ3AA63O.js.map +7 -0
- package/dist/execute-deps.d.ts +10 -12
- package/dist/execute-deps.d.ts.map +1 -1
- package/dist/execution-V26SE52F.js +4656 -0
- package/dist/execution-V26SE52F.js.map +7 -0
- package/dist/execution-chimera-ask.d.ts +10 -0
- package/dist/execution-chimera-ask.d.ts.map +1 -0
- package/dist/execution-chimera-cascade.d.ts +15 -0
- package/dist/execution-chimera-cascade.d.ts.map +1 -0
- package/dist/execution-cleanup.d.ts +23 -0
- package/dist/execution-cleanup.d.ts.map +1 -0
- package/dist/execution-kanban-dispatch.d.ts +10 -0
- package/dist/execution-kanban-dispatch.d.ts.map +1 -0
- package/dist/execution-repl-fleet-callbacks.d.ts +11 -0
- package/dist/execution-repl-fleet-callbacks.d.ts.map +1 -0
- package/dist/execution-storage-observability.d.ts +3 -0
- package/dist/execution-storage-observability.d.ts.map +1 -0
- package/dist/execution-tui-next-step-callbacks.d.ts +20 -0
- package/dist/execution-tui-next-step-callbacks.d.ts.map +1 -0
- package/dist/execution.d.ts +2 -139
- package/dist/execution.d.ts.map +1 -1
- package/dist/export-TPORYVRZ.js +64 -0
- package/dist/export-TPORYVRZ.js.map +7 -0
- package/dist/fleet/host-acp-runner-cache.d.ts +9 -0
- package/dist/fleet/host-acp-runner-cache.d.ts.map +1 -0
- package/dist/fleet/host-acp.d.ts +3 -0
- package/dist/fleet/host-acp.d.ts.map +1 -0
- package/dist/fleet/host-concurrency.d.ts +2 -0
- package/dist/fleet/host-concurrency.d.ts.map +1 -0
- package/dist/fleet/host-context.d.ts +5 -0
- package/dist/fleet/host-context.d.ts.map +1 -0
- package/dist/fleet/host-director-builder.d.ts +24 -0
- package/dist/fleet/host-director-builder.d.ts.map +1 -0
- package/dist/fleet/host-director-event-bridges.d.ts +37 -0
- package/dist/fleet/host-director-event-bridges.d.ts.map +1 -0
- package/dist/fleet/host-director-services.d.ts +20 -0
- package/dist/fleet/host-director-services.d.ts.map +1 -0
- package/dist/fleet/host-event-bridge.d.ts +17 -0
- package/dist/fleet/host-event-bridge.d.ts.map +1 -0
- package/dist/fleet/host-helpers.d.ts +22 -0
- package/dist/fleet/host-helpers.d.ts.map +1 -0
- package/dist/fleet/host-learning-tracker.d.ts +11 -0
- package/dist/fleet/host-learning-tracker.d.ts.map +1 -0
- package/dist/fleet/host-learning.d.ts +4 -0
- package/dist/fleet/host-learning.d.ts.map +1 -0
- package/dist/fleet/host-lifecycle-events.d.ts +4 -0
- package/dist/fleet/host-lifecycle-events.d.ts.map +1 -0
- package/dist/fleet/host-paths.d.ts +3 -0
- package/dist/fleet/host-paths.d.ts.map +1 -0
- package/dist/fleet/host-provider.d.ts +22 -0
- package/dist/fleet/host-provider.d.ts.map +1 -0
- package/dist/fleet/host-session-writer.d.ts +3 -0
- package/dist/fleet/host-session-writer.d.ts.map +1 -0
- package/dist/fleet/host-shadow-pass.d.ts +21 -0
- package/dist/fleet/host-shadow-pass.d.ts.map +1 -0
- package/dist/fleet/host-spawn-types.d.ts +25 -0
- package/dist/fleet/host-spawn-types.d.ts.map +1 -0
- package/dist/fleet/host-status.d.ts +48 -0
- package/dist/fleet/host-status.d.ts.map +1 -0
- package/dist/fleet/host-subagent-factory.d.ts +16 -0
- package/dist/fleet/host-subagent-factory.d.ts.map +1 -0
- package/dist/fleet/host-supervisor.d.ts +16 -0
- package/dist/fleet/host-supervisor.d.ts.map +1 -0
- package/dist/fleet/host-task-result-report.d.ts +11 -0
- package/dist/fleet/host-task-result-report.d.ts.map +1 -0
- package/dist/fleet/host-types.d.ts +89 -0
- package/dist/fleet/host-types.d.ts.map +1 -0
- package/dist/fleet/host.d.ts +10 -357
- package/dist/fleet/host.d.ts.map +1 -1
- package/dist/hq-BECGICEZ.js +547 -0
- package/dist/hq-BECGICEZ.js.map +7 -0
- package/dist/hq-command-controller.d.ts +2 -2
- package/dist/hq-command-controller.d.ts.map +1 -1
- package/dist/hq-server/project-root.d.ts +5 -0
- package/dist/hq-server/project-root.d.ts.map +1 -0
- package/dist/hq-server/routes/auth-handlers.d.ts +32 -0
- package/dist/hq-server/routes/auth-handlers.d.ts.map +1 -0
- package/dist/hq-server/routes/session-handlers.d.ts +8 -0
- package/dist/hq-server/routes/session-handlers.d.ts.map +1 -0
- package/dist/hq-server/routes.d.ts +2 -2
- package/dist/hq-server/routes.d.ts.map +1 -1
- package/dist/hq-server-FJOVOERO.js +39 -0
- package/dist/hq-server-FJOVOERO.js.map +7 -0
- package/dist/hq-server.d.ts.map +1 -1
- package/dist/hq-ttl-U2FAYFAT.js +8 -0
- package/dist/hq-ttl-U2FAYFAT.js.map +7 -0
- package/dist/hq-tunnel-YZLRONPV.js +111 -0
- package/dist/hq-tunnel-YZLRONPV.js.map +7 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2503 -53026
- package/dist/index.js.map +4 -4
- package/dist/init-E2NDDOHI.js +27 -0
- package/dist/init-E2NDDOHI.js.map +7 -0
- package/dist/kanban-dispatch-route.d.ts +14 -0
- package/dist/kanban-dispatch-route.d.ts.map +1 -0
- package/dist/kanban-hq-sync.d.ts +2 -0
- package/dist/kanban-hq-sync.d.ts.map +1 -1
- package/dist/kanban-run-mirror-EKVNGXWW.js +12 -0
- package/dist/kanban-run-mirror-EKVNGXWW.js.map +7 -0
- package/dist/live-settings-input.d.ts +69 -0
- package/dist/live-settings-input.d.ts.map +1 -0
- package/dist/mailbox-serve-2UWHEN3M.js +302 -0
- package/dist/mailbox-serve-2UWHEN3M.js.map +7 -0
- package/dist/mcp-CYLPUEHC.js +413 -0
- package/dist/mcp-CYLPUEHC.js.map +7 -0
- package/dist/modeldiag-HENYJ4N7.js +1290 -0
- package/dist/modeldiag-HENYJ4N7.js.map +7 -0
- package/dist/permissions-FNYLZIL4.js +115 -0
- package/dist/permissions-FNYLZIL4.js.map +7 -0
- package/dist/picker-key-state.d.ts +7 -0
- package/dist/picker-key-state.d.ts.map +1 -0
- package/dist/picker-model-picker.d.ts +6 -0
- package/dist/picker-model-picker.d.ts.map +1 -0
- package/dist/picker-ui.d.ts +17 -0
- package/dist/picker-ui.d.ts.map +1 -0
- package/dist/picker.d.ts +4 -37
- package/dist/picker.d.ts.map +1 -1
- package/dist/plugin-usage-OU6X6LM3.js +40 -0
- package/dist/plugin-usage-OU6X6LM3.js.map +7 -0
- package/dist/plugins-4LJ5IUBI.js +24 -0
- package/dist/plugins-4LJ5IUBI.js.map +7 -0
- package/dist/pre-launch.d.ts +0 -1
- package/dist/pre-launch.d.ts.map +1 -1
- package/dist/project-BLQ3ALVL.js +76 -0
- package/dist/project-BLQ3ALVL.js.map +7 -0
- package/dist/project-manifest-GE25PW4S.js +18 -0
- package/dist/project-manifest-GE25PW4S.js.map +7 -0
- package/dist/project-picker-BOCWHBXP.js +17 -0
- package/dist/project-picker-BOCWHBXP.js.map +7 -0
- package/dist/projects-XE76NFNZ.js +38 -0
- package/dist/projects-XE76NFNZ.js.map +7 -0
- package/dist/provider-helpers.d.ts +22 -6
- package/dist/provider-helpers.d.ts.map +1 -1
- package/dist/providers-models-GDELBHZK.js +589 -0
- package/dist/providers-models-GDELBHZK.js.map +7 -0
- package/dist/quick-VIO2BEHS.js +10 -0
- package/dist/quick-VIO2BEHS.js.map +7 -0
- package/dist/repl-auto-proceed.d.ts +19 -0
- package/dist/repl-auto-proceed.d.ts.map +1 -0
- package/dist/repl-client-registration.d.ts +7 -0
- package/dist/repl-client-registration.d.ts.map +1 -0
- package/dist/repl-input.d.ts +11 -0
- package/dist/repl-input.d.ts.map +1 -0
- package/dist/repl-options.d.ts +54 -0
- package/dist/repl-options.d.ts.map +1 -0
- package/dist/repl-rendering.d.ts +4 -0
- package/dist/repl-rendering.d.ts.map +1 -0
- package/dist/repl-suggestions.d.ts +21 -0
- package/dist/repl-suggestions.d.ts.map +1 -0
- package/dist/repl.d.ts +3 -162
- package/dist/repl.d.ts.map +1 -1
- package/dist/replay-KCTXNMZQ.js +75 -0
- package/dist/replay-KCTXNMZQ.js.map +7 -0
- package/dist/rewind-EJMVFVLS.js +185 -0
- package/dist/rewind-EJMVFVLS.js.map +7 -0
- package/dist/sdd-runtime-IKPROVV2.js +54 -0
- package/dist/sdd-runtime-IKPROVV2.js.map +7 -0
- package/dist/services/sdd/project-context.d.ts +1 -1
- package/dist/services/sdd/project-context.d.ts.map +1 -1
- package/dist/services/statusline-config.d.ts +1 -1
- package/dist/services/statusline-config.d.ts.map +1 -1
- package/dist/session-event-wiring.d.ts +2 -2
- package/dist/session-event-wiring.d.ts.map +1 -1
- package/dist/sessions-config-NLCMK3BY.js +409 -0
- package/dist/sessions-config-NLCMK3BY.js.map +7 -0
- package/dist/settings-menu.d.ts +3 -18
- package/dist/settings-menu.d.ts.map +1 -1
- package/dist/simpleui-dist-JIFGUJO7.js +93 -0
- package/dist/simpleui-dist-JIFGUJO7.js.map +7 -0
- package/dist/slash-commands/brain.d.ts.map +1 -1
- package/dist/slash-commands/clear.d.ts.map +1 -1
- package/dist/slash-commands/fallback.d.ts.map +1 -1
- package/dist/slash-commands/kanban-agent-helpers.d.ts +18 -0
- package/dist/slash-commands/kanban-agent-helpers.d.ts.map +1 -0
- package/dist/slash-commands/kanban-format.d.ts +16 -0
- package/dist/slash-commands/kanban-format.d.ts.map +1 -0
- package/dist/slash-commands/kanban-help.d.ts +2 -0
- package/dist/slash-commands/kanban-help.d.ts.map +1 -0
- package/dist/slash-commands/kanban.d.ts.map +1 -1
- package/dist/slash-commands/mailbox-demo.d.ts.map +1 -1
- package/dist/slash-commands/mailbox.d.ts +2 -1
- package/dist/slash-commands/mailbox.d.ts.map +1 -1
- package/dist/slash-commands/memory-compact.d.ts +5 -0
- package/dist/slash-commands/memory-compact.d.ts.map +1 -0
- package/dist/slash-commands/memory-flags.d.ts +36 -0
- package/dist/slash-commands/memory-flags.d.ts.map +1 -0
- package/dist/slash-commands/memory-formatters.d.ts +16 -0
- package/dist/slash-commands/memory-formatters.d.ts.map +1 -0
- package/dist/slash-commands/memory.d.ts.map +1 -1
- package/dist/slash-commands/mouse.d.ts +2 -2
- package/dist/slash-commands/review.d.ts.map +1 -1
- package/dist/slash-commands/sdd-command-helpers.d.ts +23 -0
- package/dist/slash-commands/sdd-command-helpers.d.ts.map +1 -0
- package/dist/slash-commands/sdd-format.d.ts +32 -0
- package/dist/slash-commands/sdd-format.d.ts.map +1 -0
- package/dist/slash-commands/sdd.d.ts.map +1 -1
- package/dist/subcommands/handlers/chronicle.d.ts.map +1 -1
- package/dist/subcommands/handlers/mailbox-serve.d.ts.map +1 -1
- package/dist/subcommands/handlers/model-smoke-test.d.ts +51 -0
- package/dist/subcommands/handlers/model-smoke-test.d.ts.map +1 -0
- package/dist/subcommands/handlers/modeldiag-profiles.d.ts +64 -0
- package/dist/subcommands/handlers/modeldiag-profiles.d.ts.map +1 -0
- package/dist/subcommands/handlers/modeldiag.d.ts.map +1 -1
- package/dist/subcommands/handlers/per-subcommand-deep-help-table.d.ts +3 -0
- package/dist/subcommands/handlers/per-subcommand-deep-help-table.d.ts.map +1 -0
- package/dist/subcommands/handlers/per-subcommand-help-data.d.ts +3 -0
- package/dist/subcommands/handlers/per-subcommand-help-data.d.ts.map +1 -0
- package/dist/subcommands/handlers/per-subcommand-help-table.d.ts +36 -0
- package/dist/subcommands/handlers/per-subcommand-help-table.d.ts.map +1 -0
- package/dist/subcommands/handlers/per-subcommand-help-types.d.ts +18 -0
- package/dist/subcommands/handlers/per-subcommand-help-types.d.ts.map +1 -0
- package/dist/subcommands/handlers/per-subcommand-help.d.ts +2 -80
- package/dist/subcommands/handlers/per-subcommand-help.d.ts.map +1 -1
- package/dist/subcommands/handlers/rewind.d.ts.map +1 -1
- package/dist/subcommands/index.d.ts +7 -0
- package/dist/subcommands/index.d.ts.map +1 -1
- package/dist/tools-skills-UNKLOB7M.js +29 -0
- package/dist/tools-skills-UNKLOB7M.js.map +7 -0
- package/dist/update-YC4TYW2Y.js +16 -0
- package/dist/update-YC4TYW2Y.js.map +7 -0
- package/dist/update-check-UMYTOH7Z.js +18 -0
- package/dist/update-check-UMYTOH7Z.js.map +7 -0
- package/dist/version-help-DROHZRW6.js +11 -0
- package/dist/version-help-DROHZRW6.js.map +7 -0
- package/dist/webui-server/connection-handler.d.ts.map +1 -1
- package/dist/webui-server/kanban-host-adapter.d.ts +5 -1
- package/dist/webui-server/kanban-host-adapter.d.ts.map +1 -1
- package/dist/webui-server/listen-helpers.d.ts +18 -0
- package/dist/webui-server/listen-helpers.d.ts.map +1 -0
- package/dist/webui-server/node-pty-loader.d.ts +6 -0
- package/dist/webui-server/node-pty-loader.d.ts.map +1 -0
- package/dist/webui-server-G3TISUIY.js +1459 -0
- package/dist/webui-server-G3TISUIY.js.map +7 -0
- package/dist/webui-server-options.d.ts +189 -0
- package/dist/webui-server-options.d.ts.map +1 -0
- package/dist/webui-server.d.ts +2 -178
- package/dist/webui-server.d.ts.map +1 -1
- package/dist/wiring/brain-and-orchestration.d.ts.map +1 -1
- package/dist/wiring/codebase-index.d.ts.map +1 -1
- package/dist/wiring/command-host-state.d.ts +4 -4
- package/dist/wiring/dep-watcher-bridge.d.ts +23 -0
- package/dist/wiring/dep-watcher-bridge.d.ts.map +1 -0
- package/dist/wiring/dep-watcher.d.ts.map +1 -1
- package/dist/wiring/hq-telemetry.d.ts +2 -2
- package/dist/wiring/lifecycle-plugins.d.ts +4 -3
- package/dist/wiring/lifecycle-plugins.d.ts.map +1 -1
- package/dist/wiring/mailbox-bridge-bootstrap.d.ts +1 -1
- package/dist/wiring/management-tools.d.ts +15 -0
- package/dist/wiring/management-tools.d.ts.map +1 -0
- package/dist/wiring/pipeline.d.ts +2 -1
- package/dist/wiring/pipeline.d.ts.map +1 -1
- package/dist/wiring/plugins.d.ts +1 -1
- package/dist/wiring/plugins.d.ts.map +1 -1
- package/dist/wiring/provider-runtime-setup.d.ts +14 -1
- package/dist/wiring/provider-runtime-setup.d.ts.map +1 -1
- package/dist/wiring/provider.d.ts.map +1 -1
- package/dist/wiring/runtime-controller-deps.d.ts +1 -1
- package/dist/wiring/runtime-controller-deps.d.ts.map +1 -1
- package/dist/wiring/sage.d.ts.map +1 -1
- package/dist/wiring/session-registry.d.ts +38 -0
- package/dist/wiring/session-registry.d.ts.map +1 -0
- package/dist/wiring/session.d.ts +7 -5
- package/dist/wiring/session.d.ts.map +1 -1
- package/dist/wiring/tools.d.ts.map +1 -1
- package/package.json +22 -22
- package/dist/cli-recovery-prompt.d.ts +0 -19
- package/dist/cli-recovery-prompt.d.ts.map +0 -1
- package/dist/first-run-auth-gate.d.ts +0 -20
- package/dist/first-run-auth-gate.d.ts.map +0 -1
- package/dist/pre-launch/indexing-question.d.ts +0 -28
- package/dist/pre-launch/indexing-question.d.ts.map +0 -1
|
@@ -0,0 +1,7 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
|
|
2
|
+
// src/utils/hq-ttl.ts
|
|
3
|
+
var TTL_UNIT_MS = {
|
|
4
|
+
ms: 1,
|
|
5
|
+
s: 1e3,
|
|
6
|
+
m: 6e4,
|
|
7
|
+
h: 36e5,
|
|
8
|
+
d: 864e5,
|
|
9
|
+
w: 6048e5
|
|
10
|
+
};
|
|
11
|
+
function parseTokenTtlValue(raw) {
|
|
12
|
+
const trimmed = raw.trim();
|
|
13
|
+
if (trimmed.length === 0) {
|
|
14
|
+
return { error: "TTL value is empty" };
|
|
15
|
+
}
|
|
16
|
+
if (/^\d+$/.test(trimmed)) {
|
|
17
|
+
const ms = Number.parseInt(trimmed, 10);
|
|
18
|
+
if (!Number.isFinite(ms) || ms <= 0) {
|
|
19
|
+
return { error: `TTL value must be positive (got ${raw})` };
|
|
20
|
+
}
|
|
21
|
+
return { value: ms };
|
|
22
|
+
}
|
|
23
|
+
const match = /^(?<value>\d+)(?<unit>ms|s|m|h|d|w)$/i.exec(trimmed);
|
|
24
|
+
if (match?.groups) {
|
|
25
|
+
const value = Number.parseInt(match.groups.value, 10);
|
|
26
|
+
const unit = match.groups.unit.toLowerCase();
|
|
27
|
+
const multiplier = TTL_UNIT_MS[unit];
|
|
28
|
+
if (!Number.isFinite(value) || value <= 0 || multiplier === void 0) {
|
|
29
|
+
return { error: `TTL value must be positive with a valid unit (got ${raw})` };
|
|
30
|
+
}
|
|
31
|
+
return { value: value * multiplier };
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
error: `TTL must be a positive integer (milliseconds) or <number><unit> where unit is one of ms, s, m, h, d, w (got ${raw})`
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export {
|
|
39
|
+
parseTokenTtlValue
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=chunk-BGFM3PD7.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
|
|
2
|
+
// src/profile-config-path.ts
|
|
3
|
+
function activeProfileName(config) {
|
|
4
|
+
return typeof config.activeProfile === "string" && config.activeProfile.trim() ? config.activeProfile : "default";
|
|
5
|
+
}
|
|
6
|
+
function activeProfileConfigPath(paths, config) {
|
|
7
|
+
return paths.profileConfig(activeProfileName(config));
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export {
|
|
11
|
+
activeProfileConfigPath
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=chunk-DPJZQCVP.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
|
|
2
|
+
// src/update-check.ts
|
|
3
|
+
import * as fs from "node:fs/promises";
|
|
4
|
+
import { createRequire } from "node:module";
|
|
5
|
+
import * as os from "node:os";
|
|
6
|
+
import * as path from "node:path";
|
|
7
|
+
import { FetchError } from "@wrongstack/core/types";
|
|
8
|
+
import { resolveWstackPaths } from "@wrongstack/core/utils";
|
|
9
|
+
var defaultHomeDir = () => os.homedir();
|
|
10
|
+
function npmRegistryUrl(packageName) {
|
|
11
|
+
return `https://registry.npmjs.org/${encodeURIComponent(packageName)}/latest`;
|
|
12
|
+
}
|
|
13
|
+
function cachePath(homeFn = defaultHomeDir) {
|
|
14
|
+
const paths = homeFn === defaultHomeDir ? resolveWstackPaths({ projectRoot: process.cwd() }) : resolveWstackPaths({ projectRoot: process.cwd(), userHome: homeFn() });
|
|
15
|
+
return paths.profileUpdateCache(paths.profileName);
|
|
16
|
+
}
|
|
17
|
+
var CACHE_TTL_MS = 24 * 60 * 60 * 1e3;
|
|
18
|
+
function currentVersion() {
|
|
19
|
+
const req = createRequire(import.meta.url);
|
|
20
|
+
const candidates = ["../package.json", "../../package.json"];
|
|
21
|
+
for (const rel of candidates) {
|
|
22
|
+
try {
|
|
23
|
+
const pkg = req(rel);
|
|
24
|
+
if (typeof pkg.version === "string" && pkg.version.length > 0) return pkg.version;
|
|
25
|
+
} catch {
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return "dev";
|
|
29
|
+
}
|
|
30
|
+
function parseSemver(version) {
|
|
31
|
+
const match = version.match(
|
|
32
|
+
/^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-]+)*)?$/
|
|
33
|
+
);
|
|
34
|
+
if (!match) return null;
|
|
35
|
+
return {
|
|
36
|
+
major: Number(match[1]),
|
|
37
|
+
minor: Number(match[2]),
|
|
38
|
+
patch: Number(match[3]),
|
|
39
|
+
prerelease: match[4]?.split(".") ?? []
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
function comparePrerelease(a, b) {
|
|
43
|
+
if (a.length === 0 || b.length === 0) {
|
|
44
|
+
if (a.length === b.length) return 0;
|
|
45
|
+
return a.length === 0 ? 1 : -1;
|
|
46
|
+
}
|
|
47
|
+
for (let i = 0; i < Math.max(a.length, b.length); i++) {
|
|
48
|
+
const ai = a[i];
|
|
49
|
+
const bi = b[i];
|
|
50
|
+
if (ai === void 0 || bi === void 0) return ai === void 0 ? -1 : 1;
|
|
51
|
+
if (ai === bi) continue;
|
|
52
|
+
const aNumeric = /^\d+$/.test(ai);
|
|
53
|
+
const bNumeric = /^\d+$/.test(bi);
|
|
54
|
+
if (aNumeric && bNumeric) return Number(ai) > Number(bi) ? 1 : -1;
|
|
55
|
+
if (aNumeric !== bNumeric) return aNumeric ? -1 : 1;
|
|
56
|
+
return ai > bi ? 1 : -1;
|
|
57
|
+
}
|
|
58
|
+
return 0;
|
|
59
|
+
}
|
|
60
|
+
function isNewer(a, b) {
|
|
61
|
+
const av = parseSemver(a);
|
|
62
|
+
const bv = parseSemver(b);
|
|
63
|
+
if (!av || !bv) return false;
|
|
64
|
+
for (const key of ["major", "minor", "patch"]) {
|
|
65
|
+
if (av[key] > bv[key]) return true;
|
|
66
|
+
if (av[key] < bv[key]) return false;
|
|
67
|
+
}
|
|
68
|
+
return comparePrerelease(av.prerelease, bv.prerelease) > 0;
|
|
69
|
+
}
|
|
70
|
+
async function readCache(homeFn = defaultHomeDir, packageName = "wrongstack") {
|
|
71
|
+
try {
|
|
72
|
+
const raw = await fs.readFile(cachePath(homeFn), "utf8");
|
|
73
|
+
const value = JSON.parse(raw);
|
|
74
|
+
const cachedPackage = value["packageName"];
|
|
75
|
+
if (typeof value["timestamp"] !== "number" || !Number.isFinite(value["timestamp"]) || typeof value["latestVersion"] !== "string" || !parseSemver(value["latestVersion"]) || cachedPackage !== void 0 && cachedPackage !== packageName || cachedPackage === void 0 && packageName !== "wrongstack") {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
const entry = {
|
|
79
|
+
timestamp: value["timestamp"],
|
|
80
|
+
latestVersion: value["latestVersion"],
|
|
81
|
+
packageName
|
|
82
|
+
};
|
|
83
|
+
return { entry, fresh: Date.now() - entry.timestamp <= CACHE_TTL_MS };
|
|
84
|
+
} catch {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
async function writeCache(entry, homeFn = defaultHomeDir) {
|
|
89
|
+
try {
|
|
90
|
+
const dir = path.dirname(cachePath(homeFn));
|
|
91
|
+
await fs.mkdir(dir, { recursive: true });
|
|
92
|
+
await fs.writeFile(cachePath(homeFn), JSON.stringify(entry, null, 2), "utf8");
|
|
93
|
+
} catch {
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
async function fetchLatestFromNpm(packageOrTimeout = "wrongstack", timeoutMs = 3e3, signal) {
|
|
97
|
+
const packageName = typeof packageOrTimeout === "number" ? "wrongstack" : packageOrTimeout;
|
|
98
|
+
const effectiveTimeoutMs = typeof packageOrTimeout === "number" ? packageOrTimeout : timeoutMs;
|
|
99
|
+
const url = npmRegistryUrl(packageName);
|
|
100
|
+
const timeoutSignal = AbortSignal.timeout(effectiveTimeoutMs);
|
|
101
|
+
const combinedSignal = signal ? AbortSignal.any([signal, timeoutSignal]) : timeoutSignal;
|
|
102
|
+
const res = await fetch(url, {
|
|
103
|
+
signal: combinedSignal,
|
|
104
|
+
headers: { Accept: "application/json" }
|
|
105
|
+
});
|
|
106
|
+
if (!res.ok) {
|
|
107
|
+
throw new FetchError({
|
|
108
|
+
message: `npm registry responded ${res.status}`,
|
|
109
|
+
status: res.status,
|
|
110
|
+
context: { op: "checkForUpdate", registry: "npmjs", url }
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
const data = await res.json();
|
|
114
|
+
if (typeof data.version === "string" && parseSemver(data.version)) return data.version;
|
|
115
|
+
throw new Error("No valid version field in npm response");
|
|
116
|
+
}
|
|
117
|
+
async function checkForUpdate(signalOrOptions, legacyHomeFn) {
|
|
118
|
+
const options = signalOrOptions instanceof AbortSignal ? { signal: signalOrOptions, homeFn: legacyHomeFn } : signalOrOptions ?? { homeFn: legacyHomeFn };
|
|
119
|
+
const current = currentVersion();
|
|
120
|
+
const signal = options.signal;
|
|
121
|
+
const packageName = options.packageName ?? "wrongstack";
|
|
122
|
+
const aborted = () => signal?.aborted ?? false;
|
|
123
|
+
const hf = options.homeFn ?? defaultHomeDir;
|
|
124
|
+
if (aborted()) {
|
|
125
|
+
return { current, latest: current, outdated: false, checkFailed: true };
|
|
126
|
+
}
|
|
127
|
+
const cached = await readCache(hf, packageName);
|
|
128
|
+
if (!options.forceRefresh && cached?.fresh) {
|
|
129
|
+
return {
|
|
130
|
+
current,
|
|
131
|
+
latest: cached.entry.latestVersion,
|
|
132
|
+
outdated: isNewer(cached.entry.latestVersion, current),
|
|
133
|
+
checkFailed: false
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
try {
|
|
137
|
+
const latest = await fetchLatestFromNpm(packageName, 3e3, signal);
|
|
138
|
+
await writeCache({ timestamp: Date.now(), latestVersion: latest, packageName }, hf);
|
|
139
|
+
return {
|
|
140
|
+
current,
|
|
141
|
+
latest,
|
|
142
|
+
outdated: isNewer(latest, current),
|
|
143
|
+
checkFailed: false
|
|
144
|
+
};
|
|
145
|
+
} catch {
|
|
146
|
+
if (aborted()) {
|
|
147
|
+
return { current, latest: current, outdated: false, checkFailed: true };
|
|
148
|
+
}
|
|
149
|
+
if (cached) {
|
|
150
|
+
return {
|
|
151
|
+
current,
|
|
152
|
+
latest: cached.entry.latestVersion,
|
|
153
|
+
outdated: isNewer(cached.entry.latestVersion, current),
|
|
154
|
+
checkFailed: true
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
return { current, latest: current, outdated: false, checkFailed: true };
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
async function getUpdateNotification(signal, homeFn) {
|
|
161
|
+
const info = await checkForUpdate(signal, homeFn);
|
|
162
|
+
if (info.outdated) {
|
|
163
|
+
return `Update available: v${info.current} \u2192 v${info.latest}`;
|
|
164
|
+
}
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
export {
|
|
169
|
+
cachePath,
|
|
170
|
+
currentVersion,
|
|
171
|
+
isNewer,
|
|
172
|
+
fetchLatestFromNpm,
|
|
173
|
+
checkForUpdate,
|
|
174
|
+
getUpdateNotification
|
|
175
|
+
};
|
|
176
|
+
//# sourceMappingURL=chunk-F4PEGAJZ.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
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
|
+
}
|