@relace-ai/jacq 0.1.1-beta.1 → 0.1.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 (106) hide show
  1. package/dist/actions/messages.d.ts +41 -0
  2. package/dist/actions/messages.js +77 -0
  3. package/dist/actions/messages.js.map +1 -0
  4. package/dist/actions/prompts.d.ts +6 -0
  5. package/dist/actions/prompts.js +18 -0
  6. package/dist/actions/prompts.js.map +1 -0
  7. package/dist/actions/tasks.d.ts +13 -0
  8. package/dist/actions/tasks.js +66 -0
  9. package/dist/actions/tasks.js.map +1 -0
  10. package/dist/auth.d.ts +12 -0
  11. package/dist/auth.js +131 -0
  12. package/dist/auth.js.map +1 -0
  13. package/dist/clipboard.d.ts +21 -0
  14. package/dist/clipboard.js +126 -0
  15. package/dist/clipboard.js.map +1 -0
  16. package/dist/commands.d.ts +15 -0
  17. package/dist/commands.js +23 -0
  18. package/dist/commands.js.map +1 -0
  19. package/dist/config.d.ts +12 -0
  20. package/dist/config.js +63 -0
  21. package/dist/config.js.map +1 -0
  22. package/dist/connection.d.ts +43 -0
  23. package/dist/connection.js +231 -0
  24. package/dist/connection.js.map +1 -0
  25. package/dist/constants.d.ts +2 -0
  26. package/dist/constants.js +3 -0
  27. package/dist/constants.js.map +1 -0
  28. package/dist/debug.d.ts +96 -0
  29. package/dist/debug.js +144 -0
  30. package/dist/debug.js.map +1 -0
  31. package/dist/index.d.ts +10 -0
  32. package/dist/index.js +390 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/markdown/index.d.ts +11 -0
  35. package/dist/markdown/index.js +12 -0
  36. package/dist/markdown/index.js.map +1 -0
  37. package/dist/markdown/parser.d.ts +22 -0
  38. package/dist/markdown/parser.js +310 -0
  39. package/dist/markdown/parser.js.map +1 -0
  40. package/dist/markdown/renderer.d.ts +23 -0
  41. package/dist/markdown/renderer.js +358 -0
  42. package/dist/markdown/renderer.js.map +1 -0
  43. package/dist/markdown/types.d.ts +74 -0
  44. package/dist/markdown/types.js +12 -0
  45. package/dist/markdown/types.js.map +1 -0
  46. package/dist/protocol.d.ts +46 -0
  47. package/dist/protocol.js +608 -0
  48. package/dist/protocol.js.map +1 -0
  49. package/dist/renderer.d.ts +46 -0
  50. package/dist/renderer.js +144 -0
  51. package/dist/renderer.js.map +1 -0
  52. package/dist/screen.d.ts +34 -0
  53. package/dist/screen.js +167 -0
  54. package/dist/screen.js.map +1 -0
  55. package/dist/state.d.ts +6 -0
  56. package/dist/state.js +77 -0
  57. package/dist/state.js.map +1 -0
  58. package/dist/styles.d.ts +16 -0
  59. package/dist/styles.js +68 -0
  60. package/dist/styles.js.map +1 -0
  61. package/dist/terminal.d.ts +46 -0
  62. package/dist/terminal.js +67 -0
  63. package/dist/terminal.js.map +1 -0
  64. package/dist/tools/executor.d.ts +8 -0
  65. package/dist/tools/executor.js +20 -0
  66. package/dist/tools/executor.js.map +1 -0
  67. package/dist/tools/index.d.ts +5 -0
  68. package/dist/tools/index.js +6 -0
  69. package/dist/tools/index.js.map +1 -0
  70. package/dist/tools/registry.d.ts +32 -0
  71. package/dist/tools/registry.js +344 -0
  72. package/dist/tools/registry.js.map +1 -0
  73. package/dist/types.d.ts +200 -0
  74. package/dist/types.js +5 -0
  75. package/dist/types.js.map +1 -0
  76. package/dist/ui/backgroundTasks.d.ts +7 -0
  77. package/dist/ui/backgroundTasks.js +192 -0
  78. package/dist/ui/backgroundTasks.js.map +1 -0
  79. package/dist/ui/filePicker.d.ts +9 -0
  80. package/dist/ui/filePicker.js +315 -0
  81. package/dist/ui/filePicker.js.map +1 -0
  82. package/dist/ui/index.d.ts +33 -0
  83. package/dist/ui/index.js +289 -0
  84. package/dist/ui/index.js.map +1 -0
  85. package/dist/ui/input.d.ts +7 -0
  86. package/dist/ui/input.js +320 -0
  87. package/dist/ui/input.js.map +1 -0
  88. package/dist/ui/messages.d.ts +9 -0
  89. package/dist/ui/messages.js +329 -0
  90. package/dist/ui/messages.js.map +1 -0
  91. package/dist/ui/primitives.d.ts +35 -0
  92. package/dist/ui/primitives.js +94 -0
  93. package/dist/ui/primitives.js.map +1 -0
  94. package/dist/ui/promptInput.d.ts +8 -0
  95. package/dist/ui/promptInput.js +198 -0
  96. package/dist/ui/promptInput.js.map +1 -0
  97. package/dist/ui/promptPicker.d.ts +7 -0
  98. package/dist/ui/promptPicker.js +214 -0
  99. package/dist/ui/promptPicker.js.map +1 -0
  100. package/dist/ui/sessions.d.ts +6 -0
  101. package/dist/ui/sessions.js +214 -0
  102. package/dist/ui/sessions.js.map +1 -0
  103. package/dist/ui/welcome.d.ts +6 -0
  104. package/dist/ui/welcome.js +114 -0
  105. package/dist/ui/welcome.js.map +1 -0
  106. package/package.json +1 -1
