lsd-pi 1.3.7 → 1.3.9

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 (65) hide show
  1. package/README.md +82 -0
  2. package/dist/resources/extensions/mcp-client/index.js +72 -4
  3. package/dist/resources/extensions/slash-commands/plan.js +5 -5
  4. package/dist/resources/extensions/usage/index.js +34 -2
  5. package/dist/resources/extensions/voice/index.js +1 -0
  6. package/dist/resources/extensions/voice/push-to-talk.js +2 -0
  7. package/package.json +1 -1
  8. package/packages/pi-coding-agent/dist/core/agent-session.context-usage.test.d.ts +2 -0
  9. package/packages/pi-coding-agent/dist/core/agent-session.context-usage.test.d.ts.map +1 -0
  10. package/packages/pi-coding-agent/dist/core/agent-session.context-usage.test.js +72 -0
  11. package/packages/pi-coding-agent/dist/core/agent-session.context-usage.test.js.map +1 -0
  12. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +4 -0
  13. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  14. package/packages/pi-coding-agent/dist/core/agent-session.js +29 -2
  15. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  16. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  17. package/packages/pi-coding-agent/dist/core/extensions/runner.js +1 -0
  18. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  19. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +2 -0
  20. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  21. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  22. package/packages/pi-coding-agent/dist/core/tool-priority.js +1 -1
  23. package/packages/pi-coding-agent/dist/core/tool-priority.js.map +1 -1
  24. package/packages/pi-coding-agent/dist/main.d.ts.map +1 -1
  25. package/packages/pi-coding-agent/dist/main.js +1 -0
  26. package/packages/pi-coding-agent/dist/main.js.map +1 -1
  27. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +2 -0
  28. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  29. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +17 -1
  30. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  31. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-summary-line.js +1 -1
  32. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-summary-line.js.map +1 -1
  33. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  34. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +37 -14
  35. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  36. package/packages/pi-coding-agent/dist/modes/interactive/controllers/extension-ui-controller.d.ts.map +1 -1
  37. package/packages/pi-coding-agent/dist/modes/interactive/controllers/extension-ui-controller.js +1 -0
  38. package/packages/pi-coding-agent/dist/modes/interactive/controllers/extension-ui-controller.js.map +1 -1
  39. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  40. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +3 -2
  41. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  42. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  43. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +3 -0
  44. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
  45. package/packages/pi-coding-agent/package.json +1 -1
  46. package/packages/pi-coding-agent/src/core/agent-session.context-usage.test.ts +87 -0
  47. package/packages/pi-coding-agent/src/core/agent-session.ts +40 -2
  48. package/packages/pi-coding-agent/src/core/extensions/runner.ts +1 -0
  49. package/packages/pi-coding-agent/src/core/extensions/types.ts +3 -0
  50. package/packages/pi-coding-agent/src/core/tool-priority.ts +1 -1
  51. package/packages/pi-coding-agent/src/main.ts +1 -0
  52. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +18 -1
  53. package/packages/pi-coding-agent/src/modes/interactive/components/tool-summary-line.ts +1 -1
  54. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +37 -15
  55. package/packages/pi-coding-agent/src/modes/interactive/controllers/extension-ui-controller.ts +1 -0
  56. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +3 -2
  57. package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +4 -0
  58. package/pkg/package.json +1 -1
  59. package/src/resources/extensions/mcp-client/index.ts +83 -4
  60. package/src/resources/extensions/mcp-client/tests/server-name-spaces.test.ts +16 -0
  61. package/src/resources/extensions/slash-commands/plan.ts +6 -6
  62. package/src/resources/extensions/usage/index.ts +40 -2
  63. package/src/resources/extensions/voice/index.ts +1 -0
  64. package/src/resources/extensions/voice/push-to-talk.ts +3 -0
  65. package/src/resources/extensions/voice/tests/push-to-talk.test.ts +6 -0
package/README.md CHANGED
@@ -365,6 +365,88 @@ LSD discovers and connects to MCP servers configured in:
365
365
 
366
366
  Use `/configs` inside a session to scan for MCP servers from other AI tools (Claude Code, Cursor, Copilot, etc.) and import them.
367
367
 
