openhorse 0.2.2 → 0.2.4

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 (245) 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 +161 -22
  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/harness/context-harness.d.ts +14 -0
  20. package/dist/harness/context-harness.d.ts.map +1 -1
  21. package/dist/harness/context-harness.js +21 -0
  22. package/dist/harness/context-harness.js.map +1 -1
  23. package/dist/harness/evidence.d.ts.map +1 -1
  24. package/dist/harness/evidence.js +2 -1
  25. package/dist/harness/evidence.js.map +1 -1
  26. package/dist/index.d.ts +0 -2
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +1 -4
  29. package/dist/index.js.map +1 -1
  30. package/dist/ink-ui/App.d.ts +4 -1
  31. package/dist/ink-ui/App.d.ts.map +1 -1
  32. package/dist/ink-ui/App.js +2 -2
  33. package/dist/ink-ui/App.js.map +1 -1
  34. package/dist/ink-ui/components/NativeCursor.d.ts +12 -0
  35. package/dist/ink-ui/components/NativeCursor.d.ts.map +1 -0
  36. package/dist/ink-ui/components/NativeCursor.js +35 -0
  37. package/dist/ink-ui/components/NativeCursor.js.map +1 -0
  38. package/dist/ink-ui/components/PromptInput.d.ts +5 -1
  39. package/dist/ink-ui/components/PromptInput.d.ts.map +1 -1
  40. package/dist/ink-ui/components/PromptInput.js +10 -6
  41. package/dist/ink-ui/components/PromptInput.js.map +1 -1
  42. package/dist/ink-ui/components/RunningHorseIndicator.d.ts +1 -1
  43. package/dist/ink-ui/components/RunningHorseIndicator.d.ts.map +1 -1
  44. package/dist/ink-ui/components/RunningHorseIndicator.js +3 -41
  45. package/dist/ink-ui/components/RunningHorseIndicator.js.map +1 -1
  46. package/dist/ink-ui/components/SelectList.d.ts +2 -1
  47. package/dist/ink-ui/components/SelectList.d.ts.map +1 -1
  48. package/dist/ink-ui/components/SelectList.js +26 -11
  49. package/dist/ink-ui/components/SelectList.js.map +1 -1
  50. package/dist/ink-ui/components/StatusLine.d.ts.map +1 -1
  51. package/dist/ink-ui/components/StatusLine.js +22 -31
  52. package/dist/ink-ui/components/StatusLine.js.map +1 -1
  53. package/dist/ink-ui/components/TerminalCursor.d.ts +4 -2
  54. package/dist/ink-ui/components/TerminalCursor.d.ts.map +1 -1
  55. package/dist/ink-ui/components/TerminalCursor.js +18 -43
  56. package/dist/ink-ui/components/TerminalCursor.js.map +1 -1
  57. package/dist/ink-ui/components/ToolActivity.d.ts +17 -0
  58. package/dist/ink-ui/components/ToolActivity.d.ts.map +1 -0
  59. package/dist/ink-ui/components/ToolActivity.js +107 -0
  60. package/dist/ink-ui/components/ToolActivity.js.map +1 -0
  61. package/dist/ink-ui/components/Transcript.d.ts +7 -1
  62. package/dist/ink-ui/components/Transcript.d.ts.map +1 -1
  63. package/dist/ink-ui/components/Transcript.js +40 -3
  64. package/dist/ink-ui/components/Transcript.js.map +1 -1
  65. package/dist/ink-ui/controllers/chat-controller.d.ts +1 -33
  66. package/dist/ink-ui/controllers/chat-controller.d.ts.map +1 -1
  67. package/dist/ink-ui/controllers/chat-controller.js +15 -437
  68. package/dist/ink-ui/controllers/chat-controller.js.map +1 -1
  69. package/dist/ink-ui/hooks/use-raw-input-bridge.d.ts +6 -0
  70. package/dist/ink-ui/hooks/use-raw-input-bridge.d.ts.map +1 -0
  71. package/dist/ink-ui/hooks/use-raw-input-bridge.js +27 -0
  72. package/dist/ink-ui/hooks/use-raw-input-bridge.js.map +1 -0
  73. package/dist/ink-ui/hooks/use-terminal-size.d.ts +7 -0
  74. package/dist/ink-ui/hooks/use-terminal-size.d.ts.map +1 -0
  75. package/dist/ink-ui/hooks/use-terminal-size.js +34 -0
  76. package/dist/ink-ui/hooks/use-terminal-size.js.map +1 -0
  77. package/dist/ink-ui/launch.d.ts +6 -0
  78. package/dist/ink-ui/launch.d.ts.map +1 -1
  79. package/dist/ink-ui/launch.js +60 -2
  80. package/dist/ink-ui/launch.js.map +1 -1
  81. package/dist/ink-ui/runtime/grapheme.d.ts +9 -0
  82. package/dist/ink-ui/runtime/grapheme.d.ts.map +1 -0
  83. package/dist/ink-ui/runtime/grapheme.js +63 -0
  84. package/dist/ink-ui/runtime/grapheme.js.map +1 -0
  85. package/dist/ink-ui/runtime/input-buffer.d.ts +32 -0
  86. package/dist/ink-ui/runtime/input-buffer.d.ts.map +1 -0
  87. package/dist/ink-ui/runtime/input-buffer.js +165 -0
  88. package/dist/ink-ui/runtime/input-buffer.js.map +1 -0
  89. package/dist/ink-ui/runtime/layout-budget.d.ts +13 -0
  90. package/dist/ink-ui/runtime/layout-budget.d.ts.map +1 -0
  91. package/dist/ink-ui/runtime/layout-budget.js +25 -0
  92. package/dist/ink-ui/runtime/layout-budget.js.map +1 -0
  93. package/dist/ink-ui/runtime/native-cursor.d.ts +62 -0
  94. package/dist/ink-ui/runtime/native-cursor.d.ts.map +1 -0
  95. package/dist/ink-ui/runtime/native-cursor.js +423 -0
  96. package/dist/ink-ui/runtime/native-cursor.js.map +1 -0
  97. package/dist/ink-ui/runtime/prompt-layout.d.ts +20 -1
  98. package/dist/ink-ui/runtime/prompt-layout.d.ts.map +1 -1
  99. package/dist/ink-ui/runtime/prompt-layout.js +129 -11
  100. package/dist/ink-ui/runtime/prompt-layout.js.map +1 -1
  101. package/dist/ink-ui/runtime/raw-input.d.ts +4 -0
  102. package/dist/ink-ui/runtime/raw-input.d.ts.map +1 -0
  103. package/dist/ink-ui/runtime/raw-input.js +15 -0
  104. package/dist/ink-ui/runtime/raw-input.js.map +1 -0
  105. package/dist/ink-ui/runtime/stdout.d.ts +11 -0
  106. package/dist/ink-ui/runtime/stdout.d.ts.map +1 -0
  107. package/dist/ink-ui/runtime/stdout.js +82 -0
  108. package/dist/ink-ui/runtime/stdout.js.map +1 -0
  109. package/dist/ink-ui/runtime/transcript-state.d.ts +37 -0
  110. package/dist/ink-ui/runtime/transcript-state.d.ts.map +1 -0
  111. package/dist/ink-ui/runtime/transcript-state.js +89 -0
  112. package/dist/ink-ui/runtime/transcript-state.js.map +1 -0
  113. package/dist/ink-ui/screens/ReplScreen.d.ts +8 -2
  114. package/dist/ink-ui/screens/ReplScreen.d.ts.map +1 -1
  115. package/dist/ink-ui/screens/ReplScreen.js +247 -151
  116. package/dist/ink-ui/screens/ReplScreen.js.map +1 -1
  117. package/dist/ink-ui/types.d.ts +1 -42
  118. package/dist/ink-ui/types.d.ts.map +1 -1
  119. package/dist/ink-ui/types.js +15 -0
  120. package/dist/ink-ui/types.js.map +1 -1
  121. package/dist/print-ui/launch.d.ts +8 -0
  122. package/dist/print-ui/launch.d.ts.map +1 -0
  123. package/dist/print-ui/launch.js +205 -0
  124. package/dist/print-ui/launch.js.map +1 -0
  125. package/dist/runtime/agent-runtime-controller.d.ts +69 -0
  126. package/dist/runtime/agent-runtime-controller.d.ts.map +1 -0
  127. package/dist/runtime/agent-runtime-controller.js +225 -0
  128. package/dist/runtime/agent-runtime-controller.js.map +1 -0
  129. package/dist/runtime/agent-runtime-protocol.d.ts +90 -0
  130. package/dist/runtime/agent-runtime-protocol.d.ts.map +1 -0
  131. package/dist/runtime/agent-runtime-protocol.js +80 -0
  132. package/dist/runtime/agent-runtime-protocol.js.map +1 -0
  133. package/dist/runtime/chat-controller.d.ts +41 -0
  134. package/dist/runtime/chat-controller.d.ts.map +1 -0
  135. package/dist/runtime/chat-controller.js +577 -0
  136. package/dist/runtime/chat-controller.js.map +1 -0
  137. package/dist/runtime/ui-events.d.ts +59 -0
  138. package/dist/runtime/ui-events.d.ts.map +1 -0
  139. package/dist/runtime/ui-events.js +3 -0
  140. package/dist/runtime/ui-events.js.map +1 -0
  141. package/dist/services/commit-plan.d.ts +17 -0
  142. package/dist/services/commit-plan.d.ts.map +1 -0
  143. package/dist/services/commit-plan.js +161 -0
  144. package/dist/services/commit-plan.js.map +1 -0
  145. package/dist/services/compact/auto-compact.d.ts.map +1 -1
  146. package/dist/services/compact/auto-compact.js +3 -2
  147. package/dist/services/compact/auto-compact.js.map +1 -1
  148. package/dist/services/compact/compact.d.ts +3 -0
  149. package/dist/services/compact/compact.d.ts.map +1 -1
  150. package/dist/services/compact/compact.js +4 -1
  151. package/dist/services/compact/compact.js.map +1 -1
  152. package/dist/services/compact/summary-generator.d.ts +11 -0
  153. package/dist/services/compact/summary-generator.d.ts.map +1 -1
  154. package/dist/services/compact/summary-generator.js +57 -0
  155. package/dist/services/compact/summary-generator.js.map +1 -1
  156. package/dist/services/config.d.ts +3 -2
  157. package/dist/services/config.d.ts.map +1 -1
  158. package/dist/services/config.js +7 -6
  159. package/dist/services/config.js.map +1 -1
  160. package/dist/services/doctor.d.ts +33 -0
  161. package/dist/services/doctor.d.ts.map +1 -0
  162. package/dist/services/doctor.js +211 -0
  163. package/dist/services/doctor.js.map +1 -0
  164. package/dist/services/file-context.d.ts +21 -0
  165. package/dist/services/file-context.d.ts.map +1 -0
  166. package/dist/services/file-context.js +194 -0
  167. package/dist/services/file-context.js.map +1 -0
  168. package/dist/services/global-config.d.ts +1 -1
  169. package/dist/services/global-config.d.ts.map +1 -1
  170. package/dist/services/project-instructions.d.ts +16 -0
  171. package/dist/services/project-instructions.d.ts.map +1 -0
  172. package/dist/services/project-instructions.js +135 -0
  173. package/dist/services/project-instructions.js.map +1 -0
  174. package/dist/services/prompt-context.d.ts +3 -0
  175. package/dist/services/prompt-context.d.ts.map +1 -0
  176. package/dist/services/prompt-context.js +13 -0
  177. package/dist/services/prompt-context.js.map +1 -0
  178. package/dist/services/session-index.d.ts +45 -0
  179. package/dist/services/session-index.d.ts.map +1 -0
  180. package/dist/services/session-index.js +183 -0
  181. package/dist/services/session-index.js.map +1 -0
  182. package/dist/services/session-storage.d.ts +3 -0
  183. package/dist/services/session-storage.d.ts.map +1 -1
  184. package/dist/services/session-storage.js +21 -0
  185. package/dist/services/session-storage.js.map +1 -1
  186. package/dist/services/workspace-diff.d.ts +27 -0
  187. package/dist/services/workspace-diff.d.ts.map +1 -0
  188. package/dist/services/workspace-diff.js +129 -0
  189. package/dist/services/workspace-diff.js.map +1 -0
  190. package/dist/terminal-ui/completion.d.ts +6 -0
  191. package/dist/terminal-ui/completion.d.ts.map +1 -0
  192. package/dist/terminal-ui/completion.js +80 -0
  193. package/dist/terminal-ui/completion.js.map +1 -0
  194. package/dist/terminal-ui/editor.d.ts +17 -0
  195. package/dist/terminal-ui/editor.d.ts.map +1 -0
  196. package/dist/terminal-ui/editor.js +42 -0
  197. package/dist/terminal-ui/editor.js.map +1 -0
  198. package/dist/terminal-ui/launch.d.ts +23 -0
  199. package/dist/terminal-ui/launch.d.ts.map +1 -0
  200. package/dist/terminal-ui/launch.js +567 -0
  201. package/dist/terminal-ui/launch.js.map +1 -0
  202. package/dist/terminal-ui/raw-editor.d.ts +57 -0
  203. package/dist/terminal-ui/raw-editor.d.ts.map +1 -0
  204. package/dist/terminal-ui/raw-editor.js +339 -0
  205. package/dist/terminal-ui/raw-editor.js.map +1 -0
  206. package/dist/tools/index.d.ts.map +1 -1
  207. package/dist/tools/index.js +269 -25
  208. package/dist/tools/index.js.map +1 -1
  209. package/dist/tui-core/frame.d.ts +25 -0
  210. package/dist/tui-core/frame.d.ts.map +1 -0
  211. package/dist/tui-core/frame.js +104 -0
  212. package/dist/tui-core/frame.js.map +1 -0
  213. package/dist/tui-core/input-parser.d.ts +25 -0
  214. package/dist/tui-core/input-parser.d.ts.map +1 -0
  215. package/dist/tui-core/input-parser.js +207 -0
  216. package/dist/tui-core/input-parser.js.map +1 -0
  217. package/dist/tui-core/terminal-writer.d.ts +34 -0
  218. package/dist/tui-core/terminal-writer.d.ts.map +1 -0
  219. package/dist/tui-core/terminal-writer.js +92 -0
  220. package/dist/tui-core/terminal-writer.js.map +1 -0
  221. package/dist/tui-ui/launch.d.ts +7 -0
  222. package/dist/tui-ui/launch.d.ts.map +1 -0
  223. package/dist/tui-ui/launch.js +194 -0
  224. package/dist/tui-ui/launch.js.map +1 -0
  225. package/dist/tui-ui/layout.d.ts +9 -0
  226. package/dist/tui-ui/layout.d.ts.map +1 -0
  227. package/dist/tui-ui/layout.js +239 -0
  228. package/dist/tui-ui/layout.js.map +1 -0
  229. package/dist/tui-ui/pickers.d.ts +13 -0
  230. package/dist/tui-ui/pickers.d.ts.map +1 -0
  231. package/dist/tui-ui/pickers.js +79 -0
  232. package/dist/tui-ui/pickers.js.map +1 -0
  233. package/dist/tui-ui/runner.d.ts +43 -0
  234. package/dist/tui-ui/runner.d.ts.map +1 -0
  235. package/dist/tui-ui/runner.js +387 -0
  236. package/dist/tui-ui/runner.js.map +1 -0
  237. package/dist/tui-ui/state.d.ts +106 -0
  238. package/dist/tui-ui/state.d.ts.map +1 -0
  239. package/dist/tui-ui/state.js +202 -0
  240. package/dist/tui-ui/state.js.map +1 -0
  241. package/dist/utils/token-estimate.d.ts +42 -0
  242. package/dist/utils/token-estimate.d.ts.map +1 -0
  243. package/dist/utils/token-estimate.js +150 -0
  244. package/dist/utils/token-estimate.js.map +1 -0
  245. package/package.json +1 -1