@@ -0,0 +1,289 @@
1
+ /**
2
+ * UI Coordinator — Full-screen draw model
3
+ *
4
+ * Manages component layout and drawing to the Screen buffer.
5
+ * Components draw directly via screen.set() instead of returning styled lines.
6
+ */
7
+ import { state, markDirty } from '../state.js';
8
+ import { cancelTask, fetchWidgets } from '../protocol.js';
9
+ import { isCurrentTaskRunning, clearMessages } from '../actions/messages.js';
10
+ import welcome from './welcome.js';
11
+ import input from './input.js';
12
+ import sessions from './sessions.js';
13
+ import backgroundTasks from './backgroundTasks.js';
14
+ import promptPicker from './promptPicker.js';
15
+ import promptInput from './promptInput.js';
16
+ import filePicker, { initFilePicker } from './filePicker.js';
17
+ import messages from './messages.js';
18
+ // Styles (initialized by initStyles)
19
+ let styles = {};
20
+ /**
21
+ * Which component handles input in the "active" slot
22
+ */
23
+ function getActiveComponent() {
24
+ if (state.overlay === 'widgets')
25
+ return backgroundTasks;
26
+ if (state.overlay === 'sessions')
27
+ return sessions;
28
+ if (state.overlay === 'filePicker')
29
+ return filePicker;
30
+ if (state.pendingPrompt) {
31
+ const currentQ = state.pendingPrompt.questions?.[state.pendingPrompt.currentQuestionIndex];
32
+ if (currentQ?.options && currentQ.options.length > 0 && !state.promptFreeInput) {
33
+ return promptPicker;
34
+ }
35
+ return promptInput;
36
+ }
37
+ return input;
38
+ }
39
+ /**
40
+ * Initialize styles from the style pool
41
+ */
42
+ export function initStyles(pool) {
43
+ styles = {
44
+ // General
45
+ text: pool.intern({ color: 'white' }),
46
+ dim: pool.intern({ color: 'gray' }),
47
+ border: pool.intern({ color: 'gray' }),
48
+ // Welcome box
49
+ title: pool.intern({ color: 'white', bold: true }),
50
+ label: pool.intern({ color: 'gray' }),
51
+ value: pool.intern({ color: 'white' }),
52
+ connected: pool.intern({ color: 'white', bold: true }),
53
+ // Input
54
+ prompt: pool.intern({ color: 'white' }),
55
+ input: pool.intern({ color: 'white' }),
56
+ cursor: pool.intern({ color: 'black', bg: 'bgWhite' }),
57
+ hint: pool.intern({ color: 'gray' }),
58
+ // Messages
59
+ userText: pool.intern({ color: 'black', bg: 'bgWhite' }),
60
+ agentText: pool.intern({ color: 'gray' }),
61
+ toolStep: pool.intern({ color: 'gray' }),
62
+ toolCall: pool.intern({ color: 'gray' }),
63
+ statusDone: pool.intern({ color: 'white' }),
64
+ statusDefault: pool.intern({ color: 'gray' }),
65
+ streamText: pool.intern({ color: 'gray' }),
66
+ dotDone: pool.intern({ color: 'white' }),
67
+ dotProgress: pool.intern({ color: 'gray' }),
68
+ // Markdown — white base with modifiers, dim for de-emphasized (like mdvi)
69
+ mdText: pool.intern({ color: 'white' }),
70
+ mdBold: pool.intern({ color: 'white', bold: true }),
71
+ mdItalic: pool.intern({ color: 'white', italic: true }),
72
+ mdCode: pool.intern({ color: 'white', bold: true }),
73
+ mdCodeDelim: pool.intern({ color: 'white', dim: true }),
74
+ mdCodeBlock: pool.intern({ color: 'white', dim: true }),
75
+ mdHeading: pool.intern({ color: 'white', bold: true }),
76
+ mdH1: pool.intern({ color: 'white', bold: true, underline: true }),
77
+ mdH2: pool.intern({ color: 'white', bold: true }),
78
+ mdH3: pool.intern({ color: 'white', bold: true, italic: true }),
79
+ mdH5: pool.intern({ color: 'white', italic: true }),
80
+ mdLink: pool.intern({ color: 'white', underline: true }),
81
+ mdLinkUrl: pool.intern({ color: 'white', dim: true }),
82
+ mdStrikethrough: pool.intern({ color: 'white', strikethrough: true }),
83
+ mdBlockquote: pool.intern({ color: 'white' }),
84
+ mdBlockquoteBar: pool.intern({ color: 'white', dim: true }),
85
+ mdTaskMarker: pool.intern({ color: 'white', bold: true }),
86
+ mdTableBorder: pool.intern({ color: 'white' }),
87
+ mdTableHeader: pool.intern({ color: 'white' }),
88
+ mdTableRow: pool.intern({ color: 'white' }),
89
+ mdHr: pool.intern({ color: 'gray' }),
90
+ mdListBullet: pool.intern({ color: 'gray' }),
91
+ };
92
+ }
93
+ /**
94
+ * Calculate layout based on current state.
95
+ *
96
+ * Content flows top-down: welcome → messages → input.
97
+ * Input follows content until it hits the bottom of the screen,
98
+ * then anchors there and messages become scrollable.
99
+ */
100
+ export function calculateLayout(width, height) {
101
+ state.layout.width = width;
102
+ state.layout.height = height;
103
+ // Calculate content height from top down
104
+ let contentY = 0;
105
+ // Welcome box (if shown)
106
+ if (state.showWelcome) {
107
+ contentY += welcome.height(state, state.layout);
108
+ }
109
+ // Messages start after welcome
110
+ state.layout.messagesY = contentY;
111
+ // Add message lines to content height
112
+ const messageLines = messages.getLines(width).length;
113
+ contentY += messageLines;
114
+ // Active component (input or overlay)
115
+ const activeComponent = getActiveComponent();
116
+ const activeHeight = activeComponent.height(state, state.layout);
117
+ // Input follows content, but anchors to bottom if content overflows
118
+ const maxInputY = height - activeHeight;
119
+ state.layout.inputY = Math.min(contentY, maxInputY);
120
+ // Messages fill the space between welcome and input
121
+ state.layout.messagesHeight = Math.max(0, state.layout.inputY - state.layout.messagesY);
122
+ }
123
+ /**
124
+ * Draw all components to the screen
125
+ */
126
+ export function draw(screen) {
127
+ screen.clearAll();
128
+ const layout = state.layout;
129
+ let y = 0;
130
+ // Draw welcome box
131
+ const welcomeHeight = welcome.height(state);
132
+ if (welcomeHeight > 0) {
133
+ welcome.draw(screen, y, state, layout, styles);
134
+ y += welcomeHeight;
135
+ }
136
+ // Draw messages
137
+ if (layout.messagesHeight > 0) {
138
+ messages.draw(screen, y, state, layout, styles);
139
+ y += layout.messagesHeight;
140
+ }
141
+ // Draw active component (input, overlay, or prompt)
142
+ const activeComponent = getActiveComponent();
143
+ const activeHeight = activeComponent.height(state);
144
+ if (activeHeight > 0) {
145
+ activeComponent.draw(screen, layout.inputY, state, layout, styles);
146
+ }
147
+ }
148
+ /**
149
+ * Clear screen, reset messages and welcome box for a fresh view.
150
+ */
151
+ export function resetView() {
152
+ state.pendingPrompt = null;
153
+ state.promptFreeInput = false;
154
+ state.promptPickerIndex = 0;
155
+ state.promptPickerPage = 0;
156
+ state.promptInputText = '';
157
+ state.promptInputCursor = 0;
158
+ clearMessages();
159
+ state.sessionPickerIndex = 0;
160
+ state.sessionPickerPage = 0;
161
+ state.showWelcome = true;
162
+ state.scrollOffset = 0;
163
+ state.isPinned = true;
164
+ state.forceFullRedraw = true;
165
+ markDirty();
166
+ }
167
+ /**
168
+ * Handle keyboard input
169
+ */
170
+ export function handleKey(str, key) {
171
+ // If an overlay is active, route keys to it first
172
+ if (state.overlay) {
173
+ const activeComponent = getActiveComponent();
174
+ const result = activeComponent.handleKey(str, key, state);
175
+ if (result.handled) {
176
+ return result;
177
+ }
178
+ }
179
+ // If a prompt is active, route keys to it before global handlers
180
+ if (state.pendingPrompt && !state.overlay) {
181
+ const activeComponent = getActiveComponent();
182
+ const result = activeComponent.handleKey(str, key, state);
183
+ if (result.handled) {
184
+ return result;
185
+ }
186
+ }
187
+ // Global keys
188
+ // Ctrl-C: always exit
189
+ if (key.ctrl && key.name === 'c') {
190
+ return { action: 'quit' };
191
+ }
192
+ // Scroll keys: Page Up/Down, Shift+Up/Down
193
+ // scrollOffset is bottom-based: 0 = latest, higher = further back
194
+ if (key.name === 'pageup' || (key.shift && key.name === 'up')) {
195
+ const scrollAmount = (key.shift && key.name === 'up') ? 3 : Math.max(1, state.layout.messagesHeight - 2);
196
+ state.scrollOffset = (state.scrollOffset || 0) + scrollAmount;
197
+ state.isPinned = false;
198
+ markDirty();
199
+ return { handled: true };
200
+ }
201
+ if (key.name === 'pagedown' || (key.shift && key.name === 'down')) {
202
+ const scrollAmount = (key.shift && key.name === 'down') ? 3 : Math.max(1, state.layout.messagesHeight - 2);
203
+ state.scrollOffset = Math.max(0, (state.scrollOffset || 0) - scrollAmount);
204
+ if (state.scrollOffset === 0)
205
+ state.isPinned = true;
206
+ markDirty();
207
+ return { handled: true };
208
+ }
209
+ // Escape: cancel running task, or double-press to clear input
210
+ if (key.name === 'escape') {
211
+ if (isCurrentTaskRunning()) {
212
+ state.submitting = false;
213
+ state.activityPhase = 'cancelling';
214
+ cancelTask(state.currentTaskId);
215
+ markDirty();
216
+ return { handled: true };
217
+ }
218
+ if (state.pendingEscapeClear) {
219
+ state.input = '';
220
+ state.cursor = 0;
221
+ state.pastedBlocks = [];
222
+ state.attachedFiles = [];
223
+ state.pendingEscapeClear = false;
224
+ state.statusMessage = null;
225
+ markDirty();
226
+ return { handled: true };
227
+ }
228
+ if (state.input.length > 0 || (state.attachedFiles?.length ?? 0) > 0) {
229
+ state.pendingEscapeClear = true;
230
+ state.statusMessage = 'Press Esc again to clear';
231
+ markDirty();
232
+ setTimeout(() => {
233
+ state.pendingEscapeClear = false;
234
+ state.statusMessage = null;
235
+ markDirty();
236
+ }, 2000);
237
+ }
238
+ return { handled: true };
239
+ }
240
+ // Tab toggles sessions
241
+ if (key.name === 'tab') {
242
+ if (state.overlay === 'sessions') {
243
+ state.overlay = null;
244
+ }
245
+ else {
246
+ state.overlay = 'sessions';
247
+ state.sessionPickerIndex = 0;
248
+ state.sessionPickerPage = 0;
249
+ }
250
+ markDirty();
251
+ return {};
252
+ }
253
+ // Ctrl+W toggles widgets
254
+ if (key.ctrl && key.name === 'w') {
255
+ if (state.overlay === 'widgets') {
256
+ state.overlay = null;
257
+ }
258
+ else {
259
+ state.overlay = 'widgets';
260
+ state.widgetsIndex = 1;
261
+ state.widgetsPage = 0;
262
+ fetchWidgets();
263
+ }
264
+ markDirty();
265
+ return {};
266
+ }
267
+ // Ctrl+F toggles file picker
268
+ if (key.ctrl && key.name === 'f') {
269
+ if (state.overlay === 'filePicker') {
270
+ state.overlay = null;
271
+ }
272
+ else {
273
+ initFilePicker(state);
274
+ state.overlay = 'filePicker';
275
+ }
276
+ markDirty();
277
+ return {};
278
+ }
279
+ // Route to active component
280
+ if (!state.overlay) {
281
+ const activeComponent = getActiveComponent();
282
+ const result = activeComponent.handleKey(str, key, state);
283
+ if (result.handled) {
284
+ return result;
285
+ }
286
+ }
287
+ return {};
288
+ }
289
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Input Bar Component — full-screen draw() API
3
+ * Supports multi-line input with Ctrl+J for newlines, visual wrapping, and collapsed paste blocks
4
+ */
5
+ import type { UIComponent } from '../types.js';
6
+ declare const input: UIComponent;
7
+ export default input;
@@ -0,0 +1,320 @@
1
+ /**
2
+ * Input Bar Component — full-screen draw() API
3
+ * Supports multi-line input with Ctrl+J for newlines, visual wrapping, and collapsed paste blocks
4
+ */
5
+ import { drawText, drawHLine } from './primitives.js';
6
+ import { markDirty } from '../state.js';
7
+ import { isCurrentTaskRunning } from '../actions/messages.js';
8
+ import { SLASH_COMMANDS, COLON_COMMANDS, filterCommands } from '../commands.js';
9
+ function getHintMode(state) {
10
+ // Contextual overrides take priority
11
+ if (state.statusMessage)
12
+ return 'contextual';
13
+ if ((state.attachedFiles?.length ?? 0) > 0)
14
+ return 'contextual';
15
+ if (isCurrentTaskRunning())
16
+ return 'contextual';
17
+ const trimmed = state.input;
18
+ if (trimmed === '?')
19
+ return 'fullref';
20
+ if (trimmed.startsWith('/'))
21
+ return 'slash';
22
+ if (trimmed.startsWith(':'))
23
+ return 'colon';
24
+ if (trimmed === '')
25
+ return 'default';
26
+ // Multiline hint etc.
27
+ const lines = trimmed.split('\n');
28
+ if (lines.length > 1 || trimmed.includes('\n'))
29
+ return 'contextual';
30
+ return 'default';
31
+ }
32
+ function getCommandListHeight(state) {
33
+ const typed = state.input;
34
+ if (typed.startsWith('/')) {
35
+ return filterCommands(SLASH_COMMANDS, typed).length;
36
+ }
37
+ if (typed.startsWith(':')) {
38
+ return filterCommands(COLON_COMMANDS, typed).length;
39
+ }
40
+ return 0;
41
+ }
42
+ function getFullRefHeight() {
43
+ return 3;
44
+ }
45
+ const MAX_INPUT_LINES = 8;
46
+ const PASTE_REGEX = /\x00PASTE(\d+)\x00/g;
47
+ // === Display Text Helpers ===
48
+ function getDisplayText(input, pastedBlocks) {
49
+ return input.replace(PASTE_REGEX, (_, id) => {
50
+ const block = pastedBlocks.find(b => b.id === parseInt(id));
51
+ return block ? `[ Pasted text #${id} +${block.lineCount} lines ]` : '';
52
+ });
53
+ }
54
+ function expandPastedBlocks(input, pastedBlocks) {
55
+ return input.replace(PASTE_REGEX, (_, id) => {
56
+ const block = pastedBlocks.find(b => b.id === parseInt(id));
57
+ return block ? block.content : '';
58
+ });
59
+ }
60
+ function rawToDisplayCursor(input, cursor, pastedBlocks) {
61
+ const before = input.slice(0, cursor);
62
+ return getDisplayText(before, pastedBlocks).length;
63
+ }
64
+ // === Line Wrapping ===
65
+ function wrapLines(lines, maxWidth) {
66
+ const wrapped = [];
67
+ for (const ln of lines) {
68
+ if (ln.length === 0) {
69
+ wrapped.push('');
70
+ }
71
+ else if (ln.length <= maxWidth) {
72
+ wrapped.push(ln);
73
+ }
74
+ else {
75
+ for (let i = 0; i < ln.length; i += maxWidth) {
76
+ wrapped.push(ln.slice(i, i + maxWidth));
77
+ }
78
+ }
79
+ }
80
+ return wrapped.length > 0 ? wrapped : [''];
81
+ }
82
+ function getWrappedCursorPos(lines, cursorLine, cursorCol, maxWidth) {
83
+ let visualLine = 0;
84
+ for (let i = 0; i < cursorLine; i++) {
85
+ visualLine += Math.max(1, Math.ceil((lines[i].length || 1) / maxWidth));
86
+ }
87
+ visualLine += Math.floor(cursorCol / maxWidth);
88
+ return { line: visualLine, column: cursorCol % maxWidth };
89
+ }
90
+ function getCursorPosition(text, cursor) {
91
+ const lines = text.split('\n');
92
+ let offset = 0;
93
+ for (let i = 0; i < lines.length; i++) {
94
+ if (cursor <= offset + lines[i].length) {
95
+ return { line: i, column: cursor - offset };
96
+ }
97
+ offset += lines[i].length + 1;
98
+ }
99
+ return { line: lines.length - 1, column: lines[lines.length - 1].length };
100
+ }
101
+ // === Component ===
102
+ const input = {
103
+ height(state) {
104
+ const displayText = getDisplayText(state.input, state.pastedBlocks || []);
105
+ const maxWidth = state.layout.width - 3;
106
+ const wrapped = wrapLines(displayText.split('\n'), maxWidth);
107
+ const inputLines = Math.min(wrapped.length, MAX_INPUT_LINES);
108
+ // 1 top separator + inputLines + 1 bottom separator + hint lines
109
+ const mode = getHintMode(state);
110
+ let hintLines = 1; // default, contextual
111
+ if (mode === 'slash' || mode === 'colon') {
112
+ hintLines = Math.max(1, getCommandListHeight(state));
113
+ }
114
+ else if (mode === 'fullref') {
115
+ hintLines = getFullRefHeight();
116
+ }
117
+ return 2 + inputLines + hintLines;
118
+ },
119
+ draw(screen, y, state, layout, styles) {
120
+ const width = layout.width;
121
+ const hasAttachments = (state.attachedFiles?.length ?? 0) > 0;
122
+ const pastedBlocks = state.pastedBlocks || [];
123
+ const displayText = getDisplayText(state.input, pastedBlocks);
124
+ const logicalLines = displayText.split('\n');
125
+ const displayCursor = rawToDisplayCursor(state.input, state.cursor, pastedBlocks);
126
+ const logicalPos = getCursorPosition(displayText, displayCursor);
127
+ const inputStartX = 2;
128
+ const maxWidth = width - inputStartX - 1;
129
+ const wrapped = wrapLines(logicalLines, maxWidth);
130
+ const cursorPos = getWrappedCursorPos(logicalLines, logicalPos.line, logicalPos.column, maxWidth);
131
+ // Scroll to keep cursor visible
132
+ let scroll = 0;
133
+ if (wrapped.length > MAX_INPUT_LINES) {
134
+ scroll = Math.max(0, Math.min(cursorPos.line - MAX_INPUT_LINES + 1, wrapped.length - MAX_INPUT_LINES));
135
+ }
136
+ const visible = wrapped.slice(scroll, scroll + MAX_INPUT_LINES);
137
+ // Top separator
138
+ drawHLine(screen, 0, y, width, styles.border);
139
+ // Build input lines with prompt and text
140
+ for (let i = 0; i < visible.length; i++) {
141
+ const visibleLine = visible[i];
142
+ const actualIdx = scroll + i;
143
+ const prompt = actualIdx === 0 ? '\u276F ' : ' ';
144
+ const row = y + 1 + i;
145
+ drawText(screen, 0, row, prompt, styles.prompt);
146
+ drawText(screen, inputStartX, row, visibleLine, styles.input);
147
+ // Draw cursor
148
+ if (actualIdx === cursorPos.line) {
149
+ const cursorX = inputStartX + cursorPos.column;
150
+ const cursorChar = cursorPos.column < visibleLine.length ? visibleLine[cursorPos.column] : ' ';
151
+ screen.set(cursorX, row, cursorChar, styles.cursor);
152
+ }
153
+ }
154
+ // Bottom separator
155
+ const bottomY = y + 1 + visible.length;
156
+ drawHLine(screen, 0, bottomY, width, styles.border);
157
+ // Hints
158
+ const hintY = bottomY + 1;
159
+ const mode = getHintMode(state);
160
+ switch (mode) {
161
+ case 'default': {
162
+ drawText(screen, 2, hintY, '? for shortcuts', styles.hint);
163
+ break;
164
+ }
165
+ case 'slash':
166
+ case 'colon': {
167
+ const defs = mode === 'slash' ? SLASH_COMMANDS : COLON_COMMANDS;
168
+ const filtered = filterCommands(defs, state.input);
169
+ for (let i = 0; i < filtered.length; i++) {
170
+ const cmd = filtered[i];
171
+ drawText(screen, 2, hintY + i, cmd.command, styles.value);
172
+ drawText(screen, 2 + cmd.command.length, hintY + i, ' ' + cmd.desc, styles.hint);
173
+ }
174
+ if (filtered.length === 0) {
175
+ drawText(screen, 2, hintY, 'no matches', styles.hint);
176
+ }
177
+ break;
178
+ }
179
+ case 'fullref': {
180
+ const col1 = 2, col2 = 22, col3 = 42;
181
+ // Row 1: hotkeys
182
+ drawText(screen, col1, hintY, 'Tab', styles.value);
183
+ drawText(screen, col1 + 3, hintY, ' chats', styles.hint);
184
+ drawText(screen, col2, hintY, '^F', styles.value);
185
+ drawText(screen, col2 + 2, hintY, ' attach files', styles.hint);
186
+ drawText(screen, col3, hintY, '^C', styles.value);
187
+ drawText(screen, col3 + 2, hintY, ' quit', styles.hint);
188
+ // Row 2: more hotkeys
189
+ drawText(screen, col1, hintY + 1, 'Esc', styles.value);
190
+ drawText(screen, col1 + 3, hintY + 1, ' cancel/clear', styles.hint);
191
+ drawText(screen, col2, hintY + 1, '^V', styles.value);
192
+ drawText(screen, col2 + 2, hintY + 1, ' paste image', styles.hint);
193
+ drawText(screen, col3, hintY + 1, '^W', styles.value);
194
+ drawText(screen, col3 + 2, hintY + 1, ' widgets', styles.hint);
195
+ // Row 3: / and : commands
196
+ drawText(screen, col1, hintY + 2, '/', styles.value);
197
+ drawText(screen, col1 + 1, hintY + 2, ' commands', styles.hint);
198
+ drawText(screen, col2, hintY + 2, ':', styles.value);
199
+ drawText(screen, col2 + 1, hintY + 2, ' lists', styles.hint);
200
+ break;
201
+ }
202
+ case 'contextual': {
203
+ if (state.statusMessage) {
204
+ drawText(screen, 2, hintY, state.statusMessage, styles.hint);
205
+ }
206
+ else if (hasAttachments) {
207
+ const fileCount = state.attachedFiles.length;
208
+ const msg = `${fileCount} file${fileCount > 1 ? 's' : ''} attached`;
209
+ drawText(screen, 2, hintY, msg, styles.value);
210
+ }
211
+ else if (isCurrentTaskRunning()) {
212
+ drawText(screen, 2, hintY, 'Esc to interrupt', styles.hint);
213
+ }
214
+ else if (logicalLines.length > 1 || state.input.includes('\n')) {
215
+ drawText(screen, 2, hintY, 'Enter to send, Ctrl+J for newline', styles.hint);
216
+ }
217
+ break;
218
+ }
219
+ }
220
+ },
221
+ handleKey(str, key, state) {
222
+ const pastedBlocks = state.pastedBlocks || [];
223
+ // Ctrl+J: insert newline
224
+ if (key.ctrl && key.name === 'j') {
225
+ state.input = state.input.slice(0, state.cursor) + '\n' + state.input.slice(state.cursor);
226
+ state.cursor++;
227
+ markDirty();
228
+ return { handled: true };
229
+ }
230
+ // Enter: submit
231
+ if (key.name === 'return') {
232
+ if (state.input.trim()) {
233
+ const text = expandPastedBlocks(state.input, pastedBlocks).trim();
234
+ state.input = '';
235
+ state.cursor = 0;
236
+ state.pastedBlocks = [];
237
+ markDirty();
238
+ return { handled: true, action: 'submit', text };
239
+ }
240
+ return { handled: true };
241
+ }
242
+ // Left arrow (skip paste blocks)
243
+ if (key.name === 'left') {
244
+ if (state.cursor > 0) {
245
+ const before = state.input.slice(0, state.cursor);
246
+ const match = before.match(/\x00PASTE(\d+)\x00$/);
247
+ state.cursor -= match ? match[0].length : 1;
248
+ markDirty();
249
+ }
250
+ return { handled: true };
251
+ }
252
+ // Right arrow (skip paste blocks)
253
+ if (key.name === 'right') {
254
+ if (state.cursor < state.input.length) {
255
+ const after = state.input.slice(state.cursor);
256
+ const match = after.match(/^\x00PASTE(\d+)\x00/);
257
+ state.cursor += match ? match[0].length : 1;
258
+ markDirty();
259
+ }
260
+ return { handled: true };
261
+ }
262
+ // Home/End and Ctrl+A/Ctrl+E
263
+ if (key.name === 'home' || (key.ctrl && key.name === 'a')) {
264
+ state.cursor = 0;
265
+ markDirty();
266
+ return { handled: true };
267
+ }
268
+ if (key.name === 'end' || (key.ctrl && key.name === 'e')) {
269
+ state.cursor = state.input.length;
270
+ markDirty();
271
+ return { handled: true };
272
+ }
273
+ // Backspace (delete paste block atomically)
274
+ if (key.name === 'backspace') {
275
+ if (state.cursor > 0) {
276
+ const before = state.input.slice(0, state.cursor);
277
+ const match = before.match(/\x00PASTE(\d+)\x00$/);
278
+ if (match) {
279
+ const blockId = parseInt(match[1]);
280
+ state.pastedBlocks = pastedBlocks.filter(b => b.id !== blockId);
281
+ state.input = state.input.slice(0, state.cursor - match[0].length) + state.input.slice(state.cursor);
282
+ state.cursor -= match[0].length;
283
+ }
284
+ else {
285
+ state.input = state.input.slice(0, state.cursor - 1) + state.input.slice(state.cursor);
286
+ state.cursor--;
287
+ }
288
+ markDirty();
289
+ }
290
+ return { handled: true };
291
+ }
292
+ // Delete (delete paste block atomically)
293
+ if (key.name === 'delete') {
294
+ if (state.cursor < state.input.length) {
295
+ const after = state.input.slice(state.cursor);
296
+ const match = after.match(/^\x00PASTE(\d+)\x00/);
297
+ if (match) {
298
+ const blockId = parseInt(match[1]);
299
+ state.pastedBlocks = pastedBlocks.filter(b => b.id !== blockId);
300
+ state.input = state.input.slice(0, state.cursor) + state.input.slice(state.cursor + match[0].length);
301
+ }
302
+ else {
303
+ state.input = state.input.slice(0, state.cursor) + state.input.slice(state.cursor + 1);
304
+ }
305
+ markDirty();
306
+ }
307
+ return { handled: true };
308
+ }
309
+ // Regular character
310
+ if (str && str.length === 1 && !key.ctrl && !key.meta) {
311
+ state.input = state.input.slice(0, state.cursor) + str + state.input.slice(state.cursor);
312
+ state.cursor++;
313
+ markDirty();
314
+ return { handled: true };
315
+ }
316
+ return { handled: false };
317
+ }
318
+ };
319
+ export default input;
320
+ //# sourceMappingURL=input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.js","sourceRoot":"","sources":["../../src/ui/input.ts"],"names":[],"mappings":"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"}