368
+ ### Adding MCP servers to LSD config
369
+
370
+ LSD supports two transport types: **stdio** (launch a local process) and **HTTP** (connect to a running server).
371
+
372
+ #### Stdio server (local process)
373
+
374
+ Add to `.mcp.json` or `.lsd/mcp.json`:
375
+
376
+ ```json
377
+ {
378
+ "mcpServers": {
379
+ "my-server": {
380
+ "type": "stdio",
381
+ "command": "/absolute/path/to/executable",
382
+ "args": ["arg1", "arg2"],
383
+ "env": {
384
+ "API_KEY": "your-key",
385
+ "DEBUG": "true"
386
+ }
387
+ }
388
+ }
389
+ }
390
+ ```
391
+
392
+ If the server is installed as an npm package:
393
+
394
+ ```json
395
+ {
396
+ "mcpServers": {
397
+ "my-server": {
398
+ "type": "stdio",
399
+ "command": "npx",
400
+ "args": ["@my-org/mcp-server"],
401
+ "env": {
402
+ "API_KEY": "sk-..."
403
+ }
404
+ }
405
+ }
406
+ }
407
+ ```
408
+
409
+ #### HTTP server (remote connection)
410
+
411
+ For MCP servers already running on a network endpoint:
412
+
413
+ ```json
414
+ {
415
+ "mcpServers": {
416
+ "remote-server": {
417
+ "type": "http",
418
+ "url": "http://localhost:8080/mcp",
419
+ "headers": {
420
+ "Authorization": "Bearer ${MCP_TOKEN}"
421
+ }
422
+ }
423
+ }
424
+ }
425
+ ```
426
+
427
+ Environment variables in `headers` and `env` are resolved at startup (use `${VAR_NAME}` syntax).
428
+
429
+ #### File placement
430
+
431
+ - **`.mcp.json`** — repo-shared configuration (commit to git)
432
+ - **`.lsd/mcp.json`** — local-only configuration (git-ignored, not shared)
433
+
434
+ If both files exist, server names are merged and the first definition found wins.
435
+
436
+ #### Managing MCP servers
437
+
438
+ Use the `/mcp` slash command inside a session:
439
+
440
+ | Command | Description |
441
+ |---------|-------------|
442
+ | `/mcp list` | List all configured servers and their status |
443
+ | `/mcp inspect <server>` | Connect and show available tools for a server |
444
+ | `/mcp enable <server>` | Enable a server |
445
+ | `/mcp disable <server>` | Disable a server |
446
+ | `/mcp reload` | Reload config and reconnect enabled servers |
447
+
448
+ MCP servers connect lazily — `/mcp inspect` or the first tool call triggers the connection.
449
+
368
450
  ---
369
451
 
370
452
  ## Sessions
@@ -23,6 +23,7 @@ import { basename, dirname, join } from "node:path";
23
23
  const connections = new Map();
24
24
  let configCache = null;
25
25
  const toolCache = new Map();
26
+ let warmupPromise = null;
26
27
  const MCP_STATE_PATH = join(process.cwd(), ".lsd", "mcp-state.json");
