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.
@@ -1 +1 @@
1
- {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/acp/agent.ts"],"names":[],"mappings":"AAyBA,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,EAOpC,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;IA8EnB,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;IAyDtD,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;CAkRxB"}
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 = 128000, isGoalActive, goalElapsed, }) => {
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;AAIhD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAyMpD,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 = 128000, }) => {
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;
@@ -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(128000);
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(128000);
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.9",
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.9"
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
+ }
@@ -62,7 +62,7 @@ export const InputBox: React.FC<InputBoxProps> = ({
62
62
  slashCommands = [],
63
63
  hasSlashCommand = () => false,
64
64
  latestTotalTokens = 0,
65
- maxInputTokens = 128000,
65
+ maxInputTokens = 200000,
66
66
  isGoalActive,
67
67
  goalElapsed,
68
68
  }) => {
@@ -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,
@@ -16,7 +16,7 @@ export const StatusLine: React.FC<StatusLineProps> = ({
16
16
  isGoalActive,
17
17
  goalElapsed,
18
18
  latestTotalTokens = 0,
19
- maxInputTokens = 128000,
19
+ maxInputTokens = 200000,
20
20
  }) => {
21
21
  const percentage =
22
22
  latestTotalTokens > 0
@@ -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(128000);
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(128000);
540
+ setMaxInputTokens(200000);
541
541
  setIsCommandRunning(false);
542
542
  setIsCompacting(false);
543
543
  if (currentSessionId) {