@@ -0,0 +1,423 @@
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.NativeCursorController = void 0;
7
+ exports.nativeCursorUnparkSequence = nativeCursorUnparkSequence;
8
+ exports.nativeCursorParkSequence = nativeCursorParkSequence;
9
+ exports.nativeCursorAbsoluteMoveSequence = nativeCursorAbsoluteMoveSequence;
10
+ exports.nativeCursorAbsoluteParkSequence = nativeCursorAbsoluteParkSequence;
11
+ exports.nativeCursorMoveSequence = nativeCursorMoveSequence;
12
+ exports.createNativeCursorController = createNativeCursorController;
13
+ exports.nativeCursorAnchorFromNode = nativeCursorAnchorFromNode;
14
+ exports.applyTerminalOutputToCursor = applyTerminalOutputToCursor;
15
+ const string_width_1 = __importDefault(require("string-width"));
16
+ const grapheme_1 = require("./grapheme");
17
+ function nativeCursorUnparkSequence(rowsUp) {
18
+ return nativeCursorMoveSequence({ row: -Math.max(1, rowsUp), column: 0 }, { row: 0, column: 0 });
19
+ }
20
+ function nativeCursorParkSequence(state) {
21
+ const rowsUp = Math.max(1, state.rowsUp);
22
+ const column = Math.max(1, state.column);
23
+ return `\x1b[?25h${nativeCursorMoveSequence({ row: 0, column: 0 }, { row: -rowsUp, column: column - 1 })}`;
24
+ }
25
+ function nativeCursorAbsoluteMoveSequence(to) {
26
+ const row = Math.max(0, Math.floor(to.row));
27
+ const column = Math.max(0, Math.floor(to.column));
28
+ return `\x1b[${row + 1};${column + 1}H`;
29
+ }
30
+ function nativeCursorAbsoluteParkSequence(to) {
31
+ return `\x1b[?25h${nativeCursorAbsoluteMoveSequence(to)}`;
32
+ }
33
+ function nativeCursorMoveSequence(from, to) {
34
+ const rowDelta = to.row - from.row;
35
+ let sequence = '';
36
+ if (rowDelta < 0) {
37
+ sequence += `\x1b[${Math.abs(rowDelta)}A`;
38
+ }
39
+ else if (rowDelta > 0) {
40
+ sequence += `\x1b[${rowDelta}B`;
41
+ }
42
+ if (rowDelta !== 0 || from.column !== to.column) {
43
+ sequence += '\r';
44
+ if (to.column > 0) {
45
+ sequence += `\x1b[${to.column + 1}G`;
46
+ }
47
+ }
48
+ return sequence;
49
+ }
50
+ class NativeCursorController {
51
+ constructor(output) {
52
+ this.output = output;
53
+ this.cursorState = {
54
+ enabled: false,
55
+ column: 5,
56
+ rowsUp: 2,
57
+ };
58
+ this.cursorParked = false;
59
+ this.parkedState = null;
60
+ this.frameCursor = { row: 0, column: 0 };
61
+ this.physicalCursor = { row: 0, column: 0 };
62
+ this.restoreScheduled = false;
63
+ this.promptTopRow = null;
64
+ this.observedLines = new Map();
65
+ this.parkedWithAbsoluteTarget = false;
66
+ this.restoreGeneration = 0;
67
+ }
68
+ wrapStdout() {
69
+ return new Proxy(this.output, {
70
+ get: (target, property, receiver) => {
71
+ if (property === 'write') {
72
+ return (...args) => {
73
+ this.unpark(target);
74
+ const result = target.write(...args);
75
+ const observation = observeTerminalOutput(this.physicalCursor, args[0], target.columns || this.output.columns || 80, target.rows || this.output.rows || 24, this.observedLines);
76
+ this.physicalCursor = observation.cursor;
77
+ if (observation.promptTopRow !== null) {
78
+ this.promptTopRow = observation.promptTopRow;
79
+ }
80
+ this.frameCursor = { ...this.physicalCursor };
81
+ // Keep the native cursor synchronized with the rendered frame.
82
+ // Once a prompt frame has been observed, even later control-only
83
+ // chunks such as cursor-hide must re-park immediately so IME
84
+ // composition has no visible window to attach to the frame tail.
85
+ // Before the first prompt is seen, coalesce partial Ink writes.
86
+ if (this.promptTopRow !== null) {
87
+ this.restore();
88
+ }
89
+ else {
90
+ this.scheduleRestore();
91
+ }
92
+ return result;
93
+ };
94
+ }
95
+ const value = Reflect.get(target, property, receiver);
96
+ if (typeof value === 'function') {
97
+ return value.bind(target);
98
+ }
99
+ return value;
100
+ },
101
+ set(target, property, value, receiver) {
102
+ return Reflect.set(target, property, value, receiver);
103
+ },
104
+ });
105
+ }
106
+ setState(state) {
107
+ this.cursorState = state;
108
+ }
109
+ restore() {
110
+ if (!this.cursorState.enabled || this.output.isTTY === false) {
111
+ this.unpark();
112
+ return;
113
+ }
114
+ if (this.cursorParked && this.parkedState && nativeCursorStateEquals(this.parkedState, this.cursorState)) {
115
+ return;
116
+ }
117
+ this.unpark();
118
+ this.park();
119
+ }
120
+ disable() {
121
+ this.cursorState = { ...this.cursorState, enabled: false };
122
+ this.unpark();
123
+ }
124
+ resetForViewportClear() {
125
+ this.restoreGeneration += 1;
126
+ this.cursorParked = false;
127
+ this.parkedState = null;
128
+ this.frameCursor = { row: 0, column: 0 };
129
+ this.physicalCursor = { row: 0, column: 0 };
130
+ this.restoreScheduled = false;
131
+ this.promptTopRow = null;
132
+ this.observedLines.clear();
133
+ this.parkedWithAbsoluteTarget = false;
134
+ }
135
+ unpark(output = this.output) {
136
+ if (!this.cursorParked || output.isTTY === false) {
137
+ this.cursorParked = false;
138
+ this.parkedState = null;
139
+ return;
140
+ }
141
+ const sequence = this.parkedWithAbsoluteTarget
142
+ ? nativeCursorAbsoluteMoveSequence(this.frameCursor)
143
+ : nativeCursorMoveSequence(this.physicalCursor, this.frameCursor);
144
+ output.write(sequence);
145
+ this.physicalCursor = applyTerminalOutputToCursor(this.physicalCursor, sequence, output.columns || this.output.columns || 80, output.rows || this.output.rows || 24);
146
+ this.cursorParked = false;
147
+ this.parkedWithAbsoluteTarget = false;
148
+ this.parkedState = null;
149
+ }
150
+ park(output = this.output) {
151
+ if (!this.cursorState.enabled || output.isTTY === false) {
152
+ this.cursorParked = false;
153
+ this.parkedState = null;
154
+ return;
155
+ }
156
+ const target = this.cursorTargetFromFrame(this.cursorState);
157
+ const sequence = target.absolute
158
+ ? nativeCursorAbsoluteParkSequence(target.position)
159
+ : `\x1b[?25h${nativeCursorMoveSequence(this.physicalCursor, target.position)}`;
160
+ output.write(sequence);
161
+ this.physicalCursor = applyTerminalOutputToCursor(this.physicalCursor, sequence, output.columns || this.output.columns || 80, output.rows || this.output.rows || 24);
162
+ this.parkedState = { ...this.cursorState };
163
+ this.cursorParked = true;
164
+ this.parkedWithAbsoluteTarget = target.absolute;
165
+ }
166
+ cursorTargetFromFrame(state) {
167
+ if (state.absolute && this.promptTopRow !== null) {
168
+ return {
169
+ position: {
170
+ row: this.promptTopRow + 1 + Math.max(0, state.cursorLineIndex ?? 0),
171
+ column: Math.max(1, state.column) - 1,
172
+ },
173
+ absolute: true,
174
+ };
175
+ }
176
+ if (state.absolute && Number.isFinite(state.row)) {
177
+ return {
178
+ position: {
179
+ row: Math.max(0, Math.floor(state.row ?? 0)),
180
+ column: Math.max(1, state.column) - 1,
181
+ },
182
+ absolute: true,
183
+ };
184
+ }
185
+ return {
186
+ position: {
187
+ row: this.frameCursor.row - Math.max(1, state.rowsUp),
188
+ column: Math.max(1, state.column) - 1,
189
+ },
190
+ absolute: false,
191
+ };
192
+ }
193
+ scheduleRestore() {
194
+ if (this.restoreScheduled)
195
+ return;
196
+ this.restoreScheduled = true;
197
+ const generation = this.restoreGeneration;
198
+ queueMicrotask(() => {
199
+ if (generation !== this.restoreGeneration)
200
+ return;
201
+ this.restoreScheduled = false;
202
+ this.restore();
203
+ });
204
+ }
205
+ }
206
+ exports.NativeCursorController = NativeCursorController;
207
+ function createNativeCursorController(output) {
208
+ return new NativeCursorController(output);
209
+ }
210
+ function nativeCursorStateEquals(left, right) {
211
+ return left.enabled === right.enabled
212
+ && left.column === right.column
213
+ && left.rowsUp === right.rowsUp
214
+ && (left.cursorLineIndex ?? 0) === (right.cursorLineIndex ?? 0)
215
+ && (left.row ?? null) === (right.row ?? null)
216
+ && (left.absolute ?? false) === (right.absolute ?? false);
217
+ }
218
+ function nativeCursorAnchorFromNode(node, options) {
219
+ if (!node?.yogaNode)
220
+ return null;
221
+ let current = node;
222
+ let left = 0;
223
+ let top = 0;
224
+ let rootHeight = 0;
225
+ while (current?.yogaNode) {
226
+ left += current.yogaNode.getComputedLeft?.() ?? 0;
227
+ top += current.yogaNode.getComputedTop?.() ?? 0;
228
+ rootHeight = current.yogaNode.getComputedHeight?.() ?? rootHeight;
229
+ current = current.parentNode;
230
+ }
231
+ if (!rootHeight)
232
+ return null;
233
+ // The prompt box has a top border. The first rendered input row starts one
234
+ // row below that border, and cursorLineIndex is relative to the visible input
235
+ // rows inside the box.
236
+ const targetRow = top + 1 + options.cursorLineIndex;
237
+ return {
238
+ column: Math.max(1, Math.round(left + options.cursorColumn)),
239
+ row: Math.max(0, Math.round(targetRow)),
240
+ // Official Ink writes the dynamic frame and leaves the terminal cursor on
241
+ // the line after the frame. Move back from that render baseline to the
242
+ // declared input row, matching OpenClaude's renderer-owned declaration
243
+ // model as closely as possible without forking Ink yet.
244
+ rowsUp: Math.max(1, Math.round(rootHeight - targetRow)),
245
+ };
246
+ }
247
+ function applyTerminalOutputToCursor(position, chunk, columns, rows = Number.MAX_SAFE_INTEGER) {
248
+ return observeTerminalOutput(position, chunk, columns, rows).cursor;
249
+ }
250
+ function observeTerminalOutput(position, chunk, columns, rows = Number.MAX_SAFE_INTEGER, lineBuffers = new Map()) {
251
+ const text = Buffer.isBuffer(chunk) ? chunk.toString('utf8') : String(chunk ?? '');
252
+ const cursor = { ...position };
253
+ const width = Math.max(1, columns || 80);
254
+ const graphemes = (0, grapheme_1.segmentGraphemes)(text);
255
+ let graphemeIndex = 0;
256
+ let promptTopRow = null;
257
+ for (let index = 0; index < text.length;) {
258
+ const char = text[index];
259
+ if (char === '\x1b') {
260
+ index = consumeEscapeForObservation(text, index, cursor, width, rows, lineBuffers);
261
+ continue;
262
+ }
263
+ if (char === '\r') {
264
+ cursor.column = 0;
265
+ index += 1;
266
+ continue;
267
+ }
268
+ if (char === '\n') {
269
+ cursor.row = clampCursorRow(cursor.row + 1, rows);
270
+ index += 1;
271
+ continue;
272
+ }
273
+ if (char === '\b') {
274
+ cursor.column = Math.max(0, cursor.column - 1);
275
+ index += 1;
276
+ continue;
277
+ }
278
+ while (graphemeIndex < graphemes.length && graphemes[graphemeIndex].index < index) {
279
+ graphemeIndex += 1;
280
+ }
281
+ const grapheme = graphemes[graphemeIndex];
282
+ if (!grapheme || grapheme.index !== index) {
283
+ const codePoint = text.codePointAt(index);
284
+ if (codePoint === undefined)
285
+ break;
286
+ const printable = String.fromCodePoint(codePoint);
287
+ index += printable.length;
288
+ continue;
289
+ }
290
+ const firstCodePoint = grapheme.segment.codePointAt(0);
291
+ if (firstCodePoint !== undefined && firstCodePoint >= 32) {
292
+ const line = `${lineBuffers.get(cursor.row) ?? ''}${grapheme.segment}`;
293
+ lineBuffers.set(cursor.row, line);
294
+ const trimmed = line.trimEnd();
295
+ if (isPromptTopBorderText(trimmed)) {
296
+ promptTopRow = cursor.row;
297
+ }
298
+ cursor.column += Math.max(0, (0, string_width_1.default)(grapheme.segment));
299
+ if (cursor.column >= width) {
300
+ cursor.column = width - 1;
301
+ }
302
+ }
303
+ index += grapheme.segment.length;
304
+ graphemeIndex += 1;
305
+ }
306
+ return { cursor, promptTopRow };
307
+ }
308
+ function consumeEscapeForCursor(text, index, cursor, columns) {
309
+ if (index + 1 >= text.length)
310
+ return index + 1;
311
+ const marker = text[index + 1];
312
+ if (marker === '[') {
313
+ let end = index + 2;
314
+ while (end < text.length && !('@' <= text[end] && text[end] <= '~')) {
315
+ end += 1;
316
+ }
317
+ if (end >= text.length)
318
+ return text.length;
319
+ applyCsiToCursor(text.slice(index + 2, end), text[end], cursor, columns);
320
+ return end + 1;
321
+ }
322
+ if (marker === ']') {
323
+ const endBel = text.indexOf('\x07', index + 2);
324
+ const endSt = text.indexOf('\x1b\\', index + 2);
325
+ const candidates = [endBel, endSt].filter(position => position >= 0);
326
+ if (candidates.length === 0)
327
+ return text.length;
328
+ const end = Math.min(...candidates);
329
+ return end + (end === endSt ? 2 : 1);
330
+ }
331
+ return Math.min(text.length, index + 2);
332
+ }
333
+ function consumeEscapeForObservation(text, index, cursor, columns, rows, lineBuffers) {
334
+ if (index + 1 >= text.length)
335
+ return index + 1;
336
+ const marker = text[index + 1];
337
+ if (marker === '[') {
338
+ let end = index + 2;
339
+ while (end < text.length && !('@' <= text[end] && text[end] <= '~')) {
340
+ end += 1;
341
+ }
342
+ if (end >= text.length)
343
+ return text.length;
344
+ const params = text.slice(index + 2, end);
345
+ const final = text[end];
346
+ applyCsiToCursor(params, final, cursor, columns, rows);
347
+ applyCsiToObservedLines(params, final, cursor, lineBuffers);
348
+ return end + 1;
349
+ }
350
+ if (marker === ']') {
351
+ const endBel = text.indexOf('\x07', index + 2);
352
+ const endSt = text.indexOf('\x1b\\', index + 2);
353
+ const candidates = [endBel, endSt].filter(position => position >= 0);
354
+ if (candidates.length === 0)
355
+ return text.length;
356
+ const end = Math.min(...candidates);
357
+ return end + (end === endSt ? 2 : 1);
358
+ }
359
+ return Math.min(text.length, index + 2);
360
+ }
361
+ function applyCsiToObservedLines(params, final, cursor, lineBuffers) {
362
+ const clean = params.replace(/^[?=>]*/, '');
363
+ const parts = clean
364
+ .split(';')
365
+ .filter(part => part !== '')
366
+ .map(part => (/^\d+$/.test(part) ? Number(part) : 0));
367
+ const first = parts[0] ?? 0;
368
+ if (final === 'K') {
369
+ lineBuffers.set(cursor.row, '');
370
+ return;
371
+ }
372
+ if (final === 'J' && first !== 1) {
373
+ lineBuffers.clear();
374
+ }
375
+ }
376
+ function isPromptTopBorderText(line) {
377
+ return line.startsWith('┌') && line.endsWith('┐') && line.includes('─');
378
+ }
379
+ function applyCsiToCursor(params, final, cursor, columns, rows = Number.MAX_SAFE_INTEGER) {
380
+ const clean = params.replace(/^[?=>]*/, '');
381
+ const parts = clean
382
+ .split(';')
383
+ .filter(part => part !== '')
384
+ .map(part => (/^\d+$/.test(part) ? Number(part) : 0));
385
+ const first = parts[0] ?? 0;
386
+ const count = first || 1;
387
+ switch (final) {
388
+ case 'A':
389
+ cursor.row = clampCursorRow(cursor.row - count, rows);
390
+ break;
391
+ case 'B':
392
+ cursor.row = clampCursorRow(cursor.row + count, rows);
393
+ break;
394
+ case 'C':
395
+ cursor.column = Math.min(columns - 1, cursor.column + count);
396
+ break;
397
+ case 'D':
398
+ cursor.column = Math.max(0, cursor.column - count);
399
+ break;
400
+ case 'E':
401
+ cursor.row = clampCursorRow(cursor.row + count, rows);
402
+ cursor.column = 0;
403
+ break;
404
+ case 'F':
405
+ cursor.row = clampCursorRow(cursor.row - count, rows);
406
+ cursor.column = 0;
407
+ break;
408
+ case 'G':
409
+ cursor.column = Math.min(columns - 1, Math.max(0, count - 1));
410
+ break;
411
+ case 'H':
412
+ case 'f':
413
+ cursor.row = clampCursorRow((parts[0] || 1) - 1, rows);
414
+ cursor.column = Math.min(columns - 1, Math.max(0, (parts[1] || 1) - 1));
415
+ break;
416
+ }
417
+ }
418
+ function clampCursorRow(row, rows) {
419
+ if (!Number.isFinite(rows) || rows <= 0)
420
+ return Math.max(0, row);
421
+ return Math.min(rows - 1, Math.max(0, row));
422
+ }
423
+ //# sourceMappingURL=native-cursor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-cursor.js","sourceRoot":"","sources":["../../../src/ink-ui/runtime/native-cursor.ts"],"names":[],"mappings":";;;;;;AAkCA,gEAKC;AAED,4DAOC;AAED,4EAIC;AAED,4EAEC;AAED,4DAkBC;AA0LD,oEAEC;AAWD,gEAkCC;AAED,kEAOC;AAhUD,gEAAuC;AACvC,yCAA8C;AAiC9C,SAAgB,0BAA0B,CAAC,MAAc;IACvD,OAAO,wBAAwB,CAC7B,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EACxC,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CACtB,CAAC;AACJ,CAAC;AAED,SAAgB,wBAAwB,CAAC,KAAwB;IAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACzC,OAAO,YAAY,wBAAwB,CACzC,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EACrB,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,EAAE,CACrC,EAAE,CAAC;AACN,CAAC;AAED,SAAgB,gCAAgC,CAAC,EAAkB;IACjE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAClD,OAAO,QAAQ,GAAG,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,GAAG,CAAC;AAC1C,CAAC;AAED,SAAgB,gCAAgC,CAAC,EAAkB;IACjE,OAAO,YAAY,gCAAgC,CAAC,EAAE,CAAC,EAAE,CAAC;AAC5D,CAAC;AAED,SAAgB,wBAAwB,CAAC,IAAoB,EAAE,EAAkB;IAC/E,MAAM,QAAQ,GAAG,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;IACnC,IAAI,QAAQ,GAAG,EAAE,CAAC;IAElB,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QACjB,QAAQ,IAAI,QAAQ,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC;IAC5C,CAAC;SAAM,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QACxB,QAAQ,IAAI,QAAQ,QAAQ,GAAG,CAAC;IAClC,CAAC;IAED,IAAI,QAAQ,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,EAAE,CAAC,MAAM,EAAE,CAAC;QAChD,QAAQ,IAAI,IAAI,CAAC;QACjB,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClB,QAAQ,IAAI,QAAQ,EAAE,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC;QACvC,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAa,sBAAsB;IAgBjC,YAA6B,MAA0B;QAA1B,WAAM,GAAN,MAAM,CAAoB;QAf/C,gBAAW,GAAsB;YACvC,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,CAAC;YACT,MAAM,EAAE,CAAC;SACV,CAAC;QACM,iBAAY,GAAG,KAAK,CAAC;QACrB,gBAAW,GAA6B,IAAI,CAAC;QAC7C,gBAAW,GAAmB,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QACpD,mBAAc,GAAmB,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QACvD,qBAAgB,GAAG,KAAK,CAAC;QACzB,iBAAY,GAAkB,IAAI,CAAC;QACnC,kBAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC1C,6BAAwB,GAAG,KAAK,CAAC;QACjC,sBAAiB,GAAG,CAAC,CAAC;IAE4B,CAAC;IAE3D,UAAU;QACR,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE;YAC5B,GAAG,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE;gBAClC,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;oBACzB,OAAO,CAAC,GAAG,IAA6C,EAAE,EAAE;wBAC1D,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;wBACpB,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;wBACrC,MAAM,WAAW,GAAG,qBAAqB,CACvC,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,CAAC,CAAC,EACP,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,EAC3C,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,EACrC,IAAI,CAAC,aAAa,CACnB,CAAC;wBACF,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC,MAAM,CAAC;wBACzC,IAAI,WAAW,CAAC,YAAY,KAAK,IAAI,EAAE,CAAC;4BACtC,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC,YAAY,CAAC;wBAC/C,CAAC;wBACD,IAAI,CAAC,WAAW,GAAG,EAAE,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;wBAC9C,+DAA+D;wBAC/D,iEAAiE;wBACjE,6DAA6D;wBAC7D,iEAAiE;wBACjE,gEAAgE;wBAChE,IAAI,IAAI,CAAC,YAAY,KAAK,IAAI,EAAE,CAAC;4BAC/B,IAAI,CAAC,OAAO,EAAE,CAAC;wBACjB,CAAC;6BAAM,CAAC;4BACN,IAAI,CAAC,eAAe,EAAE,CAAC;wBACzB,CAAC;wBACD,OAAO,MAAM,CAAC;oBAChB,CAAC,CAAC;gBACJ,CAAC;gBAED,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBACtD,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;oBAChC,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC5B,CAAC;gBAED,OAAO,KAAK,CAAC;YACf,CAAC;YACD,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ;gBACnC,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;YACxD,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAED,QAAQ,CAAC,KAAwB;QAC/B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,OAAO;QACL,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;YAC7D,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,WAAW,IAAI,uBAAuB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YACzG,OAAO;QACT,CAAC;QACD,IAAI,CAAC,MAAM,EAAE,CAAC;QACd,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED,OAAO;QACL,IAAI,CAAC,WAAW,GAAG,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAC3D,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED,qBAAqB;QACnB,IAAI,CAAC,iBAAiB,IAAI,CAAC,CAAC;QAC5B,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC1B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,WAAW,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QACzC,IAAI,CAAC,cAAc,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QAC5C,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAC9B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,CAAC,wBAAwB,GAAG,KAAK,CAAC;IACxC,CAAC;IAEO,MAAM,CAAC,SAA6B,IAAI,CAAC,MAAM;QACrD,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;YACjD,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;YAC1B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YACxB,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,wBAAwB;YAC5C,CAAC,CAAC,gCAAgC,CAAC,IAAI,CAAC,WAAW,CAAC;YACpD,CAAC,CAAC,wBAAwB,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACpE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACvB,IAAI,CAAC,cAAc,GAAG,2BAA2B,CAC/C,IAAI,CAAC,cAAc,EACnB,QAAQ,EACR,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,EAC3C,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CACtC,CAAC;QACF,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC1B,IAAI,CAAC,wBAAwB,GAAG,KAAK,CAAC;QACtC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC1B,CAAC;IAEO,IAAI,CAAC,SAA6B,IAAI,CAAC,MAAM;QACnD,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;YACxD,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;YAC1B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YACxB,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC5D,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ;YAC9B,CAAC,CAAC,gCAAgC,CAAC,MAAM,CAAC,QAAQ,CAAC;YACnD,CAAC,CAAC,YAAY,wBAAwB,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjF,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACvB,IAAI,CAAC,cAAc,GAAG,2BAA2B,CAC/C,IAAI,CAAC,cAAc,EACnB,QAAQ,EACR,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,EAC3C,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CACtC,CAAC;QACF,IAAI,CAAC,WAAW,GAAG,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAC3C,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,wBAAwB,GAAG,MAAM,CAAC,QAAQ,CAAC;IAClD,CAAC;IAEO,qBAAqB,CAAC,KAAwB;QACpD,IAAI,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,YAAY,KAAK,IAAI,EAAE,CAAC;YACjD,OAAO;gBACL,QAAQ,EAAE;oBACR,GAAG,EAAE,IAAI,CAAC,YAAY,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,eAAe,IAAI,CAAC,CAAC;oBACpE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;iBACtC;gBACD,QAAQ,EAAE,IAAI;aACf,CAAC;QACJ,CAAC;QAED,IAAI,KAAK,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YACjD,OAAO;gBACL,QAAQ,EAAE;oBACR,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;oBAC5C,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;iBACtC;gBACD,QAAQ,EAAE,IAAI;aACf,CAAC;QACJ,CAAC;QAED,OAAO;YACL,QAAQ,EAAE;gBACR,GAAG,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC;gBACrD,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;aACtC;YACD,QAAQ,EAAE,KAAK;SAChB,CAAC;IACJ,CAAC;IAEO,eAAe;QACrB,IAAI,IAAI,CAAC,gBAAgB;YAAE,OAAO;QAClC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC;QAC1C,cAAc,CAAC,GAAG,EAAE;YAClB,IAAI,UAAU,KAAK,IAAI,CAAC,iBAAiB;gBAAE,OAAO;YAClD,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;YAC9B,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAtLD,wDAsLC;AAED,SAAgB,4BAA4B,CAAC,MAA0B;IACrE,OAAO,IAAI,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,uBAAuB,CAAC,IAAuB,EAAE,KAAwB;IAChF,OAAO,IAAI,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO;WAChC,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;WAC5B,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;WAC5B,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,IAAI,CAAC,CAAC;WAC5D,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC;WAC1C,CAAC,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,CAAC;AAC9D,CAAC;AAED,SAAgB,0BAA0B,CACxC,IAAuC,EACvC,OAA0D;IAE1D,IAAI,CAAC,IAAI,EAAE,QAAQ;QAAE,OAAO,IAAI,CAAC;IAEjC,IAAI,OAAO,GAAsC,IAAI,CAAC;IACtD,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,OAAO,OAAO,EAAE,QAAQ,EAAE,CAAC;QACzB,IAAI,IAAI,OAAO,CAAC,QAAQ,CAAC,eAAe,EAAE,EAAE,IAAI,CAAC,CAAC;QAClD,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,EAAE,EAAE,IAAI,CAAC,CAAC;QAChD,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,iBAAiB,EAAE,EAAE,IAAI,UAAU,CAAC;QAClE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC;IAC/B,CAAC;IAED,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAE7B,2EAA2E;IAC3E,8EAA8E;IAC9E,uBAAuB;IACvB,MAAM,SAAS,GAAG,GAAG,GAAG,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC;IAEpD,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;QAC5D,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACvC,0EAA0E;QAC1E,uEAAuE;QACvE,uEAAuE;QACvE,wDAAwD;QACxD,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC;KACxD,CAAC;AACJ,CAAC;AAED,SAAgB,2BAA2B,CACzC,QAAwB,EACxB,KAAc,EACd,OAAe,EACf,IAAI,GAAG,MAAM,CAAC,gBAAgB;IAE9B,OAAO,qBAAqB,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC;AACtE,CAAC;AAED,SAAS,qBAAqB,CAC5B,QAAwB,EACxB,KAAc,EACd,OAAe,EACf,IAAI,GAAG,MAAM,CAAC,gBAAgB,EAC9B,cAAmC,IAAI,GAAG,EAAE;IAE5C,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IACnF,MAAM,MAAM,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,IAAA,2BAAgB,EAAC,IAAI,CAAC,CAAC;IACzC,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,YAAY,GAAkB,IAAI,CAAC;IAEvC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC;QACzC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAEzB,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,KAAK,GAAG,2BAA2B,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;YACnF,SAAS;QACX,CAAC;QAED,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;YAClB,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QAED,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,MAAM,CAAC,GAAG,GAAG,cAAc,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;YAClD,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QAED,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC/C,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QAED,OAAO,aAAa,GAAG,SAAS,CAAC,MAAM,IAAI,SAAS,CAAC,aAAa,CAAC,CAAC,KAAK,GAAG,KAAK,EAAE,CAAC;YAClF,aAAa,IAAI,CAAC,CAAC;QACrB,CAAC;QAED,MAAM,QAAQ,GAAG,SAAS,CAAC,aAAa,CAAC,CAAC;QAC1C,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;YAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YAC1C,IAAI,SAAS,KAAK,SAAS;gBAAE,MAAM;YACnC,MAAM,SAAS,GAAG,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;YAClD,KAAK,IAAI,SAAS,CAAC,MAAM,CAAC;YAC1B,SAAS;QACX,CAAC;QAED,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QACvD,IAAI,cAAc,KAAK,SAAS,IAAI,cAAc,IAAI,EAAE,EAAE,CAAC;YACzD,MAAM,IAAI,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;YACvE,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAClC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YAC/B,IAAI,qBAAqB,CAAC,OAAO,CAAC,EAAE,CAAC;gBACnC,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC;YAC5B,CAAC;YAED,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAA,sBAAW,EAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;YAC5D,IAAI,MAAM,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC;gBAC3B,MAAM,CAAC,MAAM,GAAG,KAAK,GAAG,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QACD,KAAK,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC;QACjC,aAAa,IAAI,CAAC,CAAC;IACrB,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;AAClC,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAY,EAAE,KAAa,EAAE,MAAsB,EAAE,OAAe;IAClG,IAAI,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,GAAG,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAE/B,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACnB,IAAI,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC;QACpB,OAAO,GAAG,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACpE,GAAG,IAAI,CAAC,CAAC;QACX,CAAC;QACD,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC;QAC3C,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QACzE,OAAO,GAAG,GAAG,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACnB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QAChD,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;QACrE,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC;QAChD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC;QACpC,OAAO,GAAG,GAAG,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,2BAA2B,CAClC,IAAY,EACZ,KAAa,EACb,MAAsB,EACtB,OAAe,EACf,IAAY,EACZ,WAAgC;IAEhC,IAAI,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,GAAG,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAE/B,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACnB,IAAI,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC;QACpB,OAAO,GAAG,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACpE,GAAG,IAAI,CAAC,CAAC;QACX,CAAC;QACD,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QACxB,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QACvD,uBAAuB,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;QAC5D,OAAO,GAAG,GAAG,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACnB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QAChD,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;QACrE,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC;QAChD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC;QACpC,OAAO,GAAG,GAAG,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,uBAAuB,CAC9B,MAAc,EACd,KAAa,EACb,MAAsB,EACtB,WAAgC;IAEhC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,KAAK;SAChB,KAAK,CAAC,GAAG,CAAC;SACV,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC;SAC3B,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAE5B,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;QAClB,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAChC,OAAO;IACT,CAAC;IAED,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QACjC,WAAW,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;AACH,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAY;IACzC,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,gBAAgB,CACvB,MAAc,EACd,KAAa,EACb,MAAsB,EACtB,OAAe,EACf,IAAI,GAAG,MAAM,CAAC,gBAAgB;IAE9B,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,KAAK;SAChB,KAAK,CAAC,GAAG,CAAC;SACV,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC;SAC3B,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC5B,MAAM,KAAK,GAAG,KAAK,IAAI,CAAC,CAAC;IAEzB,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,GAAG;YACN,MAAM,CAAC,GAAG,GAAG,cAAc,CAAC,MAAM,CAAC,GAAG,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC;YACtD,MAAM;QACR,KAAK,GAAG;YACN,MAAM,CAAC,GAAG,GAAG,cAAc,CAAC,MAAM,CAAC,GAAG,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC;YACtD,MAAM;QACR,KAAK,GAAG;YACN,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC;YAC7D,MAAM;QACR,KAAK,GAAG;YACN,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC;YACnD,MAAM;QACR,KAAK,GAAG;YACN,MAAM,CAAC,GAAG,GAAG,cAAc,CAAC,MAAM,CAAC,GAAG,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC;YACtD,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;YAClB,MAAM;QACR,KAAK,GAAG;YACN,MAAM,CAAC,GAAG,GAAG,cAAc,CAAC,MAAM,CAAC,GAAG,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC;YACtD,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;YAClB,MAAM;QACR,KAAK,GAAG;YACN,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;YAC9D,MAAM;QACR,KAAK,GAAG,CAAC;QACT,KAAK,GAAG;YACN,MAAM,CAAC,GAAG,GAAG,cAAc,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;YACvD,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACxE,MAAM;IACV,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,GAAW,EAAE,IAAY;IAC/C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACjE,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;AAC9C,CAAC"}
@@ -2,10 +2,29 @@ export interface PromptVisualLine {
2
2
  logicalIndex: number;
3
3
  wrapIndex: number;
4
4
  content: string;
5
+ start: number;
6
+ end: number;
5
7
  }
