@visorcraft/idlehands 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (197) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +30 -0
  3. package/dist/agent.js +2604 -0
  4. package/dist/agent.js.map +1 -0
  5. package/dist/anton/controller.js +341 -0
  6. package/dist/anton/controller.js.map +1 -0
  7. package/dist/anton/lock.js +110 -0
  8. package/dist/anton/lock.js.map +1 -0
  9. package/dist/anton/parser.js +303 -0
  10. package/dist/anton/parser.js.map +1 -0
  11. package/dist/anton/prompt.js +203 -0
  12. package/dist/anton/prompt.js.map +1 -0
  13. package/dist/anton/reporter.js +119 -0
  14. package/dist/anton/reporter.js.map +1 -0
  15. package/dist/anton/session.js +51 -0
  16. package/dist/anton/session.js.map +1 -0
  17. package/dist/anton/types.js +7 -0
  18. package/dist/anton/types.js.map +1 -0
  19. package/dist/anton/verifier.js +263 -0
  20. package/dist/anton/verifier.js.map +1 -0
  21. package/dist/bench/compare.js +239 -0
  22. package/dist/bench/compare.js.map +1 -0
  23. package/dist/bench/debug_hooks.js +17 -0
  24. package/dist/bench/debug_hooks.js.map +1 -0
  25. package/dist/bench/json_extract.js +22 -0
  26. package/dist/bench/json_extract.js.map +1 -0
  27. package/dist/bench/openclaw.js +86 -0
  28. package/dist/bench/openclaw.js.map +1 -0
  29. package/dist/bench/report.js +116 -0
  30. package/dist/bench/report.js.map +1 -0
  31. package/dist/bench/runner.js +312 -0
  32. package/dist/bench/runner.js.map +1 -0
  33. package/dist/bench/types.js +2 -0
  34. package/dist/bench/types.js.map +1 -0
  35. package/dist/bot/commands.js +444 -0
  36. package/dist/bot/commands.js.map +1 -0
  37. package/dist/bot/confirm-discord.js +133 -0
  38. package/dist/bot/confirm-discord.js.map +1 -0
  39. package/dist/bot/confirm-telegram.js +290 -0
  40. package/dist/bot/confirm-telegram.js.map +1 -0
  41. package/dist/bot/discord.js +826 -0
  42. package/dist/bot/discord.js.map +1 -0
  43. package/dist/bot/format.js +210 -0
  44. package/dist/bot/format.js.map +1 -0
  45. package/dist/bot/session-manager.js +270 -0
  46. package/dist/bot/session-manager.js.map +1 -0
  47. package/dist/bot/telegram.js +678 -0
  48. package/dist/bot/telegram.js.map +1 -0
  49. package/dist/cli/agent-turn.js +45 -0
  50. package/dist/cli/agent-turn.js.map +1 -0
  51. package/dist/cli/args.js +236 -0
  52. package/dist/cli/args.js.map +1 -0
  53. package/dist/cli/bot.js +252 -0
  54. package/dist/cli/bot.js.map +1 -0
  55. package/dist/cli/build-repl-context.js +365 -0
  56. package/dist/cli/build-repl-context.js.map +1 -0
  57. package/dist/cli/command-registry.js +20 -0
  58. package/dist/cli/command-registry.js.map +1 -0
  59. package/dist/cli/commands/anton.js +271 -0
  60. package/dist/cli/commands/anton.js.map +1 -0
  61. package/dist/cli/commands/editing.js +328 -0
  62. package/dist/cli/commands/editing.js.map +1 -0
  63. package/dist/cli/commands/model.js +274 -0
  64. package/dist/cli/commands/model.js.map +1 -0
  65. package/dist/cli/commands/project.js +255 -0
  66. package/dist/cli/commands/project.js.map +1 -0
  67. package/dist/cli/commands/runtime.js +63 -0
  68. package/dist/cli/commands/runtime.js.map +1 -0
  69. package/dist/cli/commands/session.js +281 -0
  70. package/dist/cli/commands/session.js.map +1 -0
  71. package/dist/cli/commands/tools.js +126 -0
  72. package/dist/cli/commands/tools.js.map +1 -0
  73. package/dist/cli/commands/trifecta.js +221 -0
  74. package/dist/cli/commands/trifecta.js.map +1 -0
  75. package/dist/cli/commands/tui.js +17 -0
  76. package/dist/cli/commands/tui.js.map +1 -0
  77. package/dist/cli/init.js +222 -0
  78. package/dist/cli/init.js.map +1 -0
  79. package/dist/cli/input.js +360 -0
  80. package/dist/cli/input.js.map +1 -0
  81. package/dist/cli/oneshot.js +254 -0
  82. package/dist/cli/oneshot.js.map +1 -0
  83. package/dist/cli/repl-context.js +2 -0
  84. package/dist/cli/repl-context.js.map +1 -0
  85. package/dist/cli/runtime-cmds.js +811 -0
  86. package/dist/cli/runtime-cmds.js.map +1 -0
  87. package/dist/cli/service.js +145 -0
  88. package/dist/cli/service.js.map +1 -0
  89. package/dist/cli/session-state.js +130 -0
  90. package/dist/cli/session-state.js.map +1 -0
  91. package/dist/cli/setup.js +815 -0
  92. package/dist/cli/setup.js.map +1 -0
  93. package/dist/cli/shell.js +79 -0
  94. package/dist/cli/shell.js.map +1 -0
  95. package/dist/cli/status.js +392 -0
  96. package/dist/cli/status.js.map +1 -0
  97. package/dist/cli/watch.js +33 -0
  98. package/dist/cli/watch.js.map +1 -0
  99. package/dist/client.js +676 -0
  100. package/dist/client.js.map +1 -0
  101. package/dist/commands.js +194 -0
  102. package/dist/commands.js.map +1 -0
  103. package/dist/config.js +507 -0
  104. package/dist/config.js.map +1 -0
  105. package/dist/confirm/auto.js +13 -0
  106. package/dist/confirm/auto.js.map +1 -0
  107. package/dist/confirm/headless.js +41 -0
  108. package/dist/confirm/headless.js.map +1 -0
  109. package/dist/confirm/terminal.js +90 -0
  110. package/dist/confirm/terminal.js.map +1 -0
  111. package/dist/context.js +49 -0
  112. package/dist/context.js.map +1 -0
  113. package/dist/git.js +136 -0
  114. package/dist/git.js.map +1 -0
  115. package/dist/harnesses.js +171 -0
  116. package/dist/harnesses.js.map +1 -0
  117. package/dist/history.js +139 -0
  118. package/dist/history.js.map +1 -0
  119. package/dist/index.js +700 -0
  120. package/dist/index.js.map +1 -0
  121. package/dist/indexer.js +374 -0
  122. package/dist/indexer.js.map +1 -0
  123. package/dist/jsonrpc.js +76 -0
  124. package/dist/jsonrpc.js.map +1 -0
  125. package/dist/lens.js +525 -0
  126. package/dist/lens.js.map +1 -0
  127. package/dist/lsp.js +605 -0
  128. package/dist/lsp.js.map +1 -0
  129. package/dist/markdown.js +275 -0
  130. package/dist/markdown.js.map +1 -0
  131. package/dist/mcp.js +554 -0
  132. package/dist/mcp.js.map +1 -0
  133. package/dist/recovery.js +178 -0
  134. package/dist/recovery.js.map +1 -0
  135. package/dist/replay.js +132 -0
  136. package/dist/replay.js.map +1 -0
  137. package/dist/replay_cli.js +24 -0
  138. package/dist/replay_cli.js.map +1 -0
  139. package/dist/runtime/executor.js +418 -0
  140. package/dist/runtime/executor.js.map +1 -0
  141. package/dist/runtime/planner.js +197 -0
  142. package/dist/runtime/planner.js.map +1 -0
  143. package/dist/runtime/store.js +289 -0
  144. package/dist/runtime/store.js.map +1 -0
  145. package/dist/runtime/types.js +2 -0
  146. package/dist/runtime/types.js.map +1 -0
  147. package/dist/safety.js +446 -0
  148. package/dist/safety.js.map +1 -0
  149. package/dist/spinner.js +224 -0
  150. package/dist/spinner.js.map +1 -0
  151. package/dist/sys/context.js +124 -0
  152. package/dist/sys/context.js.map +1 -0
  153. package/dist/sys/snapshot.sh +97 -0
  154. package/dist/term.js +61 -0
  155. package/dist/term.js.map +1 -0
  156. package/dist/themes.js +135 -0
  157. package/dist/themes.js.map +1 -0
  158. package/dist/tools.js +1114 -0
  159. package/dist/tools.js.map +1 -0
  160. package/dist/tui/branch-picker.js +65 -0
  161. package/dist/tui/branch-picker.js.map +1 -0
  162. package/dist/tui/command-handler.js +108 -0
  163. package/dist/tui/command-handler.js.map +1 -0
  164. package/dist/tui/confirm.js +90 -0
  165. package/dist/tui/confirm.js.map +1 -0
  166. package/dist/tui/controller.js +463 -0
  167. package/dist/tui/controller.js.map +1 -0
  168. package/dist/tui/event-bridge.js +44 -0
  169. package/dist/tui/event-bridge.js.map +1 -0
  170. package/dist/tui/events.js +2 -0
  171. package/dist/tui/events.js.map +1 -0
  172. package/dist/tui/keymap.js +144 -0
  173. package/dist/tui/keymap.js.map +1 -0
  174. package/dist/tui/layout.js +11 -0
  175. package/dist/tui/layout.js.map +1 -0
  176. package/dist/tui/render.js +186 -0
  177. package/dist/tui/render.js.map +1 -0
  178. package/dist/tui/screen.js +48 -0
  179. package/dist/tui/screen.js.map +1 -0
  180. package/dist/tui/state.js +167 -0
  181. package/dist/tui/state.js.map +1 -0
  182. package/dist/tui/theme.js +70 -0
  183. package/dist/tui/theme.js.map +1 -0
  184. package/dist/tui/types.js +2 -0
  185. package/dist/tui/types.js.map +1 -0
  186. package/dist/types.js +2 -0
  187. package/dist/types.js.map +1 -0
  188. package/dist/upgrade.js +412 -0
  189. package/dist/upgrade.js.map +1 -0
  190. package/dist/utils.js +87 -0
  191. package/dist/utils.js.map +1 -0
  192. package/dist/vault.js +520 -0
  193. package/dist/vault.js.map +1 -0
  194. package/dist/vim.js +160 -0
  195. package/dist/vim.js.map +1 -0
  196. package/package.json +67 -0
  197. package/src/sys/snapshot.sh +97 -0
