@ebowwa/coder 0.7.64 → 0.7.66
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/dist/index.js +36233 -32
- package/dist/interfaces/ui/terminal/cli/index.js +34318 -158
- package/dist/interfaces/ui/terminal/native/README.md +53 -0
- package/dist/interfaces/ui/terminal/native/claude_code_native.darwin-x64.node +0 -0
- package/dist/interfaces/ui/terminal/native/claude_code_native.dylib +0 -0
- package/dist/interfaces/ui/terminal/native/index.d.ts +0 -0
- package/dist/interfaces/ui/terminal/native/index.darwin-arm64.node +0 -0
- package/dist/interfaces/ui/terminal/native/index.js +43 -0
- package/dist/interfaces/ui/terminal/native/index.node +0 -0
- package/dist/interfaces/ui/terminal/native/package.json +34 -0
- package/dist/native/README.md +53 -0
- package/dist/native/claude_code_native.darwin-x64.node +0 -0
- package/dist/native/claude_code_native.dylib +0 -0
- package/dist/native/index.d.ts +0 -480
- package/dist/native/index.darwin-arm64.node +0 -0
- package/dist/native/index.js +43 -1625
- package/dist/native/index.node +0 -0
- package/dist/native/package.json +34 -0
- package/native/index.darwin-arm64.node +0 -0
- package/native/index.js +33 -19
- package/package.json +3 -2
- package/packages/src/core/agent-loop/__tests__/compaction.test.ts +17 -14
- package/packages/src/core/agent-loop/compaction.ts +6 -2
- package/packages/src/core/agent-loop/index.ts +2 -0
- package/packages/src/core/agent-loop/loop-state.ts +1 -1
- package/packages/src/core/agent-loop/turn-executor.ts +4 -0
- package/packages/src/core/agent-loop/types.ts +4 -0
- package/packages/src/core/api-client-impl.ts +377 -176
- package/packages/src/core/cognitive-security/hooks.ts +2 -1
- package/packages/src/core/config/todo +7 -0
- package/packages/src/core/context/__tests__/integration.test.ts +334 -0
- package/packages/src/core/context/compaction.ts +170 -0
- package/packages/src/core/context/constants.ts +58 -0
- package/packages/src/core/context/extraction.ts +85 -0
- package/packages/src/core/context/index.ts +66 -0
- package/packages/src/core/context/summarization.ts +251 -0
- package/packages/src/core/context/token-estimation.ts +98 -0
- package/packages/src/core/context/types.ts +59 -0
- package/packages/src/core/models.ts +81 -4
- package/packages/src/core/normalizers/todo +5 -1
- package/packages/src/core/providers/README.md +230 -0
- package/packages/src/core/providers/__tests__/providers.test.ts +135 -0
- package/packages/src/core/providers/index.ts +419 -0
- package/packages/src/core/providers/types.ts +132 -0
- package/packages/src/core/retry.ts +10 -0
- package/packages/src/ecosystem/tools/index.ts +174 -0
- package/packages/src/index.ts +23 -2
- package/packages/src/interfaces/ui/index.ts +17 -20
- package/packages/src/interfaces/ui/spinner.ts +2 -2
- package/packages/src/interfaces/ui/terminal/bridge/index.ts +370 -0
- package/packages/src/interfaces/ui/terminal/bridge/ipc.ts +829 -0
- package/packages/src/interfaces/ui/terminal/bridge/screen-export.ts +968 -0
- package/packages/src/interfaces/ui/terminal/bridge/types.ts +226 -0
- package/packages/src/interfaces/ui/terminal/bridge/useBridge.ts +210 -0
- package/packages/src/interfaces/ui/terminal/cli/bootstrap.ts +132 -0
- package/packages/src/interfaces/ui/terminal/cli/index.ts +200 -13
- package/packages/src/interfaces/ui/terminal/cli/interactive/index.ts +110 -0
- package/packages/src/interfaces/ui/terminal/cli/interactive/input-handler.ts +402 -0
- package/packages/src/interfaces/ui/terminal/cli/interactive/interactive-runner.ts +820 -0
- package/packages/src/interfaces/ui/terminal/cli/interactive/message-store.ts +299 -0
- package/packages/src/interfaces/ui/terminal/cli/interactive/types.ts +274 -0
- package/packages/src/interfaces/ui/terminal/shared/index.ts +13 -0
- package/packages/src/interfaces/ui/terminal/shared/query.ts +9 -3
- package/packages/src/interfaces/ui/terminal/shared/setup.ts +5 -1
- package/packages/src/interfaces/ui/terminal/shared/spinner-frames.ts +73 -0
- package/packages/src/interfaces/ui/terminal/shared/status-line.ts +10 -2
- package/packages/src/native/index.ts +404 -27
- package/packages/src/native/tui_v2_types.ts +39 -0
- package/packages/src/teammates/coordination.test.ts +279 -0
- package/packages/src/teammates/coordination.ts +646 -0
- package/packages/src/teammates/index.ts +95 -25
- package/packages/src/teammates/integration.test.ts +272 -0
- package/packages/src/teammates/runner.test.ts +235 -0
- package/packages/src/teammates/runner.ts +750 -0
- package/packages/src/teammates/schemas.ts +673 -0
- package/packages/src/types/index.ts +1 -0
- package/packages/src/core/context-compaction.ts +0 -578
- package/packages/src/interfaces/ui/Screenshot 2026-03-02 at 9.23.10/342/200/257PM.png +0 -0
- package/packages/src/interfaces/ui/Screenshot 2026-03-03 at 10.55.11/342/200/257AM.png +0 -0
- package/packages/src/interfaces/ui/terminal/tui/HelpPanel.tsx +0 -262
- package/packages/src/interfaces/ui/terminal/tui/InputContext.tsx +0 -232
- package/packages/src/interfaces/ui/terminal/tui/InputField.tsx +0 -62
- package/packages/src/interfaces/ui/terminal/tui/InteractiveTUI.tsx +0 -537
- package/packages/src/interfaces/ui/terminal/tui/MessageArea.tsx +0 -107
- package/packages/src/interfaces/ui/terminal/tui/MessageStore.tsx +0 -240
- package/packages/src/interfaces/ui/terminal/tui/StatusBar.tsx +0 -54
- package/packages/src/interfaces/ui/terminal/tui/commands.ts +0 -438
- package/packages/src/interfaces/ui/terminal/tui/components/InteractiveElements.tsx +0 -584
- package/packages/src/interfaces/ui/terminal/tui/components/MultilineInput.tsx +0 -614
- package/packages/src/interfaces/ui/terminal/tui/components/PaneManager.tsx +0 -333
- package/packages/src/interfaces/ui/terminal/tui/components/Sidebar.tsx +0 -604
- package/packages/src/interfaces/ui/terminal/tui/components/index.ts +0 -118
- package/packages/src/interfaces/ui/terminal/tui/console.ts +0 -49
- package/packages/src/interfaces/ui/terminal/tui/index.ts +0 -90
- package/packages/src/interfaces/ui/terminal/tui/run.tsx +0 -42
- package/packages/src/interfaces/ui/terminal/tui/spinner.ts +0 -69
- package/packages/src/interfaces/ui/terminal/tui/tui-app.tsx +0 -390
- package/packages/src/interfaces/ui/terminal/tui/tui-footer.ts +0 -422
- package/packages/src/interfaces/ui/terminal/tui/types.ts +0 -186
- package/packages/src/interfaces/ui/terminal/tui/useInputHandler.ts +0 -104
- package/packages/src/interfaces/ui/terminal/tui/useNativeInput.ts +0 -239
|
@@ -1,240 +0,0 @@
|
|
|
1
|
-
/** @jsx React.createElement */
|
|
2
|
-
/**
|
|
3
|
-
* Message Store - Centralized message state management
|
|
4
|
-
*
|
|
5
|
-
* Single source of truth for all messages in the TUI.
|
|
6
|
-
* Replaces the fragmented message handling with a clean, * append-only store with efficient updates.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import React, { createContext, useContext, useState, useCallback, useRef } from "react";
|
|
10
|
-
import type { Message as ApiMessage } from "../../../../types/index.js";
|
|
11
|
-
|
|
12
|
-
// ============================================
|
|
13
|
-
// TYPES
|
|
14
|
-
// ============================================
|
|
15
|
-
|
|
16
|
-
export type MessageSubType =
|
|
17
|
-
| "tool_call"
|
|
18
|
-
| "tool_result"
|
|
19
|
-
| "hook"
|
|
20
|
-
| "info"
|
|
21
|
-
| "error"
|
|
22
|
-
| "thinking";
|
|
23
|
-
|
|
24
|
-
export interface UIMessage {
|
|
25
|
-
id: string;
|
|
26
|
-
role: "user" | "assistant" | "system";
|
|
27
|
-
content: string;
|
|
28
|
-
timestamp: number;
|
|
29
|
-
subType?: MessageSubType;
|
|
30
|
-
toolName?: string;
|
|
31
|
-
isError?: boolean;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export interface MessageStoreValue {
|
|
35
|
-
/** UI messages for display */
|
|
36
|
-
messages: UIMessage[];
|
|
37
|
-
/** API messages for context */
|
|
38
|
-
apiMessages: ApiMessage[];
|
|
39
|
-
/** Add a UI message */
|
|
40
|
-
addMessage: (msg: Omit<UIMessage, "id" | "timestamp">) => string;
|
|
41
|
-
/** Add multiple messages from API response */
|
|
42
|
-
addApiMessages: (msgs: ApiMessage[]) => void;
|
|
43
|
-
/** Add system message (convenience) */
|
|
44
|
-
addSystem: (content: string, subType?: MessageSubType, toolName?: string, isError?: boolean) => string;
|
|
45
|
-
/** Clear all messages */
|
|
46
|
-
clear: () => void;
|
|
47
|
-
/** Replace messages (for undo/redo) */
|
|
48
|
-
replace: (ui: UIMessage[], api: ApiMessage[]) => void;
|
|
49
|
-
/** Total token count */
|
|
50
|
-
tokenCount: number;
|
|
51
|
-
/** Update token count */
|
|
52
|
-
setTokenCount: (count: number) => void;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
// ============================================
|
|
56
|
-
// CONTEXT
|
|
57
|
-
// ============================================
|
|
58
|
-
|
|
59
|
-
const MessageStoreContext = createContext<MessageStoreValue | null>(null);
|
|
60
|
-
|
|
61
|
-
export function useMessageStore(): MessageStoreValue {
|
|
62
|
-
const ctx = useContext(MessageStoreContext);
|
|
63
|
-
if (!ctx) {
|
|
64
|
-
throw new Error("useMessageStore must be used within MessageStoreProvider");
|
|
65
|
-
}
|
|
66
|
-
return ctx;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
// ============================================
|
|
70
|
-
// PROVIDER
|
|
71
|
-
// ============================================
|
|
72
|
-
|
|
73
|
-
export interface MessageStoreProviderProps {
|
|
74
|
-
children: React.ReactNode;
|
|
75
|
-
initialMessages?: ApiMessage[];
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
let globalMessageId = 0;
|
|
79
|
-
|
|
80
|
-
function generateId(): string {
|
|
81
|
-
globalMessageId += 1;
|
|
82
|
-
return `msg-${globalMessageId}-${Date.now()}`;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* Extract text content from API message content blocks
|
|
87
|
-
*/
|
|
88
|
-
function extractTextContent(content: ApiMessage["content"]): string {
|
|
89
|
-
if (typeof content === "string") {
|
|
90
|
-
return content;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
return content.map((block) => {
|
|
94
|
-
switch (block.type) {
|
|
95
|
-
case "text":
|
|
96
|
-
return block.text;
|
|
97
|
-
case "tool_use":
|
|
98
|
-
return `[Tool: ${block.name}]\n${JSON.stringify(block.input, null, 2)}`;
|
|
99
|
-
case "tool_result": {
|
|
100
|
-
const resultContent = typeof block.content === "string"
|
|
101
|
-
? block.content
|
|
102
|
-
: extractTextContent(block.content);
|
|
103
|
-
const prefix = block.is_error ? "[Tool Error]" : "[Tool Result]";
|
|
104
|
-
const truncated = resultContent.length > 500
|
|
105
|
-
? resultContent.slice(0, 500) + "..."
|
|
106
|
-
: resultContent;
|
|
107
|
-
return `${prefix}\n${truncated}`;
|
|
108
|
-
}
|
|
109
|
-
case "thinking":
|
|
110
|
-
return `[Thinking]\n${block.thinking}`;
|
|
111
|
-
case "redacted_thinking":
|
|
112
|
-
return "[Redacted Thinking]";
|
|
113
|
-
case "image":
|
|
114
|
-
return "[Image]";
|
|
115
|
-
default:
|
|
116
|
-
return "";
|
|
117
|
-
}
|
|
118
|
-
}).join("\n\n");
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
/**
|
|
122
|
-
* Convert API message to UI message
|
|
123
|
-
*/
|
|
124
|
-
function apiToUi(msg: ApiMessage): UIMessage | null {
|
|
125
|
-
const content = extractTextContent(msg.content);
|
|
126
|
-
if (!content) return null;
|
|
127
|
-
|
|
128
|
-
return {
|
|
129
|
-
id: generateId(),
|
|
130
|
-
role: msg.role,
|
|
131
|
-
content,
|
|
132
|
-
timestamp: Date.now(),
|
|
133
|
-
};
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
export function MessageStoreProvider({
|
|
137
|
-
children,
|
|
138
|
-
initialMessages = [],
|
|
139
|
-
}: MessageStoreProviderProps) {
|
|
140
|
-
const [messages, setMessages] = useState<UIMessage[]>(() => {
|
|
141
|
-
// Convert initial API messages to UI messages
|
|
142
|
-
return initialMessages
|
|
143
|
-
.map(apiToUi)
|
|
144
|
-
.filter((m): m is UIMessage => m !== null);
|
|
145
|
-
});
|
|
146
|
-
|
|
147
|
-
const [apiMessages, setApiMessages] = useState<ApiMessage[]>(initialMessages);
|
|
148
|
-
const [tokenCount, setTokenCount] = useState(0);
|
|
149
|
-
|
|
150
|
-
// Track pending user messages that were added manually (to skip in addApiMessages)
|
|
151
|
-
const pendingUserMessagesRef = useRef<Set<string>>(new Set());
|
|
152
|
-
|
|
153
|
-
const addMessage = useCallback((msg: Omit<UIMessage, "id" | "timestamp">): string => {
|
|
154
|
-
const id = generateId();
|
|
155
|
-
const fullMsg: UIMessage = {
|
|
156
|
-
...msg,
|
|
157
|
-
id,
|
|
158
|
-
timestamp: Date.now(),
|
|
159
|
-
};
|
|
160
|
-
setMessages((prev) => [...prev, fullMsg]);
|
|
161
|
-
|
|
162
|
-
// Track user messages that were added manually
|
|
163
|
-
if (msg.role === "user") {
|
|
164
|
-
pendingUserMessagesRef.current.add(msg.content);
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
return id;
|
|
168
|
-
}, []);
|
|
169
|
-
|
|
170
|
-
const addApiMessages = useCallback((newApiMsgs: ApiMessage[]) => {
|
|
171
|
-
if (newApiMsgs.length === 0) return;
|
|
172
|
-
|
|
173
|
-
// Update API messages
|
|
174
|
-
setApiMessages((prev) => [...prev, ...newApiMsgs]);
|
|
175
|
-
|
|
176
|
-
// Convert API messages to UI messages, skipping user messages that were already added manually
|
|
177
|
-
const newUiMsgs = newApiMsgs
|
|
178
|
-
.map(apiToUi)
|
|
179
|
-
.filter((m): m is UIMessage => m !== null)
|
|
180
|
-
.filter((m) => {
|
|
181
|
-
// Skip user messages that were already added manually
|
|
182
|
-
if (m.role === "user" && pendingUserMessagesRef.current.has(m.content)) {
|
|
183
|
-
pendingUserMessagesRef.current.delete(m.content); // Clean up
|
|
184
|
-
return false;
|
|
185
|
-
}
|
|
186
|
-
return true;
|
|
187
|
-
});
|
|
188
|
-
|
|
189
|
-
if (newUiMsgs.length > 0) {
|
|
190
|
-
setMessages((prev) => [...prev, ...newUiMsgs]);
|
|
191
|
-
}
|
|
192
|
-
}, []);
|
|
193
|
-
|
|
194
|
-
const addSystem = useCallback((
|
|
195
|
-
content: string,
|
|
196
|
-
subType?: MessageSubType,
|
|
197
|
-
toolName?: string,
|
|
198
|
-
isError?: boolean
|
|
199
|
-
): string => {
|
|
200
|
-
return addMessage({
|
|
201
|
-
role: "system",
|
|
202
|
-
content,
|
|
203
|
-
subType,
|
|
204
|
-
toolName,
|
|
205
|
-
isError,
|
|
206
|
-
});
|
|
207
|
-
}, [addMessage]);
|
|
208
|
-
|
|
209
|
-
const clear = useCallback(() => {
|
|
210
|
-
setMessages([]);
|
|
211
|
-
setApiMessages([]);
|
|
212
|
-
pendingUserMessagesRef.current.clear();
|
|
213
|
-
}, []);
|
|
214
|
-
|
|
215
|
-
const replace = useCallback((ui: UIMessage[], api: ApiMessage[]) => {
|
|
216
|
-
setMessages(ui);
|
|
217
|
-
setApiMessages(api);
|
|
218
|
-
pendingUserMessagesRef.current.clear();
|
|
219
|
-
}, []);
|
|
220
|
-
|
|
221
|
-
const value: MessageStoreValue = {
|
|
222
|
-
messages,
|
|
223
|
-
apiMessages,
|
|
224
|
-
addMessage,
|
|
225
|
-
addApiMessages,
|
|
226
|
-
addSystem,
|
|
227
|
-
clear,
|
|
228
|
-
replace,
|
|
229
|
-
tokenCount,
|
|
230
|
-
setTokenCount,
|
|
231
|
-
};
|
|
232
|
-
|
|
233
|
-
return (
|
|
234
|
-
<MessageStoreContext.Provider value={value}>
|
|
235
|
-
{children}
|
|
236
|
-
</MessageStoreContext.Provider>
|
|
237
|
-
);
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
export default MessageStoreContext;
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
/** @jsx React.createElement */
|
|
2
|
-
/**
|
|
3
|
-
* Status Bar Component - Simple plain text
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import React from "react";
|
|
7
|
-
import { Text } from "ink";
|
|
8
|
-
import type { StatusBarProps } from "./types.js";
|
|
9
|
-
import { calculateContextInfo, getPermissionModeDisplay } from "../shared/status-line.js";
|
|
10
|
-
|
|
11
|
-
function formatTokens(tokens: number): string {
|
|
12
|
-
if (tokens < 1000) {
|
|
13
|
-
return `${tokens}`;
|
|
14
|
-
} else if (tokens < 100000) {
|
|
15
|
-
return `${(tokens / 1000).toFixed(1)}k`;
|
|
16
|
-
} else {
|
|
17
|
-
return `${(tokens / 1000).toFixed(0)}k`;
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export function StatusBar({
|
|
22
|
-
permissionMode,
|
|
23
|
-
tokensUsed,
|
|
24
|
-
model,
|
|
25
|
-
isLoading,
|
|
26
|
-
spinnerFrame,
|
|
27
|
-
}: StatusBarProps) {
|
|
28
|
-
const contextInfo = calculateContextInfo(tokensUsed, model);
|
|
29
|
-
const permDisplay = getPermissionModeDisplay(permissionMode);
|
|
30
|
-
|
|
31
|
-
const parts: string[] = [];
|
|
32
|
-
|
|
33
|
-
if (isLoading) {
|
|
34
|
-
parts.push(spinnerFrame);
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
const percentColor = contextInfo.isCritical
|
|
38
|
-
? "red"
|
|
39
|
-
: contextInfo.isLow
|
|
40
|
-
? "yellow"
|
|
41
|
-
: undefined;
|
|
42
|
-
|
|
43
|
-
const contextDisplay = `Context: ${contextInfo.percentRemaining.toFixed(0)}% (${formatTokens(tokensUsed)})`;
|
|
44
|
-
parts.push(contextDisplay);
|
|
45
|
-
parts.push(`${permDisplay.symbol} ${permDisplay.label}`);
|
|
46
|
-
|
|
47
|
-
return (
|
|
48
|
-
<Text dimColor={percentColor === undefined} color={percentColor}>
|
|
49
|
-
{parts.join(" | ")}
|
|
50
|
-
</Text>
|
|
51
|
-
);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
export default StatusBar;
|