openhorse 0.2.2 → 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 (215) 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/NativeCursor.d.ts +12 -0
  24. package/dist/ink-ui/components/NativeCursor.d.ts.map +1 -0
  25. package/dist/ink-ui/components/NativeCursor.js +35 -0
  26. package/dist/ink-ui/components/NativeCursor.js.map +1 -0
  27. package/dist/ink-ui/components/PromptInput.d.ts +5 -1
  28. package/dist/ink-ui/components/PromptInput.d.ts.map +1 -1
  29. package/dist/ink-ui/components/PromptInput.js +10 -6
  30. package/dist/ink-ui/components/PromptInput.js.map +1 -1
  31. package/dist/ink-ui/components/RunningHorseIndicator.d.ts +1 -1
  32. package/dist/ink-ui/components/RunningHorseIndicator.d.ts.map +1 -1
  33. package/dist/ink-ui/components/RunningHorseIndicator.js +3 -41
  34. package/dist/ink-ui/components/RunningHorseIndicator.js.map +1 -1
  35. package/dist/ink-ui/components/SelectList.d.ts +2 -1
  36. package/dist/ink-ui/components/SelectList.d.ts.map +1 -1
  37. package/dist/ink-ui/components/SelectList.js +26 -11
  38. package/dist/ink-ui/components/SelectList.js.map +1 -1
  39. package/dist/ink-ui/components/StatusLine.d.ts.map +1 -1
  40. package/dist/ink-ui/components/StatusLine.js +22 -31
  41. package/dist/ink-ui/components/StatusLine.js.map +1 -1
  42. package/dist/ink-ui/components/TerminalCursor.d.ts +4 -2
  43. package/dist/ink-ui/components/TerminalCursor.d.ts.map +1 -1
  44. package/dist/ink-ui/components/TerminalCursor.js +18 -43
  45. package/dist/ink-ui/components/TerminalCursor.js.map +1 -1
  46. package/dist/ink-ui/components/ToolActivity.d.ts +17 -0
  47. package/dist/ink-ui/components/ToolActivity.d.ts.map +1 -0
  48. package/dist/ink-ui/components/ToolActivity.js +107 -0
  49. package/dist/ink-ui/components/ToolActivity.js.map +1 -0
  50. package/dist/ink-ui/components/Transcript.d.ts +7 -1
  51. package/dist/ink-ui/components/Transcript.d.ts.map +1 -1
  52. package/dist/ink-ui/components/Transcript.js +40 -3
  53. package/dist/ink-ui/components/Transcript.js.map +1 -1
  54. package/dist/ink-ui/controllers/chat-controller.d.ts +1 -33
  55. package/dist/ink-ui/controllers/chat-controller.d.ts.map +1 -1
  56. package/dist/ink-ui/controllers/chat-controller.js +15 -437
  57. package/dist/ink-ui/controllers/chat-controller.js.map +1 -1
  58. package/dist/ink-ui/hooks/use-raw-input-bridge.d.ts +6 -0
  59. package/dist/ink-ui/hooks/use-raw-input-bridge.d.ts.map +1 -0
  60. package/dist/ink-ui/hooks/use-raw-input-bridge.js +27 -0
  61. package/dist/ink-ui/hooks/use-raw-input-bridge.js.map +1 -0
  62. package/dist/ink-ui/hooks/use-terminal-size.d.ts +7 -0
  63. package/dist/ink-ui/hooks/use-terminal-size.d.ts.map +1 -0
  64. package/dist/ink-ui/hooks/use-terminal-size.js +34 -0
  65. package/dist/ink-ui/hooks/use-terminal-size.js.map +1 -0
  66. package/dist/ink-ui/launch.d.ts +6 -0
  67. package/dist/ink-ui/launch.d.ts.map +1 -1
  68. package/dist/ink-ui/launch.js +60 -2
  69. package/dist/ink-ui/launch.js.map +1 -1
  70. package/dist/ink-ui/runtime/grapheme.d.ts +9 -0
  71. package/dist/ink-ui/runtime/grapheme.d.ts.map +1 -0
  72. package/dist/ink-ui/runtime/grapheme.js +63 -0
  73. package/dist/ink-ui/runtime/grapheme.js.map +1 -0
  74. package/dist/ink-ui/runtime/input-buffer.d.ts +32 -0
  75. package/dist/ink-ui/runtime/input-buffer.d.ts.map +1 -0
  76. package/dist/ink-ui/runtime/input-buffer.js +165 -0
  77. package/dist/ink-ui/runtime/input-buffer.js.map +1 -0
  78. package/dist/ink-ui/runtime/layout-budget.d.ts +13 -0
  79. package/dist/ink-ui/runtime/layout-budget.d.ts.map +1 -0
  80. package/dist/ink-ui/runtime/layout-budget.js +25 -0
  81. package/dist/ink-ui/runtime/layout-budget.js.map +1 -0
  82. package/dist/ink-ui/runtime/native-cursor.d.ts +62 -0
  83. package/dist/ink-ui/runtime/native-cursor.d.ts.map +1 -0
  84. package/dist/ink-ui/runtime/native-cursor.js +423 -0
  85. package/dist/ink-ui/runtime/native-cursor.js.map +1 -0
  86. package/dist/ink-ui/runtime/prompt-layout.d.ts +20 -1
  87. package/dist/ink-ui/runtime/prompt-layout.d.ts.map +1 -1
  88. package/dist/ink-ui/runtime/prompt-layout.js +129 -11
  89. package/dist/ink-ui/runtime/prompt-layout.js.map +1 -1
  90. package/dist/ink-ui/runtime/raw-input.d.ts +4 -0
  91. package/dist/ink-ui/runtime/raw-input.d.ts.map +1 -0
  92. package/dist/ink-ui/runtime/raw-input.js +15 -0
  93. package/dist/ink-ui/runtime/raw-input.js.map +1 -0
  94. package/dist/ink-ui/runtime/stdout.d.ts +11 -0
  95. package/dist/ink-ui/runtime/stdout.d.ts.map +1 -0
  96. package/dist/ink-ui/runtime/stdout.js +82 -0
  97. package/dist/ink-ui/runtime/stdout.js.map +1 -0
  98. package/dist/ink-ui/runtime/transcript-state.d.ts +37 -0
  99. package/dist/ink-ui/runtime/transcript-state.d.ts.map +1 -0
  100. package/dist/ink-ui/runtime/transcript-state.js +89 -0
  101. package/dist/ink-ui/runtime/transcript-state.js.map +1 -0
  102. package/dist/ink-ui/screens/ReplScreen.d.ts +8 -2
  103. package/dist/ink-ui/screens/ReplScreen.d.ts.map +1 -1
  104. package/dist/ink-ui/screens/ReplScreen.js +247 -151
  105. package/dist/ink-ui/screens/ReplScreen.js.map +1 -1
  106. package/dist/ink-ui/types.d.ts +1 -42
  107. package/dist/ink-ui/types.d.ts.map +1 -1
  108. package/dist/ink-ui/types.js +15 -0
  109. package/dist/ink-ui/types.js.map +1 -1
  110. package/dist/print-ui/launch.d.ts +8 -0
  111. package/dist/print-ui/launch.d.ts.map +1 -0
  112. package/dist/print-ui/launch.js +205 -0
  113. package/dist/print-ui/launch.js.map +1 -0
  114. package/dist/runtime/agent-runtime-controller.d.ts +69 -0
  115. package/dist/runtime/agent-runtime-controller.d.ts.map +1 -0
  116. package/dist/runtime/agent-runtime-controller.js +225 -0
  117. package/dist/runtime/agent-runtime-controller.js.map +1 -0
  118. package/dist/runtime/agent-runtime-protocol.d.ts +90 -0
  119. package/dist/runtime/agent-runtime-protocol.d.ts.map +1 -0
  120. package/dist/runtime/agent-runtime-protocol.js +80 -0
  121. package/dist/runtime/agent-runtime-protocol.js.map +1 -0
  122. package/dist/runtime/chat-controller.d.ts +41 -0
  123. package/dist/runtime/chat-controller.d.ts.map +1 -0
  124. package/dist/runtime/chat-controller.js +577 -0
  125. package/dist/runtime/chat-controller.js.map +1 -0
  126. package/dist/runtime/ui-events.d.ts +59 -0
  127. package/dist/runtime/ui-events.d.ts.map +1 -0
  128. package/dist/runtime/ui-events.js +3 -0
  129. package/dist/runtime/ui-events.js.map +1 -0
  130. package/dist/services/commit-plan.d.ts +17 -0
  131. package/dist/services/commit-plan.d.ts.map +1 -0
  132. package/dist/services/commit-plan.js +161 -0
  133. package/dist/services/commit-plan.js.map +1 -0
  134. package/dist/services/config.d.ts +3 -2
  135. package/dist/services/config.d.ts.map +1 -1
  136. package/dist/services/config.js +7 -6
  137. package/dist/services/config.js.map +1 -1
  138. package/dist/services/doctor.d.ts +33 -0
  139. package/dist/services/doctor.d.ts.map +1 -0
  140. package/dist/services/doctor.js +211 -0
  141. package/dist/services/doctor.js.map +1 -0
  142. package/dist/services/file-context.d.ts +21 -0
  143. package/dist/services/file-context.d.ts.map +1 -0
  144. package/dist/services/file-context.js +194 -0
  145. package/dist/services/file-context.js.map +1 -0
  146. package/dist/services/global-config.d.ts +1 -1
  147. package/dist/services/global-config.d.ts.map +1 -1
  148. package/dist/services/project-instructions.d.ts +16 -0
  149. package/dist/services/project-instructions.d.ts.map +1 -0
  150. package/dist/services/project-instructions.js +135 -0
  151. package/dist/services/project-instructions.js.map +1 -0
  152. package/dist/services/prompt-context.d.ts +3 -0
  153. package/dist/services/prompt-context.d.ts.map +1 -0
  154. package/dist/services/prompt-context.js +13 -0
  155. package/dist/services/prompt-context.js.map +1 -0
  156. package/dist/services/session-storage.d.ts +3 -0
  157. package/dist/services/session-storage.d.ts.map +1 -1
  158. package/dist/services/session-storage.js +11 -0
  159. package/dist/services/session-storage.js.map +1 -1
  160. package/dist/services/workspace-diff.d.ts +27 -0
  161. package/dist/services/workspace-diff.d.ts.map +1 -0
  162. package/dist/services/workspace-diff.js +129 -0
  163. package/dist/services/workspace-diff.js.map +1 -0
  164. package/dist/terminal-ui/completion.d.ts +6 -0
  165. package/dist/terminal-ui/completion.d.ts.map +1 -0
  166. package/dist/terminal-ui/completion.js +80 -0
  167. package/dist/terminal-ui/completion.js.map +1 -0
  168. package/dist/terminal-ui/editor.d.ts +17 -0
  169. package/dist/terminal-ui/editor.d.ts.map +1 -0
  170. package/dist/terminal-ui/editor.js +42 -0
  171. package/dist/terminal-ui/editor.js.map +1 -0
  172. package/dist/terminal-ui/launch.d.ts +23 -0
  173. package/dist/terminal-ui/launch.d.ts.map +1 -0
  174. package/dist/terminal-ui/launch.js +567 -0
  175. package/dist/terminal-ui/launch.js.map +1 -0
  176. package/dist/terminal-ui/raw-editor.d.ts +57 -0
  177. package/dist/terminal-ui/raw-editor.d.ts.map +1 -0
  178. package/dist/terminal-ui/raw-editor.js +339 -0
  179. package/dist/terminal-ui/raw-editor.js.map +1 -0
  180. package/dist/tools/index.d.ts.map +1 -1
  181. package/dist/tools/index.js +61 -19
  182. package/dist/tools/index.js.map +1 -1
  183. package/dist/tui-core/frame.d.ts +25 -0
  184. package/dist/tui-core/frame.d.ts.map +1 -0
  185. package/dist/tui-core/frame.js +104 -0
  186. package/dist/tui-core/frame.js.map +1 -0
  187. package/dist/tui-core/input-parser.d.ts +25 -0
  188. package/dist/tui-core/input-parser.d.ts.map +1 -0
  189. package/dist/tui-core/input-parser.js +207 -0
  190. package/dist/tui-core/input-parser.js.map +1 -0
  191. package/dist/tui-core/terminal-writer.d.ts +34 -0
  192. package/dist/tui-core/terminal-writer.d.ts.map +1 -0
  193. package/dist/tui-core/terminal-writer.js +92 -0
  194. package/dist/tui-core/terminal-writer.js.map +1 -0
  195. package/dist/tui-ui/launch.d.ts +7 -0
  196. package/dist/tui-ui/launch.d.ts.map +1 -0
  197. package/dist/tui-ui/launch.js +194 -0
  198. package/dist/tui-ui/launch.js.map +1 -0
  199. package/dist/tui-ui/layout.d.ts +9 -0
  200. package/dist/tui-ui/layout.d.ts.map +1 -0
  201. package/dist/tui-ui/layout.js +239 -0
  202. package/dist/tui-ui/layout.js.map +1 -0
  203. package/dist/tui-ui/pickers.d.ts +13 -0
  204. package/dist/tui-ui/pickers.d.ts.map +1 -0
  205. package/dist/tui-ui/pickers.js +79 -0
  206. package/dist/tui-ui/pickers.js.map +1 -0
  207. package/dist/tui-ui/runner.d.ts +43 -0
  208. package/dist/tui-ui/runner.d.ts.map +1 -0
  209. package/dist/tui-ui/runner.js +387 -0
  210. package/dist/tui-ui/runner.js.map +1 -0
  211. package/dist/tui-ui/state.d.ts +106 -0
  212. package/dist/tui-ui/state.d.ts.map +1 -0
  213. package/dist/tui-ui/state.js +202 -0
  214. package/dist/tui-ui/state.js.map +1 -0
  215. package/package.json +1 -1
