@bike4mind/cli 0.2.10-dowgrade-mcp-sdk.17228 → 0.2.10-fix-b4m-cli-flicker.17235

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 (2) hide show
  1. package/dist/index.js +138 -119
  2. package/package.json +6 -6
package/dist/index.js CHANGED
@@ -79,19 +79,19 @@ import {
79
79
  } from "./chunk-PDX44BCA.js";
80
80
 
81
81
  // src/index.tsx
82
- import React16, { useState as useState7, useEffect as useEffect3, useCallback, useRef } from "react";
83
- import { render, Box as Box15, Text as Text15, useApp, useInput as useInput6 } from "ink";
82
+ import React17, { useState as useState7, useEffect as useEffect3, useCallback, useRef } from "react";
83
+ import { render, Box as Box16, Text as Text16, useApp, useInput as useInput6 } from "ink";
84
84
  import { v4 as uuidv49 } from "uuid";
85
85
 
86
86
  // src/components/App.tsx
87
- import React10 from "react";
88
- import { Box as Box9, Text as Text9 } from "ink";
87
+ import React11 from "react";
88
+ import { Box as Box10, Text as Text10, Static } from "ink";
89
89
 
90
90
  // src/components/StatusBar.tsx
91
91
  import React from "react";
92
92
  import { Box, Text } from "ink";
93
93
  var StatusBar = React.memo(function StatusBar2({ sessionName, model, tokenUsage }) {
94
- return /* @__PURE__ */ React.createElement(Box, { borderStyle: "single", borderColor: "green", paddingX: 1 }, /* @__PURE__ */ React.createElement(Box, { flexDirection: "row", justifyContent: "space-between", width: "100%" }, /* @__PURE__ */ React.createElement(Box, { gap: 2 }, /* @__PURE__ */ React.createElement(Text, { color: "green", bold: true }, "\u{1F4DD} Session:"), /* @__PURE__ */ React.createElement(Text, null, sessionName)), /* @__PURE__ */ React.createElement(Box, { gap: 2 }, /* @__PURE__ */ React.createElement(Text, { color: "blue", bold: true }, "\u{1F916} Model:"), /* @__PURE__ */ React.createElement(Text, null, model)), /* @__PURE__ */ React.createElement(Box, { gap: 2 }, /* @__PURE__ */ React.createElement(Text, { color: "yellow", bold: true }, "\u{1F4CA} Tokens:"), /* @__PURE__ */ React.createElement(Text, null, tokenUsage.toLocaleString()))));
94
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row", justifyContent: "space-between", width: "100%", paddingX: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, sessionName), /* @__PURE__ */ React.createElement(Box, { gap: 2 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, tokenUsage.toLocaleString(), " tokens"), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, model)));
95
95
  });
96
96
 
97
97
  // src/components/InputPrompt.tsx
@@ -918,6 +918,29 @@ var useCliStore = create((set) => ({
918
918
  // Session state
919
919
  session: null,
920
920
  setSession: (session) => set({ session }),
921
+ // Pending messages
922
+ pendingMessages: [],
923
+ addPendingMessage: (message) => set((state) => ({ pendingMessages: [...state.pendingMessages, message] })),
924
+ updatePendingMessage: (index, message) => set((state) => {
925
+ const updated = [...state.pendingMessages];
926
+ updated[index] = message;
927
+ return { pendingMessages: updated };
928
+ }),
929
+ clearPendingMessages: () => set({ pendingMessages: [] }),
930
+ completePendingMessage: (index, finalMessage) => set((state) => {
931
+ const pending = [...state.pendingMessages];
932
+ pending.splice(index, 1);
933
+ const session = state.session;
934
+ if (!session) return { pendingMessages: pending };
935
+ return {
936
+ pendingMessages: pending,
937
+ session: {
938
+ ...session,
939
+ messages: [...session.messages, finalMessage],
940
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
941
+ }
942
+ };
943
+ }),
921
944
  // UI state
922
945
  isThinking: false,
923
946
  setIsThinking: (thinking) => set({ isThinking: thinking }),
@@ -1217,6 +1240,26 @@ function ConfigEditor({ config, availableModels, onSave, onClose }) {
1217
1240
  })), /* @__PURE__ */ React9.createElement(Box8, { borderStyle: "single", borderColor: "gray", paddingX: 1 }, /* @__PURE__ */ React9.createElement(Text8, { dimColor: true }, "\u2191/\u2193: Navigate | Space/\u2190/\u2192: Change | q/Esc: Save & Exit")));
1218
1241
  }
1219
1242
 
