@google/gemini-cli 0.36.0-preview.8 → 0.37.0-preview.0

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 (74) hide show
  1. package/bundle/{chunk-N22U7LIR.js → chunk-3TN4SOLW.js} +6651 -4180
  2. package/bundle/{chunk-S2IQOR7T.js → chunk-7UZ4Y32N.js} +214 -66
  3. package/bundle/{chunk-QBLIM2T2.js → chunk-A62NZYIK.js} +711 -240
  4. package/bundle/{chunk-5JDHTAA3.js → chunk-LEK5YYAR.js} +6295 -4094
  5. package/bundle/{chunk-MYI75E6G.js → chunk-R5X4CMUM.js} +233 -70
  6. package/bundle/{chunk-5Y6Y7SEB.js → chunk-TJ76C6AA.js} +16847 -9496
  7. package/bundle/chunk-U4FACSVX.js +30 -0
  8. package/bundle/{chunk-UUJ4JLTB.js → chunk-ULC3DHVX.js} +711 -240
  9. package/bundle/{chunk-642LNT3F.js → chunk-XX7JYMTE.js} +765 -306
  10. package/bundle/{core-N4UNRLQA.js → core-5OME6LT4.js} +58 -4
  11. package/bundle/{dist-HD2ZHBHJ.js → core-CUCGSGCA.js} +58 -4
  12. package/bundle/{devtoolsService-7D3WUF33.js → devtoolsService-4FIYD6OW.js} +20 -3
  13. package/bundle/{devtoolsService-NA7MR5UO.js → devtoolsService-IDLWLZFQ.js} +21 -5
  14. package/bundle/{devtoolsService-Y53ZUB56.js → devtoolsService-TVWW3DBW.js} +20 -3
  15. package/bundle/{dist-JYY2GAAR.js → dist-YWCADMDD.js} +58 -4
  16. package/bundle/docs/CONTRIBUTING.md +10 -7
  17. package/bundle/docs/assets/theme-tokyonight-dark.png +0 -0
  18. package/bundle/docs/changelogs/index.md +24 -0
  19. package/bundle/docs/changelogs/latest.md +366 -459
  20. package/bundle/docs/changelogs/preview.md +362 -356
  21. package/bundle/docs/cli/acp-mode.md +126 -0
  22. package/bundle/docs/cli/cli-reference.md +1 -1
  23. package/bundle/docs/cli/notifications.md +5 -5
  24. package/bundle/docs/cli/plan-mode.md +12 -8
  25. package/bundle/docs/cli/sandbox.md +1 -1
  26. package/bundle/docs/cli/settings.md +14 -13
  27. package/bundle/docs/cli/themes.md +5 -0
  28. package/bundle/docs/core/index.md +2 -2
  29. package/bundle/docs/core/subagents.md +134 -23
  30. package/bundle/docs/get-started/gemini-3.md +1 -1
  31. package/bundle/docs/get-started/index.md +127 -1
  32. package/bundle/docs/ide-integration/index.md +99 -24
  33. package/bundle/docs/index.md +0 -2
  34. package/bundle/docs/redirects.json +1 -0
  35. package/bundle/docs/reference/commands.md +1 -3
  36. package/bundle/docs/reference/configuration.md +182 -91
  37. package/bundle/docs/reference/keyboard-shortcuts.md +14 -6
  38. package/bundle/docs/reference/policy-engine.md +16 -30
  39. package/bundle/docs/reference/tools.md +56 -23
  40. package/bundle/docs/resources/quota-and-pricing.md +23 -9
  41. package/bundle/docs/sidebar.json +11 -4
  42. package/bundle/docs/tools/planning.md +6 -4
  43. package/bundle/events-CLX3JQHP.js +12 -0
  44. package/bundle/gemini.js +342 -52
  45. package/bundle/{interactiveCli-R5N55BDV.js → interactiveCli-4WFWOVAQ.js} +5066 -4010
  46. package/bundle/{interactiveCli-LFO7EWZS.js → interactiveCli-4ZZ72DR3.js} +5066 -4010
  47. package/bundle/{interactiveCli-2JRQPNZP.js → interactiveCli-6SIGBRWS.js} +5279 -4240
  48. package/bundle/{memoryDiscovery-BQGYT4OD.js → memoryDiscovery-NS2EGHYH.js} +3 -1
  49. package/bundle/{memoryDiscovery-FCEPFZ3M.js → memoryDiscovery-VL3OH25S.js} +3 -1
  50. package/bundle/node_modules/@google/gemini-cli-devtools/dist/client/main.js +26 -19
  51. package/bundle/node_modules/@google/gemini-cli-devtools/dist/src/_client-assets.d.ts +1 -1
  52. package/bundle/node_modules/@google/gemini-cli-devtools/dist/src/_client-assets.js +1 -1
  53. package/bundle/node_modules/@google/gemini-cli-devtools/dist/src/_client-assets.js.map +1 -1
  54. package/bundle/node_modules/@google/gemini-cli-devtools/dist/src/index.js +35 -1
  55. package/bundle/node_modules/@google/gemini-cli-devtools/dist/src/index.js.map +1 -1
  56. package/bundle/node_modules/@google/gemini-cli-devtools/package.json +1 -1
  57. package/bundle/{oauth2-provider-2WD22PTI.js → oauth2-provider-HGHECKPY.js} +2 -2
  58. package/bundle/{oauth2-provider-QOWLZC44.js → oauth2-provider-TYBJKXSJ.js} +2 -2
  59. package/bundle/{oauth2-provider-34BPLPQX.js → oauth2-provider-YYRJ44X5.js} +73 -39
  60. package/bundle/policies/discovered.toml +7 -0
  61. package/bundle/policies/non-interactive.toml +7 -0
  62. package/bundle/policies/plan.toml +25 -0
  63. package/bundle/policies/read-only.toml +6 -0
  64. package/bundle/policies/sandbox-default.toml +3 -2
  65. package/bundle/policies/write.toml +21 -0
  66. package/bundle/policies/yolo.toml +1 -1
  67. package/package.json +1 -1
  68. package/bundle/chunk-FWCJAF6L.js +0 -97905
  69. package/bundle/chunk-X6CSYCBW.js +0 -354180
  70. package/bundle/devtoolsService-VU7N6PSG.js +0 -854
  71. package/bundle/dist-QEB25IFU.js +0 -1886
  72. package/bundle/docs/get-started/examples.md +0 -141
  73. package/bundle/interactiveCli-A6H7VTMC.js +0 -49299
  74. package/bundle/oauth2-provider-MZAUZWUS.js +0 -237
