@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.
Files changed (101) hide show
  1. package/dist/index.js +36233 -32
  2. package/dist/interfaces/ui/terminal/cli/index.js +34318 -158
  3. package/dist/interfaces/ui/terminal/native/README.md +53 -0
  4. package/dist/interfaces/ui/terminal/native/claude_code_native.darwin-x64.node +0 -0
  5. package/dist/interfaces/ui/terminal/native/claude_code_native.dylib +0 -0
  6. package/dist/interfaces/ui/terminal/native/index.d.ts +0 -0
  7. package/dist/interfaces/ui/terminal/native/index.darwin-arm64.node +0 -0
  8. package/dist/interfaces/ui/terminal/native/index.js +43 -0
  9. package/dist/interfaces/ui/terminal/native/index.node +0 -0
  10. package/dist/interfaces/ui/terminal/native/package.json +34 -0
  11. package/dist/native/README.md +53 -0
  12. package/dist/native/claude_code_native.darwin-x64.node +0 -0
  13. package/dist/native/claude_code_native.dylib +0 -0
  14. package/dist/native/index.d.ts +0 -480
  15. package/dist/native/index.darwin-arm64.node +0 -0
  16. package/dist/native/index.js +43 -1625
  17. package/dist/native/index.node +0 -0
  18. package/dist/native/package.json +34 -0
  19. package/native/index.darwin-arm64.node +0 -0
  20. package/native/index.js +33 -19
  21. package/package.json +3 -2
  22. package/packages/src/core/agent-loop/__tests__/compaction.test.ts +17 -14
  23. package/packages/src/core/agent-loop/compaction.ts +6 -2
  24. package/packages/src/core/agent-loop/index.ts +2 -0
  25. package/packages/src/core/agent-loop/loop-state.ts +1 -1
  26. package/packages/src/core/agent-loop/turn-executor.ts +4 -0
  27. package/packages/src/core/agent-loop/types.ts +4 -0
  28. package/packages/src/core/api-client-impl.ts +377 -176
  29. package/packages/src/core/cognitive-security/hooks.ts +2 -1
  30. package/packages/src/core/config/todo +7 -0
  31. package/packages/src/core/context/__tests__/integration.test.ts +334 -0
  32. package/packages/src/core/context/compaction.ts +170 -0
  33. package/packages/src/core/context/constants.ts +58 -0
  34. package/packages/src/core/context/extraction.ts +85 -0
  35. package/packages/src/core/context/index.ts +66 -0
  36. package/packages/src/core/context/summarization.ts +251 -0
  37. package/packages/src/core/context/token-estimation.ts +98 -0
  38. package/packages/src/core/context/types.ts +59 -0
  39. package/packages/src/core/models.ts +81 -4
  40. package/packages/src/core/normalizers/todo +5 -1
  41. package/packages/src/core/providers/README.md +230 -0
  42. package/packages/src/core/providers/__tests__/providers.test.ts +135 -0
  43. package/packages/src/core/providers/index.ts +419 -0
  44. package/packages/src/core/providers/types.ts +132 -0
  45. package/packages/src/core/retry.ts +10 -0
  46. package/packages/src/ecosystem/tools/index.ts +174 -0
  47. package/packages/src/index.ts +23 -2
  48. package/packages/src/interfaces/ui/index.ts +17 -20
  49. package/packages/src/interfaces/ui/spinner.ts +2 -2
  50. package/packages/src/interfaces/ui/terminal/bridge/index.ts +370 -0
  51. package/packages/src/interfaces/ui/terminal/bridge/ipc.ts +829 -0
  52. package/packages/src/interfaces/ui/terminal/bridge/screen-export.ts +968 -0
  53. package/packages/src/interfaces/ui/terminal/bridge/types.ts +226 -0
  54. package/packages/src/interfaces/ui/terminal/bridge/useBridge.ts +210 -0
  55. package/packages/src/interfaces/ui/terminal/cli/bootstrap.ts +132 -0
  56. package/packages/src/interfaces/ui/terminal/cli/index.ts +200 -13
  57. package/packages/src/interfaces/ui/terminal/cli/interactive/index.ts +110 -0
  58. package/packages/src/interfaces/ui/terminal/cli/interactive/input-handler.ts +402 -0
  59. package/packages/src/interfaces/ui/terminal/cli/interactive/interactive-runner.ts +820 -0
  60. package/packages/src/interfaces/ui/terminal/cli/interactive/message-store.ts +299 -0
  61. package/packages/src/interfaces/ui/terminal/cli/interactive/types.ts +274 -0
  62. package/packages/src/interfaces/ui/terminal/shared/index.ts +13 -0
  63. package/packages/src/interfaces/ui/terminal/shared/query.ts +9 -3
  64. package/packages/src/interfaces/ui/terminal/shared/setup.ts +5 -1
  65. package/packages/src/interfaces/ui/terminal/shared/spinner-frames.ts +73 -0
  66. package/packages/src/interfaces/ui/terminal/shared/status-line.ts +10 -2
  67. package/packages/src/native/index.ts +404 -27
  68. package/packages/src/native/tui_v2_types.ts +39 -0
  69. package/packages/src/teammates/coordination.test.ts +279 -0
  70. package/packages/src/teammates/coordination.ts +646 -0
  71. package/packages/src/teammates/index.ts +95 -25
  72. package/packages/src/teammates/integration.test.ts +272 -0
  73. package/packages/src/teammates/runner.test.ts +235 -0
  74. package/packages/src/teammates/runner.ts +750 -0
  75. package/packages/src/teammates/schemas.ts +673 -0
  76. package/packages/src/types/index.ts +1 -0
  77. package/packages/src/core/context-compaction.ts +0 -578
  78. package/packages/src/interfaces/ui/Screenshot 2026-03-02 at 9.23.10/342/200/257PM.png +0 -0
  79. package/packages/src/interfaces/ui/Screenshot 2026-03-03 at 10.55.11/342/200/257AM.png +0 -0
  80. package/packages/src/interfaces/ui/terminal/tui/HelpPanel.tsx +0 -262
  81. package/packages/src/interfaces/ui/terminal/tui/InputContext.tsx +0 -232
  82. package/packages/src/interfaces/ui/terminal/tui/InputField.tsx +0 -62
  83. package/packages/src/interfaces/ui/terminal/tui/InteractiveTUI.tsx +0 -537
  84. package/packages/src/interfaces/ui/terminal/tui/MessageArea.tsx +0 -107
  85. package/packages/src/interfaces/ui/terminal/tui/MessageStore.tsx +0 -240
  86. package/packages/src/interfaces/ui/terminal/tui/StatusBar.tsx +0 -54
  87. package/packages/src/interfaces/ui/terminal/tui/commands.ts +0 -438
  88. package/packages/src/interfaces/ui/terminal/tui/components/InteractiveElements.tsx +0 -584
  89. package/packages/src/interfaces/ui/terminal/tui/components/MultilineInput.tsx +0 -614
  90. package/packages/src/interfaces/ui/terminal/tui/components/PaneManager.tsx +0 -333
  91. package/packages/src/interfaces/ui/terminal/tui/components/Sidebar.tsx +0 -604
  92. package/packages/src/interfaces/ui/terminal/tui/components/index.ts +0 -118
  93. package/packages/src/interfaces/ui/terminal/tui/console.ts +0 -49
  94. package/packages/src/interfaces/ui/terminal/tui/index.ts +0 -90
  95. package/packages/src/interfaces/ui/terminal/tui/run.tsx +0 -42
  96. package/packages/src/interfaces/ui/terminal/tui/spinner.ts +0 -69
  97. package/packages/src/interfaces/ui/terminal/tui/tui-app.tsx +0 -390
  98. package/packages/src/interfaces/ui/terminal/tui/tui-footer.ts +0 -422
  99. package/packages/src/interfaces/ui/terminal/tui/types.ts +0 -186
  100. package/packages/src/interfaces/ui/terminal/tui/useInputHandler.ts +0 -104
  101. 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;