@@ -0,0 +1,144 @@
1
+ export function resolveAction(key) {
2
+ switch (key) {
3
+ case "C-c": return "cancel";
4
+ case "C-d": return "quit";
5
+ case "C-r": return "history_search";
6
+ case "tab": return "tab_complete";
7
+ case "S-tab": return "focus_prev";
8
+ case "pageup": return "scroll_up";
9
+ case "pagedown": return "scroll_down";
10
+ case "up": return "history_prev";
11
+ case "down": return "history_next";
12
+ case "left": return "cursor_left";
13
+ case "right": return "cursor_right";
14
+ case "enter": return "send";
15
+ case "C-j": return "insert_newline";
16
+ case "M-enter": return "insert_newline";
17
+ case "backspace": return "backspace";
18
+ case "delete": return "delete_forward";
19
+ case "home": return "cursor_home";
20
+ case "end": return "cursor_end";
21
+ default: return null;
22
+ }
23
+ }
24
+ export function decodeRawInput(chunk) {
25
+ const keys = [];
26
+ for (let i = 0; i < chunk.length; i++) {
27
+ const ch = chunk[i];
28
+ if (ch === "\u001b") {
29
+ const c1 = chunk[i + 1];
30
+ const c2 = chunk[i + 2];
31
+ if (c1 === "[" && c2 === "A") {
32
+ keys.push("up");
33
+ i += 2;
34
+ continue;
35
+ }
36
+ if (c1 === "[" && c2 === "B") {
37
+ keys.push("down");
38
+ i += 2;
39
+ continue;
40
+ }
41
+ if (c1 === "[" && c2 === "C") {
42
+ keys.push("right");
43
+ i += 2;
44
+ continue;
45
+ }
46
+ if (c1 === "[" && c2 === "D") {
47
+ keys.push("left");
48
+ i += 2;
49
+ continue;
50
+ }
51
+ if (c1 === "O" && c2 === "A") {
52
+ keys.push("up");
53
+ i += 2;
54
+ continue;
55
+ }
56
+ if (c1 === "O" && c2 === "B") {
57
+ keys.push("down");
58
+ i += 2;
59
+ continue;
60
+ }
61
+ if (c1 === "O" && c2 === "C") {
62
+ keys.push("right");
63
+ i += 2;
64
+ continue;
65
+ }
66
+ if (c1 === "O" && c2 === "D") {
67
+ keys.push("left");
68
+ i += 2;
69
+ continue;
70
+ }
71
+ // CSI sequences with ~ terminator: \x1b[N~ (PageUp=5~, PageDown=6~, Home=1~, End=4~, Delete=3~)
72
+ if (c1 === "[" && c2 !== undefined) {
73
+ const c3 = chunk[i + 3];
74
+ if (c3 === "~") {
75
+ if (c2 === "5") {
76
+ keys.push("pageup");
77
+ i += 3;
78
+ continue;
79
+ }
80
+ if (c2 === "6") {
81
+ keys.push("pagedown");
82
+ i += 3;
83
+ continue;
84
+ }
85
+ if (c2 === "1") {
86
+ keys.push("home");
87
+ i += 3;
88
+ continue;
89
+ }
90
+ if (c2 === "4") {
91
+ keys.push("end");
92
+ i += 3;
93
+ continue;
94
+ }
95
+ if (c2 === "3") {
96
+ keys.push("delete");
97
+ i += 3;
98
+ continue;
99
+ }
100
+ // Unknown CSI ~-terminated sequence — skip
101
+ i += 3;
102
+ continue;
103
+ }
104
+ }
105
+ if (c1 === "\r") {
106
+ keys.push("M-enter");
107
+ i += 1;
108
+ continue;
109
+ }
110
+ continue;
111
+ }
112
+ if (ch === "\u0003") {
113
+ keys.push("C-c");
114
+ continue;
115
+ }
116
+ if (ch === "\u0004") {
117
+ keys.push("C-d");
118
+ continue;
119
+ }
120
+ if (ch === "\u0012") {
121
+ keys.push("C-r");
122
+ continue;
123
+ }
124
+ if (ch === "\u0009") {
125
+ keys.push("tab");
126
+ continue;
127
+ }
128
+ if (ch === "\u007f") {
129
+ keys.push("backspace");
130
+ continue;
131
+ }
132
+ if (ch === "\r") {
133
+ keys.push("enter");
134
+ continue;
135
+ }
136
+ if (ch === "\n") {
137
+ keys.push("C-j");
138
+ continue;
139
+ }
140
+ keys.push(`text:${ch}`);
141
+ }
142
+ return keys;
143
+ }
144
+ //# sourceMappingURL=keymap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keymap.js","sourceRoot":"","sources":["../../src/tui/keymap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export function calculateLayout(rows, cols = 120) {
2
+ const safeRows = Math.max(1, rows);
3
+ const safeCols = Math.max(1, cols);
4
+ const statusRows = 2;
5
+ const alertRows = 1;
6
+ const toolsRows = 2;
7
+ const inputRows = 2;
8
+ const transcriptRows = Math.max(3, safeRows - statusRows - alertRows - toolsRows - inputRows);
9
+ return { cols: safeCols, rows: safeRows, statusRows, alertRows, toolsRows, inputRows, transcriptRows };
10
+ }
11
+ //# sourceMappingURL=layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.js","sourceRoot":"","sources":["../../src/tui/layout.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,IAAI,GAAG,GAAG;IACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACnC,MAAM,UAAU,GAAG,CAAC,CAAC;IACrB,MAAM,SAAS,GAAG,CAAC,CAAC;IACpB,MAAM,SAAS,GAAG,CAAC,CAAC;IACpB,MAAM,SAAS,GAAG,CAAC,CAAC;IACpB,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC,CAAC;IAC9F,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC;AACzG,CAAC"}
@@ -0,0 +1,186 @@
1
+ import { clearScreen } from './screen.js';
2
+ import { calculateLayout } from './layout.js';
3
+ import { resolveTuiTheme } from './theme.js';
4
+ /** Cached theme colors — set once via setRenderTheme(). */
5
+ let C = resolveTuiTheme('default');
6
+ /** Call once at TUI startup to apply the active theme to all rendering. */
7
+ export function setRenderTheme(name) {
8
+ C = resolveTuiTheme(name);
9
+ }
10
+ function truncate(s, n) {
11
+ if (n <= 0)
12
+ return '';
13
+ return s.length <= n ? s : `${s.slice(0, Math.max(0, n - 1))}…`;
14
+ }
15
+ function secs(ms) {
16
+ return `${(ms / 1000).toFixed(1)}s`;
17
+ }
18
+ function formatToolUsage(e) {
19
+ const durationMs = typeof e.durationMs === 'number' ? e.durationMs : Math.max(0, Date.now() - e.ts);
20
+ const icon = e.phase === 'error' ? `${C.red}✗${C.reset}` : e.phase === 'end' ? `${C.green}✓${C.reset}` : `${C.yellow}⠋${C.reset}`;
21
+ return `${icon} ${e.name} (${secs(durationMs)})`;
22
+ }
23
+ function rolePrefix(role) {
24
+ switch (role) {
25
+ case 'user':
26
+ return `${C.cyan}you:${C.reset}`;
27
+ case 'assistant':
28
+ case 'assistant_streaming':
29
+ return `${C.green}ai:${C.reset}`;
30
+ case 'tool':
31
+ return `${C.yellow}tool:${C.reset}`;
32
+ case 'error':
33
+ return `${C.red}err:${C.reset}`;
34
+ default:
35
+ return `${C.dim}sys:${C.reset}`;
36
+ }
37
+ }
38
+ function placeRight(line, indicator, cols) {
39
+ if (!indicator || cols <= 0)
40
+ return truncate(line, cols);
41
+ if (indicator.length >= cols)
42
+ return truncate(indicator, cols);
43
+ const left = truncate(line, cols - indicator.length);
44
+ return `${left.padEnd(cols - indicator.length, ' ')}${indicator}`;
45
+ }
46
+ function buildBranchOverlay(state, width, height) {
47
+ const picker = state.branchPicker;
48
+ if (!picker)
49
+ return [];
50
+ const inner = Math.max(10, width - 2);
51
+ const lines = [];
52
+ const title = picker.action === 'browse' ? 'Branches' : picker.action === 'checkout' ? 'Checkout Branch' : 'Merge Branch';
53
+ lines.push(`${C.bold}${title}${C.reset} (↑/↓ select, Enter confirm, Esc cancel)`);
54
+ lines.push('');
55
+ if (!picker.branches.length) {
56
+ lines.push(`${C.dim}No branches saved.${C.reset}`);
57
+ }
58
+ else {
59
+ for (let i = 0; i < picker.branches.length; i++) {
60
+ const b = picker.branches[i];
61
+ const sel = i === picker.selectedIndex;
62
+ const when = new Date(b.ts).toLocaleString();
63
+ const prefix = sel ? `${C.cyan}❯${C.reset}` : ' ';
64
+ const name = sel ? `${C.bold}${b.name}${C.reset}` : b.name;
65
+ lines.push(`${prefix} ${name} ${C.dim}(${b.messageCount} msgs, ${when})${C.reset}`);
66
+ }
67
+ lines.push('');
68
+ const selected = picker.branches[picker.selectedIndex];
69
+ if (selected?.preview) {
70
+ lines.push(`${C.dim}Preview:${C.reset} ${selected.preview}`);
71
+ }
72
+ }
73
+ const contentRows = Math.max(3, height - 2);
74
+ const body = lines.slice(0, contentRows).map((l) => truncate(l, inner - 2));
75
+ while (body.length < contentRows)
76
+ body.push('');
77
+ const top = `┌${'─'.repeat(inner)}┐`;
78
+ const mid = body.map((line) => `│ ${line.padEnd(inner - 2)} │`);
79
+ const bot = `└${'─'.repeat(inner)}┘`;
80
+ return [`${C.bold}${top}${C.reset}`, ...mid, `${C.bold}${bot}${C.reset}`];
81
+ }
82
+ function buildOverlay(state, width, height) {
83
+ const pending = state.confirmPending;
84
+ if (!pending)
85
+ return [];
86
+ const inner = Math.max(10, width - 2);
87
+ const lines = [];
88
+ const prompt = pending.diff ? '[Y]es [N]o [D]iff' : '[Y]es [N]o';
89
+ lines.push(`tool: ${pending.tool}`);
90
+ lines.push(`summary: ${pending.summary}`);
91
+ lines.push(prompt);
92
+ if (pending.showDiff && pending.diff) {
93
+ lines.push('');
94
+ lines.push(...pending.diff.split(/\r?\n/));
95
+ }
96
+ const contentRows = Math.max(3, height - 2);
97
+ const body = lines.slice(0, contentRows).map((l) => truncate(l, inner - 2));
98
+ while (body.length < contentRows)
99
+ body.push('');
100
+ const top = `┌${'─'.repeat(inner)}┐`;
101
+ const mid = body.map((line) => `│ ${line.padEnd(inner - 2)} │`);
102
+ const bot = `└${'─'.repeat(inner)}┘`;
103
+ return [`${C.bold}${top}${C.reset}`, ...mid, `${C.bold}${bot}${C.reset}`];
104
+ }
105
+ export function renderTui(state) {
106
+ const layout = calculateLayout(process.stdout.rows ?? 30, process.stdout.columns ?? 120);
107
+ const cols = layout.cols;
108
+ clearScreen();
109
+ const runtime = state.activeRuntime;
110
+ const s1 = [
111
+ `${C.bold}Idle Hands TUI${C.reset}`,
112
+ `${C.dim}model=${C.reset}${runtime?.modelId ?? '-'}`,
113
+ `${C.dim}host=${C.reset}${runtime?.hostId ?? '-'}`,
114
+ `${C.dim}streaming=${C.reset}${state.isStreaming ? 'yes' : 'no'}`,
115
+ ].join(' | ');
116
+ process.stdout.write(truncate(s1, cols) + '\n');
117
+ const health = runtime?.healthy ? `${C.green}●${C.reset}` : `${C.red}○${C.reset}`;
118
+ const s2 = [
119
+ `${C.dim}backend=${C.reset}${runtime?.backendId ?? '-'}`,
120
+ `${C.dim}endpoint=${C.reset}${runtime?.endpoint ?? '-'}`,
121
+ `${C.dim}health=${C.reset}${health}`,
122
+ ].join(' | ');
123
+ process.stdout.write(truncate(s2, cols) + '\n');
124
+ const transcriptLines = [];
125
+ for (const item of state.transcript) {
126
+ const chunks = String(item.text ?? '').split('\n');
127
+ transcriptLines.push(`${rolePrefix(item.role)} ${chunks[0] ?? ''}`);
128
+ for (const c of chunks.slice(1))
129
+ transcriptLines.push(` ${c}`);
130
+ }
131
+ const maxScrollBack = Math.max(0, transcriptLines.length - layout.transcriptRows);
132
+ const scrollBack = Math.max(0, Math.min(state.scroll.transcript, maxScrollBack));
133
+ const end = transcriptLines.length - scrollBack;
134
+ const start = Math.max(0, end - layout.transcriptRows);
135
+ const visible = transcriptLines.slice(start, end);
136
+ while (visible.length < layout.transcriptRows)
137
+ visible.push('');
138
+ const olderAbove = start;
139
+ const newerBelow = scrollBack;
140
+ const alert = state.alerts[state.alerts.length - 1];
141
+ const scrollStatus = newerBelow > 0 ? `↓${newerBelow} more` : olderAbove > 0 ? `↑${olderAbove} more` : '';
142
+ if (alert) {
143
+ const color = alert.level === 'error' ? C.red : alert.level === 'warn' ? C.yellow : C.dim;
144
+ const alertText = `${color}[${alert.level}]${C.reset} ${alert.text}`;
145
+ process.stdout.write(placeRight(alertText, scrollStatus, cols) + '\n');
146
+ }
147
+ else {
148
+ process.stdout.write(placeRight(`${C.dim}[info]${C.reset} ready`, scrollStatus, cols) + '\n');
149
+ }
150
+ if (olderAbove > 0 && visible.length > 0) {
151
+ visible[0] = placeRight(visible[0] ?? '', `${C.dim}↑${olderAbove}${C.reset}`, cols);
152
+ }
153
+ if (newerBelow > 0 && visible.length > 0) {
154
+ visible[visible.length - 1] = placeRight(visible[visible.length - 1] ?? '', `${C.dim}↓${newerBelow}${C.reset}`, cols);
155
+ }
156
+ // Overlay rendering (confirm or branch picker — mutually exclusive)
157
+ const activeOverlay = state.confirmPending
158
+ ? buildOverlay(state, Math.min(Math.max(36, Math.floor(cols * 0.75)), cols - 2), Math.min(layout.transcriptRows, state.confirmPending.showDiff ? Math.max(8, Math.floor(layout.transcriptRows * 0.9)) : 6))
159
+ : state.branchPicker
160
+ ? buildBranchOverlay(state, Math.min(Math.max(36, Math.floor(cols * 0.75)), cols - 2), Math.min(layout.transcriptRows, Math.max(8, Math.floor(layout.transcriptRows * 0.9))))
161
+ : null;
162
+ if (activeOverlay) {
163
+ const boxW = Math.min(Math.max(36, Math.floor(cols * 0.75)), cols - 2);
164
+ const top = Math.max(0, Math.floor((layout.transcriptRows - activeOverlay.length) / 2));
165
+ const left = Math.max(0, Math.floor((cols - boxW) / 2));
166
+ for (let i = 0; i < activeOverlay.length; i += 1) {
167
+ const idx = top + i;
168
+ if (idx < 0 || idx >= visible.length)
169
+ continue;
170
+ const base = visible[idx].padEnd(cols, '');
171
+ const line = activeOverlay[i] ?? '';
172
+ visible[idx] = `${base.slice(0, left)}${line}${base.slice(left + line.length)}`;
173
+ }
174
+ }
175
+ for (const l of visible)
176
+ process.stdout.write(truncate(l, cols) + '\n');
177
+ const recent = state.toolEvents.slice(-3);
178
+ const t1 = recent.length ? recent.map(formatToolUsage).join(' | ') : `${C.dim}idle${C.reset}`;
179
+ process.stdout.write(truncate(t1, cols) + '\n');
180
+ const done = [...state.toolEvents].reverse().find((e) => e.phase === 'end' || e.phase === 'error');
181
+ const summary = done ? `${done.name}: ${done.summary ?? done.detail ?? 'completed'}` : 'no completed tools yet';
182
+ process.stdout.write(truncate(`${C.dim}last:${C.reset} ${summary}`, cols) + '\n');
183
+ process.stdout.write('─'.repeat(Math.max(10, Math.min(cols, 80))) + '\n');
184
+ process.stdout.write(truncate(`> ${state.inputBuffer}`, cols) + '\n');
185
+ }
186
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/tui/render.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ export const HIDE_CURSOR = '\x1b[?25l';
2
+ export const SHOW_CURSOR = '\x1b[?25h';
3
+ export const ENTER_ALT_SCREEN = '\x1b[?1049h';
4
+ export const LEAVE_ALT_SCREEN = '\x1b[?1049l';
5
+ export const CLEAR_SCREEN = '\x1b[2J\x1b[H';
6
+ export const ERASE_LINE = '\x1b[2K';
7
+ export function moveTo(row, col) {
8
+ return `\x1b[${row};${col}H`;
9
+ }
10
+ export function moveUp(n) {
11
+ return `\x1b[${n}A`;
12
+ }
13
+ export function probeTermCapabilities() {
14
+ const term = process.env.TERM ?? '';
15
+ const colorTerm = process.env.COLORTERM ?? '';
16
+ return {
17
+ altScreen: !term.startsWith('dumb'),
18
+ colors256: term.includes('256color') || colorTerm !== '',
19
+ trueColor: colorTerm === 'truecolor' || colorTerm === '24bit',
20
+ unicode: !term.startsWith('dumb') && (process.env.LANG?.includes('UTF') ?? false),
21
+ rows: process.stdout.rows ?? 24,
22
+ cols: process.stdout.columns ?? 80,
23
+ term,
24
+ isTmux: !!process.env.TMUX,
25
+ isScreen: term.startsWith('screen'),
26
+ isSsh: !!process.env.SSH_TTY || !!process.env.SSH_CLIENT,
27
+ };
28
+ }
29
+ export function validateTerminal() {
30
+ const caps = probeTermCapabilities();
31
+ if (caps.term === 'dumb')
32
+ return { ok: false, reason: 'dumb terminal — no cursor control' };
33
+ if (caps.rows < 10)
34
+ return { ok: false, reason: `terminal too short (${caps.rows} rows, need 10+)` };
35
+ if (caps.cols < 40)
36
+ return { ok: false, reason: `terminal too narrow (${caps.cols} cols, need 40+)` };
37
+ return { ok: true };
38
+ }
39
+ export function enterFullScreen() {
40
+ process.stdout.write(ENTER_ALT_SCREEN + CLEAR_SCREEN + HIDE_CURSOR);
41
+ }
42
+ export function leaveFullScreen() {
43
+ process.stdout.write(SHOW_CURSOR + LEAVE_ALT_SCREEN);
44
+ }
45
+ export function clearScreen() {
46
+ process.stdout.write(CLEAR_SCREEN);
47
+ }
48
+ //# sourceMappingURL=screen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen.js","sourceRoot":"","sources":["../../src/tui/screen.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,WAAW,CAAC;AACvC,MAAM,CAAC,MAAM,WAAW,GAAG,WAAW,CAAC;AACvC,MAAM,CAAC,MAAM,gBAAgB,GAAG,aAAa,CAAC;AAC9C,MAAM,CAAC,MAAM,gBAAgB,GAAG,aAAa,CAAC;AAC9C,MAAM,CAAC,MAAM,YAAY,GAAG,eAAe,CAAC;AAC5C,MAAM,CAAC,MAAM,UAAU,GAAG,SAAS,CAAC;AAepC,MAAM,UAAU,MAAM,CAAC,GAAW,EAAE,GAAW;IAC7C,OAAO,QAAQ,GAAG,IAAI,GAAG,GAAG,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,CAAS;IAC9B,OAAO,QAAQ,CAAC,GAAG,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;IACpC,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC;IAC9C,OAAO;QACL,SAAS,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QACnC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,SAAS,KAAK,EAAE;QACxD,SAAS,EAAE,SAAS,KAAK,WAAW,IAAI,SAAS,KAAK,OAAO;QAC7D,OAAO,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;QACjF,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE;QAC/B,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE;QAClC,IAAI;QACJ,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI;QAC1B,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QACnC,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU;KACzD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,MAAM,IAAI,GAAG,qBAAqB,EAAE,CAAC;IACrC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,mCAAmC,EAAE,CAAC;IAC5F,IAAI,IAAI,CAAC,IAAI,GAAG,EAAE;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,uBAAuB,IAAI,CAAC,IAAI,kBAAkB,EAAE,CAAC;IACrG,IAAI,IAAI,CAAC,IAAI,GAAG,EAAE;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,wBAAwB,IAAI,CAAC,IAAI,kBAAkB,EAAE,CAAC;IACtG,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,GAAG,YAAY,GAAG,WAAW,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,GAAG,gBAAgB,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;AACrC,CAAC"}
@@ -0,0 +1,167 @@
1
+ function clampCursor(buffer, cursor) {
2
+ return Math.max(0, Math.min(buffer.length, cursor));
3
+ }
4
+ export function createInitialTuiState() {
5
+ return {
6
+ mode: "chat",
7
+ focus: "input",
8
+ inputBuffer: "",
9
+ inputCursor: 0,
10
+ inputHistory: [],
11
+ historyIndex: null,
12
+ transcript: [],
13
+ toolEvents: [],
14
+ alerts: [],
15
+ activeRuntime: null,
16
+ isStreaming: false,
17
+ streamTargetId: undefined,
18
+ confirmPending: undefined,
19
+ scroll: { transcript: 0, input: 0, status: 0, tools: 0, alerts: 0 },
20
+ };
21
+ }
22
+ export function reduceTuiState(state, ev) {
23
+ switch (ev.type) {
24
+ case "USER_INPUT_CHANGE": {
25
+ const next = ev.text;
26
+ return { ...state, inputBuffer: next, inputCursor: next.length, historyIndex: null };
27
+ }
28
+ case "USER_INPUT_INSERT": {
29
+ const before = state.inputBuffer.slice(0, state.inputCursor);
30
+ const after = state.inputBuffer.slice(state.inputCursor);
31
+ const inputBuffer = `${before}${ev.text}${after}`;
32
+ return {
33
+ ...state,
34
+ inputBuffer,
35
+ inputCursor: state.inputCursor + ev.text.length,
36
+ historyIndex: null,
37
+ };
38
+ }
39
+ case "USER_INPUT_BACKSPACE": {
40
+ if (state.inputCursor <= 0)
41
+ return state;
42
+ const before = state.inputBuffer.slice(0, state.inputCursor - 1);
43
+ const after = state.inputBuffer.slice(state.inputCursor);
44
+ return {
45
+ ...state,
46
+ inputBuffer: `${before}${after}`,
47
+ inputCursor: state.inputCursor - 1,
48
+ historyIndex: null,
49
+ };
50
+ }
51
+ case "USER_INPUT_DELETE_FORWARD": {
52
+ if (state.inputCursor >= state.inputBuffer.length)
53
+ return state;
54
+ const before = state.inputBuffer.slice(0, state.inputCursor);
55
+ const after = state.inputBuffer.slice(state.inputCursor + 1);
56
+ return { ...state, inputBuffer: `${before}${after}`, historyIndex: null };
57
+ }
58
+ case "USER_INPUT_CURSOR_MOVE": {
59
+ return {
60
+ ...state,
61
+ inputCursor: clampCursor(state.inputBuffer, state.inputCursor + ev.delta),
62
+ };
63
+ }
64
+ case "USER_INPUT_CURSOR_HOME":
65
+ return { ...state, inputCursor: 0 };
66
+ case "USER_INPUT_CURSOR_END":
67
+ return { ...state, inputCursor: state.inputBuffer.length };
68
+ case "USER_INPUT_HISTORY_PREV": {
69
+ if (!state.inputHistory.length)
70
+ return state;
71
+ const idx = state.historyIndex === null
72
+ ? state.inputHistory.length - 1
73
+ : Math.max(0, state.historyIndex - 1);
74
+ const text = state.inputHistory[idx] ?? "";
75
+ return { ...state, historyIndex: idx, inputBuffer: text, inputCursor: text.length };
76
+ }
77
+ case "USER_INPUT_HISTORY_NEXT": {
78
+ if (!state.inputHistory.length || state.historyIndex === null)
79
+ return state;
80
+ const idx = state.historyIndex + 1;
81
+ if (idx >= state.inputHistory.length) {
82
+ return { ...state, historyIndex: null, inputBuffer: "", inputCursor: 0 };
83
+ }
84
+ const text = state.inputHistory[idx] ?? "";
85
+ return { ...state, historyIndex: idx, inputBuffer: text, inputCursor: text.length };
86
+ }
87
+ case "USER_INPUT_SUBMIT": {
88
+ const item = { id: `u_${Date.now()}`, role: "user", text: ev.text, ts: Date.now() };
89
+ const inputHistory = ev.text.length ? [...state.inputHistory, ev.text] : state.inputHistory;
90
+ return {
91
+ ...state,
92
+ inputBuffer: "",
93
+ inputCursor: 0,
94
+ historyIndex: null,
95
+ inputHistory,
96
+ transcript: [...state.transcript, item],
97
+ };
98
+ }
99
+ case "AGENT_STREAM_START": {
100
+ const item = { id: ev.id, role: "assistant_streaming", text: "", ts: Date.now() };
101
+ return { ...state, isStreaming: true, streamTargetId: ev.id, transcript: [...state.transcript, item] };
102
+ }
103
+ case "AGENT_STREAM_TOKEN": {
104
+ const transcript = state.transcript.map((t) => (t.id === ev.id ? { ...t, text: t.text + ev.token } : t));
105
+ return { ...state, transcript };
106
+ }
107
+ case "AGENT_STREAM_DONE": {
108
+ const transcript = state.transcript.map((t) => (t.id === ev.id ? { ...t, role: "assistant" } : t));
109
+ return { ...state, isStreaming: false, streamTargetId: undefined, transcript };
110
+ }
111
+ case "TOOL_START":
112
+ return { ...state, toolEvents: [...state.toolEvents, { id: ev.id, name: ev.name, phase: "start", ts: Date.now(), detail: ev.detail, summary: ev.summary }] };
113
+ case "TOOL_END":
114
+ return { ...state, toolEvents: [...state.toolEvents, { id: ev.id, name: ev.name, phase: "end", ts: Date.now(), detail: ev.detail, summary: ev.summary, durationMs: ev.durationMs }] };
115
+ case "TOOL_ERROR":
116
+ return { ...state, toolEvents: [...state.toolEvents, { id: ev.id, name: ev.name, phase: "error", ts: Date.now(), detail: ev.detail, summary: ev.summary, durationMs: ev.durationMs }] };
117
+ case "RUNTIME_STATE_UPDATE":
118
+ return { ...state, activeRuntime: ev.runtime };
119
+ case "ALERT_PUSH":
120
+ return { ...state, alerts: [...state.alerts, { id: ev.id, level: ev.level, text: ev.text, ts: Date.now() }] };
121
+ case "ALERT_CLEAR":
122
+ return { ...state, alerts: ev.id ? state.alerts.filter((a) => a.id !== ev.id) : [] };
123
+ case "CONFIRM_SHOW":
124
+ return {
125
+ ...state,
126
+ confirmPending: {
127
+ tool: ev.tool,
128
+ summary: ev.summary,
129
+ args: ev.args,
130
+ diff: ev.diff,
131
+ showDiff: false,
132
+ },
133
+ };
134
+ case "CONFIRM_TOGGLE_DIFF":
135
+ if (!state.confirmPending)
136
+ return state;
137
+ return {
138
+ ...state,
139
+ confirmPending: {
140
+ ...state.confirmPending,
141
+ showDiff: !state.confirmPending.showDiff,
142
+ },
143
+ };
144
+ case "CONFIRM_DISMISS":
145
+ return { ...state, confirmPending: undefined };
146
+ case "FOCUS_SET":
147
+ return { ...state, focus: ev.panel };
148
+ case "SCROLL":
149
+ return { ...state, scroll: { ...state.scroll, [ev.panel]: state.scroll[ev.panel] + ev.delta } };
150
+ case "BRANCH_PICKER_OPEN":
151
+ return { ...state, branchPicker: { branches: ev.branches, selectedIndex: 0, action: ev.action } };
152
+ case "BRANCH_PICKER_MOVE": {
153
+ if (!state.branchPicker)
154
+ return state;
155
+ const len = state.branchPicker.branches.length;
156
+ if (len === 0)
157
+ return state;
158
+ const next = Math.max(0, Math.min(len - 1, state.branchPicker.selectedIndex + ev.delta));
159
+ return { ...state, branchPicker: { ...state.branchPicker, selectedIndex: next } };
160
+ }
161
+ case "BRANCH_PICKER_CLOSE":
162
+ return { ...state, branchPicker: undefined };
163
+ default:
164
+ return state;
165
+ }
166
+ }
167
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/tui/state.ts"],"names":[],"mappings":"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"}