openhorse 0.2.1 → 0.2.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.
Files changed (219) hide show
  1. package/README.md +23 -0
  2. package/dist/cli.js +163 -22
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/index.d.ts.map +1 -1
  5. package/dist/commands/index.js +82 -2
  6. package/dist/commands/index.js.map +1 -1
  7. package/dist/framework/prompt.d.ts +4 -0
  8. package/dist/framework/prompt.d.ts.map +1 -1
  9. package/dist/framework/prompt.js +18 -0
  10. package/dist/framework/prompt.js.map +1 -1
  11. package/dist/framework/query.d.ts +7 -0
  12. package/dist/framework/query.d.ts.map +1 -1
  13. package/dist/framework/query.js +14 -0
  14. package/dist/framework/query.js.map +1 -1
  15. package/dist/framework/store.d.ts +3 -1
  16. package/dist/framework/store.d.ts.map +1 -1
  17. package/dist/framework/store.js +1 -0
  18. package/dist/framework/store.js.map +1 -1
  19. package/dist/ink-ui/App.d.ts +4 -1
  20. package/dist/ink-ui/App.d.ts.map +1 -1
  21. package/dist/ink-ui/App.js +2 -2
  22. package/dist/ink-ui/App.js.map +1 -1
  23. package/dist/ink-ui/components/Markdown.d.ts +1 -0
  24. package/dist/ink-ui/components/Markdown.d.ts.map +1 -1
  25. package/dist/ink-ui/components/Markdown.js +25 -3
  26. package/dist/ink-ui/components/Markdown.js.map +1 -1
  27. package/dist/ink-ui/components/NativeCursor.d.ts +12 -0
  28. package/dist/ink-ui/components/NativeCursor.d.ts.map +1 -0
  29. package/dist/ink-ui/components/NativeCursor.js +35 -0
  30. package/dist/ink-ui/components/NativeCursor.js.map +1 -0
  31. package/dist/ink-ui/components/PromptInput.d.ts +5 -1
  32. package/dist/ink-ui/components/PromptInput.d.ts.map +1 -1
  33. package/dist/ink-ui/components/PromptInput.js +10 -6
  34. package/dist/ink-ui/components/PromptInput.js.map +1 -1
  35. package/dist/ink-ui/components/RunningHorseIndicator.d.ts +13 -0
  36. package/dist/ink-ui/components/RunningHorseIndicator.d.ts.map +1 -0
  37. package/dist/ink-ui/components/RunningHorseIndicator.js +52 -0
  38. package/dist/ink-ui/components/RunningHorseIndicator.js.map +1 -0
  39. package/dist/ink-ui/components/SelectList.d.ts +2 -1
  40. package/dist/ink-ui/components/SelectList.d.ts.map +1 -1
  41. package/dist/ink-ui/components/SelectList.js +26 -11
  42. package/dist/ink-ui/components/SelectList.js.map +1 -1
  43. package/dist/ink-ui/components/StatusLine.d.ts.map +1 -1
  44. package/dist/ink-ui/components/StatusLine.js +24 -31
  45. package/dist/ink-ui/components/StatusLine.js.map +1 -1
  46. package/dist/ink-ui/components/TerminalCursor.d.ts +4 -2
  47. package/dist/ink-ui/components/TerminalCursor.d.ts.map +1 -1
  48. package/dist/ink-ui/components/TerminalCursor.js +18 -43
  49. package/dist/ink-ui/components/TerminalCursor.js.map +1 -1
  50. package/dist/ink-ui/components/ToolActivity.d.ts +17 -0
  51. package/dist/ink-ui/components/ToolActivity.d.ts.map +1 -0
  52. package/dist/ink-ui/components/ToolActivity.js +107 -0
  53. package/dist/ink-ui/components/ToolActivity.js.map +1 -0
  54. package/dist/ink-ui/components/Transcript.d.ts +7 -1
  55. package/dist/ink-ui/components/Transcript.d.ts.map +1 -1
  56. package/dist/ink-ui/components/Transcript.js +40 -3
  57. package/dist/ink-ui/components/Transcript.js.map +1 -1
  58. package/dist/ink-ui/controllers/chat-controller.d.ts +1 -33
  59. package/dist/ink-ui/controllers/chat-controller.d.ts.map +1 -1
  60. package/dist/ink-ui/controllers/chat-controller.js +15 -437
  61. package/dist/ink-ui/controllers/chat-controller.js.map +1 -1
  62. package/dist/ink-ui/hooks/use-raw-input-bridge.d.ts +6 -0
  63. package/dist/ink-ui/hooks/use-raw-input-bridge.d.ts.map +1 -0
  64. package/dist/ink-ui/hooks/use-raw-input-bridge.js +27 -0
  65. package/dist/ink-ui/hooks/use-raw-input-bridge.js.map +1 -0
  66. package/dist/ink-ui/hooks/use-terminal-size.d.ts +7 -0
  67. package/dist/ink-ui/hooks/use-terminal-size.d.ts.map +1 -0
  68. package/dist/ink-ui/hooks/use-terminal-size.js +34 -0
  69. package/dist/ink-ui/hooks/use-terminal-size.js.map +1 -0
  70. package/dist/ink-ui/launch.d.ts +6 -0
  71. package/dist/ink-ui/launch.d.ts.map +1 -1
  72. package/dist/ink-ui/launch.js +60 -2
  73. package/dist/ink-ui/launch.js.map +1 -1
  74. package/dist/ink-ui/runtime/grapheme.d.ts +9 -0
  75. package/dist/ink-ui/runtime/grapheme.d.ts.map +1 -0
  76. package/dist/ink-ui/runtime/grapheme.js +63 -0
  77. package/dist/ink-ui/runtime/grapheme.js.map +1 -0
  78. package/dist/ink-ui/runtime/input-buffer.d.ts +32 -0
  79. package/dist/ink-ui/runtime/input-buffer.d.ts.map +1 -0
  80. package/dist/ink-ui/runtime/input-buffer.js +165 -0
  81. package/dist/ink-ui/runtime/input-buffer.js.map +1 -0
  82. package/dist/ink-ui/runtime/layout-budget.d.ts +13 -0
  83. package/dist/ink-ui/runtime/layout-budget.d.ts.map +1 -0
  84. package/dist/ink-ui/runtime/layout-budget.js +25 -0
  85. package/dist/ink-ui/runtime/layout-budget.js.map +1 -0
  86. package/dist/ink-ui/runtime/native-cursor.d.ts +62 -0
  87. package/dist/ink-ui/runtime/native-cursor.d.ts.map +1 -0
  88. package/dist/ink-ui/runtime/native-cursor.js +423 -0
  89. package/dist/ink-ui/runtime/native-cursor.js.map +1 -0
  90. package/dist/ink-ui/runtime/prompt-layout.d.ts +20 -1
  91. package/dist/ink-ui/runtime/prompt-layout.d.ts.map +1 -1
  92. package/dist/ink-ui/runtime/prompt-layout.js +129 -11
  93. package/dist/ink-ui/runtime/prompt-layout.js.map +1 -1
  94. package/dist/ink-ui/runtime/raw-input.d.ts +4 -0
  95. package/dist/ink-ui/runtime/raw-input.d.ts.map +1 -0
  96. package/dist/ink-ui/runtime/raw-input.js +15 -0
  97. package/dist/ink-ui/runtime/raw-input.js.map +1 -0
  98. package/dist/ink-ui/runtime/stdout.d.ts +11 -0
  99. package/dist/ink-ui/runtime/stdout.d.ts.map +1 -0
  100. package/dist/ink-ui/runtime/stdout.js +82 -0
  101. package/dist/ink-ui/runtime/stdout.js.map +1 -0
  102. package/dist/ink-ui/runtime/transcript-state.d.ts +37 -0
  103. package/dist/ink-ui/runtime/transcript-state.d.ts.map +1 -0
  104. package/dist/ink-ui/runtime/transcript-state.js +89 -0
  105. package/dist/ink-ui/runtime/transcript-state.js.map +1 -0
  106. package/dist/ink-ui/screens/ReplScreen.d.ts +8 -2
  107. package/dist/ink-ui/screens/ReplScreen.d.ts.map +1 -1
  108. package/dist/ink-ui/screens/ReplScreen.js +247 -151
  109. package/dist/ink-ui/screens/ReplScreen.js.map +1 -1
  110. package/dist/ink-ui/types.d.ts +1 -42
  111. package/dist/ink-ui/types.d.ts.map +1 -1
  112. package/dist/ink-ui/types.js +15 -0
  113. package/dist/ink-ui/types.js.map +1 -1
  114. package/dist/print-ui/launch.d.ts +8 -0
  115. package/dist/print-ui/launch.d.ts.map +1 -0
  116. package/dist/print-ui/launch.js +205 -0
  117. package/dist/print-ui/launch.js.map +1 -0
  118. package/dist/runtime/agent-runtime-controller.d.ts +69 -0
  119. package/dist/runtime/agent-runtime-controller.d.ts.map +1 -0
  120. package/dist/runtime/agent-runtime-controller.js +225 -0
  121. package/dist/runtime/agent-runtime-controller.js.map +1 -0
  122. package/dist/runtime/agent-runtime-protocol.d.ts +90 -0
  123. package/dist/runtime/agent-runtime-protocol.d.ts.map +1 -0
  124. package/dist/runtime/agent-runtime-protocol.js +80 -0
  125. package/dist/runtime/agent-runtime-protocol.js.map +1 -0
  126. package/dist/runtime/chat-controller.d.ts +41 -0
  127. package/dist/runtime/chat-controller.d.ts.map +1 -0
  128. package/dist/runtime/chat-controller.js +577 -0
  129. package/dist/runtime/chat-controller.js.map +1 -0
  130. package/dist/runtime/ui-events.d.ts +59 -0
  131. package/dist/runtime/ui-events.d.ts.map +1 -0
  132. package/dist/runtime/ui-events.js +3 -0
  133. package/dist/runtime/ui-events.js.map +1 -0
  134. package/dist/services/commit-plan.d.ts +17 -0
  135. package/dist/services/commit-plan.d.ts.map +1 -0
  136. package/dist/services/commit-plan.js +161 -0
  137. package/dist/services/commit-plan.js.map +1 -0
  138. package/dist/services/config.d.ts +3 -2
  139. package/dist/services/config.d.ts.map +1 -1
  140. package/dist/services/config.js +7 -6
  141. package/dist/services/config.js.map +1 -1
  142. package/dist/services/doctor.d.ts +33 -0
  143. package/dist/services/doctor.d.ts.map +1 -0
  144. package/dist/services/doctor.js +211 -0
  145. package/dist/services/doctor.js.map +1 -0
  146. package/dist/services/file-context.d.ts +21 -0
  147. package/dist/services/file-context.d.ts.map +1 -0
  148. package/dist/services/file-context.js +194 -0
  149. package/dist/services/file-context.js.map +1 -0
  150. package/dist/services/global-config.d.ts +1 -1
  151. package/dist/services/global-config.d.ts.map +1 -1
  152. package/dist/services/project-instructions.d.ts +16 -0
  153. package/dist/services/project-instructions.d.ts.map +1 -0
  154. package/dist/services/project-instructions.js +135 -0
  155. package/dist/services/project-instructions.js.map +1 -0
  156. package/dist/services/prompt-context.d.ts +3 -0
  157. package/dist/services/prompt-context.d.ts.map +1 -0
  158. package/dist/services/prompt-context.js +13 -0
  159. package/dist/services/prompt-context.js.map +1 -0
  160. package/dist/services/session-storage.d.ts +3 -0
  161. package/dist/services/session-storage.d.ts.map +1 -1
  162. package/dist/services/session-storage.js +11 -0
  163. package/dist/services/session-storage.js.map +1 -1
  164. package/dist/services/workspace-diff.d.ts +27 -0
  165. package/dist/services/workspace-diff.d.ts.map +1 -0
  166. package/dist/services/workspace-diff.js +129 -0
  167. package/dist/services/workspace-diff.js.map +1 -0
  168. package/dist/terminal-ui/completion.d.ts +6 -0
  169. package/dist/terminal-ui/completion.d.ts.map +1 -0
  170. package/dist/terminal-ui/completion.js +80 -0
  171. package/dist/terminal-ui/completion.js.map +1 -0
  172. package/dist/terminal-ui/editor.d.ts +17 -0
  173. package/dist/terminal-ui/editor.d.ts.map +1 -0
  174. package/dist/terminal-ui/editor.js +42 -0
  175. package/dist/terminal-ui/editor.js.map +1 -0
  176. package/dist/terminal-ui/launch.d.ts +23 -0
  177. package/dist/terminal-ui/launch.d.ts.map +1 -0
  178. package/dist/terminal-ui/launch.js +567 -0
  179. package/dist/terminal-ui/launch.js.map +1 -0
  180. package/dist/terminal-ui/raw-editor.d.ts +57 -0
  181. package/dist/terminal-ui/raw-editor.d.ts.map +1 -0
  182. package/dist/terminal-ui/raw-editor.js +339 -0
  183. package/dist/terminal-ui/raw-editor.js.map +1 -0
  184. package/dist/tools/index.d.ts.map +1 -1
  185. package/dist/tools/index.js +61 -19
  186. package/dist/tools/index.js.map +1 -1
  187. package/dist/tui-core/frame.d.ts +25 -0
  188. package/dist/tui-core/frame.d.ts.map +1 -0
  189. package/dist/tui-core/frame.js +104 -0
  190. package/dist/tui-core/frame.js.map +1 -0
  191. package/dist/tui-core/input-parser.d.ts +25 -0
  192. package/dist/tui-core/input-parser.d.ts.map +1 -0
  193. package/dist/tui-core/input-parser.js +207 -0
  194. package/dist/tui-core/input-parser.js.map +1 -0
  195. package/dist/tui-core/terminal-writer.d.ts +34 -0
  196. package/dist/tui-core/terminal-writer.d.ts.map +1 -0
  197. package/dist/tui-core/terminal-writer.js +92 -0
  198. package/dist/tui-core/terminal-writer.js.map +1 -0
  199. package/dist/tui-ui/launch.d.ts +7 -0
  200. package/dist/tui-ui/launch.d.ts.map +1 -0
  201. package/dist/tui-ui/launch.js +194 -0
  202. package/dist/tui-ui/launch.js.map +1 -0
  203. package/dist/tui-ui/layout.d.ts +9 -0
  204. package/dist/tui-ui/layout.d.ts.map +1 -0
  205. package/dist/tui-ui/layout.js +239 -0
  206. package/dist/tui-ui/layout.js.map +1 -0
  207. package/dist/tui-ui/pickers.d.ts +13 -0
  208. package/dist/tui-ui/pickers.d.ts.map +1 -0
  209. package/dist/tui-ui/pickers.js +79 -0
  210. package/dist/tui-ui/pickers.js.map +1 -0
  211. package/dist/tui-ui/runner.d.ts +43 -0
  212. package/dist/tui-ui/runner.d.ts.map +1 -0
  213. package/dist/tui-ui/runner.js +387 -0
  214. package/dist/tui-ui/runner.js.map +1 -0
  215. package/dist/tui-ui/state.d.ts +106 -0
  216. package/dist/tui-ui/state.d.ts.map +1 -0
  217. package/dist/tui-ui/state.js +202 -0
  218. package/dist/tui-ui/state.js.map +1 -0
  219. package/package.json +1 -1
