@wrongstack/cli 0.296.4 → 0.297.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/dist/boot/dispatch-webui.d.ts +7 -0
  2. package/dist/boot/dispatch-webui.d.ts.map +1 -1
  3. package/dist/boot/launch-banner.d.ts +22 -0
  4. package/dist/boot/launch-banner.d.ts.map +1 -0
  5. package/dist/boot/launch-menu.d.ts.map +1 -1
  6. package/dist/boot/tui-settings-adapter.d.ts.map +1 -1
  7. package/dist/{chunk-OI7GWJDS.js → chunk-7JABKXET.js} +372 -10
  8. package/dist/chunk-7JABKXET.js.map +7 -0
  9. package/dist/{chunk-WY7KKOUK.js → chunk-JW75HY4F.js} +31 -10
  10. package/dist/chunk-JW75HY4F.js.map +7 -0
  11. package/dist/{chunk-Z7YGASQP.js → chunk-QZKWRNIP.js} +19 -18
  12. package/dist/chunk-QZKWRNIP.js.map +7 -0
  13. package/dist/{chunk-BQCAJ7FI.js → chunk-XTIXVJXP.js} +16 -3
  14. package/dist/chunk-XTIXVJXP.js.map +7 -0
  15. package/dist/{cli-main-TOAWVJDY.js → cli-main-GOY5YGVL.js} +25199 -25107
  16. package/dist/cli-main-GOY5YGVL.js.map +7 -0
  17. package/dist/cli-main.d.ts.map +1 -1
  18. package/dist/{execution-O7I5DYE6.js → execution-A4PGK4XV.js} +39 -9
  19. package/dist/execution-A4PGK4XV.js.map +7 -0
  20. package/dist/execution.d.ts.map +1 -1
  21. package/dist/fleet-statusline.d.ts.map +1 -1
  22. package/dist/goal-host.d.ts +1 -1
  23. package/dist/goal-host.d.ts.map +1 -1
  24. package/dist/{hq-JUYKUNJX.js → hq-GBPGXIR5.js} +2 -2
  25. package/dist/hq-publisher.d.ts +3 -2
  26. package/dist/hq-publisher.d.ts.map +1 -1
  27. package/dist/hq-server/types.d.ts +8 -0
  28. package/dist/hq-server/types.d.ts.map +1 -1
  29. package/dist/hq-server/ws.d.ts +61 -2
  30. package/dist/hq-server/ws.d.ts.map +1 -1
  31. package/dist/{hq-server-6AQ3BXZA.js → hq-server-YQUUMTPU.js} +2 -2
  32. package/dist/index.js +293 -26
  33. package/dist/index.js.map +4 -4
  34. package/dist/kanban-hq-sync.d.ts +13 -1
  35. package/dist/kanban-hq-sync.d.ts.map +1 -1
  36. package/dist/live-settings-input.d.ts +9 -0
  37. package/dist/live-settings-input.d.ts.map +1 -1
  38. package/dist/{mailbox-serve-2UWHEN3M.js → mailbox-serve-DBOOOOWZ.js} +50 -8
  39. package/dist/mailbox-serve-DBOOOOWZ.js.map +7 -0
  40. package/dist/{sdd-runtime-JG4EEKL6.js → sdd-runtime-AIJCJGWC.js} +2 -2
  41. package/dist/services/sdd/state.d.ts +3 -3
  42. package/dist/services/sdd/state.d.ts.map +1 -1
  43. package/dist/services/sdd/task-manager.d.ts.map +1 -1
  44. package/dist/session-stats.d.ts.map +1 -1
  45. package/dist/settings-menu.d.ts.map +1 -1
  46. package/dist/slash-commands/command-context.d.ts +2 -0
  47. package/dist/slash-commands/command-context.d.ts.map +1 -1
  48. package/dist/slash-commands/goal.d.ts +1 -1
  49. package/dist/slash-commands/goal.d.ts.map +1 -1
  50. package/dist/slash-commands/sdd.d.ts.map +1 -1
  51. package/dist/webui-server/kanban-host-adapter.d.ts +1 -1
  52. package/dist/webui-server/kanban-host-adapter.d.ts.map +1 -1
  53. package/dist/webui-server/session-start-payload.d.ts +4 -0
  54. package/dist/webui-server/session-start-payload.d.ts.map +1 -1
  55. package/dist/{webui-server-ZF5KVGC5.js → webui-server-XKFUOKMJ.js} +155 -132
  56. package/dist/webui-server-XKFUOKMJ.js.map +7 -0
  57. package/dist/webui-server-options.d.ts +7 -0
  58. package/dist/webui-server-options.d.ts.map +1 -1
  59. package/dist/webui-server.d.ts.map +1 -1
  60. package/dist/wiring/command-host-state.d.ts.map +1 -1
  61. package/dist/wiring/hq-telemetry.d.ts +4 -3
  62. package/dist/wiring/hq-telemetry.d.ts.map +1 -1
  63. package/dist/wiring/lifecycle-plugins.d.ts +5 -8
  64. package/dist/wiring/lifecycle-plugins.d.ts.map +1 -1
  65. package/dist/wiring/metrics.d.ts +1 -1
  66. package/dist/wiring/metrics.d.ts.map +1 -1
  67. package/dist/wiring/runtime-lifecycle-deps.d.ts.map +1 -1
  68. package/dist/wiring/sage.d.ts.map +1 -1
  69. package/dist/wiring/sdd-handlers.d.ts.map +1 -1
  70. package/package.json +22 -22
  71. package/dist/chunk-BQCAJ7FI.js.map +0 -7
  72. package/dist/chunk-OI7GWJDS.js.map +0 -7
  73. package/dist/chunk-WY7KKOUK.js.map +0 -7
  74. package/dist/chunk-Z7YGASQP.js.map +0 -7
  75. package/dist/cli-main-TOAWVJDY.js.map +0 -7
  76. package/dist/execution-O7I5DYE6.js.map +0 -7
  77. package/dist/mailbox-serve-2UWHEN3M.js.map +0 -7
  78. package/dist/webui-server-ZF5KVGC5.js.map +0 -7
  79. /package/dist/{hq-JUYKUNJX.js.map → hq-GBPGXIR5.js.map} +0 -0
  80. /package/dist/{hq-server-6AQ3BXZA.js.map → hq-server-YQUUMTPU.js.map} +0 -0
  81. /package/dist/{sdd-runtime-JG4EEKL6.js.map → sdd-runtime-AIJCJGWC.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"execution.d.ts","sourceRoot":"","sources":["../src/execution.ts"],"names":[],"mappings":"AA0DA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAMrD,YAAY,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAWlE,OAAO,EACL,+BAA+B,EAC/B,kCAAkC,EAClC,8BAA8B,EAC9B,8BAA8B,EAC9B,6BAA6B,GAC9B,MAAM,8BAA8B,CAAC;AAEtC,YAAY,EACV,SAAS,EACT,aAAa,EACb,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,GACf,MAAM,mBAAmB,CAAC;AAE3B,wBAAsB,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CA06BhE"}