@@ -55,6 +55,8 @@ import {
55
55
  convertToRestPayload,
56
56
  createCache,
57
57
  decodeTagName,
58
+ deleteSessionArtifactsAsync,
59
+ deleteSubagentSessionDirAndArtifactsAsync,
58
60
  disableBracketedPasteMode,
59
61
  disableKittyKeyboardProtocol,
60
62
  disableModifyOtherKeys,
@@ -150,6 +152,7 @@ import {
150
152
  require_toml,
151
153
  require_undici,
152
154
  require_valid,
155
+ resetBrowserSession,
153
156
  sanitizeFilenamePart,
154
157
  sessionId,
155
158
  shouldLaunchBrowser,
@@ -164,7 +167,7 @@ import {
164
167
  tokenLimit,
165
168
  uiTelemetryService,
166
169
  yellowBright
167
- } from "./chunk-5JDHTAA3.js";
170
+ } from "./chunk-LEK5YYAR.js";
168
171
  import {
169
172
  ApprovalMode,
170
173
  CoreEvent,
@@ -193,7 +196,11 @@ import {
193
196
  shortenPath,
194
197
  tildeifyPath,
195
198
  unescapePath
196
- } from "./chunk-S2IQOR7T.js";
199
+ } from "./chunk-7UZ4Y32N.js";
200
+ import {
201
+ AppEvent,
202
+ appEvents
203
+ } from "./chunk-U4FACSVX.js";
197
204
  import {
198
205
  __commonJS,
199
206
  __export,
@@ -34576,12 +34583,12 @@ var require_prompt = __commonJS({
34576
34583
  var readline = __require("readline");
34577
34584
  var _require = require_util3();
34578
34585
  var action = _require.action;
34579
- var EventEmitter6 = __require("events");
34586
+ var EventEmitter5 = __require("events");
34580
34587
  var _require2 = require_src3();
34581
34588
  var beep2 = _require2.beep;
34582
34589
  var cursor = _require2.cursor;
34583
34590
  var color = require_kleur();
34584
- var Prompt = class extends EventEmitter6 {
34591
+ var Prompt = class extends EventEmitter5 {
34585
34592
  constructor(opts = {}) {
34586
34593
  super();
34587
34594
  this.firstRender = true;
@@ -36581,9 +36588,9 @@ var require_prompts = __commonJS({
36581
36588
  $4.date = (args) => toPrompt("DatePrompt", args);
36582
36589
  $4.confirm = (args) => toPrompt("ConfirmPrompt", args);
36583
36590
  $4.list = (args) => {
36584
- const sep5 = args.separator || ",";
36591
+ const sep4 = args.separator || ",";
36585
36592
  return toPrompt("TextPrompt", args, {
36586
- onSubmit: (str) => str.split(sep5).map((s3) => s3.trim())
36593
+ onSubmit: (str) => str.split(sep4).map((s3) => s3.trim())
36587
36594
  });
36588
36595
  };
36589
36596
  $4.toggle = (args) => toPrompt("TogglePrompt", args);
@@ -37041,10 +37048,10 @@ var require_prompt2 = __commonJS({
37041
37048
  "use strict";
37042
37049
  var readline = __require("readline");
37043
37050
  var { action } = require_util4();
37044
- var EventEmitter6 = __require("events");
37051
+ var EventEmitter5 = __require("events");
37045
37052
  var { beep: beep2, cursor } = require_src3();
37046
37053
  var color = require_kleur();
37047
- var Prompt = class extends EventEmitter6 {
37054
+ var Prompt = class extends EventEmitter5 {
37048
37055
  constructor(opts = {}) {
37049
37056
  super();
37050
37057
  this.firstRender = true;
@@ -38871,9 +38878,9 @@ var require_prompts2 = __commonJS({
38871
38878
  $4.date = (args) => toPrompt("DatePrompt", args);
38872
38879
  $4.confirm = (args) => toPrompt("ConfirmPrompt", args);
38873
38880
  $4.list = (args) => {
38874
- const sep5 = args.separator || ",";
38881
+ const sep4 = args.separator || ",";
38875
38882
  return toPrompt("TextPrompt", args, {
38876
- onSubmit: (str) => str.split(sep5).map((s3) => s3.trim())
38883
+ onSubmit: (str) => str.split(sep4).map((s3) => s3.trim())
38877
38884
  });
38878
38885
  };
38879
38886
  $4.toggle = (args) => toPrompt("TogglePrompt", args);
@@ -43484,6 +43491,7 @@ function mapCoreStatusToDisplayStatus(coreStatus) {
43484
43491
  return checkExhaustive(coreStatus);
43485
43492
  }
43486
43493
  }
43494
+ var isTodoList = (res) => typeof res === "object" && res !== null && "todos" in res;
43487
43495
  var emptyIcon = " ";
43488
43496
 
43489
43497
  // packages/cli/src/utils/cleanup.ts
@@ -43521,6 +43529,10 @@ async function runExitCleanup() {
43521
43529
  }
43522
43530
  }
43523
43531
  cleanupFunctions.length = 0;
43532
+ try {
43533
+ await resetBrowserSession();
43534
+ } catch (_2) {
43535
+ }
43524
43536
  if (configForTelemetry) {
43525
43537
  try {
43526
43538
  await configForTelemetry.dispose();
@@ -43619,12 +43631,15 @@ var ConsolePatcher = class {
43619
43631
  };
43620
43632
  formatArgs = (args) => util.format(...args);
43621
43633
  patchConsoleMethod = (type) => (...args) => {
43622
- if (this.params.stderr) {
43623
- if (type !== "debug" || this.params.debugMode) {
43624
- this.originalConsoleError(this.formatArgs(args));
43634
+ if (this.params.interactive === false) {
43635
+ if ((type === "info" || type === "log") && !this.params.debugMode) {
43636
+ return;
43625
43637
  }
43626
- } else {
43627
- if (type !== "debug" || this.params.debugMode) {
43638
+ }
43639
+ if (type !== "debug" || this.params.debugMode) {
43640
+ if (this.params.stderr) {
43641
+ this.originalConsoleError(this.formatArgs(args));
43642
+ } else {
43628
43643
  this.params.onNewMessage?.({
43629
43644
  type,
43630
43645
  content: this.formatArgs(args),
@@ -56122,6 +56137,10 @@ var COMPLETED_SHELL_MAX_LINES = 15;
56122
56137
  var SUBAGENT_MAX_LINES = 15;
56123
56138
  var MIN_TERMINAL_WIDTH_FOR_FULL_LABEL = 100;
56124
56139
  var DEFAULT_COMPRESSION_THRESHOLD = 0.5;
56140
+ var SKILLS_DOCS_URL = "https://github.com/google-gemini/gemini-cli/blob/main/docs/cli/skills.md";
56141
+ var COMPACT_TOOL_SUBVIEW_MAX_LINES = 15;
56142
+ var MAX_SHELL_OUTPUT_SIZE = 1e7;
56143
+ var SHELL_OUTPUT_TRUNCATION_BUFFER = 1e6;
56125
56144
 
56126
56145
  // packages/cli/src/ui/themes/theme.ts
56127
56146
  var import_tinygradient = __toESM(require_tinygradient(), 1);
@@ -58639,33 +58658,11 @@ function deriveShortIdFromFileName(fileName) {
58639
58658
  }
58640
58659
  return null;
58641
58660
  }
58642
- function getSessionLogPath(tempDir, safeSessionId) {
58643
- return path4.join(tempDir, "logs", `session-${safeSessionId}.jsonl`);
58644
- }
58645
- async function deleteSessionArtifactsAsync(sessionId2, config) {
58661
+ async function cleanupSessionAndSubagentsAsync(sessionId2, config) {
58646
58662
  const tempDir = config.storage.getProjectTempDir();
58647
- const logsDir = path4.join(tempDir, "logs");
58648
- const safeSessionId = sanitizeFilenamePart(sessionId2);
58649
- const logPath = getSessionLogPath(tempDir, safeSessionId);
58650
- if (logPath.startsWith(logsDir)) {
58651
- await fs8.unlink(logPath).catch(() => {
58652
- });
58653
- }
58654
- const toolOutputDir = path4.join(
58655
- tempDir,
58656
- TOOL_OUTPUTS_DIR,
58657
- `session-${safeSessionId}`
58658
- );
58659
- const toolOutputsBase = path4.join(tempDir, TOOL_OUTPUTS_DIR);
58660
- if (toolOutputDir.startsWith(toolOutputsBase)) {
58661
- await fs8.rm(toolOutputDir, { recursive: true, force: true }).catch(() => {
58662
- });
58663
- }
58664
- const sessionDir = path4.join(tempDir, safeSessionId);
58665
- if (safeSessionId && sessionDir.startsWith(tempDir + path4.sep)) {
58666
- await fs8.rm(sessionDir, { recursive: true, force: true }).catch(() => {
58667
- });
58668
- }
58663
+ const chatsDir = path4.join(tempDir, "chats");
58664
+ await deleteSessionArtifactsAsync(sessionId2, tempDir);
58665
+ await deleteSubagentSessionDirAndArtifactsAsync(sessionId2, chatsDir, tempDir);
58669
58666
  }
58670
58667
  async function cleanupExpiredSessions(config, settings) {
58671
58668
  const result = {
@@ -58729,7 +58726,7 @@ async function cleanupExpiredSessions(config, settings) {
58729
58726
  if (!fullSessionId || fullSessionId !== config.getSessionId()) {
58730
58727
  await fs8.unlink(filePath);
58731
58728
  if (fullSessionId) {
58732
- await deleteSessionArtifactsAsync(fullSessionId, config);
58729
+ await cleanupSessionAndSubagentsAsync(fullSessionId, config);
58733
58730
  }
58734
58731
  result.deleted++;
58735
58732
  } else {
@@ -58750,7 +58747,7 @@ async function cleanupExpiredSessions(config, settings) {
58750
58747
  await fs8.unlink(sessionPath);
58751
58748
  const sessionId2 = sessionToDelete.sessionInfo?.id;
58752
58749
  if (sessionId2) {
58753
- await deleteSessionArtifactsAsync(sessionId2, config);
58750
+ await cleanupSessionAndSubagentsAsync(sessionId2, config);
58754
58751
  }
58755
58752
  if (config.getDebugMode()) {
58756
58753
  debugLogger.debug(
@@ -59144,7 +59141,7 @@ var SETTINGS_SCHEMA = {
59144
59141
  category: "General",
59145
59142
  requiresRestart: false,
59146
59143
  default: false,
59147
- description: "Enable run-event notifications for action-required prompts and session completion. Currently macOS only.",
59144
+ description: "Enable run-event notifications for action-required prompts and session completion.",
59148
59145
  showInDialog: true
59149
59146
  },
59150
59147
  checkpointing: {
@@ -59176,13 +59173,22 @@ var SETTINGS_SCHEMA = {
59176
59173
  description: "Planning features configuration.",
59177
59174
  showInDialog: false,
59178
59175
  properties: {
59176
+ enabled: {
59177
+ type: "boolean",
59178
+ label: "Enable Plan Mode",
59179
+ category: "General",
59180
+ requiresRestart: true,
59181
+ default: true,
59182
+ description: "Enable Plan Mode for read-only safety during planning.",
59183
+ showInDialog: true
59184
+ },
59179
59185
  directory: {
59180
59186
  type: "string",
59181
59187
  label: "Plan Directory",
59182
59188
  category: "General",
59183
59189
  requiresRestart: true,
59184
59190
  default: void 0,
59185
- description: "The directory where planning artifacts are stored. If not specified, defaults to the system temporary directory.",
59191
+ description: "The directory where planning artifacts are stored. If not specified, defaults to the system temporary directory. A custom directory requires a policy to allow write access in Plan Mode.",
59186
59192
  showInDialog: true
59187
59193
  },
59188
59194
  modelRouting: {
@@ -59430,6 +59436,15 @@ var SETTINGS_SCHEMA = {
59430
59436
  description: 'Show the "? for shortcuts" hint above the input.',
59431
59437
  showInDialog: true
59432
59438
  },
59439
+ compactToolOutput: {
59440
+ type: "boolean",
59441
+ label: "Compact Tool Output",
59442
+ category: "UI",
59443
+ requiresRestart: false,
59444
+ default: false,
59445
+ description: "Display tool outputs (like directory listings and file reads) in a compact, structured format.",
59446
+ showInDialog: true
59447
+ },
59433
59448
  hideBanner: {
59434
59449
  type: "boolean",
59435
59450
  label: "Hide Banner",
@@ -60041,6 +60056,15 @@ var SETTINGS_SCHEMA = {
60041
60056
  description: "Disable user input on browser window during automation.",
60042
60057
  showInDialog: false
60043
60058
  },
60059
+ maxActionsPerTask: {
60060
+ type: "number",
60061
+ label: "Max Actions Per Task",
60062
+ category: "Advanced",
60063
+ requiresRestart: false,
60064
+ default: 100,
60065
+ description: "The maximum number of tool calls allowed per browser task. Enforcement is hard: the agent will be terminated when the limit is reached.",
60066
+ showInDialog: false
60067
+ },
60044
60068
  confirmSensitiveActions: {
60045
60069
  type: "boolean",
60046
60070
  label: "Confirm Sensitive Actions",
@@ -60109,6 +60133,16 @@ var SETTINGS_SCHEMA = {
60109
60133
  description: "Maximum number of directories to search for memory.",
60110
60134
  showInDialog: true
60111
60135
  },
60136
+ memoryBoundaryMarkers: {
60137
+ type: "array",
60138
+ label: "Memory Boundary Markers",
60139
+ category: "Context",
60140
+ requiresRestart: true,
60141
+ default: [".git"],
60142
+ description: "File or directory names that mark the boundary for GEMINI.md discovery. The upward traversal stops at the first directory containing any of these markers. An empty array disables parent traversal.",
60143
+ showInDialog: false,
60144
+ items: { type: "string" }
60145
+ },
60112
60146
  includeDirectories: {
60113
60147
  type: "array",
60114
60148
  label: "Include Directories",
@@ -60260,6 +60294,20 @@ var SETTINGS_SCHEMA = {
60260
60294
  `,
60261
60295
  showInDialog: true
60262
60296
  },
60297
+ backgroundCompletionBehavior: {
60298
+ type: "enum",
60299
+ label: "Background Completion Behavior",
60300
+ category: "Tools",
60301
+ requiresRestart: false,
60302
+ default: "silent",
60303
+ description: "Controls what happens when a background shell command finishes. 'silent' (default): quietly exits in background. 'inject': automatically returns output to agent. 'notify': shows brief message in chat.",
60304
+ showInDialog: false,
60305
+ options: [
60306
+ { label: "Silent", value: "silent" },
60307
+ { label: "Inject", value: "inject" },
60308
+ { label: "Notify", value: "notify" }
60309
+ ]
60310
+ },
60263
60311
  pager: {
60264
60312
  type: "string",
60265
60313
  label: "Pager",
@@ -60682,54 +60730,6 @@ var SETTINGS_SCHEMA = {
60682
60730
  description: "Setting to enable experimental features",
60683
60731
  showInDialog: false,
60684
60732
  properties: {
60685
- toolOutputMasking: {
60686
- type: "object",
60687
- label: "Tool Output Masking",
60688
- category: "Experimental",
60689
- requiresRestart: true,
60690
- ignoreInDocs: false,
60691
- default: {},
60692
- description: "Advanced settings for tool output masking to manage context window efficiency.",
60693
- showInDialog: false,
60694
- properties: {
60695
- enabled: {
60696
- type: "boolean",
60697
- label: "Enable Tool Output Masking",
60698
- category: "Experimental",
60699
- requiresRestart: true,
60700
- default: true,
60701
- description: "Enables tool output masking to save tokens.",
60702
- showInDialog: true
60703
- },
60704
- toolProtectionThreshold: {
60705
- type: "number",
60706
- label: "Tool Protection Threshold",
60707
- category: "Experimental",
60708
- requiresRestart: true,
60709
- default: 5e4,
60710
- description: "Minimum number of tokens to protect from masking (most recent tool outputs).",
60711
- showInDialog: false
60712
- },
60713
- minPrunableTokensThreshold: {
60714
- type: "number",
60715
- label: "Min Prunable Tokens Threshold",
60716
- category: "Experimental",
60717
- requiresRestart: true,
60718
- default: 3e4,
60719
- description: "Minimum prunable tokens required to trigger a masking pass.",
60720
- showInDialog: false
60721
- },
60722
- protectLatestTurn: {
60723
- type: "boolean",
60724
- label: "Protect Latest Turn",
60725
- category: "Experimental",
60726
- requiresRestart: true,
60727
- default: true,
60728
- description: "Ensures the absolute latest turn is never masked, regardless of token count.",
60729
- showInDialog: false
60730
- }
60731
- }
60732
- },
60733
60733
  enableAgents: {
60734
60734
  type: "boolean",
60735
60735
  label: "Enable Agents",
@@ -60820,15 +60820,6 @@ var SETTINGS_SCHEMA = {
60820
60820
  description: "Use OSC 52 for copying. This may be more robust than the default system when using remote terminal sessions (if your terminal is configured to allow it).",
60821
60821
  showInDialog: true
60822
60822
  },
60823
- plan: {
60824
- type: "boolean",
60825
- label: "Plan",
60826
- category: "Experimental",
60827
- requiresRestart: true,
60828
- default: true,
60829
- description: "Enable Plan Mode.",
60830
- showInDialog: true
60831
- },
60832
60823
  taskTracker: {
60833
60824
  type: "boolean",
60834
60825
  label: "Task Tracker",
@@ -60923,6 +60914,15 @@ var SETTINGS_SCHEMA = {
60923
60914
  description: "Replace the built-in save_memory tool with a memory manager subagent that supports adding, removing, de-duplicating, and organizing memories.",
60924
60915
  showInDialog: true
60925
60916
  },
60917
+ contextManagement: {
60918
+ type: "boolean",
60919
+ label: "Enable Context Management",
60920
+ category: "Experimental",
60921
+ requiresRestart: true,
60922
+ default: false,
60923
+ description: "Enable logic for context management.",
60924
+ showInDialog: true
60925
+ },
60926
60926
  topicUpdateNarration: {
60927
60927
  type: "boolean",
60928
60928
  label: "Topic & Update Narration",
@@ -61178,6 +61178,159 @@ var SETTINGS_SCHEMA = {
61178
61178
  mergeStrategy: "concat" /* CONCAT */
61179
61179
  }
61180
61180
  },
61181
+ contextManagement: {
61182
+ type: "object",
61183
+ label: "Context Management",
61184
+ category: "Experimental",
61185
+ requiresRestart: true,
61186
+ default: {},
61187
+ description: "Settings for agent history and tool distillation context management.",
61188
+ showInDialog: false,
61189
+ properties: {
61190
+ historyWindow: {
61191
+ type: "object",
61192
+ label: "History Window Settings",
61193
+ category: "Context Management",
61194
+ requiresRestart: true,
61195
+ default: {},
61196
+ showInDialog: false,
61197
+ properties: {
61198
+ maxTokens: {
61199
+ type: "number",
61200
+ label: "Max Tokens",
61201
+ category: "Context Management",
61202
+ requiresRestart: true,
61203
+ default: 15e4,
61204
+ description: "The number of tokens to allow before triggering compression.",
61205
+ showInDialog: false
61206
+ },
61207
+ retainedTokens: {
61208
+ type: "number",
61209
+ label: "Retained Tokens",
61210
+ category: "Context Management",
61211
+ requiresRestart: true,
61212
+ default: 4e4,
61213
+ description: "The number of tokens to always retain.",
61214
+ showInDialog: false
61215
+ }
61216
+ }
61217
+ },
61218
+ messageLimits: {
61219
+ type: "object",
61220
+ label: "Message Limits",
61221
+ category: "Context Management",
61222
+ requiresRestart: true,
61223
+ default: {},
61224
+ showInDialog: false,
61225
+ properties: {
61226
+ normalMaxTokens: {
61227
+ type: "number",
61228
+ label: "Normal Maximum Tokens",
61229
+ category: "Context Management",
61230
+ requiresRestart: true,
61231
+ default: 2500,
61232
+ description: "The target number of tokens to budget for a normal conversation turn.",
61233
+ showInDialog: false
61234
+ },
61235
+ retainedMaxTokens: {
61236
+ type: "number",
61237
+ label: "Retained Maximum Tokens",
61238
+ category: "Context Management",
61239
+ requiresRestart: true,
61240
+ default: 12e3,
61241
+ description: "The maximum number of tokens a single conversation turn can consume before truncation.",
61242
+ showInDialog: false
61243
+ },
61244
+ normalizationHeadRatio: {
61245
+ type: "number",
61246
+ label: "Normalization Head Ratio",
61247
+ category: "Context Management",
61248
+ requiresRestart: true,
61249
+ default: 0.25,
61250
+ description: "The ratio of tokens to retain from the beginning of a truncated message (0.0 to 1.0).",
61251
+ showInDialog: false
61252
+ }
61253
+ }
61254
+ },
61255
+ tools: {
61256
+ type: "object",
61257
+ label: "Context Management Tools",
61258
+ category: "Context Management",
61259
+ requiresRestart: true,
61260
+ default: {},
61261
+ showInDialog: false,
61262
+ properties: {
61263
+ distillation: {
61264
+ type: "object",
61265
+ label: "Tool Distillation",
61266
+ category: "Context Management",
61267
+ requiresRestart: true,
61268
+ default: {},
61269
+ showInDialog: false,
61270
+ properties: {
61271
+ maxOutputTokens: {
61272
+ type: "number",
61273
+ label: "Max Output Tokens",
61274
+ category: "Context Management",
61275
+ requiresRestart: true,
61276
+ default: 1e4,
61277
+ description: "Maximum tokens to show to the model when truncating large tool outputs.",
61278
+ showInDialog: false
61279
+ },
61280
+ summarizationThresholdTokens: {
61281
+ type: "number",
61282
+ label: "Tool Summarization Threshold",
61283
+ category: "Context Management",
61284
+ requiresRestart: true,
61285
+ default: 2e4,
61286
+ description: "Threshold above which truncated tool outputs will be summarized by an LLM.",
61287
+ showInDialog: false
61288
+ }
61289
+ }
61290
+ },
61291
+ outputMasking: {
61292
+ type: "object",
61293
+ label: "Tool Output Masking",
61294
+ category: "Context Management",
61295
+ requiresRestart: true,
61296
+ ignoreInDocs: false,
61297
+ default: {},
61298
+ description: "Advanced settings for tool output masking to manage context window efficiency.",
61299
+ showInDialog: false,
61300
+ properties: {
61301
+ protectionThresholdTokens: {
61302
+ type: "number",
61303
+ label: "Tool Protection Threshold (Tokens)",
61304
+ category: "Context Management",
61305
+ requiresRestart: true,
61306
+ default: 5e4,
61307
+ description: "Minimum number of tokens to protect from masking (most recent tool outputs).",
61308
+ showInDialog: false
61309
+ },
61310
+ minPrunableThresholdTokens: {
61311
+ type: "number",
61312
+ label: "Min Prunable Tokens Threshold",
61313
+ category: "Context Management",
61314
+ requiresRestart: true,
61315
+ default: 3e4,
61316
+ description: "Minimum prunable tokens required to trigger a masking pass.",
61317
+ showInDialog: false
61318
+ },
61319
+ protectLatestTurn: {
61320
+ type: "boolean",
61321
+ label: "Protect Latest Turn",
61322
+ category: "Context Management",
61323
+ requiresRestart: true,
61324
+ default: true,
61325
+ description: "Ensures the absolute latest turn is never masked, regardless of token count.",
61326
+ showInDialog: false
61327
+ }
61328
+ }
61329
+ }
61330
+ }
61331
+ }
61332
+ }
61333
+ },
61181
61334
  admin: {
61182
61335
  type: "object",
61183
61336
  label: "Admin",
@@ -62931,7 +63084,7 @@ function migrateExperimentalSettings(settings, loadedSettings, scope, removeDepr
62931
63084
  let modified = false;
62932
63085
  const migrateExperimental = (oldKey, migrateFn) => {
62933
63086
  const old = experimentalSettings[oldKey];
62934
- if (old) {
63087
+ if (old !== void 0) {
62935
63088
  foundDeprecated?.push(`experimental.${oldKey}`);
62936
63089
  migrateFn(old);
62937
63090
  modified = true;
@@ -62983,6 +63136,21 @@ function migrateExperimentalSettings(settings, loadedSettings, scope, removeDepr
62983
63136
  if (old["enabled"] !== void 0) override["enabled"] = old["enabled"];
62984
63137
  agentsOverrides["cli_help"] = override;
62985
63138
  });
63139
+ migrateExperimental("plan", (planValue) => {
63140
+ const generalSettings = settings.general || {};
63141
+ const newGeneral = { ...generalSettings };
63142
+ const planSettings = (
63143
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
63144
+ newGeneral["plan"] || {}
63145
+ );
63146
+ const newPlan = { ...planSettings };
63147
+ if (newPlan["enabled"] === void 0) {
63148
+ newPlan["enabled"] = planValue;
63149
+ newGeneral["plan"] = newPlan;
63150
+ loadedSettings.setValue(scope, "general", newGeneral);
63151
+ modified = true;
63152
+ }
63153
+ });
62986
63154
  if (modified) {
62987
63155
  agentsSettings["overrides"] = agentsOverrides;
62988
63156
  loadedSettings.setValue(scope, "agents", agentsSettings);
@@ -62990,6 +63158,7 @@ function migrateExperimentalSettings(settings, loadedSettings, scope, removeDepr
62990
63158
  const newExperimental = { ...experimentalSettings };
62991
63159
  delete newExperimental["codebaseInvestigatorSettings"];
62992
63160
  delete newExperimental["cliHelpAgentSettings"];
63161
+ delete newExperimental["plan"];
62993
63162
  loadedSettings.setValue(scope, "experimental", newExperimental);
62994
63163
  }
62995
63164
  return true;
@@ -63286,19 +63455,6 @@ var useFocus = () => {
63286
63455
  };
63287
63456
  };
63288
63457
 
63289
- // packages/cli/src/utils/events.ts
63290
- import { EventEmitter as EventEmitter3 } from "node:events";
63291
- var AppEvent = /* @__PURE__ */ ((AppEvent2) => {
63292
- AppEvent2["OpenDebugConsole"] = "open-debug-console";
63293
- AppEvent2["Flicker"] = "flicker";
63294
- AppEvent2["SelectionWarning"] = "selection-warning";
63295
- AppEvent2["PasteTimeout"] = "paste-timeout";
63296
- AppEvent2["TerminalBackground"] = "terminal-background";
63297
- AppEvent2["TransientMessage"] = "transient-message";
63298
- return AppEvent2;
63299
- })(AppEvent || {});
63300
- var appEvents = new EventEmitter3();
63301
-
63302
63458
  // packages/cli/src/ui/utils/terminalCapabilityManager.ts
63303
63459
  import * as fs11 from "node:fs";
63304
63460
 
@@ -63543,6 +63699,12 @@ var TerminalCapabilityManager = class _TerminalCapabilityManager {
63543
63699
  isKittyProtocolEnabled() {
63544
63700
  return this.kittyEnabled;
63545
63701
  }
63702
+ isGhosttyTerminal(env3 = process.env) {
63703
+ const termProgram = env3["TERM_PROGRAM"]?.toLowerCase();
63704
+ const term = env3["TERM"]?.toLowerCase();
63705
+ const name = this.getTerminalName()?.toLowerCase();
63706
+ return !!(name?.includes("ghostty") || termProgram?.includes("ghostty") || term?.includes("ghostty"));
63707
+ }
63546
63708
  supportsOsc9Notifications(env3 = process.env) {
63547
63709
  if (env3["WT_SESSION"]) {
63548
63710
  return false;
@@ -64256,6 +64418,7 @@ var Command = /* @__PURE__ */ ((Command2) => {
64256
64418
  Command2["EXPAND_SUGGESTION"] = "suggest.expand";
64257
64419
  Command2["COLLAPSE_SUGGESTION"] = "suggest.collapse";
64258
64420
  Command2["SUBMIT"] = "input.submit";
64421
+ Command2["QUEUE_MESSAGE"] = "input.queueMessage";
64259
64422
  Command2["NEWLINE"] = "input.newline";
64260
64423
  Command2["OPEN_EXTERNAL_EDITOR"] = "input.openExternalEditor";
64261
64424
  Command2["PASTE_CLIPBOARD"] = "input.paste";
@@ -64282,6 +64445,8 @@ var Command = /* @__PURE__ */ ((Command2) => {
64282
64445
  Command2["UNFOCUS_BACKGROUND_SHELL"] = "background.unfocus";
64283
64446
  Command2["UNFOCUS_BACKGROUND_SHELL_LIST"] = "background.unfocusList";
64284
64447
  Command2["SHOW_BACKGROUND_SHELL_UNFOCUS_WARNING"] = "background.unfocusWarning";
64448
+ Command2["UPDATE_EXTENSION"] = "extension.update";
64449
+ Command2["LINK_EXTENSION"] = "extension.link";
64285
64450
  return Command2;
64286
64451
  })(Command || {});
64287
64452
  var KeyBinding = class _KeyBinding {
@@ -64491,6 +64656,7 @@ var defaultKeyBindingConfig = /* @__PURE__ */ new Map([
64491
64656
  // Text Input
64492
64657
  // Must also exclude shift to allow shift+enter for newline
64493
64658
  ["input.submit" /* SUBMIT */, [new KeyBinding("enter")]],
64659
+ ["input.queueMessage" /* QUEUE_MESSAGE */, [new KeyBinding("tab")]],
64494
64660
  [
64495
64661
  "input.newline" /* NEWLINE */,
64496
64662
  [
@@ -64534,7 +64700,10 @@ var defaultKeyBindingConfig = /* @__PURE__ */ new Map([
64534
64700
  ["background.kill" /* KILL_BACKGROUND_SHELL */, [new KeyBinding("ctrl+k")]],
64535
64701
  ["background.unfocus" /* UNFOCUS_BACKGROUND_SHELL */, [new KeyBinding("shift+tab")]],
64536
64702
  ["background.unfocusList" /* UNFOCUS_BACKGROUND_SHELL_LIST */, [new KeyBinding("tab")]],
64537
- ["background.unfocusWarning" /* SHOW_BACKGROUND_SHELL_UNFOCUS_WARNING */, [new KeyBinding("tab")]]
64703
+ ["background.unfocusWarning" /* SHOW_BACKGROUND_SHELL_UNFOCUS_WARNING */, [new KeyBinding("tab")]],
64704
+ // Extension Controls
64705
+ ["extension.update" /* UPDATE_EXTENSION */, [new KeyBinding("i")]],
64706
+ ["extension.link" /* LINK_EXTENSION */, [new KeyBinding("l")]]
64538
64707
  ]);
64539
64708
  var keybindingsSchema = external_exports.array(
64540
64709
  external_exports.object({
@@ -66656,6 +66825,152 @@ var XCode = new Theme(
66656
66825
  xcodeColors
66657
66826
  );
66658
66827
 
66828
+ // packages/cli/src/ui/themes/builtin/dark/tokyonight-dark.ts
66829
+ var palette = {
66830
+ bg: "#1a1b26",
66831
+ bg_dark: "#16161e",
66832
+ bg_dark1: "#0C0E14",
66833
+ bg_highlight: "#292e42",
66834
+ blue: "#7aa2f7",
66835
+ blue0: "#3d59a1",
66836
+ blue1: "#2ac3de",
66837
+ blue2: "#0db9d7",
66838
+ blue5: "#89ddff",
66839
+ blue6: "#b4f9f8",
66840
+ blue7: "#394b70",
66841
+ comment: "#565f89",
66842
+ cyan: "#7dcfff",
66843
+ fg: "#c0caf5",
66844
+ fg_dark: "#a9b1d6",
66845
+ fg_gutter: "#3b4261",
66846
+ green: "#9ece6a",
66847
+ green1: "#73daca",
66848
+ green2: "#41a6b5",
66849
+ magenta: "#bb9af7",
66850
+ magenta2: "#ff007c",
66851
+ orange: "#ff9e64",
66852
+ purple: "#9d7cd8",
66853
+ red: "#f7768e",
66854
+ red1: "#db4b4b",
66855
+ teal: "#1abc9c",
66856
+ yellow: "#e0af68",
66857
+ diff: {
66858
+ add: "#243e4a",
66859
+ change: "#1f2231",
66860
+ delete: "#4a272f"
66861
+ }
66862
+ };
66863
+ var tokyoNightColors = {
66864
+ type: "dark",
66865
+ Background: palette.bg,
66866
+ Foreground: palette.fg,
66867
+ LightBlue: palette.purple,
66868
+ AccentBlue: palette.magenta,
66869
+ AccentPurple: palette.blue,
66870
+ AccentCyan: palette.cyan,
66871
+ AccentGreen: palette.teal,
66872
+ AccentYellow: palette.yellow,
66873
+ AccentRed: palette.red1,
66874
+ DiffAdded: palette.diff.add,
66875
+ DiffRemoved: palette.diff.delete,
66876
+ Comment: palette.comment,
66877
+ Gray: palette.fg_dark,
66878
+ DarkGray: palette.fg_gutter,
66879
+ FocusColor: palette.blue,
66880
+ GradientColors: [palette.blue, palette.magenta, palette.cyan]
66881
+ };
66882
+ var TokyoNight = new Theme(
66883
+ "Tokyo Night",
66884
+ "dark",
66885
+ {
66886
+ hljs: {
66887
+ display: "block",
66888
+ overflowX: "auto",
66889
+ padding: "0.5em",
66890
+ background: palette.bg,
66891
+ color: palette.fg
66892
+ },
66893
+ "hljs-addition": { background: palette.diff.add },
66894
+ "hljs-attr": { color: palette.green1 },
66895
+ "hljs-attribute": { color: palette.green1 },
66896
+ "hljs-brace": { color: palette.fg_dark },
66897
+ "hljs-built_in": { color: palette.blue1 },
66898
+ "hljs-builtin-symbol": { color: palette.blue1 },
66899
+ "hljs-bullet": {
66900
+ color: palette.orange,
66901
+ fontWeight: "bold"
66902
+ },
66903
+ "hljs-char": { color: palette.green },
66904
+ "hljs-char-escape": { color: palette.magenta },
66905
+ "hljs-character": { color: palette.green },
66906
+ "hljs-class": { color: palette.blue1 },
66907
+ "hljs-class-title": { color: palette.blue1 },
66908
+ "hljs-code": { color: palette.green },
66909
+ "hljs-comment": {
66910
+ color: palette.comment,
66911
+ fontStyle: "italic"
66912
+ },
66913
+ "hljs-computation-expression": { color: palette.cyan },
66914
+ "hljs-deletion": { background: palette.diff.delete },
66915
+ "hljs-doctag": { color: palette.yellow },
66916
+ "hljs-emphasis": { fontStyle: "italic" },
66917
+ "hljs-function": { color: palette.blue },
66918
+ "hljs-function-dispatch": { color: palette.blue },
66919
+ "hljs-keyword": {
66920
+ color: palette.magenta,
66921
+ fontStyle: "italic"
66922
+ },
66923
+ "hljs-label": { color: palette.blue },
66924
+ "hljs-link": { color: palette.teal },
66925
+ "hljs-literal": { color: palette.orange },
66926
+ "hljs-message-name": { color: palette.blue },
66927
+ "hljs-meta": { color: palette.cyan },
66928
+ "hljs-meta-prompt": { color: palette.fg_dark },
66929
+ "hljs-name": { color: palette.magenta },
66930
+ "hljs-named-character": { color: palette.blue1 },
66931
+ "hljs-number": { color: palette.orange },
66932
+ "hljs-operator": { color: palette.blue5 },
66933
+ "hljs-params": { color: palette.yellow },
66934
+ "hljs-property": { color: palette.green1 },
66935
+ "hljs-punctuation": { color: palette.fg_dark },
66936
+ "hljs-quote": {
66937
+ color: palette.comment,
66938
+ fontStyle: "italic"
66939
+ },
66940
+ "hljs-regex": { color: palette.blue6 },
66941
+ "hljs-regexp": { color: palette.blue6 },
66942
+ "hljs-rest_arg": {
66943
+ color: interpolateColor(palette.yellow, palette.fg, 0.8)
66944
+ },
66945
+ "hljs-section": {
66946
+ color: palette.blue,
66947
+ fontWeight: "bold"
66948
+ },
66949
+ "hljs-selector-attr": { color: palette.cyan },
66950
+ "hljs-selector-class": { color: palette.green1 },
66951
+ "hljs-selector-id": { color: palette.green1 },
66952
+ "hljs-selector-pseudo": { color: palette.cyan },
66953
+ "hljs-selector-tag": { color: palette.magenta },
66954
+ "hljs-string": { color: palette.green },
66955
+ "hljs-strong": { fontWeight: "bold" },
66956
+ "hljs-subst": { color: palette.blue5 },
66957
+ "hljs-symbol": { color: palette.magenta },
66958
+ "hljs-tag": { color: palette.blue1 },
66959
+ "hljs-template-tag": { color: palette.blue5 },
66960
+ "hljs-template-variable": { color: palette.fg },
66961
+ "hljs-title": { color: palette.blue },
66962
+ "hljs-title-class": { color: palette.blue1 },
66963
+ "hljs-title-class-inherited": { color: palette.blue1 },
66964
+ "hljs-title-function": { color: palette.blue },
66965
+ "hljs-title-function-invoke": { color: palette.blue },
66966
+ "hljs-type": { color: palette.blue1 },
66967
+ "hljs-variable": { color: palette.fg },
66968
+ "hljs-variable-constant": { color: palette.orange },
66969
+ "hljs-variable-language": { color: palette.red }
66970
+ },
66971
+ tokyoNightColors
66972
+ );
66973
+
66659
66974
  // packages/cli/src/ui/themes/theme-manager.ts
66660
66975
  import * as fs13 from "node:fs";
66661
66976
  import * as path6 from "node:path";
@@ -67155,6 +67470,7 @@ var ThemeManager = class {
67155
67470
  SolarizedDark,
67156
67471
  SolarizedLight,
67157
67472
  XCode,
67473
+ TokyoNight,
67158
67474
  ANSI,
67159
67475
  ANSILight
67160
67476
  ];
@@ -68128,8 +68444,8 @@ function getInstallationInfo(projectRoot, isAutoUpdateEnabled) {
68128
68444
  }
68129
68445
 
68130
68446
  // packages/cli/src/utils/updateEventEmitter.ts
68131
- import { EventEmitter as EventEmitter4 } from "node:events";
68132
- var updateEventEmitter = new EventEmitter4();
68447
+ import { EventEmitter as EventEmitter3 } from "node:events";
68448
+ var updateEventEmitter = new EventEmitter3();
68133
68449
 
68134
68450
  // packages/cli/src/utils/spawnWrapper.ts
68135
68451
  import { spawn } from "node:child_process";
@@ -68191,12 +68507,19 @@ Automatic update is not available in sandbox mode.`
68191
68507
  combinedMessage += `
68192
68508
  ${installationInfo.updateMessage}`;
68193
68509
  }
68194
- updateEventEmitter.emit("update-received", {
68195
- message: combinedMessage
68196
- });
68197
68510
  if (!installationInfo.updateCommand || !settings.merged.general.enableAutoUpdate) {
68511
+ updateEventEmitter.emit("update-received", {
68512
+ ...info,
68513
+ message: combinedMessage,
68514
+ isUpdating: false
68515
+ });
68198
68516
  return;
68199
68517
  }
68518
+ updateEventEmitter.emit("update-received", {
68519
+ ...info,
68520
+ message: combinedMessage,
68521
+ isUpdating: true
68522
+ });
68200
68523
  if (_updateInProgress) {
68201
68524
  return;
68202
68525
  }
@@ -75480,7 +75803,7 @@ var incrementMaxListeners = (eventEmitter, maxListenersIncrement, signal) => {
75480
75803
  };
75481
75804
 
75482
75805
  // packages/cli/node_modules/execa/lib/ipc/forward.js
75483
- import { EventEmitter as EventEmitter5 } from "node:events";
75806
+ import { EventEmitter as EventEmitter4 } from "node:events";
75484
75807
 
75485
75808
  // packages/cli/node_modules/execa/lib/ipc/incoming.js
75486
75809
  import { once as once2 } from "node:events";
@@ -75562,7 +75885,7 @@ var getIpcEmitter = (anyProcess, channel, isSubprocess) => {
75562
75885
  if (IPC_EMITTERS.has(anyProcess)) {
75563
75886
  return IPC_EMITTERS.get(anyProcess);
75564
75887
  }
75565
- const ipcEmitter = new EventEmitter5();
75888
+ const ipcEmitter = new EventEmitter4();
75566
75889
  ipcEmitter.connected = true;
75567
75890
  IPC_EMITTERS.set(anyProcess, ipcEmitter);
75568
75891
  forwardEvents({
@@ -80257,6 +80580,7 @@ var parseSlashCommand = (query, commands) => {
80257
80580
  let commandToExecute;
80258
80581
  let pathIndex = 0;
80259
80582
  const canonicalPath = [];
80583
+ let parentCommand;
80260
80584
  for (const part of commandPath) {
80261
80585
  let foundCommand = currentCommands.find((cmd) => cmd.name === part);
80262
80586
  if (!foundCommand) {
@@ -80265,6 +80589,7 @@ var parseSlashCommand = (query, commands) => {
80265
80589
  );
80266
80590
  }
80267
80591
  if (foundCommand) {
80592
+ parentCommand = commandToExecute;
80268
80593
  commandToExecute = foundCommand;
80269
80594
  canonicalPath.push(foundCommand.name);
80270
80595
  pathIndex++;
@@ -80278,6 +80603,13 @@ var parseSlashCommand = (query, commands) => {
80278
80603
  }
80279
80604
  }
80280
80605
  const args = parts.slice(pathIndex).join(" ");
80606
+ if (commandToExecute && commandToExecute.takesArgs === false && args.length > 0 && parentCommand && parentCommand.action) {
80607
+ return {
80608
+ commandToExecute: parentCommand,
80609
+ args: parts.slice(pathIndex - 1).join(" "),
80610
+ canonicalPath: canonicalPath.slice(0, -1)
80611
+ };
80612
+ }
80281
80613
  return { commandToExecute, args, canonicalPath };
80282
80614
  };
80283
80615
 
@@ -85274,11 +85606,11 @@ var useSessionBrowser = (config, onLoadHistory) => {
85274
85606
  * Deletes a session by ID using the ChatRecordingService.
85275
85607
  */
85276
85608
  handleDeleteSession: (0, import_react41.useCallback)(
85277
- (session) => {
85609
+ async (session) => {
85278
85610
  try {
85279
85611
  const chatRecordingService = config.getGeminiClient()?.getChatRecordingService();
85280
85612
  if (chatRecordingService) {
85281
- chatRecordingService.deleteSession(session.file);
85613
+ await chatRecordingService.deleteSession(session.file);
85282
85614
  }
85283
85615
  } catch (error) {
85284
85616
  coreEvents.emitFeedback("error", "Error deleting session:", error);
@@ -87735,7 +88067,7 @@ var authCommand = {
87735
88067
  import process34 from "node:process";
87736
88068
 
87737
88069
  // packages/cli/src/generated/git-commit.ts
87738
- var GIT_COMMIT_INFO = "201c74c03";
88070
+ var GIT_COMMIT_INFO = "c0f8f3cb7";
87739
88071
 
87740
88072
  // packages/cli/src/ui/utils/historyExportUtils.ts
87741
88073
  import * as fsPromises2 from "node:fs/promises";
@@ -87934,6 +88266,7 @@ var listCommand = {
87934
88266
  description: "List saved manual conversation checkpoints",
87935
88267
  kind: "built-in" /* BUILT_IN */,
87936
88268
  autoExecute: true,
88269
+ takesArgs: false,
87937
88270
  action: async (context) => {
87938
88271
  const chatDetails = await getSavedChatTags(context, false);
87939
88272
  const item = {
@@ -88220,10 +88553,18 @@ var chatCommand = {
88220
88553
  description: "Browse auto-saved conversations and manage chat checkpoints",
88221
88554
  kind: "built-in" /* BUILT_IN */,
88222
88555
  autoExecute: true,
88223
- action: async () => ({
88224
- type: "dialog",
88225
- dialog: "sessionBrowser"
88226
- }),
88556
+ action: async (context, args) => {
88557
+ if (args) {
88558
+ const parsed = parseSlashCommand(`/${args}`, chatResumeSubCommands);
88559
+ if (parsed.commandToExecute?.action) {
88560
+ return parsed.commandToExecute.action(context, parsed.args);
88561
+ }
88562
+ }
88563
+ return {
88564
+ type: "dialog",
88565
+ dialog: "sessionBrowser"
88566
+ };
88567
+ },
88227
88568
  subCommands: chatResumeSubCommands
88228
88569
  };
88229
88570
 
@@ -88249,6 +88590,7 @@ var clearCommand = {
88249
88590
  }
88250
88591
  if (geminiClient) {
88251
88592
  context.ui.setDebugMessage("Clearing terminal and resetting chat.");
88593
+ await resetBrowserSession();
88252
88594
  await geminiClient.resetChat();
88253
88595
  } else {
88254
88596
  context.ui.setDebugMessage("Clearing terminal.");
@@ -89426,7 +89768,9 @@ function ExtensionDetails({
89426
89768
  onBack,
89427
89769
  onInstall,
89428
89770
  onLink,
89429
- isInstalled
89771
+ isInstalled,
89772
+ updateState,
89773
+ onUpdate
89430
89774
  }) {
89431
89775
  const keyMatchers = useKeyMatchers();
89432
89776
  const [consentRequest, setConsentRequest] = (0, import_react55.useState)(null);
@@ -89461,7 +89805,7 @@ function ExtensionDetails({
89461
89805
  );
89462
89806
  return true;
89463
89807
  }
89464
- if (key.name === "l" && isLinkable && !isInstalled && !isInstalling) {
89808
+ if (keyMatchers["extension.link" /* LINK_EXTENSION */](key) && isLinkable && !isInstalled && !isInstalling) {
89465
89809
  setIsInstalling(true);
89466
89810
  void onLink(
89467
89811
  (prompt) => new Promise((resolve9) => {
@@ -89470,6 +89814,10 @@ function ExtensionDetails({
89470
89814
  );
89471
89815
  return true;
89472
89816
  }
89817
+ if (keyMatchers["extension.update" /* UPDATE_EXTENSION */](key) && updateState === "update available" /* UPDATE_AVAILABLE */ && !isInstalling) {
89818
+ void onUpdate?.();
89819
+ return true;
89820
+ }
89473
89821
  return false;
89474
89822
  },
89475
89823
  { isActive: true, priority: true }
@@ -89533,7 +89881,9 @@ function ExtensionDetails({
89533
89881
  ">",
89534
89882
  " "
89535
89883
  ] }),
89536
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(Text, { color: theme.text.primary, bold: true, children: extension.extensionName })
89884
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(Text, { color: theme.text.primary, bold: true, children: extension.extensionName }),
89885
+ updateState === "update available" /* UPDATE_AVAILABLE */ && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(Box_default, { marginLeft: 1, children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(Text, { color: theme.status.warning, children: "[I] Update" }) }),
89886
+ updateState === "updating" /* UPDATING */ && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(Box_default, { marginLeft: 1, children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(Text, { color: theme.text.secondary, children: "[Updating...]" }) })
89537
89887
  ] }),
89538
89888
  /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(Box_default, { flexDirection: "row", children: [
89539
89889
  /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(Text, { color: theme.text.secondary, children: [
@@ -89614,7 +89964,7 @@ function ExtensionDetails({
89614
89964
  ]
89615
89965
  }
89616
89966
  ),
89617
- isInstalled && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(Box_default, { flexDirection: "row", marginTop: 1, justifyContent: "center", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(Text, { color: theme.status.success, children: "Already Installed" }) })
89967
+ isInstalled && updateState !== "updating" /* UPDATING */ && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(Box_default, { flexDirection: "row", marginTop: 1, justifyContent: "center", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(Text, { color: theme.status.success, children: "Already Installed" }) })
89618
89968
  ]
89619
89969
  }
89620
89970
  );
@@ -89633,11 +89983,11 @@ function ExtensionRegistryView({
89633
89983
  "",
89634
89984
  config.getExtensionRegistryURI()
89635
89985
  );
89636
- const { terminalHeight, staticExtraHeight } = useUIState();
89986
+ const { terminalHeight, staticExtraHeight, historyManager } = useUIState();
89637
89987
  const [selectedExtension, setSelectedExtension] = (0, import_react56.useState)(null);
89638
- const { extensionsUpdateState } = useExtensionUpdates(
89988
+ const { extensionsUpdateState, dispatchExtensionStateUpdate } = useExtensionUpdates(
89639
89989
  extensionManager,
89640
- () => 0,
89990
+ historyManager.addItem,
89641
89991
  config.getEnableExtensionReloading()
89642
89992
  );
89643
89993
  const [installedExtensions, setInstalledExtensions] = (0, import_react56.useState)(
@@ -89674,6 +90024,21 @@ function ExtensionRegistryView({
89674
90024
  },
89675
90025
  [onLink, extensionManager]
89676
90026
  );
90027
+ const handleUpdate = (0, import_react56.useCallback)(
90028
+ async (extension) => {
90029
+ dispatchExtensionStateUpdate({
90030
+ type: "SCHEDULE_UPDATE",
90031
+ payload: {
90032
+ all: false,
90033
+ names: [extension.extensionName],
90034
+ onComplete: () => {
90035
+ setInstalledExtensions(extensionManager.getExtensions());
90036
+ }
90037
+ }
90038
+ });
90039
+ },
90040
+ [dispatchExtensionStateUpdate, extensionManager]
90041
+ );
89677
90042
  const renderItem = (0, import_react56.useCallback)(
89678
90043
  (item, isActive, _labelWidth) => {
89679
90044
  const isInstalled = installedExtensions.some(
@@ -89682,7 +90047,6 @@ function ExtensionRegistryView({
89682
90047
  const updateState = extensionsUpdateState.get(
89683
90048
  item.extension.extensionName
89684
90049
  );
89685
- const hasUpdate = updateState === "update available" /* UPDATE_AVAILABLE */;
89686
90050
  return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(Box_default, { flexDirection: "row", width: "100%", justifyContent: "space-between", children: [
89687
90051
  /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(Box_default, { flexDirection: "row", flexShrink: 1, minWidth: 0, children: [
89688
90052
  /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(Box_default, { width: 2, flexShrink: 0, children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
@@ -89701,8 +90065,7 @@ function ExtensionRegistryView({
89701
90065
  }
89702
90066
  ) }),
89703
90067
  /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(Box_default, { flexShrink: 0, marginX: 1, children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(Text, { color: theme.text.secondary, children: "|" }) }),
89704
- isInstalled && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(Box_default, { marginRight: 1, flexShrink: 0, children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(Text, { color: theme.status.success, children: "[Installed]" }) }),
89705
- hasUpdate && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(Box_default, { marginRight: 1, flexShrink: 0, children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(Text, { color: theme.status.warning, children: "[Update available]" }) }),
90068
+ updateState === "update available" /* UPDATE_AVAILABLE */ ? /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(Box_default, { marginRight: 1, flexShrink: 0, children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(Text, { color: theme.status.warning, children: "[Update available]" }) }) : updateState === "updating" /* UPDATING */ ? /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(Box_default, { marginRight: 1, flexShrink: 0, children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(Text, { color: theme.text.secondary, children: "[Updating...]" }) }) : isInstalled && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(Box_default, { marginRight: 1, flexShrink: 0, children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(Text, { color: theme.status.success, children: "[Installed]" }) }),
89706
90069
  /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(Box_default, { flexShrink: 1, minWidth: 0, children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(Text, { color: theme.text.secondary, wrap: "truncate-end", children: item.description }) })
89707
90070
  ] }),
89708
90071
  /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(Box_default, { flexShrink: 0, marginLeft: 2, width: 8, flexDirection: "row", children: [
@@ -89802,7 +90165,13 @@ function ExtensionRegistryView({
89802
90165
  },
89803
90166
  isInstalled: installedExtensions.some(
89804
90167
  (e) => e.name === selectedExtension.extensionName
89805
- )
90168
+ ),
90169
+ updateState: extensionsUpdateState.get(
90170
+ selectedExtension.extensionName
90171
+ ),
90172
+ onUpdate: async () => {
90173
+ await handleUpdate(selectedExtension);
90174
+ }
89806
90175
  }
89807
90176
  )
89808
90177
  ] });
@@ -90417,6 +90786,7 @@ var listExtensionsCommand = {
90417
90786
  description: "List active extensions",
90418
90787
  kind: "built-in" /* BUILT_IN */,
90419
90788
  autoExecute: true,
90789
+ takesArgs: false,
90420
90790
  action: listAction2
90421
90791
  };
90422
90792
  var updateExtensionsCommand = {
@@ -90470,6 +90840,7 @@ var exploreExtensionsCommand = {
90470
90840
  description: "Open extensions page in your browser",
90471
90841
  kind: "built-in" /* BUILT_IN */,
90472
90842
  autoExecute: true,
90843
+ takesArgs: false,
90473
90844
  action: exploreAction
90474
90845
  };
90475
90846
  var reloadCommand = {
@@ -90497,26 +90868,35 @@ function extensionsCommand(enableExtensionReloading) {
90497
90868
  linkCommand,
90498
90869
  configCommand2
90499
90870
  ] : [];
90871
+ const subCommands = [
90872
+ listExtensionsCommand,
90873
+ updateExtensionsCommand,
90874
+ exploreExtensionsCommand,
90875
+ reloadCommand,
90876
+ ...conditionalCommands
90877
+ ];
90500
90878
  return {
90501
90879
  name: "extensions",
90502
90880
  description: "Manage extensions",
90503
90881
  kind: "built-in" /* BUILT_IN */,
90504
90882
  autoExecute: false,
90505
- subCommands: [
90506
- listExtensionsCommand,
90507
- updateExtensionsCommand,
90508
- exploreExtensionsCommand,
90509
- reloadCommand,
90510
- ...conditionalCommands
90511
- ],
90512
- action: (context, args) => (
90513
- // Default to list if no subcommand is provided
90514
- listExtensionsCommand.action(context, args)
90515
- )
90883
+ subCommands,
90884
+ action: async (context, args) => {
90885
+ if (args) {
90886
+ const parsed = parseSlashCommand(`/${args}`, subCommands);
90887
+ if (parsed.commandToExecute?.action) {
90888
+ return parsed.commandToExecute.action(context, parsed.args);
90889
+ }
90890
+ }
90891
+ return listExtensionsCommand.action(context, args);
90892
+ }
90516
90893
  };
90517
90894
  }
90518
90895
 
90519
90896
  // packages/cli/src/ui/components/FooterConfigDialog.tsx
90897
+ var import_react60 = __toESM(require_react(), 1);
90898
+
90899
+ // packages/cli/src/ui/components/Footer.tsx
90520
90900
  var import_react59 = __toESM(require_react(), 1);
90521
90901
 
90522
90902
  // packages/cli/src/ui/components/ConsoleSummaryDisplay.tsx
@@ -90546,12 +90926,13 @@ import process38 from "node:process";
90546
90926
  var import_react58 = __toESM(require_react(), 1);
90547
90927
  import process37 from "node:process";
90548
90928
  var import_jsx_runtime18 = __toESM(require_jsx_runtime(), 1);
90549
- var MemoryUsageDisplay = ({
90550
- color = theme.text.primary
90551
- }) => {
90929
+ var MemoryUsageDisplay = ({ color = theme.text.primary, isActive = true }) => {
90552
90930
  const [memoryUsage, setMemoryUsage] = (0, import_react58.useState)("");
90553
90931
  const [memoryUsageColor, setMemoryUsageColor] = (0, import_react58.useState)(color);
90554
90932
  (0, import_react58.useEffect)(() => {
90933
+ if (!isActive) {
90934
+ return;
90935
+ }
90555
90936
  const updateMemory = () => {
90556
90937
  const usage = process37.memoryUsage().rss;
90557
90938
  setMemoryUsage(formatBytes(usage));
@@ -90562,7 +90943,7 @@ var MemoryUsageDisplay = ({
90562
90943
  const intervalId = setInterval(updateMemory, 2e3);
90563
90944
  updateMemory();
90564
90945
  return () => clearInterval(intervalId);
90565
- }, [color]);
90946
+ }, [color, isActive]);
90566
90947
  return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Box_default, { children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Text, { color: memoryUsageColor, children: memoryUsage }) });
90567
90948
  };
90568
90949
 
@@ -90712,6 +91093,11 @@ var ALL_ITEMS = [
90712
91093
  header: "session",
90713
91094
  description: "Unique identifier for the current session"
90714
91095
  },
91096
+ {
91097
+ id: "auth",
91098
+ header: "/auth",
91099
+ description: "Current authentication info"
91100
+ },
90715
91101
  {
90716
91102
  id: "code-changes",
90717
91103
  header: "diff",
@@ -90732,6 +91118,7 @@ var DEFAULT_ORDER = [
90732
91118
  "quota",
90733
91119
  "memory-usage",
90734
91120
  "session-id",
91121
+ "auth",
90735
91122
  "code-changes",
90736
91123
  "token-count"
90737
91124
  ];
@@ -90765,8 +91152,12 @@ function deriveItemsFromLegacySettings(settings) {
90765
91152
  }
90766
91153
  var VALID_IDS = new Set(ALL_ITEMS.map((i) => i.id));
90767
91154
  function resolveFooterState(settings) {
90768
- const source = (settings.ui?.footer?.items ?? deriveItemsFromLegacySettings(settings)).filter((id) => VALID_IDS.has(id));
90769
- const others = DEFAULT_ORDER.filter((id) => !source.includes(id));
91155
+ const showUserIdentity = settings.ui?.showUserIdentity !== false;
91156
+ const filteredValidIds = showUserIdentity ? VALID_IDS : new Set([...VALID_IDS].filter((id) => id !== "auth"));
91157
+ const source = (settings.ui?.footer?.items ?? deriveItemsFromLegacySettings(settings)).filter((id) => filteredValidIds.has(id));
91158
+ const others = DEFAULT_ORDER.filter(
91159
+ (id) => !source.includes(id) && filteredValidIds.has(id)
91160
+ );
90770
91161
  return {
90771
91162
  orderedIds: [...source, ...others],
90772
91163
  selectedIds: new Set(source)
@@ -90869,11 +91260,26 @@ var FooterRow = ({ items, showLabels }) => {
90869
91260
  function isFooterItemId(id) {
90870
91261
  return ALL_ITEMS.some((i) => i.id === id);
90871
91262
  }
90872
- var Footer = () => {
91263
+ var Footer = ({
91264
+ copyModeEnabled = false
91265
+ }) => {
90873
91266
  const uiState = useUIState();
90874
91267
  const config = useConfig();
90875
91268
  const settings = useSettings();
90876
91269
  const { vimEnabled, vimMode } = useVimMode();
91270
+ const authType = config.getContentGeneratorConfig()?.authType;
91271
+ const [email, setEmail] = (0, import_react59.useState)();
91272
+ (0, import_react59.useEffect)(() => {
91273
+ if (authType) {
91274
+ const userAccountManager = new UserAccountManager();
91275
+ setEmail(userAccountManager.getCachedGoogleAccount() ?? void 0);
91276
+ } else {
91277
+ setEmail(void 0);
91278
+ }
91279
+ }, [authType]);
91280
+ if (copyModeEnabled) {
91281
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(Box_default, { height: 1 });
91282
+ }
90877
91283
  const {
90878
91284
  model,
90879
91285
  targetDir,
@@ -91031,7 +91437,18 @@ var Footer = () => {
91031
91437
  break;
91032
91438
  }
91033
91439
  case "memory-usage": {
91034
- addCol(id, header, () => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(MemoryUsageDisplay, { color: itemColor }), 10);
91440
+ addCol(
91441
+ id,
91442
+ header,
91443
+ () => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
91444
+ MemoryUsageDisplay,
91445
+ {
91446
+ color: itemColor,
91447
+ isActive: !uiState.copyModeEnabled
91448
+ }
91449
+ ),
91450
+ 10
91451
+ );
91035
91452
  break;
91036
91453
  }
91037
91454
  case "session-id": {
@@ -91043,6 +91460,18 @@ var Footer = () => {
91043
91460
  );
91044
91461
  break;
91045
91462
  }
91463
+ case "auth": {
91464
+ if (!settings.merged.ui.showUserIdentity) break;
91465
+ if (!authType) break;
91466
+ const displayStr = authType === AuthType.LOGIN_WITH_GOOGLE ? email ?? "google" : authType;
91467
+ addCol(
91468
+ id,
91469
+ header,
91470
+ () => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(Text, { color: itemColor, wrap: "truncate-end", children: displayStr }),
91471
+ displayStr.length
91472
+ );
91473
+ break;
91474
+ }
91046
91475
  case "code-changes": {
91047
91476
  const added = uiState.sessionStats.metrics.files.totalLinesAdded;
91048
91477
  const removed = uiState.sessionStats.metrics.files.totalLinesRemoved;
@@ -91190,14 +91619,14 @@ var FooterConfigDialog = ({
91190
91619
  const keyMatchers = useKeyMatchers();
91191
91620
  const { settings, setSetting } = useSettingsStore();
91192
91621
  const { constrainHeight, terminalHeight, staticExtraHeight } = useUIState();
91193
- const [state, dispatch] = (0, import_react59.useReducer)(
91622
+ const [state, dispatch] = (0, import_react60.useReducer)(
91194
91623
  footerConfigReducer,
91195
91624
  void 0,
91196
91625
  () => resolveFooterState(settings.merged)
91197
91626
  );
91198
91627
  const { orderedIds, selectedIds } = state;
91199
- const [focusKey, setFocusKey] = (0, import_react59.useState)(orderedIds[0]);
91200
- const listItems = (0, import_react59.useMemo)(() => {
91628
+ const [focusKey, setFocusKey] = (0, import_react60.useState)(orderedIds[0]);
91629
+ const listItems = (0, import_react60.useMemo)(() => {
91201
91630
  const items = orderedIds.map((id) => {
91202
91631
  const item = ALL_ITEMS.find((i) => i.id === id);
91203
91632
  if (!item) return null;
@@ -91232,7 +91661,7 @@ var FooterConfigDialog = ({
91232
91661
  });
91233
91662
  return items;
91234
91663
  }, [orderedIds]);
91235
- const handleSaveAndClose = (0, import_react59.useCallback)(() => {
91664
+ const handleSaveAndClose = (0, import_react60.useCallback)(() => {
91236
91665
  const finalItems = orderedIds.filter((id) => selectedIds.has(id));
91237
91666
  const currentSetting = settings.merged.ui?.footer?.items;
91238
91667
  if (JSON.stringify(finalItems) !== JSON.stringify(currentSetting)) {
@@ -91246,17 +91675,17 @@ var FooterConfigDialog = ({
91246
91675
  settings.merged.ui?.footer?.items,
91247
91676
  onClose
91248
91677
  ]);
91249
- const handleResetToDefaults = (0, import_react59.useCallback)(() => {
91678
+ const handleResetToDefaults = (0, import_react60.useCallback)(() => {
91250
91679
  setSetting("User" /* User */, "ui.footer.items", void 0);
91251
91680
  const newState = resolveFooterState(settings.merged);
91252
91681
  dispatch({ type: "SET_STATE", payload: newState });
91253
91682
  setFocusKey(newState.orderedIds[0]);
91254
91683
  }, [setSetting, settings.merged]);
91255
- const handleToggleLabels = (0, import_react59.useCallback)(() => {
91684
+ const handleToggleLabels = (0, import_react60.useCallback)(() => {
91256
91685
  const current = settings.merged.ui.footer.showLabels !== false;
91257
91686
  setSetting("User" /* User */, "ui.footer.showLabels", !current);
91258
91687
  }, [setSetting, settings.merged.ui.footer.showLabels]);
91259
- const handleSelect = (0, import_react59.useCallback)(
91688
+ const handleSelect = (0, import_react60.useCallback)(
91260
91689
  (item) => {
91261
91690
  if (item.type === "config") {
91262
91691
  dispatch({ type: "TOGGLE_ITEM", id: item.id });
@@ -91268,7 +91697,7 @@ var FooterConfigDialog = ({
91268
91697
  },
91269
91698
  [handleResetToDefaults, handleToggleLabels]
91270
91699
  );
91271
- const handleHighlight = (0, import_react59.useCallback)((item) => {
91700
+ const handleHighlight = (0, import_react60.useCallback)((item) => {
91272
91701
  setFocusKey(item.key);
91273
91702
  }, []);
91274
91703
  useKeypress(
@@ -91294,7 +91723,7 @@ var FooterConfigDialog = ({
91294
91723
  { isActive: true, priority: true }
91295
91724
  );
91296
91725
  const showLabels = settings.merged.ui.footer.showLabels !== false;
91297
- const previewContent = (0, import_react59.useMemo)(() => {
91726
+ const previewContent = (0, import_react60.useMemo)(() => {
91298
91727
  if (focusKey === "reset") {
91299
91728
  return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(Text, { color: theme.ui.comment, italic: true, children: "Default footer (uses legacy settings)" });
91300
91729
  }
@@ -91318,6 +91747,7 @@ var FooterConfigDialog = ({
91318
91747
  /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(Text, { color: getColor("code-changes"), children: " " }),
91319
91748
  /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(Text, { color: getColor("code-changes", theme.status.error), children: "-4" })
91320
91749
  ] }),
91750
+ auth: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(Text, { color: getColor("auth", itemColor), children: "test@example.com" }),
91321
91751
  "token-count": /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(Text, { color: getColor("token-count", itemColor), children: "1.5k tokens" })
91322
91752
  };
91323
91753
  const rowItems = itemsToPreview.filter((id) => mockData[id]).map((id) => ({
@@ -91475,10 +91905,10 @@ var shortcutsCommand = {
91475
91905
  };
91476
91906
 
91477
91907
  // packages/cli/src/ui/components/RewindViewer.tsx
91478
- var import_react62 = __toESM(require_react(), 1);
91908
+ var import_react63 = __toESM(require_react(), 1);
91479
91909
 
91480
91910
  // packages/cli/src/ui/hooks/useRewind.ts
91481
- var import_react60 = __toESM(require_react(), 1);
91911
+ var import_react61 = __toESM(require_react(), 1);
91482
91912
 
91483
91913
  // packages/cli/src/ui/utils/rewindFileOps.ts
91484
91914
  import fs38 from "node:fs/promises";
@@ -91631,15 +92061,15 @@ async function revertFileChanges(conversation, targetMessageId) {
91631
92061
 
91632
92062
  // packages/cli/src/ui/hooks/useRewind.ts
91633
92063
  function useRewind(conversation) {
91634
- const [selectedMessageId, setSelectedMessageId] = (0, import_react60.useState)(
92064
+ const [selectedMessageId, setSelectedMessageId] = (0, import_react61.useState)(
91635
92065
  null
91636
92066
  );
91637
- const [confirmationStats, setConfirmationStats] = (0, import_react60.useState)(null);
91638
- const getStats = (0, import_react60.useCallback)(
92067
+ const [confirmationStats, setConfirmationStats] = (0, import_react61.useState)(null);
92068
+ const getStats = (0, import_react61.useCallback)(
91639
92069
  (userMessage) => calculateTurnStats(conversation, userMessage),
91640
92070
  [conversation]
91641
92071
  );
91642
- const selectMessage = (0, import_react60.useCallback)(
92072
+ const selectMessage = (0, import_react61.useCallback)(
91643
92073
  (messageId) => {
91644
92074
  const msg = conversation.messages.find((m2) => m2.id === messageId);
91645
92075
  if (msg) {
@@ -91649,7 +92079,7 @@ function useRewind(conversation) {
91649
92079
  },
91650
92080
  [conversation]
91651
92081
  );
91652
- const clearSelection = (0, import_react60.useCallback)(() => {
92082
+ const clearSelection = (0, import_react61.useCallback)(() => {
91653
92083
  setSelectedMessageId(null);
91654
92084
  setConfirmationStats(null);
91655
92085
  }, []);
@@ -91663,7 +92093,7 @@ function useRewind(conversation) {
91663
92093
  }
91664
92094
 
91665
92095
  // packages/cli/src/ui/components/RewindConfirmation.tsx
91666
- var import_react61 = __toESM(require_react(), 1);
92096
+ var import_react62 = __toESM(require_react(), 1);
91667
92097
  var import_jsx_runtime24 = __toESM(require_jsx_runtime(), 1);
91668
92098
  var REWIND_OPTIONS = [
91669
92099
  {
@@ -91708,7 +92138,7 @@ var RewindConfirmation = ({
91708
92138
  const handleSelect = (outcome) => {
91709
92139
  onConfirm(outcome);
91710
92140
  };
91711
- const options = (0, import_react61.useMemo)(() => {
92141
+ const options = (0, import_react62.useMemo)(() => {
91712
92142
  if (stats) {
91713
92143
  return REWIND_OPTIONS;
91714
92144
  }
@@ -91835,7 +92265,7 @@ var RewindViewer = ({
91835
92265
  onRewind
91836
92266
  }) => {
91837
92267
  const keyMatchers = useKeyMatchers();
91838
- const [isRewinding, setIsRewinding] = (0, import_react62.useState)(false);
92268
+ const [isRewinding, setIsRewinding] = (0, import_react63.useState)(false);
91839
92269
  const { terminalWidth, terminalHeight } = useUIState();
91840
92270
  const isScreenReaderEnabled = use_is_screen_reader_enabled_default();
91841
92271
  const {
@@ -91845,15 +92275,15 @@ var RewindViewer = ({
91845
92275
  selectMessage,
91846
92276
  clearSelection
91847
92277
  } = useRewind(conversation);
91848
- const [highlightedMessageId, setHighlightedMessageId] = (0, import_react62.useState)(null);
91849
- const [expandedMessageId, setExpandedMessageId] = (0, import_react62.useState)(
92278
+ const [highlightedMessageId, setHighlightedMessageId] = (0, import_react63.useState)(null);
92279
+ const [expandedMessageId, setExpandedMessageId] = (0, import_react63.useState)(
91850
92280
  null
91851
92281
  );
91852
- const interactions = (0, import_react62.useMemo)(
92282
+ const interactions = (0, import_react63.useMemo)(
91853
92283
  () => conversation.messages.filter((msg) => msg.type === "user"),
91854
92284
  [conversation.messages]
91855
92285
  );
91856
- const items = (0, import_react62.useMemo)(() => {
92286
+ const items = (0, import_react63.useMemo)(() => {
91857
92287
  const interactionItems = interactions.map((msg, idx) => ({
91858
92288
  key: `${msg.id || "msg"}-${idx}`,
91859
92289
  value: msg,
@@ -92209,7 +92639,7 @@ var rewindCommand = {
92209
92639
  };
92210
92640
 
92211
92641
  // packages/cli/src/ui/commands/hooksCommand.ts
92212
- var import_react64 = __toESM(require_react(), 1);
92642
+ var import_react65 = __toESM(require_react(), 1);
92213
92643
 
92214
92644
  // packages/cli/src/utils/hookSettings.ts
92215
92645
  function enableHook(settings, hookName) {
@@ -92347,7 +92777,7 @@ function renderHookActionFeedback(result, formatScope) {
92347
92777
  }
92348
92778
 
92349
92779
  // packages/cli/src/ui/components/HooksDialog.tsx
92350
- var import_react63 = __toESM(require_react(), 1);
92780
+ var import_react64 = __toESM(require_react(), 1);
92351
92781
  var import_jsx_runtime27 = __toESM(require_jsx_runtime(), 1);
92352
92782
  var DEFAULT_MAX_VISIBLE_HOOKS = 8;
92353
92783
  var HooksDialog = ({
@@ -92356,8 +92786,8 @@ var HooksDialog = ({
92356
92786
  maxVisibleHooks = DEFAULT_MAX_VISIBLE_HOOKS
92357
92787
  }) => {
92358
92788
  const keyMatchers = useKeyMatchers();
92359
- const [scrollOffset, setScrollOffset] = (0, import_react63.useState)(0);
92360
- const flattenedHooks = (0, import_react63.useMemo)(() => {
92789
+ const [scrollOffset, setScrollOffset] = (0, import_react64.useState)(0);
92790
+ const flattenedHooks = (0, import_react64.useMemo)(() => {
92361
92791
  const result = [];
92362
92792
  const hooksByEvent = hooks.reduce(
92363
92793
  (acc, hook) => {
@@ -92501,7 +92931,7 @@ function panelAction(context) {
92501
92931
  const allHooks = hookSystem?.getAllHooks() || [];
92502
92932
  return {
92503
92933
  type: "custom_dialog",
92504
- component: (0, import_react64.createElement)(HooksDialog, {
92934
+ component: (0, import_react65.createElement)(HooksDialog, {
92505
92935
  hooks: allHooks,
92506
92936
  onClose: () => context.ui.removeComponent()
92507
92937
  })
@@ -93136,7 +93566,7 @@ Use /mcp auth <server-name> to authenticate.`
93136
93566
  type: "info",
93137
93567
  text: `Starting OAuth authentication for MCP server '${serverName}'...`
93138
93568
  });
93139
- const { MCPOAuthProvider } = await import("./dist-QEB25IFU.js");
93569
+ const { MCPOAuthProvider } = await import("./dist-YWCADMDD.js");
93140
93570
  let oauthConfig = server.oauth;
93141
93571
  if (!oauthConfig) {
93142
93572
  oauthConfig = { enabled: false };
@@ -93186,7 +93616,7 @@ Use /mcp auth <server-name> to authenticate.`
93186
93616
  );
93187
93617
  }
93188
93618
  };
93189
- var listAction3 = async (context, showDescriptions = false, showSchema = false) => {
93619
+ var listAction3 = async (context, showDescriptions = false, showSchema = false, serverNameFilter) => {
93190
93620
  const agentContext = context.services.agentContext;
93191
93621
  const config = agentContext?.config;
93192
93622
  if (!config) {
@@ -93205,9 +93635,19 @@ var listAction3 = async (context, showDescriptions = false, showSchema = false)
93205
93635
  content: "Could not retrieve tool registry."
93206
93636
  };
93207
93637
  }
93208
- const mcpServers = config.getMcpClientManager()?.getMcpServers() || {};
93209
- const serverNames = Object.keys(mcpServers);
93638
+ let mcpServers = config.getMcpClientManager()?.getMcpServers() || {};
93210
93639
  const blockedMcpServers = config.getMcpClientManager()?.getBlockedMcpServers() || [];
93640
+ if (serverNameFilter) {
93641
+ const filter = serverNameFilter.trim().toLowerCase();
93642
+ if (filter) {
93643
+ mcpServers = Object.fromEntries(
93644
+ Object.entries(mcpServers).filter(
93645
+ ([name]) => name.toLowerCase().includes(filter) || normalizeServerId(name).includes(filter)
93646
+ )
93647
+ );
93648
+ }
93649
+ }
93650
+ const serverNames = Object.keys(mcpServers);
93211
93651
  const connectingServers = serverNames.filter(
93212
93652
  (name) => getMCPServerStatus(name) === MCPServerStatus.CONNECTING
93213
93653
  );
@@ -93293,7 +93733,7 @@ var listCommand2 = {
93293
93733
  description: "List configured MCP servers and tools",
93294
93734
  kind: "built-in" /* BUILT_IN */,
93295
93735
  autoExecute: true,
93296
- action: (context) => listAction3(context)
93736
+ action: (context, args) => listAction3(context, false, false, args)
93297
93737
  };
93298
93738
  var descCommand = {
93299
93739
  name: "desc",
@@ -93301,14 +93741,14 @@ var descCommand = {
93301
93741
  description: "List configured MCP servers and tools with descriptions",
93302
93742
  kind: "built-in" /* BUILT_IN */,
93303
93743
  autoExecute: true,
93304
- action: (context) => listAction3(context, true)
93744
+ action: (context, args) => listAction3(context, true, false, args)
93305
93745
  };
93306
93746
  var schemaCommand = {
93307
93747
  name: "schema",
93308
93748
  description: "List configured MCP servers and tools with descriptions and schemas",
93309
93749
  kind: "built-in" /* BUILT_IN */,
93310
93750
  autoExecute: true,
93311
- action: (context) => listAction3(context, true, true)
93751
+ action: (context, args) => listAction3(context, true, true, args)
93312
93752
  };
93313
93753
  var reloadCommand2 = {
93314
93754
  name: "reload",
@@ -93316,6 +93756,7 @@ var reloadCommand2 = {
93316
93756
  description: "Reloads MCP servers",
93317
93757
  kind: "built-in" /* BUILT_IN */,
93318
93758
  autoExecute: true,
93759
+ takesArgs: false,
93319
93760
  action: async (context) => {
93320
93761
  const agentContext = context.services.agentContext;
93321
93762
  const config = agentContext?.config;
@@ -93476,7 +93917,16 @@ var mcpCommand = {
93476
93917
  enableCommand4,
93477
93918
  disableCommand4
93478
93919
  ],
93479
- action: async (context) => listAction3(context)
93920
+ action: async (context, args) => {
93921
+ if (args) {
93922
+ const parsed = parseSlashCommand(`/${args}`, mcpCommand.subCommands);
93923
+ if (parsed.commandToExecute?.action) {
93924
+ return parsed.commandToExecute.action(context, parsed.args);
93925
+ }
93926
+ return listAction3(context, false, false, args);
93927
+ }
93928
+ return listAction3(context);
93929
+ }
93480
93930
  };
93481
93931
 
93482
93932
  // packages/cli/src/ui/commands/memoryCommand.ts
@@ -93636,7 +94086,7 @@ var modelCommand = {
93636
94086
  };
93637
94087
 
93638
94088
  // packages/cli/src/ui/components/triage/TriageDuplicates.tsx
93639
- var import_react65 = __toESM(require_react(), 1);
94089
+ var import_react66 = __toESM(require_react(), 1);
93640
94090
  var import_jsx_runtime28 = __toESM(require_jsx_runtime(), 1);
93641
94091
  var VISIBLE_LINES_COLLAPSED = 6;
93642
94092
  var VISIBLE_LINES_EXPANDED = 20;
@@ -93662,7 +94112,7 @@ var TriageDuplicates = ({
93662
94112
  initialLimit = 50
93663
94113
  }) => {
93664
94114
  const keyMatchers = useKeyMatchers();
93665
- const [state, setState] = (0, import_react65.useState)({
94115
+ const [state, setState] = (0, import_react66.useState)({
93666
94116
  status: "loading",
93667
94117
  issues: [],
93668
94118
  currentIndex: 0,
@@ -93670,18 +94120,18 @@ var TriageDuplicates = ({
93670
94120
  analyzingIds: /* @__PURE__ */ new Set(),
93671
94121
  message: "Fetching issues..."
93672
94122
  });
93673
- const [focusSection, setFocusSection] = (0, import_react65.useState)("target");
93674
- const [selectedCandidateIndex, setSelectedCandidateIndex] = (0, import_react65.useState)(0);
93675
- const [targetExpanded, setTargetExpanded] = (0, import_react65.useState)(false);
93676
- const [targetScrollOffset, setTargetScrollOffset] = (0, import_react65.useState)(0);
93677
- const [candidateScrollOffset, setCandidateScrollOffset] = (0, import_react65.useState)(0);
93678
- const [inputAction, setInputAction] = (0, import_react65.useState)("");
93679
- const [processedHistory, setProcessedHistory] = (0, import_react65.useState)(
94123
+ const [focusSection, setFocusSection] = (0, import_react66.useState)("target");
94124
+ const [selectedCandidateIndex, setSelectedCandidateIndex] = (0, import_react66.useState)(0);
94125
+ const [targetExpanded, setTargetExpanded] = (0, import_react66.useState)(false);
94126
+ const [targetScrollOffset, setTargetScrollOffset] = (0, import_react66.useState)(0);
94127
+ const [candidateScrollOffset, setCandidateScrollOffset] = (0, import_react66.useState)(0);
94128
+ const [inputAction, setInputAction] = (0, import_react66.useState)("");
94129
+ const [processedHistory, setProcessedHistory] = (0, import_react66.useState)(
93680
94130
  []
93681
94131
  );
93682
- const [showHistory, setShowHistory] = (0, import_react65.useState)(false);
93683
- const [candidateListScrollOffset, setCandidateListScrollOffset] = (0, import_react65.useState)(0);
93684
- (0, import_react65.useEffect)(() => {
94132
+ const [showHistory, setShowHistory] = (0, import_react66.useState)(false);
94133
+ const [candidateListScrollOffset, setCandidateListScrollOffset] = (0, import_react66.useState)(0);
94134
+ (0, import_react66.useEffect)(() => {
93685
94135
  if (selectedCandidateIndex < candidateListScrollOffset) {
93686
94136
  setCandidateListScrollOffset(selectedCandidateIndex);
93687
94137
  } else if (selectedCandidateIndex >= candidateListScrollOffset + VISIBLE_CANDIDATES) {
@@ -93708,7 +94158,7 @@ var TriageDuplicates = ({
93708
94158
  return null;
93709
94159
  }
93710
94160
  };
93711
- const analyzeIssue = (0, import_react65.useCallback)(
94161
+ const analyzeIssue = (0, import_react66.useCallback)(
93712
94162
  async (issue) => {
93713
94163
  const dupComment = issue.comments.find(
93714
94164
  (c) => c.body.includes("Found possible duplicate issues:")
@@ -93849,7 +94299,7 @@ Return a JSON object with:
93849
94299
  },
93850
94300
  [config]
93851
94301
  );
93852
- (0, import_react65.useEffect)(() => {
94302
+ (0, import_react66.useEffect)(() => {
93853
94303
  if (state.issues.length === 0) return;
93854
94304
  const analyzeNext = async () => {
93855
94305
  const issuesToAnalyze = state.issues.slice(
@@ -93898,7 +94348,7 @@ Return a JSON object with:
93898
94348
  state.analyzingIds,
93899
94349
  analyzeIssue
93900
94350
  ]);
93901
- (0, import_react65.useEffect)(() => {
94351
+ (0, import_react66.useEffect)(() => {
93902
94352
  const issue = state.issues[state.currentIndex];
93903
94353
  if (!issue) return;
93904
94354
  const analysis = state.analysisCache.get(issue.number);
@@ -93934,7 +94384,7 @@ Return a JSON object with:
93934
94384
  state.analysisCache,
93935
94385
  state.analyzingIds
93936
94386
  ]);
93937
- const fetchIssues = (0, import_react65.useCallback)(async (limit) => {
94387
+ const fetchIssues = (0, import_react66.useCallback)(async (limit) => {
93938
94388
  try {
93939
94389
  const { stdout } = await spawnAsync("gh", [
93940
94390
  "issue",
@@ -93974,10 +94424,10 @@ Return a JSON object with:
93974
94424
  }));
93975
94425
  }
93976
94426
  }, []);
93977
- (0, import_react65.useEffect)(() => {
94427
+ (0, import_react66.useEffect)(() => {
93978
94428
  void fetchIssues(initialLimit);
93979
94429
  }, [fetchIssues, initialLimit]);
93980
- const handleNext = (0, import_react65.useCallback)(() => {
94430
+ const handleNext = (0, import_react66.useCallback)(() => {
93981
94431
  const nextIndex = state.currentIndex + 1;
93982
94432
  if (nextIndex < state.issues.length) {
93983
94433
  setFocusSection("target");
@@ -94485,7 +94935,7 @@ Return a JSON object with:
94485
94935
  };
94486
94936
 
94487
94937
  // packages/cli/src/ui/components/triage/TriageIssues.tsx
94488
- var import_react66 = __toESM(require_react(), 1);
94938
+ var import_react67 = __toESM(require_react(), 1);
94489
94939
  var import_jsx_runtime29 = __toESM(require_jsx_runtime(), 1);
94490
94940
  var VISIBLE_LINES_COLLAPSED2 = 8;
94491
94941
  var VISIBLE_LINES_EXPANDED2 = 20;
@@ -94504,7 +94954,7 @@ var TriageIssues = ({
94504
94954
  until
94505
94955
  }) => {
94506
94956
  const keyMatchers = useKeyMatchers();
94507
- const [state, setState] = (0, import_react66.useState)({
94957
+ const [state, setState] = (0, import_react67.useState)({
94508
94958
  status: "loading",
94509
94959
  issues: [],
94510
94960
  currentIndex: 0,
@@ -94512,15 +94962,15 @@ var TriageIssues = ({
94512
94962
  analyzingIds: /* @__PURE__ */ new Set(),
94513
94963
  message: "Fetching issues..."
94514
94964
  });
94515
- const [targetExpanded, setTargetExpanded] = (0, import_react66.useState)(false);
94516
- const [targetScrollOffset, setTargetScrollOffset] = (0, import_react66.useState)(0);
94517
- const [isEditingComment, setIsEditingComment] = (0, import_react66.useState)(false);
94518
- const [processedHistory, setProcessedHistory] = (0, import_react66.useState)(
94965
+ const [targetExpanded, setTargetExpanded] = (0, import_react67.useState)(false);
94966
+ const [targetScrollOffset, setTargetScrollOffset] = (0, import_react67.useState)(0);
94967
+ const [isEditingComment, setIsEditingComment] = (0, import_react67.useState)(false);
94968
+ const [processedHistory, setProcessedHistory] = (0, import_react67.useState)(
94519
94969
  []
94520
94970
  );
94521
- const [showHistory, setShowHistory] = (0, import_react66.useState)(false);
94522
- const abortControllerRef = (0, import_react66.useRef)(new AbortController());
94523
- (0, import_react66.useEffect)(
94971
+ const [showHistory, setShowHistory] = (0, import_react67.useState)(false);
94972
+ const abortControllerRef = (0, import_react67.useRef)(new AbortController());
94973
+ (0, import_react67.useEffect)(
94524
94974
  () => () => {
94525
94975
  abortControllerRef.current.abort();
94526
94976
  },
@@ -94532,12 +94982,12 @@ var TriageIssues = ({
94532
94982
  });
94533
94983
  const currentIssue = state.issues[state.currentIndex];
94534
94984
  const analysis = currentIssue ? state.analysisCache.get(currentIssue.number) : void 0;
94535
- (0, import_react66.useEffect)(() => {
94985
+ (0, import_react67.useEffect)(() => {
94536
94986
  if (analysis?.suggested_comment && !isEditingComment) {
94537
94987
  commentBuffer.setText(analysis.suggested_comment);
94538
94988
  }
94539
94989
  }, [analysis, commentBuffer, isEditingComment]);
94540
- const fetchIssues = (0, import_react66.useCallback)(
94990
+ const fetchIssues = (0, import_react67.useCallback)(
94541
94991
  async (limit) => {
94542
94992
  try {
94543
94993
  const searchParts = [
@@ -94585,10 +95035,10 @@ var TriageIssues = ({
94585
95035
  },
94586
95036
  [until]
94587
95037
  );
94588
- (0, import_react66.useEffect)(() => {
95038
+ (0, import_react67.useEffect)(() => {
94589
95039
  void fetchIssues(initialLimit);
94590
95040
  }, [fetchIssues, initialLimit]);
94591
- const analyzeIssue = (0, import_react66.useCallback)(
95041
+ const analyzeIssue = (0, import_react67.useCallback)(
94592
95042
  async (issue) => {
94593
95043
  const client = config.getBaseLlmClient();
94594
95044
  const prompt = `
@@ -94647,7 +95097,7 @@ Return a JSON object with:
94647
95097
  },
94648
95098
  [config]
94649
95099
  );
94650
- (0, import_react66.useEffect)(() => {
95100
+ (0, import_react67.useEffect)(() => {
94651
95101
  if (state.issues.length === 0) return;
94652
95102
  const analyzeNext = async () => {
94653
95103
  const issuesToAnalyze = state.issues.slice(
@@ -94694,7 +95144,7 @@ Return a JSON object with:
94694
95144
  state.analyzingIds,
94695
95145
  analyzeIssue
94696
95146
  ]);
94697
- const handleNext = (0, import_react66.useCallback)(() => {
95147
+ const handleNext = (0, import_react67.useCallback)(() => {
94698
95148
  const nextIndex = state.currentIndex + 1;
94699
95149
  if (nextIndex < state.issues.length) {
94700
95150
  setTargetExpanded(false);
@@ -94709,7 +95159,7 @@ Return a JSON object with:
94709
95159
  }));
94710
95160
  }
94711
95161
  }, [state.currentIndex, state.issues.length]);
94712
- (0, import_react66.useEffect)(() => {
95162
+ (0, import_react67.useEffect)(() => {
94713
95163
  if (currentIssue && state.analysisCache.has(currentIssue.number)) {
94714
95164
  const res = state.analysisCache.get(currentIssue.number);
94715
95165
  if (res.recommendation === "keep") {
@@ -95219,6 +95669,12 @@ var planCommand = {
95219
95669
  if (previousApprovalMode !== ApprovalMode.PLAN) {
95220
95670
  coreEvents.emitFeedback("info", "Switched to Plan Mode.");
95221
95671
  }
95672
+ if (context.invocation?.args) {
95673
+ return {
95674
+ type: "submit_prompt",
95675
+ content: context.invocation.args
95676
+ };
95677
+ }
95222
95678
  const approvedPlanPath = config.getApprovedPlanPath();
95223
95679
  if (!approvedPlanPath) {
95224
95680
  return;
@@ -95235,12 +95691,14 @@ var planCommand = {
95235
95691
  type: "gemini" /* GEMINI */,
95236
95692
  text: partToString(content.llmContent)
95237
95693
  });
95694
+ return;
95238
95695
  } catch (error) {
95239
95696
  coreEvents.emitFeedback(
95240
95697
  "error",
95241
95698
  `Failed to read approved plan at ${approvedPlanPath}: ${error}`,
95242
95699
  error
95243
95700
  );
95701
+ return;
95244
95702
  }
95245
95703
  },
95246
95704
  subCommands: [
@@ -95249,6 +95707,7 @@ var planCommand = {
95249
95707
  description: "Copy the currently approved plan to your clipboard",
95250
95708
  kind: "built-in" /* BUILT_IN */,
95251
95709
  autoExecute: true,
95710
+ takesArgs: false,
95252
95711
  action: copyAction
95253
95712
  }
95254
95713
  ]
@@ -96224,7 +96683,15 @@ var skillsCommand = {
96224
96683
  action: reloadAction2
96225
96684
  }
96226
96685
  ],
96227
- action: listAction4
96686
+ action: async (context, args) => {
96687
+ if (args) {
96688
+ const parsed = parseSlashCommand(`/${args}`, skillsCommand.subCommands);
96689
+ if (parsed.commandToExecute?.action) {
96690
+ return parsed.commandToExecute.action(context, parsed.args);
96691
+ }
96692
+ }
96693
+ return listAction4(context, args);
96694
+ }
96228
96695
  };
96229
96696
 
96230
96697
  // packages/cli/src/ui/commands/settingsCommand.ts
@@ -96240,15 +96707,15 @@ var settingsCommand = {
96240
96707
  })
96241
96708
  };
96242
96709
 
96243
- // packages/cli/src/ui/commands/shellsCommand.ts
96244
- var shellsCommand = {
96245
- name: "shells",
96246
- altNames: ["bashes"],
96710
+ // packages/cli/src/ui/commands/tasksCommand.ts
96711
+ var tasksCommand = {
96712
+ name: "tasks",
96713
+ altNames: ["bg", "background"],
96247
96714
  kind: "built-in" /* BUILT_IN */,
96248
- description: "Toggle background shells view",
96715
+ description: "Toggle background tasks view",
96249
96716
  autoExecute: true,
96250
96717
  action: async (context) => {
96251
- context.ui.toggleBackgroundShell();
96718
+ context.ui.toggleBackgroundTasks();
96252
96719
  }
96253
96720
  };
96254
96721
 
@@ -96772,7 +97239,7 @@ var BuiltinCommandLoader = class {
96772
97239
  }
96773
97240
  ] : [skillsCommand] : [],
96774
97241
  settingsCommand,
96775
- shellsCommand,
97242
+ tasksCommand,
96776
97243
  vimCommand,
96777
97244
  setupGithubCommand,
96778
97245
  terminalSetupCommand,
@@ -97533,6 +98000,10 @@ export {
97533
98000
  ACTIVE_SHELL_MAX_LINES,
97534
98001
  COMPLETED_SHELL_MAX_LINES,
97535
98002
  SUBAGENT_MAX_LINES,
98003
+ SKILLS_DOCS_URL,
98004
+ COMPACT_TOOL_SUBVIEW_MAX_LINES,
98005
+ MAX_SHELL_OUTPUT_SIZE,
98006
+ SHELL_OUTPUT_TRUNCATION_BUFFER,
97536
98007
  require_tinygradient,
97537
98008
  INK_SUPPORTED_NAMES,
97538
98009
  INK_NAME_TO_HEX_MAP,
@@ -97558,6 +98029,7 @@ export {
97558
98029
  escapeAnsiCtrlCodes,
97559
98030
  require_react,
97560
98031
  mapCoreStatusToDisplayStatus,
98032
+ isTodoList,
97561
98033
  RESUME_LATEST,
97562
98034
  SessionError,
97563
98035
  cleanMessage,
@@ -97663,7 +98135,6 @@ export {
97663
98135
  parseMouseEvent,
97664
98136
  isIncompleteMouseSequence,
97665
98137
  useFocus,
97666
- appEvents,
97667
98138
  SettingsContext,
97668
98139
  useSettings,
97669
98140
  useSettingsStore,