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.
- package/README.md +23 -0
- package/dist/cli.js +163 -22
- package/dist/cli.js.map +1 -1
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +161 -22
- package/dist/commands/index.js.map +1 -1
- package/dist/framework/prompt.d.ts +4 -0
- package/dist/framework/prompt.d.ts.map +1 -1
- package/dist/framework/prompt.js +18 -0
- package/dist/framework/prompt.js.map +1 -1
- package/dist/framework/query.d.ts +7 -0
- package/dist/framework/query.d.ts.map +1 -1
- package/dist/framework/query.js +14 -0
- package/dist/framework/query.js.map +1 -1
- package/dist/framework/store.d.ts +3 -1
- package/dist/framework/store.d.ts.map +1 -1
- package/dist/framework/store.js +1 -0
- package/dist/framework/store.js.map +1 -1
- package/dist/harness/context-harness.d.ts +14 -0
- package/dist/harness/context-harness.d.ts.map +1 -1
- package/dist/harness/context-harness.js +21 -0
- package/dist/harness/context-harness.js.map +1 -1
- package/dist/harness/evidence.d.ts.map +1 -1
- package/dist/harness/evidence.js +2 -1
- package/dist/harness/evidence.js.map +1 -1
- package/dist/index.d.ts +0 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -4
- package/dist/index.js.map +1 -1
- package/dist/ink-ui/App.d.ts +4 -1
- package/dist/ink-ui/App.d.ts.map +1 -1
- package/dist/ink-ui/App.js +2 -2
- package/dist/ink-ui/App.js.map +1 -1
- package/dist/ink-ui/components/NativeCursor.d.ts +12 -0
- package/dist/ink-ui/components/NativeCursor.d.ts.map +1 -0
- package/dist/ink-ui/components/NativeCursor.js +35 -0
- package/dist/ink-ui/components/NativeCursor.js.map +1 -0
- package/dist/ink-ui/components/PromptInput.d.ts +5 -1
- package/dist/ink-ui/components/PromptInput.d.ts.map +1 -1
- package/dist/ink-ui/components/PromptInput.js +10 -6
- package/dist/ink-ui/components/PromptInput.js.map +1 -1
- package/dist/ink-ui/components/RunningHorseIndicator.d.ts +1 -1
- package/dist/ink-ui/components/RunningHorseIndicator.d.ts.map +1 -1
- package/dist/ink-ui/components/RunningHorseIndicator.js +3 -41
- package/dist/ink-ui/components/RunningHorseIndicator.js.map +1 -1
- package/dist/ink-ui/components/SelectList.d.ts +2 -1
- package/dist/ink-ui/components/SelectList.d.ts.map +1 -1
- package/dist/ink-ui/components/SelectList.js +26 -11
- package/dist/ink-ui/components/SelectList.js.map +1 -1
- package/dist/ink-ui/components/StatusLine.d.ts.map +1 -1
- package/dist/ink-ui/components/StatusLine.js +22 -31
- package/dist/ink-ui/components/StatusLine.js.map +1 -1
- package/dist/ink-ui/components/TerminalCursor.d.ts +4 -2
- package/dist/ink-ui/components/TerminalCursor.d.ts.map +1 -1
- package/dist/ink-ui/components/TerminalCursor.js +18 -43
- package/dist/ink-ui/components/TerminalCursor.js.map +1 -1
- package/dist/ink-ui/components/ToolActivity.d.ts +17 -0
- package/dist/ink-ui/components/ToolActivity.d.ts.map +1 -0
- package/dist/ink-ui/components/ToolActivity.js +107 -0
- package/dist/ink-ui/components/ToolActivity.js.map +1 -0
- package/dist/ink-ui/components/Transcript.d.ts +7 -1
- package/dist/ink-ui/components/Transcript.d.ts.map +1 -1
- package/dist/ink-ui/components/Transcript.js +40 -3
- package/dist/ink-ui/components/Transcript.js.map +1 -1
- package/dist/ink-ui/controllers/chat-controller.d.ts +1 -33
- package/dist/ink-ui/controllers/chat-controller.d.ts.map +1 -1
- package/dist/ink-ui/controllers/chat-controller.js +15 -437
- package/dist/ink-ui/controllers/chat-controller.js.map +1 -1
- package/dist/ink-ui/hooks/use-raw-input-bridge.d.ts +6 -0
- package/dist/ink-ui/hooks/use-raw-input-bridge.d.ts.map +1 -0
- package/dist/ink-ui/hooks/use-raw-input-bridge.js +27 -0
- package/dist/ink-ui/hooks/use-raw-input-bridge.js.map +1 -0
- package/dist/ink-ui/hooks/use-terminal-size.d.ts +7 -0
- package/dist/ink-ui/hooks/use-terminal-size.d.ts.map +1 -0
- package/dist/ink-ui/hooks/use-terminal-size.js +34 -0
- package/dist/ink-ui/hooks/use-terminal-size.js.map +1 -0
- package/dist/ink-ui/launch.d.ts +6 -0
- package/dist/ink-ui/launch.d.ts.map +1 -1
- package/dist/ink-ui/launch.js +60 -2
- package/dist/ink-ui/launch.js.map +1 -1
- package/dist/ink-ui/runtime/grapheme.d.ts +9 -0
- package/dist/ink-ui/runtime/grapheme.d.ts.map +1 -0
- package/dist/ink-ui/runtime/grapheme.js +63 -0
- package/dist/ink-ui/runtime/grapheme.js.map +1 -0
- package/dist/ink-ui/runtime/input-buffer.d.ts +32 -0
- package/dist/ink-ui/runtime/input-buffer.d.ts.map +1 -0
- package/dist/ink-ui/runtime/input-buffer.js +165 -0
- package/dist/ink-ui/runtime/input-buffer.js.map +1 -0
- package/dist/ink-ui/runtime/layout-budget.d.ts +13 -0
- package/dist/ink-ui/runtime/layout-budget.d.ts.map +1 -0
- package/dist/ink-ui/runtime/layout-budget.js +25 -0
- package/dist/ink-ui/runtime/layout-budget.js.map +1 -0
- package/dist/ink-ui/runtime/native-cursor.d.ts +62 -0
- package/dist/ink-ui/runtime/native-cursor.d.ts.map +1 -0
- package/dist/ink-ui/runtime/native-cursor.js +423 -0
- package/dist/ink-ui/runtime/native-cursor.js.map +1 -0
- package/dist/ink-ui/runtime/prompt-layout.d.ts +20 -1
- package/dist/ink-ui/runtime/prompt-layout.d.ts.map +1 -1
- package/dist/ink-ui/runtime/prompt-layout.js +129 -11
- package/dist/ink-ui/runtime/prompt-layout.js.map +1 -1
- package/dist/ink-ui/runtime/raw-input.d.ts +4 -0
- package/dist/ink-ui/runtime/raw-input.d.ts.map +1 -0
- package/dist/ink-ui/runtime/raw-input.js +15 -0
- package/dist/ink-ui/runtime/raw-input.js.map +1 -0
- package/dist/ink-ui/runtime/stdout.d.ts +11 -0
- package/dist/ink-ui/runtime/stdout.d.ts.map +1 -0
- package/dist/ink-ui/runtime/stdout.js +82 -0
- package/dist/ink-ui/runtime/stdout.js.map +1 -0
- package/dist/ink-ui/runtime/transcript-state.d.ts +37 -0
- package/dist/ink-ui/runtime/transcript-state.d.ts.map +1 -0
- package/dist/ink-ui/runtime/transcript-state.js +89 -0
- package/dist/ink-ui/runtime/transcript-state.js.map +1 -0
- package/dist/ink-ui/screens/ReplScreen.d.ts +8 -2
- package/dist/ink-ui/screens/ReplScreen.d.ts.map +1 -1
- package/dist/ink-ui/screens/ReplScreen.js +247 -151
- package/dist/ink-ui/screens/ReplScreen.js.map +1 -1
- package/dist/ink-ui/types.d.ts +1 -42
- package/dist/ink-ui/types.d.ts.map +1 -1
- package/dist/ink-ui/types.js +15 -0
- package/dist/ink-ui/types.js.map +1 -1
- package/dist/print-ui/launch.d.ts +8 -0
- package/dist/print-ui/launch.d.ts.map +1 -0
- package/dist/print-ui/launch.js +205 -0
- package/dist/print-ui/launch.js.map +1 -0
- package/dist/runtime/agent-runtime-controller.d.ts +69 -0
- package/dist/runtime/agent-runtime-controller.d.ts.map +1 -0
- package/dist/runtime/agent-runtime-controller.js +225 -0
- package/dist/runtime/agent-runtime-controller.js.map +1 -0
- package/dist/runtime/agent-runtime-protocol.d.ts +90 -0
- package/dist/runtime/agent-runtime-protocol.d.ts.map +1 -0
- package/dist/runtime/agent-runtime-protocol.js +80 -0
- package/dist/runtime/agent-runtime-protocol.js.map +1 -0
- package/dist/runtime/chat-controller.d.ts +41 -0
- package/dist/runtime/chat-controller.d.ts.map +1 -0
- package/dist/runtime/chat-controller.js +577 -0
- package/dist/runtime/chat-controller.js.map +1 -0
- package/dist/runtime/ui-events.d.ts +59 -0
- package/dist/runtime/ui-events.d.ts.map +1 -0
- package/dist/runtime/ui-events.js +3 -0
- package/dist/runtime/ui-events.js.map +1 -0
- package/dist/services/commit-plan.d.ts +17 -0
- package/dist/services/commit-plan.d.ts.map +1 -0
- package/dist/services/commit-plan.js +161 -0
- package/dist/services/commit-plan.js.map +1 -0
- package/dist/services/compact/auto-compact.d.ts.map +1 -1
- package/dist/services/compact/auto-compact.js +3 -2
- package/dist/services/compact/auto-compact.js.map +1 -1
- package/dist/services/compact/compact.d.ts +3 -0
- package/dist/services/compact/compact.d.ts.map +1 -1
- package/dist/services/compact/compact.js +4 -1
- package/dist/services/compact/compact.js.map +1 -1
- package/dist/services/compact/summary-generator.d.ts +11 -0
- package/dist/services/compact/summary-generator.d.ts.map +1 -1
- package/dist/services/compact/summary-generator.js +57 -0
- package/dist/services/compact/summary-generator.js.map +1 -1
- package/dist/services/config.d.ts +3 -2
- package/dist/services/config.d.ts.map +1 -1
- package/dist/services/config.js +7 -6
- package/dist/services/config.js.map +1 -1
- package/dist/services/doctor.d.ts +33 -0
- package/dist/services/doctor.d.ts.map +1 -0
- package/dist/services/doctor.js +211 -0
- package/dist/services/doctor.js.map +1 -0
- package/dist/services/file-context.d.ts +21 -0
- package/dist/services/file-context.d.ts.map +1 -0
- package/dist/services/file-context.js +194 -0
- package/dist/services/file-context.js.map +1 -0
- package/dist/services/global-config.d.ts +1 -1
- package/dist/services/global-config.d.ts.map +1 -1
- package/dist/services/project-instructions.d.ts +16 -0
- package/dist/services/project-instructions.d.ts.map +1 -0
- package/dist/services/project-instructions.js +135 -0
- package/dist/services/project-instructions.js.map +1 -0
- package/dist/services/prompt-context.d.ts +3 -0
- package/dist/services/prompt-context.d.ts.map +1 -0
- package/dist/services/prompt-context.js +13 -0
- package/dist/services/prompt-context.js.map +1 -0
- package/dist/services/session-index.d.ts +45 -0
- package/dist/services/session-index.d.ts.map +1 -0
- package/dist/services/session-index.js +183 -0
- package/dist/services/session-index.js.map +1 -0
- package/dist/services/session-storage.d.ts +3 -0
- package/dist/services/session-storage.d.ts.map +1 -1
- package/dist/services/session-storage.js +21 -0
- package/dist/services/session-storage.js.map +1 -1
- package/dist/services/workspace-diff.d.ts +27 -0
- package/dist/services/workspace-diff.d.ts.map +1 -0
- package/dist/services/workspace-diff.js +129 -0
- package/dist/services/workspace-diff.js.map +1 -0
- package/dist/terminal-ui/completion.d.ts +6 -0
- package/dist/terminal-ui/completion.d.ts.map +1 -0
- package/dist/terminal-ui/completion.js +80 -0
- package/dist/terminal-ui/completion.js.map +1 -0
- package/dist/terminal-ui/editor.d.ts +17 -0
- package/dist/terminal-ui/editor.d.ts.map +1 -0
- package/dist/terminal-ui/editor.js +42 -0
- package/dist/terminal-ui/editor.js.map +1 -0
- package/dist/terminal-ui/launch.d.ts +23 -0
- package/dist/terminal-ui/launch.d.ts.map +1 -0
- package/dist/terminal-ui/launch.js +567 -0
- package/dist/terminal-ui/launch.js.map +1 -0
- package/dist/terminal-ui/raw-editor.d.ts +57 -0
- package/dist/terminal-ui/raw-editor.d.ts.map +1 -0
- package/dist/terminal-ui/raw-editor.js +339 -0
- package/dist/terminal-ui/raw-editor.js.map +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +269 -25
- package/dist/tools/index.js.map +1 -1
- package/dist/tui-core/frame.d.ts +25 -0
- package/dist/tui-core/frame.d.ts.map +1 -0
- package/dist/tui-core/frame.js +104 -0
- package/dist/tui-core/frame.js.map +1 -0
- package/dist/tui-core/input-parser.d.ts +25 -0
- package/dist/tui-core/input-parser.d.ts.map +1 -0
- package/dist/tui-core/input-parser.js +207 -0
- package/dist/tui-core/input-parser.js.map +1 -0
- package/dist/tui-core/terminal-writer.d.ts +34 -0
- package/dist/tui-core/terminal-writer.d.ts.map +1 -0
- package/dist/tui-core/terminal-writer.js +92 -0
- package/dist/tui-core/terminal-writer.js.map +1 -0
- package/dist/tui-ui/launch.d.ts +7 -0
- package/dist/tui-ui/launch.d.ts.map +1 -0
- package/dist/tui-ui/launch.js +194 -0
- package/dist/tui-ui/launch.js.map +1 -0
- package/dist/tui-ui/layout.d.ts +9 -0
- package/dist/tui-ui/layout.d.ts.map +1 -0
- package/dist/tui-ui/layout.js +239 -0
- package/dist/tui-ui/layout.js.map +1 -0
- package/dist/tui-ui/pickers.d.ts +13 -0
- package/dist/tui-ui/pickers.d.ts.map +1 -0
- package/dist/tui-ui/pickers.js +79 -0
- package/dist/tui-ui/pickers.js.map +1 -0
- package/dist/tui-ui/runner.d.ts +43 -0
- package/dist/tui-ui/runner.d.ts.map +1 -0
- package/dist/tui-ui/runner.js +387 -0
- package/dist/tui-ui/runner.js.map +1 -0
- package/dist/tui-ui/state.d.ts +106 -0
- package/dist/tui-ui/state.d.ts.map +1 -0
- package/dist/tui-ui/state.js +202 -0
- package/dist/tui-ui/state.js.map +1 -0
- package/dist/utils/token-estimate.d.ts +42 -0
- package/dist/utils/token-estimate.d.ts.map +1 -0
- package/dist/utils/token-estimate.js +150 -0
- package/dist/utils/token-estimate.js.map +1 -0
- 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":"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"}
|
package/package.json
CHANGED