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,202 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.initialTuiUiState = void 0;
4
+ exports.tuiUiReducer = tuiUiReducer;
5
+ exports.staticTuiTranscriptEntries = staticTuiTranscriptEntries;
6
+ exports.liveTuiTranscriptEntries = liveTuiTranscriptEntries;
7
+ exports.createTuiUiEventSink = createTuiUiEventSink;
8
+ exports.initialTuiUiState = {
9
+ transcript: [],
10
+ staticTranscriptCount: 0,
11
+ transcriptGeneration: 0,
12
+ transcriptScrollOffset: 0,
13
+ prompt: { value: '', cursor: 0 },
14
+ statusMessage: '',
15
+ processing: false,
16
+ overlay: null,
17
+ };
18
+ function tuiUiReducer(state, action) {
19
+ switch (action.type) {
20
+ case 'appendTranscript': {
21
+ const { live: _live, ...entry } = action.entry;
22
+ return commitStaticTranscriptPrefix({
23
+ ...state,
24
+ transcriptScrollOffset: 0,
25
+ transcript: [
26
+ ...state.transcript,
27
+ {
28
+ ...entry,
29
+ finalized: !isLiveTranscriptAppend(action.entry),
30
+ },
31
+ ],
32
+ });
33
+ }
34
+ case 'updateTranscript':
35
+ return {
36
+ ...state,
37
+ transcriptScrollOffset: 0,
38
+ transcript: state.transcript.map(entry => (entry.id === action.id ? { ...entry, ...action.patch } : entry)),
39
+ };
40
+ case 'finalizeTranscript':
41
+ return commitStaticTranscriptPrefix({
42
+ ...state,
43
+ transcriptScrollOffset: 0,
44
+ transcript: state.transcript.map(entry => (entry.id === action.id
45
+ ? { ...entry, ...action.patch, finalized: true }
46
+ : entry)),
47
+ });
48
+ case 'removeTranscript':
49
+ return recomputeStaticTranscriptPrefix({
50
+ ...state,
51
+ transcriptScrollOffset: 0,
52
+ transcript: state.transcript.filter(entry => entry.id !== action.id),
53
+ });
54
+ case 'replaceTranscript':
55
+ return {
56
+ ...state,
57
+ transcript: action.entries.map(entry => ({ ...entry, finalized: true })),
58
+ staticTranscriptCount: action.entries.length,
59
+ transcriptGeneration: state.transcriptGeneration + 1,
60
+ transcriptScrollOffset: 0,
61
+ };
62
+ case 'clearTranscript':
63
+ return {
64
+ ...state,
65
+ transcript: [],
66
+ staticTranscriptCount: 0,
67
+ transcriptGeneration: state.transcriptGeneration + 1,
68
+ transcriptScrollOffset: 0,
69
+ };
70
+ case 'scrollTranscript':
71
+ return {
72
+ ...state,
73
+ transcriptScrollOffset: clampNumber(state.transcriptScrollOffset + action.delta, 0, Number.MAX_SAFE_INTEGER),
74
+ };
75
+ case 'setPrompt':
76
+ return {
77
+ ...state,
78
+ prompt: {
79
+ value: action.value,
80
+ cursor: clampCursor(action.value, action.cursor ?? action.value.length),
81
+ },
82
+ };
83
+ case 'setStatus':
84
+ return { ...state, statusMessage: action.message };
85
+ case 'setProcessing':
86
+ return { ...state, processing: action.processing };
87
+ case 'showSessionPicker':
88
+ return {
89
+ ...state,
90
+ overlay: { type: 'sessions', request: action.request, selectedIndex: 0 },
91
+ };
92
+ case 'showPermissionRequest':
93
+ return {
94
+ ...state,
95
+ overlay: { type: 'permission', request: action.request, selectedIndex: 0 },
96
+ };
97
+ case 'showCommandPalette':
98
+ return {
99
+ ...state,
100
+ overlay: {
101
+ type: 'commands',
102
+ query: action.query,
103
+ items: action.items,
104
+ selectedIndex: clampNumber(state.overlay?.type === 'commands' ? state.overlay.selectedIndex : 0, 0, Math.max(0, action.items.length - 1)),
105
+ },
106
+ };
107
+ case 'showFilePicker':
108
+ return {
109
+ ...state,
110
+ overlay: {
111
+ type: 'files',
112
+ base: action.base,
113
+ query: action.query,
114
+ items: action.items,
115
+ selectedIndex: clampNumber(state.overlay?.type === 'files' ? state.overlay.selectedIndex : 0, 0, Math.max(0, action.items.length - 1)),
116
+ },
117
+ };
118
+ case 'showShortcuts':
119
+ return { ...state, overlay: { type: 'shortcuts' } };
120
+ case 'moveOverlaySelection': {
121
+ if (!state.overlay || state.overlay.type === 'shortcuts')
122
+ return state;
123
+ const lastIndex = Math.max(0, overlayItemCount(state.overlay) - 1);
124
+ const selectedIndex = clampNumber(state.overlay.selectedIndex + action.delta, 0, lastIndex);
125
+ return {
126
+ ...state,
127
+ overlay: { ...state.overlay, selectedIndex },
128
+ };
129
+ }
130
+ case 'closeOverlay':
131
+ return { ...state, overlay: null };
132
+ }
133
+ }
134
+ function staticTuiTranscriptEntries(state) {
135
+ return state.transcript.slice(0, state.staticTranscriptCount).map(stripRecord);
136
+ }
137
+ function liveTuiTranscriptEntries(state) {
138
+ return state.transcript.slice(state.staticTranscriptCount).map(stripRecord);
139
+ }
140
+ function createTuiUiEventSink(dispatch, options = {}) {
141
+ let nextId = 1;
142
+ const idFactory = options.idFactory ?? (() => `tui-${nextId++}`);
143
+ return {
144
+ append: entry => {
145
+ const id = idFactory();
146
+ dispatch({ type: 'appendTranscript', entry: { id, ...entry } });
147
+ return id;
148
+ },
149
+ update: (id, patch) => dispatch({ type: 'updateTranscript', id, patch }),
150
+ finalize: (id, patch) => dispatch({ type: 'finalizeTranscript', id, patch }),
151
+ remove: id => dispatch({ type: 'removeTranscript', id }),
152
+ replaceTranscript: entries => dispatch({ type: 'replaceTranscript', entries }),
153
+ clearTranscript: () => dispatch({ type: 'clearTranscript' }),
154
+ setStatus: message => dispatch({ type: 'setStatus', message }),
155
+ showSessionPicker: request => dispatch({ type: 'showSessionPicker', request }),
156
+ showPermissionRequest: request => dispatch({ type: 'showPermissionRequest', request }),
157
+ setProcessing: processing => dispatch({ type: 'setProcessing', processing }),
158
+ };
159
+ }
160
+ function isLiveTranscriptAppend(entry) {
161
+ return entry.live === true || entry.role === 'tool';
162
+ }
163
+ function commitStaticTranscriptPrefix(state) {
164
+ let staticTranscriptCount = state.staticTranscriptCount;
165
+ while (staticTranscriptCount < state.transcript.length
166
+ && state.transcript[staticTranscriptCount]?.finalized) {
167
+ staticTranscriptCount += 1;
168
+ }
169
+ return staticTranscriptCount === state.staticTranscriptCount
170
+ ? state
171
+ : { ...state, staticTranscriptCount };
172
+ }
173
+ function recomputeStaticTranscriptPrefix(state) {
174
+ let staticTranscriptCount = 0;
175
+ while (staticTranscriptCount < state.transcript.length
176
+ && state.transcript[staticTranscriptCount]?.finalized) {
177
+ staticTranscriptCount += 1;
178
+ }
179
+ return { ...state, staticTranscriptCount };
180
+ }
181
+ function stripRecord(entry) {
182
+ const { finalized: _finalized, ...rest } = entry;
183
+ return rest;
184
+ }
185
+ function overlayItemCount(overlay) {
186
+ if (overlay.type === 'sessions')
187
+ return overlay.request.sessions.length;
188
+ if (overlay.type === 'permission')
189
+ return 2;
190
+ return overlay.items.length;
191
+ }
192
+ function clampCursor(value, cursor) {
193
+ if (!Number.isFinite(cursor))
194
+ return value.length;
195
+ return Math.min(Math.max(0, Math.floor(cursor)), value.length);
196
+ }
197
+ function clampNumber(value, min, max) {
198
+ if (!Number.isFinite(value))
199
+ return min;
200
+ return Math.min(max, Math.max(min, Math.floor(value)));
201
+ }
202
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/tui-ui/state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * openhorse - Token estimation utilities
3
+ *
4
+ * Accurate token estimation that accounts for CJK characters,
5
+ * which have significantly different token ratios than ASCII text.
6
+ *
7
+ * CJK characters: ~1.5 tokens/char (vs ~0.25 for ASCII words)
8
+ * This is critical for bilingual (CN/EN) coding agents.
9
+ */
10
+ /**
11
+ * Estimate token count for a given text.
12
+ *
13
+ * Token ratios by character type (approximate, based on common tokenizers):
14
+ * - CJK characters: ~1.5 tokens/char (each CJK char is typically 1-2 tokens)
15
+ * - ASCII letters/digits: ~0.25 tokens/char (4 chars per token on average)
16
+ * - Punctuation: ~1 token/char (each punctuation mark is often its own token)
17
+ * - Whitespace: ~0.5 tokens/char (spaces often grouped, newlines are separate)
18
+ *
19
+ * @param text - The text to estimate tokens for
20
+ * @returns Estimated token count (integer)
21
+ */
22
+ export declare function estimateTokens(text: string): number;
23
+ /**
24
+ * Estimate tokens for an array of messages (for compact/autocompact fallback).
25
+ *
26
+ * @param messages - Array of message objects with content
27
+ * @returns Estimated total token count
28
+ */
29
+ export declare function estimateMessagesTokens(messages: Array<{
30
+ content?: string | null;
31
+ role?: string;
32
+ }>): number;
33
+ /**
34
+ * Quick token estimate using character count as fallback.
35
+ * Uses a more conservative ratio than text.length / 4.
36
+ *
37
+ * @param textLength - Character count of the text
38
+ * @param hasCJK - Whether the text contains CJK characters
39
+ * @returns Estimated token count
40
+ */
41
+ export declare function quickTokenEstimate(textLength: number, hasCJK?: boolean): number;
42
+ //# sourceMappingURL=token-estimate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-estimate.d.ts","sourceRoot":"","sources":["../../src/utils/token-estimate.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA+CH;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA+CnD;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,KAAK,CAAC;IAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAC1D,MAAM,CASR;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,UAAQ,GAAG,MAAM,CAO7E"}
@@ -0,0 +1,150 @@
1
+ "use strict";
2
+ /**
3
+ * openhorse - Token estimation utilities
4
+ *
5
+ * Accurate token estimation that accounts for CJK characters,
6
+ * which have significantly different token ratios than ASCII text.
7
+ *
8
+ * CJK characters: ~1.5 tokens/char (vs ~0.25 for ASCII words)
9
+ * This is critical for bilingual (CN/EN) coding agents.
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.estimateTokens = estimateTokens;
13
+ exports.estimateMessagesTokens = estimateMessagesTokens;
14
+ exports.quickTokenEstimate = quickTokenEstimate;
15
+ /**
16
+ * Check if a character is a CJK (Chinese/Japanese/Korean) character
17
+ * These characters typically consume ~1.5 tokens each in most tokenizers
18
+ */
19
+ function isCJK(char) {
20
+ const cp = char.codePointAt(0) || 0;
21
+ return (
22
+ // CJK Unified Ideographs
23
+ (cp >= 0x4E00 && cp <= 0x9FFF) ||
24
+ // CJK Extension A
25
+ (cp >= 0x3400 && cp <= 0x4DBF) ||
26
+ // CJK Extension B
27
+ (cp >= 0x20000 && cp <= 0x2A6DF) ||
28
+ // CJK Extension C
29
+ (cp >= 0x2A700 && cp <= 0x2B73F) ||
30
+ // CJK Extension D
31
+ (cp >= 0x2B740 && cp <= 0x2B81F) ||
32
+ // CJK Compatibility Ideographs
33
+ (cp >= 0xF900 && cp <= 0xFAFF) ||
34
+ // CJK Compatibility Ideographs Supplement
35
+ (cp >= 0x2F800 && cp <= 0x2FA1F) ||
36
+ // Hiragana (Japanese)
37
+ (cp >= 0x3040 && cp <= 0x309F) ||
38
+ // Katakana (Japanese)
39
+ (cp >= 0x30A0 && cp <= 0x30FF) ||
40
+ // Katakana Phonetic Extensions
41
+ (cp >= 0x31F0 && cp <= 0x31FF) ||
42
+ // Hangul Syllables (Korean)
43
+ (cp >= 0xAC00 && cp <= 0xD7AF) ||
44
+ // Hangul Jamo
45
+ (cp >= 0x1100 && cp <= 0x11FF) ||
46
+ // Hangul Compatibility Jamo
47
+ (cp >= 0x3130 && cp <= 0x318F) ||
48
+ // Fullwidth Forms (CJK punctuation, etc.)
49
+ (cp >= 0xFF00 && cp <= 0xFFEF));
50
+ }
51
+ /**
52
+ * Check if a character is a whitespace/newline
53
+ */
54
+ function isWhitespace(char) {
55
+ return char === ' ' || char === '\t' || char === '\n' || char === '\r';
56
+ }
57
+ /**
58
+ * Estimate token count for a given text.
59
+ *
60
+ * Token ratios by character type (approximate, based on common tokenizers):
61
+ * - CJK characters: ~1.5 tokens/char (each CJK char is typically 1-2 tokens)
62
+ * - ASCII letters/digits: ~0.25 tokens/char (4 chars per token on average)
63
+ * - Punctuation: ~1 token/char (each punctuation mark is often its own token)
64
+ * - Whitespace: ~0.5 tokens/char (spaces often grouped, newlines are separate)
65
+ *
66
+ * @param text - The text to estimate tokens for
67
+ * @returns Estimated token count (integer)
68
+ */
69
+ function estimateTokens(text) {
70
+ if (!text)
71
+ return 0;
72
+ let tokens = 0;
73
+ let asciiRun = 0;
74
+ for (const char of text) {
75
+ if (isCJK(char)) {
76
+ // Flush any accumulated ASCII run
77
+ if (asciiRun > 0) {
78
+ tokens += Math.ceil(asciiRun / 4);
79
+ asciiRun = 0;
80
+ }
81
+ // CJK characters: ~1.5 tokens each
82
+ tokens += 1.5;
83
+ }
84
+ else if (isWhitespace(char)) {
85
+ // Flush ASCII run
86
+ if (asciiRun > 0) {
87
+ tokens += Math.ceil(asciiRun / 4);
88
+ asciiRun = 0;
89
+ }
90
+ // Newlines are typically their own token
91
+ if (char === '\n') {
92
+ tokens += 1;
93
+ }
94
+ else {
95
+ tokens += 0.5;
96
+ }
97
+ }
98
+ else if (char.codePointAt(0) < 128) {
99
+ // ASCII letter/digit - accumulate for word-level estimation
100
+ asciiRun++;
101
+ }
102
+ else {
103
+ // Non-ASCII punctuation/symbols - flush ASCII run first
104
+ if (asciiRun > 0) {
105
+ tokens += Math.ceil(asciiRun / 4);
106
+ asciiRun = 0;
107
+ }
108
+ // Punctuation and symbols: ~1 token each
109
+ tokens += 1;
110
+ }
111
+ }
112
+ // Flush remaining ASCII run
113
+ if (asciiRun > 0) {
114
+ tokens += Math.ceil(asciiRun / 4);
115
+ }
116
+ return Math.ceil(tokens);
117
+ }
118
+ /**
119
+ * Estimate tokens for an array of messages (for compact/autocompact fallback).
120
+ *
121
+ * @param messages - Array of message objects with content
122
+ * @returns Estimated total token count
123
+ */
124
+ function estimateMessagesTokens(messages) {
125
+ let total = 0;
126
+ for (const msg of messages) {
127
+ if (msg.content) {
128
+ // Add overhead for message framing (~4 tokens per message)
129
+ total += estimateTokens(msg.content) + 4;
130
+ }
131
+ }
132
+ return total;
133
+ }
134
+ /**
135
+ * Quick token estimate using character count as fallback.
136
+ * Uses a more conservative ratio than text.length / 4.
137
+ *
138
+ * @param textLength - Character count of the text
139
+ * @param hasCJK - Whether the text contains CJK characters
140
+ * @returns Estimated token count
141
+ */
142
+ function quickTokenEstimate(textLength, hasCJK = false) {
143
+ if (hasCJK) {
144
+ // CJK-heavy text: ~1.5 tokens per char
145
+ return Math.ceil(textLength * 1.5);
146
+ }
147
+ // ASCII-heavy text: ~0.25 tokens per char
148
+ return Math.ceil(textLength / 4);
149
+ }
150
+ //# sourceMappingURL=token-estimate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-estimate.js","sourceRoot":"","sources":["../../src/utils/token-estimate.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;AA2DH,wCA+CC;AAQD,wDAWC;AAUD,gDAOC;AA5ID;;;GAGG;AACH,SAAS,KAAK,CAAC,IAAY;IACzB,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACpC,OAAO;IACL,yBAAyB;IACzB,CAAC,EAAE,IAAI,MAAM,IAAI,EAAE,IAAI,MAAM,CAAC;QAC9B,kBAAkB;QAClB,CAAC,EAAE,IAAI,MAAM,IAAI,EAAE,IAAI,MAAM,CAAC;QAC9B,kBAAkB;QAClB,CAAC,EAAE,IAAI,OAAO,IAAI,EAAE,IAAI,OAAO,CAAC;QAChC,kBAAkB;QAClB,CAAC,EAAE,IAAI,OAAO,IAAI,EAAE,IAAI,OAAO,CAAC;QAChC,kBAAkB;QAClB,CAAC,EAAE,IAAI,OAAO,IAAI,EAAE,IAAI,OAAO,CAAC;QAChC,+BAA+B;QAC/B,CAAC,EAAE,IAAI,MAAM,IAAI,EAAE,IAAI,MAAM,CAAC;QAC9B,0CAA0C;QAC1C,CAAC,EAAE,IAAI,OAAO,IAAI,EAAE,IAAI,OAAO,CAAC;QAChC,sBAAsB;QACtB,CAAC,EAAE,IAAI,MAAM,IAAI,EAAE,IAAI,MAAM,CAAC;QAC9B,sBAAsB;QACtB,CAAC,EAAE,IAAI,MAAM,IAAI,EAAE,IAAI,MAAM,CAAC;QAC9B,+BAA+B;QAC/B,CAAC,EAAE,IAAI,MAAM,IAAI,EAAE,IAAI,MAAM,CAAC;QAC9B,4BAA4B;QAC5B,CAAC,EAAE,IAAI,MAAM,IAAI,EAAE,IAAI,MAAM,CAAC;QAC9B,cAAc;QACd,CAAC,EAAE,IAAI,MAAM,IAAI,EAAE,IAAI,MAAM,CAAC;QAC9B,4BAA4B;QAC5B,CAAC,EAAE,IAAI,MAAM,IAAI,EAAE,IAAI,MAAM,CAAC;QAC9B,0CAA0C;QAC1C,CAAC,EAAE,IAAI,MAAM,IAAI,EAAE,IAAI,MAAM,CAAC,CAC/B,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,IAAY;IAChC,OAAO,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,CAAC;AACzE,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAgB,cAAc,CAAC,IAAY;IACzC,IAAI,CAAC,IAAI;QAAE,OAAO,CAAC,CAAC;IAEpB,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAChB,kCAAkC;YAClC,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;gBACjB,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;gBAClC,QAAQ,GAAG,CAAC,CAAC;YACf,CAAC;YACD,mCAAmC;YACnC,MAAM,IAAI,GAAG,CAAC;QAChB,CAAC;aAAM,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,kBAAkB;YAClB,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;gBACjB,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;gBAClC,QAAQ,GAAG,CAAC,CAAC;YACf,CAAC;YACD,yCAAyC;YACzC,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBAClB,MAAM,IAAI,CAAC,CAAC;YACd,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,GAAG,CAAC;YAChB,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,CAAE,GAAG,GAAG,EAAE,CAAC;YACtC,4DAA4D;YAC5D,QAAQ,EAAE,CAAC;QACb,CAAC;aAAM,CAAC;YACN,wDAAwD;YACxD,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;gBACjB,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;gBAClC,QAAQ,GAAG,CAAC,CAAC;YACf,CAAC;YACD,yCAAyC;YACzC,MAAM,IAAI,CAAC,CAAC;QACd,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QACjB,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;IACpC,CAAC;IAED,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC3B,CAAC;AAED;;;;;GAKG;AACH,SAAgB,sBAAsB,CACpC,QAA2D;IAE3D,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAChB,2DAA2D;YAC3D,KAAK,IAAI,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,kBAAkB,CAAC,UAAkB,EAAE,MAAM,GAAG,KAAK;IACnE,IAAI,MAAM,EAAE,CAAC;QACX,uCAAuC;QACvC,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC;IACrC,CAAC;IACD,0CAA0C;IAC1C,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;AACnC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openhorse",
3
- "version": "0.2.2",
3
+ "version": "0.2.4",
4
4
  "description": "OpenHorse - Universal Agent Harness Framework. A complete coding CLI agent with tools, MCP, memory system.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",