@@ -3,12 +3,70 @@ 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.prepareInkStdin = prepareInkStdin;
6
7
  exports.launchInkUI = launchInkUI;
7
8
  const react_1 = __importDefault(require("react"));
8
9
  const ink_1 = require("ink");
9
10
  const App_1 = require("./App");
11
+ const native_cursor_1 = require("./runtime/native-cursor");
12
+ function prepareInkStdin(stdin = process.stdin) {
13
+ if (!stdin.isTTY || typeof stdin.setRawMode !== 'function') {
14
+ return () => undefined;
15
+ }
16
+ const wasRaw = stdin.isRaw === true;
17
+ stdin.setEncoding('utf8');
18
+ stdin.resume();
19
+ stdin.setRawMode(true);
20
+ return () => {
21
+ if (!stdin.isTTY || typeof stdin.setRawMode !== 'function')
22
+ return;
23
+ stdin.setRawMode(wasRaw);
24
+ if (wasRaw)
25
+ stdin.resume();
26
+ };
27
+ }
10
28
  async function launchInkUI(runtime) {
11
- const instance = (0, ink_1.render)(react_1.default.createElement(App_1.App, { runtime: runtime }), { exitOnCtrlC: false });
12
- await instance.waitUntilExit();
29
+ const restoreStdin = prepareInkStdin(process.stdin);
30
+ const cursorController = (0, native_cursor_1.createNativeCursorController)(process.stdout);
31
+ let resizeEpoch = 0;
32
+ let resizeTimer;
33
+ const viewportReset = '\x1b[2J\x1b[H';
34
+ const app = () => react_1.default.createElement(App_1.App, { runtime: runtime, cursorController: cursorController, resizeEpoch: resizeEpoch });
35
+ const instance = (0, ink_1.render)(app(), {
36
+ exitOnCtrlC: false,
37
+ stdout: cursorController.wrapStdout(),
38
+ });
39
+ const handleResize = () => {
40
+ resizeEpoch += 1;
41
+ if (resizeTimer)
42
+ clearTimeout(resizeTimer);
43
+ cursorController.resetForViewportClear();
44
+ instance.clear();
45
+ if (process.stdout.isTTY) {
46
+ process.stdout.write(viewportReset);
47
+ }
48
+ cursorController.resetForViewportClear();
49
+ resizeTimer = setTimeout(() => {
50
+ cursorController.resetForViewportClear();
51
+ instance.rerender(app());
52
+ }, 16);
53
+ };
54
+ if (typeof process.stdout.prependListener === 'function') {
55
+ process.stdout.prependListener('resize', handleResize);
56
+ }
57
+ else {
58
+ process.stdout.on?.('resize', handleResize);
59
+ }
60
+ try {
61
+ await instance.waitUntilExit();
62
+ }
63
+ finally {
64
+ process.stdout.off?.('resize', handleResize);
65
+ if (resizeTimer)
66
+ clearTimeout(resizeTimer);
67
+ cursorController.disable();
68
+ instance.clear();
69
+ restoreStdin();
70
+ }
13
71
  }