27
28
  function normalizeServerName(name) {
28
29
  return name.trim().toLowerCase();
@@ -205,6 +206,46 @@ async function getOrConnect(name, signal) {
205
206
  connections.set(config.name, { client, transport });
206
207
  return client;
207
208
  }
209
+ async function warmupEnabledServers() {
210
+ if (warmupPromise)
211
+ return warmupPromise;
212
+ warmupPromise = (async () => {
213
+ const enabledServers = readConfigs().filter((server) => server.enabled);
214
+ if (enabledServers.length === 0)
215
+ return [];
216
+ const results = await Promise.allSettled(enabledServers.map(async (server) => {
217
+ const client = await getOrConnect(server.name);
218
+ const result = await client.listTools(undefined, { timeout: 30000 });
219
+ const tools = (result.tools ?? []).map((tool) => ({
220
+ name: tool.name,
221
+ description: tool.description ?? "",
222
+ inputSchema: tool.inputSchema,
223
+ }));
224
+ toolCache.set(server.name, tools);
225
+ return {
226
+ name: server.name,
227
+ status: "connected",
228
+ toolCount: tools.length,
229
+ };
230
+ }));
231
+ return results.map((result, index) => {
232
+ if (result.status === "fulfilled") {
233
+ return result.value;
234
+ }
235
+ return {
236
+ name: enabledServers[index]?.name ?? `server-${index + 1}`,
237
+ status: "error",
238
+ error: result.reason instanceof Error ? result.reason.message : String(result.reason),
239
+ };
240
+ });
241
+ })();
242
+ try {
243
+ return await warmupPromise;
244
+ }
245
+ finally {
246
+ warmupPromise = null;
247
+ }
248
+ }
208
249
  async function closeAll() {
209
250
  const closing = Array.from(connections.entries()).map(async ([name, conn]) => {
210
251
  try {
@@ -219,6 +260,7 @@ async function closeAll() {
219
260
  toolCache.clear();
220
261
  }
221
262
  async function reloadMcpState() {
263
+ warmupPromise = null;
222
264
  await closeAll();
223
265
  configCache = null;
224
266
  }
@@ -331,6 +373,13 @@ async function handleMcpCommand(args, ctx) {
331
373
  const action = enabled ? "enabled" : "disabled";
332
374
  const changeText = result.changed ? action : `already ${action}`;
333
375
  ctx.ui.notify(`MCP server ${result.canonicalName} ${changeText}.`, "info");
376
+ if (enabled) {
377
+ const warmupResults = await warmupEnabledServers();
378
+ const warmupResult = warmupResults.find((entry) => entry.name === result.canonicalName);
379
+ if (warmupResult?.status === "error") {
380
+ ctx.ui.notify(`Failed to connect ${result.canonicalName}: ${warmupResult.error}`, "error");
381
+ }
382
+ }
334
383
  }
335
384
  catch (error) {
336
385
  const message = error instanceof Error ? error.message : String(error);
@@ -341,7 +390,12 @@ async function handleMcpCommand(args, ctx) {
341
390
  if (subcommand === "reload") {
342
391
  await reloadMcpState();
343
392
  const servers = readConfigs();
344
- ctx.ui.notify(`Reloaded MCP config ${servers.length} server(s) available.`, "info");
393
+ const warmupResults = await warmupEnabledServers();
394
+ const failed = warmupResults.filter((entry) => entry.status === "error");
395
+ const summary = failed.length > 0
396
+ ? `Reloaded MCP config — ${servers.length} server(s) available, ${failed.length} failed to connect.`
397
+ : `Reloaded MCP config — ${servers.length} server(s) available.`;
398
+ ctx.ui.notify(summary, failed.length > 0 ? "warning" : "info");
345
399
  return;
346
400
  }
347
401
  if (subcommand === "help") {
@@ -598,15 +652,29 @@ export default function (pi) {
598
652
  // ── Lifecycle ─────────────────────────────────────────────────────────────
599
653
  pi.on("session_start", async (_event, ctx) => {
600
654
  const servers = readConfigs();
655
+ const enabledServers = servers.filter((server) => server.enabled);
601
656
  if (servers.length > 0) {
602
- ctx.ui.notify(`MCP client ready — ${servers.filter((server) => server.enabled).length}/${servers.length} server(s) enabled`, "info");
657
+ ctx.ui.notify(`MCP client ready — ${enabledServers.length}/${servers.length} server(s) enabled`, "info");
603
658
  }
659
+ if (enabledServers.length === 0)
660
+ return;
661
+ void warmupEnabledServers().then((results) => {
662
+ const failed = results.filter((entry) => entry.status === "error");
663
+ if (failed.length > 0) {
664
+ const failureSummary = failed.map((entry) => `${entry.name}: ${entry.error}`).join("; ");
665
+ ctx.ui.notify(`MCP autoconnect partial failure — ${failureSummary}`, "warning");
666
+ }
667
+ }).catch((error) => {
668
+ const message = error instanceof Error ? error.message : String(error);
669
+ ctx.ui.notify(`MCP autoconnect failed: ${message}`, "warning");
670
+ });
604
671
  });
605
672
  pi.on("session_shutdown", async () => {
673
+ warmupPromise = null;
606
674
  await closeAll();
607
675
  });
608
676
  pi.on("session_switch", async () => {
609
- await closeAll();
610
- configCache = null;
677
+ await reloadMcpState();
678
+ void warmupEnabledServers();
611
679
  });
612
680
  }
@@ -155,7 +155,7 @@ function readAutoSwitchPlanModelSetting() {
155
155
  return false;
156
156
  const raw = readFileSync(settingsPath, "utf-8");
157
157
  const parsed = JSON.parse(raw);
158
- return parsed.autoSwitchPlanModel === true;
158
+ return parsed.planModeAutoSwitchModel === true;
159
159
  }
160
160
  catch {
161
161
  return false;
@@ -332,10 +332,10 @@ function scheduleNewSession(pi, ctx) {
332
332
  pi.executeSlashCommand("/plan-execute-new-session");
333
333
  }
334
334
  async function approvePlan(pi, ctx, permissionMode, executeWithSubagent = false) {
335
- const reasoningModel = parseQualifiedModelRef(readPlanModeReasoningModel());
336
- if (reasoningModel) {
337
- await setModelIfNeeded(pi, ctx, reasoningModel);
338
- }
335
+ // Do NOT switch to reasoning model during execution.
336
+ // The reasoning model is only for plan-mode investigation, not execution.
337
+ // If a coding model is configured and we're using a subagent, the explicit
338
+ // model="<planModeCodingModel>" in the kickoff message will handle it.
339
339
  state = {
340
340
  ...state,
341
341
  targetPermissionMode: permissionMode,
@@ -231,6 +231,7 @@ function collectUsage(sessionFiles, startMs, endMs, scope, groupBy) {
231
231
  let projectLabel = basename(file);
232
232
  let headerResolved = false;
233
233
  let currentModel = "";
234
+ let lastUserTimestamp = 0;
234
235
  const raw = readFileSync(file, "utf-8");
235
236
  for (const line of raw.split("\n")) {
236
237
  if (!line.trim())
@@ -282,6 +283,8 @@ function collectUsage(sessionFiles, startMs, endMs, scope, groupBy) {
282
283
  cacheWrite: 0,
283
284
  total: 0,
284
285
  cost: 0,
286
+ totalDurationMs: 0,
287
+ totalOutputForSpeed: 0,
285
288
  };
286
289
  existing.messages += 1;
287
290
  existing.input += input;
@@ -290,11 +293,25 @@ function collectUsage(sessionFiles, startMs, endMs, scope, groupBy) {
290
293
  existing.cacheWrite += cacheWrite;
291
294
  existing.total += total;
292
295
  existing.cost += cost;
296
+ // Track tok/sec: use preceding user message timestamp
297
+ if (output > 0 && lastUserTimestamp > 0) {
298
+ const durationMs = timestamp - lastUserTimestamp;
299
+ if (durationMs > 0) {
300
+ existing.totalDurationMs += durationMs;
301
+ existing.totalOutputForSpeed += output;
302
+ }
303
+ }
293
304
  rows.set(key, existing);
294
305
  }
295
306
  else if (message.role === "user") {
296
307
  const timestamp = Number(message.timestamp ?? 0);
297
- if (!timestamp || timestamp < startMs || timestamp >= endMs)
308
+ if (!timestamp)
309
+ continue;
310
+ // Always track last user timestamp for tok/sec calculation,
311
+ // even if this user message is outside the time range
312
+ // (the assistant response may still be within range).
313
+ lastUserTimestamp = timestamp;
314
+ if (timestamp < startMs || timestamp >= endMs)
298
315
  continue;
299
316
  matchedUserPrompts++;
300
317
  const model = currentModel;
@@ -311,6 +328,8 @@ function collectUsage(sessionFiles, startMs, endMs, scope, groupBy) {
311
328
  cacheWrite: 0,
312
329
  total: 0,
313
330
  cost: 0,
331
+ totalDurationMs: 0,
332
+ totalOutputForSpeed: 0,
314
333
  };
315
334
  existing.userPrompts += 1;
316
335
  userPromptRows.set(key, existing);
@@ -342,8 +361,10 @@ function collectUsage(sessionFiles, startMs, endMs, scope, groupBy) {
342
361
  acc.cacheWrite += row.cacheWrite;
343
362
  acc.total += row.total;
344
363
  acc.cost += row.cost;
364
+ acc.totalDurationMs += row.totalDurationMs;
365
+ acc.totalOutputForSpeed += row.totalOutputForSpeed;
345
366
  return acc;
346
- }, { messages: 0, userPrompts: 0, input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0, cost: 0 });
367
+ }, { messages: 0, userPrompts: 0, input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0, cost: 0, totalDurationMs: 0, totalOutputForSpeed: 0 });
347
368
  return {
348
369
  label: "",
349
370
  scope,
@@ -355,6 +376,11 @@ function collectUsage(sessionFiles, startMs, endMs, scope, groupBy) {
355
376
  totals,
356
377
  };
357
378
  }
379
+ function formatSpeed(totalDurationMs, totalOutputForSpeed) {
380
+ if (totalDurationMs <= 0)
381
+ return "—";
382
+ return Math.round(totalOutputForSpeed / (totalDurationMs / 1000)).toLocaleString();
383
+ }
358
384
  function renderTable(report) {
359
385
  const firstColumnHeader = report.groupBy === "project"
360
386
  ? "project"
@@ -371,7 +397,9 @@ function renderTable(report) {
371
397
  write: formatInt(row.cacheWrite),
372
398
  total: formatInt(row.total),
373
399
  cost: formatCost(row.cost),
400
+ speed: formatSpeed(row.totalDurationMs, row.totalOutputForSpeed),
374
401
  }));
402
+ const totalsSpeed = formatSpeed(report.totals.totalDurationMs, report.totals.totalOutputForSpeed);
375
403
  const widths = {
376
404
  label: Math.max(firstColumnHeader.length, ...displayRows.map((row) => row.label.length), 5),
377
405
  userPrompts: Math.max(11, ...displayRows.map((row) => row.userPrompts.length), String(report.totals.userPrompts).length),
@@ -382,6 +410,7 @@ function renderTable(report) {
382
410
  write: Math.max(5, ...displayRows.map((row) => row.write.length), formatInt(report.totals.cacheWrite).length),
383
411
  total: Math.max(5, ...displayRows.map((row) => row.total.length), formatInt(report.totals.total).length),
384
412
  cost: Math.max(7, ...displayRows.map((row) => row.cost.length), formatCost(report.totals.cost).length),
413
+ speed: Math.max(5, ...displayRows.map((row) => row.speed.length), totalsSpeed.length),
385
414
  };
386
415
  const header = [
387
416
  firstColumnHeader.padEnd(widths.label),
@@ -393,6 +422,7 @@ function renderTable(report) {
393
422
  "write".padStart(widths.write),
394
423
  "total".padStart(widths.total),
395
424
  "cost".padStart(widths.cost),
425
+ "tok/s".padStart(widths.speed),
396
426
  ].join(" ");
397
427
  const divider = "-".repeat(header.length);
398
428
  const body = displayRows.map((row) => [
@@ -405,6 +435,7 @@ function renderTable(report) {
405
435
  row.write.padStart(widths.write),
406
436
  row.total.padStart(widths.total),
407
437
  row.cost.padStart(widths.cost),
438
+ row.speed.padStart(widths.speed),
408
439
  ].join(" "));
409
440
  const totalsLine = [
410
441
  "TOTAL".padEnd(widths.label),
@@ -416,6 +447,7 @@ function renderTable(report) {
416
447
  formatInt(report.totals.cacheWrite).padStart(widths.write),
417
448
  formatInt(report.totals.total).padStart(widths.total),
418
449
  formatCost(report.totals.cost).padStart(widths.cost),
450
+ totalsSpeed.padStart(widths.speed),
419
451
  ].join(" ");
420
452
  return [header, divider, ...body, divider, totalsLine].join("\n");
421
453
  }
@@ -275,6 +275,7 @@ export default function (pi) {
275
275
  activationMode,
276
276
  editorText: ctx.ui.getEditorText(),
277
277
  holdToTalkSupported: isKittyProtocolActive(),
278
+ isEditorFocused: ctx.ui.isEditorFocused(),
278
279
  onUnsupported: () => {
279
280
  if (holdToTalkUnsupportedNotified)
280
281
  return;
@@ -2,6 +2,8 @@ import { isKeyRelease, Key, matchesKey } from "@gsd/pi-tui";
2
2
  export function handlePushToTalkInput(data, state) {
3
3
  if (!matchesKey(data, Key.space))
4
4
  return undefined;
5
+ if (!state.isEditorFocused)
6
+ return undefined;
5
7
  if (isKeyRelease(data)) {
6
8
  if (state.activationMode === "push-to-talk") {
7
9
  void Promise.resolve(state.stopVoice());
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lsd-pi",
3
- "version": "1.3.7",
3
+ "version": "1.3.9",
4
4
  "description": "LSD — Looks Sort of Done coding agent",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=agent-session.context-usage.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-session.context-usage.test.d.ts","sourceRoot":"","sources":["../../src/core/agent-session.context-usage.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,72 @@
1
+ import { describe, it, mock } from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { AgentSession } from "./agent-session.js";
4
+ describe("AgentSession context usage caching", () => {
5
+ it("memoizes getContextUsage until context changes", () => {
6
+ let branchCalls = 0;
7
+ const messages = [
8
+ { role: "user", content: "hello" },
9
+ {
10
+ role: "assistant",
11
+ content: [{ type: "text", text: "hi" }],
12
+ usage: { input: 120, output: 30, cacheRead: 0, cacheWrite: 0, cost: { total: 0 } },
13
+ stopReason: "end_turn",
14
+ provider: "test",
15
+ model: "fast-model",
16
+ },
17
+ ];
18
+ const fakeSession = {
19
+ model: { provider: "test", id: "fast-model", contextWindow: 1000 },
20
+ messages,
21
+ sessionManager: {
22
+ getBranch: () => {
23
+ branchCalls += 1;
24
+ return [];
25
+ },
26
+ },
27
+ _contextUsageRevision: 0,
28
+ _contextUsageCache: undefined,
29
+ };
30
+ const first = AgentSession.prototype.getContextUsage.call(fakeSession);
31
+ const second = AgentSession.prototype.getContextUsage.call(fakeSession);
32
+ assert.equal(branchCalls, 1);
33
+ assert.strictEqual(second, first);
34
+ messages.push({ role: "user", content: "follow up" });
35
+ AgentSession.prototype["_invalidateContextUsageCache"].call(fakeSession);
36
+ const third = AgentSession.prototype.getContextUsage.call(fakeSession);
37
+ assert.equal(branchCalls, 2);
38
+ assert.notStrictEqual(third, first);
39
+ assert.ok((third?.tokens ?? 0) > (first?.tokens ?? 0));
40
+ });
41
+ it("clears cached context usage before emitting session events", () => {
42
+ const listener = mock.fn(() => { });
43
+ const fakeSession = {
44
+ _contextUsageRevision: 3,
45
+ _contextUsageCache: {
46
+ revision: 3,
47
+ modelKey: "test/model:1000",
48
+ usage: { tokens: 123, contextWindow: 1000, percent: 12.3 },
49
+ },
50
+ _eventListeners: [listener],
51
+ _invalidateContextUsageCache: AgentSession.prototype["_invalidateContextUsageCache"],
52
+ };
53
+ AgentSession.prototype["_emit"].call(fakeSession, { type: "session_state_changed", reason: "set_model" });
54
+ assert.equal(fakeSession._contextUsageRevision, 4);
55
+ assert.equal(fakeSession._contextUsageCache, undefined);
56
+ assert.equal(listener.mock.callCount(), 1);
57
+ });
58
+ it("invalidates cached context usage for immediate bash history writes", () => {
59
+ const invalidate = mock.fn(() => { });
60
+ const appendMessage = mock.fn(() => { });
61
+ const fakeSession = {
62
+ isStreaming: false,
63
+ agent: { appendMessage },
64
+ sessionManager: { appendMessage },
65
+ _invalidateContextUsageCache: invalidate,
66
+ };
67
+ AgentSession.prototype.recordBashResult.call(fakeSession, "pwd", { output: "/tmp", exitCode: 0, cancelled: false, truncated: false, fullOutputPath: undefined, sandboxed: false });
68
+ assert.equal(invalidate.mock.callCount(), 1);
69
+ assert.equal(appendMessage.mock.callCount(), 2);
70
+ });
71
+ });
72
+ //# sourceMappingURL=agent-session.context-usage.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-session.context-usage.test.js","sourceRoot":"","sources":["../../src/core/agent-session.context-usage.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, it, mock } from \"node:test\";\nimport assert from \"node:assert/strict\";\nimport { AgentSession } from \"./agent-session.js\";\n\ndescribe(\"AgentSession context usage caching\", () => {\n it(\"memoizes getContextUsage until context changes\", () => {\n let branchCalls = 0;\n const messages = [\n { role: \"user\", content: \"hello\" },\n {\n role: \"assistant\",\n content: [{ type: \"text\", text: \"hi\" }],\n usage: { input: 120, output: 30, cacheRead: 0, cacheWrite: 0, cost: { total: 0 } },\n stopReason: \"end_turn\",\n provider: \"test\",\n model: \"fast-model\",\n },\n ] as any[];\n\n const fakeSession = {\n model: { provider: \"test\", id: \"fast-model\", contextWindow: 1000 },\n messages,\n sessionManager: {\n getBranch: () => {\n branchCalls += 1;\n return [];\n },\n },\n _contextUsageRevision: 0,\n _contextUsageCache: undefined,\n } as any;\n\n const first = AgentSession.prototype.getContextUsage.call(fakeSession);\n const second = AgentSession.prototype.getContextUsage.call(fakeSession);\n\n assert.equal(branchCalls, 1);\n assert.strictEqual(second, first);\n\n messages.push({ role: \"user\", content: \"follow up\" } as any);\n AgentSession.prototype[\"_invalidateContextUsageCache\"].call(fakeSession);\n const third = AgentSession.prototype.getContextUsage.call(fakeSession);\n\n assert.equal(branchCalls, 2);\n assert.notStrictEqual(third, first);\n assert.ok((third?.tokens ?? 0) > (first?.tokens ?? 0));\n });\n\n it(\"clears cached context usage before emitting session events\", () => {\n const listener = mock.fn(() => { });\n const fakeSession = {\n _contextUsageRevision: 3,\n _contextUsageCache: {\n revision: 3,\n modelKey: \"test/model:1000\",\n usage: { tokens: 123, contextWindow: 1000, percent: 12.3 },\n },\n _eventListeners: [listener],\n _invalidateContextUsageCache: AgentSession.prototype[\"_invalidateContextUsageCache\"],\n } as any;\n\n AgentSession.prototype[\"_emit\"].call(fakeSession, { type: \"session_state_changed\", reason: \"set_model\" });\n\n assert.equal(fakeSession._contextUsageRevision, 4);\n assert.equal(fakeSession._contextUsageCache, undefined);\n assert.equal(listener.mock.callCount(), 1);\n });\n\n it(\"invalidates cached context usage for immediate bash history writes\", () => {\n const invalidate = mock.fn(() => { });\n const appendMessage = mock.fn(() => { });\n const fakeSession = {\n isStreaming: false,\n agent: { appendMessage },\n sessionManager: { appendMessage },\n _invalidateContextUsageCache: invalidate,\n } as any;\n\n AgentSession.prototype.recordBashResult.call(\n fakeSession,\n \"pwd\",\n { output: \"/tmp\", exitCode: 0, cancelled: false, truncated: false, fullOutputPath: undefined, sandboxed: false },\n );\n\n assert.equal(invalidate.mock.callCount(), 1);\n assert.equal(appendMessage.mock.callCount(), 2);\n });\n});\n"]}
@@ -179,6 +179,9 @@ export declare class AgentSession {
179
179
  private _cumulativeToolCalls;
180
180
  /** Cost of the most recent assistant response (for per-prompt display). */
181
181
  private _lastTurnCost;
182
+ /** Incremented whenever context-affecting state changes. */
183
+ private _contextUsageRevision;
184
+ private _contextUsageCache;
182
185
  private _bashAbortController;
183
186
  private _pendingBashMessages;
184
187
  private _extensionRunner;
@@ -211,6 +214,7 @@ export declare class AgentSession {
211
214
  /** Fallback resolver for cross-provider fallback */
212
215
  get fallbackResolver(): FallbackResolver;
213
216
  get sandboxManager(): SandboxManager | undefined;
217
+ private _invalidateContextUsageCache;
214
218
  /** Emit an event to all listeners */
215
219
  private _emit;
216
220
  private _emitSessionStateChanged;
@@ -1 +1 @@
1
- {"version":3,"file":"agent-session.d.ts","sourceRoot":"","sources":["../../src/core/agent-session.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-session.d.ts","sourceRoot":"","sources":["../../src/core/agent-session.ts"],"names":[],"mappings":"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"}
@@ -80,6 +80,8 @@ export class AgentSession {
80
80
  this._cumulativeToolCalls = 0;
81
81
  /** Cost of the most recent assistant response (for per-prompt display). */
82
82
  this._lastTurnCost = 0;
83
+ /** Incremented whenever context-affecting state changes. */
84
+ this._contextUsageRevision = 0;
83
85
  // Bash execution state
84
86
  this._bashAbortController = undefined;
85
87
  this._pendingBashMessages = [];
@@ -182,8 +184,13 @@ export class AgentSession {
182
184
  // =========================================================================
183
185
  // Event Subscription
184
186
  // =========================================================================
187
+ _invalidateContextUsageCache() {
188
+ this._contextUsageRevision += 1;
189
+ this._contextUsageCache = undefined;
190
+ }
185
191
  /** Emit an event to all listeners */
186
192
  _emit(event) {
193
+ this._invalidateContextUsageCache();
187
194
  for (const l of this._eventListeners) {
188
195
  l(event);
189
196
  }
@@ -2159,6 +2166,7 @@ export class AgentSession {
2159
2166
  this.agent.appendMessage(bashMessage);
2160
2167
  // Save to session
2161
2168
  this.sessionManager.appendMessage(bashMessage);
2169
+ this._invalidateContextUsageCache();
2162
2170
  }
2163
2171
  }
2164
2172
  /**
@@ -2189,6 +2197,7 @@ export class AgentSession {
2189
2197
  this.sessionManager.appendMessage(bashMessage);
2190
2198
  }
2191
2199
  this._pendingBashMessages = [];
2200
+ this._invalidateContextUsageCache();
2192
2201
  }
2193
2202
  // =========================================================================
2194
2203
  // Session Management
@@ -2579,6 +2588,12 @@ export class AgentSession {
2579
2588
  const contextWindow = model.contextWindow ?? 0;
2580
2589
  if (contextWindow <= 0)
2581
2590
  return undefined;
2591
+ const modelKey = `${model.provider}/${model.id}:${contextWindow}`;
2592
+ const cached = this._contextUsageCache;
2593
+ if (cached && cached.revision === this._contextUsageRevision && cached.modelKey === modelKey) {
2594
+ return cached.usage;
2595
+ }
2596
+ let usage;
2582
2597
  // After compaction, the last assistant usage reflects pre-compaction context size.
2583
2598
  // We can only trust usage from an assistant that responded after the latest compaction.
2584
2599
  // If no such assistant exists, context token count is unknown until the next LLM response.
@@ -2602,16 +2617,28 @@ export class AgentSession {
2602
2617
  }
2603
2618
  }
2604
2619
  if (!hasPostCompactionUsage) {
2605
- return { tokens: null, contextWindow, percent: null };
2620
+ usage = { tokens: null, contextWindow, percent: null };
2621
+ this._contextUsageCache = {
2622
+ revision: this._contextUsageRevision,
2623
+ modelKey,
2624
+ usage,
2625
+ };
2626
+ return usage;
2606
2627
  }
2607
2628
  }
2608
2629
  const estimate = estimateContextTokens(this.messages);
2609
2630
  const percent = (estimate.tokens / contextWindow) * 100;
2610
- return {
2631
+ usage = {
2611
2632
  tokens: estimate.tokens,
2612
2633
  contextWindow,
2613
2634
  percent,
2614
2635
  };
2636
+ this._contextUsageCache = {
2637
+ revision: this._contextUsageRevision,
2638
+ modelKey,
2639
+ usage,
2640
+ };
2641
+ return usage;
2615
2642
  }
2616
2643
  /**
2617
2644
  * Export session to HTML.