wave-code 0.11.0 → 0.11.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/acp/agent.ts"],"names":[],"mappings":"AAmBA,OAAO,EACL,KAAK,KAAK,IAAI,QAAQ,EACtB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EAUzB,KAAK,qBAAqB,EAC1B,KAAK,6BAA6B,EAClC,KAAK,8BAA8B,EAMpC,MAAM,0BAA0B,CAAC;AAElC,qBAAa,YAAa,YAAW,QAAQ;IAC3C,OAAO,CAAC,MAAM,CAAqC;IACnD,OAAO,CAAC,UAAU,CAAsB;gBAE5B,UAAU,EAAE,mBAAmB;IAI3C,OAAO,CAAC,mBAAmB;IAkC3B,OAAO,CAAC,uBAAuB;YAmBjB,gBAAgB;IASxB,UAAU,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAwBzC,YAAY,IAAI,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;YAI5C,WAAW;IAiEnB,UAAU,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAalE,WAAW,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAWrE,YAAY,CAChB,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CAAC,oBAAoB,CAAC;IAuB1B,qBAAqB,CACzB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAc7B,SAAS,CACb,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAO7B,cAAc,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAc5D,sBAAsB,CAC1B,MAAM,EAAE,6BAA6B,GACpC,OAAO,CAAC,8BAA8B,CAAC;IAqBpC,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;IAyDtD,MAAM,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IASvD,OAAO,CAAC,kBAAkB;YA2BZ,uBAAuB;YAsKvB,mBAAmB;IA6EjC,OAAO,CAAC,cAAc;IA6CtB,OAAO,CAAC,gBAAgB;IAmCxB,OAAO,CAAC,WAAW;IAmBnB,OAAO,CAAC,eAAe;CAgMxB"}
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/acp/agent.ts"],"names":[],"mappings":"AAmBA,OAAO,EACL,KAAK,KAAK,IAAI,QAAQ,EACtB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EAUzB,KAAK,qBAAqB,EAC1B,KAAK,6BAA6B,EAClC,KAAK,8BAA8B,EAMpC,MAAM,0BAA0B,CAAC;AAElC,qBAAa,YAAa,YAAW,QAAQ;IAC3C,OAAO,CAAC,MAAM,CAAqC;IACnD,OAAO,CAAC,UAAU,CAAsB;gBAE5B,UAAU,EAAE,mBAAmB;IAI3C,OAAO,CAAC,mBAAmB;IAkC3B,OAAO,CAAC,uBAAuB;YAmBjB,gBAAgB;IASxB,UAAU,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAwBzC,YAAY,IAAI,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;YAI5C,WAAW;IAiEnB,UAAU,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAalE,WAAW,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAWrE,YAAY,CAChB,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CAAC,oBAAoB,CAAC;IAuB1B,qBAAqB,CACzB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAc7B,SAAS,CACb,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAO7B,cAAc,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAc5D,sBAAsB,CAC1B,MAAM,EAAE,6BAA6B,GACpC,OAAO,CAAC,8BAA8B,CAAC;IAqBpC,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;IAyDtD,MAAM,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IASvD,OAAO,CAAC,kBAAkB;YA2BZ,uBAAuB;YAqKvB,mBAAmB;IA6EjC,OAAO,CAAC,cAAc;IA0BtB,OAAO,CAAC,gBAAgB;IAmCxB,OAAO,CAAC,WAAW;IAmBnB,OAAO,CAAC,eAAe;CA+LxB"}
package/dist/acp/agent.js CHANGED
@@ -401,16 +401,15 @@ export class WaveAcpAgent {
401
401
  case "allow_always":
402
402
  if (context.toolName === BASH_TOOL_NAME) {
403
403
  const command = context.toolInput?.command || "";
404
- const rule = context.suggestedPrefix
405
- ? `${context.suggestedPrefix}*`
406
- : command;
404
+ const rule = context.suggestedPrefix || command;
407
405
  return {
408
406
  behavior: "allow",
409
407
  newPermissionRule: `${BASH_TOOL_NAME}(${rule})`,
410
408
  };
411
409
  }
412
410
  if (context.toolName === EDIT_TOOL_NAME ||
413
- context.toolName === WRITE_TOOL_NAME) {
411
+ context.toolName === WRITE_TOOL_NAME ||
412
+ context.toolName === EXIT_PLAN_MODE_TOOL_NAME) {
414
413
  return {
415
414
  behavior: "allow",
416
415
  newPermissionMode: "acceptEdits",
@@ -508,9 +507,9 @@ export class WaveAcpAgent {
508
507
  },
509
508
  ];
510
509
  }
511
- return this.getToolContent(name, parameters, undefined);
510
+ return this.getToolContent(name, parameters);
512
511
  }