14
72
  //# sourceMappingURL=launch.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"launch.js","sourceRoot":"","sources":["../../src/ink-ui/launch.tsx"],"names":[],"mappings":";;;;;AAKA,kCAGC;AARD,kDAA0B;AAC1B,6BAA6B;AAC7B,+BAA4B;AAGrB,KAAK,UAAU,WAAW,CAAC,OAA4B;IAC5D,MAAM,QAAQ,GAAG,IAAA,YAAM,EAAC,8BAAC,SAAG,IAAC,OAAO,EAAE,OAAO,GAAI,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3E,MAAM,QAAQ,CAAC,aAAa,EAAE,CAAC;AACjC,CAAC"}
1
+ {"version":3,"file":"launch.js","sourceRoot":"","sources":["../../src/ink-ui/launch.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export interface GraphemeSegment {
2
+ segment: string;
3
+ index: number;
4
+ }
5
+ export declare function segmentGraphemes(value: string): GraphemeSegment[];
6
+ export declare function previousGraphemeBoundary(value: string, cursor: number): number;
7
+ export declare function nextGraphemeBoundary(value: string, cursor: number): number;
8
+ export declare function floorGraphemeBoundary(value: string, cursor: number): number;
9
+ //# sourceMappingURL=grapheme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grapheme.d.ts","sourceRoot":"","sources":["../../../src/ink-ui/runtime/grapheme.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AASD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,EAAE,CAoBjE;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAU9E;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAU1E;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAa3E"}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.segmentGraphemes = segmentGraphemes;
4
+ exports.previousGraphemeBoundary = previousGraphemeBoundary;
5
+ exports.nextGraphemeBoundary = nextGraphemeBoundary;
6
+ exports.floorGraphemeBoundary = floorGraphemeBoundary;
7
+ function segmentGraphemes(value) {
8
+ const SegmenterCtor = Intl.Segmenter;
9
+ if (typeof SegmenterCtor === 'function') {
10
+ try {
11
+ return Array.from(new SegmenterCtor(undefined, { granularity: 'grapheme' }).segment(value));
12
+ }
13
+ catch {
14
+ // Fall back to code point segmentation below.
15
+ }
16
+ }
17
+ const segments = [];
18
+ for (let index = 0; index < value.length;) {
19
+ const codePoint = value.codePointAt(index);
20
+ const segment = codePoint === undefined ? '' : String.fromCodePoint(codePoint);
21
+ if (!segment)
22
+ break;
23
+ segments.push({ segment, index });
24
+ index += segment.length;
25
+ }
26
+ return segments;
27
+ }
28
+ function previousGraphemeBoundary(value, cursor) {
29
+ const current = Math.min(Math.max(0, Math.floor(cursor)), value.length);
30
+ let previous = 0;
31
+ for (const part of segmentGraphemes(value)) {
32
+ if (part.index >= current)
33
+ break;
34
+ previous = part.index;
35
+ }
36
+ return previous;
37
+ }
38
+ function nextGraphemeBoundary(value, cursor) {
39
+ const current = Math.min(Math.max(0, Math.floor(cursor)), value.length);
40
+ if (current >= value.length)
41
+ return value.length;
42
+ for (const part of segmentGraphemes(value)) {
43
+ const end = part.index + part.segment.length;
44
+ if (end > current)
45
+ return end;
46
+ }
47
+ return value.length;
48
+ }
49
+ function floorGraphemeBoundary(value, cursor) {
50
+ const current = Math.min(Math.max(0, Math.floor(cursor)), value.length);
51
+ if (current >= value.length)
52
+ return value.length;
53
+ for (const part of segmentGraphemes(value)) {
54
+ const end = part.index + part.segment.length;
55
+ if (current < part.index)
56
+ break;
57
+ if (current <= end) {
58
+ return current === end ? end : part.index;
59
+ }
60
+ }
61
+ return value.length;
62
+ }
63
+ //# sourceMappingURL=grapheme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grapheme.js","sourceRoot":"","sources":["../../../src/ink-ui/runtime/grapheme.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ export interface InputBuffer {
2
+ value: string;
3
+ cursor: number;
4
+ }
5
+ export type InputBufferAction = {
6
+ type: 'insert';
7
+ text: string;
8
+ } | {
9
+ type: 'inputChunk';
10
+ text: string;
11
+ } | {
12
+ type: 'backspace';
13
+ } | {
14
+ type: 'delete';
15
+ } | {
16
+ type: 'move';
17
+ direction: 'left' | 'right' | 'home' | 'end';
18
+ } | {
19
+ type: 'set';
20
+ value: string;
21
+ cursor?: number;
22
+ } | {
23
+ type: 'clear';
24
+ };
25
+ export declare const initialInputBuffer: InputBuffer;
26
+ export declare function reduceInputBuffer(state: InputBuffer, action: InputBufferAction): InputBuffer;
27
+ export declare function reduceInputChunk(state: InputBuffer, text: string): InputBuffer;
28
+ export declare function clampInputCursor(value: string, cursor: number): number;
29
+ export declare function moveInputCursor(value: string, cursor: number, direction: Extract<InputBufferAction, {
30
+ type: 'move';
31
+ }>['direction']): number;
32
+ //# sourceMappingURL=input-buffer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-buffer.d.ts","sourceRoot":"","sources":["../../../src/ink-ui/runtime/input-buffer.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,iBAAiB,GACzB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GACrB;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,CAAA;CAAE,GAC9D;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAEtB,eAAO,MAAM,kBAAkB,EAAE,WAGhC,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,iBAAiB,GAAG,WAAW,CAoD5F;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAwF9E;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAGtE;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,OAAO,CAAC,iBAAiB,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,WAAW,CAAC,GACnE,MAAM,CAaR"}
@@ -0,0 +1,165 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.initialInputBuffer = void 0;
4
+ exports.reduceInputBuffer = reduceInputBuffer;
5
+ exports.reduceInputChunk = reduceInputChunk;
6
+ exports.clampInputCursor = clampInputCursor;
7
+ exports.moveInputCursor = moveInputCursor;
8
+ const grapheme_1 = require("./grapheme");
9
+ exports.initialInputBuffer = {
10
+ value: '',
11
+ cursor: 0,
12
+ };
13
+ function reduceInputBuffer(state, action) {
14
+ switch (action.type) {
15
+ case 'insert': {
16
+ if (!action.text)
17
+ return state;
18
+ const cursor = clampInputCursor(state.value, state.cursor);
19
+ const value = state.value.slice(0, cursor) + action.text + state.value.slice(cursor);
20
+ return {
21
+ value,
22
+ cursor: cursor + action.text.length,
23
+ };
24
+ }
25
+ case 'inputChunk':
26
+ return reduceInputChunk(state, action.text);
27
+ case 'backspace': {
28
+ const cursor = clampInputCursor(state.value, state.cursor);
29
+ if (cursor === 0)
30
+ return { ...state, cursor };
31
+ const previous = previousCursorPosition(state.value, cursor);
32
+ return {
33
+ value: state.value.slice(0, previous) + state.value.slice(cursor),
34
+ cursor: previous,
35
+ };
36
+ }
37
+ case 'delete': {
38
+ const cursor = clampInputCursor(state.value, state.cursor);
39
+ if (cursor >= state.value.length)
40
+ return { ...state, cursor };
41
+ const next = nextCursorPosition(state.value, cursor);
42
+ return {
43
+ value: state.value.slice(0, cursor) + state.value.slice(next),
44
+ cursor,
45
+ };
46
+ }
47
+ case 'move':
48
+ return {
49
+ ...state,
50
+ cursor: moveInputCursor(state.value, state.cursor, action.direction),
51
+ };
52
+ case 'set': {
53
+ const cursor = action.cursor ?? action.value.length;
54
+ return {
55
+ value: action.value,
56
+ cursor: clampInputCursor(action.value, cursor),
57
+ };
58
+ }
59
+ case 'clear':
60
+ return exports.initialInputBuffer;
61
+ }
62
+ }
63
+ function reduceInputChunk(state, text) {
64
+ let next = state;
65
+ let buffer = '';
66
+ const flush = () => {
67
+ if (!buffer)
68
+ return;
69
+ next = reduceInputBuffer(next, { type: 'insert', text: buffer });
70
+ buffer = '';
71
+ };
72
+ for (let index = 0; index < text.length;) {
73
+ const slice = text.slice(index);
74
+ if (slice.startsWith('\x1b[200~')) {
75
+ flush();
76
+ index += '\x1b[200~'.length;
77
+ continue;
78
+ }
79
+ if (slice.startsWith('\x1b[201~')) {
80
+ flush();
81
+ index += '\x1b[201~'.length;
82
+ continue;
83
+ }
84
+ if (slice.startsWith('\x1b[D')) {
85
+ flush();
86
+ next = reduceInputBuffer(next, { type: 'move', direction: 'left' });
87
+ index += 3;
88
+ continue;
89
+ }
90
+ if (slice.startsWith('\x1b[C')) {
91
+ flush();
92
+ next = reduceInputBuffer(next, { type: 'move', direction: 'right' });
93
+ index += 3;
94
+ continue;
95
+ }
96
+ if (slice.startsWith('\x1b[H') || slice.startsWith('\x1b[1~')) {
97
+ flush();
98
+ next = reduceInputBuffer(next, { type: 'move', direction: 'home' });
99
+ index += slice.startsWith('\x1b[H') ? 3 : 4;
100
+ continue;
101
+ }
102
+ if (slice.startsWith('\x1b[F') || slice.startsWith('\x1b[4~')) {
103
+ flush();
104
+ next = reduceInputBuffer(next, { type: 'move', direction: 'end' });
105
+ index += slice.startsWith('\x1b[F') ? 3 : 4;
106
+ continue;
107
+ }
108
+ if (slice.startsWith('\x1b[3~')) {
109
+ flush();
110
+ next = reduceInputBuffer(next, { type: 'delete' });
111
+ index += 4;
112
+ continue;
113
+ }
114
+ if (slice.startsWith('\x7f') || slice.startsWith('\x08')) {
115
+ flush();
116
+ next = reduceInputBuffer(next, { type: 'backspace' });
117
+ index += 1;
118
+ continue;
119
+ }
120
+ if (slice.startsWith('\x15')) {
121
+ flush();
122
+ next = reduceInputBuffer(next, { type: 'clear' });
123
+ index += 1;
124
+ continue;
125
+ }
126
+ const codePoint = text.codePointAt(index);
127
+ if (codePoint === undefined)
128
+ break;
129
+ const char = String.fromCodePoint(codePoint);
130
+ if (codePoint < 32 && char !== '\n' && char !== '\t') {
131
+ flush();
132
+ index += char.length;
133
+ continue;
134
+ }
135
+ buffer += char;
136
+ index += char.length;
137
+ }
138
+ flush();
139
+ return next;
140
+ }
141
+ function clampInputCursor(value, cursor) {
142
+ if (!Number.isFinite(cursor))
143
+ return value.length;
144
+ return Math.min(Math.max(0, Math.floor(cursor)), value.length);
145
+ }
146
+ function moveInputCursor(value, cursor, direction) {
147
+ const current = clampInputCursor(value, cursor);
148
+ switch (direction) {
149
+ case 'left':
150
+ return previousCursorPosition(value, current);
151
+ case 'right':
152
+ return nextCursorPosition(value, current);
153
+ case 'home':
154
+ return 0;
155
+ case 'end':
156
+ return value.length;
157
+ }
158
+ }
159
+ function previousCursorPosition(value, cursor) {
160
+ return (0, grapheme_1.previousGraphemeBoundary)(value, cursor);
161
+ }
162
+ function nextCursorPosition(value, cursor) {
163
+ return (0, grapheme_1.nextGraphemeBoundary)(value, cursor);
164
+ }
165
+ //# sourceMappingURL=input-buffer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-buffer.js","sourceRoot":"","sources":["../../../src/ink-ui/runtime/input-buffer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export interface InkLayoutBudget {
2
+ terminalWidth: number;
3
+ terminalHeight: number;
4
+ layoutWidth: number;
5
+ maxLiveTranscriptItems: number;
6
+ maxOverlayItems: number;
7
+ maxPromptRows: number;
8
+ }
9
+ export declare function fitCount(value: number, min: number, max: number): number;
10
+ export declare function getInkLayoutBudget(terminalWidth: number, terminalHeight: number, options?: {
11
+ overlayVisible?: boolean;
12
+ }): InkLayoutBudget;
13
+ //# sourceMappingURL=layout-budget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout-budget.d.ts","sourceRoot":"","sources":["../../../src/ink-ui/runtime/layout-budget.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAExE;AAED,wBAAgB,kBAAkB,CAChC,aAAa,EAAE,MAAM,EACrB,cAAc,EAAE,MAAM,EACtB,OAAO,GAAE;IAAE,cAAc,CAAC,EAAE,OAAO,CAAA;CAAO,GACzC,eAAe,CAiBjB"}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fitCount = fitCount;
4
+ exports.getInkLayoutBudget = getInkLayoutBudget;
5
+ function fitCount(value, min, max) {
6
+ return Math.max(min, Math.min(max, value));
7
+ }
8
+ function getInkLayoutBudget(terminalWidth, terminalHeight, options = {}) {
9
+ const height = Math.max(8, terminalHeight || 24);
10
+ const width = Math.max(20, terminalWidth || 80);
11
+ const maxPromptRows = fitCount(Math.floor(height / 4), 1, 6);
12
+ const maxLiveTranscriptItems = options.overlayVisible
13
+ ? 1
14
+ : fitCount(height - 10, 1, 8);
15
+ const maxOverlayItems = fitCount(height - maxPromptRows - maxLiveTranscriptItems - 10, 1, 10);
16
+ return {
17
+ terminalWidth: width,
18
+ terminalHeight: height,
19
+ layoutWidth: Math.max(20, width - 1),
20
+ maxLiveTranscriptItems,
21
+ maxOverlayItems,
22
+ maxPromptRows,
23
+ };
24
+ }
25
+ //# sourceMappingURL=layout-budget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout-budget.js","sourceRoot":"","sources":["../../../src/ink-ui/runtime/layout-budget.ts"],"names":[],"mappings":";;AASA,4BAEC;AAED,gDAqBC;AAzBD,SAAgB,QAAQ,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW;IAC9D,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,SAAgB,kBAAkB,CAChC,aAAqB,EACrB,cAAsB,EACtB,UAAwC,EAAE;IAE1C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,IAAI,EAAE,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,aAAa,IAAI,EAAE,CAAC,CAAC;IAChD,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7D,MAAM,sBAAsB,GAAG,OAAO,CAAC,cAAc;QACnD,CAAC,CAAC,CAAC;QACH,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAChC,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,GAAG,aAAa,GAAG,sBAAsB,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAE9F,OAAO;QACL,aAAa,EAAE,KAAK;QACpB,cAAc,EAAE,MAAM;QACtB,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC,CAAC;QACpC,sBAAsB;QACtB,eAAe;QACf,aAAa;KACd,CAAC;AACJ,CAAC"}
@@ -0,0 +1,62 @@
1
+ export interface NativeCursorState {
2
+ enabled: boolean;
3
+ column: number;
4
+ rowsUp: number;
5
+ cursorLineIndex?: number;
6
+ row?: number;
7
+ absolute?: boolean;
8
+ }
9
+ interface InkYogaNode {
10
+ getComputedLeft?: () => number;
11
+ getComputedTop?: () => number;
12
+ getComputedHeight?: () => number;
13
+ }
14
+ export interface InkDomNodeLike {
15
+ yogaNode?: InkYogaNode;
16
+ parentNode?: InkDomNodeLike | null;
17
+ }
18
+ export interface NativeCursorAnchor {
19
+ column: number;
20
+ rowsUp: number;
21
+ row: number;
22
+ }
23
+ export interface CursorPosition {
24
+ row: number;
25
+ column: number;
26
+ }
27
+ export declare function nativeCursorUnparkSequence(rowsUp: number): string;
28
+ export declare function nativeCursorParkSequence(state: NativeCursorState): string;
29
+ export declare function nativeCursorAbsoluteMoveSequence(to: CursorPosition): string;
30
+ export declare function nativeCursorAbsoluteParkSequence(to: CursorPosition): string;
31
+ export declare function nativeCursorMoveSequence(from: CursorPosition, to: CursorPosition): string;
32
+ export declare class NativeCursorController {
33
+ private readonly output;
34
+ private cursorState;
35
+ private cursorParked;
36
+ private parkedState;
37
+ private frameCursor;
38
+ private physicalCursor;
39
+ private restoreScheduled;
40
+ private promptTopRow;
41
+ private observedLines;
42
+ private parkedWithAbsoluteTarget;
43
+ private restoreGeneration;
44
+ constructor(output: NodeJS.WriteStream);
45
+ wrapStdout(): NodeJS.WriteStream;
46
+ setState(state: NativeCursorState): void;
47
+ restore(): void;
48
+ disable(): void;
49
+ resetForViewportClear(): void;
50
+ private unpark;
51
+ private park;
52
+ private cursorTargetFromFrame;
53
+ private scheduleRestore;
54
+ }
55
+ export declare function createNativeCursorController(output: NodeJS.WriteStream): NativeCursorController;
56
+ export declare function nativeCursorAnchorFromNode(node: InkDomNodeLike | null | undefined, options: {
57
+ cursorColumn: number;
58
+ cursorLineIndex: number;
59
+ }): NativeCursorAnchor | null;
60
+ export declare function applyTerminalOutputToCursor(position: CursorPosition, chunk: unknown, columns: number, rows?: number): CursorPosition;
61
+ export {};
62
+ //# sourceMappingURL=native-cursor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-cursor.d.ts","sourceRoot":"","sources":["../../../src/ink-ui/runtime/native-cursor.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,UAAU,WAAW;IACnB,eAAe,CAAC,EAAE,MAAM,MAAM,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,MAAM,CAAC;IAC9B,iBAAiB,CAAC,EAAE,MAAM,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,UAAU,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;CACpC;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAKjE;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAOzE;AAED,wBAAgB,gCAAgC,CAAC,EAAE,EAAE,cAAc,GAAG,MAAM,CAI3E;AAED,wBAAgB,gCAAgC,CAAC,EAAE,EAAE,cAAc,GAAG,MAAM,CAE3E;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,cAAc,GAAG,MAAM,CAkBzF;AAED,qBAAa,sBAAsB;IAgBrB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAfnC,OAAO,CAAC,WAAW,CAIjB;IACF,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,WAAW,CAAkC;IACrD,OAAO,CAAC,WAAW,CAAyC;IAC5D,OAAO,CAAC,cAAc,CAAyC;IAC/D,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,wBAAwB,CAAS;IACzC,OAAO,CAAC,iBAAiB,CAAK;gBAED,MAAM,EAAE,MAAM,CAAC,WAAW;IAEvD,UAAU,IAAI,MAAM,CAAC,WAAW;IA8ChC,QAAQ,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAIxC,OAAO,IAAI,IAAI;IAYf,OAAO,IAAI,IAAI;IAKf,qBAAqB,IAAI,IAAI;IAY7B,OAAO,CAAC,MAAM;IAsBd,OAAO,CAAC,IAAI;IAuBZ,OAAO,CAAC,qBAAqB;IA8B7B,OAAO,CAAC,eAAe;CAUxB;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,CAAC,WAAW,GAAG,sBAAsB,CAE/F;AAWD,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,cAAc,GAAG,IAAI,GAAG,SAAS,EACvC,OAAO,EAAE;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,GACzD,kBAAkB,GAAG,IAAI,CA+B3B;AAED,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,MAAM,EACf,IAAI,SAA0B,GAC7B,cAAc,CAEhB"}