8
+ export interface PromptInputViewport {
9
+ lines: PromptVisualLine[];
10
+ hiddenRows: number;
11
+ showHiddenIndicator: boolean;
12
+ cursorLineIndex: number;
13
+ cursorColumn: number;
14
+ rowsUpFromPromptBottom: number;
15
+ }
16
+ export declare const PROMPT_CURSOR_GLYPH = "\u258C";
6
17
  export declare function promptContentWidth(width: number): number;
7
18
  export declare function promptTextWidth(width: number): number;
8
19
  export declare function splitByVisualWidth(text: string, maxWidth: number): string[];
9
20
  export declare function getPromptVisualLines(value: string, width: number): PromptVisualLine[];
10
- export declare function formatPromptVisualLine(visualLine: PromptVisualLine, width: number): string;
21
+ export declare function getVisiblePromptVisualLines(value: string, width: number, maxRows: number): {
22
+ lines: PromptVisualLine[];
23
+ hiddenRows: number;
24
+ };
25
+ export declare function getPromptInputViewport(value: string, width: number, maxRows: number, cursor?: number): PromptInputViewport;
26
+ export declare function formatPromptVisualLine(visualLine: PromptVisualLine, width: number, options?: {
27
+ showCursor?: boolean;
28
+ cursorOffset?: number;
29
+ }): string;
11
30
  //# sourceMappingURL=prompt-layout.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"prompt-layout.d.ts","sourceRoot":"","sources":["../../../src/ink-ui/runtime/prompt-layout.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAkB3E;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAWrF;AAED,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAK1F"}
