@wrongstack/cli 0.295.1 → 0.296.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/data/providers.json +0 -24
- package/dist/acp-A5OSIU2P.js +824 -0
- package/dist/acp-A5OSIU2P.js.map +7 -0
- package/dist/acp-server-agent.d.ts.map +1 -1
- package/dist/arg-parser.d.ts.map +1 -1
- package/dist/audit-2ZSFGNIF.js +102 -0
- package/dist/audit-2ZSFGNIF.js.map +7 -0
- package/dist/auth-CJWQJVRH.js +504 -0
- package/dist/auth-CJWQJVRH.js.map +7 -0
- package/dist/auth-menu/auth-menu-audit.d.ts +0 -4
- package/dist/auth-menu/auth-menu-audit.d.ts.map +1 -1
- package/dist/bench-7ZDWSNEF.js +278 -0
- package/dist/bench-7ZDWSNEF.js.map +7 -0
- package/dist/boot/brain-decision-log.d.ts +7 -5
- package/dist/boot/brain-decision-log.d.ts.map +1 -1
- package/dist/boot/dispatch-webui.d.ts +5 -8
- package/dist/boot/dispatch-webui.d.ts.map +1 -1
- package/dist/boot/system-prompt-builder.d.ts +3 -0
- package/dist/boot/system-prompt-builder.d.ts.map +1 -1
- package/dist/boot/tui-coordinator-callbacks.d.ts +45 -0
- package/dist/boot/tui-coordinator-callbacks.d.ts.map +1 -0
- package/dist/boot/tui-project-switch.d.ts +2 -3
- package/dist/boot/tui-project-switch.d.ts.map +1 -1
- package/dist/boot/tui-runtime-state.d.ts +5 -6
- package/dist/boot/tui-runtime-state.d.ts.map +1 -1
- package/dist/boot/tui-session-resume.d.ts.map +1 -1
- package/dist/boot/tui-settings-adapter.d.ts +2 -3
- package/dist/boot/tui-settings-adapter.d.ts.map +1 -1
- package/dist/boot.d.ts.map +1 -1
- package/dist/brain-menu/panel-service.d.ts.map +1 -1
- package/dist/chimera-review-task.d.ts +6 -0
- package/dist/chimera-review-task.d.ts.map +1 -0
- package/dist/chimera-reviewer-policy.d.ts +34 -0
- package/dist/chimera-reviewer-policy.d.ts.map +1 -0
- package/dist/chronicle-QQEQFSSE.js +256 -0
- package/dist/chronicle-QQEQFSSE.js.map +7 -0
- package/dist/chunk-5N34EWJR.js +418 -0
- package/dist/chunk-5N34EWJR.js.map +7 -0
- package/dist/chunk-66T43Q4Y.js +90 -0
- package/dist/chunk-66T43Q4Y.js.map +7 -0
- package/dist/chunk-7OCVIDC7.js +11 -0
- package/dist/chunk-7OCVIDC7.js.map +7 -0
- package/dist/chunk-ABXK4VVY.js +84 -0
- package/dist/chunk-ABXK4VVY.js.map +7 -0
- package/dist/chunk-AXVZMEWG.js +306 -0
- package/dist/chunk-AXVZMEWG.js.map +7 -0
- package/dist/chunk-AZESNNIC.js +216 -0
- package/dist/chunk-AZESNNIC.js.map +7 -0
- package/dist/chunk-BGFM3PD7.js +41 -0
- package/dist/chunk-BGFM3PD7.js.map +7 -0
- package/dist/chunk-BQCAJ7FI.js +425 -0
- package/dist/chunk-BQCAJ7FI.js.map +7 -0
- package/dist/chunk-DPJZQCVP.js +13 -0
- package/dist/chunk-DPJZQCVP.js.map +7 -0
- package/dist/chunk-F4PEGAJZ.js +176 -0
- package/dist/chunk-F4PEGAJZ.js.map +7 -0
- package/dist/chunk-IHBYBYGA.js +443 -0
- package/dist/chunk-IHBYBYGA.js.map +7 -0
- package/dist/chunk-JBSQ7ONN.js +1023 -0
- package/dist/chunk-JBSQ7ONN.js.map +7 -0
- package/dist/chunk-JBTFWWKV.js +1325 -0
- package/dist/chunk-JBTFWWKV.js.map +7 -0
- package/dist/chunk-JUHRI6OV.js +100 -0
- package/dist/chunk-JUHRI6OV.js.map +7 -0
- package/dist/chunk-OI7GWJDS.js +3303 -0
- package/dist/chunk-OI7GWJDS.js.map +7 -0
- package/dist/chunk-OP47B3IX.js +142 -0
- package/dist/chunk-OP47B3IX.js.map +7 -0
- package/dist/chunk-PJHET45A.js +158 -0
- package/dist/chunk-PJHET45A.js.map +7 -0
- package/dist/chunk-Q5GTM25S.js +17 -0
- package/dist/chunk-Q5GTM25S.js.map +7 -0
- package/dist/chunk-QD544J2B.js +19 -0
- package/dist/chunk-QD544J2B.js.map +7 -0
- package/dist/chunk-QUNHS6O3.js +258 -0
- package/dist/chunk-QUNHS6O3.js.map +7 -0
- package/dist/chunk-TADVX644.js +480 -0
- package/dist/chunk-TADVX644.js.map +7 -0
- package/dist/chunk-TGDHN4LM.js +81 -0
- package/dist/chunk-TGDHN4LM.js.map +7 -0
- package/dist/chunk-TYO2OVAD.js +50 -0
- package/dist/chunk-TYO2OVAD.js.map +7 -0
- package/dist/chunk-VCYZ3WZV.js +14 -0
- package/dist/chunk-VCYZ3WZV.js.map +7 -0
- package/dist/chunk-VJUEZZYB.js +29 -0
- package/dist/chunk-VJUEZZYB.js.map +7 -0
- package/dist/chunk-WHOIR577.js +1 -0
- package/dist/chunk-WHOIR577.js.map +7 -0
- package/dist/chunk-WY7KKOUK.js +460 -0
- package/dist/chunk-WY7KKOUK.js.map +7 -0
- package/dist/chunk-XJXDOF63.js +28 -0
- package/dist/chunk-XJXDOF63.js.map +7 -0
- package/dist/chunk-XWEGWYDU.js +560 -0
- package/dist/chunk-XWEGWYDU.js.map +7 -0
- package/dist/chunk-YWUPHRGB.js +346 -0
- package/dist/chunk-YWUPHRGB.js.map +7 -0
- package/dist/chunk-Z7YGASQP.js +313 -0
- package/dist/chunk-Z7YGASQP.js.map +7 -0
- package/dist/cli-entry-main.d.ts +2 -0
- package/dist/cli-entry-main.d.ts.map +1 -0
- package/dist/cli-entry-point.d.ts +3 -3
- package/dist/cli-entry-point.d.ts.map +1 -1
- package/dist/cli-main-RTY35OPD.js +29268 -0
- package/dist/cli-main-RTY35OPD.js.map +7 -0
- package/dist/cli-main-helpers.d.ts +21 -0
- package/dist/cli-main-helpers.d.ts.map +1 -0
- package/dist/cli-main.d.ts +25 -1
- package/dist/cli-main.d.ts.map +1 -1
- package/dist/context-limit.d.ts +48 -0
- package/dist/context-limit.d.ts.map +1 -1
- package/dist/diag-doctor-OQ3AA63O.js +170 -0
- package/dist/diag-doctor-OQ3AA63O.js.map +7 -0
- package/dist/execute-deps.d.ts +11 -12
- package/dist/execute-deps.d.ts.map +1 -1
- package/dist/execution-O7I5DYE6.js +4682 -0
- package/dist/execution-O7I5DYE6.js.map +7 -0
- package/dist/execution-chimera-ask.d.ts +10 -0
- package/dist/execution-chimera-ask.d.ts.map +1 -0
- package/dist/execution-chimera-cascade.d.ts +15 -0
- package/dist/execution-chimera-cascade.d.ts.map +1 -0
- package/dist/execution-cleanup.d.ts +23 -0
- package/dist/execution-cleanup.d.ts.map +1 -0
- package/dist/execution-kanban-dispatch.d.ts +10 -0
- package/dist/execution-kanban-dispatch.d.ts.map +1 -0
- package/dist/execution-repl-fleet-callbacks.d.ts +11 -0
- package/dist/execution-repl-fleet-callbacks.d.ts.map +1 -0
- package/dist/execution-storage-observability.d.ts +3 -0
- package/dist/execution-storage-observability.d.ts.map +1 -0
- package/dist/execution-tui-next-step-callbacks.d.ts +20 -0
- package/dist/execution-tui-next-step-callbacks.d.ts.map +1 -0
- package/dist/execution.d.ts +2 -139
- package/dist/execution.d.ts.map +1 -1
- package/dist/export-TPORYVRZ.js +64 -0
- package/dist/export-TPORYVRZ.js.map +7 -0
- package/dist/fleet/host-acp-runner-cache.d.ts +9 -0
- package/dist/fleet/host-acp-runner-cache.d.ts.map +1 -0
- package/dist/fleet/host-acp.d.ts +3 -0
- package/dist/fleet/host-acp.d.ts.map +1 -0
- package/dist/fleet/host-concurrency.d.ts +2 -0
- package/dist/fleet/host-concurrency.d.ts.map +1 -0
- package/dist/fleet/host-context.d.ts +5 -0
- package/dist/fleet/host-context.d.ts.map +1 -0
- package/dist/fleet/host-director-builder.d.ts +24 -0
- package/dist/fleet/host-director-builder.d.ts.map +1 -0
- package/dist/fleet/host-director-event-bridges.d.ts +37 -0
- package/dist/fleet/host-director-event-bridges.d.ts.map +1 -0
- package/dist/fleet/host-director-services.d.ts +20 -0
- package/dist/fleet/host-director-services.d.ts.map +1 -0
- package/dist/fleet/host-event-bridge.d.ts +17 -0
- package/dist/fleet/host-event-bridge.d.ts.map +1 -0
- package/dist/fleet/host-helpers.d.ts +22 -0
- package/dist/fleet/host-helpers.d.ts.map +1 -0
- package/dist/fleet/host-learning-tracker.d.ts +11 -0
- package/dist/fleet/host-learning-tracker.d.ts.map +1 -0
- package/dist/fleet/host-learning.d.ts +4 -0
- package/dist/fleet/host-learning.d.ts.map +1 -0
- package/dist/fleet/host-lifecycle-events.d.ts +4 -0
- package/dist/fleet/host-lifecycle-events.d.ts.map +1 -0
- package/dist/fleet/host-paths.d.ts +3 -0
- package/dist/fleet/host-paths.d.ts.map +1 -0
- package/dist/fleet/host-provider.d.ts +22 -0
- package/dist/fleet/host-provider.d.ts.map +1 -0
- package/dist/fleet/host-session-writer.d.ts +3 -0
- package/dist/fleet/host-session-writer.d.ts.map +1 -0
- package/dist/fleet/host-shadow-pass.d.ts +21 -0
- package/dist/fleet/host-shadow-pass.d.ts.map +1 -0
- package/dist/fleet/host-spawn-types.d.ts +25 -0
- package/dist/fleet/host-spawn-types.d.ts.map +1 -0
- package/dist/fleet/host-status.d.ts +48 -0
- package/dist/fleet/host-status.d.ts.map +1 -0
- package/dist/fleet/host-subagent-factory.d.ts +16 -0
- package/dist/fleet/host-subagent-factory.d.ts.map +1 -0
- package/dist/fleet/host-supervisor.d.ts +16 -0
- package/dist/fleet/host-supervisor.d.ts.map +1 -0
- package/dist/fleet/host-task-result-report.d.ts +11 -0
- package/dist/fleet/host-task-result-report.d.ts.map +1 -0
- package/dist/fleet/host-types.d.ts +89 -0
- package/dist/fleet/host-types.d.ts.map +1 -0
- package/dist/fleet/host.d.ts +10 -357
- package/dist/fleet/host.d.ts.map +1 -1
- package/dist/hq-JUYKUNJX.js +547 -0
- package/dist/hq-JUYKUNJX.js.map +7 -0
- package/dist/hq-command-controller.d.ts +2 -2
- package/dist/hq-command-controller.d.ts.map +1 -1
- package/dist/hq-server/auth.d.ts +15 -4
- package/dist/hq-server/auth.d.ts.map +1 -1
- package/dist/hq-server/project-root.d.ts +5 -0
- package/dist/hq-server/project-root.d.ts.map +1 -0
- package/dist/hq-server/routes/auth-handlers.d.ts +25 -0
- package/dist/hq-server/routes/auth-handlers.d.ts.map +1 -0
- package/dist/hq-server/routes/session-handlers.d.ts +8 -0
- package/dist/hq-server/routes/session-handlers.d.ts.map +1 -0
- package/dist/hq-server/routes.d.ts +8 -6
- package/dist/hq-server/routes.d.ts.map +1 -1
- package/dist/hq-server/snapshot.d.ts +44 -0
- package/dist/hq-server/snapshot.d.ts.map +1 -1
- package/dist/hq-server/types.d.ts +22 -4
- package/dist/hq-server/types.d.ts.map +1 -1
- package/dist/hq-server/utils.d.ts +8 -0
- package/dist/hq-server/utils.d.ts.map +1 -1
- package/dist/hq-server/ws.d.ts +1 -1
- package/dist/hq-server/ws.d.ts.map +1 -1
- package/dist/hq-server-6AQ3BXZA.js +39 -0
- package/dist/hq-server-6AQ3BXZA.js.map +7 -0
- package/dist/hq-server.d.ts +3 -3
- package/dist/hq-server.d.ts.map +1 -1
- package/dist/hq-ttl-U2FAYFAT.js +8 -0
- package/dist/hq-ttl-U2FAYFAT.js.map +7 -0
- package/dist/hq-tunnel-RFKGC4HI.js +114 -0
- package/dist/hq-tunnel-RFKGC4HI.js.map +7 -0
- package/dist/hq-tunnel.d.ts +1 -1
- package/dist/hq-tunnel.d.ts.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2503 -53026
- package/dist/index.js.map +4 -4
- package/dist/init-E2NDDOHI.js +27 -0
- package/dist/init-E2NDDOHI.js.map +7 -0
- package/dist/kanban-dispatch-route.d.ts +14 -0
- package/dist/kanban-dispatch-route.d.ts.map +1 -0
- package/dist/kanban-hq-sync.d.ts +2 -0
- package/dist/kanban-hq-sync.d.ts.map +1 -1
- package/dist/kanban-run-mirror-EKVNGXWW.js +12 -0
- package/dist/kanban-run-mirror-EKVNGXWW.js.map +7 -0
- package/dist/live-settings-input.d.ts +69 -0
- package/dist/live-settings-input.d.ts.map +1 -0
- package/dist/mailbox-serve-2UWHEN3M.js +302 -0
- package/dist/mailbox-serve-2UWHEN3M.js.map +7 -0
- package/dist/mcp-CYLPUEHC.js +413 -0
- package/dist/mcp-CYLPUEHC.js.map +7 -0
- package/dist/modeldiag-HENYJ4N7.js +1290 -0
- package/dist/modeldiag-HENYJ4N7.js.map +7 -0
- package/dist/permissions-FNYLZIL4.js +115 -0
- package/dist/permissions-FNYLZIL4.js.map +7 -0
- package/dist/picker-key-state.d.ts +7 -0
- package/dist/picker-key-state.d.ts.map +1 -0
- package/dist/picker-model-picker.d.ts +6 -0
- package/dist/picker-model-picker.d.ts.map +1 -0
- package/dist/picker-ui.d.ts +17 -0
- package/dist/picker-ui.d.ts.map +1 -0
- package/dist/picker.d.ts +4 -37
- package/dist/picker.d.ts.map +1 -1
- package/dist/plugin-usage-OU6X6LM3.js +40 -0
- package/dist/plugin-usage-OU6X6LM3.js.map +7 -0
- package/dist/plugins-4LJ5IUBI.js +24 -0
- package/dist/plugins-4LJ5IUBI.js.map +7 -0
- package/dist/pre-launch.d.ts +0 -1
- package/dist/pre-launch.d.ts.map +1 -1
- package/dist/project-BLQ3ALVL.js +76 -0
- package/dist/project-BLQ3ALVL.js.map +7 -0
- package/dist/project-manifest-GE25PW4S.js +18 -0
- package/dist/project-manifest-GE25PW4S.js.map +7 -0
- package/dist/project-picker-BOCWHBXP.js +17 -0
- package/dist/project-picker-BOCWHBXP.js.map +7 -0
- package/dist/projects-XE76NFNZ.js +38 -0
- package/dist/projects-XE76NFNZ.js.map +7 -0
- package/dist/provider-helpers.d.ts +22 -6
- package/dist/provider-helpers.d.ts.map +1 -1
- package/dist/providers-models-GDELBHZK.js +589 -0
- package/dist/providers-models-GDELBHZK.js.map +7 -0
- package/dist/quick-VIO2BEHS.js +10 -0
- package/dist/quick-VIO2BEHS.js.map +7 -0
- package/dist/repl-auto-proceed.d.ts +19 -0
- package/dist/repl-auto-proceed.d.ts.map +1 -0
- package/dist/repl-client-registration.d.ts +7 -0
- package/dist/repl-client-registration.d.ts.map +1 -0
- package/dist/repl-input.d.ts +11 -0
- package/dist/repl-input.d.ts.map +1 -0
- package/dist/repl-options.d.ts +54 -0
- package/dist/repl-options.d.ts.map +1 -0
- package/dist/repl-rendering.d.ts +4 -0
- package/dist/repl-rendering.d.ts.map +1 -0
- package/dist/repl-suggestions.d.ts +21 -0
- package/dist/repl-suggestions.d.ts.map +1 -0
- package/dist/repl.d.ts +3 -162
- package/dist/repl.d.ts.map +1 -1
- package/dist/replay-KCTXNMZQ.js +75 -0
- package/dist/replay-KCTXNMZQ.js.map +7 -0
- package/dist/rewind-EJMVFVLS.js +185 -0
- package/dist/rewind-EJMVFVLS.js.map +7 -0
- package/dist/sdd-runtime-JG4EEKL6.js +54 -0
- package/dist/sdd-runtime-JG4EEKL6.js.map +7 -0
- package/dist/services/sdd/project-context.d.ts +1 -1
- package/dist/services/sdd/project-context.d.ts.map +1 -1
- package/dist/services/sdd/task-manager.d.ts.map +1 -1
- package/dist/services/statusline-config.d.ts +1 -1
- package/dist/services/statusline-config.d.ts.map +1 -1
- package/dist/session-event-wiring.d.ts +2 -2
- package/dist/session-event-wiring.d.ts.map +1 -1
- package/dist/sessions-config-NLCMK3BY.js +409 -0
- package/dist/sessions-config-NLCMK3BY.js.map +7 -0
- package/dist/settings-menu.d.ts +3 -18
- package/dist/settings-menu.d.ts.map +1 -1
- package/dist/simpleui-dist-JIFGUJO7.js +93 -0
- package/dist/simpleui-dist-JIFGUJO7.js.map +7 -0
- package/dist/slash-commands/brain.d.ts.map +1 -1
- package/dist/slash-commands/clear.d.ts.map +1 -1
- package/dist/slash-commands/fallback.d.ts.map +1 -1
- package/dist/slash-commands/kanban-agent-helpers.d.ts +18 -0
- package/dist/slash-commands/kanban-agent-helpers.d.ts.map +1 -0
- package/dist/slash-commands/kanban-format.d.ts +16 -0
- package/dist/slash-commands/kanban-format.d.ts.map +1 -0
- package/dist/slash-commands/kanban-help.d.ts +2 -0
- package/dist/slash-commands/kanban-help.d.ts.map +1 -0
- package/dist/slash-commands/kanban.d.ts.map +1 -1
- package/dist/slash-commands/mailbox-demo.d.ts.map +1 -1
- package/dist/slash-commands/mailbox.d.ts +2 -1
- package/dist/slash-commands/mailbox.d.ts.map +1 -1
- package/dist/slash-commands/memory-compact.d.ts +5 -0
- package/dist/slash-commands/memory-compact.d.ts.map +1 -0
- package/dist/slash-commands/memory-flags.d.ts +36 -0
- package/dist/slash-commands/memory-flags.d.ts.map +1 -0
- package/dist/slash-commands/memory-formatters.d.ts +16 -0
- package/dist/slash-commands/memory-formatters.d.ts.map +1 -0
- package/dist/slash-commands/memory.d.ts.map +1 -1
- package/dist/slash-commands/mouse.d.ts +2 -2
- package/dist/slash-commands/review.d.ts.map +1 -1
- package/dist/slash-commands/sdd-command-helpers.d.ts +23 -0
- package/dist/slash-commands/sdd-command-helpers.d.ts.map +1 -0
- package/dist/slash-commands/sdd-format.d.ts +32 -0
- package/dist/slash-commands/sdd-format.d.ts.map +1 -0
- package/dist/slash-commands/sdd.d.ts.map +1 -1
- package/dist/slash-commands/settings.d.ts.map +1 -1
- package/dist/subcommands/handlers/chronicle.d.ts.map +1 -1
- package/dist/subcommands/handlers/mailbox-serve.d.ts.map +1 -1
- package/dist/subcommands/handlers/model-smoke-test.d.ts +51 -0
- package/dist/subcommands/handlers/model-smoke-test.d.ts.map +1 -0
- package/dist/subcommands/handlers/modeldiag-profiles.d.ts +64 -0
- package/dist/subcommands/handlers/modeldiag-profiles.d.ts.map +1 -0
- package/dist/subcommands/handlers/modeldiag.d.ts.map +1 -1
- package/dist/subcommands/handlers/per-subcommand-deep-help-table.d.ts +3 -0
- package/dist/subcommands/handlers/per-subcommand-deep-help-table.d.ts.map +1 -0
- package/dist/subcommands/handlers/per-subcommand-help-data.d.ts +3 -0
- package/dist/subcommands/handlers/per-subcommand-help-data.d.ts.map +1 -0
- package/dist/subcommands/handlers/per-subcommand-help-table.d.ts +36 -0
- package/dist/subcommands/handlers/per-subcommand-help-table.d.ts.map +1 -0
- package/dist/subcommands/handlers/per-subcommand-help-types.d.ts +18 -0
- package/dist/subcommands/handlers/per-subcommand-help-types.d.ts.map +1 -0
- package/dist/subcommands/handlers/per-subcommand-help.d.ts +2 -80
- package/dist/subcommands/handlers/per-subcommand-help.d.ts.map +1 -1
- package/dist/subcommands/handlers/rewind.d.ts.map +1 -1
- package/dist/subcommands/index.d.ts +7 -0
- package/dist/subcommands/index.d.ts.map +1 -1
- package/dist/tools-skills-UNKLOB7M.js +29 -0
- package/dist/tools-skills-UNKLOB7M.js.map +7 -0
- package/dist/update-YC4TYW2Y.js +16 -0
- package/dist/update-YC4TYW2Y.js.map +7 -0
- package/dist/update-check-UMYTOH7Z.js +18 -0
- package/dist/update-check-UMYTOH7Z.js.map +7 -0
- package/dist/version-help-DROHZRW6.js +11 -0
- package/dist/version-help-DROHZRW6.js.map +7 -0
- package/dist/webui-server/connection-handler.d.ts.map +1 -1
- package/dist/webui-server/kanban-host-adapter.d.ts +5 -1
- package/dist/webui-server/kanban-host-adapter.d.ts.map +1 -1
- package/dist/webui-server/listen-helpers.d.ts +18 -0
- package/dist/webui-server/listen-helpers.d.ts.map +1 -0
- package/dist/webui-server/node-pty-loader.d.ts +6 -0
- package/dist/webui-server/node-pty-loader.d.ts.map +1 -0
- package/dist/webui-server-ZF5KVGC5.js +1460 -0
- package/dist/webui-server-ZF5KVGC5.js.map +7 -0
- package/dist/webui-server-options.d.ts +191 -0
- package/dist/webui-server-options.d.ts.map +1 -0
- package/dist/webui-server.d.ts +2 -178
- package/dist/webui-server.d.ts.map +1 -1
- package/dist/wiring/brain-and-orchestration.d.ts.map +1 -1
- package/dist/wiring/codebase-index.d.ts.map +1 -1
- package/dist/wiring/command-host-state.d.ts +4 -4
- package/dist/wiring/dep-watcher-bridge.d.ts +23 -0
- package/dist/wiring/dep-watcher-bridge.d.ts.map +1 -0
- package/dist/wiring/dep-watcher.d.ts.map +1 -1
- package/dist/wiring/hq-telemetry.d.ts +2 -2
- package/dist/wiring/lifecycle-plugins.d.ts +4 -3
- package/dist/wiring/lifecycle-plugins.d.ts.map +1 -1
- package/dist/wiring/mailbox-bridge-bootstrap.d.ts +1 -1
- package/dist/wiring/management-tools.d.ts +15 -0
- package/dist/wiring/management-tools.d.ts.map +1 -0
- package/dist/wiring/pipeline.d.ts +2 -1
- package/dist/wiring/pipeline.d.ts.map +1 -1
- package/dist/wiring/plugins.d.ts +1 -1
- package/dist/wiring/plugins.d.ts.map +1 -1
- package/dist/wiring/provider-runtime-setup.d.ts +14 -1
- package/dist/wiring/provider-runtime-setup.d.ts.map +1 -1
- package/dist/wiring/provider.d.ts.map +1 -1
- package/dist/wiring/runtime-controller-deps.d.ts +1 -1
- package/dist/wiring/runtime-controller-deps.d.ts.map +1 -1
- package/dist/wiring/sage.d.ts.map +1 -1
- package/dist/wiring/session-registry.d.ts +38 -0
- package/dist/wiring/session-registry.d.ts.map +1 -0
- package/dist/wiring/session.d.ts +10 -6
- package/dist/wiring/session.d.ts.map +1 -1
- package/dist/wiring/tools.d.ts.map +1 -1
- package/package.json +22 -22
- package/dist/cli-recovery-prompt.d.ts +0 -19
- package/dist/cli-recovery-prompt.d.ts.map +0 -1
- package/dist/first-run-auth-gate.d.ts +0 -20
- package/dist/first-run-auth-gate.d.ts.map +0 -1
- package/dist/pre-launch/indexing-question.d.ts +0 -28
- package/dist/pre-launch/indexing-question.d.ts.map +0 -1
|
@@ -0,0 +1,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
|
+
}
|
|
@@ -0,0 +1,443 @@
|
|
|
1
|
+
import {
|
|
2
|
+
theme
|
|
3
|
+
} from "./chunk-QD544J2B.js";
|
|
4
|
+
|
|
5
|
+
// src/boot/simpleui-full-auto.ts
|
|
6
|
+
function isSimpleUiFullAuto(flags) {
|
|
7
|
+
return flags["simpleui"] === true && flags["full-auto"] === true;
|
|
8
|
+
}
|
|
9
|
+
function applySimpleUiFullAutoProfile(config, flags) {
|
|
10
|
+
if (!isSimpleUiFullAuto(flags)) return config;
|
|
11
|
+
flags["yolo"] = true;
|
|
12
|
+
flags["director"] = true;
|
|
13
|
+
flags["no-director"] = false;
|
|
14
|
+
flags["autonomy"] = "auto";
|
|
15
|
+
flags["no-autonomy"] = false;
|
|
16
|
+
return Object.freeze({
|
|
17
|
+
...config,
|
|
18
|
+
yolo: true,
|
|
19
|
+
tools: Object.freeze({
|
|
20
|
+
...config.tools,
|
|
21
|
+
disabledTools: []
|
|
22
|
+
})
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
function configureSimpleUiRuntimeContext(meta, flags) {
|
|
26
|
+
if (flags["simpleui"] !== true) return;
|
|
27
|
+
meta["source"] = "webui";
|
|
28
|
+
meta["surface"] = "simpleui";
|
|
29
|
+
meta["coordinationContextMode"] = "background";
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// src/permission-prompt.ts
|
|
33
|
+
import { color as color2, truncate, writeOut } from "@wrongstack/core/utils";
|
|
34
|
+
|
|
35
|
+
// src/diff-renderer.ts
|
|
36
|
+
import { color } from "@wrongstack/core/utils";
|
|
37
|
+
function renderDiff(diff) {
|
|
38
|
+
if (!diff) return "";
|
|
39
|
+
const lines = diff.split("\n");
|
|
40
|
+
return lines.map((line) => {
|
|
41
|
+
if (line.startsWith("+++") || line.startsWith("---")) return color.bold(line);
|
|
42
|
+
if (line.startsWith("@@")) return color.cyan(line);
|
|
43
|
+
if (line.startsWith("+")) return color.green(line);
|
|
44
|
+
if (line.startsWith("-")) return color.red(line);
|
|
45
|
+
return color.dim(line);
|
|
46
|
+
}).join("\n");
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// src/permission-prompt.ts
|
|
50
|
+
function makePromptDelegate(reader) {
|
|
51
|
+
return async (tool, input, suggestedPattern) => {
|
|
52
|
+
writeOut("\x07");
|
|
53
|
+
writeOut(
|
|
54
|
+
`
|
|
55
|
+
${theme.warn("\u26A0 APPROVAL REQUIRED")} ${theme.primary("\u2502")} ${theme.bold(tool.name)}
|
|
56
|
+
`
|
|
57
|
+
);
|
|
58
|
+
writeOut(`${color2.dim(stringifyInput(input))}
|
|
59
|
+
`);
|
|
60
|
+
if (tool.name === "edit" && hasDiff(input)) {
|
|
61
|
+
const inp = input;
|
|
62
|
+
const diff = typeof inp.diff === "string" ? inp.diff : "";
|
|
63
|
+
if (diff) writeOut(`${renderDiff(diff)}
|
|
64
|
+
`);
|
|
65
|
+
}
|
|
66
|
+
writeOut(color2.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n"));
|
|
67
|
+
const answer = await reader.readKey(
|
|
68
|
+
`${theme.bold("[y]")}es ${theme.bold("[n]")}o ${theme.bold("[a]")}lways allow (${suggestedPattern}) ${theme.bold("[d]")}eny: `,
|
|
69
|
+
[
|
|
70
|
+
{ key: "y", label: "yes", value: "yes" },
|
|
71
|
+
{ key: "n", label: "no", value: "no" },
|
|
72
|
+
{ key: "a", label: "always", value: "always" },
|
|
73
|
+
{ key: "d", label: "deny", value: "deny" }
|
|
74
|
+
]
|
|
75
|
+
);
|
|
76
|
+
return answer;
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
function makeConfirmAwaiter(reader) {
|
|
80
|
+
const delegate = makePromptDelegate(reader);
|
|
81
|
+
return async (tool, input, _toolUseId, suggestedPattern) => {
|
|
82
|
+
const result = await delegate(tool, input, suggestedPattern);
|
|
83
|
+
return result;
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
function stringifyInput(input) {
|
|
87
|
+
if (!input || typeof input !== "object") return "";
|
|
88
|
+
const obj = input;
|
|
89
|
+
return Object.entries(obj).filter(([k]) => k !== "content" && k !== "new_string").map(([k, v]) => `${k}: ${truncate(JSON.stringify(v), 80)}`).join(" ");
|
|
90
|
+
}
|
|
91
|
+
function hasDiff(input) {
|
|
92
|
+
return Boolean(
|
|
93
|
+
input && typeof input === "object" && "diff" in input
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// src/services/project-facts.ts
|
|
98
|
+
import * as fs from "node:fs/promises";
|
|
99
|
+
import * as path from "node:path";
|
|
100
|
+
import { DEFAULT_WALK_IGNORE_DIRS } from "@wrongstack/core/utils";
|
|
101
|
+
import {
|
|
102
|
+
detectLanguageWorkspaces,
|
|
103
|
+
languageProfileRegistry,
|
|
104
|
+
planLanguageOperation
|
|
105
|
+
} from "@wrongstack/tools/languages";
|
|
106
|
+
async function pathExists(file) {
|
|
107
|
+
try {
|
|
108
|
+
await fs.access(file);
|
|
109
|
+
return true;
|
|
110
|
+
} catch {
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
function parseCiRunCommands(yaml) {
|
|
115
|
+
const commands = [];
|
|
116
|
+
const lines = yaml.split(/\r?\n/);
|
|
117
|
+
for (let i = 0; i < lines.length; i++) {
|
|
118
|
+
const line = lines[i] ?? "";
|
|
119
|
+
const m = /^(\s*)(?:-\s+)?run:\s*(.*)$/.exec(line);
|
|
120
|
+
if (!m) continue;
|
|
121
|
+
const indent = (m[1] ?? "").length;
|
|
122
|
+
const inline = (m[2] ?? "").trim();
|
|
123
|
+
if (inline && inline !== "|" && inline !== ">" && !/^[|>][+-]?$/.test(inline)) {
|
|
124
|
+
commands.push(inline);
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
for (let j = i + 1; j < lines.length; j++) {
|
|
128
|
+
const body = lines[j] ?? "";
|
|
129
|
+
if (body.trim() === "") continue;
|
|
130
|
+
const bodyIndent = body.length - body.trimStart().length;
|
|
131
|
+
if (bodyIndent <= indent) break;
|
|
132
|
+
commands.push(body.trim());
|
|
133
|
+
i = j;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return commands.filter((c) => c !== "" && !/^(#|cd\s|echo\s|export\s|set\s|if\s)/.test(c));
|
|
137
|
+
}
|
|
138
|
+
function applyCiCommands(facts, commands) {
|
|
139
|
+
const find = (re) => commands.find((c) => re.test(c));
|
|
140
|
+
facts.test ??= find(/\b(test|pytest|vitest|jest|go test|cargo test|mix test|rspec)\b/i);
|
|
141
|
+
facts.lint ??= find(/\b(lint|eslint|biome|clippy|ruff|flake8|golangci-lint|fmt --check)\b/i);
|
|
142
|
+
facts.build ??= find(
|
|
143
|
+
/\b(build|compile|tsc|cargo build|go build|mvn .*package|gradle .*build)\b/i
|
|
144
|
+
);
|
|
145
|
+
}
|
|
146
|
+
async function detectPackageManager(root, declared) {
|
|
147
|
+
if (declared) {
|
|
148
|
+
const name = declared.split("@")[0];
|
|
149
|
+
if (name) return name;
|
|
150
|
+
}
|
|
151
|
+
if (await pathExists(path.join(root, "pnpm-lock.yaml"))) return "pnpm";
|
|
152
|
+
if (await pathExists(path.join(root, "bun.lockb"))) return "bun";
|
|
153
|
+
if (await pathExists(path.join(root, "bun.lock"))) return "bun";
|
|
154
|
+
if (await pathExists(path.join(root, "yarn.lock"))) return "yarn";
|
|
155
|
+
return "npm";
|
|
156
|
+
}
|
|
157
|
+
function hasUsableScript(scripts, name) {
|
|
158
|
+
const script = scripts[name];
|
|
159
|
+
if (typeof script !== "string" || script.trim() === "") return false;
|
|
160
|
+
if (name === "test" && /no test specified/i.test(script)) return false;
|
|
161
|
+
return true;
|
|
162
|
+
}
|
|
163
|
+
function parseMakeTargets(makefile) {
|
|
164
|
+
const targets = /* @__PURE__ */ new Set();
|
|
165
|
+
for (const line of makefile.split(/\r?\n/)) {
|
|
166
|
+
if (line.startsWith(" ") || line.trimStart().startsWith("#")) continue;
|
|
167
|
+
const match = /^([A-Za-z0-9_.-]+)\s*:(?![=])/.exec(line);
|
|
168
|
+
if (match?.[1]) targets.add(match[1]);
|
|
169
|
+
}
|
|
170
|
+
return targets;
|
|
171
|
+
}
|
|
172
|
+
var EXT_LANG = {
|
|
173
|
+
".ts": "TypeScript",
|
|
174
|
+
".tsx": "TypeScript",
|
|
175
|
+
".mts": "TypeScript",
|
|
176
|
+
".cts": "TypeScript",
|
|
177
|
+
".js": "JavaScript",
|
|
178
|
+
".jsx": "JavaScript",
|
|
179
|
+
".mjs": "JavaScript",
|
|
180
|
+
".cjs": "JavaScript",
|
|
181
|
+
".py": "Python",
|
|
182
|
+
".rb": "Ruby",
|
|
183
|
+
".go": "Go",
|
|
184
|
+
".rs": "Rust",
|
|
185
|
+
".java": "Java",
|
|
186
|
+
".kt": "Kotlin",
|
|
187
|
+
".kts": "Kotlin",
|
|
188
|
+
".c": "C",
|
|
189
|
+
".h": "C",
|
|
190
|
+
".cpp": "C++",
|
|
191
|
+
".cc": "C++",
|
|
192
|
+
".cxx": "C++",
|
|
193
|
+
".hpp": "C++",
|
|
194
|
+
".cs": "C#",
|
|
195
|
+
".php": "PHP",
|
|
196
|
+
".swift": "Swift",
|
|
197
|
+
".scala": "Scala",
|
|
198
|
+
".clj": "Clojure",
|
|
199
|
+
".ex": "Elixir",
|
|
200
|
+
".exs": "Elixir",
|
|
201
|
+
".erl": "Erlang",
|
|
202
|
+
".hs": "Haskell",
|
|
203
|
+
".ml": "OCaml",
|
|
204
|
+
".dart": "Dart",
|
|
205
|
+
".lua": "Lua",
|
|
206
|
+
".jl": "Julia",
|
|
207
|
+
".sh": "Shell",
|
|
208
|
+
".bash": "Shell",
|
|
209
|
+
".ps1": "PowerShell",
|
|
210
|
+
".pl": "Perl",
|
|
211
|
+
".zig": "Zig",
|
|
212
|
+
".nim": "Nim",
|
|
213
|
+
".sql": "SQL",
|
|
214
|
+
".vue": "Vue",
|
|
215
|
+
".svelte": "Svelte"
|
|
216
|
+
};
|
|
217
|
+
var SCAN_IGNORE_DIRS = /* @__PURE__ */ new Set([
|
|
218
|
+
...DEFAULT_WALK_IGNORE_DIRS,
|
|
219
|
+
"out",
|
|
220
|
+
"vendor",
|
|
221
|
+
"env",
|
|
222
|
+
".wrongstack",
|
|
223
|
+
".idea",
|
|
224
|
+
".vscode",
|
|
225
|
+
"obj",
|
|
226
|
+
".dart_tool",
|
|
227
|
+
"Pods"
|
|
228
|
+
]);
|
|
229
|
+
var ENTRY_BASENAMES = /* @__PURE__ */ new Set(["main", "index", "app", "cli", "server", "__main__"]);
|
|
230
|
+
async function scanSourceTree(root) {
|
|
231
|
+
const counts = /* @__PURE__ */ new Map();
|
|
232
|
+
const entryPoints = [];
|
|
233
|
+
const topDirs = [];
|
|
234
|
+
let fileCount = 0;
|
|
235
|
+
const MAX_FILES = 5e3;
|
|
236
|
+
const MAX_DEPTH = 6;
|
|
237
|
+
async function walk(dir, depth, rel) {
|
|
238
|
+
if (fileCount >= MAX_FILES || depth > MAX_DEPTH) return;
|
|
239
|
+
let entries;
|
|
240
|
+
try {
|
|
241
|
+
entries = await fs.readdir(dir, { withFileTypes: true });
|
|
242
|
+
} catch {
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
for (const e of entries) {
|
|
246
|
+
if (fileCount >= MAX_FILES) return;
|
|
247
|
+
const name = e.name;
|
|
248
|
+
if (e.isDirectory()) {
|
|
249
|
+
if (SCAN_IGNORE_DIRS.has(name) || name.startsWith(".")) continue;
|
|
250
|
+
if (depth === 0) topDirs.push(name);
|
|
251
|
+
await walk(path.join(dir, name), depth + 1, rel ? `${rel}/${name}` : name);
|
|
252
|
+
} else if (e.isFile()) {
|
|
253
|
+
fileCount++;
|
|
254
|
+
const ext = path.extname(name).toLowerCase();
|
|
255
|
+
const lang = EXT_LANG[ext];
|
|
256
|
+
if (!lang) continue;
|
|
257
|
+
counts.set(lang, (counts.get(lang) ?? 0) + 1);
|
|
258
|
+
const base = name.slice(0, name.length - ext.length).toLowerCase();
|
|
259
|
+
if (entryPoints.length < 10 && ENTRY_BASENAMES.has(base)) {
|
|
260
|
+
entryPoints.push(rel ? `${rel}/${name}` : name);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
await walk(root, 0, "");
|
|
266
|
+
if (counts.size === 0) return void 0;
|
|
267
|
+
const languages = [...counts.entries()].sort((a, b) => b[1] - a[1]).slice(0, 5).map(([lang, n]) => `${lang} (${n})`);
|
|
268
|
+
return { languages, entryPoints, topDirs: topDirs.sort() };
|
|
269
|
+
}
|
|
270
|
+
async function detectProjectFacts(root) {
|
|
271
|
+
const facts = { hints: [] };
|
|
272
|
+
try {
|
|
273
|
+
const pkg = JSON.parse(await fs.readFile(path.join(root, "package.json"), "utf8"));
|
|
274
|
+
const scripts = pkg.scripts ?? {};
|
|
275
|
+
const pm = await detectPackageManager(root, pkg.packageManager);
|
|
276
|
+
if (hasUsableScript(scripts, "build")) facts.build = `${pm} run build`;
|
|
277
|
+
if (hasUsableScript(scripts, "test")) facts.test = `${pm} test`;
|
|
278
|
+
if (hasUsableScript(scripts, "lint")) facts.lint = `${pm} run lint`;
|
|
279
|
+
const runScript = ["dev", "start", "serve", "preview"].find(
|
|
280
|
+
(name) => hasUsableScript(scripts, name)
|
|
281
|
+
);
|
|
282
|
+
if (runScript) facts.run = `${pm} run ${runScript}`;
|
|
283
|
+
facts.hints.push(Object.keys(scripts).length > 0 ? "package.json scripts" : "package.json");
|
|
284
|
+
} catch {
|
|
285
|
+
}
|
|
286
|
+
try {
|
|
287
|
+
const makefile = await fs.readFile(path.join(root, "Makefile"), "utf8");
|
|
288
|
+
const targets = parseMakeTargets(makefile);
|
|
289
|
+
facts.build ??= targets.has("build") ? "make build" : "make";
|
|
290
|
+
if (targets.has("test")) facts.test ??= "make test";
|
|
291
|
+
if (targets.has("lint")) facts.lint ??= "make lint";
|
|
292
|
+
const runTarget = ["run", "dev", "start", "serve"].find((name) => targets.has(name));
|
|
293
|
+
if (runTarget) facts.run ??= `make ${runTarget}`;
|
|
294
|
+
facts.hints.push("Makefile");
|
|
295
|
+
} catch {
|
|
296
|
+
}
|
|
297
|
+
const detection = await detectLanguageWorkspaces({ projectRoot: root });
|
|
298
|
+
for (const workspace of detection.workspaces) {
|
|
299
|
+
const profile = languageProfileRegistry.get(workspace.language);
|
|
300
|
+
if (!profile) continue;
|
|
301
|
+
const authoritative = workspace.evidence.some((e) => e.kind !== "source");
|
|
302
|
+
if (authoritative) {
|
|
303
|
+
for (const op of ["build", "test", "lint", "run"]) {
|
|
304
|
+
if (facts[op] !== void 0) continue;
|
|
305
|
+
const plan = await planLanguageOperation({
|
|
306
|
+
projectRoot: root,
|
|
307
|
+
operation: op,
|
|
308
|
+
language: workspace.language
|
|
309
|
+
});
|
|
310
|
+
if (plan.status === "planned") {
|
|
311
|
+
const cmd = [plan.plan.command, ...plan.plan.args].join(" ");
|
|
312
|
+
facts[op] = cmd;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
facts.hints.push(profile.id);
|
|
317
|
+
}
|
|
318
|
+
if (!facts.build || !facts.test || !facts.lint) {
|
|
319
|
+
try {
|
|
320
|
+
const wfDir = path.join(root, ".github", "workflows");
|
|
321
|
+
const wfNames = (await fs.readdir(wfDir)).filter((n) => /\.ya?ml$/i.test(n));
|
|
322
|
+
const commands = [];
|
|
323
|
+
for (const n of wfNames) {
|
|
324
|
+
commands.push(...parseCiRunCommands(await fs.readFile(path.join(wfDir, n), "utf8")));
|
|
325
|
+
}
|
|
326
|
+
if (commands.length > 0) {
|
|
327
|
+
const before = { build: facts.build, test: facts.test, lint: facts.lint };
|
|
328
|
+
applyCiCommands(facts, commands);
|
|
329
|
+
if (facts.build !== before.build || facts.test !== before.test || facts.lint !== before.lint) {
|
|
330
|
+
facts.hints.push(".github/workflows");
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
} catch {
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
if (!facts.build && !facts.test && !facts.run && !facts.lint) {
|
|
337
|
+
const scan = await scanSourceTree(root);
|
|
338
|
+
if (scan) {
|
|
339
|
+
facts.languages = scan.languages;
|
|
340
|
+
if (scan.entryPoints.length > 0) facts.entryPoints = scan.entryPoints;
|
|
341
|
+
if (scan.topDirs.length > 0) facts.topDirs = scan.topDirs;
|
|
342
|
+
facts.hints.push(`source scan: ${scan.languages.join(", ")}`);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
return facts;
|
|
346
|
+
}
|
|
347
|
+
function renderAgentsTemplate(f) {
|
|
348
|
+
const cmd = (s) => s ? `\`${s}\`` : "_TODO_";
|
|
349
|
+
const hints = f.hints.length > 0 ? `
|
|
350
|
+
|
|
351
|
+
> Auto-detected: ${f.hints.join(", ")}` : "";
|
|
352
|
+
const runtime = f.languages?.length ? `_CLI, server, browser, worker, library, package?_ \u2014 detected: ${f.languages.join(", ")}` : "_CLI, server, browser, worker, library, package?_";
|
|
353
|
+
const keyFileRows = [];
|
|
354
|
+
for (const ep of f.entryPoints ?? [])
|
|
355
|
+
keyFileRows.push(`| \`${ep}\` | _Likely entry point (detected)_ |`);
|
|
356
|
+
for (const dir of f.topDirs ?? [])
|
|
357
|
+
keyFileRows.push(`| \`${dir}/\` | _Top-level directory (detected)_ |`);
|
|
358
|
+
const keyFiles = keyFileRows.length > 0 ? keyFileRows.join("\n") : `| _src/_ | _Main source entry point(s)_ |
|
|
359
|
+
| _tests/_ | _Test root or convention_ |
|
|
360
|
+
| _docs/_ | _Architecture, runbooks, design notes_ |
|
|
361
|
+
| _scripts/_ | _Automation scripts (CI, release, install, etc.)_ |`;
|
|
362
|
+
return `# AGENTS.md
|
|
363
|
+
|
|
364
|
+
> **DO NOT DELETE THIS FILE.** It is loaded into WrongStack's system prompt as
|
|
365
|
+
> persistent project context. The \`/init\` command **regenerates** this file from
|
|
366
|
+
> detected project facts and backs up any previous version to \`AGENTS.md.bak\`.
|
|
367
|
+
> After \`/init\`, review the backup and merge any hand-written project context
|
|
368
|
+
> back into this file \u2014 then add your conventions, architecture notes, and
|
|
369
|
+
> domain knowledge below.
|
|
370
|
+
|
|
371
|
+
## Project brief
|
|
372
|
+
|
|
373
|
+
- **Purpose:** _What does this project do and why does it exist?_
|
|
374
|
+
- **Primary users:** _Who uses it: developers, operators, customers, internal systems?_
|
|
375
|
+
- **Runtime / deployment:** ${runtime}${hints}
|
|
376
|
+
|
|
377
|
+
## How to work safely
|
|
378
|
+
|
|
379
|
+
- _Project-specific rules the agent should always follow._
|
|
380
|
+
- _Files, generated artifacts, migrations, or config the agent should not edit without asking._
|
|
381
|
+
- _Preferred style or architecture choices not obvious from the code._
|
|
382
|
+
- _Known fragile areas or historical bugs that deserve extra caution._
|
|
383
|
+
|
|
384
|
+
## Commands
|
|
385
|
+
|
|
386
|
+
| Command | Script |
|
|
387
|
+
|---------|--------|
|
|
388
|
+
| Build | ${cmd(f.build)} |
|
|
389
|
+
| Test | ${cmd(f.test)} |
|
|
390
|
+
| Lint | ${cmd(f.lint)} |
|
|
391
|
+
| Run locally | ${cmd(f.run)} |
|
|
392
|
+
|
|
393
|
+
## Key files and entry points
|
|
394
|
+
|
|
395
|
+
| File / directory | Role |
|
|
396
|
+
|---|---|
|
|
397
|
+
${keyFiles}
|
|
398
|
+
|
|
399
|
+
## Architecture notes
|
|
400
|
+
|
|
401
|
+
_Summarize the important modules, data flow, boundaries, and ownership rules.
|
|
402
|
+
Mention anything a newcomer might misread or that looks unusual but is intentional._
|
|
403
|
+
|
|
404
|
+
### Dependency layers
|
|
405
|
+
|
|
406
|
+
_Describe the key dependency direction or layered structure, e.g.: "core has no
|
|
407
|
+
runtime deps; cli assembles everything above it."_
|
|
408
|
+
|
|
409
|
+
### Extension points
|
|
410
|
+
|
|
411
|
+
_Plugin, MCP, extension hooks, custom tools \u2014 what's wired up and how._
|
|
412
|
+
|
|
413
|
+
## Domain knowledge
|
|
414
|
+
|
|
415
|
+
_Business rules, acronyms, invariants, external services, and notes where the
|
|
416
|
+
code looks unusual but is intentional. E.g.: "IDs are ULIDs, not UUIDs", "the
|
|
417
|
+
\`draft\` flag means uncommitted billing metadata", "MCP servers are restarted
|
|
418
|
+
on disconnect with exponential backoff, up to 3 attempts"._
|
|
419
|
+
|
|
420
|
+
## Verification checklist
|
|
421
|
+
|
|
422
|
+
- _What should be run after code changes?_
|
|
423
|
+
- _What manual smoke test proves the common path still works?_
|
|
424
|
+
- _What failure modes deserve extra attention?_
|
|
425
|
+
- _Any known flaky tests or environment-dependent behavior?_
|
|
426
|
+
|
|
427
|
+
## Useful pointers
|
|
428
|
+
|
|
429
|
+
- _Docs, dashboards, runbooks, issue trackers, design notes, owner contacts._
|
|
430
|
+
- _Related projects or repositories._`;
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
export {
|
|
434
|
+
isSimpleUiFullAuto,
|
|
435
|
+
applySimpleUiFullAutoProfile,
|
|
436
|
+
configureSimpleUiRuntimeContext,
|
|
437
|
+
detectProjectFacts,
|
|
438
|
+
renderAgentsTemplate,
|
|
439
|
+
renderDiff,
|
|
440
|
+
makePromptDelegate,
|
|
441
|
+
makeConfirmAwaiter
|
|
442
|
+
};
|
|
443
|
+
//# sourceMappingURL=chunk-IHBYBYGA.js.map
|