fluxflow-cli 3.0.6 → 3.0.8
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/cat.txt +5 -0
- package/dist/fluxflow.js +34 -6
- package/package.json +3 -2
package/cat.txt
ADDED
package/dist/fluxflow.js
CHANGED
|
@@ -4840,11 +4840,30 @@ var init_StatusBar = __esm({
|
|
|
4840
4840
|
"src/components/StatusBar.jsx"() {
|
|
4841
4841
|
init_text();
|
|
4842
4842
|
activeGetMemoryInfo = null;
|
|
4843
|
-
StatusBar = React5.memo(({ mode, thinkingLevel, tokens = "0.0k", tokensTotal = "0.0k", chatId = "NEW-SESSION", isMemoryEnabled = true, apiTier = "Free", aiProvider = "Google", activeModel = "" }) => {
|
|
4843
|
+
StatusBar = React5.memo(({ mode, thinkingLevel, tokens = "0.0k", tokensTotal = "0.0k", chatId = "NEW-SESSION", isMemoryEnabled = true, apiTier = "Free", aiProvider = "Google", activeModel = "", isProcessing = false, lastChunkTime = 0 }) => {
|
|
4844
4844
|
const modeIcon = mode === "Flux" ? "" : "";
|
|
4845
4845
|
const [memoryUsage, setMemoryUsage] = useState5(0);
|
|
4846
4846
|
const [memoryLimit, setMemoryLimit] = useState5(0);
|
|
4847
4847
|
const [memoryUnit, setMemoryUnit] = useState5("MB");
|
|
4848
|
+
const [dotColor, setDotColor] = useState5("green");
|
|
4849
|
+
useEffect4(() => {
|
|
4850
|
+
if (!isProcessing) return;
|
|
4851
|
+
const checkLatency = () => {
|
|
4852
|
+
const delay = Date.now() - lastChunkTime;
|
|
4853
|
+
if (delay < 700) {
|
|
4854
|
+
setDotColor("green");
|
|
4855
|
+
} else if (delay <= 1200) {
|
|
4856
|
+
setDotColor("yellow");
|
|
4857
|
+
} else if (delay <= 2e3) {
|
|
4858
|
+
setDotColor("#ff9f43");
|
|
4859
|
+
} else {
|
|
4860
|
+
setDotColor("#d63031");
|
|
4861
|
+
}
|
|
4862
|
+
};
|
|
4863
|
+
checkLatency();
|
|
4864
|
+
const timer = setInterval(checkLatency, 100);
|
|
4865
|
+
return () => clearInterval(timer);
|
|
4866
|
+
}, [isProcessing, lastChunkTime]);
|
|
4848
4867
|
const updateMemory = () => {
|
|
4849
4868
|
const usage = process.memoryUsage();
|
|
4850
4869
|
const isGB = usage.heapTotal / (1024 * 1024) >= 1024;
|
|
@@ -4886,7 +4905,7 @@ var init_StatusBar = __esm({
|
|
|
4886
4905
|
},
|
|
4887
4906
|
/* @__PURE__ */ React5.createElement(Box4, null, /* @__PURE__ */ React5.createElement(Box4, { marginRight: 1 }, /* @__PURE__ */ React5.createElement(Text5, { color: "white", bold: true }, mode.toUpperCase())), /* @__PURE__ */ React5.createElement(Text5, { color: "gray", dimColor: true }, "\u2503"), /* @__PURE__ */ React5.createElement(Box4, { marginX: 1 }, /* @__PURE__ */ React5.createElement(Text5, { color: "white", bold: true }, thinkingLevel.toUpperCase())), /* @__PURE__ */ React5.createElement(Text5, { color: "gray", dimColor: true }, "\u2503"), /* @__PURE__ */ React5.createElement(Box4, { marginX: 1 }, /* @__PURE__ */ React5.createElement(Text5, { color: "gray", bold: true }, "MEM: "), /* @__PURE__ */ React5.createElement(Text5, { color: "white", bold: true }, isMemoryEnabled ? "ON" : "OFF"))),
|
|
4888
4907
|
/* @__PURE__ */ React5.createElement(Box4, { flexGrow: 1, justifyContent: "center", paddingX: 2 }, /* @__PURE__ */ React5.createElement(Text5, { color: "white", italic: true }, truncatePath(process.cwd(), 35))),
|
|
4889
|
-
/* @__PURE__ */ React5.createElement(Box4, null, /* @__PURE__ */ React5.createElement(Box4, { marginX: 1 }, /* @__PURE__ */ React5.createElement(Text5, { color: "white" }, formatTokens(tokensTotal), " ", /* @__PURE__ */ React5.createElement(Text5, { dimColor: true }, (tokens / maxLimit * 100).toFixed(0), "%"))), /* @__PURE__ */ React5.createElement(Text5, { color: "gray", dimColor: true }, "\u2503"), /* @__PURE__ */ React5.createElement(Box4, { marginX: 1 }, /* @__PURE__ */ React5.createElement(Text5, { color: "grey", bold: true }, memoryUsage, "/", memoryLimit, " ", memoryUnit)), /* @__PURE__ */ React5.createElement(Text5, { color: "gray", dimColor: true }, "\u2503"), /* @__PURE__ */ React5.createElement(Box4, { marginLeft: 1 }, /* @__PURE__ */ React5.createElement(Text5, { color: "gray", bold: true }, chatId), (apiTier === "Custom" || apiTier === "Paid") && /* @__PURE__ */ React5.createElement(Box4, null, /* @__PURE__ */ React5.createElement(Text5, { color: "gray", dimColor: true }, " \u2503 "), /* @__PURE__ */ React5.createElement(Text5, { color: "gray", bold: true }, "PAID"))))
|
|
4908
|
+
/* @__PURE__ */ React5.createElement(Box4, null, isProcessing ? /* @__PURE__ */ React5.createElement(Box4, { marginRight: 0 }, /* @__PURE__ */ React5.createElement(Text5, { color: dotColor }, "\u25CF")) : /* @__PURE__ */ React5.createElement(Text5, null, " "), /* @__PURE__ */ React5.createElement(Box4, { marginX: 1 }, /* @__PURE__ */ React5.createElement(Text5, { color: "white" }, formatTokens(tokensTotal), " ", /* @__PURE__ */ React5.createElement(Text5, { dimColor: true }, (tokens / maxLimit * 100).toFixed(0), "%"))), /* @__PURE__ */ React5.createElement(Text5, { color: "gray", dimColor: true }, "\u2503"), /* @__PURE__ */ React5.createElement(Box4, { marginX: 1 }, /* @__PURE__ */ React5.createElement(Text5, { color: "grey", bold: true }, memoryUsage, "/", memoryLimit, " ", memoryUnit)), /* @__PURE__ */ React5.createElement(Text5, { color: "gray", dimColor: true }, "\u2503"), /* @__PURE__ */ React5.createElement(Box4, { marginLeft: 1 }, /* @__PURE__ */ React5.createElement(Text5, { color: "gray", bold: true }, chatId), (apiTier === "Custom" || apiTier === "Paid") && /* @__PURE__ */ React5.createElement(Box4, null, /* @__PURE__ */ React5.createElement(Text5, { color: "gray", dimColor: true }, " \u2503 "), /* @__PURE__ */ React5.createElement(Text5, { color: "gray", bold: true }, "PAID"))))
|
|
4890
4909
|
);
|
|
4891
4910
|
});
|
|
4892
4911
|
StatusBar_default = StatusBar;
|
|
@@ -5129,10 +5148,12 @@ ${mode === "Flux" ? `- WORKSPACE TOOLS (path = relative to CWD & WILL BE FIRST A
|
|
|
5129
5148
|
|
|
5130
5149
|
-- SUB AGENTS DEFINITIONS --
|
|
5131
5150
|
USE PROACTIVELY TO PARALLELIZE TASK QUICKLY **USE OF SUB AGENTS HIGHLY RECOMENDED**
|
|
5132
|
-
|
|
5151
|
+
Invocation Types:
|
|
5152
|
+
- invoke (async, usage: background worker for parallel tasks, upto 7 parallel agents (3+ calls allowed), can take long time, if invoked DO NOT do the task yourself unless explicit ERROR)
|
|
5153
|
+
- invokeSync (sync, usage: blocking main agent loop, task delegation, repeatetive work, sequential tasks, can save tokens)
|
|
5133
5154
|
|
|
5134
5155
|
1. [agent:generalist.invokeSync/invoke(title="...", task="...")]. Task must me detailed, with exact file paths, imports/exports, dependency, folder structure
|
|
5135
|
-
2. [agent:generalist.getProgress(id="...")]. Usage: Check progress of async subagent task, taking time? do your own task OR await (exponentially longer after
|
|
5156
|
+
2. [agent:generalist.getProgress(id="...")]. Usage: Check progress of async subagent task, taking time? do your own task OR await (exponentially longer after 1st check, eg. 15s, 30s, 45s ...) >>> spamming getProgress`.trim() : `- CREATIVE TOOLS (path = relative to CWD & WILL BE FIRST ARGUMENT, path separator: '/') -
|
|
5136
5157
|
1. [tool:functions.WritePDF(path="...", content="...", orientation="...")]. PROACTIVE A4 PAGE BREAKS MUST IN CSS. HTML/CSS for PREMIUM layout
|
|
5137
5158
|
2. [tool:functions.WriteDoc(path="...", content="...")]. A4 Word document
|
|
5138
5159
|
- WORKSPACE TOOLS ARE NOT AVAILABLE IN FLOW`.trim()}
|
|
@@ -15267,6 +15288,7 @@ function App({ args = [] }) {
|
|
|
15267
15288
|
const [profileData, setProfileData] = useState14({ name: null, nickname: null, instructions: null });
|
|
15268
15289
|
const [imageSettings, setImageSettings] = useState14({ keyType: "Default", quality: "Low-High", apiKey: "" });
|
|
15269
15290
|
const [sessionStats, setSessionStats] = useState14({ tokens: 0 });
|
|
15291
|
+
const [lastChunkTime, setLastChunkTime] = useState14(0);
|
|
15270
15292
|
const [sessionAgentCalls, setSessionAgentCalls] = useState14(0);
|
|
15271
15293
|
const [sessionBackgroundCalls, setSessionBackgroundCalls] = useState14(0);
|
|
15272
15294
|
const [sessionTotalTokens, setSessionTotalTokens] = useState14(0);
|
|
@@ -17400,6 +17422,7 @@ ${timestamp}` };
|
|
|
17400
17422
|
};
|
|
17401
17423
|
let hasFiredJanitor = false;
|
|
17402
17424
|
setIsProcessing(true);
|
|
17425
|
+
setLastChunkTime(Date.now());
|
|
17403
17426
|
setIsExpanded(false);
|
|
17404
17427
|
let apiStart = Date.now();
|
|
17405
17428
|
let isFirstPacket = true;
|
|
@@ -17614,6 +17637,9 @@ Selection: ${val}`,
|
|
|
17614
17637
|
let inToolCallString = null;
|
|
17615
17638
|
const signalRegex = /\[?\s*turn\s*:\s*.*?\s*\]?/gi;
|
|
17616
17639
|
for await (const packet of stream) {
|
|
17640
|
+
if (packet.type === "text") {
|
|
17641
|
+
setLastChunkTime(Date.now());
|
|
17642
|
+
}
|
|
17617
17643
|
if (isFirstPacket && packet.type === "text") {
|
|
17618
17644
|
apiStart = Date.now();
|
|
17619
17645
|
isFirstPacket = false;
|
|
@@ -19026,7 +19052,7 @@ Selection: ${val}`,
|
|
|
19026
19052
|
}
|
|
19027
19053
|
)));
|
|
19028
19054
|
default:
|
|
19029
|
-
return /* @__PURE__ */ React15.createElement(Box14, { flexDirection: "column", marginTop: 1, flexShrink: 0, width: "100%" }, showBtwBox && btwResponse && /* @__PURE__ */ React15.createElement(Box14, { flexDirection: "column", borderStyle: "round", borderColor: "grey", paddingX: 2, paddingY: 1, width: "100%", marginBottom: 1 }, /* @__PURE__ */ React15.createElement(Box14, { justifyContent: "space-between", width: "100%" }, /* @__PURE__ */ React15.createElement(Text15, { color: "white", bold: true, underline: true }, "INQUIRY RESPONSE"), /* @__PURE__ */ React15.createElement(Text15, { color: "gray" }, "[ ESC to Close ]")), /* @__PURE__ */ React15.createElement(Box14, { marginTop: 1, width: "100%" }, /* @__PURE__ */ React15.createElement(CodeRenderer, { text: btwResponse, columns: terminalSize.columns - 6 }))), activeSubagents.filter((sa) => sa.status === "running").length > 0 && /* @__PURE__ */ React15.createElement(Box14, { flexDirection: "column", borderStyle: "round", borderColor: "gray", paddingX: 2, paddingY: 0, width: "100%", marginBottom: 1 }, /* @__PURE__ */ React15.createElement(Box14, { justifyContent: "space-between", width: "100%" }, /* @__PURE__ */ React15.createElement(Text15, { color: "white", bold: true }, "ACTIVE SUBAGENTS")), /* @__PURE__ */ React15.createElement(Box14, { flexDirection: "column", marginTop: 1, width: "100%" }, activeSubagents.filter((sa) => sa.status === "running").map((sa) => /* @__PURE__ */ React15.createElement(Box14, { key: sa.id, justifyContent: "space-between", width: "100%" }, /* @__PURE__ */ React15.createElement(Text15, { color: "white" }, " \u2022 ", sa.title, " ", /* @__PURE__ */ React15.createElement(Text15, { color: "white", dimColor: true }, "(", sa.id, ")")), /* @__PURE__ */ React15.createElement(Text15, { color: "white" }, "Executing: ", /* @__PURE__ */ React15.createElement(Text15, { color: "white", dimColor: true, bold: true }, sa.currentTool || "Active")))))), /* @__PURE__ */ React15.createElement(Box14, { paddingX: 1, marginBottom: 0, justifyContent: "space-between", width: "100%" }, /* @__PURE__ */ React15.createElement(Box14, null, statusText ? /* @__PURE__ */ React15.createElement(Box14, { gap: 1 }, /* @__PURE__ */ React15.createElement(build_default, null), /* @__PURE__ */ React15.createElement(Text15, { color: "white", bold: true, italic: true }, statusText.trimEnd()), /* @__PURE__ */ React15.createElement(Text15, { color: "gray" }, activeTime > 0 ? `[${activeTime.toFixed(0)}s]` : "")) : /* @__PURE__ */ React15.createElement(Text15, { color: "white", italic: true }, input.length > 0 && escPressCount ? "Press ESC again to clear input" : hasPasteBlock ? "Press CTRL + O to expand" : "Waiting for input...")), /* @__PURE__ */ React15.createElement(Box14, null,
|
|
19055
|
+
return /* @__PURE__ */ React15.createElement(Box14, { flexDirection: "column", marginTop: 1, flexShrink: 0, width: "100%" }, showBtwBox && btwResponse && /* @__PURE__ */ React15.createElement(Box14, { flexDirection: "column", borderStyle: "round", borderColor: "grey", paddingX: 2, paddingY: 1, width: "100%", marginBottom: 1 }, /* @__PURE__ */ React15.createElement(Box14, { justifyContent: "space-between", width: "100%" }, /* @__PURE__ */ React15.createElement(Text15, { color: "white", bold: true, underline: true }, "INQUIRY RESPONSE"), /* @__PURE__ */ React15.createElement(Text15, { color: "gray" }, "[ ESC to Close ]")), /* @__PURE__ */ React15.createElement(Box14, { marginTop: 1, width: "100%" }, /* @__PURE__ */ React15.createElement(CodeRenderer, { text: btwResponse, columns: terminalSize.columns - 6 }))), activeSubagents.filter((sa) => sa.status === "running").length > 0 && /* @__PURE__ */ React15.createElement(Box14, { flexDirection: "column", borderStyle: "round", borderColor: "gray", paddingX: 2, paddingY: 0, width: "100%", marginBottom: 1 }, /* @__PURE__ */ React15.createElement(Box14, { justifyContent: "space-between", width: "100%" }, /* @__PURE__ */ React15.createElement(Text15, { color: "white", bold: true }, "ACTIVE SUBAGENTS")), /* @__PURE__ */ React15.createElement(Box14, { flexDirection: "column", marginTop: 1, width: "100%" }, activeSubagents.filter((sa) => sa.status === "running").map((sa) => /* @__PURE__ */ React15.createElement(Box14, { key: sa.id, justifyContent: "space-between", width: "100%" }, /* @__PURE__ */ React15.createElement(Text15, { color: "white" }, " \u2022 ", sa.title, " ", /* @__PURE__ */ React15.createElement(Text15, { color: "white", dimColor: true }, "(", sa.id, ")")), /* @__PURE__ */ React15.createElement(Text15, { color: "white" }, "Executing: ", /* @__PURE__ */ React15.createElement(Text15, { color: "white", dimColor: true, bold: true }, sa.currentTool || "Active")))))), /* @__PURE__ */ React15.createElement(Box14, { paddingX: 1, marginBottom: 0, justifyContent: "space-between", width: "100%" }, /* @__PURE__ */ React15.createElement(Box14, null, statusText ? /* @__PURE__ */ React15.createElement(Box14, { gap: 1 }, /* @__PURE__ */ React15.createElement(build_default, null), /* @__PURE__ */ React15.createElement(Text15, { color: "white", bold: true, italic: true }, statusText.trimEnd()), /* @__PURE__ */ React15.createElement(Text15, { color: "gray" }, activeTime > 0 ? `[${activeTime.toFixed(0)}s]` : "")) : /* @__PURE__ */ React15.createElement(Text15, { color: "white", italic: true }, input.length > 0 && escPressCount ? "Press ESC again to clear input" : hasPasteBlock ? "Press CTRL + O to expand" : "Waiting for input...")), /* @__PURE__ */ React15.createElement(Box14, null, isProcessing && Date.now() - lastChunkTime > 15e3 ? /* @__PURE__ */ React15.createElement(Box14, null, /* @__PURE__ */ React15.createElement(Text15, { color: "yellow", bold: true }, "Waiting for API"), /* @__PURE__ */ React15.createElement(Text15, { color: "gray", dimColor: true }, " \u2503 ")) : wittyPhrase ? /* @__PURE__ */ React15.createElement(Box14, null, /* @__PURE__ */ React15.createElement(Text15, { color: "gray", italic: true }, wittyPhrase), /* @__PURE__ */ React15.createElement(Text15, { color: "gray", dimColor: true }, " \u2503 ")) : null, /* @__PURE__ */ React15.createElement(Text15, { color: "white" }, tempModelOverride || activeModel))), /* @__PURE__ */ React15.createElement(Box14, { flexDirection: "column", width: "100%" }, /* @__PURE__ */ React15.createElement(Box14, { width: "100%", height: 1, overflow: "hidden" }, /* @__PURE__ */ React15.createElement(Text15, { color: "#555555" }, "\u2584".repeat(Math.max(1, terminalSize.columns)))), /* @__PURE__ */ React15.createElement(
|
|
19030
19056
|
Box14,
|
|
19031
19057
|
{
|
|
19032
19058
|
backgroundColor: "#555555",
|
|
@@ -19180,7 +19206,9 @@ Selection: ${val}`,
|
|
|
19180
19206
|
isMemoryEnabled: systemSettings.memory,
|
|
19181
19207
|
apiTier,
|
|
19182
19208
|
aiProvider,
|
|
19183
|
-
activeModel
|
|
19209
|
+
activeModel,
|
|
19210
|
+
isProcessing,
|
|
19211
|
+
lastChunkTime
|
|
19184
19212
|
}
|
|
19185
19213
|
)), activeView === "exit" && (() => {
|
|
19186
19214
|
const wallTimeMs = Date.now() - SESSION_START_TIME;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "fluxflow-cli",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.8",
|
|
4
4
|
"date": "2026-07-03",
|
|
5
5
|
"description": "A high-fidelity agentic terminal assistant for the Flux Era.",
|
|
6
6
|
"keywords": [
|
|
@@ -28,7 +28,8 @@
|
|
|
28
28
|
"package.json",
|
|
29
29
|
"ARCHITECTURE.md",
|
|
30
30
|
"TOOLS.md",
|
|
31
|
-
"UI_FEATURES.md"
|
|
31
|
+
"UI_FEATURES.md",
|
|
32
|
+
"cat.txt"
|
|
32
33
|
],
|
|
33
34
|
"type": "module",
|
|
34
35
|
"bin": {
|