@@ -0,0 +1,567 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.TerminalInputComposer = void 0;
7
+ exports.visibleLength = visibleLength;
8
+ exports.truncateTerminalText = truncateTerminalText;
9
+ exports.parseEditInput = parseEditInput;
10
+ exports.normalizeTerminalAnswer = normalizeTerminalAnswer;
11
+ exports.launchTerminalUI = launchTerminalUI;
12
+ const chalk_1 = __importDefault(require("chalk"));
13
+ const string_width_1 = __importDefault(require("string-width"));
14
+ const agent_runtime_controller_1 = require("../runtime/agent-runtime-controller");
15
+ const agent_runtime_protocol_1 = require("../runtime/agent-runtime-protocol");
16
+ const completion_1 = require("./completion");
17
+ const editor_1 = require("./editor");
18
+ const raw_editor_1 = require("./raw-editor");
19
+ const ACCENT = chalk_1.default.hex('#80E6E8');
20
+ const DIM = chalk_1.default.hex('#567089');
21
+ const ERROR = chalk_1.default.hex('#FF7A7A');
22
+ const TOOL = chalk_1.default.hex('#7FA2B8');
23
+ const BORDER = chalk_1.default.hex('#38556A');
24
+ function formatBytes(bytes) {
25
+ if (!Number.isFinite(bytes) || bytes <= 0)
26
+ return '0 B';
27
+ const units = ['B', 'KB', 'MB', 'GB'];
28
+ let value = bytes;
29
+ let unit = 0;
30
+ while (value >= 1024 && unit < units.length - 1) {
31
+ value /= 1024;
32
+ unit++;
33
+ }
34
+ return `${value >= 10 || unit === 0 ? value.toFixed(0) : value.toFixed(1)} ${units[unit]}`;
35
+ }
36
+ function stripTrailingNewlines(text) {
37
+ return text.replace(/\n+$/g, '');
38
+ }
39
+ function sessionTitle(session) {
40
+ return session.name || session.taskSummary || '(untitled)';
41
+ }
42
+ function formatTranscriptEntry(entry) {
43
+ const content = stripTrailingNewlines(entry.content);
44
+ if (!content)
45
+ return '';
46
+ switch (entry.role) {
47
+ case 'user':
48
+ return `${ACCENT('›')} ${content}`;
49
+ case 'tool':
50
+ return TOOL(content);
51
+ case 'error':
52
+ return ERROR(content);
53
+ case 'status':
54
+ return DIM(content);
55
+ case 'command':
56
+ case 'system':
57
+ return content;
58
+ case 'assistant':
59
+ default:
60
+ return content;
61
+ }
62
+ }
63
+ function shouldShowStatus(message) {
64
+ return Boolean(message.trim());
65
+ }
66
+ class DirectTerminalWriter {
67
+ write(text) {
68
+ process.stdout.write(text);
69
+ }
70
+ }
71
+ const ANSI_PATTERN = /\x1b\[[0-9;?]*[A-Za-z]/g;
72
+ function visibleLength(text) {
73
+ return (0, string_width_1.default)(stripTrailingNewlines(text).replace(ANSI_PATTERN, ''));
74
+ }
75
+ function truncateTerminalText(text, maxWidth) {
76
+ if (maxWidth <= 0)
77
+ return '';
78
+ if ((0, string_width_1.default)(text) <= maxWidth)
79
+ return text;
80
+ if (maxWidth <= 3)
81
+ return '.'.repeat(maxWidth);
82
+ let output = '';
83
+ for (const char of Array.from(text)) {
84
+ if ((0, string_width_1.default)(`${output}${char}...`) > maxWidth)
85
+ break;
86
+ output += char;
87
+ }
88
+ return `${output}...`;
89
+ }
90
+ function bannerRow(content, width) {
91
+ const innerWidth = Math.max(0, width - 2);
92
+ const safeContent = visibleLength(content) > innerWidth
93
+ ? truncateTerminalText(content.replace(ANSI_PATTERN, ''), innerWidth)
94
+ : content;
95
+ const padding = ' '.repeat(Math.max(0, innerWidth - visibleLength(safeContent)));
96
+ return `${BORDER('│')}${safeContent}${padding}${BORDER('│')}`;
97
+ }
98
+ class TerminalEventSink {
99
+ constructor(runtime, writer = new DirectTerminalWriter()) {
100
+ this.runtime = runtime;
101
+ this.writer = writer;
102
+ this.entries = new Map();
103
+ this.printedContent = new Map();
104
+ this.pendingAssistantOutput = new Map();
105
+ this.idCounter = 0;
106
+ this.pendingPicker = null;
107
+ }
108
+ append(entry) {
109
+ const id = `terminal-${++this.idCounter}`;
110
+ const fullEntry = {
111
+ id,
112
+ role: entry.role,
113
+ title: entry.title,
114
+ content: entry.content,
115
+ };
116
+ this.entries.set(id, fullEntry);
117
+ this.printEntry(fullEntry, false);
118
+ return id;
119
+ }
120
+ update(id, patch) {
121
+ const existing = this.entries.get(id);
122
+ if (!existing)
123
+ return;
124
+ const next = { ...existing, ...patch };
125
+ this.entries.set(id, next);
126
+ this.printEntry(next, false);
127
+ }
128
+ finalize(id, patch) {
129
+ const existing = this.entries.get(id);
130
+ if (!existing)
131
+ return;
132
+ const next = patch ? { ...existing, ...patch } : existing;
133
+ this.entries.set(id, next);
134
+ this.printEntry(next, true);
135
+ }
136
+ remove(id) {
137
+ this.entries.delete(id);
138
+ this.printedContent.delete(id);
139
+ }
140
+ replaceTranscript(entries) {
141
+ this.entries.clear();
142
+ this.printedContent.clear();
143
+ this.pendingAssistantOutput.clear();
144
+ if (entries.length === 0)
145
+ return;
146
+ this.writer.write(`\n${BORDER('─'.repeat(Math.min(process.stdout.columns || 80, 96)))}\n`);
147
+ this.writer.write(`${DIM('Restored conversation')}\n\n`);
148
+ for (const entry of entries) {
149
+ const formatted = formatTranscriptEntry(entry);
150
+ if (formatted) {
151
+ this.writer.write(`${formatted}\n\n`);
152
+ }
153
+ }
154
+ }
155
+ clearTranscript() {
156
+ this.entries.clear();
157
+ this.printedContent.clear();
158
+ this.pendingAssistantOutput.clear();
159
+ this.writer.write(`${DIM('View marker reset. Terminal scrollback is preserved.')}\n`);
160
+ }
161
+ setStatus(message) {
162
+ if (!shouldShowStatus(message))
163
+ return;
164
+ this.writer.write(`${DIM(message)}\n`);
165
+ }
166
+ showSessionPicker(request) {
167
+ this.pendingPicker = request;
168
+ this.writer.write(`\n${ACCENT(request.title)}\n`);
169
+ this.writer.write(`${BORDER('─'.repeat(Math.min(process.stdout.columns || 80, 96)))}\n`);
170
+ request.sessions.forEach((session, index) => {
171
+ const id = session.id.slice(0, 8);
172
+ const size = formatBytes(session.historySizeBytes ?? 0);
173
+ const messages = session.messageCount ?? 0;
174
+ const project = request.showProject ? ` ${session.projectPath}` : '';
175
+ this.writer.write(`${String(index + 1).padStart(2, ' ')}. ${ACCENT(id)} ${sessionTitle(session)} ${DIM(`${messages} msgs ${size} ${session.model}${project}`)}\n`);
176
+ });
177
+ this.writer.write(`${DIM('Type a number, session id/name, or /resume --last. Empty input cancels.')}\n`);
178
+ }
179
+ setProcessing(_processing) {
180
+ // The stable terminal UI is append-only, so there is no live spinner state.
181
+ }
182
+ consumePendingSelection(input) {
183
+ const picker = this.pendingPicker;
184
+ if (!picker)
185
+ return null;
186
+ const trimmed = input.trim();
187
+ this.pendingPicker = null;
188
+ if (!trimmed) {
189
+ this.writer.write(`${DIM('Session picker cancelled.')}\n`);
190
+ return '';
191
+ }
192
+ if (trimmed.startsWith('/'))
193
+ return trimmed;
194
+ const numeric = trimmed.match(/^#?(\d+)$/);
195
+ if (numeric) {
196
+ const index = Number(numeric[1]) - 1;
197
+ const selected = picker.sessions[index];
198
+ if (!selected) {
199
+ this.writer.write(`${ERROR(`No session at index ${numeric[1]}.`)}\n`);
200
+ return '';
201
+ }
202
+ return { type: 'select_session', sessionId: selected.id, allProjects: picker.allProjects, source: 'picker' };
203
+ }
204
+ return { type: 'select_session', sessionId: trimmed, allProjects: picker.allProjects, source: 'picker' };
205
+ }
206
+ printEntry(entry, finalized) {
207
+ if (!entry.content)
208
+ return;
209
+ if (entry.role === 'assistant') {
210
+ this.printAssistantDelta(entry, finalized);
211
+ return;
212
+ }
213
+ const previous = this.printedContent.get(entry.id);
214
+ if (previous === entry.content && !finalized)
215
+ return;
216
+ this.printedContent.set(entry.id, entry.content);
217
+ const formatted = formatTranscriptEntry(entry);
218
+ if (formatted) {
219
+ this.writer.write(`${formatted}\n`);
220
+ }
221
+ }
222
+ printAssistantDelta(entry, finalized) {
223
+ const previous = this.printedContent.get(entry.id) ?? '';
224
+ const next = entry.content;
225
+ if (next === previous && !finalized)
226
+ return;
227
+ const delta = next.startsWith(previous) ? next.slice(previous.length) : `\n${next}`;
228
+ const pending = `${this.pendingAssistantOutput.get(entry.id) ?? ''}${delta}`;
229
+ this.printedContent.set(entry.id, next);
230
+ const shouldFlush = finalized || pending.includes('\n') || visibleLength(pending) >= 80;
231
+ if (shouldFlush) {
232
+ this.pendingAssistantOutput.delete(entry.id);
233
+ if (pending) {
234
+ this.writer.write(pending);
235
+ }
236
+ else if (finalized && next && !next.endsWith('\n')) {
237
+ this.writer.write('\n');
238
+ }
239
+ return;
240
+ }
241
+ this.pendingAssistantOutput.set(entry.id, pending);
242
+ }
243
+ }
244
+ function printBanner(runtime) {
245
+ const width = Math.min(process.stdout.columns || 88, 112);
246
+ const line = '─'.repeat(Math.max(20, width - 2));
247
+ const firstLine = ` ${ACCENT.bold('OPENHORSE')} ${DIM(`v${runtime.version}`)} ${DIM('stable terminal UI')}`;
248
+ const projectPrefix = ` ${DIM('Model')} ${ACCENT(runtime.config.model)} ${DIM('Project')} `;
249
+ const project = truncateTerminalText(runtime.cwd, Math.max(10, width - 2 - visibleLength(projectPrefix)));
250
+ process.stdout.write('\n');
251
+ process.stdout.write(`${BORDER(`╭${line}╮`)}\n`);
252
+ process.stdout.write(`${bannerRow(firstLine, width)}\n`);
253
+ process.stdout.write(`${bannerRow(`${projectPrefix}${project}`, width)}\n`);
254
+ process.stdout.write(`${BORDER(`╰${line}╯`)}\n\n`);
255
+ }
256
+ function promptText(runtime) {
257
+ const session = runtime.getSession()?.id.slice(0, 8) ?? 'new';
258
+ return `${DIM(`[${session}]`)} ${ACCENT('›')} `;
259
+ }
260
+ function summarizeToolArgs(args) {
261
+ const entries = Object.entries(args)
262
+ .slice(0, 4)
263
+ .map(([key, value]) => `${key}=${typeof value === 'string' ? value : JSON.stringify(value)}`);
264
+ const summary = entries.join(' ');
265
+ return summary.length > 120 ? `${summary.slice(0, 117)}...` : summary;
266
+ }
267
+ function isExitInput(input) {
268
+ return ['/exit', '/quit', '/q'].includes(input.trim());
269
+ }
270
+ function parseEditInput(input) {
271
+ const trimmed = input.trimStart();
272
+ if (trimmed === '/edit')
273
+ return { isEdit: true, initialContent: '' };
274
+ if (trimmed.startsWith('/edit ')) {
275
+ return { isEdit: true, initialContent: trimmed.slice('/edit '.length) };
276
+ }
277
+ return { isEdit: false, initialContent: '' };
278
+ }
279
+ class TerminalInputComposer {
280
+ constructor() {
281
+ this.mode = null;
282
+ this.lines = [];
283
+ }
284
+ isActive() {
285
+ return this.mode !== null;
286
+ }
287
+ prompt(basePrompt) {
288
+ return this.mode ? `${DIM('[multi]')} ${ACCENT('…')} ` : basePrompt;
289
+ }
290
+ receive(input) {
291
+ const trimmed = input.trim();
292
+ if (!this.mode && ['/paste', '/multi', '/multiline'].includes(trimmed)) {
293
+ this.mode = 'paste';
294
+ this.lines.length = 0;
295
+ return { notice: DIM('Multiline input: finish with /end, cancel with /cancel.') };
296
+ }
297
+ if (this.mode === 'paste') {
298
+ if (trimmed === '/cancel') {
299
+ this.reset();
300
+ return { cancelled: true, notice: DIM('Multiline input cancelled.') };
301
+ }
302
+ if (trimmed === '/end') {
303
+ const submitted = this.lines.join('\n').trimEnd();
304
+ this.reset();
305
+ return submitted ? { input: submitted } : { cancelled: true, notice: DIM('Multiline input was empty.') };
306
+ }
307
+ this.lines.push(input);
308
+ return {};
309
+ }
310
+ if (this.mode === 'continuation') {
311
+ const continued = input.endsWith('\\');
312
+ this.lines.push(continued ? input.slice(0, -1) : input);
313
+ if (continued)
314
+ return {};
315
+ const submitted = this.lines.join('\n').trimEnd();
316
+ this.reset();
317
+ return submitted ? { input: submitted } : {};
318
+ }
319
+ if (input.endsWith('\\')) {
320
+ this.mode = 'continuation';
321
+ this.lines.length = 0;
322
+ this.lines.push(input.slice(0, -1));
323
+ return {};
324
+ }
325
+ return { input };
326
+ }
327
+ reset() {
328
+ this.mode = null;
329
+ this.lines.length = 0;
330
+ }
331
+ }
332
+ exports.TerminalInputComposer = TerminalInputComposer;
333
+ function normalizeTerminalAnswer(input) {
334
+ let output = '';
335
+ let index = 0;
336
+ const popChar = () => {
337
+ const chars = Array.from(output);
338
+ chars.pop();
339
+ output = chars.join('');
340
+ };
341
+ while (index < input.length) {
342
+ const escapeMatch = input.slice(index).match(/^\x1b\[[0-?]*[ -/]*[@-~]/u);
343
+ if (escapeMatch) {
344
+ index += escapeMatch[0].length;
345
+ continue;
346
+ }
347
+ const char = input[index];
348
+ if (char === '\x7f' || char === '\b') {
349
+ popChar();
350
+ index++;
351
+ continue;
352
+ }
353
+ if (char === '\x15') {
354
+ output = '';
355
+ index++;
356
+ continue;
357
+ }
358
+ if (char === '\x17') {
359
+ output = output.replace(/\s*\S+\s*$/u, '');
360
+ index++;
361
+ continue;
362
+ }
363
+ if (char >= ' ' || char === '\t') {
364
+ output += char;
365
+ }
366
+ index++;
367
+ }
368
+ return output;
369
+ }
370
+ async function launchTerminalUI(runtime) {
371
+ printBanner(runtime);
372
+ let editor;
373
+ const writer = {
374
+ write: text => editor.writeExternal(text),
375
+ };
376
+ const events = new TerminalEventSink(runtime, writer);
377
+ let agentController;
378
+ let stopping = false;
379
+ let settled = false;
380
+ let resolveLaunch = null;
381
+ const composer = new TerminalInputComposer();
382
+ let confirmingTool = false;
383
+ const eventSink = {
384
+ emit: event => {
385
+ if (event.type !== 'permission_requested') {
386
+ return (0, agent_runtime_protocol_1.emitToUiEventSink)(events, event);
387
+ }
388
+ if (event.request.abortSignal?.aborted || stopping) {
389
+ agentController.handle({
390
+ type: 'permission_decision',
391
+ requestId: event.request.id,
392
+ approved: false,
393
+ source: 'programmatic',
394
+ });
395
+ return undefined;
396
+ }
397
+ confirmingTool = true;
398
+ const detail = summarizeToolArgs(event.request.args);
399
+ const reason = event.request.reason ? ` ${DIM(event.request.reason)}` : '';
400
+ const suffix = detail ? ` ${DIM(detail)}` : '';
401
+ void editor.ask(`${ACCENT('?')} Allow tool ${ACCENT(event.request.name)}?${suffix}${reason} ${DIM('[y/N]')} `, event.request.abortSignal).then(answer => {
402
+ agentController.handle({
403
+ type: 'permission_decision',
404
+ requestId: event.request.id,
405
+ approved: /^y(es)?$/i.test(answer.trim()),
406
+ source: 'keyboard',
407
+ });
408
+ }).catch(() => {
409
+ agentController.handle({
410
+ type: 'permission_decision',
411
+ requestId: event.request.id,
412
+ approved: false,
413
+ source: 'programmatic',
414
+ });
415
+ }).finally(() => {
416
+ confirmingTool = false;
417
+ prompt();
418
+ });
419
+ return undefined;
420
+ },
421
+ };
422
+ agentController = new agent_runtime_controller_1.AgentRuntimeController({
423
+ runtime,
424
+ eventSink,
425
+ useRuntimeToolPermissions: true,
426
+ echoSubmittedInput: false,
427
+ beforeTurn: () => writer.write('\n'),
428
+ afterTurnLoop: () => {
429
+ writer.write('\n');
430
+ prompt();
431
+ },
432
+ onTurnError: error => {
433
+ const message = error instanceof Error ? error.message : String(error);
434
+ events.append({ role: 'error', content: `Error: ${message}` });
435
+ },
436
+ });
437
+ editor = new raw_editor_1.RawTerminalEditor({
438
+ cwd: runtime.cwd,
439
+ onSubmit: input => handleInput(input),
440
+ onCtrlC: () => handleSigint(),
441
+ });
442
+ const prompt = () => {
443
+ if (stopping)
444
+ return;
445
+ editor.setPrompt(composer.prompt(promptText(runtime)));
446
+ };
447
+ const finishLaunch = () => {
448
+ if (settled)
449
+ return;
450
+ settled = true;
451
+ resolveLaunch?.();
452
+ };
453
+ const stop = async () => {
454
+ if (stopping)
455
+ return;
456
+ stopping = true;
457
+ await agentController.stopActiveTurn();
458
+ editor.stop();
459
+ await runtime.shutdown();
460
+ process.stdout.write('\n');
461
+ finishLaunch();
462
+ };
463
+ const handleInput = (rawInput) => {
464
+ if (stopping)
465
+ return;
466
+ const answer = (0, completion_1.applyTerminalTabCompletion)(normalizeTerminalAnswer(rawInput), runtime.cwd);
467
+ const submitted = answer.trim();
468
+ if (agentController.hasActiveTurn()) {
469
+ if (confirmingTool) {
470
+ return;
471
+ }
472
+ if (!submitted) {
473
+ prompt();
474
+ return;
475
+ }
476
+ const result = agentController.handle({ type: 'submit', text: answer, source: 'composer' });
477
+ if (result.type === 'exit_requested') {
478
+ void stop();
479
+ return;
480
+ }
481
+ prompt();
482
+ return;
483
+ }
484
+ agentController.handle({ type: 'clear_exit_intent' });
485
+ let input = !composer.isActive() ? events.consumePendingSelection(answer) : null;
486
+ if (input === '') {
487
+ prompt();
488
+ return;
489
+ }
490
+ if (input && typeof input !== 'string') {
491
+ const result = agentController.handle(input);
492
+ if (result.type === 'exit_requested') {
493
+ void stop();
494
+ return;
495
+ }
496
+ return;
497
+ }
498
+ input ?? (input = answer);
499
+ if (!composer.isActive()) {
500
+ const edit = parseEditInput(input);
501
+ if (edit.isEdit) {
502
+ editor.stop();
503
+ const result = (0, editor_1.openExternalEditor)({ initialContent: edit.initialContent });
504
+ if (!stopping)
505
+ editor.start();
506
+ if (result.error) {
507
+ events.append({ role: 'error', content: `Editor failed: ${result.error}` });
508
+ prompt();
509
+ return;
510
+ }
511
+ if (result.cancelled || !result.content) {
512
+ events.setStatus('Editor input cancelled.');
513
+ prompt();
514
+ return;
515
+ }
516
+ input = result.content;
517
+ }
518
+ }
519
+ const composed = composer.receive(input);
520
+ if (composed.notice)
521
+ writer.write(`${composed.notice}\n`);
522
+ if (composed.cancelled) {
523
+ prompt();
524
+ return;
525
+ }
526
+ if (composed.input === undefined) {
527
+ prompt();
528
+ return;
529
+ }
530
+ input = composed.input;
531
+ if (!input.trim()) {
532
+ prompt();
533
+ return;
534
+ }
535
+ const result = agentController.handle({ type: 'submit', text: input, source: 'composer' });
536
+ if (result.type === 'exit_requested') {
537
+ void stop();
538
+ return;
539
+ }
540
+ prompt();
541
+ };
542
+ const handleSigint = () => {
543
+ const result = agentController.handle({ type: 'interrupt', source: 'keyboard' });
544
+ if (result.type === 'exit_requested') {
545
+ void stop();
546
+ return;
547
+ }
548
+ prompt();
549
+ };
550
+ try {
551
+ process.stdout.write(`${DIM('Ready. Stable terminal editor is enabled for CJK input, Backspace, and live revision. Use /paste for multiline, /edit for $EDITOR.')}\n`);
552
+ editor.start();
553
+ prompt();
554
+ await new Promise(resolve => {
555
+ resolveLaunch = resolve;
556
+ });
557
+ }
558
+ finally {
559
+ if (!stopping) {
560
+ stopping = true;
561
+ editor.stop();
562
+ await runtime.shutdown();
563
+ process.stdout.write('\n');
564
+ }
565
+ }
566
+ }
567
+ //# sourceMappingURL=launch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launch.js","sourceRoot":"","sources":["../../src/terminal-ui/launch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import { type TuiInputEvent } from '../tui-core/input-parser';
2
+ type RawModeStream = NodeJS.ReadStream & {
3
+ isRaw?: boolean;
4
+ setRawMode?: (mode: boolean) => NodeJS.ReadStream;
5
+ };
6
+ type RawOutputStream = NodeJS.WriteStream & {
7
+ columns?: number;
8
+ };
9
+ export interface RawTerminalEditorOptions {
10
+ input?: RawModeStream;
11
+ output?: RawOutputStream;
12
+ cwd: string;
13
+ onSubmit: (input: string) => void;
14
+ onCtrlC: () => void;
15
+ }
16
+ export declare class RawTerminalEditor {
17
+ private readonly options;
18
+ private readonly input;
19
+ private readonly output;
20
+ private readonly parser;
21
+ private value;
22
+ private cursor;
23
+ private promptValue;
24
+ private questionPrompt;
25
+ private questionResolve;
26
+ private readonly history;
27
+ private historyIndex;
28
+ private historyDraft;
29
+ private running;
30
+ private wasRaw;
31
+ constructor(options: RawTerminalEditorOptions);
32
+ start(): void;
33
+ stop(): void;
34
+ setPrompt(prompt: string): void;
35
+ ask(prompt: string, abortSignal?: AbortSignal): Promise<string>;
36
+ cancelQuestion(): void;
37
+ writeExternal(text: string): void;
38
+ feed(chunk: Buffer | string): TuiInputEvent[];
39
+ getBuffer(): {
40
+ value: string;
41
+ cursor: number;
42
+ };
43
+ private readonly handleData;
44
+ private applyEvent;
45
+ private applyKey;
46
+ private insert;
47
+ private submit;
48
+ private setValue;
49
+ private deleteBeforeCursor;
50
+ private deleteAfterCursor;
51
+ private deleteWordBeforeCursor;
52
+ private moveHistory;
53
+ private render;
54
+ private clearPromptLine;
55
+ }
56
+ export {};
57
+ //# sourceMappingURL=raw-editor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"raw-editor.d.ts","sourceRoot":"","sources":["../../src/terminal-ui/raw-editor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAkB,KAAK,aAAa,EAAe,MAAM,0BAA0B,CAAC;AAG3F,KAAK,aAAa,GAAG,MAAM,CAAC,UAAU,GAAG;IACvC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,MAAM,CAAC,UAAU,CAAC;CACnD,CAAC;AAEF,KAAK,eAAe,GAAG,MAAM,CAAC,WAAW,GAAG;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,WAAW,wBAAwB;IACvC,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,qBAAa,iBAAiB;IAehB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAdpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgB;IACtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwB;IAC/C,OAAO,CAAC,KAAK,CAAM;IACnB,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,WAAW,CAAM;IACzB,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,eAAe,CAA2C;IAClE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,YAAY,CAAM;IAC1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;gBAEM,OAAO,EAAE,wBAAwB;IAK9D,KAAK,IAAI,IAAI;IAYb,IAAI,IAAI,IAAI;IAUZ,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAK/B,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IA6B/D,cAAc,IAAI,IAAI;IAWtB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAOjC,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,aAAa,EAAE;IAQ7C,SAAS,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAI9C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAEzB;IAEF,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,QAAQ;IAoDhB,OAAO,CAAC,MAAM;IAQd,OAAO,CAAC,MAAM;IAsBd,OAAO,CAAC,QAAQ;IAOhB,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,sBAAsB;IAQ9B,OAAO,CAAC,WAAW;IAgBnB,OAAO,CAAC,MAAM;IAYd,OAAO,CAAC,eAAe;CAKxB"}