513
- getToolContent(name, parameters, shortResult) {
512
+ getToolContent(name, parameters) {
514
513
  const contents = [];
515
514
  if (parameters) {
516
515
  if (name === "Write") {
@@ -529,24 +528,6 @@ export class WaveAcpAgent {
529
528
  newText: parameters.new_string,
530
529
  });
531
530
  }
532
- else if (name === EXIT_PLAN_MODE_TOOL_NAME) {
533
- contents.push({
534
- type: "content",
535
- content: {
536
- type: "text",
537
- text: parameters.plan_content,
538
- },
539
- });
540
- }
541
- }
542
- if (shortResult) {
543
- contents.push({
544
- type: "content",
545
- content: {
546
- type: "text",
547
- text: shortResult,
548
- },
549
- });
550
531
  }
551
532
  return contents.length > 0 ? contents : undefined;
552
533
  }
@@ -649,14 +630,17 @@ export class WaveAcpAgent {
649
630
  let parsedParameters = undefined;
650
631
  if (parameters) {
651
632
  try {
652
- parsedParameters = JSON.parse(parameters);
633
+ const parsed = JSON.parse(parameters);
634
+ parsedParameters = Array.isArray(parsed)
635
+ ? { args: parsed }
636
+ : parsed;
653
637
  }
654
638
  catch {
655
639
  // Ignore parse errors during streaming
656
640
  }
657
641
  }
658
642
  const content = effectiveName && (parsedParameters || effectiveShortResult)
659
- ? this.getToolContent(effectiveName, parsedParameters, effectiveShortResult)
643
+ ? this.getToolContent(effectiveName, parsedParameters)
660
644
  : undefined;
661
645
  const locations = effectiveName && parsedParameters
662
646
  ? this.getToolLocations(effectiveName, parsedParameters, effectiveStartLineNumber)
@@ -1 +1 @@
1
- {"version":3,"file":"ChatInterface.d.ts","sourceRoot":"","sources":["../../src/components/ChatInterface.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAiD,MAAM,OAAO,CAAC;AAatE,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAyKjC,CAAC"}
1
+ {"version":3,"file":"ChatInterface.d.ts","sourceRoot":"","sources":["../../src/components/ChatInterface.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAiD,MAAM,OAAO,CAAC;AAatE,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EA0KjC,CAAC"}
@@ -75,7 +75,7 @@ export const ChatInterface = () => {
75
75
  ]);
76
76
  if (!sessionId)
77
77
  return null;
78
- return (_jsxs(Box, { flexDirection: "column", children: [_jsx(MessageList, { messages: displayMessages, isExpanded: isExpanded, forceStatic: isConfirmationVisible && isConfirmationTooTall, version: version, workdir: workdir, model: model, onDynamicBlocksHeightMeasured: handleDynamicBlocksHeightMeasured }), (isLoading || isCommandRunning || isCompressing) &&
78
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(MessageList, { messages: displayMessages, isExpanded: isExpanded, forceStatic: isConfirmationVisible && isConfirmationTooTall, isFinished: !isLoading && !isCommandRunning && !isCompressing, version: version, workdir: workdir, model: model, onDynamicBlocksHeightMeasured: handleDynamicBlocksHeightMeasured }), (isLoading || isCommandRunning || isCompressing) &&
79
79
  !isConfirmationVisible &&
80
80
  !isExpanded && (_jsx(LoadingIndicator, { isLoading: isLoading, isCommandRunning: isCommandRunning, isCompressing: isCompressing, latestTotalTokens: latestTotalTokens })), !isConfirmationVisible && !isExpanded && _jsx(TaskList, {}), isConfirmationVisible && (_jsxs(_Fragment, { children: [_jsx(ConfirmationDetails, { toolName: confirmingTool.name, toolInput: confirmingTool.input, isExpanded: isExpanded, onHeightMeasured: handleDetailsHeightMeasured, isStatic: isConfirmationTooTall }), _jsx(ConfirmationSelector, { toolName: confirmingTool.name, toolInput: confirmingTool.input, suggestedPrefix: confirmingTool.suggestedPrefix, hidePersistentOption: confirmingTool.hidePersistentOption, isExpanded: isExpanded, onDecision: wrappedHandleConfirmationDecision, onCancel: handleConfirmationCancel, onAbort: abortMessage, onHeightMeasured: handleSelectorHeightMeasured })] })), !isConfirmationVisible && !isExpanded && (_jsxs(_Fragment, { children: [_jsx(QueuedMessageList, {}), _jsx(InputBox, { isLoading: isLoading, isCommandRunning: isCommandRunning, sendMessage: sendMessage, abortMessage: abortMessage, mcpServers: mcpServers, connectMcpServer: connectMcpServer, disconnectMcpServer: disconnectMcpServer, slashCommands: slashCommands, hasSlashCommand: hasSlashCommand })] }))] }));
81
81
  };
@@ -305,7 +305,7 @@ export const ConfirmationSelector = ({ toolName, toolInput, suggestedPrefix, hid
305
305
  }
306
306
  else {
307
307
  const rule = suggestedPrefix
308
- ? `Bash(${suggestedPrefix}*)`
308
+ ? `Bash(${suggestedPrefix})`
309
309
  : `Bash(${toolInput?.command})`;
310
310
  onDecision({ behavior: "allow", newPermissionRule: rule });
311
311
  }
@@ -4,10 +4,11 @@ export interface MessageListProps {
4
4
  messages: Message[];
5
5
  isExpanded?: boolean;
6
6
  forceStatic?: boolean;
7
+ isFinished?: boolean;
7
8
  version?: string;
8
9
  workdir?: string;
9
10
  model?: string;
10
11
  onDynamicBlocksHeightMeasured?: (height: number) => void;
11
12
  }
12
- export declare const MessageList: React.MemoExoticComponent<({ messages, isExpanded, forceStatic, version, workdir, model, onDynamicBlocksHeightMeasured, }: MessageListProps) => import("react/jsx-runtime").JSX.Element>;
13
+ export declare const MessageList: React.MemoExoticComponent<({ messages, isExpanded, forceStatic, isFinished, version, workdir, model, onDynamicBlocksHeightMeasured, }: MessageListProps) => import("react/jsx-runtime").JSX.Element>;
13
14
  //# sourceMappingURL=MessageList.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"MessageList.d.ts","sourceRoot":"","sources":["../../src/components/MessageList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkC,MAAM,OAAO,CAAC;AAGvD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAG9C,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6BAA6B,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1D;AAED,eAAO,MAAM,WAAW,6HASnB,gBAAgB,6CA+GpB,CAAC"}
1
+ {"version":3,"file":"MessageList.d.ts","sourceRoot":"","sources":["../../src/components/MessageList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkC,MAAM,OAAO,CAAC;AAGvD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAG9C,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6BAA6B,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1D;AAED,eAAO,MAAM,WAAW,yIAUnB,gBAAgB,6CA+GpB,CAAC"}
@@ -3,7 +3,7 @@ import React, { useLayoutEffect, useRef } from "react";
3
3
  import os from "os";
4
4
  import { Box, Text, Static, measureElement } from "ink";
5
5
  import { MessageBlockItem } from "./MessageBlockItem.js";
6
- export const MessageList = React.memo(({ messages, isExpanded = false, forceStatic = false, version, workdir, model, onDynamicBlocksHeightMeasured, }) => {
6
+ export const MessageList = React.memo(({ messages, isExpanded = false, forceStatic = false, isFinished = false, version, workdir, model, onDynamicBlocksHeightMeasured, }) => {
7
7
  const welcomeMessage = (_jsxs(Box, { flexDirection: "column", paddingTop: 1, children: [_jsxs(Text, { color: "gray", children: ["WAVE", version ? ` v${version}` : "", model ? ` • ${model}` : ""] }), workdir && (_jsx(Text, { color: "gray", wrap: "truncate-middle", children: workdir.replace(os.homedir(), "~") }))] }));
8
8
  // Limit messages to prevent long rendering times
9
9
  const maxMessages = 10;
@@ -21,7 +21,7 @@ export const MessageList = React.memo(({ messages, isExpanded = false, forceStat
21
21
  // Determine which blocks are static vs dynamic
22
22
  const blocksWithStatus = allBlocks.map((item) => {
23
23
  const { isLastMessage } = item;
24
- const isDynamic = !forceStatic && isLastMessage;
24
+ const isDynamic = !forceStatic && !isFinished && isLastMessage;
25
25
  return { ...item, isDynamic };
26
26
  });
27
27
  const staticBlocks = blocksWithStatus.filter((b) => !b.isDynamic);
@@ -1 +1 @@
1
- {"version":3,"file":"useChat.d.ts","sourceRoot":"","sources":["../../src/contexts/useChat.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useChat.d.ts","sourceRoot":"","sources":["../../src/contexts/useChat.tsx"],"names":[],"mappings":"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"}
@@ -241,7 +241,13 @@ export const ChatProvider = ({ children, bypassPermissions, permissionMode: init
241
241
  !hasImageAttachments) {
242
242
  const command = expandedContent.substring(1).trim();
243
243
  if (command) {
244
- await agentRef.current?.executeBashCommand(command);
244
+ setIsCommandRunning(true);
245
+ try {
246
+ await agentRef.current?.executeBashCommand(command);
247
+ }
248
+ finally {
249
+ setIsCommandRunning(false);
250
+ }
245
251
  return;
246
252
  }
247
253
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wave-code",
3
- "version": "0.11.0",
3
+ "version": "0.11.2",
4
4
  "description": "CLI-based code assistant powered by AI, built with React and Ink",
5
5
  "repository": {
6
6
  "type": "git",
@@ -29,6 +29,7 @@
29
29
  "README.md"
30
30
  ],
31
31
  "dependencies": {
32
+ "@agentclientprotocol/sdk": "0.17.0",
32
33
  "chalk": "^5.6.2",
33
34
  "diff": "^8.0.2",
34
35
  "glob": "^13.0.0",
@@ -39,9 +40,8 @@
39
40
  "react": "^19.2.4",
40
41
  "react-dom": "19.2.4",
41
42
  "yargs": "^17.7.2",
42
- "@agentclientprotocol/sdk": "0.16.1",
43
43
  "zod": "^3.23.8",
44
- "wave-agent-sdk": "0.11.0"
44
+ "wave-agent-sdk": "0.11.2"
45
45
  },
46
46
  "devDependencies": {
47
47
  "@types/react": "^19.1.8",
package/src/acp/agent.ts CHANGED
@@ -544,9 +544,7 @@ export class WaveAcpAgent implements AcpAgent {
544
544
  case "allow_always":
545
545
  if (context.toolName === BASH_TOOL_NAME) {
546
546
  const command = (context.toolInput?.command as string) || "";
547
- const rule = context.suggestedPrefix
548
- ? `${context.suggestedPrefix}*`
549
- : command;
547
+ const rule = context.suggestedPrefix || command;
550
548
  return {
551
549
  behavior: "allow",
552
550
  newPermissionRule: `${BASH_TOOL_NAME}(${rule})`,
@@ -554,7 +552,8 @@ export class WaveAcpAgent implements AcpAgent {
554
552
  }
555
553
  if (
556
554
  context.toolName === EDIT_TOOL_NAME ||
557
- context.toolName === WRITE_TOOL_NAME
555
+ context.toolName === WRITE_TOOL_NAME ||
556
+ context.toolName === EXIT_PLAN_MODE_TOOL_NAME
558
557
  ) {
559
558
  return {
560
559
  behavior: "allow",
@@ -658,13 +657,12 @@ export class WaveAcpAgent implements AcpAgent {
658
657
  },
659
658
  ];
660
659
  }
661
- return this.getToolContent(name, parameters, undefined);
660
+ return this.getToolContent(name, parameters);
662
661
  }
663
662
 
664
663
  private getToolContent(
665
664
  name: string,
666
665
  parameters: Record<string, unknown> | undefined,
667
- shortResult: string | undefined,
668
666
  ): ToolCallContent[] | undefined {
669
667
  const contents: ToolCallContent[] = [];
670
668
  if (parameters) {
@@ -682,27 +680,9 @@ export class WaveAcpAgent implements AcpAgent {
682
680
  oldText: parameters.old_string as string,
683
681
  newText: parameters.new_string as string,
684
682
  });
685
- } else if (name === EXIT_PLAN_MODE_TOOL_NAME) {
686
- contents.push({
687
- type: "content",
688
- content: {
689
- type: "text",
690
- text: parameters.plan_content as string,
691
- },
692
- });
693
683
  }
694
684
  }
695
685
 
696
- if (shortResult) {
697
- contents.push({
698
- type: "content",
699
- content: {
700
- type: "text",
701
- text: shortResult,
702
- },
703
- });
704
- }
705
-
706
686
  return contents.length > 0 ? contents : undefined;
707
687
  }
708
688
 
@@ -837,7 +817,10 @@ export class WaveAcpAgent implements AcpAgent {
837
817
  let parsedParameters: Record<string, unknown> | undefined = undefined;
838
818
  if (parameters) {
839
819
  try {
840
- parsedParameters = JSON.parse(parameters);
820
+ const parsed = JSON.parse(parameters);
821
+ parsedParameters = Array.isArray(parsed)
822
+ ? { args: parsed }
823
+ : parsed;
841
824
  } catch {
842
825
  // Ignore parse errors during streaming
843
826
  }
@@ -845,11 +828,7 @@ export class WaveAcpAgent implements AcpAgent {
845
828
 
846
829
  const content =
847
830
  effectiveName && (parsedParameters || effectiveShortResult)
848
- ? this.getToolContent(
849
- effectiveName,
850
- parsedParameters,
851
- effectiveShortResult,
852
- )
831
+ ? this.getToolContent(effectiveName, parsedParameters)
853
832
  : undefined;
854
833
  const locations =
855
834
  effectiveName && parsedParameters
@@ -121,6 +121,7 @@ export const ChatInterface: React.FC = () => {
121
121
  messages={displayMessages}
122
122
  isExpanded={isExpanded}
123
123
  forceStatic={isConfirmationVisible && isConfirmationTooTall}
124
+ isFinished={!isLoading && !isCommandRunning && !isCompressing}
124
125
  version={version}
125
126
  workdir={workdir}
126
127
  model={model}
@@ -375,7 +375,7 @@ export const ConfirmationSelector: React.FC<ConfirmationSelectorProps> = ({
375
375
  onDecision({ behavior: "allow", newPermissionMode: "acceptEdits" });
376
376
  } else {
377
377
  const rule = suggestedPrefix
378
- ? `Bash(${suggestedPrefix}*)`
378
+ ? `Bash(${suggestedPrefix})`
379
379
  : `Bash(${toolInput?.command})`;
380
380
  onDecision({ behavior: "allow", newPermissionRule: rule });
381
381
  }
@@ -8,6 +8,7 @@ export interface MessageListProps {
8
8
  messages: Message[];
9
9
  isExpanded?: boolean;
10
10
  forceStatic?: boolean;
11
+ isFinished?: boolean;
11
12
  version?: string;
12
13
  workdir?: string;
13
14
  model?: string;
@@ -19,6 +20,7 @@ export const MessageList = React.memo(
19
20
  messages,
20
21
  isExpanded = false,
21
22
  forceStatic = false,
23
+ isFinished = false,
22
24
  version,
23
25
  workdir,
24
26
  model,
@@ -56,7 +58,7 @@ export const MessageList = React.memo(
56
58
  // Determine which blocks are static vs dynamic
57
59
  const blocksWithStatus = allBlocks.map((item) => {
58
60
  const { isLastMessage } = item;
59
- const isDynamic = !forceStatic && isLastMessage;
61
+ const isDynamic = !forceStatic && !isFinished && isLastMessage;
60
62
  return { ...item, isDynamic };
61
63
  });
62
64
 
@@ -462,7 +462,12 @@ export const ChatProvider: React.FC<ChatProviderProps> = ({
462
462
  ) {
463
463
  const command = expandedContent.substring(1).trim();
464
464
  if (command) {
465
- await agentRef.current?.executeBashCommand(command);
465
+ setIsCommandRunning(true);
466
+ try {
467
+ await agentRef.current?.executeBashCommand(command);
468
+ } finally {
469
+ setIsCommandRunning(false);
470
+ }
466
471
  return;
467
472
  }
468
473
  }