1
+ {"version":3,"file":"prompt-layout.d.ts","sourceRoot":"","sources":["../../../src/ink-ui/runtime/prompt-layout.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAOD,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,sBAAsB,EAAE,MAAM,CAAC;CAChC;AAED,eAAO,MAAM,mBAAmB,WAAM,CAAC;AAEvC,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAkB3E;AAyBD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAErF;AAED,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd;IAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAYnD;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,MAAqB,GAC5B,mBAAmB,CA6BrB;AA+DD,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,gBAAgB,EAC5B,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAO,GAC5D,MAAM,CAoBR"}
@@ -3,12 +3,17 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.PROMPT_CURSOR_GLYPH = void 0;
6
7
  exports.promptContentWidth = promptContentWidth;
7
8
  exports.promptTextWidth = promptTextWidth;
8
9
  exports.splitByVisualWidth = splitByVisualWidth;
9
10
  exports.getPromptVisualLines = getPromptVisualLines;
11
+ exports.getVisiblePromptVisualLines = getVisiblePromptVisualLines;
12
+ exports.getPromptInputViewport = getPromptInputViewport;
10
13
  exports.formatPromptVisualLine = formatPromptVisualLine;
11
14
  const string_width_1 = __importDefault(require("string-width"));
15
+ const grapheme_1 = require("./grapheme");
16
+ exports.PROMPT_CURSOR_GLYPH = '▌';
12
17
  function promptContentWidth(width) {
13
18
  return Math.max(1, width - 4);
14
19
  }
@@ -20,11 +25,11 @@ function splitByVisualWidth(text, maxWidth) {
20
25
  return [''];
21
26
  const chunks = [];
22
27
  let current = '';
23
- for (const char of text) {
24
- const next = `${current}${char}`;
28
+ for (const part of (0, grapheme_1.segmentGraphemes)(text)) {
29
+ const next = `${current}${part.segment}`;
25
30
  if (current && (0, string_width_1.default)(next) > maxWidth) {
26
31
  chunks.push(current);
27
- current = char;
32
+ current = part.segment;
28
33
  }
29
34
  else {
30
35
  current = next;
@@ -33,18 +38,131 @@ function splitByVisualWidth(text, maxWidth) {
33
38
  chunks.push(current);
34
39
  return chunks;
35
40
  }
41
+ function splitByVisualWidthWithOffsets(text, maxWidth) {
42
+ if (text.length === 0)
43
+ return [{ content: '', start: 0, end: 0 }];
44
+ const chunks = [];
45
+ let current = '';
46
+ let currentStart = 0;
47
+ for (const part of (0, grapheme_1.segmentGraphemes)(text)) {
48
+ const next = `${current}${part.segment}`;
49
+ const nextOffset = part.index + part.segment.length;
50
+ if (current && (0, string_width_1.default)(next) > maxWidth) {
51
+ chunks.push({ content: current, start: currentStart, end: part.index });
52
+ current = part.segment;
53
+ currentStart = part.index;
54
+ }
55
+ else {
56
+ current = next;
57
+ }
58
+ }
59
+ chunks.push({ content: current, start: currentStart, end: text.length });
60
+ return chunks;
61
+ }
36
62
  function getPromptVisualLines(value, width) {
37
- const lines = value.length > 0 ? value.split('\n') : [''];
63
+ return buildPromptVisualLines(value, width).lines;
64
+ }
65
+ function getVisiblePromptVisualLines(value, width, maxRows) {
66
+ const lines = getPromptVisualLines(value, width);
67
+ const rowLimit = Math.max(1, maxRows);
68
+ if (lines.length <= rowLimit) {
69
+ return { lines, hiddenRows: 0 };
70
+ }
71
+ return {
72
+ lines: lines.slice(-rowLimit),
73
+ hiddenRows: lines.length - rowLimit,
74
+ };
75
+ }
76
+ function getPromptInputViewport(value, width, maxRows, cursor = value.length) {
77
+ const layout = buildPromptVisualLines(value, width, cursor);
78
+ const allLines = layout.lines;
79
+ const rowLimit = Math.max(1, maxRows);
80
+ const showHiddenIndicator = allLines.length > rowLimit && rowLimit > 1;
81
+ const visibleInputRows = showHiddenIndicator ? rowLimit - 1 : rowLimit;
82
+ const start = allLines.length <= visibleInputRows
83
+ ? 0
84
+ : Math.min(Math.max(0, layout.cursorLineIndex - visibleInputRows + 1), allLines.length - visibleInputRows);
85
+ const lines = allLines.slice(start, start + visibleInputRows);
86
+ const indicatorRows = showHiddenIndicator ? 1 : 0;
87
+ const cursorLineIndex = indicatorRows + Math.max(0, layout.cursorLineIndex - start);
88
+ const contentRows = indicatorRows + lines.length;
89
+ return {
90
+ lines,
91
+ hiddenRows: allLines.length - lines.length,
92
+ showHiddenIndicator,
93
+ cursorLineIndex,
94
+ cursorColumn: layout.cursorColumn,
95
+ // Ink leaves the terminal cursor after the prompt box has been rendered,
96
+ // below the bottom border. Native IME candidate windows follow that real
97
+ // terminal cursor, so include the bottom border row when parking it on the
98
+ // active input text row.
99
+ rowsUpFromPromptBottom: Math.max(1, contentRows - cursorLineIndex + 1),
100
+ };
101
+ }
102
+ function buildPromptVisualLines(value, width, cursor = value.length) {
103
+ const logicalLines = value.length > 0 ? value.split('\n') : [''];
38
104
  const maxTextWidth = promptTextWidth(width);
39
- return lines.flatMap((line, logicalIndex) => splitByVisualWidth(line, maxTextWidth).map((content, wrapIndex) => ({
40
- logicalIndex,
41
- wrapIndex,
42
- content,
43
- })));
105
+ const clampedCursor = Math.min(Math.max(0, cursor), value.length);
106
+ const visualLines = [];
107
+ let cursorLineIndex = 0;
108
+ let cursorColumn = 5;
109
+ let lineStart = 0;
110
+ logicalLines.forEach((line, logicalIndex) => {
111
+ const chunks = splitByVisualWidthWithOffsets(line, maxTextWidth);
112
+ const lineEnd = lineStart + line.length;
113
+ const cursorInThisLine = clampedCursor >= lineStart && clampedCursor <= lineEnd;
114
+ chunks.forEach((chunk, wrapIndex) => {
115
+ const visualLine = {
116
+ logicalIndex,
117
+ wrapIndex,
118
+ content: chunk.content,
119
+ start: lineStart + chunk.start,
120
+ end: lineStart + chunk.end,
121
+ chunkStart: chunk.start,
122
+ chunkEnd: chunk.end,
123
+ };
124
+ if (cursorInThisLine && clampedCursor - lineStart >= chunk.start && clampedCursor - lineStart <= chunk.end) {
125
+ cursorLineIndex = visualLines.length;
126
+ const cursorInChunk = Math.max(0, clampedCursor - lineStart - chunk.start);
127
+ cursorColumn = 5 + (0, string_width_1.default)(chunk.content.slice(0, cursorInChunk));
128
+ }
129
+ visualLines.push(visualLine);
130
+ });
131
+ lineStart = lineEnd + 1;
132
+ });
133
+ return {
134
+ lines: visualLines,
135
+ cursorLineIndex,
136
+ cursorColumn,
137
+ };
138
+ }
139
+ function takeVisualWidth(text, maxWidth) {
140
+ if (maxWidth <= 0)
141
+ return '';
142
+ let result = '';
143
+ for (const part of (0, grapheme_1.segmentGraphemes)(text)) {
144
+ const next = `${result}${part.segment}`;
145
+ if ((0, string_width_1.default)(next) > maxWidth)
146
+ break;
147
+ result = next;
148
+ }
149
+ return result;
44
150
  }
45
- function formatPromptVisualLine(visualLine, width) {
151
+ function formatPromptVisualLine(visualLine, width, options = {}) {
46
152
  const prefix = visualLine.logicalIndex === 0 && visualLine.wrapIndex === 0 ? '› ' : ' ';
47
- const raw = `${prefix}${visualLine.content}`;
153
+ const maxContentWidth = Math.max(1, promptContentWidth(width) - (0, string_width_1.default)(prefix));
154
+ let content = visualLine.content;
155
+ if (options.showCursor) {
156
+ const requestedOffset = Math.min(Math.max(0, options.cursorOffset ?? content.length), content.length);
157
+ const offset = (0, grapheme_1.floorGraphemeBoundary)(content, requestedOffset);
158
+ const before = content.slice(0, offset);
159
+ const after = content.slice(offset);
160
+ const beforeWithCursor = `${before}${exports.PROMPT_CURSOR_GLYPH}`;
161
+ content = (0, string_width_1.default)(beforeWithCursor) >= maxContentWidth
162
+ ? `${takeVisualWidth(before, maxContentWidth - (0, string_width_1.default)(exports.PROMPT_CURSOR_GLYPH))}${exports.PROMPT_CURSOR_GLYPH}`
163
+ : `${beforeWithCursor}${takeVisualWidth(after, maxContentWidth - (0, string_width_1.default)(beforeWithCursor))}`;
164
+ }
165
+ const raw = `${prefix}${content}`;
48
166
  const padding = Math.max(0, promptContentWidth(width) - (0, string_width_1.default)(raw));
49
167
  return raw + ' '.repeat(padding);
50
168
  }