@bike4mind/cli 0.2.2 → 0.2.3-basic-cli-shortcuts.17060
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/artifactExtractor-GXQ5YZF7.js +0 -0
- package/dist/chunk-5N4PG5EH.js +0 -0
- package/dist/chunk-AMDXHL6S.js +0 -0
- package/dist/chunk-BDQBOLYG.js +0 -0
- package/dist/chunk-BPFEGDC7.js +0 -0
- package/dist/chunk-GZTILMGE.js +0 -0
- package/dist/chunk-NZADYDFG.js +0 -0
- package/dist/chunk-PDX44BCA.js +0 -0
- package/dist/chunk-WR6YZRQV.js +0 -0
- package/dist/chunk-Y4HMTEDH.js +0 -0
- package/dist/create-ZTK4723N.js +0 -0
- package/dist/formatConverter-I7EIUVDY.js +0 -0
- package/dist/index.js +185 -88
- package/dist/llmMarkdownGenerator-4ZR3FLEQ.js +0 -0
- package/dist/markdownGenerator-7WE7WKME.js +0 -0
- package/dist/mementoService-5XQYECNM.js +0 -0
- package/dist/notificationDeduplicator-UW7D75QS.js +0 -0
- package/dist/src-6J6LFPZ6.js +0 -0
- package/dist/src-DOO3QAO2.js +0 -0
- package/dist/subtractCredits-3QOJA6XF.js +0 -0
- package/dist/utils-JPMDGUBL.js +0 -0
- package/package.json +18 -16
|
File without changes
|
package/dist/chunk-5N4PG5EH.js
CHANGED
|
File without changes
|
package/dist/chunk-AMDXHL6S.js
CHANGED
|
File without changes
|
package/dist/chunk-BDQBOLYG.js
CHANGED
|
File without changes
|
package/dist/chunk-BPFEGDC7.js
CHANGED
|
File without changes
|
package/dist/chunk-GZTILMGE.js
CHANGED
|
File without changes
|
package/dist/chunk-NZADYDFG.js
CHANGED
|
File without changes
|
package/dist/chunk-PDX44BCA.js
CHANGED
|
File without changes
|
package/dist/chunk-WR6YZRQV.js
CHANGED
|
File without changes
|
package/dist/chunk-Y4HMTEDH.js
CHANGED
|
File without changes
|
package/dist/create-ZTK4723N.js
CHANGED
|
File without changes
|
|
File without changes
|
package/dist/index.js
CHANGED
|
@@ -79,13 +79,13 @@ import {
|
|
|
79
79
|
} from "./chunk-PDX44BCA.js";
|
|
80
80
|
|
|
81
81
|
// src/index.tsx
|
|
82
|
-
import
|
|
83
|
-
import { render, Box as Box11, Text as
|
|
82
|
+
import React12, { useState as useState4, useEffect as useEffect3, useCallback } from "react";
|
|
83
|
+
import { render, Box as Box11, Text as Text11, useApp, useInput as useInput3 } from "ink";
|
|
84
84
|
import { v4 as uuidv49 } from "uuid";
|
|
85
85
|
|
|
86
86
|
// src/components/App.tsx
|
|
87
|
-
import
|
|
88
|
-
import { Box as Box8, Text as
|
|
87
|
+
import React9 from "react";
|
|
88
|
+
import { Box as Box8, Text as Text8, Static } from "ink";
|
|
89
89
|
|
|
90
90
|
// src/components/StatusBar.tsx
|
|
91
91
|
import React from "react";
|
|
@@ -95,27 +95,127 @@ var StatusBar = React.memo(function StatusBar2({ sessionName, model, tokenUsage
|
|
|
95
95
|
});
|
|
96
96
|
|
|
97
97
|
// src/components/InputPrompt.tsx
|
|
98
|
-
import
|
|
99
|
-
import { Box as Box4, Text as
|
|
100
|
-
|
|
98
|
+
import React5, { useState as useState2, useMemo, useEffect } from "react";
|
|
99
|
+
import { Box as Box4, Text as Text5, useInput as useInput2 } from "ink";
|
|
100
|
+
|
|
101
|
+
// src/components/CustomTextInput.tsx
|
|
102
|
+
import React2, { useState } from "react";
|
|
103
|
+
import { Text as Text2, useInput } from "ink";
|
|
104
|
+
function CustomTextInput({
|
|
105
|
+
value,
|
|
106
|
+
onChange,
|
|
107
|
+
onSubmit,
|
|
108
|
+
placeholder = "",
|
|
109
|
+
showCursor = true
|
|
110
|
+
}) {
|
|
111
|
+
const [cursorOffset, setCursorOffset] = useState(value.length);
|
|
112
|
+
useInput(
|
|
113
|
+
(input, key) => {
|
|
114
|
+
if (key.return && !key.meta && !key.shift) {
|
|
115
|
+
onSubmit(value);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
if (key.ctrl) {
|
|
119
|
+
switch (input) {
|
|
120
|
+
case "u":
|
|
121
|
+
{
|
|
122
|
+
const lines = value.split("\n");
|
|
123
|
+
let currentLineStart = 0;
|
|
124
|
+
let currentLineIndex = 0;
|
|
125
|
+
let charCount = 0;
|
|
126
|
+
for (let i = 0; i < lines.length; i++) {
|
|
127
|
+
const lineLength = lines[i].length;
|
|
128
|
+
if (charCount + lineLength >= cursorOffset) {
|
|
129
|
+
currentLineIndex = i;
|
|
130
|
+
currentLineStart = charCount;
|
|
131
|
+
break;
|
|
132
|
+
}
|
|
133
|
+
charCount += lineLength + 1;
|
|
134
|
+
}
|
|
135
|
+
lines.splice(currentLineIndex, 1);
|
|
136
|
+
const newValue = lines.join("\n");
|
|
137
|
+
onChange(newValue);
|
|
138
|
+
setCursorOffset(Math.min(currentLineStart, newValue.length));
|
|
139
|
+
}
|
|
140
|
+
return;
|
|
141
|
+
case "k":
|
|
142
|
+
onChange(value.slice(0, cursorOffset));
|
|
143
|
+
return;
|
|
144
|
+
case "w":
|
|
145
|
+
{
|
|
146
|
+
const beforeCursor2 = value.slice(0, cursorOffset);
|
|
147
|
+
const afterCursor2 = value.slice(cursorOffset);
|
|
148
|
+
const trimmed = beforeCursor2.trimEnd();
|
|
149
|
+
const lastSpace = trimmed.lastIndexOf(" ");
|
|
150
|
+
const newBefore = lastSpace === -1 ? "" : trimmed.slice(0, lastSpace + 1);
|
|
151
|
+
const newValue = newBefore + afterCursor2;
|
|
152
|
+
onChange(newValue);
|
|
153
|
+
setCursorOffset(newBefore.length);
|
|
154
|
+
}
|
|
155
|
+
return;
|
|
156
|
+
case "a":
|
|
157
|
+
setCursorOffset(0);
|
|
158
|
+
return;
|
|
159
|
+
case "e":
|
|
160
|
+
setCursorOffset(value.length);
|
|
161
|
+
return;
|
|
162
|
+
case "l":
|
|
163
|
+
onChange("");
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
if (key.backspace || key.delete) {
|
|
168
|
+
if (cursorOffset > 0) {
|
|
169
|
+
const newValue = value.slice(0, cursorOffset - 1) + value.slice(cursorOffset);
|
|
170
|
+
onChange(newValue);
|
|
171
|
+
setCursorOffset(cursorOffset - 1);
|
|
172
|
+
}
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
if (key.leftArrow) {
|
|
176
|
+
setCursorOffset(Math.max(0, cursorOffset - 1));
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
if (key.rightArrow) {
|
|
180
|
+
setCursorOffset(Math.min(value.length, cursorOffset + 1));
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
if (!key.ctrl && !key.meta && input.length === 1) {
|
|
184
|
+
const sanitizedInput = input === "\r" ? "\n" : input;
|
|
185
|
+
const newValue = value.slice(0, cursorOffset) + sanitizedInput + value.slice(cursorOffset);
|
|
186
|
+
onChange(newValue);
|
|
187
|
+
setCursorOffset(cursorOffset + 1);
|
|
188
|
+
}
|
|
189
|
+
},
|
|
190
|
+
{ isActive: true }
|
|
191
|
+
);
|
|
192
|
+
const hasValue = value.length > 0;
|
|
193
|
+
if (!hasValue) {
|
|
194
|
+
return /* @__PURE__ */ React2.createElement(Text2, null, showCursor ? /* @__PURE__ */ React2.createElement(React2.Fragment, null, /* @__PURE__ */ React2.createElement(Text2, { inverse: true }, " "), /* @__PURE__ */ React2.createElement(Text2, { dimColor: true }, placeholder)) : /* @__PURE__ */ React2.createElement(Text2, { dimColor: true }, placeholder));
|
|
195
|
+
}
|
|
196
|
+
const beforeCursor = value.slice(0, cursorOffset);
|
|
197
|
+
const cursorChar = value[cursorOffset] || " ";
|
|
198
|
+
const afterCursor = value.slice(cursorOffset + 1);
|
|
199
|
+
return /* @__PURE__ */ React2.createElement(Text2, null, beforeCursor, showCursor && /* @__PURE__ */ React2.createElement(Text2, { inverse: true }, cursorChar), !showCursor && cursorChar, afterCursor);
|
|
200
|
+
}
|
|
101
201
|
|
|
102
202
|
// src/components/CommandAutocomplete.tsx
|
|
103
|
-
import
|
|
104
|
-
import { Box as Box2, Text as
|
|
203
|
+
import React3 from "react";
|
|
204
|
+
import { Box as Box2, Text as Text3 } from "ink";
|
|
105
205
|
function CommandAutocomplete({ commands, selectedIndex }) {
|
|
106
206
|
if (commands.length === 0) {
|
|
107
|
-
return /* @__PURE__ */
|
|
207
|
+
return /* @__PURE__ */ React3.createElement(Box2, { marginLeft: 2, marginTop: 1 }, /* @__PURE__ */ React3.createElement(Text3, { dimColor: true }, "No matching commands"));
|
|
108
208
|
}
|
|
109
|
-
return /* @__PURE__ */
|
|
209
|
+
return /* @__PURE__ */ React3.createElement(Box2, { flexDirection: "column", marginLeft: 2, marginTop: 1 }, /* @__PURE__ */ React3.createElement(Box2, { marginBottom: 1 }, /* @__PURE__ */ React3.createElement(Text3, { dimColor: true }, commands.length === 1 ? "1 command" : `${commands.length} commands`, " \u2022 Use \u2191\u2193 to navigate, Enter to select")), commands.map((cmd, index) => {
|
|
110
210
|
const args = cmd.args ? ` ${cmd.args}` : "";
|
|
111
211
|
const isSelected = index === selectedIndex;
|
|
112
|
-
return /* @__PURE__ */
|
|
212
|
+
return /* @__PURE__ */ React3.createElement(Box2, { key: cmd.name, marginLeft: 1 }, /* @__PURE__ */ React3.createElement(Text3, { color: isSelected ? "cyan" : void 0, bold: isSelected }, isSelected ? "\u25B8 " : " ", "/", cmd.name, args, " - ", cmd.description));
|
|
113
213
|
}));
|
|
114
214
|
}
|
|
115
215
|
|
|
116
216
|
// src/components/FileAutocomplete.tsx
|
|
117
|
-
import
|
|
118
|
-
import { Box as Box3, Text as
|
|
217
|
+
import React4 from "react";
|
|
218
|
+
import { Box as Box3, Text as Text4 } from "ink";
|
|
119
219
|
|
|
120
220
|
// src/utils/fileSearch.ts
|
|
121
221
|
import * as fs from "fs";
|
|
@@ -304,14 +404,14 @@ var MAX_FILE_SIZE = 10 * 1024 * 1024;
|
|
|
304
404
|
// src/components/FileAutocomplete.tsx
|
|
305
405
|
function FileAutocomplete({ files, selectedIndex, query }) {
|
|
306
406
|
if (files.length === 0) {
|
|
307
|
-
return /* @__PURE__ */
|
|
407
|
+
return /* @__PURE__ */ React4.createElement(Box3, { marginLeft: 2, marginTop: 1 }, /* @__PURE__ */ React4.createElement(Text4, { dimColor: true }, "No matching files", query ? ` for "${query}"` : ""));
|
|
308
408
|
}
|
|
309
|
-
return /* @__PURE__ */
|
|
409
|
+
return /* @__PURE__ */ React4.createElement(Box3, { flexDirection: "column", marginLeft: 2, marginTop: 1 }, /* @__PURE__ */ React4.createElement(Box3, { marginBottom: 1 }, /* @__PURE__ */ React4.createElement(Text4, { dimColor: true }, files.length === 1 ? "1 match" : `${files.length} matches`, " - Use up/down to navigate, Tab to select")), files.map((file, index) => {
|
|
310
410
|
const isSelected = index === selectedIndex;
|
|
311
411
|
const icon = file.isDirectory ? "[folder]" : "[file] ";
|
|
312
412
|
const sizeDisplay = file.isDirectory ? "" : file.size !== void 0 ? ` (${formatFileSize(file.size)})` : "";
|
|
313
413
|
const pathDisplay = file.isDirectory ? `${file.path}/` : file.path;
|
|
314
|
-
return /* @__PURE__ */
|
|
414
|
+
return /* @__PURE__ */ React4.createElement(Box3, { key: file.path, marginLeft: 1 }, /* @__PURE__ */ React4.createElement(Text4, { color: isSelected ? "cyan" : void 0, bold: isSelected }, isSelected ? "> " : " "), /* @__PURE__ */ React4.createElement(Text4, { color: file.isDirectory ? "yellow" : isSelected ? "cyan" : void 0, bold: isSelected }, icon), /* @__PURE__ */ React4.createElement(Text4, { color: isSelected ? "cyan" : void 0, bold: isSelected }, " ", pathDisplay), /* @__PURE__ */ React4.createElement(Text4, { dimColor: true }, sizeDisplay));
|
|
315
415
|
}));
|
|
316
416
|
}
|
|
317
417
|
|
|
@@ -425,13 +525,12 @@ function findAtTrigger(value) {
|
|
|
425
525
|
return null;
|
|
426
526
|
}
|
|
427
527
|
function InputPrompt({ onSubmit, disabled = false, history = [] }) {
|
|
428
|
-
const [value, setValue] =
|
|
429
|
-
const [selectedIndex, setSelectedIndex] =
|
|
430
|
-
const [historyIndex, setHistoryIndex] =
|
|
431
|
-
const [tempInput, setTempInput] =
|
|
432
|
-
const [
|
|
433
|
-
const [
|
|
434
|
-
const [fileSelectedIndex, setFileSelectedIndex] = useState(0);
|
|
528
|
+
const [value, setValue] = useState2("");
|
|
529
|
+
const [selectedIndex, setSelectedIndex] = useState2(0);
|
|
530
|
+
const [historyIndex, setHistoryIndex] = useState2(-1);
|
|
531
|
+
const [tempInput, setTempInput] = useState2("");
|
|
532
|
+
const [fileAutocomplete, setFileAutocomplete] = useState2(null);
|
|
533
|
+
const [fileSelectedIndex, setFileSelectedIndex] = useState2(0);
|
|
435
534
|
const shouldShowCommandAutocomplete = value.startsWith("/") && !disabled && !fileAutocomplete?.active;
|
|
436
535
|
const commandQuery = shouldShowCommandAutocomplete ? value.slice(1) : "";
|
|
437
536
|
const filteredCommands = useMemo(() => {
|
|
@@ -448,7 +547,7 @@ function InputPrompt({ onSubmit, disabled = false, history = [] }) {
|
|
|
448
547
|
useEffect(() => {
|
|
449
548
|
setFileSelectedIndex(0);
|
|
450
549
|
}, [filteredFiles]);
|
|
451
|
-
|
|
550
|
+
useInput2((_input, key) => {
|
|
452
551
|
if (fileAutocomplete?.active && filteredFiles.length > 0) {
|
|
453
552
|
if (key.upArrow) {
|
|
454
553
|
setFileSelectedIndex((prev) => prev > 0 ? prev - 1 : filteredFiles.length - 1);
|
|
@@ -505,7 +604,6 @@ function InputPrompt({ onSubmit, disabled = false, history = [] }) {
|
|
|
505
604
|
const pathToInsert = file.isDirectory ? `@${file.path}/` : `@${file.path}`;
|
|
506
605
|
const newValue = beforeAt + pathToInsert + afterQuery;
|
|
507
606
|
setValue(newValue);
|
|
508
|
-
setInputKey((prev) => prev + 1);
|
|
509
607
|
if (file.isDirectory) {
|
|
510
608
|
setFileAutocomplete({
|
|
511
609
|
active: true,
|
|
@@ -532,7 +630,6 @@ function InputPrompt({ onSubmit, disabled = false, history = [] }) {
|
|
|
532
630
|
if (selectedCommand.args) {
|
|
533
631
|
setValue(commandText + " ");
|
|
534
632
|
setHistoryIndex(-1);
|
|
535
|
-
setInputKey((prev) => prev + 1);
|
|
536
633
|
return;
|
|
537
634
|
}
|
|
538
635
|
setValue("");
|
|
@@ -562,29 +659,28 @@ function InputPrompt({ onSubmit, disabled = false, history = [] }) {
|
|
|
562
659
|
setFileAutocomplete(null);
|
|
563
660
|
}
|
|
564
661
|
};
|
|
565
|
-
return /* @__PURE__ */
|
|
566
|
-
|
|
662
|
+
return /* @__PURE__ */ React5.createElement(Box4, { flexDirection: "column" }, /* @__PURE__ */ React5.createElement(Box4, null, /* @__PURE__ */ React5.createElement(Text5, { bold: true, color: "cyan" }, "> "), /* @__PURE__ */ React5.createElement(
|
|
663
|
+
CustomTextInput,
|
|
567
664
|
{
|
|
568
|
-
key: inputKey,
|
|
569
665
|
value,
|
|
570
666
|
onChange: handleChange,
|
|
571
667
|
onSubmit: handleSubmit,
|
|
572
668
|
placeholder: disabled ? "Thinking..." : "Type your message, /help for commands, or @file to reference",
|
|
573
669
|
showCursor: !disabled
|
|
574
670
|
}
|
|
575
|
-
)), shouldShowCommandAutocomplete && /* @__PURE__ */
|
|
671
|
+
)), shouldShowCommandAutocomplete && /* @__PURE__ */ React5.createElement(CommandAutocomplete, { commands: filteredCommands, selectedIndex }), fileAutocomplete?.active && /* @__PURE__ */ React5.createElement(FileAutocomplete, { files: filteredFiles, selectedIndex: fileSelectedIndex, query: fileAutocomplete.query }));
|
|
576
672
|
}
|
|
577
673
|
|
|
578
674
|
// src/components/AgentThinking.tsx
|
|
579
|
-
import
|
|
675
|
+
import React7 from "react";
|
|
580
676
|
import { Box as Box6 } from "ink";
|
|
581
677
|
|
|
582
678
|
// src/components/ThoughtStream.tsx
|
|
583
|
-
import
|
|
584
|
-
import { Box as Box5, Text as
|
|
679
|
+
import React6 from "react";
|
|
680
|
+
import { Box as Box5, Text as Text6 } from "ink";
|
|
585
681
|
import Spinner from "ink-spinner";
|
|
586
|
-
var ThoughtStream =
|
|
587
|
-
return /* @__PURE__ */
|
|
682
|
+
var ThoughtStream = React6.memo(function ThoughtStream2({ steps }) {
|
|
683
|
+
return /* @__PURE__ */ React6.createElement(Box5, { flexDirection: "column", gap: 1 }, steps.map((step, index) => /* @__PURE__ */ React6.createElement(Box5, { key: index, flexDirection: "column" }, step.type === "thought" && /* @__PURE__ */ React6.createElement(Box5, null, /* @__PURE__ */ React6.createElement(Text6, { color: "magenta" }, "\u{1F914} Thought: "), /* @__PURE__ */ React6.createElement(Text6, null, step.content)), step.type === "action" && /* @__PURE__ */ React6.createElement(Box5, { flexDirection: "column" }, /* @__PURE__ */ React6.createElement(Box5, null, /* @__PURE__ */ React6.createElement(Text6, { color: "yellow" }, "\u26A1 Action: "), /* @__PURE__ */ React6.createElement(Text6, { bold: true }, step.metadata?.toolName || "unknown")), step.metadata?.toolInput && /* @__PURE__ */ React6.createElement(Box5, { paddingLeft: 2 }, /* @__PURE__ */ React6.createElement(Text6, { dimColor: true }, JSON.stringify(step.metadata.toolInput, null, 2)))), step.type === "observation" && /* @__PURE__ */ React6.createElement(Box5, { flexDirection: "column" }, /* @__PURE__ */ React6.createElement(Box5, null, /* @__PURE__ */ React6.createElement(Text6, { color: "blue" }, "\u{1F4CA} Observation: ")), /* @__PURE__ */ React6.createElement(Box5, { paddingLeft: 2 }, /* @__PURE__ */ React6.createElement(Text6, null, step.content))), step.type === "final_answer" && /* @__PURE__ */ React6.createElement(Box5, { flexDirection: "column" }, /* @__PURE__ */ React6.createElement(Box5, null, /* @__PURE__ */ React6.createElement(Text6, { color: "green", bold: true }, "\u2705 Final Answer:", " ")), /* @__PURE__ */ React6.createElement(Box5, { paddingLeft: 2 }, /* @__PURE__ */ React6.createElement(Text6, null, step.content)), step.metadata?.tokenUsage && /* @__PURE__ */ React6.createElement(Box5, { paddingLeft: 2 }, /* @__PURE__ */ React6.createElement(Text6, { dimColor: true }, "(", step.metadata.tokenUsage.total, " tokens)"))))), !steps.some((s) => s.type === "final_answer") && /* @__PURE__ */ React6.createElement(Box5, null, /* @__PURE__ */ React6.createElement(Text6, { color: "yellow" }, /* @__PURE__ */ React6.createElement(Spinner, { type: "dots" })), /* @__PURE__ */ React6.createElement(Text6, null, " ", steps.length === 0 ? "Thinking..." : "Processing...")));
|
|
588
684
|
});
|
|
589
685
|
|
|
590
686
|
// src/store/index.ts
|
|
@@ -610,32 +706,32 @@ var useCliStore = create((set) => ({
|
|
|
610
706
|
}));
|
|
611
707
|
|
|
612
708
|
// src/components/AgentThinking.tsx
|
|
613
|
-
var AgentThinking =
|
|
709
|
+
var AgentThinking = React7.memo(function AgentThinking2() {
|
|
614
710
|
const isThinking = useCliStore((state) => state.isThinking);
|
|
615
711
|
const agentSteps = useCliStore((state) => state.agentSteps);
|
|
616
712
|
if (!isThinking) {
|
|
617
713
|
return null;
|
|
618
714
|
}
|
|
619
|
-
return /* @__PURE__ */
|
|
715
|
+
return /* @__PURE__ */ React7.createElement(Box6, { borderStyle: "single", borderColor: "yellow", paddingX: 1, marginY: 1 }, /* @__PURE__ */ React7.createElement(ThoughtStream, { steps: agentSteps }));
|
|
620
716
|
});
|
|
621
717
|
|
|
622
718
|
// src/components/PermissionPrompt.tsx
|
|
623
|
-
import
|
|
624
|
-
import { Box as Box7, Text as
|
|
719
|
+
import React8 from "react";
|
|
720
|
+
import { Box as Box7, Text as Text7 } from "ink";
|
|
625
721
|
import SelectInput from "ink-select-input";
|
|
626
722
|
function renderDiffPreview(preview) {
|
|
627
723
|
const lines = preview.split("\n");
|
|
628
724
|
return lines.map((line, index) => {
|
|
629
725
|
if (line.startsWith("+")) {
|
|
630
|
-
return /* @__PURE__ */
|
|
726
|
+
return /* @__PURE__ */ React8.createElement(Text7, { key: index, color: "green" }, line);
|
|
631
727
|
}
|
|
632
728
|
if (line.startsWith("-")) {
|
|
633
|
-
return /* @__PURE__ */
|
|
729
|
+
return /* @__PURE__ */ React8.createElement(Text7, { key: index, color: "red" }, line);
|
|
634
730
|
}
|
|
635
731
|
if (line.startsWith("@@")) {
|
|
636
|
-
return /* @__PURE__ */
|
|
732
|
+
return /* @__PURE__ */ React8.createElement(Text7, { key: index, color: "cyan" }, line);
|
|
637
733
|
}
|
|
638
|
-
return /* @__PURE__ */
|
|
734
|
+
return /* @__PURE__ */ React8.createElement(Text7, { key: index, dimColor: true }, line);
|
|
639
735
|
});
|
|
640
736
|
}
|
|
641
737
|
function PermissionPrompt({
|
|
@@ -655,7 +751,7 @@ function PermissionPrompt({
|
|
|
655
751
|
{ label: "\u2717 Deny", value: "deny" }
|
|
656
752
|
];
|
|
657
753
|
const argsString = typeof args === "string" ? args : JSON.stringify(args, null, 2);
|
|
658
|
-
return /* @__PURE__ */
|
|
754
|
+
return /* @__PURE__ */ React8.createElement(Box7, { flexDirection: "column", borderStyle: "bold", borderColor: "yellow", padding: 1, marginY: 1 }, /* @__PURE__ */ React8.createElement(Box7, null, /* @__PURE__ */ React8.createElement(Text7, { bold: true, color: "yellow" }, "\u26A0\uFE0F Permission Required")), /* @__PURE__ */ React8.createElement(Box7, { marginTop: 1 }, /* @__PURE__ */ React8.createElement(Text7, { dimColor: true }, "Tool: "), /* @__PURE__ */ React8.createElement(Text7, { bold: true, color: "cyan" }, toolName)), toolDescription && /* @__PURE__ */ React8.createElement(Box7, null, /* @__PURE__ */ React8.createElement(Text7, { dimColor: true }, "Action: "), /* @__PURE__ */ React8.createElement(Text7, null, toolDescription)), /* @__PURE__ */ React8.createElement(Box7, { marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React8.createElement(Text7, { bold: true }, "Arguments:"), /* @__PURE__ */ React8.createElement(Box7, { paddingLeft: 2, flexDirection: "column" }, /* @__PURE__ */ React8.createElement(Text7, { dimColor: true }, argsString))), preview && /* @__PURE__ */ React8.createElement(Box7, { marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React8.createElement(Text7, { bold: true }, "Preview:"), /* @__PURE__ */ React8.createElement(Box7, { borderStyle: "single", borderColor: "gray", paddingX: 1, flexDirection: "column" }, renderDiffPreview(preview))), !canBeTrusted && /* @__PURE__ */ React8.createElement(Box7, { marginTop: 1 }, /* @__PURE__ */ React8.createElement(Text7, { color: "red", dimColor: true }, "Note: This tool cannot be trusted due to its dangerous nature.")), /* @__PURE__ */ React8.createElement(Box7, { marginTop: 1 }, /* @__PURE__ */ React8.createElement(SelectInput, { items, onSelect: (item) => onResponse(item.value) })));
|
|
659
755
|
}
|
|
660
756
|
|
|
661
757
|
// src/utils/processFileReferences.ts
|
|
@@ -782,7 +878,7 @@ function App({ onMessage, onCommand, onPermissionResponse, commandHistory = [] }
|
|
|
782
878
|
const permissionPrompt = useCliStore((state) => state.permissionPrompt);
|
|
783
879
|
const exitRequested = useCliStore((state) => state.exitRequested);
|
|
784
880
|
const setIsThinking = useCliStore((state) => state.setIsThinking);
|
|
785
|
-
const handleSubmit =
|
|
881
|
+
const handleSubmit = React9.useCallback(
|
|
786
882
|
async (input) => {
|
|
787
883
|
const trimmed = input.trim();
|
|
788
884
|
if (!trimmed) return;
|
|
@@ -811,7 +907,7 @@ ${errorBlock}`;
|
|
|
811
907
|
},
|
|
812
908
|
[onMessage, onCommand, setIsThinking]
|
|
813
909
|
);
|
|
814
|
-
return /* @__PURE__ */
|
|
910
|
+
return /* @__PURE__ */ React9.createElement(Box8, { flexDirection: "column" }, /* @__PURE__ */ React9.createElement(StatusBar, { sessionName, model: currentModel, tokenUsage: totalTokens }), permissionPrompt ? /* @__PURE__ */ React9.createElement(Box8, { flexDirection: "column", paddingX: 1 }, /* @__PURE__ */ React9.createElement(
|
|
815
911
|
PermissionPrompt,
|
|
816
912
|
{
|
|
817
913
|
toolName: permissionPrompt.toolName,
|
|
@@ -820,39 +916,39 @@ ${errorBlock}`;
|
|
|
820
916
|
canBeTrusted: permissionPrompt.canBeTrusted,
|
|
821
917
|
onResponse: onPermissionResponse
|
|
822
918
|
}
|
|
823
|
-
)) : /* @__PURE__ */
|
|
919
|
+
)) : /* @__PURE__ */ React9.createElement(React9.Fragment, null, /* @__PURE__ */ React9.createElement(Static, { items: messages }, (message, index) => /* @__PURE__ */ React9.createElement(Box8, { key: index, flexDirection: "column", paddingX: 1 }, /* @__PURE__ */ React9.createElement(MessageItem, { message }))), /* @__PURE__ */ React9.createElement(AgentThinking, null), exitRequested && /* @__PURE__ */ React9.createElement(Box8, { paddingX: 1, marginBottom: 1 }, /* @__PURE__ */ React9.createElement(Text8, { color: "yellow", bold: true }, "\u26A0\uFE0F Press Ctrl+C again to exit")), /* @__PURE__ */ React9.createElement(Box8, { borderStyle: "single", borderColor: "cyan", paddingX: 1 }, /* @__PURE__ */ React9.createElement(InputPrompt, { onSubmit: handleSubmit, disabled: isThinking, history: commandHistory }))));
|
|
824
920
|
}
|
|
825
921
|
function MessageItem({ message }) {
|
|
826
|
-
return /* @__PURE__ */
|
|
922
|
+
return /* @__PURE__ */ React9.createElement(Box8, { flexDirection: "column", marginBottom: 1 }, /* @__PURE__ */ React9.createElement(Box8, null, /* @__PURE__ */ React9.createElement(Text8, { bold: true, color: message.role === "user" ? "cyan" : "green" }, message.role === "user" ? "\u{1F464} You" : "\u{1F916} Assistant"), /* @__PURE__ */ React9.createElement(Text8, { dimColor: true }, " \u2022 ", new Date(message.timestamp).toLocaleTimeString())), /* @__PURE__ */ React9.createElement(Box8, { paddingLeft: 2 }, message.metadata?.permissionDenied ? /* @__PURE__ */ React9.createElement(Text8, { color: "yellow" }, "\u26A0\uFE0F ", message.content) : /* @__PURE__ */ React9.createElement(Text8, null, message.content)), message.metadata?.steps && message.metadata.steps.length > 0 && /* @__PURE__ */ React9.createElement(Box8, { paddingLeft: 2, marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React9.createElement(Text8, { 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__ */ React9.createElement(Text8, { dimColor: true }, "Step types: ", message.metadata.steps.map((s) => s.type).join(", ")), message.metadata.steps.map((step, idx) => {
|
|
827
923
|
if (step.type === "thought") {
|
|
828
|
-
return /* @__PURE__ */
|
|
924
|
+
return /* @__PURE__ */ React9.createElement(Box8, { key: idx, paddingLeft: 2, marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React9.createElement(Text8, { color: "blue" }, "\u{1F4AD} Thought:"), /* @__PURE__ */ React9.createElement(Text8, { dimColor: true }, ` ${step.content.slice(0, 200)}${step.content.length > 200 ? "..." : ""}`));
|
|
829
925
|
}
|
|
830
926
|
if (step.type === "action") {
|
|
831
927
|
const toolName = step.metadata?.toolName || "unknown";
|
|
832
928
|
const toolInput = step.metadata?.toolInput;
|
|
833
929
|
const observationStep = message.metadata.steps[idx + 1];
|
|
834
930
|
const result = observationStep?.type === "observation" ? observationStep.content : null;
|
|
835
|
-
return /* @__PURE__ */
|
|
931
|
+
return /* @__PURE__ */ React9.createElement(Box8, { key: idx, paddingLeft: 2, marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React9.createElement(Text8, { color: "yellow" }, "\u{1F527} Action: ", toolName), toolInput && /* @__PURE__ */ React9.createElement(Text8, { dimColor: true }, ` Input: ${typeof toolInput === "string" ? toolInput : JSON.stringify(toolInput).slice(0, 100)}`), result && /* @__PURE__ */ React9.createElement(Text8, { 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 ? "..." : ""}`));
|
|
836
932
|
}
|
|
837
933
|
return null;
|
|
838
|
-
}).filter(Boolean)), message.metadata?.tokenUsage && (!message.metadata.steps || message.metadata.steps.length === 0) && /* @__PURE__ */
|
|
934
|
+
}).filter(Boolean)), message.metadata?.tokenUsage && (!message.metadata.steps || message.metadata.steps.length === 0) && /* @__PURE__ */ React9.createElement(Box8, { paddingLeft: 2 }, /* @__PURE__ */ React9.createElement(Text8, { dimColor: true }, `${message.metadata.tokenUsage.total} tokens`)));
|
|
839
935
|
}
|
|
840
936
|
|
|
841
937
|
// src/components/MessageList.tsx
|
|
842
|
-
import
|
|
843
|
-
import { Box as Box9, Text as
|
|
938
|
+
import React10 from "react";
|
|
939
|
+
import { Box as Box9, Text as Text9 } from "ink";
|
|
844
940
|
function stripThinkingTags(content) {
|
|
845
941
|
return content.replace(/<think>[\s\S]*?<\/think>/g, "").trim();
|
|
846
942
|
}
|
|
847
|
-
var MessageList =
|
|
943
|
+
var MessageList = React10.memo(
|
|
848
944
|
function MessageList2({ messages }) {
|
|
849
945
|
if (messages.length === 0) {
|
|
850
|
-
return /* @__PURE__ */
|
|
946
|
+
return /* @__PURE__ */ React10.createElement(Box9, { paddingY: 1 }, /* @__PURE__ */ React10.createElement(Text9, { dimColor: true }, "No messages yet. Type a message to start!"));
|
|
851
947
|
}
|
|
852
|
-
return /* @__PURE__ */
|
|
948
|
+
return /* @__PURE__ */ React10.createElement(Box9, { flexDirection: "column", gap: 1, paddingY: 1 }, messages.map((message, index) => /* @__PURE__ */ React10.createElement(Box9, { key: index, flexDirection: "column", marginBottom: 1 }, /* @__PURE__ */ React10.createElement(Box9, null, /* @__PURE__ */ React10.createElement(Text9, { bold: true, color: message.role === "user" ? "cyan" : "green" }, message.role === "user" ? "\u{1F464} You" : "\u{1F916} Assistant"), /* @__PURE__ */ React10.createElement(Text9, { dimColor: true }, " \u2022 ", new Date(message.timestamp).toLocaleTimeString())), /* @__PURE__ */ React10.createElement(Box9, { paddingLeft: 2 }, message.metadata?.permissionDenied ? /* @__PURE__ */ React10.createElement(Text9, { color: "yellow" }, "\u26A0\uFE0F ", stripThinkingTags(message.content)) : /* @__PURE__ */ React10.createElement(Text9, null, stripThinkingTags(message.content))), 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) => {
|
|
853
949
|
if (step.type === "thought") {
|
|
854
|
-
return /* @__PURE__ */
|
|
855
|
-
|
|
950
|
+
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(
|
|
951
|
+
Text9,
|
|
856
952
|
{
|
|
857
953
|
dimColor: true
|
|
858
954
|
},
|
|
@@ -864,10 +960,10 @@ var MessageList = React9.memo(
|
|
|
864
960
|
const toolInput = step.metadata?.toolInput;
|
|
865
961
|
const observationStep = message.metadata.steps[idx + 1];
|
|
866
962
|
const result = observationStep?.type === "observation" ? observationStep.content : null;
|
|
867
|
-
return /* @__PURE__ */
|
|
963
|
+
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 ? "..." : ""}`));
|
|
868
964
|
}
|
|
869
965
|
return null;
|
|
870
|
-
}).filter(Boolean)), message.metadata?.tokenUsage && (!message.metadata.steps || message.metadata.steps.length === 0) && /* @__PURE__ */
|
|
966
|
+
}).filter(Boolean)), 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`)))));
|
|
871
967
|
},
|
|
872
968
|
(prevProps, nextProps) => {
|
|
873
969
|
if (prevProps.messages.length !== nextProps.messages.length) {
|
|
@@ -878,8 +974,8 @@ var MessageList = React9.memo(
|
|
|
878
974
|
);
|
|
879
975
|
|
|
880
976
|
// src/components/LoginFlow.tsx
|
|
881
|
-
import
|
|
882
|
-
import { Box as Box10, Text as
|
|
977
|
+
import React11, { useState as useState3, useEffect as useEffect2 } from "react";
|
|
978
|
+
import { Box as Box10, Text as Text10 } from "ink";
|
|
883
979
|
import Spinner2 from "ink-spinner";
|
|
884
980
|
import jwt from "jsonwebtoken";
|
|
885
981
|
import open from "open";
|
|
@@ -995,10 +1091,10 @@ var OAuthClient = class {
|
|
|
995
1091
|
|
|
996
1092
|
// src/components/LoginFlow.tsx
|
|
997
1093
|
function LoginFlow({ apiUrl = "http://localhost:3000", configStore, onSuccess, onError }) {
|
|
998
|
-
const [status, setStatus] =
|
|
999
|
-
const [deviceFlow, setDeviceFlow] =
|
|
1000
|
-
const [statusMessage, setStatusMessage] =
|
|
1001
|
-
const [error, setError] =
|
|
1094
|
+
const [status, setStatus] = useState3("initiating");
|
|
1095
|
+
const [deviceFlow, setDeviceFlow] = useState3(null);
|
|
1096
|
+
const [statusMessage, setStatusMessage] = useState3("Initiating device authorization...");
|
|
1097
|
+
const [error, setError] = useState3(null);
|
|
1002
1098
|
useEffect2(() => {
|
|
1003
1099
|
const runLoginFlow = async () => {
|
|
1004
1100
|
const oauth = new OAuthClient(apiUrl);
|
|
@@ -1042,15 +1138,15 @@ function LoginFlow({ apiUrl = "http://localhost:3000", configStore, onSuccess, o
|
|
|
1042
1138
|
}
|
|
1043
1139
|
}, [deviceFlow, status]);
|
|
1044
1140
|
if (status === "initiating") {
|
|
1045
|
-
return /* @__PURE__ */
|
|
1141
|
+
return /* @__PURE__ */ React11.createElement(Box10, { flexDirection: "column", padding: 1 }, /* @__PURE__ */ React11.createElement(Box10, null, /* @__PURE__ */ React11.createElement(Text10, { color: "cyan" }, /* @__PURE__ */ React11.createElement(Spinner2, { type: "dots" }), " Initiating device authorization...")));
|
|
1046
1142
|
}
|
|
1047
1143
|
if (status === "error") {
|
|
1048
|
-
return /* @__PURE__ */
|
|
1144
|
+
return /* @__PURE__ */ React11.createElement(Box10, { flexDirection: "column", padding: 1 }, /* @__PURE__ */ React11.createElement(Box10, { marginBottom: 1 }, /* @__PURE__ */ React11.createElement(Text10, { color: "red", bold: true }, "\u2716 Authentication Failed")), /* @__PURE__ */ React11.createElement(Box10, null, /* @__PURE__ */ React11.createElement(Text10, { color: "red" }, error)));
|
|
1049
1145
|
}
|
|
1050
1146
|
if (status === "success") {
|
|
1051
|
-
return /* @__PURE__ */
|
|
1147
|
+
return /* @__PURE__ */ React11.createElement(Box10, { flexDirection: "column", padding: 1 }, /* @__PURE__ */ React11.createElement(Box10, { marginBottom: 1 }, /* @__PURE__ */ React11.createElement(Text10, { color: "green", bold: true }, "\u2714 Successfully authenticated!")), /* @__PURE__ */ React11.createElement(Box10, null, /* @__PURE__ */ React11.createElement(Text10, { dimColor: true }, "You can now use B4M CLI with your account.")));
|
|
1052
1148
|
}
|
|
1053
|
-
return /* @__PURE__ */
|
|
1149
|
+
return /* @__PURE__ */ React11.createElement(Box10, { flexDirection: "column", padding: 1, borderStyle: "round", borderColor: "cyan" }, /* @__PURE__ */ React11.createElement(Box10, { marginBottom: 1 }, /* @__PURE__ */ React11.createElement(Text10, { color: "cyan", bold: true }, "\u{1F510} Device Authorization")), /* @__PURE__ */ React11.createElement(Box10, { marginBottom: 1 }, /* @__PURE__ */ React11.createElement(Text10, null, "Opening browser automatically... If it doesn't open, please visit:")), /* @__PURE__ */ React11.createElement(Box10, { marginBottom: 1, paddingLeft: 2 }, /* @__PURE__ */ React11.createElement(Text10, { color: "blue", bold: true }, deviceFlow?.verification_uri)), /* @__PURE__ */ React11.createElement(Box10, { marginBottom: 1 }, /* @__PURE__ */ React11.createElement(Text10, null, "And enter this code when prompted:")), /* @__PURE__ */ React11.createElement(Box10, { marginBottom: 1, paddingLeft: 2 }, /* @__PURE__ */ React11.createElement(Text10, { color: "yellow", bold: true }, deviceFlow?.user_code)), /* @__PURE__ */ React11.createElement(Box10, { marginTop: 1 }, /* @__PURE__ */ React11.createElement(Text10, { color: "cyan" }, /* @__PURE__ */ React11.createElement(Spinner2, { type: "dots" }), " ", statusMessage)), /* @__PURE__ */ React11.createElement(Box10, { marginTop: 1 }, /* @__PURE__ */ React11.createElement(Text10, { dimColor: true }, "Expires in ", deviceFlow ? Math.floor(deviceFlow.expires_in / 60) : 0, " minutes")));
|
|
1054
1150
|
}
|
|
1055
1151
|
|
|
1056
1152
|
// src/storage/SessionStore.ts
|
|
@@ -9178,7 +9274,7 @@ import { isAxiosError as isAxiosError2 } from "axios";
|
|
|
9178
9274
|
// package.json
|
|
9179
9275
|
var package_default = {
|
|
9180
9276
|
name: "@bike4mind/cli",
|
|
9181
|
-
version: "0.2.
|
|
9277
|
+
version: "0.2.3-basic-cli-shortcuts.17060+99d13fc49",
|
|
9182
9278
|
type: "module",
|
|
9183
9279
|
description: "Interactive CLI tool for Bike4Mind with ReAct agents",
|
|
9184
9280
|
license: "UNLICENSED",
|
|
@@ -9279,11 +9375,11 @@ var package_default = {
|
|
|
9279
9375
|
zustand: "^4.5.4"
|
|
9280
9376
|
},
|
|
9281
9377
|
devDependencies: {
|
|
9282
|
-
"@bike4mind/agents": "
|
|
9283
|
-
"@bike4mind/common": "
|
|
9284
|
-
"@bike4mind/mcp": "
|
|
9285
|
-
"@bike4mind/services": "
|
|
9286
|
-
"@bike4mind/utils": "
|
|
9378
|
+
"@bike4mind/agents": "0.1.0",
|
|
9379
|
+
"@bike4mind/common": "2.37.1-basic-cli-shortcuts.17060+99d13fc49",
|
|
9380
|
+
"@bike4mind/mcp": "1.19.5-basic-cli-shortcuts.17060+99d13fc49",
|
|
9381
|
+
"@bike4mind/services": "2.31.1-basic-cli-shortcuts.17060+99d13fc49",
|
|
9382
|
+
"@bike4mind/utils": "2.0.4-basic-cli-shortcuts.17060+99d13fc49",
|
|
9287
9383
|
"@types/diff": "^5.0.9",
|
|
9288
9384
|
"@types/jsonwebtoken": "^9.0.4",
|
|
9289
9385
|
"@types/node": "^22.9.0",
|
|
@@ -9294,7 +9390,8 @@ var package_default = {
|
|
|
9294
9390
|
tsx: "^4.21.0",
|
|
9295
9391
|
typescript: "^5.9.3",
|
|
9296
9392
|
vitest: "^3.2.4"
|
|
9297
|
-
}
|
|
9393
|
+
},
|
|
9394
|
+
gitHead: "99d13fc49c7558c7fec8068eab53e6c6122e426d"
|
|
9298
9395
|
};
|
|
9299
9396
|
|
|
9300
9397
|
// src/config/constants.ts
|
|
@@ -9315,7 +9412,7 @@ var EXIT_TIMEOUT_MS = 2e3;
|
|
|
9315
9412
|
var usageCache = null;
|
|
9316
9413
|
function CliApp() {
|
|
9317
9414
|
const { exit } = useApp();
|
|
9318
|
-
const [state, setState] =
|
|
9415
|
+
const [state, setState] = useState4({
|
|
9319
9416
|
session: null,
|
|
9320
9417
|
sessionStore: new SessionStore(),
|
|
9321
9418
|
configStore: new ConfigStore(),
|
|
@@ -9325,9 +9422,9 @@ function CliApp() {
|
|
|
9325
9422
|
permissionManager: null,
|
|
9326
9423
|
permissionPrompt: null
|
|
9327
9424
|
});
|
|
9328
|
-
const [isInitialized, setIsInitialized] =
|
|
9329
|
-
const [initError, setInitError] =
|
|
9330
|
-
const [commandHistory, setCommandHistory] =
|
|
9425
|
+
const [isInitialized, setIsInitialized] = useState4(false);
|
|
9426
|
+
const [initError, setInitError] = useState4(null);
|
|
9427
|
+
const [commandHistory, setCommandHistory] = useState4([]);
|
|
9331
9428
|
const setStoreSession = useCliStore((state2) => state2.setSession);
|
|
9332
9429
|
const setPermissionPrompt = useCliStore((state2) => state2.setPermissionPrompt);
|
|
9333
9430
|
const setExitRequested = useCliStore((state2) => state2.setExitRequested);
|
|
@@ -9359,7 +9456,7 @@ function CliApp() {
|
|
|
9359
9456
|
process.exit(0);
|
|
9360
9457
|
}, 100);
|
|
9361
9458
|
}, [state.session, state.sessionStore, state.mcpManager, state.agent]);
|
|
9362
|
-
|
|
9459
|
+
useInput3((input, key) => {
|
|
9363
9460
|
if (key.ctrl && input === "c") {
|
|
9364
9461
|
const now = Date.now();
|
|
9365
9462
|
if (exitTimestamp && now - exitTimestamp < EXIT_TIMEOUT_MS) {
|
|
@@ -9951,11 +10048,11 @@ No usage data available for the last ${USAGE_DAYS} days.`);
|
|
|
9951
10048
|
}
|
|
9952
10049
|
};
|
|
9953
10050
|
if (initError) {
|
|
9954
|
-
return /* @__PURE__ */
|
|
10051
|
+
return /* @__PURE__ */ React12.createElement(Box11, { flexDirection: "column", padding: 1 }, /* @__PURE__ */ React12.createElement(Text11, { color: "red", bold: true }, "\u274C Initialization Error"), /* @__PURE__ */ React12.createElement(Text11, null, initError), /* @__PURE__ */ React12.createElement(Text11, { dimColor: true }, "\n", "Tip: Run /config to set up your API keys"));
|
|
9955
10052
|
}
|
|
9956
10053
|
if (state.showLoginFlow) {
|
|
9957
10054
|
const loginApiUrl = getApiUrl(state.config?.apiConfig);
|
|
9958
|
-
return /* @__PURE__ */
|
|
10055
|
+
return /* @__PURE__ */ React12.createElement(
|
|
9959
10056
|
LoginFlow,
|
|
9960
10057
|
{
|
|
9961
10058
|
apiUrl: loginApiUrl,
|
|
@@ -9978,9 +10075,9 @@ No usage data available for the last ${USAGE_DAYS} days.`);
|
|
|
9978
10075
|
);
|
|
9979
10076
|
}
|
|
9980
10077
|
if (!isInitialized) {
|
|
9981
|
-
return /* @__PURE__ */
|
|
10078
|
+
return /* @__PURE__ */ React12.createElement(Box11, { flexDirection: "column", padding: 1 }, /* @__PURE__ */ React12.createElement(Text11, null, "\u{1F680} Initializing..."));
|
|
9982
10079
|
}
|
|
9983
|
-
return /* @__PURE__ */
|
|
10080
|
+
return /* @__PURE__ */ React12.createElement(
|
|
9984
10081
|
App,
|
|
9985
10082
|
{
|
|
9986
10083
|
onMessage: handleMessage,
|
|
@@ -10011,6 +10108,6 @@ var isDevMode = import.meta.url.includes("/src/") || process.env.NODE_ENV === "d
|
|
|
10011
10108
|
if (isDevMode) {
|
|
10012
10109
|
console.log("\u{1F527} Running in development mode (using TypeScript source)\n");
|
|
10013
10110
|
}
|
|
10014
|
-
render(/* @__PURE__ */
|
|
10111
|
+
render(/* @__PURE__ */ React12.createElement(CliApp, null), {
|
|
10015
10112
|
exitOnCtrlC: false
|
|
10016
10113
|
});
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
package/dist/src-6J6LFPZ6.js
CHANGED
|
File without changes
|
package/dist/src-DOO3QAO2.js
CHANGED
|
File without changes
|
|
File without changes
|
package/dist/utils-JPMDGUBL.js
CHANGED
|
File without changes
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bike4mind/cli",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.3-basic-cli-shortcuts.17060+99d13fc49",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Interactive CLI tool for Bike4Mind with ReAct agents",
|
|
6
6
|
"license": "UNLICENSED",
|
|
@@ -30,6 +30,15 @@
|
|
|
30
30
|
"dist",
|
|
31
31
|
"bin"
|
|
32
32
|
],
|
|
33
|
+
"scripts": {
|
|
34
|
+
"dev": "tsx src/index.tsx",
|
|
35
|
+
"build": "tsup",
|
|
36
|
+
"typecheck": "tsc --noEmit",
|
|
37
|
+
"test": "vitest run",
|
|
38
|
+
"test:watch": "vitest",
|
|
39
|
+
"start": "node dist/index.js",
|
|
40
|
+
"prepublishOnly": "pnpm build"
|
|
41
|
+
},
|
|
33
42
|
"dependencies": {
|
|
34
43
|
"@anthropic-ai/sdk": "^0.22.0",
|
|
35
44
|
"@aws-sdk/client-apigatewaymanagementapi": "3.654.0",
|
|
@@ -92,6 +101,11 @@
|
|
|
92
101
|
"zustand": "^4.5.4"
|
|
93
102
|
},
|
|
94
103
|
"devDependencies": {
|
|
104
|
+
"@bike4mind/agents": "0.1.0",
|
|
105
|
+
"@bike4mind/common": "2.37.1-basic-cli-shortcuts.17060+99d13fc49",
|
|
106
|
+
"@bike4mind/mcp": "1.19.5-basic-cli-shortcuts.17060+99d13fc49",
|
|
107
|
+
"@bike4mind/services": "2.31.1-basic-cli-shortcuts.17060+99d13fc49",
|
|
108
|
+
"@bike4mind/utils": "2.0.4-basic-cli-shortcuts.17060+99d13fc49",
|
|
95
109
|
"@types/diff": "^5.0.9",
|
|
96
110
|
"@types/jsonwebtoken": "^9.0.4",
|
|
97
111
|
"@types/node": "^22.9.0",
|
|
@@ -101,19 +115,7 @@
|
|
|
101
115
|
"tsup": "^8.5.1",
|
|
102
116
|
"tsx": "^4.21.0",
|
|
103
117
|
"typescript": "^5.9.3",
|
|
104
|
-
"vitest": "^3.2.4"
|
|
105
|
-
"@bike4mind/common": "2.37.0",
|
|
106
|
-
"@bike4mind/agents": "0.1.0",
|
|
107
|
-
"@bike4mind/mcp": "1.19.4",
|
|
108
|
-
"@bike4mind/services": "2.31.0",
|
|
109
|
-
"@bike4mind/utils": "2.0.3"
|
|
118
|
+
"vitest": "^3.2.4"
|
|
110
119
|
},
|
|
111
|
-
"
|
|
112
|
-
|
|
113
|
-
"build": "tsup",
|
|
114
|
-
"typecheck": "tsc --noEmit",
|
|
115
|
-
"test": "vitest run",
|
|
116
|
-
"test:watch": "vitest",
|
|
117
|
-
"start": "node dist/index.js"
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
+
"gitHead": "99d13fc49c7558c7fec8068eab53e6c6122e426d"
|
|
121
|
+
}
|