1
+ {"version":3,"file":"execution.d.ts","sourceRoot":"","sources":["../src/execution.ts"],"names":[],"mappings":"AA0DA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAMrD,YAAY,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAWlE,OAAO,EACL,+BAA+B,EAC/B,kCAAkC,EAClC,8BAA8B,EAC9B,8BAA8B,EAC9B,6BAA6B,GAC9B,MAAM,8BAA8B,CAAC;AAEtC,YAAY,EACV,SAAS,EACT,aAAa,EACb,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,GACf,MAAM,mBAAmB,CAAC;AAE3B,wBAAsB,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CA26BhE"}
@@ -1 +1 @@
1
- {"version":3,"file":"fleet-statusline.d.ts","sourceRoot":"","sources":["../src/fleet-statusline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAIxD,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,QAAQ,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC,WAAW,GAAG,SAAS,CAAC;IACrC,gDAAgD;IAChD,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,gCAAgC;IAChC,GAAG,CAAC,EAAE,CAAC,MAAM,MAAM,CAAC,GAAG,SAAS,CAAC;IACjC,gFAAgF;IAChF,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B;AAYD;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,EACpC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,GAC3B,MAAM,CA+DR;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;IAClC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAqB;IACzC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsC;IAC7D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyB;IAChD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,YAAY,CAA8C;IAClE,OAAO,CAAC,SAAS,CAA+C;IAChE,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAMvB;IAEF,YAAY,IAAI,EAAE,sBAAsB,EAMvC;IAED,kFAAkF;IAClF,KAAK,IAAI,IAAI,CAqEZ;IAED,wDAAwD;IACxD,IAAI,IAAI,IAAI,CAGX;IAED,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,QAAQ;IAchB,OAAO,CAAC,UAAU;IAuBlB,OAAO,CAAC,aAAa;IAerB,OAAO,CAAC,KAAK;CAWd"}
1
+ {"version":3,"file":"fleet-statusline.d.ts","sourceRoot":"","sources":["../src/fleet-statusline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAIxD,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,QAAQ,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC,WAAW,GAAG,SAAS,CAAC;IACrC,gDAAgD;IAChD,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,gCAAgC;IAChC,GAAG,CAAC,EAAE,CAAC,MAAM,MAAM,CAAC,GAAG,SAAS,CAAC;IACjC,gFAAgF;IAChF,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B;AAYD;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,EACpC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,GAC3B,MAAM,CA+DR;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;IAClC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAqB;IACzC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsC;IAC7D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyB;IAChD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,YAAY,CAA8C;IAClE,OAAO,CAAC,SAAS,CAA+C;IAChE,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAMvB;IAEF,YAAY,IAAI,EAAE,sBAAsB,EAMvC;IAED,kFAAkF;IAClF,KAAK,IAAI,IAAI,CA4EZ;IAED,wDAAwD;IACxD,IAAI,IAAI,IAAI,CAGX;IAED,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,QAAQ;IAchB,OAAO,CAAC,UAAU;IAuBlB,OAAO,CAAC,aAAa;IAerB,OAAO,CAAC,KAAK;CAWd"}
@@ -41,7 +41,7 @@ export interface GoalHostDeps {
41
41
  events: EventBus;
42
42
  /** Current parent session id for worktree lifecycle events. */
43
43
  getSessionId?: (() => string | undefined) | undefined;
44
- /** Directory for per-project phase-graph JSON (wpaths.projectGoal). */
44
+ /** Directory for per-project phase-graph engine checkpoints. */
45
45
  storeDir: string;
46
46
  /** Project root — base for git-worktree isolation. */
47
47
  projectRoot: string;
@@ -1 +1 @@
1
- {"version":3,"file":"goal-host.d.ts","sourceRoot":"","sources":["../src/goal-host.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"goal-host.d.ts","sourceRoot":"","sources":["../src/goal-host.ts"],"names":[],"mappings":"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"}
@@ -36,7 +36,7 @@ var hqCmd = async (args, deps) => {
36
36
  return 1;
37
37
  };
38
38
  async function startServer(deps) {
39
- const { startHqServer } = await import("./hq-server-6AQ3BXZA.js");
39
+ const { startHqServer } = await import("./hq-server-YQUUMTPU.js");
40
40
  const dataDir = resolveDataDir(deps);
41
41
  const flags = deps.flags ?? {};
42
42
  const host = typeof flags["host"] === "string" ? flags["host"] : HQ_CLI_DEFAULT_HOST;
@@ -544,4 +544,4 @@ export {
544
544
  hqCmd,
545
545
  resolveAuditActor
546
546
  };
547
- //# sourceMappingURL=hq-JUYKUNJX.js.map
547
+ //# sourceMappingURL=hq-GBPGXIR5.js.map
@@ -1,10 +1,11 @@
1
- import type { CreateHqPublisherOptions } from '@wrongstack/core/hq';
2
- import type { HqPublisher } from '@wrongstack/core/hq';
1
+ import type { CreateHqPublisherOptions, HqPublisher } from '@wrongstack/core/hq';
2
+ import { type KanbanHqSyncStats } from './kanban-hq-sync.js';
3
3
  type CliHqPublisherOptions = Omit<CreateHqPublisherOptions, 'socketFactory'> & {
4
4
  socketFactory?: CreateHqPublisherOptions['socketFactory'];
5
5
  };
6
6
  export interface CliHqConnection {
7
7
  getPublisher(): HqPublisher | undefined;
8
+ getKanbanSyncStats(): KanbanHqSyncStats | undefined;
8
9
  stop(): void;
9
10
  }
10
11
  export interface CliHqConnectionOptions extends CliHqPublisherOptions {
@@ -1 +1 @@
1
- {"version":3,"file":"hq-publisher.d.ts","sourceRoot":"","sources":["../src/hq-publisher.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,KAAK,EAAE,WAAW,EAAgB,MAAM,qBAAqB,CAAC;AAIrE,KAAK,qBAAqB,GAAG,IAAI,CAAC,wBAAwB,EAAE,eAAe,CAAC,GAAG;IAC7E,aAAa,CAAC,EAAE,wBAAwB,CAAC,eAAe,CAAC,CAAC;CAC3D,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,YAAY,IAAI,WAAW,GAAG,SAAS,CAAC;IACxC,IAAI,IAAI,IAAI,CAAC;CACd;AAED,MAAM,WAAW,sBAAuB,SAAQ,qBAAqB;IACnE,SAAS,CAAC,EAAE,CAAC,CAAC,SAAS,EAAE,WAAW,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC3D,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACtC;AAMD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG,WAAW,GAAG,SAAS,CAK5F;AAmBD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,sBAAsB,GAAG,eAAe,CA+DrF"}
1
+ {"version":3,"file":"hq-publisher.d.ts","sourceRoot":"","sources":["../src/hq-publisher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,WAAW,EAAgB,MAAM,qBAAqB,CAAC;AAG/F,OAAO,EAAsB,KAAK,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAEjF,KAAK,qBAAqB,GAAG,IAAI,CAAC,wBAAwB,EAAE,eAAe,CAAC,GAAG;IAC7E,aAAa,CAAC,EAAE,wBAAwB,CAAC,eAAe,CAAC,CAAC;CAC3D,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,YAAY,IAAI,WAAW,GAAG,SAAS,CAAC;IACxC,kBAAkB,IAAI,iBAAiB,GAAG,SAAS,CAAC;IACpD,IAAI,IAAI,IAAI,CAAC;CACd;AAED,MAAM,WAAW,sBAAuB,SAAQ,qBAAqB;IACnE,SAAS,CAAC,EAAE,CAAC,CAAC,SAAS,EAAE,WAAW,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC3D,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACtC;AAMD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG,WAAW,GAAG,SAAS,CAK5F;AAmBD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,sBAAsB,GAAG,eAAe,CAgErF"}
@@ -50,6 +50,14 @@ export interface ConnectedClient {
50
50
  }>;
51
51
  /** Pending outbound commands (Phase 3 — control plane). */
52
52
  commandQueue: HqQueuedCommand[];
53
+ /**
54
+ * Whether this client is the project's leader (the client with
55
+ * `control.receive` capability that other clients coordinate with).
56
+ * Live tracking lives in `HqServer`; this field is the snapshot.
57
+ * Used by the leader-deposed detector in `peer.rehydrate` emission.
58
+ * Defaults to `false` for clients without `control.receive`.
59
+ */
60
+ isLeader: boolean;
53
61
  }
54
62
  export interface HqRouterMutableAuth {
55
63
  operatorPolicy: HqRedactionPolicy;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/hq-server/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/hq-server/types.ts"],"names":[],"mappings":"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"}
@@ -3,10 +3,69 @@
3
3
  *
4
4
  * @module hq-server/ws
5
5
  */
6
- import type { HqCommandAuditLog, HqEventEnvelope, HqPersistence, HqRedactionPolicy, HqToken, HqTranscriptEntry } from '@wrongstack/core/hq';
6
+ import type { HqClientResumeMessage, HqCommandAuditLog, HqEventEnvelope, HqPeerRehydrateReason, HqPersistence, HqRedactionPolicy, HqToken, HqTranscriptEntry } from '@wrongstack/core/hq';
7
7
  import { WebSocket } from 'ws';
8
8
  import type { ConnectedClient, HqSnapshotBroadcaster, TranscriptRing } from './types.js';
9
- export declare function handleBrowser(ws: WebSocket, snapshotBroadcaster: HqSnapshotBroadcaster, browsers: Set<WebSocket>): void;
9
+ /**
10
+ * Detect leader loss and emit the appropriate envelope. Currently wired
11
+ * on `client.closed` (graceful close) and the two heartbeat-timeout sites
12
+ * in `hq-server.ts`. An `auth-revoked` call site is a planned follow-up;
13
+ * the `reason` parameter already accepts it.
14
+ *
15
+ * Returns `true` when a leader-loss event was actually emitted. Note:
16
+ * the dedup gate (`PEER_DEDUP_WINDOW_MS`) suppresses re-emit for the same
17
+ * `(projectId, previousLeaderHandle)` and is intentionally NOT considered
18
+ * a "not the leader" outcome — the lost client is still the leader; the
19
+ * function returns `false` purely because there is nothing new to broadcast.
20
+ * Callers that need to log the loss should consult `lostClient.isLeader`
21
+ * separately.
22
+ *
23
+ * Dedup: a `peer.rehydrate` for the same `(projectId, previousLeaderHandle)`
24
+ * is suppressed if one was emitted within `PEER_DEDUP_WINDOW_MS` (1 h).
25
+ * `peer.lost` is not deduped — a project losing its last surviving client
26
+ * is significant enough to emit every time the topology changes.
27
+ */
28
+ export declare function detectLeaderLoss(lostClient: ConnectedClient, clients: Map<WebSocket, ConnectedClient>, browsers: Set<WebSocket>, reason: HqPeerRehydrateReason, eventSink?: {
29
+ eventLog: HqEventEnvelope[];
30
+ persistence?: HqPersistence | undefined;
31
+ }): boolean;
32
+ /**
33
+ * Server-side fanout of a `hq.kanban_snapshot` envelope after a merge.
34
+ *
35
+ * C2 — broadcasts the post-merge `delta` payload to:
36
+ * - every client whose `projectId` matches `projectId`, and
37
+ * - every browser in `browsers` (browsers are not project-scoped at the
38
+ * WS level; the browser-side projection filters by project when it
39
+ * applies the snapshot).
40
+ *
41
+ * The `delta` payload is the same touched-only payload the merge handler
42
+ * builds (full-set broadcasts drive V8 heap exhaustion on long-lived
43
+ * boards — see the merge handler's comment).
44
+ *
45
+ * Exported for direct unit testing in `tests/hq-kanban-fanout.test.ts`.
46
+ */
47
+ export declare function fanoutKanbanDelta(message: string, clients: Map<WebSocket, ConnectedClient>, browsers: Set<WebSocket>, projectId: string): {
48
+ clientsNotified: number;
49
+ browsersNotified: number;
50
+ };
51
+ /**
52
+ * Server-side handler for `client.resume` frames.
53
+ *
54
+ * Wired from `handleClient` (line 511) when the client frame type is
55
+ * `client.resume`. The handler:
56
+ * - Validates identity (clientId/projectId match against the WS).
57
+ * - Updates `client.lastSeenAt`.
58
+ * - Computes the cursor (what the client has received).
59
+ * - Filters `eventLog` for envelopes with `clientId === client.clientId && env.seq > cursor`.
60
+ * - Checks the log cannot serve the gap (log_unavailable).
61
+ * - Checks the gap is fresh (last_seen_too_old).
62
+ * - Checks the gap is not too large (gap_too_large).
63
+ * - Sends `hq.resume_gap` on success.
64
+ *
65
+ * Exported for direct unit testing in `tests/hq-resume-handler.test.ts`.
66
+ */
67
+ export declare function handleClientResume(ws: WebSocket, clients: Map<WebSocket, ConnectedClient>, eventLog: HqEventEnvelope[], frame: HqClientResumeMessage, snapshotBroadcaster?: HqSnapshotBroadcaster): void;
68
+ export declare function handleBrowser(ws: WebSocket, snapshotBroadcaster: HqSnapshotBroadcaster, browsers: Set<WebSocket>, eventLog: HqEventEnvelope[]): void;
10
69
  export declare function handleClient(ws: WebSocket, clients: Map<WebSocket, ConnectedClient>, browsers: Set<WebSocket>, eventLog: HqEventEnvelope[], auth: {
11
70
  token?: HqToken | undefined;
12
71
  getOperatorPolicy: () => Partial<HqRedactionPolicy> | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"ws.d.ts","sourceRoot":"","sources":["../../src/hq-server/ws.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EACV,iBAAiB,EACjB,eAAe,EAMf,aAAa,EAEb,iBAAiB,EAGjB,OAAO,EAEP,iBAAiB,EAElB,MAAM,qBAAqB,CAAC;AAW7B,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAE/B,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAkBzF,wBAAgB,aAAa,CAC3B,EAAE,EAAE,SAAS,EACb,mBAAmB,EAAE,qBAAqB,EAC1C,QAAQ,EAAE,GAAG,CAAC,SAAS,CAAC,GACvB,IAAI,CAsBN;AAID,wBAAgB,YAAY,CAC1B,EAAE,EAAE,SAAS,EACb,OAAO,EAAE,GAAG,CAAC,SAAS,EAAE,eAAe,CAAC,EACxC,QAAQ,EAAE,GAAG,CAAC,SAAS,CAAC,EACxB,QAAQ,EAAE,eAAe,EAAE,EAC3B,IAAI,EAAE;IACJ,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5B,iBAAiB,EAAE,MAAM,OAAO,CAAC,iBAAiB,CAAC,GAAG,SAAS,CAAC;CACjE,EACD,mBAAmB,EAAE,qBAAqB,EAC1C,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,EACxC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC,EAC/C,WAAW,CAAC,EAAE,aAAa,EAC3B,QAAQ,CAAC,EAAE,iBAAiB,GAC3B,IAAI,CA0dN"}
1
+ {"version":3,"file":"ws.d.ts","sourceRoot":"","sources":["../../src/hq-server/ws.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EACV,qBAAqB,EACrB,iBAAiB,EACjB,eAAe,EAQf,qBAAqB,EACrB,aAAa,EAEb,iBAAiB,EAGjB,OAAO,EAEP,iBAAiB,EAElB,MAAM,qBAAqB,CAAC;AAe7B,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAE/B,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAmEzF;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,eAAe,EAC3B,OAAO,EAAE,GAAG,CAAC,SAAS,EAAE,eAAe,CAAC,EACxC,QAAQ,EAAE,GAAG,CAAC,SAAS,CAAC,EACxB,MAAM,EAAE,qBAAqB,EAC7B,SAAS,CAAC,EAAE;IAAE,QAAQ,EAAE,eAAe,EAAE,CAAC;IAAC,WAAW,CAAC,EAAE,aAAa,GAAG,SAAS,CAAA;CAAE,GACnF,OAAO,CAsFT;AAiBD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,GAAG,CAAC,SAAS,EAAE,eAAe,CAAC,EACxC,QAAQ,EAAE,GAAG,CAAC,SAAS,CAAC,EACxB,SAAS,EAAE,MAAM,GAChB;IAAE,eAAe,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE,CAcvD;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kBAAkB,CAChC,EAAE,EAAE,SAAS,EACb,OAAO,EAAE,GAAG,CAAC,SAAS,EAAE,eAAe,CAAC,EACxC,QAAQ,EAAE,eAAe,EAAE,EAC3B,KAAK,EAAE,qBAAqB,EAC5B,mBAAmB,CAAC,EAAE,qBAAqB,GAC1C,IAAI,CAyIN;AA8ED,wBAAgB,aAAa,CAC3B,EAAE,EAAE,SAAS,EACb,mBAAmB,EAAE,qBAAqB,EAC1C,QAAQ,EAAE,GAAG,CAAC,SAAS,CAAC,EACxB,QAAQ,EAAE,eAAe,EAAE,GAC1B,IAAI,CA4DN;AAID,wBAAgB,YAAY,CAC1B,EAAE,EAAE,SAAS,EACb,OAAO,EAAE,GAAG,CAAC,SAAS,EAAE,eAAe,CAAC,EACxC,QAAQ,EAAE,GAAG,CAAC,SAAS,CAAC,EACxB,QAAQ,EAAE,eAAe,EAAE,EAC3B,IAAI,EAAE;IACJ,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5B,iBAAiB,EAAE,MAAM,OAAO,CAAC,iBAAiB,CAAC,GAAG,SAAS,CAAC;CACjE,EACD,mBAAmB,EAAE,qBAAqB,EAC1C,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,EACxC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC,EAC/C,WAAW,CAAC,EAAE,aAAa,EAC3B,QAAQ,CAAC,EAAE,iBAAiB,GAC3B,IAAI,CAogBN"}
@@ -15,7 +15,7 @@ import {
15
15
  readLocalSubagentTranscript,
16
16
  sanitizeApiError,
17
17
  startHqServer
18
- } from "./chunk-OI7GWJDS.js";
18
+ } from "./chunk-7JABKXET.js";
19
19
  import "./chunk-Q5GTM25S.js";
20
20
  import "./chunk-7OCVIDC7.js";
21
21
  export {
@@ -36,4 +36,4 @@ export {
36
36
  sanitizeApiError,
37
37
  startHqServer
38
38
  };
39
- //# sourceMappingURL=hq-server-6AQ3BXZA.js.map
39
+ //# sourceMappingURL=hq-server-YQUUMTPU.js.map
package/dist/index.js CHANGED
@@ -22,7 +22,7 @@ import {
22
22
  } from "./chunk-TGDHN4LM.js";
23
23
  import {
24
24
  DEFAULT_PORT
25
- } from "./chunk-OI7GWJDS.js";
25
+ } from "./chunk-7JABKXET.js";
26
26
  import "./chunk-Q5GTM25S.js";
27
27
  import {
28
28
  CLI_VERSION
@@ -1521,8 +1521,8 @@ var loaders = {
1521
1521
  quick: async () => (await import("./quick-VIO2BEHS.js")).quickCmd,
1522
1522
  bench: async () => (await import("./bench-7ZDWSNEF.js")).benchCmd,
1523
1523
  chronicle: async () => (await import("./chronicle-QQEQFSSE.js")).chronicleCmd,
1524
- hq: async () => (await import("./hq-JUYKUNJX.js")).hqCmd,
1525
- mailbox: async () => (await import("./mailbox-serve-2UWHEN3M.js")).mailboxServeCmd,
1524
+ hq: async () => (await import("./hq-GBPGXIR5.js")).hqCmd,
1525
+ mailbox: async () => (await import("./mailbox-serve-DBOOOOWZ.js")).mailboxServeCmd,
1526
1526
  permissions: async () => (await import("./permissions-FNYLZIL4.js")).permissionsCmd,
1527
1527
  project: async () => (await import("./project-BLQ3ALVL.js")).projectCmd
1528
1528
  };
@@ -2157,7 +2157,7 @@ async function isPortInUse(host, port) {
2157
2157
  }
2158
2158
  async function handleHqShortCircuit(flags) {
2159
2159
  if (flags["hq"] !== true) return null;
2160
- const { startHqServer } = await import("./hq-server-6AQ3BXZA.js");
2160
+ const { startHqServer } = await import("./hq-server-YQUUMTPU.js");
2161
2161
  const tunnelRequested = flags["tunnel"] === true;
2162
2162
  const host = typeof flags["host"] === "string" ? flags["host"] : tunnelRequested ? "127.0.0.1" : HQ_CLI_DEFAULT_HOST;
2163
2163
  if (tunnelRequested && !isLoopbackHost(host)) {
@@ -2316,9 +2316,122 @@ ${color8.green("Cloudflare Quick Tunnel ready:")} ${browserUrl}
2316
2316
  }
2317
2317
 
2318
2318
  // src/boot/launch-menu.ts
2319
- import { atomicWrite as atomicWrite3, color as color9, isStdinTTY as isStdinTTY2 } from "@wrongstack/core/utils";
2319
+ import { atomicWrite as atomicWrite3, color as color9, isStdinTTY as isStdinTTY2, setRawMode as setRawMode2 } from "@wrongstack/core/utils";
2320
2320
  import { HQ_CLI_DEFAULT_HOST as HQ_CLI_DEFAULT_HOST2 } from "@wrongstack/core/hq";
2321
2321
  import * as fs8 from "node:fs/promises";
2322
+
2323
+ // src/boot/launch-banner.ts
2324
+ var STACK_ORANGE = { r: 253, g: 159, b: 2 };
2325
+ var SIGNAL_PINK = { r: 254, g: 46, b: 95 };
2326
+ function mixRgb(a, b, t) {
2327
+ const clamped = Math.min(1, Math.max(0, t));
2328
+ return {
2329
+ r: Math.round(a.r + (b.r - a.r) * clamped),
2330
+ g: Math.round(a.g + (b.g - a.g) * clamped),
2331
+ b: Math.round(a.b + (b.b - a.b) * clamped)
2332
+ };
2333
+ }
2334
+ function fg(c) {
2335
+ return `\x1B[38;2;${c.r};${c.g};${c.b}m`;
2336
+ }
2337
+ function colorsEnabled() {
2338
+ const flag = (value) => value !== void 0 && value.trim() !== "" && !/^(0|false|no|off)$/i.test(value.trim());
2339
+ if (flag(process.env.NO_COLOR)) return false;
2340
+ if (flag(process.env.FORCE_COLOR)) return true;
2341
+ return process.stdout.isTTY === true;
2342
+ }
2343
+ var WORDMARK_GLYPH_BITS = Object.freeze({
2344
+ W: Object.freeze(["10001", "10001", "10001", "10101", "10101", "10101", "01010"]),
2345
+ R: Object.freeze(["11110", "10001", "10001", "11110", "10100", "10010", "10001"]),
2346
+ O: Object.freeze(["01110", "10001", "10001", "10001", "10001", "10001", "01110"]),
2347
+ N: Object.freeze(["10001", "11001", "11001", "10101", "10011", "10011", "10001"]),
2348
+ G: Object.freeze(["01110", "10001", "10000", "10111", "10001", "10001", "01110"]),
2349
+ S: Object.freeze(["01111", "10000", "10000", "01110", "00001", "00001", "11110"]),
2350
+ T: Object.freeze(["11111", "00100", "00100", "00100", "00100", "00100", "00100"]),
2351
+ A: Object.freeze(["01110", "10001", "10001", "11111", "10001", "10001", "10001"]),
2352
+ C: Object.freeze(["01111", "10000", "10000", "10000", "10000", "10000", "01111"]),
2353
+ K: Object.freeze(["10001", "10010", "10100", "11000", "10100", "10010", "10001"])
2354
+ });
2355
+ var WORDMARK = "WRONGSTACK";
2356
+ var WORDMARK_PIXEL_ROWS = 7;
2357
+ var WORDMARK_ROWS = Math.ceil(WORDMARK_PIXEL_ROWS / 2);
2358
+ var GLYPH_WIDTH = 5;
2359
+ var WORDMARK_WIDTH = WORDMARK.length * GLYPH_WIDTH + WORDMARK.length - 1;
2360
+ function packedCell(top, bottom) {
2361
+ if (top === "1" && bottom === "1") return "\u2588";
2362
+ if (top === "1") return "\u2580";
2363
+ if (bottom === "1") return "\u2584";
2364
+ return " ";
2365
+ }
2366
+ function packedGlyphRow(glyph, row) {
2367
+ const top = glyph[row * 2] ?? "";
2368
+ const bottom = glyph[row * 2 + 1] ?? "";
2369
+ return Array.from(
2370
+ { length: GLYPH_WIDTH },
2371
+ (_, column) => packedCell(top[column], bottom[column])
2372
+ ).join("");
2373
+ }
2374
+ var WORDMARK_LINES = Object.freeze(
2375
+ Array.from(
2376
+ { length: WORDMARK_ROWS },
2377
+ (_, row) => [...WORDMARK].map((letter) => {
2378
+ const glyph = WORDMARK_GLYPH_BITS[letter];
2379
+ return glyph ? packedGlyphRow(glyph, row) : " ".repeat(GLYPH_WIDTH);
2380
+ }).join(" ")
2381
+ )
2382
+ );
2383
+ function gradientLine(text, colorOn) {
2384
+ if (!colorOn) return text;
2385
+ const length = text.length;
2386
+ let out = "\x1B[1m";
2387
+ for (let i = 0; i < length; i++) {
2388
+ const ch = text[i];
2389
+ if (ch === " ") {
2390
+ out += ch;
2391
+ continue;
2392
+ }
2393
+ const t = length > 1 ? i / (length - 1) : 0.5;
2394
+ out += `${fg(mixRgb(STACK_ORANGE, SIGNAL_PINK, t))}${ch}`;
2395
+ }
2396
+ return `${out}\x1B[0m`;
2397
+ }
2398
+ function dimLine(text, colorOn) {
2399
+ return colorOn ? `\x1B[2m${text}\x1B[22m` : text;
2400
+ }
2401
+ var MARK_COLS = 5;
2402
+ var PINK_HOME = 1;
2403
+ var MARK_WIDTH = MARK_COLS * 2 + (MARK_COLS - 1);
2404
+ function buildMarkLines(colorOn) {
2405
+ const orange = colorOn ? fg(STACK_ORANGE) : "";
2406
+ const pink = colorOn ? fg(SIGNAL_PINK) : "";
2407
+ const reset = colorOn ? "\x1B[0m" : "";
2408
+ return Array.from({ length: 3 }, (_, row) => {
2409
+ const cells = Array.from({ length: MARK_COLS }, (_2, column) => {
2410
+ if (column === PINK_HOME && (row === 1 || row === 2)) return `${pink}\u2588\u2588${reset}`;
2411
+ if (row < 2 && column !== PINK_HOME) return `${orange}\u2588\u2588${reset}`;
2412
+ return " ";
2413
+ });
2414
+ return cells.join(" ").trimEnd();
2415
+ });
2416
+ }
2417
+ function launchBannerLines(columns, version) {
2418
+ const colorOn = colorsEnabled();
2419
+ const tagline = version ? `v${version} \xB7 the wrong stack for all the right reasons` : "the wrong stack for all the right reasons";
2420
+ if (columns < WORDMARK_WIDTH + 4) {
2421
+ const compact = "\u2590\u2588\u258C W R O N G S T A C K";
2422
+ return [gradientLine(compact, colorOn), dimLine(tagline, colorOn)];
2423
+ }
2424
+ const markPad = " ".repeat(Math.max(0, Math.floor((WORDMARK_WIDTH - MARK_WIDTH) / 2)));
2425
+ const tagPad = " ".repeat(Math.max(0, Math.floor((WORDMARK_WIDTH - tagline.length) / 2)));
2426
+ return [
2427
+ ...buildMarkLines(colorOn).map((line) => markPad + line),
2428
+ "",
2429
+ ...WORDMARK_LINES.map((line) => gradientLine(line, colorOn)),
2430
+ tagPad + dimLine(tagline, colorOn)
2431
+ ];
2432
+ }
2433
+
2434
+ // src/boot/launch-menu.ts
2322
2435
  var DEFAULT_PORTS = {
2323
2436
  webui: 3456,
2324
2437
  simpleui: 3466,
@@ -2389,6 +2502,7 @@ async function runLaunchMenu(deps) {
2389
2502
  }
2390
2503
  const { renderer, reader, lastChoice } = deps;
2391
2504
  const ports = { ...DEFAULT_PORTS, ...deps.defaultPorts ?? {} };
2505
+ writeBanner(renderer);
2392
2506
  if (lastChoice) {
2393
2507
  const accept = await promptSummaryGate(deps);
2394
2508
  if (accept === "use-last") {
@@ -2399,32 +2513,37 @@ async function runLaunchMenu(deps) {
2399
2513
  }
2400
2514
  }
2401
2515
  renderer.write(`
2402
- ${color9.bold("\u2731 WrongStack launch mode")} ${color9.dim(`v${CLI_VERSION}`)}
2403
- `);
2404
- renderer.write(` ${color9.dim("\u2500".repeat(48))}
2405
- `);
2406
- renderer.write(` ${color9.amber("?")} Choose how to run WrongStack:
2516
+ ${color9.amber("?")} Choose how to run WrongStack:
2407
2517
 
2408
2518
  `);
2409
- for (const opt of MODE_OPTIONS) {
2410
- renderer.write(
2411
- ` ${color9.bold(String(opt.key))}) ${opt.icon} ${color9.bold(opt.label)} ${color9.dim(opt.hint)}
2519
+ const arrowPick = await promptModeArrow(deps);
2520
+ let choice;
2521
+ if (arrowPick) {
2522
+ if (arrowPick.cancelled) {
2523
+ return { mode: "tui-repl", cancelled: true };
2524
+ }
2525
+ choice = { mode: arrowPick.mode };
2526
+ } else {
2527
+ for (const opt of MODE_OPTIONS) {
2528
+ renderer.write(
2529
+ ` ${color9.bold(String(opt.key))}) ${opt.icon} ${color9.bold(opt.label)} ${color9.dim(opt.hint)}
2412
2530
  `
2413
- );
2414
- }
2415
- renderer.write(`
2531
+ );
2532
+ }
2533
+ renderer.write(`
2416
2534
  ${color9.dim("\u2500".repeat(48))}
2417
2535
  `);
2418
- const answer = (await reader.readLine(
2419
- ` ${color9.amber("?")} Mode ${color9.dim("[1-4, q to quit]")} ${color9.dim(`(auto 1 in ${MENU_TIMEOUT_MS / 1e3}s)`)} `,
2420
- { timeoutMs: MENU_TIMEOUT_MS, defaultAnswer: "1" }
2421
- )).trim().toLowerCase();
2422
- if (answer === "q" || answer === "quit") {
2423
- renderer.write(color9.dim(" Goodbye!\n"));
2424
- return { mode: "tui-repl", cancelled: true };
2536
+ const answer = (await reader.readLine(
2537
+ ` ${color9.amber("?")} Mode ${color9.dim("[1-4, q to quit]")} ${color9.dim(`(auto 1 in ${MENU_TIMEOUT_MS / 1e3}s)`)} `,
2538
+ { timeoutMs: MENU_TIMEOUT_MS, defaultAnswer: "1" }
2539
+ )).trim().toLowerCase();
2540
+ if (answer === "q" || answer === "quit") {
2541
+ renderer.write(color9.dim(" Goodbye!\n"));
2542
+ return { mode: "tui-repl", cancelled: true };
2543
+ }
2544
+ const picked = MODE_OPTIONS.find((o) => String(o.key) === answer || o.mode === answer);
2545
+ choice = picked ? { mode: picked.mode } : { mode: "tui-repl" };
2425
2546
  }
2426
- const picked = MODE_OPTIONS.find((o) => String(o.key) === answer || o.mode === answer);
2427
- const choice = picked ? { mode: picked.mode } : { mode: "tui-repl" };
2428
2547
  if (choice.mode !== "tui-repl") {
2429
2548
  const port = await promptPort(deps, ports[choice.mode]);
2430
2549
  choice.port = port;
@@ -2434,6 +2553,154 @@ async function runLaunchMenu(deps) {
2434
2553
  }
2435
2554
  return finalize(choice, ports);
2436
2555
  }
2556
+ function writeBanner(renderer) {
2557
+ const columns = process.stdout.columns ?? 80;
2558
+ renderer.write("\n");
2559
+ for (const line of launchBannerLines(columns, CLI_VERSION)) {
2560
+ renderer.write(` ${line}
2561
+ `);
2562
+ }
2563
+ }
2564
+ function canUseArrowMenu() {
2565
+ if (process.env.VITEST || process.env.NODE_ENV === "test") return false;
2566
+ const stdin = process.stdin;
2567
+ return isStdinTTY2() && process.stdout.isTTY === true && typeof stdin.setRawMode === "function";
2568
+ }
2569
+ async function promptModeArrow(deps) {
2570
+ if (!canUseArrowMenu()) return null;
2571
+ const { renderer } = deps;
2572
+ const stdin = process.stdin;
2573
+ const out = (s) => renderer.write(s);
2574
+ return await new Promise((resolve2) => {
2575
+ let index = 0;
2576
+ let drawn = 0;
2577
+ let remaining = Math.round(MENU_TIMEOUT_MS / 1e3);
2578
+ let countdown = true;
2579
+ let settled = false;
2580
+ let interval;
2581
+ const wasRaw = stdin.isRaw === true;
2582
+ const wasPaused = stdin.isPaused();
2583
+ const rows = () => {
2584
+ const lines = [];
2585
+ for (let i = 0; i < MODE_OPTIONS.length; i++) {
2586
+ const opt = MODE_OPTIONS[i];
2587
+ const selected = i === index;
2588
+ const pointer = selected ? color9.pink("\u276F") : " ";
2589
+ const label = selected ? color9.amber(color9.bold(opt.label)) : color9.bold(opt.label);
2590
+ lines.push(
2591
+ ` ${pointer} ${color9.dim(String(opt.key))} ${opt.icon} ${label} ${color9.dim(opt.hint)}`
2592
+ );
2593
+ }
2594
+ lines.push("");
2595
+ const auto = countdown ? color9.dim(` \xB7 auto-launches ${MODE_OPTIONS[index].label} in ${remaining}s`) : "";
2596
+ lines.push(` ${color9.dim("\u2191\u2193 move \xB7 Enter launch \xB7 1-4 jump \xB7 q quit")}${auto}`);
2597
+ return lines;
2598
+ };
2599
+ const paint = () => {
2600
+ const lines = rows();
2601
+ let frame = drawn > 0 ? `\x1B[${drawn}A` : "";
2602
+ frame += `${lines.map((line) => `\x1B[2K${line}`).join("\n")}
2603
+ `;
2604
+ out(frame);
2605
+ drawn = lines.length;
2606
+ };
2607
+ const stopInput = () => {
2608
+ if (interval) {
2609
+ clearInterval(interval);
2610
+ interval = void 0;
2611
+ }
2612
+ stdin.off("data", onData);
2613
+ stdin.off("close", onClose);
2614
+ try {
2615
+ setRawMode2(stdin, wasRaw);
2616
+ } catch {
2617
+ }
2618
+ if (wasPaused) stdin.pause();
2619
+ };
2620
+ const settle = (result, finalLine) => {
2621
+ if (settled) return;
2622
+ settled = true;
2623
+ stopInput();
2624
+ if (drawn > 0) out(`\x1B[${drawn}A`);
2625
+ out("\x1B[0J");
2626
+ out(finalLine);
2627
+ out("\x1B[?25h");
2628
+ resolve2(result);
2629
+ };
2630
+ const pick = () => {
2631
+ const opt = MODE_OPTIONS[index];
2632
+ settle(
2633
+ { cancelled: false, mode: opt.mode },
2634
+ ` ${color9.green("\u2714")} ${opt.icon} ${color9.bold(opt.label)} ${color9.dim(opt.hint)}
2635
+ `
2636
+ );
2637
+ };
2638
+ const cancel = () => {
2639
+ settle({ cancelled: true, mode: "tui-repl" }, color9.dim(" Goodbye!\n"));
2640
+ };
2641
+ const stopCountdown = () => {
2642
+ if (!countdown) return;
2643
+ countdown = false;
2644
+ if (interval) {
2645
+ clearInterval(interval);
2646
+ interval = void 0;
2647
+ }
2648
+ };
2649
+ const onData = (buf) => {
2650
+ const key = buf.toString("utf8");
2651
+ stopCountdown();
2652
+ if (key === "" || key === "q" || key === "Q" || key === "\x1B") {
2653
+ cancel();
2654
+ return;
2655
+ }
2656
+ if (key === "\r" || key === "\n") {
2657
+ pick();
2658
+ return;
2659
+ }
2660
+ if (key === "\x1B[A" || key === "\x1BOA" || key === "k") {
2661
+ index = (index + MODE_OPTIONS.length - 1) % MODE_OPTIONS.length;
2662
+ paint();
2663
+ return;
2664
+ }
2665
+ if (key === "\x1B[B" || key === "\x1BOB" || key === "j") {
2666
+ index = (index + 1) % MODE_OPTIONS.length;
2667
+ paint();
2668
+ return;
2669
+ }
2670
+ if (/^[0-9]$/.test(key)) {
2671
+ const digit = Number.parseInt(key, 10);
2672
+ if (digit >= 1 && digit <= MODE_OPTIONS.length) {
2673
+ index = digit - 1;
2674
+ pick();
2675
+ return;
2676
+ }
2677
+ }
2678
+ paint();
2679
+ };
2680
+ const onClose = () => {
2681
+ settle({ cancelled: true, mode: "tui-repl" }, "");
2682
+ };
2683
+ try {
2684
+ setRawMode2(stdin, true);
2685
+ stdin.resume();
2686
+ } catch {
2687
+ resolve2(null);
2688
+ return;
2689
+ }
2690
+ out("\x1B[?25l");
2691
+ paint();
2692
+ stdin.on("data", onData);
2693
+ stdin.once("close", onClose);
2694
+ interval = setInterval(() => {
2695
+ remaining -= 1;
2696
+ if (remaining <= 0) {
2697
+ pick();
2698
+ return;
2699
+ }
2700
+ paint();
2701
+ }, 1e3);
2702
+ });
2703
+ }
2437
2704
  async function promptSummaryGate(deps) {
2438
2705
  const { renderer, reader, lastChoice } = deps;
2439
2706
  if (!lastChoice) return "re-prompt";
@@ -2854,7 +3121,7 @@ async function initializeCli(argv) {
2854
3121
  async function main(argv) {
2855
3122
  const cliCtx = await initializeCli(argv);
2856
3123
  if (typeof cliCtx === "number") return cliCtx;
2857
- const { runInteractive } = await import("./cli-main-TOAWVJDY.js");
3124
+ const { runInteractive } = await import("./cli-main-GOY5YGVL.js");
2858
3125
  return runInteractive(cliCtx);
2859
3126
  }
2860
3127