fluxflow-cli 3.14.0 → 3.14.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/fluxflow.js +88 -55
- package/package.json +73 -73
package/dist/fluxflow.js
CHANGED
|
@@ -3309,31 +3309,32 @@ var init_text = __esm({
|
|
|
3309
3309
|
return result;
|
|
3310
3310
|
};
|
|
3311
3311
|
TOOL_LABELS = {
|
|
3312
|
-
|
|
3313
|
-
|
|
3314
|
-
|
|
3315
|
-
|
|
3316
|
-
|
|
3317
|
-
|
|
3318
|
-
|
|
3319
|
-
|
|
3320
|
-
|
|
3321
|
-
|
|
3322
|
-
|
|
3323
|
-
//
|
|
3324
|
-
|
|
3325
|
-
|
|
3326
|
-
|
|
3327
|
-
|
|
3328
|
-
|
|
3329
|
-
|
|
3330
|
-
|
|
3331
|
-
|
|
3332
|
-
|
|
3333
|
-
|
|
3334
|
-
|
|
3335
|
-
|
|
3336
|
-
|
|
3312
|
+
// DEPRECATED LABELS
|
|
3313
|
+
// 'write_file': 'WriteFile',
|
|
3314
|
+
// 'update_file': 'UpdateFile',
|
|
3315
|
+
// 'read_folder': 'ReadFolder',
|
|
3316
|
+
// 'view_file': 'ViewFile',
|
|
3317
|
+
// 'exec_command': 'ExecuteCommand',
|
|
3318
|
+
// 'web_search': 'WebSearch',
|
|
3319
|
+
// 'web_scrape': 'ReadSite',
|
|
3320
|
+
// 'search_keyword': 'SearchKeyword',
|
|
3321
|
+
// 'write_pdf': 'CreatePDF',
|
|
3322
|
+
// 'write_docx': 'CreateDocument',
|
|
3323
|
+
// 'generate_image': 'GenerateImage',
|
|
3324
|
+
// // PascalCase Support
|
|
3325
|
+
// 'WriteFile': 'WriteFile',
|
|
3326
|
+
// 'PatchFile': 'PatchFile',
|
|
3327
|
+
// 'ReadFolder': 'ReadFolder',
|
|
3328
|
+
// 'ReadFile': 'ReadFile',
|
|
3329
|
+
// 'Run': 'RunCommand',
|
|
3330
|
+
// 'WebSearch': 'WebSearch',
|
|
3331
|
+
// 'WebScrape': 'WebScrape',
|
|
3332
|
+
// 'SearchKeyword': 'SearchKeyword',
|
|
3333
|
+
// 'WritePDF': 'WritePDF',
|
|
3334
|
+
// 'WriteDoc': 'WriteDoc',
|
|
3335
|
+
// 'Memory': 'Memory',
|
|
3336
|
+
// 'Chat': 'Chat',
|
|
3337
|
+
// 'GenerateImage': 'GenerateImage'
|
|
3337
3338
|
};
|
|
3338
3339
|
REGEX_INITIAL_THINK = /<\/think>(\r?\n){2}/gi;
|
|
3339
3340
|
REGEX_INITIAL_TOOL = /(\r?\n){2}(?=\[?(?:tool:functions|tool\.functions|agent:generalist|agent\.generalist|\s*turn\s*:))/gi;
|
|
@@ -6703,7 +6704,7 @@ Tool calls: ONLY use [tool:functions.ToolName(args)]
|
|
|
6703
6704
|
|
|
6704
6705
|
**TOOL USAGE POLICY:**
|
|
6705
6706
|
- MAX 4 TOOL CALLS/TURN${mode === "Flux" ? " (Todo: 4+, Run: max 1 or 2 consecutive)" : ""}
|
|
6706
|
-
${mode === "Flux" ? "- Same file, many edits? Prefer multi search-replace in Patch \u2190 **HIGHLY RECOMMENDED**\n- Tool denied?Use `Ask` immediately for user guidance
|
|
6707
|
+
${mode === "Flux" ? '- **Escape quotes: \\" for code strings **\n- ** Literal escapes: Double - escape sequences(e.g., \\\\n) **\n- ** File structure: Real newlines for code formatting**\n- Same file, many edits? Prefer multi search-replace in Patch \u2190 **HIGHLY RECOMMENDED**\n- Tool denied?Use `Ask` immediately for user guidance \u2190 ** MANDATORY **\n- FileMap > ReadFile for efficient file understanding\n- Need specific text ? SearchKeyword > Guessing/ReadFile\n- Huge files ? SearchKeyword > Full Read\n- **Update Todos from realtime progress EVERY TURN**\n' : ""}
|
|
6707
6708
|
- COMMUNICATION TOOLS -
|
|
6708
6709
|
1. [tool:functions.Ask(question="...", optionA="option::description", ...MAX 4)]. Ambiguity: MUST for path divergence, security risk. Ask, don't finish/guess. Suggest best options; no preferences. Keep options short
|
|
6709
6710
|
|
|
@@ -6712,13 +6713,13 @@ ${mode === "Flux" ? "- Same file, many edits? Prefer multi search-replace in Pat
|
|
|
6712
6713
|
2. [tool:functions.WebScrape(url="...")]. Proactive use for specific webpage/docs/api
|
|
6713
6714
|
|
|
6714
6715
|
${mode === "Flux" ? `- WORKSPACE TOOLS (path = relative; FIRST ARGUMENT, path separator: '/') -
|
|
6715
|
-
1. [tool:functions.ReadFile(path="...", startLine="integer", endLine="integer")]. ${aiProvider !== "Google" ? `${isMultiModal ? `Supports images/docs` :
|
|
6716
|
+
1. [tool:functions.ReadFile(path="...", startLine="integer", endLine="integer")]. ${aiProvider !== "Google" ? `${isMultiModal ? `Supports images/docs` : ""}` : `Supports images/docs`}
|
|
6716
6717
|
2. [tool:functions.ReadFolder(path="...", recurse="integer 0-4 optional, default: 0")]. Detailed DIR stats including File Sizes
|
|
6717
|
-
3. [tool:functions.FileMap(path="file")]. Shows file structure
|
|
6718
|
-
4. [tool:functions.PatchFile(path="...", allowMultiple="bool optional, default: false", replaceContent1="...", newContent1="...", ...MAX 15)]. Surgical
|
|
6718
|
+
3. [tool:functions.FileMap(path="file")]. Shows file structure
|
|
6719
|
+
4. [tool:functions.PatchFile(path="...", allowMultiple="bool optional, default: false", replaceContent1="...", newContent1="...", ...MAX 15)]. Surgical patchs, TARGET SMALLEST LINES/SUB-STRINGS. allowMultiple: Replace all matches. Use replaceContent2/newContent2... for multi blocks. Verify DIFFs
|
|
6719
6720
|
5. [tool:functions.WriteFile(path="...", content="...")]. Creates/Overwrites. File Exist? PatchFile > WriteFile
|
|
6720
|
-
6. [tool:functions.SearchKeyword(keyword="...", path="optional, target directory/filename", subString="bool optional, default: false", regex="bool optional, default: auto")].
|
|
6721
|
-
7. [tool:functions.Run(command="...")]. Runs ${osDetected === "Windows" ? isPsAvailable() ? `WINDOWS POWERSHELL` : `WINDOWS CMD
|
|
6721
|
+
6. [tool:functions.SearchKeyword(keyword="...", path="optional, target directory/filename", subString="bool optional, default: false", regex="bool optional, default: auto")]. path limits scope to a file/dir. Find definitions/logic without full reads. Locate relevant code
|
|
6722
|
+
7. [tool:functions.Run(command="...")]. Runs ${osDetected === "Windows" ? isPsAvailable() ? `WINDOWS POWERSHELL` : `WINDOWS CMD` : `BASH`} command. Destructive/Irreversible ops \u2192 Ask user
|
|
6722
6723
|
8. [tool:functions.Todo(method="create/append/get", tasks=[ARRAY OF STRINGS], markDone=[ARRAY OF TASKS])]. Task list, no Markdown in arrays. Analyze request: if long multi-task, break it down & create Todos BEFORE starting. \`tasks\` & \`markDone\` optional with \`get\`. Use \`get + markDone\` to complete tasks, or \`create + markDone\` to create completed tasks. **UPDATE EVERY TURN**${enableSubAgents ? '\n9. [tool:functions.Await(time="seconds")]. For waiting without exiting agent loop, 15s - 180s' : ""}
|
|
6723
6724
|
${_cachedAdvanceRollback ? `
|
|
6724
6725
|
- EMERGENCY SAFETY TOOLS -
|
|
@@ -6732,16 +6733,11 @@ Invocations:
|
|
|
6732
6733
|
- Invoke (async/background, \u22647 parallel). Parallelize long tasks. NEVER repeat while active
|
|
6733
6734
|
- InvokeSync (sync/blocking). Sequential, repetitive or delegated tasks. Saves tokens/cost
|
|
6734
6735
|
1. [agent:generalist.InvokeSync/Invoke(title="...", task="...")]. Task must be detailed: exact file paths, imports/exports, dependencies & folder structure
|
|
6735
|
-
2. [agent:generalist.GetProgress(id="...")]. Check async task progress. If still running, continue your work. Wait exponentially longer between checks
|
|
6736
|
+
2. [agent:generalist.GetProgress(id="...")]. Check async task progress. If still running, continue your work. Wait exponentially longer between checks
|
|
6736
6737
|
3. [agent:generalist.Cancel(id="...")]. Cancel async task ONLY if stalled (2m+) or clearly incorrect` : ""}`.trim() : `- CREATIVE TOOLS (path = relative to CWD & WILL BE FIRST ARGUMENT, path separator: '/') -
|
|
6737
6738
|
1. [tool:functions.WritePDF(path="...", content="...", orientation="...")]. PROACTIVE A4 PAGE BREAKS MUST IN CSS. HTML/CSS for PREMIUM layout, stable margins & headers/footers, NO WATERMARKS
|
|
6738
6739
|
2. [tool:functions.WriteDoc(path="...", content="...")]. A4 Word document, NO WATERMARKS, stable margins & headers/footers
|
|
6739
|
-
- WORKSPACE & SUB AGENT TOOLS ARE NOT AVAILABLE IN FLOW`.trim()}
|
|
6740
|
-
|
|
6741
|
-
- VERIFY TOOL RESULT CONTENTS. Fix errors. No hallucinations
|
|
6742
|
-
- **Escape quotes: \\" for code strings**
|
|
6743
|
-
- **Literal escapes: Double-escape sequences (e.g., \\\\n)**
|
|
6744
|
-
- **File structure: Real newlines for code formatting**`.trim();
|
|
6740
|
+
- WORKSPACE & SUB AGENT TOOLS ARE NOT AVAILABLE IN FLOW`.trim()}`.trim();
|
|
6745
6741
|
};
|
|
6746
6742
|
}
|
|
6747
6743
|
});
|
|
@@ -8244,7 +8240,7 @@ ${projectContextBlock}${isMemoryEnabled ? `
|
|
|
8244
8240
|
- Sensitive files? Ask before Read${isSystemDir ? "\n- PROTECTED DIRECTORY" : ""}
|
|
8245
8241
|
|
|
8246
8242
|
-- CHAT FORMATTING --
|
|
8247
|
-
- GFM Markdown
|
|
8243
|
+
- GFM Markdown ONLY
|
|
8248
8244
|
- Same Language as User Query
|
|
8249
8245
|
- Before tool calls, emit one brief current update. After tool calls, emit no further text this turn
|
|
8250
8246
|
- On completion: summarize changes (why) + edited files${mode === "Flux" ? "" : "\n- Use Kaomojis HEAVILY"}
|
|
@@ -8590,7 +8586,7 @@ var init_history = __esm({
|
|
|
8590
8586
|
const extractedLatest = extractPrompt(latestUserMsg);
|
|
8591
8587
|
const extractedFirst = extractPrompt(firstUserMsg);
|
|
8592
8588
|
if (existingChat && existingChat.prompt) {
|
|
8593
|
-
if (Math.random() < 0.
|
|
8589
|
+
if (Math.random() < 0.5 && extractedLatest) {
|
|
8594
8590
|
prompt = extractedLatest;
|
|
8595
8591
|
} else {
|
|
8596
8592
|
prompt = existingChat.prompt;
|
|
@@ -10161,8 +10157,10 @@ var init_view_file = __esm({
|
|
|
10161
10157
|
let { path: targetPath, StartLine, EndLine, start_line, end_line, startLine, endLine } = parseArgs(args);
|
|
10162
10158
|
const sLine = parseInt(StartLine || start_line || startLine);
|
|
10163
10159
|
const eLine = parseInt(EndLine || end_line || endLine);
|
|
10164
|
-
const
|
|
10165
|
-
const
|
|
10160
|
+
const startProvided = !isNaN(sLine);
|
|
10161
|
+
const endProvided = !isNaN(eLine);
|
|
10162
|
+
let finalStart = sLine || 1;
|
|
10163
|
+
let finalEnd = eLine || (sLine ? sLine + 800 : 800);
|
|
10166
10164
|
if (!targetPath) return 'ERROR: Missing "path" argument for view_file.';
|
|
10167
10165
|
const absolutePath = path13.resolve(process.cwd(), targetPath);
|
|
10168
10166
|
try {
|
|
@@ -10213,6 +10211,10 @@ var init_view_file = __esm({
|
|
|
10213
10211
|
content = content.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
|
|
10214
10212
|
const lines = content.split("\n");
|
|
10215
10213
|
const totalLines = lines.length;
|
|
10214
|
+
if (!startProvided && !endProvided && totalLines > 800) {
|
|
10215
|
+
finalStart = 1;
|
|
10216
|
+
finalEnd = 50;
|
|
10217
|
+
}
|
|
10216
10218
|
const start = Math.max(0, finalStart - 1);
|
|
10217
10219
|
const end = Math.min(totalLines, finalEnd);
|
|
10218
10220
|
const resultLines = lines.slice(start, end);
|
|
@@ -15286,7 +15288,7 @@ ${currentSummary}
|
|
|
15286
15288
|
const ideCtx = await getIDEContext();
|
|
15287
15289
|
let ideBlock = "";
|
|
15288
15290
|
if (isBridgeConnected()) {
|
|
15289
|
-
ideBlock = "[IDE CONTEXT]\n";
|
|
15291
|
+
ideBlock = "[ADDITIONAL IDE CONTEXT]\n";
|
|
15290
15292
|
if (ideCtx.file_focused !== "none") {
|
|
15291
15293
|
const relFocused = path25.relative(process.cwd(), ideCtx.file_focused);
|
|
15292
15294
|
const relOpened = (ideCtx.opened_editors || []).map((p) => {
|
|
@@ -15484,7 +15486,7 @@ ${ideCtx.warnings}
|
|
|
15484
15486
|
lineCount = fs26.readFileSync(absPath, "utf8").split(/\r\n|\r|\n/).length;
|
|
15485
15487
|
} catch (e) {
|
|
15486
15488
|
}
|
|
15487
|
-
if (lineCount >
|
|
15489
|
+
if (lineCount > 300) {
|
|
15488
15490
|
const label = `\u21B7 Skipped (Too Large): ${path25.basename(filePath)}`;
|
|
15489
15491
|
let terminalWidth = 115;
|
|
15490
15492
|
if (process.stdout.isTTY) {
|
|
@@ -15498,9 +15500,9 @@ ${ideCtx.warnings}
|
|
|
15498
15500
|
}
|
|
15499
15501
|
}
|
|
15500
15502
|
const finalStart = startLine !== null ? startLine : 1;
|
|
15501
|
-
let finalEnd = endLine !== null ? endLine : startLine !== null ? startLine : finalStart +
|
|
15502
|
-
if (finalEnd - finalStart >
|
|
15503
|
-
finalEnd = finalStart +
|
|
15503
|
+
let finalEnd = endLine !== null ? endLine : startLine !== null ? startLine : finalStart + 299;
|
|
15504
|
+
if (finalEnd - finalStart > 300) {
|
|
15505
|
+
finalEnd = finalStart + 300;
|
|
15504
15506
|
}
|
|
15505
15507
|
const argsStr = `path=${JSON.stringify(filePath)}, startLine=${finalStart}, endLine=${finalEnd}`;
|
|
15506
15508
|
const result = await view_file(argsStr, { isMultiModal: isSupported });
|
|
@@ -15555,7 +15557,7 @@ ${ideCtx.warnings}
|
|
|
15555
15557
|
}
|
|
15556
15558
|
let taggedContextStr = "";
|
|
15557
15559
|
if (taggedContextBlocks.length > 0) {
|
|
15558
|
-
taggedContextStr = "[TAGGED FILE CONTENTS] Auto Read
|
|
15560
|
+
taggedContextStr = "[TAGGED FILE CONTENTS] Auto Read User Tagged files by System, No need to re-read\n" + taggedContextBlocks.join("\n\n") + "\n[/TAGGED FILE CONTENTS]\n";
|
|
15559
15561
|
}
|
|
15560
15562
|
const osDetected = process.platform === "win32" ? "Windows" : process.platform === "darwin" ? "macOS" : "Linux";
|
|
15561
15563
|
const cleanPromptForModel = cleanAgentText.replace(/\\(@\[[^\]]+\])/g, "$1");
|
|
@@ -16447,7 +16449,11 @@ ${ideErr} [/ERROR]`;
|
|
|
16447
16449
|
const content = fs26.readFileSync(absPath, "utf8");
|
|
16448
16450
|
const lines = content.split("\n").length;
|
|
16449
16451
|
totalLines = lines;
|
|
16450
|
-
|
|
16452
|
+
if (!rawStart && !rawEnd && lines > 800) {
|
|
16453
|
+
actualEndLine = Math.min(50, lines);
|
|
16454
|
+
} else {
|
|
16455
|
+
actualEndLine = Math.min(eLine, lines);
|
|
16456
|
+
}
|
|
16451
16457
|
}
|
|
16452
16458
|
} catch (e) {
|
|
16453
16459
|
}
|
|
@@ -17673,7 +17679,7 @@ Error Log can be found in ${path25.join(LOGS_DIR, "agent", "error.log")}`);
|
|
|
17673
17679
|
"filemap": '- [tool:functions.FileMap(path="file")]. Shows file structure, functions, class, import/export, variables',
|
|
17674
17680
|
"patchfile": '- [tool:functions.PatchFile(path="...", allowMultiple="bool optional, default: false", replaceContent1="...", newContent1="...", ...MAX 15)]. Surgical patch. allowMultiple: Replace all matches. Multiple patches same file? Use replaceContent2/newContent2... Verify DIFFs',
|
|
17675
17681
|
"writefile": '- [tool:functions.WriteFile(path="...", content="...")]. Creates/Overwrites. File Exist? PatchFile > WriteFile. VERIFY IMPORTS',
|
|
17676
|
-
"searchkeyword": '- [tool:functions.SearchKeyword(keyword="...", path="optional, target directory/filename", subString="bool optional, default: false", regex="bool optional, default: auto")].
|
|
17682
|
+
"searchkeyword": '- [tool:functions.SearchKeyword(keyword="...", path="optional, target directory/filename", subString="bool optional, default: false", regex="bool optional, default: auto")]. path limits scope to a file/dir. Find definitions/logic without full reads. Locate relevant code',
|
|
17677
17683
|
"websearch": '- [tool:functions.WebSearch(query="...", aiMode="bool optional, default: false", limit="integer 3-10, aiMode: exclude")]. Usage: unknown info/docs. aiMode: LLM search',
|
|
17678
17684
|
"webscrape": '- [tool:functions.WebScrape(url="...")]. Proactive use for specific webpage/docs/api',
|
|
17679
17685
|
"ask": `- [tool:functions.Ask(question="...", optionA="option::description", ...MAX 4)]. Ambiguity: MUST for path divergence, security risk. Ask, don't finish/guess. Suggest best options; no preferences. Keep options short`
|
|
@@ -17780,6 +17786,11 @@ ${cleanResponse}
|
|
|
17780
17786
|
label = `\u2714 \x1B[95mSearched\x1B[0m`;
|
|
17781
17787
|
} else if (normalizedToolName === "web_scrape" || normalizedToolName === "webscrape") {
|
|
17782
17788
|
label = `\u2714 \x1B[95mScraped\x1B[0m`;
|
|
17789
|
+
} else if (normalizedToolName === "search_keyword" || normalizedToolName === "searchkeyword") {
|
|
17790
|
+
const pArgs = parseArgs(toolCall.args);
|
|
17791
|
+
const keyword = pArgs.keyword || "";
|
|
17792
|
+
const keywordPath = pArgs.path || "";
|
|
17793
|
+
label = `${keyword ? "\u2714" : "\u2718"} \x1B[95mSearched\x1B[0m: ${keyword || "No Query"}${keywordPath ? ` \u2192 ${keywordPath}` : ""}`;
|
|
17783
17794
|
} else if (normalizedToolName === "view_file" || normalizedToolName === "viewfile" || normalizedToolName === "readfile") {
|
|
17784
17795
|
const path27 = parseArgs(toolCall.args).path || "";
|
|
17785
17796
|
label = `\u2714 \x1B[95mRead\x1B[0m: ${path27}`;
|
|
@@ -19895,6 +19906,19 @@ function App({ args = [] }) {
|
|
|
19895
19906
|
}
|
|
19896
19907
|
}
|
|
19897
19908
|
if (key.tab && activeView === "chat") {
|
|
19909
|
+
if (suggestions.length > 0) {
|
|
19910
|
+
const nextMatch = suggestions[selectedIndex] || suggestions[0];
|
|
19911
|
+
const parts = input.split(" ");
|
|
19912
|
+
if (parts.length === 1) {
|
|
19913
|
+
setInput(nextMatch.cmd + " ");
|
|
19914
|
+
} else {
|
|
19915
|
+
const parentParts = parts.slice(0, -1);
|
|
19916
|
+
setInput(parentParts.join(" ") + " " + nextMatch.cmd + " ");
|
|
19917
|
+
}
|
|
19918
|
+
setSelectedIndex(0);
|
|
19919
|
+
setInputKey((prev) => prev + 1);
|
|
19920
|
+
return;
|
|
19921
|
+
}
|
|
19898
19922
|
}
|
|
19899
19923
|
if (key.ctrl && inputText === "c" && activeView !== "exit") {
|
|
19900
19924
|
if (input.length > 0) {
|
|
@@ -20970,7 +20994,7 @@ ${cleanText}`, color: "magenta" }];
|
|
|
20970
20994
|
case "/chats": {
|
|
20971
20995
|
const run = async () => {
|
|
20972
20996
|
const history = await loadHistory();
|
|
20973
|
-
const list = Object.entries(history).map(([id, info]) => `\u2022 ${id}: ${info.name}`).join("\n");
|
|
20997
|
+
const list = Object.entries(history).sort((a, b) => (b[1].updatedAt || 0) - (a[1].updatedAt || 0)).map(([id, info]) => `\u2022 ${id}: ${info.name}`).join("\n");
|
|
20974
20998
|
setMessages((prev) => {
|
|
20975
20999
|
setCompletedIndex(prev.length + 1);
|
|
20976
21000
|
return [...prev, { id: Date.now(), role: "system", text: `[HISTORY] Saved Chats:
|
|
@@ -22151,7 +22175,8 @@ Selection: ${val}`,
|
|
|
22151
22175
|
);
|
|
22152
22176
|
};
|
|
22153
22177
|
const renderProgressBar = (label, current, limit) => {
|
|
22154
|
-
const
|
|
22178
|
+
const actualPercent = limit > 0 ? Math.min(100, current / limit * 100) : 0;
|
|
22179
|
+
const percent = Math.round(actualPercent);
|
|
22155
22180
|
const barWidth = 15;
|
|
22156
22181
|
const filledCount = Math.round(percent / 100 * barWidth);
|
|
22157
22182
|
const barStr = "\u2588".repeat(filledCount) + "\u2591".repeat(Math.max(0, barWidth - filledCount));
|
|
@@ -22164,7 +22189,15 @@ Selection: ${val}`,
|
|
|
22164
22189
|
const isTokens = label.toLowerCase().includes("token");
|
|
22165
22190
|
const displayLimit = shouldClearValue(limit) ? "\u221E" : isTokens ? formatTokens(limit) : limit;
|
|
22166
22191
|
const displayCurrent = isTokens ? formatTokens(current) : current;
|
|
22167
|
-
|
|
22192
|
+
let displayPercent;
|
|
22193
|
+
if (actualPercent === 0) {
|
|
22194
|
+
displayPercent = "0%";
|
|
22195
|
+
} else if (actualPercent > 0 && actualPercent < 1) {
|
|
22196
|
+
displayPercent = "<1%";
|
|
22197
|
+
} else {
|
|
22198
|
+
displayPercent = `${percent}%`;
|
|
22199
|
+
}
|
|
22200
|
+
return /* @__PURE__ */ React16.createElement(Box14, { flexDirection: "row", paddingLeft: 4, key: label }, /* @__PURE__ */ React16.createElement(Box14, { width: 18 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.textMuted }, label, ": ")), /* @__PURE__ */ React16.createElement(Text16, { color: barColor }, barStr), /* @__PURE__ */ React16.createElement(Text16, { color: colors.textMuted }, " ", displayPercent, " (", displayCurrent, "/", displayLimit, ")"));
|
|
22168
22201
|
};
|
|
22169
22202
|
const renderActiveView = () => {
|
|
22170
22203
|
switch (activeView) {
|
|
@@ -22466,7 +22499,7 @@ Selection: ${val}`,
|
|
|
22466
22499
|
}
|
|
22467
22500
|
const resetDate = new Date(today.getFullYear(), resetMonth, resetDay);
|
|
22468
22501
|
const monthName = resetDate.toLocaleString("default", { month: "short" });
|
|
22469
|
-
resetInfo =
|
|
22502
|
+
resetInfo = `${monthName}-${resetDay}`;
|
|
22470
22503
|
}
|
|
22471
22504
|
return /* @__PURE__ */ React16.createElement(Box14, { flexDirection: "column", borderStyle: "round", borderColor: colors.borderMuted, padding: 1, width: "100%" }, /* @__PURE__ */ React16.createElement(Box14, { marginBottom: 1, justifyContent: "space-between", width: "100%" }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.text, bold: true, underline: true }, "BUDGET LIMIT STATUS"), /* @__PURE__ */ React16.createElement(Text16, { color: colors.textMuted }, "[ ESC to Close ]")), limitsNotSet ? /* @__PURE__ */ React16.createElement(Box14, { padding: 1, justifyContent: "center", alignItems: "center", width: "100%" }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.text, bold: true }, "LIMITS NOT SET")) : usingProviderBudgets && configuredProviders.length > 0 ? /* @__PURE__ */ React16.createElement(Box14, { flexDirection: "column", gap: 1, width: "100%" }, configuredProviders.map((prov) => {
|
|
22472
22505
|
const pb = providerBudgetsMap[prov];
|
|
@@ -22483,7 +22516,7 @@ Selection: ${val}`,
|
|
|
22483
22516
|
provMonthlyCurrent += monthlyModels[m]?.tokens || 0;
|
|
22484
22517
|
}
|
|
22485
22518
|
return /* @__PURE__ */ React16.createElement(Box14, { key: prov, flexDirection: "column", borderStyle: "single", borderColor: colors.borderMuted, paddingX: 1, width: "100%" }, /* @__PURE__ */ React16.createElement(Box14, { marginBottom: 0 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.primary, bold: true }, "\u25C6 ", prov)), renderProgressBar("Daily Requests", provReqCurrent, pb.agentLimit || 99999999, "cyan"), renderProgressBar("Daily Tokens", provTokenCurrent, pb.tokenLimit || 99999999999999, "green"), renderProgressBar("Monthly Tokens", provMonthlyCurrent, pb.monthlyTokenLimit || 99999999999999, "yellow"));
|
|
22486
|
-
}), resetInfo ? /* @__PURE__ */ React16.createElement(Box14, { marginLeft: 4 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.textMuted }, "Monthly Reset
|
|
22519
|
+
}), resetInfo ? /* @__PURE__ */ React16.createElement(Box14, { marginLeft: 4 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.textMuted }, "Monthly Reset: "), /* @__PURE__ */ React16.createElement(Text16, { color: colors.accent || "magenta", bold: true }, resetInfo)) : /* @__PURE__ */ React16.createElement(Box14, { marginLeft: 4 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.textMuted }, "Monthly Reset: "), /* @__PURE__ */ React16.createElement(Text16, { color: colors.secondary || "blue", bold: true }, "Rolling 30-Day Window"))) : /* @__PURE__ */ React16.createElement(Box14, { flexDirection: "column", borderStyle: "single", borderColor: colors.borderMuted, paddingX: 1, width: "100%" }, renderProgressBar("Daily Requests", reqCurrent, reqLimit, "cyan"), renderProgressBar("Daily Tokens", tokenCurrent, tokenLimit, "green"), renderProgressBar("Monthly Tokens", monthlyCurrent, monthlyLimit, "yellow"), resetInfo ? /* @__PURE__ */ React16.createElement(Box14, { marginLeft: 4, marginTop: 1 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.textMuted }, "Monthly Reset: "), /* @__PURE__ */ React16.createElement(Text16, { color: colors.accent || "magenta", bold: true }, resetInfo)) : /* @__PURE__ */ React16.createElement(Box14, { marginLeft: 4, marginTop: 1 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.textMuted }, "Monthly Reset: "), /* @__PURE__ */ React16.createElement(Text16, { color: colors.secondary || "blue", bold: true }, "Rolling 30-Day Window"))));
|
|
22487
22520
|
}
|
|
22488
22521
|
case "input":
|
|
22489
22522
|
return /* @__PURE__ */ React16.createElement(Box14, { flexDirection: "column", borderStyle: "round", borderColor: colors.borderMuted, padding: 0, width: "100%" }, /* @__PURE__ */ React16.createElement(Box14, { paddingX: 1 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.text, bold: true }, "DATA CONFIGURATION")), inputConfig?.note && /* @__PURE__ */ React16.createElement(Box14, { paddingX: 1, marginBottom: 1 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.textMuted, italic: true }, inputConfig.note)), /* @__PURE__ */ React16.createElement(Box14, { paddingX: 1, flexDirection: "row" }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.text, bold: true }, inputConfig?.label, " "), /* @__PURE__ */ React16.createElement(
|
package/package.json
CHANGED
|
@@ -1,73 +1,73 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "fluxflow-cli",
|
|
3
|
-
"version": "3.14.
|
|
4
|
-
"date": "2026-07-
|
|
5
|
-
"description": "A High-Fidelity Agentic CLI with Sub-Agents for the Flux Era.",
|
|
6
|
-
"keywords": [
|
|
7
|
-
"ai",
|
|
8
|
-
"agent",
|
|
9
|
-
"terminal",
|
|
10
|
-
"cli",
|
|
11
|
-
"gemini",
|
|
12
|
-
"ink",
|
|
13
|
-
"flux",
|
|
14
|
-
"fluxflow"
|
|
15
|
-
],
|
|
16
|
-
"license": "MIT",
|
|
17
|
-
"repository": {
|
|
18
|
-
"type": "git",
|
|
19
|
-
"url": "git+https://github.com/KushalRoyChowdhury/fluxflow-cli.git"
|
|
20
|
-
},
|
|
21
|
-
"engines": {
|
|
22
|
-
"node": ">=20",
|
|
23
|
-
"vscode": "^1.90.0"
|
|
24
|
-
},
|
|
25
|
-
"files": [
|
|
26
|
-
"dist",
|
|
27
|
-
"README.md",
|
|
28
|
-
"package.json",
|
|
29
|
-
"ARCHITECTURE.md",
|
|
30
|
-
"TOOLS.md",
|
|
31
|
-
"UI_FEATURES.md",
|
|
32
|
-
"cat.txt",
|
|
33
|
-
".puppeteerrc.cjs",
|
|
34
|
-
"flux-flow.cjs",
|
|
35
|
-
"model_config.json"
|
|
36
|
-
],
|
|
37
|
-
"type": "module",
|
|
38
|
-
"bin": {
|
|
39
|
-
"fluxflow-cli": "dist/fluxflow.js",
|
|
40
|
-
"fluxflow": "dist/fluxflow.js"
|
|
41
|
-
},
|
|
42
|
-
"scripts": {
|
|
43
|
-
"start": "tsx ./src/cli.jsx",
|
|
44
|
-
"build": "esbuild ./src/cli.jsx --bundle --platform=node --format=esm --outfile=./dist/fluxflow.js --external:react --external:ink --external:chalk --external:fs-extra --external:gradient-string --external:ink-text-input --external:ink-select-input --external:@google/genai --external:zod --external:nanoid --external:puppeteer --external:pdf-lib --external:node-pty --external:html-to-docx --external:typescript --external:ws --external:web-tree-sitter --external:diff --external:dotenv"
|
|
45
|
-
},
|
|
46
|
-
"dependencies": {
|
|
47
|
-
"@google/genai": "^1.52.0",
|
|
48
|
-
"chalk": "^5.6.2",
|
|
49
|
-
"diff": "^9.0.0",
|
|
50
|
-
"dotenv": "^17.4.2",
|
|
51
|
-
"fs-extra": "^11.3.4",
|
|
52
|
-
"gradient-string": "^3.0.0",
|
|
53
|
-
"html-to-docx": "^1.8.0",
|
|
54
|
-
"ink": "^7.0.1",
|
|
55
|
-
"ink-gradient": "^4.0.1",
|
|
56
|
-
"ink-select-input": "^6.2.0",
|
|
57
|
-
"ink-spinner": "^5.0.0",
|
|
58
|
-
"ink-text-input": "^6.0.0",
|
|
59
|
-
"nanoid": "^5.1.9",
|
|
60
|
-
"node-pty": "^1.1.0",
|
|
61
|
-
"pdf-lib": "^1.17.1",
|
|
62
|
-
"puppeteer": "24.43.1",
|
|
63
|
-
"react": "^19.2.5",
|
|
64
|
-
"web-tree-sitter": "^0.25.10",
|
|
65
|
-
"ws": "^8.21.0",
|
|
66
|
-
"zod": "^4.3.6"
|
|
67
|
-
},
|
|
68
|
-
"devDependencies": {
|
|
69
|
-
"@types/react": "^19.2.14",
|
|
70
|
-
"esbuild": "^0.28.0",
|
|
71
|
-
"tsx": "^4.21.0"
|
|
72
|
-
}
|
|
73
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "fluxflow-cli",
|
|
3
|
+
"version": "3.14.2",
|
|
4
|
+
"date": "2026-07-31",
|
|
5
|
+
"description": "A High-Fidelity Agentic CLI with Sub-Agents for the Flux Era.",
|
|
6
|
+
"keywords": [
|
|
7
|
+
"ai",
|
|
8
|
+
"agent",
|
|
9
|
+
"terminal",
|
|
10
|
+
"cli",
|
|
11
|
+
"gemini",
|
|
12
|
+
"ink",
|
|
13
|
+
"flux",
|
|
14
|
+
"fluxflow"
|
|
15
|
+
],
|
|
16
|
+
"license": "MIT",
|
|
17
|
+
"repository": {
|
|
18
|
+
"type": "git",
|
|
19
|
+
"url": "git+https://github.com/KushalRoyChowdhury/fluxflow-cli.git"
|
|
20
|
+
},
|
|
21
|
+
"engines": {
|
|
22
|
+
"node": ">=20",
|
|
23
|
+
"vscode": "^1.90.0"
|
|
24
|
+
},
|
|
25
|
+
"files": [
|
|
26
|
+
"dist",
|
|
27
|
+
"README.md",
|
|
28
|
+
"package.json",
|
|
29
|
+
"ARCHITECTURE.md",
|
|
30
|
+
"TOOLS.md",
|
|
31
|
+
"UI_FEATURES.md",
|
|
32
|
+
"cat.txt",
|
|
33
|
+
".puppeteerrc.cjs",
|
|
34
|
+
"flux-flow.cjs",
|
|
35
|
+
"model_config.json"
|
|
36
|
+
],
|
|
37
|
+
"type": "module",
|
|
38
|
+
"bin": {
|
|
39
|
+
"fluxflow-cli": "dist/fluxflow.js",
|
|
40
|
+
"fluxflow": "dist/fluxflow.js"
|
|
41
|
+
},
|
|
42
|
+
"scripts": {
|
|
43
|
+
"start": "tsx ./src/cli.jsx",
|
|
44
|
+
"build": "esbuild ./src/cli.jsx --bundle --platform=node --format=esm --outfile=./dist/fluxflow.js --external:react --external:ink --external:chalk --external:fs-extra --external:gradient-string --external:ink-text-input --external:ink-select-input --external:@google/genai --external:zod --external:nanoid --external:puppeteer --external:pdf-lib --external:node-pty --external:html-to-docx --external:typescript --external:ws --external:web-tree-sitter --external:diff --external:dotenv"
|
|
45
|
+
},
|
|
46
|
+
"dependencies": {
|
|
47
|
+
"@google/genai": "^1.52.0",
|
|
48
|
+
"chalk": "^5.6.2",
|
|
49
|
+
"diff": "^9.0.0",
|
|
50
|
+
"dotenv": "^17.4.2",
|
|
51
|
+
"fs-extra": "^11.3.4",
|
|
52
|
+
"gradient-string": "^3.0.0",
|
|
53
|
+
"html-to-docx": "^1.8.0",
|
|
54
|
+
"ink": "^7.0.1",
|
|
55
|
+
"ink-gradient": "^4.0.1",
|
|
56
|
+
"ink-select-input": "^6.2.0",
|
|
57
|
+
"ink-spinner": "^5.0.0",
|
|
58
|
+
"ink-text-input": "^6.0.0",
|
|
59
|
+
"nanoid": "^5.1.9",
|
|
60
|
+
"node-pty": "^1.1.0",
|
|
61
|
+
"pdf-lib": "^1.17.1",
|
|
62
|
+
"puppeteer": "24.43.1",
|
|
63
|
+
"react": "^19.2.5",
|
|
64
|
+
"web-tree-sitter": "^0.25.10",
|
|
65
|
+
"ws": "^8.21.0",
|
|
66
|
+
"zod": "^4.3.6"
|
|
67
|
+
},
|
|
68
|
+
"devDependencies": {
|
|
69
|
+
"@types/react": "^19.2.14",
|
|
70
|
+
"esbuild": "^0.28.0",
|
|
71
|
+
"tsx": "^4.21.0"
|
|
72
|
+
}
|
|
73
|
+
}
|