1243
+ // src/components/MessageItem.tsx
1244
+ import React10 from "react";
1245
+ import { Box as Box9, Text as Text9 } from "ink";
1246
+ function MessageItem({ message }) {
1247
+ const isUser = message.role === "user";
1248
+ return /* @__PURE__ */ React10.createElement(Box9, { flexDirection: "column", marginBottom: 1 }, /* @__PURE__ */ React10.createElement(Box9, null, /* @__PURE__ */ React10.createElement(Text9, { bold: true, color: isUser ? "cyan" : "green" }, isUser ? "\u{1F464} You" : "\u{1F916} Assistant"), isUser && /* @__PURE__ */ React10.createElement(Text9, { dimColor: true }, " \u2022 ", new Date(message.timestamp).toLocaleTimeString())), isUser && message.content && /* @__PURE__ */ React10.createElement(Box9, { paddingLeft: 2 }, /* @__PURE__ */ React10.createElement(Text9, { backgroundColor: "whiteBright", color: "black" }, " ", message.content, " ")), !isUser && message.metadata?.steps && message.metadata.steps.length > 0 && /* @__PURE__ */ React10.createElement(Box9, { paddingLeft: 2, marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React10.createElement(Text9, { dimColor: true, bold: true }, "\u{1F527} Agent Reasoning Trace (", message.metadata.steps.filter((s) => s.type === "action").length, " ", "tools used, ", message.metadata.steps.length, " total steps)", message.metadata.tokenUsage && ` \u2022 ${message.metadata.tokenUsage.total} tokens`), /* @__PURE__ */ React10.createElement(Text9, { dimColor: true }, "Step types: ", message.metadata.steps.map((s) => s.type).join(", ")), message.metadata.steps.map((step, idx) => {
1249
+ if (step.type === "thought") {
1250
+ return /* @__PURE__ */ React10.createElement(Box9, { key: idx, paddingLeft: 2, marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React10.createElement(Text9, { color: "blue" }, "\u{1F4AD} Thought:"), /* @__PURE__ */ React10.createElement(Text9, { dimColor: true }, ` ${step.content.slice(0, 200)}${step.content.length > 200 ? "..." : ""}`));
1251
+ }
1252
+ if (step.type === "action") {
1253
+ const toolName = step.metadata?.toolName || "unknown";
1254
+ const toolInput = step.metadata?.toolInput;
1255
+ const observationStep = message.metadata.steps[idx + 1];
1256
+ const result = observationStep?.type === "observation" ? observationStep.content : null;
1257
+ return /* @__PURE__ */ React10.createElement(Box9, { key: idx, paddingLeft: 2, marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React10.createElement(Text9, { color: "yellow" }, "\u{1F527} Action: ", toolName), toolInput && /* @__PURE__ */ React10.createElement(Text9, { dimColor: true }, ` Input: ${typeof toolInput === "string" ? toolInput : JSON.stringify(toolInput).slice(0, 100)}`), result && /* @__PURE__ */ React10.createElement(Text9, { dimColor: true }, ` Result: ${typeof result === "string" ? result.slice(0, 200) : JSON.stringify(result).slice(0, 200)}${(typeof result === "string" ? result.length : JSON.stringify(result).length) > 200 ? "..." : ""}`));
1258
+ }
1259
+ return null;
1260
+ }).filter(Boolean)), !isUser && message.content !== "..." && /* @__PURE__ */ React10.createElement(Box9, { paddingLeft: 2, marginTop: message.metadata?.steps?.length ? 1 : 0 }, message.metadata?.permissionDenied ? /* @__PURE__ */ React10.createElement(Text9, { color: "yellow" }, "\u26A0\uFE0F ", message.content) : /* @__PURE__ */ React10.createElement(Text9, null, message.content)), message.metadata?.tokenUsage && (!message.metadata.steps || message.metadata.steps.length === 0) && /* @__PURE__ */ React10.createElement(Box9, { paddingLeft: 2 }, /* @__PURE__ */ React10.createElement(Text9, { dimColor: true }, `${message.metadata.tokenUsage.total} tokens`)));
1261
+ }
1262
+
1220
1263
  // src/utils/processFileReferences.ts
1221
1264
  import * as fs2 from "fs";
1222
1265
  import * as path2 from "path";
@@ -1345,6 +1388,7 @@ function App({
1345
1388
  onPrefillConsumed
1346
1389
  }) {
1347
1390
  const messages = useCliStore((state) => state.session?.messages || []);
1391
+ const pendingMessages = useCliStore((state) => state.pendingMessages);
1348
1392
  const sessionName = useCliStore((state) => state.session?.name || "New Session");
1349
1393
  const currentModel = useCliStore((state) => state.session?.model || "claude-sonnet-4-5-20250929");
1350
1394
  const totalTokens = useCliStore((state) => state.session?.metadata.totalTokens || 0);
@@ -1354,7 +1398,7 @@ function App({
1354
1398
  const setShowConfigEditor = useCliStore((state) => state.setShowConfigEditor);
1355
1399
  const exitRequested = useCliStore((state) => state.exitRequested);
1356
1400
  const setIsThinking = useCliStore((state) => state.setIsThinking);
1357
- const handleSubmit = React10.useCallback(
1401
+ const handleSubmit = React11.useCallback(
1358
1402
  async (input) => {
1359
1403
  const trimmed = input.trim();
1360
1404
  if (!trimmed) return;
@@ -1383,7 +1427,7 @@ ${errorBlock}`;
1383
1427
  },
1384
1428
  [onMessage, onCommand, setIsThinking]
1385
1429
  );
1386
- return /* @__PURE__ */ React10.createElement(Box9, { flexDirection: "column" }, /* @__PURE__ */ React10.createElement(StatusBar, { sessionName, model: currentModel, tokenUsage: totalTokens }), showConfigEditor && config && onSaveConfig ? /* @__PURE__ */ React10.createElement(Box9, { flexDirection: "column", paddingX: 1 }, /* @__PURE__ */ React10.createElement(
1430
+ return /* @__PURE__ */ React11.createElement(Box10, { flexDirection: "column" }, showConfigEditor && config && onSaveConfig ? /* @__PURE__ */ React11.createElement(Box10, { flexDirection: "column", paddingX: 1 }, /* @__PURE__ */ React11.createElement(
1387
1431
  ConfigEditor,
1388
1432
  {
1389
1433
  config,
@@ -1391,7 +1435,7 @@ ${errorBlock}`;
1391
1435
  onSave: onSaveConfig,
1392
1436
  onClose: () => setShowConfigEditor(false)
1393
1437
  }
1394
- )) : permissionPrompt ? /* @__PURE__ */ React10.createElement(Box9, { flexDirection: "column", paddingX: 1 }, /* @__PURE__ */ React10.createElement(
1438
+ )) : permissionPrompt ? /* @__PURE__ */ React11.createElement(Box10, { flexDirection: "column", paddingX: 1 }, /* @__PURE__ */ React11.createElement(
1395
1439
  PermissionPrompt,
1396
1440
  {
1397
1441
  toolName: permissionPrompt.toolName,
@@ -1400,7 +1444,7 @@ ${errorBlock}`;
1400
1444
  canBeTrusted: permissionPrompt.canBeTrusted,
1401
1445
  onResponse: onPermissionResponse
1402
1446
  }
1403
- )) : /* @__PURE__ */ React10.createElement(React10.Fragment, null, /* @__PURE__ */ React10.createElement(Box9, { flexDirection: "column" }, messages.map((message, index) => /* @__PURE__ */ React10.createElement(Box9, { key: `${message.timestamp}-${message.role}-${index}`, flexDirection: "column", paddingX: 1 }, /* @__PURE__ */ React10.createElement(MessageItem, { message })))), /* @__PURE__ */ React10.createElement(AgentThinking, null), exitRequested && /* @__PURE__ */ React10.createElement(Box9, { paddingX: 1, marginBottom: 1 }, /* @__PURE__ */ React10.createElement(Text9, { color: "yellow", bold: true }, "Press Ctrl+C again to exit")), /* @__PURE__ */ React10.createElement(Box9, { borderStyle: "single", borderColor: "cyan", paddingX: 1 }, /* @__PURE__ */ React10.createElement(
1447
+ )) : /* @__PURE__ */ React11.createElement(React11.Fragment, null, /* @__PURE__ */ React11.createElement(Static, { items: messages }, (message, index) => /* @__PURE__ */ React11.createElement(Box10, { key: `${message.timestamp}-${message.role}-${index}`, flexDirection: "column", paddingX: 1 }, /* @__PURE__ */ React11.createElement(MessageItem, { message }))), /* @__PURE__ */ React11.createElement(Box10, { flexDirection: "column" }, pendingMessages.map((message, index) => /* @__PURE__ */ React11.createElement(Box10, { key: `pending-${message.timestamp}-${index}`, flexDirection: "column", paddingX: 1 }, /* @__PURE__ */ React11.createElement(MessageItem, { message })))), /* @__PURE__ */ React11.createElement(AgentThinking, null), exitRequested && /* @__PURE__ */ React11.createElement(Box10, { paddingX: 1, marginBottom: 1 }, /* @__PURE__ */ React11.createElement(Text10, { color: "yellow", bold: true }, "Press Ctrl+C again to exit")), /* @__PURE__ */ React11.createElement(Box10, { borderStyle: "single", borderColor: "cyan", paddingX: 1 }, /* @__PURE__ */ React11.createElement(
1404
1448
  InputPrompt,
1405
1449
  {
1406
1450
  onSubmit: handleSubmit,
@@ -1410,40 +1454,24 @@ ${errorBlock}`;
1410
1454
  prefillInput,
1411
1455
  onPrefillConsumed
1412
1456
  }
1413
- ))));
1414
- }
1415
- function MessageItem({ message }) {
1416
- const isUser = message.role === "user";
1417
- return /* @__PURE__ */ React10.createElement(Box9, { flexDirection: "column", marginBottom: 1 }, /* @__PURE__ */ React10.createElement(Box9, null, /* @__PURE__ */ React10.createElement(Text9, { bold: true, color: isUser ? "cyan" : "green" }, isUser ? "\u{1F464} You" : "\u{1F916} Assistant"), /* @__PURE__ */ React10.createElement(Text9, { dimColor: true }, " \u2022 ", new Date(message.timestamp).toLocaleTimeString())), isUser && message.content && /* @__PURE__ */ React10.createElement(Box9, { paddingLeft: 2 }, /* @__PURE__ */ React10.createElement(Text9, { backgroundColor: "whiteBright", color: "black" }, " ", message.content, " ")), !isUser && message.metadata?.steps && message.metadata.steps.length > 0 && /* @__PURE__ */ React10.createElement(Box9, { paddingLeft: 2, marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React10.createElement(Text9, { dimColor: true, bold: true }, "\u{1F527} Agent Reasoning Trace (", message.metadata.steps.filter((s) => s.type === "action").length, " ", "tools used, ", message.metadata.steps.length, " total steps)", message.metadata.tokenUsage && ` \u2022 ${message.metadata.tokenUsage.total} tokens`), /* @__PURE__ */ React10.createElement(Text9, { dimColor: true }, "Step types: ", message.metadata.steps.map((s) => s.type).join(", ")), message.metadata.steps.map((step, idx) => {
1418
- if (step.type === "thought") {
1419
- return /* @__PURE__ */ React10.createElement(Box9, { key: idx, paddingLeft: 2, marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React10.createElement(Text9, { color: "blue" }, "\u{1F4AD} Thought:"), /* @__PURE__ */ React10.createElement(Text9, { dimColor: true }, ` ${step.content.slice(0, 200)}${step.content.length > 200 ? "..." : ""}`));
1420
- }
1421
- if (step.type === "action") {
1422
- const toolName = step.metadata?.toolName || "unknown";
1423
- const toolInput = step.metadata?.toolInput;
1424
- const observationStep = message.metadata.steps[idx + 1];
1425
- const result = observationStep?.type === "observation" ? observationStep.content : null;
1426
- return /* @__PURE__ */ React10.createElement(Box9, { key: idx, paddingLeft: 2, marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React10.createElement(Text9, { color: "yellow" }, "\u{1F527} Action: ", toolName), toolInput && /* @__PURE__ */ React10.createElement(Text9, { dimColor: true }, ` Input: ${typeof toolInput === "string" ? toolInput : JSON.stringify(toolInput).slice(0, 100)}`), result && /* @__PURE__ */ React10.createElement(Text9, { dimColor: true }, ` Result: ${typeof result === "string" ? result.slice(0, 200) : JSON.stringify(result).slice(0, 200)}${(typeof result === "string" ? result.length : JSON.stringify(result).length) > 200 ? "..." : ""}`));
1427
- }
1428
- return null;
1429
- }).filter(Boolean)), !isUser && message.content !== "..." && /* @__PURE__ */ React10.createElement(Box9, { paddingLeft: 2, marginTop: message.metadata?.steps?.length ? 1 : 0 }, message.metadata?.permissionDenied ? /* @__PURE__ */ React10.createElement(Text9, { color: "yellow" }, "\u26A0\uFE0F ", message.content) : /* @__PURE__ */ React10.createElement(Text9, null, message.content)), message.metadata?.tokenUsage && (!message.metadata.steps || message.metadata.steps.length === 0) && /* @__PURE__ */ React10.createElement(Box9, { paddingLeft: 2 }, /* @__PURE__ */ React10.createElement(Text9, { dimColor: true }, `${message.metadata.tokenUsage.total} tokens`)));
1457
+ )), /* @__PURE__ */ React11.createElement(StatusBar, { sessionName, model: currentModel, tokenUsage: totalTokens })));
1430
1458
  }
1431
1459
 
1432
1460
  // src/components/MessageList.tsx
1433
- import React11 from "react";
1434
- import { Box as Box10, Text as Text10 } from "ink";
1461
+ import React12 from "react";
1462
+ import { Box as Box11, Text as Text11 } from "ink";
1435
1463
  function stripThinkingTags(content) {
1436
1464
  return content.replace(/<think>[\s\S]*?<\/think>/g, "").trim();
1437
1465
  }
1438
- var MessageList = React11.memo(
1466
+ var MessageList = React12.memo(
1439
1467
  function MessageList2({ messages }) {
1440
1468
  if (messages.length === 0) {
1441
- return /* @__PURE__ */ React11.createElement(Box10, { paddingY: 1 }, /* @__PURE__ */ React11.createElement(Text10, { dimColor: true }, "No messages yet. Type a message to start!"));
1469
+ return /* @__PURE__ */ React12.createElement(Box11, { paddingY: 1 }, /* @__PURE__ */ React12.createElement(Text11, { dimColor: true }, "No messages yet. Type a message to start!"));
1442
1470
  }
1443
- return /* @__PURE__ */ React11.createElement(Box10, { flexDirection: "column", gap: 1, paddingY: 1 }, messages.map((message, index) => /* @__PURE__ */ React11.createElement(Box10, { key: index, flexDirection: "column", marginBottom: 1 }, /* @__PURE__ */ React11.createElement(Box10, null, /* @__PURE__ */ React11.createElement(Text10, { bold: true, color: message.role === "user" ? "cyan" : "green" }, message.role === "user" ? "\u{1F464} You" : "\u{1F916} Assistant"), /* @__PURE__ */ React11.createElement(Text10, { dimColor: true }, " \u2022 ", new Date(message.timestamp).toLocaleTimeString())), /* @__PURE__ */ React11.createElement(Box10, { paddingLeft: 2 }, message.metadata?.permissionDenied ? /* @__PURE__ */ React11.createElement(Text10, { color: "yellow" }, "\u26A0\uFE0F ", stripThinkingTags(message.content)) : /* @__PURE__ */ React11.createElement(Text10, null, stripThinkingTags(message.content))), message.metadata?.steps && message.metadata.steps.length > 0 && /* @__PURE__ */ React11.createElement(Box10, { paddingLeft: 2, marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React11.createElement(Text10, { dimColor: true, bold: true }, "\u{1F527} Agent Reasoning Trace (", message.metadata.steps.filter((s) => s.type === "action").length, " tools used,", " ", message.metadata.steps.length, " total steps)", message.metadata.tokenUsage && ` \u2022 ${message.metadata.tokenUsage.total} tokens`), /* @__PURE__ */ React11.createElement(Text10, { dimColor: true }, "Step types: ", message.metadata.steps.map((s) => s.type).join(", ")), message.metadata.steps.map((step, idx) => {
1471
+ return /* @__PURE__ */ React12.createElement(Box11, { flexDirection: "column", gap: 1, paddingY: 1 }, messages.map((message, index) => /* @__PURE__ */ React12.createElement(Box11, { key: index, flexDirection: "column", marginBottom: 1 }, /* @__PURE__ */ React12.createElement(Box11, null, /* @__PURE__ */ React12.createElement(Text11, { bold: true, color: message.role === "user" ? "cyan" : "green" }, message.role === "user" ? "\u{1F464} You" : "\u{1F916} Assistant"), /* @__PURE__ */ React12.createElement(Text11, { dimColor: true }, " \u2022 ", new Date(message.timestamp).toLocaleTimeString())), /* @__PURE__ */ React12.createElement(Box11, { paddingLeft: 2 }, message.metadata?.permissionDenied ? /* @__PURE__ */ React12.createElement(Text11, { color: "yellow" }, "\u26A0\uFE0F ", stripThinkingTags(message.content)) : /* @__PURE__ */ React12.createElement(Text11, null, stripThinkingTags(message.content))), message.metadata?.steps && message.metadata.steps.length > 0 && /* @__PURE__ */ React12.createElement(Box11, { paddingLeft: 2, marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React12.createElement(Text11, { dimColor: true, bold: true }, "\u{1F527} Agent Reasoning Trace (", message.metadata.steps.filter((s) => s.type === "action").length, " tools used,", " ", message.metadata.steps.length, " total steps)", message.metadata.tokenUsage && ` \u2022 ${message.metadata.tokenUsage.total} tokens`), /* @__PURE__ */ React12.createElement(Text11, { dimColor: true }, "Step types: ", message.metadata.steps.map((s) => s.type).join(", ")), message.metadata.steps.map((step, idx) => {
1444
1472
  if (step.type === "thought") {
1445
- return /* @__PURE__ */ React11.createElement(Box10, { key: idx, paddingLeft: 2, marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React11.createElement(Text10, { color: "blue" }, "\u{1F4AD} Thought:"), /* @__PURE__ */ React11.createElement(
1446
- Text10,
1473
+ return /* @__PURE__ */ React12.createElement(Box11, { key: idx, paddingLeft: 2, marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React12.createElement(Text11, { color: "blue" }, "\u{1F4AD} Thought:"), /* @__PURE__ */ React12.createElement(
1474
+ Text11,
1447
1475
  {
1448
1476
  dimColor: true
1449
1477
  },
@@ -1455,10 +1483,10 @@ var MessageList = React11.memo(
1455
1483
  const toolInput = step.metadata?.toolInput;
1456
1484
  const observationStep = message.metadata.steps[idx + 1];
1457
1485
  const result = observationStep?.type === "observation" ? observationStep.content : null;
1458
- return /* @__PURE__ */ React11.createElement(Box10, { key: idx, paddingLeft: 2, marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React11.createElement(Text10, { color: "yellow" }, "\u{1F527} Action: ", toolName), toolInput && /* @__PURE__ */ React11.createElement(Text10, { dimColor: true }, ` Input: ${typeof toolInput === "string" ? toolInput : JSON.stringify(toolInput).slice(0, 100)}`), result && /* @__PURE__ */ React11.createElement(Text10, { dimColor: true }, ` Result: ${typeof result === "string" ? result.slice(0, 200) : JSON.stringify(result).slice(0, 200)}${(typeof result === "string" ? result.length : JSON.stringify(result).length) > 200 ? "..." : ""}`));
1486
+ return /* @__PURE__ */ React12.createElement(Box11, { key: idx, paddingLeft: 2, marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React12.createElement(Text11, { color: "yellow" }, "\u{1F527} Action: ", toolName), toolInput && /* @__PURE__ */ React12.createElement(Text11, { dimColor: true }, ` Input: ${typeof toolInput === "string" ? toolInput : JSON.stringify(toolInput).slice(0, 100)}`), result && /* @__PURE__ */ React12.createElement(Text11, { dimColor: true }, ` Result: ${typeof result === "string" ? result.slice(0, 200) : JSON.stringify(result).slice(0, 200)}${(typeof result === "string" ? result.length : JSON.stringify(result).length) > 200 ? "..." : ""}`));
1459
1487
  }
1460
1488
  return null;
1461
- }).filter(Boolean)), message.metadata?.tokenUsage && (!message.metadata.steps || message.metadata.steps.length === 0) && /* @__PURE__ */ React11.createElement(Box10, { paddingLeft: 2 }, /* @__PURE__ */ React11.createElement(Text10, { dimColor: true }, `${message.metadata.tokenUsage.total} tokens`)))));
1489
+ }).filter(Boolean)), message.metadata?.tokenUsage && (!message.metadata.steps || message.metadata.steps.length === 0) && /* @__PURE__ */ React12.createElement(Box11, { paddingLeft: 2 }, /* @__PURE__ */ React12.createElement(Text11, { dimColor: true }, `${message.metadata.tokenUsage.total} tokens`)))));
1462
1490
  },
1463
1491
  (prevProps, nextProps) => {
1464
1492
  if (prevProps.messages.length !== nextProps.messages.length) {
@@ -1469,8 +1497,8 @@ var MessageList = React11.memo(
1469
1497
  );
1470
1498
 
1471
1499
  // src/components/TrustLocationSelector.tsx
1472
- import React12 from "react";
1473
- import { Box as Box11, Text as Text11 } from "ink";
1500
+ import React13 from "react";
1501
+ import { Box as Box12, Text as Text12 } from "ink";
1474
1502
  import SelectInput2 from "ink-select-input";
1475
1503
  function TrustLocationSelector({ inProject, onSelect, onCancel }) {
1476
1504
  const items = [];
@@ -1491,19 +1519,19 @@ function TrustLocationSelector({ inProject, onSelect, onCancel }) {
1491
1519
  const handleSelect = (item) => {
1492
1520
  onSelect(item.value);
1493
1521
  };
1494
- return /* @__PURE__ */ React12.createElement(Box11, { flexDirection: "column", marginY: 1 }, /* @__PURE__ */ React12.createElement(Box11, { marginBottom: 1 }, /* @__PURE__ */ React12.createElement(Text11, { bold: true }, "Where should this rule be saved?")), /* @__PURE__ */ React12.createElement(
1522
+ return /* @__PURE__ */ React13.createElement(Box12, { flexDirection: "column", marginY: 1 }, /* @__PURE__ */ React13.createElement(Box12, { marginBottom: 1 }, /* @__PURE__ */ React13.createElement(Text12, { bold: true }, "Where should this rule be saved?")), /* @__PURE__ */ React13.createElement(
1495
1523
  SelectInput2,
1496
1524
  {
1497
1525
  items,
1498
1526
  onSelect: handleSelect,
1499
- itemComponent: ({ isSelected, label }) => /* @__PURE__ */ React12.createElement(Box11, null, /* @__PURE__ */ React12.createElement(Text11, { color: isSelected ? "cyan" : void 0 }, isSelected ? "\u276F " : " ", label))
1527
+ itemComponent: ({ isSelected, label }) => /* @__PURE__ */ React13.createElement(Box12, null, /* @__PURE__ */ React13.createElement(Text12, { color: isSelected ? "cyan" : void 0 }, isSelected ? "\u276F " : " ", label))
1500
1528
  }
1501
- ), /* @__PURE__ */ React12.createElement(Box11, { marginTop: 1 }, /* @__PURE__ */ React12.createElement(Text11, { dimColor: true }, "Use \u2191\u2193 arrows to navigate, Enter to select, Ctrl+C to cancel")));
1529
+ ), /* @__PURE__ */ React13.createElement(Box12, { marginTop: 1 }, /* @__PURE__ */ React13.createElement(Text12, { dimColor: true }, "Use \u2191\u2193 arrows to navigate, Enter to select, Ctrl+C to cancel")));
1502
1530
  }
1503
1531
 
1504
1532
  // src/components/RewindSelector.tsx
1505
- import React13, { useState as useState4 } from "react";
1506
- import { Box as Box12, Text as Text12, useInput as useInput4 } from "ink";
1533
+ import React14, { useState as useState4 } from "react";
1534
+ import { Box as Box13, Text as Text13, useInput as useInput4 } from "ink";
1507
1535
  import SelectInput3 from "ink-select-input";
1508
1536
  function RewindSelector({ messages, onSelect, onCancel }) {
1509
1537
  const [step, setStep] = useState4("selection");
@@ -1545,14 +1573,14 @@ function RewindSelector({ messages, onSelect, onCancel }) {
1545
1573
  return sum2 + (msg.metadata?.tokenUsage?.total || 0);
1546
1574
  }, 0);
1547
1575
  if (step === "selection") {
1548
- return /* @__PURE__ */ React13.createElement(Box12, { flexDirection: "column", marginY: 1 }, /* @__PURE__ */ React13.createElement(Box12, { marginBottom: 1 }, /* @__PURE__ */ React13.createElement(Text12, { bold: true }, "Select a point to rewind to:")), /* @__PURE__ */ React13.createElement(
1576
+ return /* @__PURE__ */ React14.createElement(Box13, { flexDirection: "column", marginY: 1 }, /* @__PURE__ */ React14.createElement(Box13, { marginBottom: 1 }, /* @__PURE__ */ React14.createElement(Text13, { bold: true }, "Select a point to rewind to:")), /* @__PURE__ */ React14.createElement(
1549
1577
  SelectInput3,
1550
1578
  {
1551
1579
  items,
1552
1580
  onSelect: handleSelectionSelect,
1553
- itemComponent: ({ isSelected, label }) => /* @__PURE__ */ React13.createElement(Box12, null, /* @__PURE__ */ React13.createElement(Text12, { color: isSelected ? "cyan" : void 0 }, isSelected ? "\u276F " : " ", label))
1581
+ itemComponent: ({ isSelected, label }) => /* @__PURE__ */ React14.createElement(Box13, null, /* @__PURE__ */ React14.createElement(Text13, { color: isSelected ? "cyan" : void 0 }, isSelected ? "\u276F " : " ", label))
1554
1582
  }
1555
- ), /* @__PURE__ */ React13.createElement(Box12, { marginTop: 1 }, /* @__PURE__ */ React13.createElement(Text12, { dimColor: true }, "Use \u2191\u2193 arrows to navigate, Enter to select, Esc to cancel")));
1583
+ ), /* @__PURE__ */ React14.createElement(Box13, { marginTop: 1 }, /* @__PURE__ */ React14.createElement(Text13, { dimColor: true }, "Use \u2191\u2193 arrows to navigate, Enter to select, Esc to cancel")));
1556
1584
  }
1557
1585
  const confirmationItems = [
1558
1586
  { label: "Yes, rewind to this point", value: "confirm" },
@@ -1560,19 +1588,19 @@ function RewindSelector({ messages, onSelect, onCancel }) {
1560
1588
  ];
1561
1589
  const selectedMessage = selectedMessageIndex !== null && selectedMessageIndex >= 0 && selectedMessageIndex < messages.length ? messages[selectedMessageIndex] : null;
1562
1590
  const selectedPreview = selectedMessage ? selectedMessage.content.length > 50 ? selectedMessage.content.substring(0, 50) + "..." : selectedMessage.content : "";
1563
- return /* @__PURE__ */ React13.createElement(Box12, { flexDirection: "column", marginY: 1 }, /* @__PURE__ */ React13.createElement(Box12, { marginBottom: 1, flexDirection: "column" }, /* @__PURE__ */ React13.createElement(Text12, { bold: true }, "Confirm rewind operation:"), /* @__PURE__ */ React13.createElement(Text12, { dimColor: true }, "Message: ", selectedPreview), /* @__PURE__ */ React13.createElement(Text12, { color: "yellow" }, "This will remove ", messagesToRemove.length, " message(s) (", tokensToRemove.toLocaleString(), " tokens)"), /* @__PURE__ */ React13.createElement(Text12, { color: "cyan" }, "The selected message will be placed in your input for editing.")), /* @__PURE__ */ React13.createElement(
1591
+ return /* @__PURE__ */ React14.createElement(Box13, { flexDirection: "column", marginY: 1 }, /* @__PURE__ */ React14.createElement(Box13, { marginBottom: 1, flexDirection: "column" }, /* @__PURE__ */ React14.createElement(Text13, { bold: true }, "Confirm rewind operation:"), /* @__PURE__ */ React14.createElement(Text13, { dimColor: true }, "Message: ", selectedPreview), /* @__PURE__ */ React14.createElement(Text13, { color: "yellow" }, "This will remove ", messagesToRemove.length, " message(s) (", tokensToRemove.toLocaleString(), " tokens)"), /* @__PURE__ */ React14.createElement(Text13, { color: "cyan" }, "The selected message will be placed in your input for editing.")), /* @__PURE__ */ React14.createElement(
1564
1592
  SelectInput3,
1565
1593
  {
1566
1594
  items: confirmationItems,
1567
1595
  onSelect: handleConfirmationSelect,
1568
- itemComponent: ({ isSelected, label }) => /* @__PURE__ */ React13.createElement(Box12, null, /* @__PURE__ */ React13.createElement(Text12, { color: isSelected ? "cyan" : void 0 }, isSelected ? "\u276F " : " ", label))
1596
+ itemComponent: ({ isSelected, label }) => /* @__PURE__ */ React14.createElement(Box13, null, /* @__PURE__ */ React14.createElement(Text13, { color: isSelected ? "cyan" : void 0 }, isSelected ? "\u276F " : " ", label))
1569
1597
  }
1570
- ), /* @__PURE__ */ React13.createElement(Box12, { marginTop: 1 }, /* @__PURE__ */ React13.createElement(Text12, { dimColor: true }, "Use \u2191\u2193 arrows to navigate, Enter to select, Esc to go back")));
1598
+ ), /* @__PURE__ */ React14.createElement(Box13, { marginTop: 1 }, /* @__PURE__ */ React14.createElement(Text13, { dimColor: true }, "Use \u2191\u2193 arrows to navigate, Enter to select, Esc to go back")));
1571
1599
  }
1572
1600
 
1573
1601
  // src/components/SessionSelector.tsx
1574
- import React14, { useState as useState5 } from "react";
1575
- import { Box as Box13, Text as Text13, useInput as useInput5 } from "ink";
1602
+ import React15, { useState as useState5 } from "react";
1603
+ import { Box as Box14, Text as Text14, useInput as useInput5 } from "ink";
1576
1604
  import SelectInput4 from "ink-select-input";
1577
1605
  function SessionSelector({ sessions, currentSession, onSelect, onCancel }) {
1578
1606
  const [step, setStep] = useState5("selection");
@@ -1610,32 +1638,32 @@ function SessionSelector({ sessions, currentSession, onSelect, onCancel }) {
1610
1638
  }
1611
1639
  };
1612
1640
  if (step === "selection") {
1613
- return /* @__PURE__ */ React14.createElement(Box13, { flexDirection: "column", marginY: 1 }, /* @__PURE__ */ React14.createElement(Box13, { marginBottom: 1 }, /* @__PURE__ */ React14.createElement(Text13, { bold: true }, "Select a session to resume:")), /* @__PURE__ */ React14.createElement(
1641
+ return /* @__PURE__ */ React15.createElement(Box14, { flexDirection: "column", marginY: 1 }, /* @__PURE__ */ React15.createElement(Box14, { marginBottom: 1 }, /* @__PURE__ */ React15.createElement(Text14, { bold: true }, "Select a session to resume:")), /* @__PURE__ */ React15.createElement(
1614
1642
  SelectInput4,
1615
1643
  {
1616
1644
  items,
1617
1645
  onSelect: handleSelectionSelect,
1618
- itemComponent: ({ isSelected, label }) => /* @__PURE__ */ React14.createElement(Box13, null, /* @__PURE__ */ React14.createElement(Text13, { color: isSelected ? "cyan" : void 0 }, isSelected ? "\u276F " : " ", label))
1646
+ itemComponent: ({ isSelected, label }) => /* @__PURE__ */ React15.createElement(Box14, null, /* @__PURE__ */ React15.createElement(Text14, { color: isSelected ? "cyan" : void 0 }, isSelected ? "\u276F " : " ", label))
1619
1647
  }
1620
- ), /* @__PURE__ */ React14.createElement(Box13, { marginTop: 1 }, /* @__PURE__ */ React14.createElement(Text13, { dimColor: true }, "Use \u2191\u2193 arrows to navigate, Enter to select, Esc to cancel")));
1648
+ ), /* @__PURE__ */ React15.createElement(Box14, { marginTop: 1 }, /* @__PURE__ */ React15.createElement(Text14, { dimColor: true }, "Use \u2191\u2193 arrows to navigate, Enter to select, Esc to cancel")));
1621
1649
  }
1622
1650
  const confirmationItems = [
1623
1651
  { label: "Yes, resume this session", value: "confirm" },
1624
1652
  { label: "No, go back to selection", value: "cancel" }
1625
1653
  ];
1626
- return /* @__PURE__ */ React14.createElement(Box13, { flexDirection: "column", marginY: 1 }, /* @__PURE__ */ React14.createElement(Box13, { marginBottom: 1, flexDirection: "column" }, /* @__PURE__ */ React14.createElement(Text13, { bold: true }, 'Resume session: "', selectedSession?.name, '"'), /* @__PURE__ */ React14.createElement(Text13, { dimColor: true }, selectedSession?.messages.length, " messages | ", selectedSession?.model, " |", " ", selectedSession?.metadata?.totalTokens?.toLocaleString() ?? 0, " tokens"), hasUnsavedWork && /* @__PURE__ */ React14.createElement(Text13, { color: "yellow" }, "Warning: Your current session has unsaved messages. Use /save first if needed.")), /* @__PURE__ */ React14.createElement(
1654
+ return /* @__PURE__ */ React15.createElement(Box14, { flexDirection: "column", marginY: 1 }, /* @__PURE__ */ React15.createElement(Box14, { marginBottom: 1, flexDirection: "column" }, /* @__PURE__ */ React15.createElement(Text14, { bold: true }, 'Resume session: "', selectedSession?.name, '"'), /* @__PURE__ */ React15.createElement(Text14, { dimColor: true }, selectedSession?.messages.length, " messages | ", selectedSession?.model, " |", " ", selectedSession?.metadata?.totalTokens?.toLocaleString() ?? 0, " tokens"), hasUnsavedWork && /* @__PURE__ */ React15.createElement(Text14, { color: "yellow" }, "Warning: Your current session has unsaved messages. Use /save first if needed.")), /* @__PURE__ */ React15.createElement(
1627
1655
  SelectInput4,
1628
1656
  {
1629
1657
  items: confirmationItems,
1630
1658
  onSelect: handleConfirmationSelect,
1631
- itemComponent: ({ isSelected, label }) => /* @__PURE__ */ React14.createElement(Box13, null, /* @__PURE__ */ React14.createElement(Text13, { color: isSelected ? "cyan" : void 0 }, isSelected ? "\u276F " : " ", label))
1659
+ itemComponent: ({ isSelected, label }) => /* @__PURE__ */ React15.createElement(Box14, null, /* @__PURE__ */ React15.createElement(Text14, { color: isSelected ? "cyan" : void 0 }, isSelected ? "\u276F " : " ", label))
1632
1660
  }
1633
- ), /* @__PURE__ */ React14.createElement(Box13, { marginTop: 1 }, /* @__PURE__ */ React14.createElement(Text13, { dimColor: true }, "Use \u2191\u2193 arrows to navigate, Enter to select, Esc to go back")));
1661
+ ), /* @__PURE__ */ React15.createElement(Box14, { marginTop: 1 }, /* @__PURE__ */ React15.createElement(Text14, { dimColor: true }, "Use \u2191\u2193 arrows to navigate, Enter to select, Esc to go back")));
1634
1662
  }
1635
1663
 
1636
1664
  // src/components/LoginFlow.tsx
1637
- import React15, { useState as useState6, useEffect as useEffect2 } from "react";
1638
- import { Box as Box14, Text as Text14 } from "ink";
1665
+ import React16, { useState as useState6, useEffect as useEffect2 } from "react";
1666
+ import { Box as Box15, Text as Text15 } from "ink";
1639
1667
  import Spinner2 from "ink-spinner";
1640
1668
  import jwt from "jsonwebtoken";
1641
1669
  import open from "open";
@@ -1798,15 +1826,15 @@ function LoginFlow({ apiUrl = "http://localhost:3000", configStore, onSuccess, o
1798
1826
  }
1799
1827
  }, [deviceFlow, status]);
1800
1828
  if (status === "initiating") {
1801
- return /* @__PURE__ */ React15.createElement(Box14, { flexDirection: "column", padding: 1 }, /* @__PURE__ */ React15.createElement(Box14, null, /* @__PURE__ */ React15.createElement(Text14, { color: "cyan" }, /* @__PURE__ */ React15.createElement(Spinner2, { type: "dots" }), " Initiating device authorization...")));
1829
+ return /* @__PURE__ */ React16.createElement(Box15, { flexDirection: "column", padding: 1 }, /* @__PURE__ */ React16.createElement(Box15, null, /* @__PURE__ */ React16.createElement(Text15, { color: "cyan" }, /* @__PURE__ */ React16.createElement(Spinner2, { type: "dots" }), " Initiating device authorization...")));
1802
1830
  }
1803
1831
  if (status === "error") {
1804
- return /* @__PURE__ */ React15.createElement(Box14, { flexDirection: "column", padding: 1 }, /* @__PURE__ */ React15.createElement(Box14, { marginBottom: 1 }, /* @__PURE__ */ React15.createElement(Text14, { color: "red", bold: true }, "\u2716 Authentication Failed")), /* @__PURE__ */ React15.createElement(Box14, null, /* @__PURE__ */ React15.createElement(Text14, { color: "red" }, error)));
1832
+ return /* @__PURE__ */ React16.createElement(Box15, { flexDirection: "column", padding: 1 }, /* @__PURE__ */ React16.createElement(Box15, { marginBottom: 1 }, /* @__PURE__ */ React16.createElement(Text15, { color: "red", bold: true }, "\u2716 Authentication Failed")), /* @__PURE__ */ React16.createElement(Box15, null, /* @__PURE__ */ React16.createElement(Text15, { color: "red" }, error)));
1805
1833
  }
1806
1834
  if (status === "success") {
1807
- return /* @__PURE__ */ React15.createElement(Box14, { flexDirection: "column", padding: 1 }, /* @__PURE__ */ React15.createElement(Box14, { marginBottom: 1 }, /* @__PURE__ */ React15.createElement(Text14, { color: "green", bold: true }, "\u2714 Successfully authenticated!")), /* @__PURE__ */ React15.createElement(Box14, null, /* @__PURE__ */ React15.createElement(Text14, { dimColor: true }, "You can now use B4M CLI with your account.")));
1835
+ return /* @__PURE__ */ React16.createElement(Box15, { flexDirection: "column", padding: 1 }, /* @__PURE__ */ React16.createElement(Box15, { marginBottom: 1 }, /* @__PURE__ */ React16.createElement(Text15, { color: "green", bold: true }, "\u2714 Successfully authenticated!")), /* @__PURE__ */ React16.createElement(Box15, null, /* @__PURE__ */ React16.createElement(Text15, { dimColor: true }, "You can now use B4M CLI with your account.")));
1808
1836
  }
1809
- return /* @__PURE__ */ React15.createElement(Box14, { flexDirection: "column", padding: 1, borderStyle: "round", borderColor: "cyan" }, /* @__PURE__ */ React15.createElement(Box14, { marginBottom: 1 }, /* @__PURE__ */ React15.createElement(Text14, { color: "cyan", bold: true }, "\u{1F510} Device Authorization")), /* @__PURE__ */ React15.createElement(Box14, { marginBottom: 1 }, /* @__PURE__ */ React15.createElement(Text14, null, "Opening browser automatically... If it doesn't open, please visit:")), /* @__PURE__ */ React15.createElement(Box14, { marginBottom: 1, paddingLeft: 2 }, /* @__PURE__ */ React15.createElement(Text14, { color: "blue", bold: true }, deviceFlow?.verification_uri)), /* @__PURE__ */ React15.createElement(Box14, { marginBottom: 1 }, /* @__PURE__ */ React15.createElement(Text14, null, "And enter this code when prompted:")), /* @__PURE__ */ React15.createElement(Box14, { marginBottom: 1, paddingLeft: 2 }, /* @__PURE__ */ React15.createElement(Text14, { color: "yellow", bold: true }, deviceFlow?.user_code)), /* @__PURE__ */ React15.createElement(Box14, { marginTop: 1 }, /* @__PURE__ */ React15.createElement(Text14, { color: "cyan" }, /* @__PURE__ */ React15.createElement(Spinner2, { type: "dots" }), " ", statusMessage)), /* @__PURE__ */ React15.createElement(Box14, { marginTop: 1 }, /* @__PURE__ */ React15.createElement(Text14, { dimColor: true }, "Expires in ", deviceFlow ? Math.floor(deviceFlow.expires_in / 60) : 0, " minutes")));
1837
+ return /* @__PURE__ */ React16.createElement(Box15, { flexDirection: "column", padding: 1, borderStyle: "round", borderColor: "cyan" }, /* @__PURE__ */ React16.createElement(Box15, { marginBottom: 1 }, /* @__PURE__ */ React16.createElement(Text15, { color: "cyan", bold: true }, "\u{1F510} Device Authorization")), /* @__PURE__ */ React16.createElement(Box15, { marginBottom: 1 }, /* @__PURE__ */ React16.createElement(Text15, null, "Opening browser automatically... If it doesn't open, please visit:")), /* @__PURE__ */ React16.createElement(Box15, { marginBottom: 1, paddingLeft: 2 }, /* @__PURE__ */ React16.createElement(Text15, { color: "blue", bold: true }, deviceFlow?.verification_uri)), /* @__PURE__ */ React16.createElement(Box15, { marginBottom: 1 }, /* @__PURE__ */ React16.createElement(Text15, null, "And enter this code when prompted:")), /* @__PURE__ */ React16.createElement(Box15, { marginBottom: 1, paddingLeft: 2 }, /* @__PURE__ */ React16.createElement(Text15, { color: "yellow", bold: true }, deviceFlow?.user_code)), /* @__PURE__ */ React16.createElement(Box15, { marginTop: 1 }, /* @__PURE__ */ React16.createElement(Text15, { color: "cyan" }, /* @__PURE__ */ React16.createElement(Spinner2, { type: "dots" }), " ", statusMessage)), /* @__PURE__ */ React16.createElement(Box15, { marginTop: 1 }, /* @__PURE__ */ React16.createElement(Text15, { dimColor: true }, "Expires in ", deviceFlow ? Math.floor(deviceFlow.expires_in / 60) : 0, " minutes")));
1810
1838
  }
1811
1839
 
1812
1840
  // src/storage/SessionStore.ts
@@ -9657,6 +9685,7 @@ var Logger2 = class _Logger {
9657
9685
  }
9658
9686
  };
9659
9687
  var logger = Logger2.getInstance();
9688
+ logger.setVerbose(process.env.B4M_VERBOSE === "1");
9660
9689
 
9661
9690
  // src/llm/ServerToolExecutor.ts
9662
9691
  var ServerToolExecutor = class {
@@ -11085,7 +11114,7 @@ import { isAxiosError as isAxiosError2 } from "axios";
11085
11114
  // package.json
11086
11115
  var package_default = {
11087
11116
  name: "@bike4mind/cli",
11088
- version: "0.2.10-dowgrade-mcp-sdk.17228+eeed70576",
11117
+ version: "0.2.10-fix-b4m-cli-flicker.17235+479bb7772",
11089
11118
  type: "module",
11090
11119
  description: "Interactive CLI tool for Bike4Mind with ReAct agents",
11091
11120
  license: "UNLICENSED",
@@ -11188,10 +11217,10 @@ var package_default = {
11188
11217
  },
11189
11218
  devDependencies: {
11190
11219
  "@bike4mind/agents": "0.1.0",
11191
- "@bike4mind/common": "2.39.1-dowgrade-mcp-sdk.17228+eeed70576",
11192
- "@bike4mind/mcp": "1.20.4-dowgrade-mcp-sdk.17228+eeed70576",
11193
- "@bike4mind/services": "2.34.2-dowgrade-mcp-sdk.17228+eeed70576",
11194
- "@bike4mind/utils": "2.1.4-dowgrade-mcp-sdk.17228+eeed70576",
11220
+ "@bike4mind/common": "2.39.1-fix-b4m-cli-flicker.17235+479bb7772",
11221
+ "@bike4mind/mcp": "1.20.4-fix-b4m-cli-flicker.17235+479bb7772",
11222
+ "@bike4mind/services": "2.34.2-fix-b4m-cli-flicker.17235+479bb7772",
11223
+ "@bike4mind/utils": "2.1.4-fix-b4m-cli-flicker.17235+479bb7772",
11195
11224
  "@types/better-sqlite3": "^7.6.13",
11196
11225
  "@types/diff": "^5.0.9",
11197
11226
  "@types/jsonwebtoken": "^9.0.4",
@@ -11204,7 +11233,7 @@ var package_default = {
11204
11233
  typescript: "^5.9.3",
11205
11234
  vitest: "^3.2.4"
11206
11235
  },
11207
- gitHead: "eeed70576ada327d03166880bbd1d1d32f7d4e7c"
11236
+ gitHead: "479bb77726d7e49cda72367ba8fd3c84e346474d"
11208
11237
  };
11209
11238
 
11210
11239
  // src/config/constants.ts
@@ -11368,13 +11397,11 @@ function CliApp() {
11368
11397
  if (models.length === 0) {
11369
11398
  throw new Error("No models available from server.");
11370
11399
  }
11371
- console.log(`\u{1F4CB} Available models: ${models.map((m) => m.id).join(", ")}`);
11400
+ logger.debug(`\u{1F4CB} Available models: ${models.map((m) => m.id).join(", ")}`);
11372
11401
  const modelInfo = models.find((m) => m.id === config.defaultModel) || models[0];
11373
11402
  if (modelInfo.id !== config.defaultModel) {
11374
- console.log(`\u26A0\uFE0F Requested model '${config.defaultModel}' not available`);
11375
- console.log(`\u{1F916} Using fallback model: ${modelInfo.id}`);
11376
- } else {
11377
- console.log(`\u{1F916} Using model: ${modelInfo.id}`);
11403
+ logger.warn(`\u26A0\uFE0F Requested model '${config.defaultModel}' not available`);
11404
+ logger.warn(`\u{1F916} Using fallback model: ${modelInfo.id}`);
11378
11405
  }
11379
11406
  llm.currentModel = modelInfo.id;
11380
11407
  const newSession = {
@@ -11393,9 +11420,6 @@ function CliApp() {
11393
11420
  };
11394
11421
  await logger.initialize(newSession.id);
11395
11422
  logger.setVerbose(process.env.B4M_VERBOSE === "1");
11396
- logger.info(`API: ${apiBaseURL}`);
11397
- logger.info(`Environment: ${envName}`);
11398
- logger.info(`Model: ${modelInfo.id}`);
11399
11423
  logger.debug("=== Session Configuration Complete ===");
11400
11424
  logger.cleanupOldLogs().catch(() => {
11401
11425
  });
@@ -11444,7 +11468,7 @@ function CliApp() {
11444
11468
  state.configStore,
11445
11469
  apiClient
11446
11470
  );
11447
- console.log(`\u{1F6E0}\uFE0F Loaded ${b4mTools.length} B4M tool(s)`);
11471
+ console.log(`\u{1F6E0}\uFE0F Loaded ${b4mTools.length} B4M tool(s)`);
11448
11472
  const mcpManager = new McpManager(config);
11449
11473
  await mcpManager.initialize();
11450
11474
  const mcpTools = mcpManager.getTools();
@@ -11455,7 +11479,6 @@ function CliApp() {
11455
11479
  });
11456
11480
  }
11457
11481
  const allTools = [...b4mTools, ...mcpTools];
11458
- console.log(`\u2705 Total: ${allTools.length} tool(s) available`);
11459
11482
  const projectDir = state.configStore.getProjectConfigDir();
11460
11483
  const contextResult = await loadContextFiles(projectDir);
11461
11484
  if (contextResult.globalContext) {
@@ -11531,6 +11554,7 @@ Remember: Use context from previous messages to understand follow-up questions.$
11531
11554
  }));
11532
11555
  setStoreSession(newSession);
11533
11556
  setIsInitialized(true);
11557
+ console.log("\n");
11534
11558
  } catch (error) {
11535
11559
  console.error("Initialization error:", error);
11536
11560
  setInitError(error instanceof Error ? error.message : "Unknown error");
@@ -11561,23 +11585,16 @@ Remember: Use context from previous messages to understand follow-up questions.$
11561
11585
  const currentSteps = [];
11562
11586
  const stepHandler = (step) => {
11563
11587
  currentSteps.push(step);
11564
- const currentSession = useCliStore.getState().session;
11565
- if (currentSession) {
11566
- const messages = [...currentSession.messages];
11567
- const lastMessage = messages[messages.length - 1];
11568
- if (lastMessage && lastMessage.role === "assistant") {
11569
- messages[messages.length - 1] = {
11570
- ...lastMessage,
11571
- metadata: {
11572
- ...lastMessage.metadata,
11573
- steps: [...currentSteps]
11574
- }
11575
- };
11576
- setStoreSession({
11577
- ...currentSession,
11578
- messages
11579
- });
11580
- }
11588
+ const { pendingMessages, updatePendingMessage } = useCliStore.getState();
11589
+ const lastIdx = pendingMessages.length - 1;
11590
+ if (lastIdx >= 0 && pendingMessages[lastIdx].role === "assistant") {
11591
+ updatePendingMessage(lastIdx, {
11592
+ ...pendingMessages[lastIdx],
11593
+ metadata: {
11594
+ ...pendingMessages[lastIdx].metadata,
11595
+ steps: [...currentSteps]
11596
+ }
11597
+ });
11581
11598
  }
11582
11599
  };
11583
11600
  state.agent.on("action", stepHandler);
@@ -11602,13 +11619,14 @@ Remember: Use context from previous messages to understand follow-up questions.$
11602
11619
  steps: []
11603
11620
  }
11604
11621
  };
11605
- const sessionWithMessages = {
11622
+ const sessionWithUserMessage = {
11606
11623
  ...state.session,
11607
- messages: [...state.session.messages, userMessage, pendingAssistantMessage],
11624
+ messages: [...state.session.messages, userMessage],
11608
11625
  updatedAt: (/* @__PURE__ */ new Date()).toISOString()
11609
11626
  };
11610
- setState((prev) => ({ ...prev, session: sessionWithMessages }));
11611
- setStoreSession(sessionWithMessages);
11627
+ setState((prev) => ({ ...prev, session: sessionWithUserMessage }));
11628
+ setStoreSession(sessionWithUserMessage);
11629
+ useCliStore.getState().addPendingMessage(pendingAssistantMessage);
11612
11630
  const recentMessages = state.session.messages.slice(-20);
11613
11631
  const previousMessages = recentMessages.filter((msg) => msg.role === "user" || msg.role === "assistant").map((msg) => ({
11614
11632
  role: msg.role,
@@ -11622,9 +11640,6 @@ Remember: Use context from previous messages to understand follow-up questions.$
11622
11640
  console.log("\n\u26A0\uFE0F Action denied by user\n");
11623
11641
  }
11624
11642
  const successfulToolCalls = result.steps.filter((s) => s.type === "observation").length;
11625
- const currentSession = useCliStore.getState().session;
11626
- if (!currentSession) return;
11627
- const finalMessages = [...currentSession.messages];
11628
11643
  const finalAssistantMessage = {
11629
11644
  role: "assistant",
11630
11645
  content: result.finalAnswer,
@@ -11640,21 +11655,22 @@ Remember: Use context from previous messages to understand follow-up questions.$
11640
11655
  permissionDenied
11641
11656
  }
11642
11657
  };
11643
- finalMessages[finalMessages.length - 1] = finalAssistantMessage;
11658
+ useCliStore.getState().completePendingMessage(0, finalAssistantMessage);
11659
+ const currentSession = useCliStore.getState().session;
11660
+ if (!currentSession) return;
11644
11661
  const updatedSession = {
11645
11662
  ...currentSession,
11646
- messages: finalMessages,
11647
- updatedAt: (/* @__PURE__ */ new Date()).toISOString(),
11648
11663
  metadata: {
11649
- ...state.session.metadata,
11650
- totalTokens: state.session.metadata.totalTokens + result.completionInfo.totalTokens,
11651
- toolCallCount: state.session.metadata.toolCallCount + successfulToolCalls
11664
+ ...currentSession.metadata,
11665
+ totalTokens: currentSession.metadata.totalTokens + result.completionInfo.totalTokens,
11666
+ toolCallCount: currentSession.metadata.toolCallCount + successfulToolCalls
11652
11667
  }
11653
11668
  };
11654
11669
  setState((prev) => ({ ...prev, session: updatedSession }));
11655
11670
  setStoreSession(updatedSession);
11656
11671
  await state.sessionStore.save(updatedSession);
11657
11672
  } catch (error) {
11673
+ useCliStore.getState().clearPendingMessages();
11658
11674
  if (error instanceof Error) {
11659
11675
  if (error.message.includes("Authentication failed") || error.message.includes("Authentication expired")) {
11660
11676
  console.log("\n\u274C Authentication failed");
@@ -11791,6 +11807,7 @@ Project Configuration:
11791
11807
  setState((prev) => ({ ...prev, session: loadedSession }));
11792
11808
  setStoreSession(loadedSession);
11793
11809
  useCliStore.getState().clearAgentSteps();
11810
+ useCliStore.getState().clearPendingMessages();
11794
11811
  usageCache = null;
11795
11812
  console.log(`
11796
11813
  \u2705 Session resumed: "${loadedSession.name}"`);
@@ -12026,6 +12043,7 @@ Project Configuration:
12026
12043
  setState((prev) => ({ ...prev, session: newSession }));
12027
12044
  setStoreSession(newSession);
12028
12045
  useCliStore.getState().clearAgentSteps();
12046
+ useCliStore.getState().clearPendingMessages();
12029
12047
  usageCache = null;
12030
12048
  console.log("New session started.");
12031
12049
  console.log(`
@@ -12078,6 +12096,7 @@ Project Configuration:
12078
12096
  prefillInput: prefillContent
12079
12097
  }));
12080
12098
  setStoreSession(rewindedSession);
12099
+ useCliStore.getState().clearPendingMessages();
12081
12100
  await state.sessionStore.save(rewindedSession);
12082
12101
  console.log("\u2705 Conversation rewound successfully");
12083
12102
  console.log(`\u{1F4CA} Current state: ${rewindedMessages.length} messages, ${newMetadata.totalTokens} tokens`);
@@ -12245,12 +12264,12 @@ No usage data available for the last ${USAGE_DAYS} days.`);
12245
12264
  setState((prev) => ({ ...prev, config: updatedConfig }));
12246
12265
  };
12247
12266
  if (initError) {
12248
- return /* @__PURE__ */ React16.createElement(Box15, { flexDirection: "column", padding: 1 }, /* @__PURE__ */ React16.createElement(Text15, { color: "red", bold: true }, "\u274C Initialization Error"), /* @__PURE__ */ React16.createElement(Text15, null, initError), /* @__PURE__ */ React16.createElement(Text15, { dimColor: true }, "\n", "Tip: Run /config to set up your API keys"));
12267
+ return /* @__PURE__ */ React17.createElement(Box16, { flexDirection: "column", padding: 1 }, /* @__PURE__ */ React17.createElement(Text16, { color: "red", bold: true }, "\u274C Initialization Error"), /* @__PURE__ */ React17.createElement(Text16, null, initError), /* @__PURE__ */ React17.createElement(Text16, { dimColor: true }, "\n", "Tip: Run /config to set up your API keys"));
12249
12268
  }
12250
12269
  if (state.trustLocationSelector) {
12251
12270
  const projectDir = state.configStore.getProjectConfigDir();
12252
12271
  const inProject = projectDir !== null;
12253
- return /* @__PURE__ */ React16.createElement(
12272
+ return /* @__PURE__ */ React17.createElement(
12254
12273
  TrustLocationSelector,
12255
12274
  {
12256
12275
  inProject,
@@ -12268,7 +12287,7 @@ No usage data available for the last ${USAGE_DAYS} days.`);
12268
12287
  );
12269
12288
  }
12270
12289
  if (state.rewindSelector && state.session) {
12271
- return /* @__PURE__ */ React16.createElement(
12290
+ return /* @__PURE__ */ React17.createElement(
12272
12291
  RewindSelector,
12273
12292
  {
12274
12293
  messages: state.session.messages,
@@ -12286,7 +12305,7 @@ No usage data available for the last ${USAGE_DAYS} days.`);
12286
12305
  );
12287
12306
  }
12288
12307
  if (state.sessionSelector) {
12289
- return /* @__PURE__ */ React16.createElement(
12308
+ return /* @__PURE__ */ React17.createElement(
12290
12309
  SessionSelector,
12291
12310
  {
12292
12311
  sessions: state.sessionSelector.sessions,
@@ -12306,7 +12325,7 @@ No usage data available for the last ${USAGE_DAYS} days.`);
12306
12325
  }
12307
12326
  if (state.showLoginFlow) {
12308
12327
  const loginApiUrl = getApiUrl(state.config?.apiConfig);
12309
- return /* @__PURE__ */ React16.createElement(
12328
+ return /* @__PURE__ */ React17.createElement(
12310
12329
  LoginFlow,
12311
12330
  {
12312
12331
  apiUrl: loginApiUrl,
@@ -12329,9 +12348,9 @@ No usage data available for the last ${USAGE_DAYS} days.`);
12329
12348
  );
12330
12349
  }
12331
12350
  if (!isInitialized) {
12332
- return /* @__PURE__ */ React16.createElement(Box15, { flexDirection: "column", padding: 1 }, /* @__PURE__ */ React16.createElement(Text15, null, "\u{1F680} Initializing..."));
12351
+ return /* @__PURE__ */ React17.createElement(Box16, { flexDirection: "column", padding: 1 }, /* @__PURE__ */ React17.createElement(Text16, null, "\u{1F680} Initializing..."));
12333
12352
  }
12334
- return /* @__PURE__ */ React16.createElement(
12353
+ return /* @__PURE__ */ React17.createElement(
12335
12354
  App,
12336
12355
  {
12337
12356
  onMessage: handleMessage,
@@ -12364,12 +12383,12 @@ var BANNER = `
12364
12383
  \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u255D
12365
12384
  `;
12366
12385
  console.log("\x1B[36m\x1B[1m%s\x1B[0m", BANNER);
12367
- console.log(`\x1B[2m v${package_default.version} - AI-Powered CLI\x1B[0m
12368
- `);
12386
+ console.log(`\x1B[2m v${package_default.version} - AI-Powered CLI\x1B[0m`);
12387
+ console.log(" /help for more information\n");
12369
12388
  var isDevMode = import.meta.url.includes("/src/") || process.env.NODE_ENV === "development";
12370
12389
  if (isDevMode) {
12371
- console.log("\u{1F527} Running in development mode (using TypeScript source)\n");
12390
+ logger.debug("\u{1F527} Running in development mode (using TypeScript source)\n");
12372
12391
  }
12373
- render(/* @__PURE__ */ React16.createElement(CliApp, null), {
12392
+ render(/* @__PURE__ */ React17.createElement(CliApp, null), {
12374
12393
  exitOnCtrlC: false
12375
12394
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bike4mind/cli",
3
- "version": "0.2.10-dowgrade-mcp-sdk.17228+eeed70576",
3
+ "version": "0.2.10-fix-b4m-cli-flicker.17235+479bb7772",
4
4
  "type": "module",
5
5
  "description": "Interactive CLI tool for Bike4Mind with ReAct agents",
6
6
  "license": "UNLICENSED",
@@ -103,10 +103,10 @@
103
103
  },
104
104
  "devDependencies": {
105
105
  "@bike4mind/agents": "0.1.0",
106
- "@bike4mind/common": "2.39.1-dowgrade-mcp-sdk.17228+eeed70576",
107
- "@bike4mind/mcp": "1.20.4-dowgrade-mcp-sdk.17228+eeed70576",
108
- "@bike4mind/services": "2.34.2-dowgrade-mcp-sdk.17228+eeed70576",
109
- "@bike4mind/utils": "2.1.4-dowgrade-mcp-sdk.17228+eeed70576",
106
+ "@bike4mind/common": "2.39.1-fix-b4m-cli-flicker.17235+479bb7772",
107
+ "@bike4mind/mcp": "1.20.4-fix-b4m-cli-flicker.17235+479bb7772",
108
+ "@bike4mind/services": "2.34.2-fix-b4m-cli-flicker.17235+479bb7772",
109
+ "@bike4mind/utils": "2.1.4-fix-b4m-cli-flicker.17235+479bb7772",
110
110
  "@types/better-sqlite3": "^7.6.13",
111
111
  "@types/diff": "^5.0.9",
112
112
  "@types/jsonwebtoken": "^9.0.4",
@@ -119,5 +119,5 @@
119
119
  "typescript": "^5.9.3",
120
120
  "vitest": "^3.2.4"
121
121
  },
122
- "gitHead": "eeed70576ada327d03166880bbd1d1d32f7d4e7c"
122
+ "gitHead": "479bb77726d7e49cda72367ba8fd3c84e346474d"
123
123
  }