@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.
- package/dist/index.js +138 -119
- 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
|
|
83
|
-
import { render, Box as
|
|
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
|
|
88
|
-
import { Box as
|
|
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, {
|
|
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 =
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
1434
|
-
import { Box as
|
|
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 =
|
|
1466
|
+
var MessageList = React12.memo(
|
|
1439
1467
|
function MessageList2({ messages }) {
|
|
1440
1468
|
if (messages.length === 0) {
|
|
1441
|
-
return /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
1446
|
-
|
|
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__ */
|
|
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__ */
|
|
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
|
|
1473
|
-
import { Box as
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
1506
|
-
import { Box as
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
1575
|
-
import { Box as
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
1638
|
-
import { Box as
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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-
|
|
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-
|
|
11192
|
-
"@bike4mind/mcp": "1.20.4-
|
|
11193
|
-
"@bike4mind/services": "2.34.2-
|
|
11194
|
-
"@bike4mind/utils": "2.1.4-
|
|
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: "
|
|
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
|
-
|
|
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
|
-
|
|
11375
|
-
|
|
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
|
|
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
|
|
11565
|
-
|
|
11566
|
-
|
|
11567
|
-
|
|
11568
|
-
|
|
11569
|
-
|
|
11570
|
-
...
|
|
11571
|
-
|
|
11572
|
-
|
|
11573
|
-
|
|
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
|
|
11622
|
+
const sessionWithUserMessage = {
|
|
11606
11623
|
...state.session,
|
|
11607
|
-
messages: [...state.session.messages, userMessage
|
|
11624
|
+
messages: [...state.session.messages, userMessage],
|
|
11608
11625
|
updatedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
11609
11626
|
};
|
|
11610
|
-
setState((prev) => ({ ...prev, session:
|
|
11611
|
-
setStoreSession(
|
|
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
|
-
|
|
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
|
-
...
|
|
11650
|
-
totalTokens:
|
|
11651
|
-
toolCallCount:
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
12351
|
+
return /* @__PURE__ */ React17.createElement(Box16, { flexDirection: "column", padding: 1 }, /* @__PURE__ */ React17.createElement(Text16, null, "\u{1F680} Initializing..."));
|
|
12333
12352
|
}
|
|
12334
|
-
return /* @__PURE__ */
|
|
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
|
-
|
|
12390
|
+
logger.debug("\u{1F527} Running in development mode (using TypeScript source)\n");
|
|
12372
12391
|
}
|
|
12373
|
-
render(/* @__PURE__ */
|
|
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-
|
|
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-
|
|
107
|
-
"@bike4mind/mcp": "1.20.4-
|
|
108
|
-
"@bike4mind/services": "2.34.2-
|
|
109
|
-
"@bike4mind/utils": "2.1.4-
|
|
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": "
|
|
122
|
+
"gitHead": "479bb77726d7e49cda72367ba8fd3c84e346474d"
|
|
123
123
|
}
|