wave-code 0.17.9 → 0.17.11
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/acp/agent.d.ts.map +1 -1
- package/dist/acp/agent.js +49 -1
- package/dist/components/InputBox.js +1 -1
- package/dist/components/LoginCommand.d.ts.map +1 -1
- package/dist/components/LoginCommand.js +21 -0
- package/dist/components/StatusLine.js +1 -1
- package/dist/contexts/useChat.js +2 -2
- package/package.json +2 -2
- package/src/acp/agent.ts +51 -1
- package/src/components/InputBox.tsx +1 -1
- package/src/components/LoginCommand.tsx +20 -0
- package/src/components/StatusLine.tsx +1 -1
- package/src/contexts/useChat.tsx +2 -2
package/dist/acp/agent.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/acp/agent.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/acp/agent.ts"],"names":[],"mappings":"AA0BA,OAAO,EACL,KAAK,KAAK,IAAI,QAAQ,EACtB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EAUzB,KAAK,qBAAqB,EAC1B,KAAK,6BAA6B,EAClC,KAAK,8BAA8B,EAQpC,MAAM,0BAA0B,CAAC;AAwBlC,qBAAa,YAAa,YAAW,QAAQ;IAC3C,OAAO,CAAC,MAAM,CAAqC;IACnD,OAAO,CAAC,UAAU,CAAsB;IACxC,OAAO,CAAC,SAAS,CAA6B;gBAElC,UAAU,EAAE,mBAAmB;IAI3C,OAAO,CAAC,mBAAmB;IAkC3B,OAAO,CAAC,uBAAuB;YAmCjB,gBAAgB;IASxB,UAAU,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAyBzC,YAAY,IAAI,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;YAI5C,WAAW;IAgFnB,UAAU,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAalE,WAAW,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAcrE,YAAY,CAChB,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CAAC,oBAAoB,CAAC;IAuB1B,qBAAqB,CACzB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAc7B,SAAS,CACb,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAO7B,cAAc,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAc5D,sBAAsB,CAC1B,MAAM,EAAE,6BAA6B,GACpC,OAAO,CAAC,8BAA8B,CAAC;IAuBpC,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;IA+DtD,MAAM,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IASvD,OAAO,CAAC,kBAAkB;YA2BZ,iBAAiB;YAsEjB,gBAAgB;YAyDhB,uBAAuB;IAmNrC,OAAO,CAAC,cAAc;IA6FtB,OAAO,CAAC,gBAAgB;IAmCxB,OAAO,CAAC,WAAW;YAmBL,yBAAyB;IAoIvC,OAAO,CAAC,eAAe;CA8RxB"}
|
package/dist/acp/agent.js
CHANGED
|
@@ -135,6 +135,7 @@ export class WaveAcpAgent {
|
|
|
135
135
|
onUserMessageAdded: (params) => callbacks.onUserMessageAdded?.(params),
|
|
136
136
|
onMcpServersChange: (servers) => callbacks.onMcpServersChange?.(servers),
|
|
137
137
|
onSessionIdChange: (newSessionId) => callbacks.onSessionIdChange?.(newSessionId),
|
|
138
|
+
onLatestTotalTokensChange: (tokens) => callbacks.onLatestTotalTokensChange?.(tokens),
|
|
138
139
|
},
|
|
139
140
|
});
|
|
140
141
|
agentRef.instance = agent;
|
|
@@ -247,7 +248,7 @@ export class WaveAcpAgent {
|
|
|
247
248
|
};
|
|
248
249
|
}
|
|
249
250
|
async prompt(params) {
|
|
250
|
-
const { sessionId, prompt } = params;
|
|
251
|
+
const { sessionId, prompt, messageId } = params;
|
|
251
252
|
logger.info(`Received prompt for session ${sessionId}`);
|
|
252
253
|
logger.debug(`Prompt content for session ${sessionId}:`, prompt);
|
|
253
254
|
const agent = this.agents.get(sessionId);
|
|
@@ -281,11 +282,14 @@ export class WaveAcpAgent {
|
|
|
281
282
|
}
|
|
282
283
|
}
|
|
283
284
|
const textContent = textBlocks.join("\n");
|
|
285
|
+
const usagesBefore = agent.usages.length;
|
|
284
286
|
try {
|
|
285
287
|
await agent.sendMessage(textContent, images.length > 0 ? images : undefined);
|
|
286
288
|
logger.info(`Message sent successfully for session ${sessionId}`);
|
|
287
289
|
return {
|
|
288
290
|
stopReason: "end_turn",
|
|
291
|
+
...mapTurnUsage(agent.usages.slice(usagesBefore)),
|
|
292
|
+
...(messageId ? { userMessageId: messageId } : {}),
|
|
289
293
|
};
|
|
290
294
|
}
|
|
291
295
|
catch (error) {
|
|
@@ -293,6 +297,8 @@ export class WaveAcpAgent {
|
|
|
293
297
|
logger.info(`Message aborted for session ${sessionId}`);
|
|
294
298
|
return {
|
|
295
299
|
stopReason: "cancelled",
|
|
300
|
+
...mapTurnUsage(agent.usages.slice(usagesBefore)),
|
|
301
|
+
...(messageId ? { userMessageId: messageId } : {}),
|
|
296
302
|
};
|
|
297
303
|
}
|
|
298
304
|
logger.error(`Error sending message for session ${sessionId}:`, error);
|
|
@@ -1048,6 +1054,18 @@ export class WaveAcpAgent {
|
|
|
1048
1054
|
},
|
|
1049
1055
|
});
|
|
1050
1056
|
},
|
|
1057
|
+
onLatestTotalTokensChange: (tokens) => {
|
|
1058
|
+
const agent = getAgent();
|
|
1059
|
+
const contextWindowSize = agent?.getMaxInputTokens() ?? 0;
|
|
1060
|
+
this.connection.sessionUpdate({
|
|
1061
|
+
sessionId: sessionRef.id,
|
|
1062
|
+
update: {
|
|
1063
|
+
sessionUpdate: "usage_update",
|
|
1064
|
+
size: contextWindowSize,
|
|
1065
|
+
used: tokens,
|
|
1066
|
+
},
|
|
1067
|
+
});
|
|
1068
|
+
},
|
|
1051
1069
|
},
|
|
1052
1070
|
sessionRef,
|
|
1053
1071
|
};
|
|
@@ -1100,3 +1118,33 @@ function convertHttpHeaders(headers) {
|
|
|
1100
1118
|
}
|
|
1101
1119
|
return result;
|
|
1102
1120
|
}
|
|
1121
|
+
/**
|
|
1122
|
+
* Map per-turn SDK usages to a single ACP Usage object.
|
|
1123
|
+
* Returns undefined when there are no usage entries.
|
|
1124
|
+
*/
|
|
1125
|
+
function mapTurnUsage(newUsages) {
|
|
1126
|
+
if (newUsages.length === 0)
|
|
1127
|
+
return {};
|
|
1128
|
+
let inputTokens = 0;
|
|
1129
|
+
let outputTokens = 0;
|
|
1130
|
+
let totalTokens = 0;
|
|
1131
|
+
let cachedReadTokens = 0;
|
|
1132
|
+
let cachedWriteTokens = 0;
|
|
1133
|
+
for (const u of newUsages) {
|
|
1134
|
+
inputTokens += u.prompt_tokens;
|
|
1135
|
+
outputTokens += u.completion_tokens;
|
|
1136
|
+
totalTokens += u.total_tokens;
|
|
1137
|
+
cachedReadTokens += u.cache_read_input_tokens ?? 0;
|
|
1138
|
+
cachedWriteTokens += u.cache_creation_input_tokens ?? 0;
|
|
1139
|
+
}
|
|
1140
|
+
const usage = {
|
|
1141
|
+
inputTokens,
|
|
1142
|
+
outputTokens,
|
|
1143
|
+
totalTokens,
|
|
1144
|
+
};
|
|
1145
|
+
if (cachedReadTokens > 0)
|
|
1146
|
+
usage.cachedReadTokens = cachedReadTokens;
|
|
1147
|
+
if (cachedWriteTokens > 0)
|
|
1148
|
+
usage.cachedWriteTokens = cachedWriteTokens;
|
|
1149
|
+
return { usage };
|
|
1150
|
+
}
|
|
@@ -20,7 +20,7 @@ import { useInputManager } from "../hooks/useInputManager.js";
|
|
|
20
20
|
import { useChat } from "../contexts/useChat.js";
|
|
21
21
|
export const INPUT_PLACEHOLDER_TEXT = "Type your message (use /help for more info)...";
|
|
22
22
|
export const INPUT_PLACEHOLDER_TEXT_PREFIX = INPUT_PLACEHOLDER_TEXT.substring(0, 10);
|
|
23
|
-
export const InputBox = ({ sendMessage = () => { }, abortMessage = () => { }, mcpServers = [], connectMcpServer = async () => false, disconnectMcpServer = async () => false, slashCommands = [], hasSlashCommand = () => false, latestTotalTokens = 0, maxInputTokens =
|
|
23
|
+
export const InputBox = ({ sendMessage = () => { }, abortMessage = () => { }, mcpServers = [], connectMcpServer = async () => false, disconnectMcpServer = async () => false, slashCommands = [], hasSlashCommand = () => false, latestTotalTokens = 0, maxInputTokens = 200000, isGoalActive, goalElapsed, }) => {
|
|
24
24
|
const { permissionMode: chatPermissionMode, setPermissionMode: setChatPermissionMode, handleRewindSelect, backgroundCurrentTask, messages, getFullMessageThread, sessionId, workingDirectory, askBtw, clearMessages, compact, goalCommand, currentModel, configuredModels, setModel, recreateAgent, recallQueuedMessage, queuedMessages, } = useChat();
|
|
25
25
|
// Ref to hold setInputText so queue callbacks can access it before useInputManager returns
|
|
26
26
|
const setInputTextRef = useRef(() => { });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LoginCommand.d.ts","sourceRoot":"","sources":["../../src/components/LoginCommand.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2B,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"LoginCommand.d.ts","sourceRoot":"","sources":["../../src/components/LoginCommand.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2B,MAAM,OAAO,CAAC;AAuBhD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CA0MpD,CAAC"}
|
|
@@ -1,7 +1,27 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
import { useRef, useState } from "react";
|
|
3
3
|
import { Box, Text, useInput } from "ink";
|
|
4
|
+
import { execFile } from "child_process";
|
|
5
|
+
import { promisify } from "util";
|
|
4
6
|
import { authService } from "wave-agent-sdk";
|
|
7
|
+
const execFileAsync = promisify(execFile);
|
|
8
|
+
function openBrowser(url) {
|
|
9
|
+
const platform = process.platform;
|
|
10
|
+
try {
|
|
11
|
+
if (platform === "darwin") {
|
|
12
|
+
execFileAsync("open", [url]);
|
|
13
|
+
}
|
|
14
|
+
else if (platform === "win32") {
|
|
15
|
+
execFileAsync("cmd", ["/c", "start", "", url]);
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
execFileAsync("xdg-open", [url]);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
// Browser not available — URL is still displayed in the UI
|
|
23
|
+
}
|
|
24
|
+
}
|
|
5
25
|
export const LoginCommand = ({ onCancel }) => {
|
|
6
26
|
const [isLoading, setIsLoading] = useState(false);
|
|
7
27
|
const [message, setMessage] = useState("");
|
|
@@ -73,6 +93,7 @@ export const LoginCommand = ({ onCancel }) => {
|
|
|
73
93
|
await authService.login({
|
|
74
94
|
onAuthUrl: (url) => {
|
|
75
95
|
setAuthUrl(url);
|
|
96
|
+
openBrowser(url);
|
|
76
97
|
setMessage("Paste the authorization code from your browser URL bar:");
|
|
77
98
|
},
|
|
78
99
|
readToken,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { Box, Text } from "ink";
|
|
3
|
-
export const StatusLine = ({ permissionMode, isShellCommand, isGoalActive, goalElapsed, latestTotalTokens = 0, maxInputTokens =
|
|
3
|
+
export const StatusLine = ({ permissionMode, isShellCommand, isGoalActive, goalElapsed, latestTotalTokens = 0, maxInputTokens = 200000, }) => {
|
|
4
4
|
const percentage = latestTotalTokens > 0
|
|
5
5
|
? Math.min(Math.round((latestTotalTokens / maxInputTokens) * 100), 100)
|
|
6
6
|
: 0;
|
package/dist/contexts/useChat.js
CHANGED
|
@@ -24,7 +24,7 @@ export const ChatProvider = ({ children, bypassPermissions, permissionMode: init
|
|
|
24
24
|
const [isTaskListVisible, setIsTaskListVisible] = useState(true);
|
|
25
25
|
const [messages, setMessages] = useState([]);
|
|
26
26
|
const [latestTotalTokens, setLatestTotalTokens] = useState(0);
|
|
27
|
-
const [maxInputTokens, setMaxInputTokens] = useState(
|
|
27
|
+
const [maxInputTokens, setMaxInputTokens] = useState(200000);
|
|
28
28
|
const throttledSetMessages = useMemo(() => throttle(() => {
|
|
29
29
|
if (!isExpandedRef.current && agentRef.current) {
|
|
30
30
|
const msgs = [...agentRef.current.messages];
|
|
@@ -289,7 +289,7 @@ export const ChatProvider = ({ children, bypassPermissions, permissionMode: init
|
|
|
289
289
|
setSessionId("");
|
|
290
290
|
setIsLoading(false);
|
|
291
291
|
setLatestTotalTokens(0);
|
|
292
|
-
setMaxInputTokens(
|
|
292
|
+
setMaxInputTokens(200000);
|
|
293
293
|
setIsCommandRunning(false);
|
|
294
294
|
setIsCompacting(false);
|
|
295
295
|
if (currentSessionId) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "wave-code",
|
|
3
|
-
"version": "0.17.
|
|
3
|
+
"version": "0.17.11",
|
|
4
4
|
"description": "CLI-based code assistant powered by AI, built with React and Ink",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
"semver": "^7.7.4",
|
|
43
43
|
"yargs": "^17.7.2",
|
|
44
44
|
"zod": "^3.23.8",
|
|
45
|
-
"wave-agent-sdk": "0.17.
|
|
45
|
+
"wave-agent-sdk": "0.17.11"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
48
|
"@types/react": "^19.1.8",
|
package/src/acp/agent.ts
CHANGED
|
@@ -21,6 +21,7 @@ import {
|
|
|
21
21
|
type ReasoningBlock,
|
|
22
22
|
type ToolBlock,
|
|
23
23
|
type CompactBlock,
|
|
24
|
+
type Usage as SdkUsage,
|
|
24
25
|
} from "wave-agent-sdk";
|
|
25
26
|
import { logger } from "../utils/logger.js";
|
|
26
27
|
import {
|
|
@@ -54,6 +55,7 @@ import {
|
|
|
54
55
|
type EmbeddedResource,
|
|
55
56
|
type ImageContent,
|
|
56
57
|
type McpServer,
|
|
58
|
+
type Usage,
|
|
57
59
|
AGENT_METHODS,
|
|
58
60
|
} from "@agentclientprotocol/sdk";
|
|
59
61
|
import type { McpServerConfig, McpServerStatus } from "wave-agent-sdk";
|
|
@@ -241,6 +243,8 @@ export class WaveAcpAgent implements AcpAgent {
|
|
|
241
243
|
callbacks.onMcpServersChange?.(servers),
|
|
242
244
|
onSessionIdChange: (newSessionId: string) =>
|
|
243
245
|
callbacks.onSessionIdChange?.(newSessionId),
|
|
246
|
+
onLatestTotalTokensChange: (tokens: number) =>
|
|
247
|
+
callbacks.onLatestTotalTokensChange?.(tokens),
|
|
244
248
|
},
|
|
245
249
|
});
|
|
246
250
|
|
|
@@ -391,7 +395,7 @@ export class WaveAcpAgent implements AcpAgent {
|
|
|
391
395
|
}
|
|
392
396
|
|
|
393
397
|
async prompt(params: PromptRequest): Promise<PromptResponse> {
|
|
394
|
-
const { sessionId, prompt } = params;
|
|
398
|
+
const { sessionId, prompt, messageId } = params;
|
|
395
399
|
logger.info(`Received prompt for session ${sessionId}`);
|
|
396
400
|
logger.debug(`Prompt content for session ${sessionId}:`, prompt);
|
|
397
401
|
const agent = this.agents.get(sessionId);
|
|
@@ -426,6 +430,8 @@ export class WaveAcpAgent implements AcpAgent {
|
|
|
426
430
|
|
|
427
431
|
const textContent = textBlocks.join("\n");
|
|
428
432
|
|
|
433
|
+
const usagesBefore = agent.usages.length;
|
|
434
|
+
|
|
429
435
|
try {
|
|
430
436
|
await agent.sendMessage(
|
|
431
437
|
textContent,
|
|
@@ -434,12 +440,16 @@ export class WaveAcpAgent implements AcpAgent {
|
|
|
434
440
|
logger.info(`Message sent successfully for session ${sessionId}`);
|
|
435
441
|
return {
|
|
436
442
|
stopReason: "end_turn" as StopReason,
|
|
443
|
+
...mapTurnUsage(agent.usages.slice(usagesBefore)),
|
|
444
|
+
...(messageId ? { userMessageId: messageId } : {}),
|
|
437
445
|
};
|
|
438
446
|
} catch (error) {
|
|
439
447
|
if (error instanceof Error && error.message.includes("abort")) {
|
|
440
448
|
logger.info(`Message aborted for session ${sessionId}`);
|
|
441
449
|
return {
|
|
442
450
|
stopReason: "cancelled" as StopReason,
|
|
451
|
+
...mapTurnUsage(agent.usages.slice(usagesBefore)),
|
|
452
|
+
...(messageId ? { userMessageId: messageId } : {}),
|
|
443
453
|
};
|
|
444
454
|
}
|
|
445
455
|
logger.error(`Error sending message for session ${sessionId}:`, error);
|
|
@@ -1370,6 +1380,18 @@ export class WaveAcpAgent implements AcpAgent {
|
|
|
1370
1380
|
},
|
|
1371
1381
|
});
|
|
1372
1382
|
},
|
|
1383
|
+
onLatestTotalTokensChange: (tokens: number) => {
|
|
1384
|
+
const agent = getAgent();
|
|
1385
|
+
const contextWindowSize = agent?.getMaxInputTokens() ?? 0;
|
|
1386
|
+
this.connection.sessionUpdate({
|
|
1387
|
+
sessionId: sessionRef.id as AcpSessionId,
|
|
1388
|
+
update: {
|
|
1389
|
+
sessionUpdate: "usage_update" as const,
|
|
1390
|
+
size: contextWindowSize,
|
|
1391
|
+
used: tokens,
|
|
1392
|
+
},
|
|
1393
|
+
});
|
|
1394
|
+
},
|
|
1373
1395
|
},
|
|
1374
1396
|
sessionRef,
|
|
1375
1397
|
};
|
|
@@ -1429,3 +1451,31 @@ function convertHttpHeaders(
|
|
|
1429
1451
|
}
|
|
1430
1452
|
return result;
|
|
1431
1453
|
}
|
|
1454
|
+
|
|
1455
|
+
/**
|
|
1456
|
+
* Map per-turn SDK usages to a single ACP Usage object.
|
|
1457
|
+
* Returns undefined when there are no usage entries.
|
|
1458
|
+
*/
|
|
1459
|
+
function mapTurnUsage(newUsages: SdkUsage[]): { usage?: Usage } {
|
|
1460
|
+
if (newUsages.length === 0) return {};
|
|
1461
|
+
let inputTokens = 0;
|
|
1462
|
+
let outputTokens = 0;
|
|
1463
|
+
let totalTokens = 0;
|
|
1464
|
+
let cachedReadTokens = 0;
|
|
1465
|
+
let cachedWriteTokens = 0;
|
|
1466
|
+
for (const u of newUsages) {
|
|
1467
|
+
inputTokens += u.prompt_tokens;
|
|
1468
|
+
outputTokens += u.completion_tokens;
|
|
1469
|
+
totalTokens += u.total_tokens;
|
|
1470
|
+
cachedReadTokens += u.cache_read_input_tokens ?? 0;
|
|
1471
|
+
cachedWriteTokens += u.cache_creation_input_tokens ?? 0;
|
|
1472
|
+
}
|
|
1473
|
+
const usage: Usage = {
|
|
1474
|
+
inputTokens,
|
|
1475
|
+
outputTokens,
|
|
1476
|
+
totalTokens,
|
|
1477
|
+
};
|
|
1478
|
+
if (cachedReadTokens > 0) usage.cachedReadTokens = cachedReadTokens;
|
|
1479
|
+
if (cachedWriteTokens > 0) usage.cachedWriteTokens = cachedWriteTokens;
|
|
1480
|
+
return { usage };
|
|
1481
|
+
}
|
|
@@ -1,7 +1,26 @@
|
|
|
1
1
|
import React, { useRef, useState } from "react";
|
|
2
2
|
import { Box, Text, useInput } from "ink";
|
|
3
|
+
import { execFile } from "child_process";
|
|
4
|
+
import { promisify } from "util";
|
|
3
5
|
import { authService } from "wave-agent-sdk";
|
|
4
6
|
|
|
7
|
+
const execFileAsync = promisify(execFile);
|
|
8
|
+
|
|
9
|
+
function openBrowser(url: string): void {
|
|
10
|
+
const platform = process.platform;
|
|
11
|
+
try {
|
|
12
|
+
if (platform === "darwin") {
|
|
13
|
+
execFileAsync("open", [url]);
|
|
14
|
+
} else if (platform === "win32") {
|
|
15
|
+
execFileAsync("cmd", ["/c", "start", "", url]);
|
|
16
|
+
} else {
|
|
17
|
+
execFileAsync("xdg-open", [url]);
|
|
18
|
+
}
|
|
19
|
+
} catch {
|
|
20
|
+
// Browser not available — URL is still displayed in the UI
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
5
24
|
export interface LoginCommandProps {
|
|
6
25
|
onCancel: () => void;
|
|
7
26
|
}
|
|
@@ -91,6 +110,7 @@ export const LoginCommand: React.FC<LoginCommandProps> = ({ onCancel }) => {
|
|
|
91
110
|
await authService.login({
|
|
92
111
|
onAuthUrl: (url: string) => {
|
|
93
112
|
setAuthUrl(url);
|
|
113
|
+
openBrowser(url);
|
|
94
114
|
setMessage("Paste the authorization code from your browser URL bar:");
|
|
95
115
|
},
|
|
96
116
|
readToken,
|
package/src/contexts/useChat.tsx
CHANGED
|
@@ -176,7 +176,7 @@ export const ChatProvider: React.FC<ChatProviderProps> = ({
|
|
|
176
176
|
|
|
177
177
|
const [messages, setMessages] = useState<Message[]>([]);
|
|
178
178
|
const [latestTotalTokens, setLatestTotalTokens] = useState(0);
|
|
179
|
-
const [maxInputTokens, setMaxInputTokens] = useState(
|
|
179
|
+
const [maxInputTokens, setMaxInputTokens] = useState(200000);
|
|
180
180
|
|
|
181
181
|
const throttledSetMessages = useMemo(
|
|
182
182
|
() =>
|
|
@@ -537,7 +537,7 @@ export const ChatProvider: React.FC<ChatProviderProps> = ({
|
|
|
537
537
|
setSessionId("");
|
|
538
538
|
setIsLoading(false);
|
|
539
539
|
setLatestTotalTokens(0);
|
|
540
|
-
setMaxInputTokens(
|
|
540
|
+
setMaxInputTokens(200000);
|
|
541
541
|
setIsCommandRunning(false);
|
|
542
542
|
setIsCompacting(false);
|
|
543
543
|
if (currentSessionId) {
|