fluxflow-cli 3.0.9 → 3.0.11
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 +54 -9
- package/package.json +2 -2
package/dist/fluxflow.js
CHANGED
|
@@ -5153,10 +5153,10 @@ Invocation Types:
|
|
|
5153
5153
|
- invokeSync (sync, blocking main agent loop). Usage: Repeatetive work, Sequential tasks, Task delegation. Huge tokens/costs savings
|
|
5154
5154
|
|
|
5155
5155
|
1. [agent:generalist.invokeSync/invoke(title="...", task="...")]. Task must me detailed, including exact file paths, imports/exports, dependency, folder structure
|
|
5156
|
-
2. [agent:generalist.getProgress(id="...")]. Usage: Check progress of async subagent task, taking time?
|
|
5156
|
+
2. [agent:generalist.getProgress(id="...")]. Usage: Check progress of async subagent task, taking time? continue your task, MUST await (exponentially longer after 1st check, eg. 15s, 30s, 45s ...) than spamming getProgress. NEVER FINISH WITHOUT 'AWAIT' WHILE SUBAGENT WORKING`.trim() : `- CREATIVE TOOLS (path = relative to CWD & WILL BE FIRST ARGUMENT, path separator: '/') -
|
|
5157
5157
|
1. [tool:functions.WritePDF(path="...", content="...", orientation="...")]. PROACTIVE A4 PAGE BREAKS MUST IN CSS. HTML/CSS for PREMIUM layout
|
|
5158
5158
|
2. [tool:functions.WriteDoc(path="...", content="...")]. A4 Word document
|
|
5159
|
-
- WORKSPACE TOOLS ARE NOT AVAILABLE IN FLOW`.trim()}
|
|
5159
|
+
- WORKSPACE & SUB AGENT TOOLS ARE NOT AVAILABLE IN FLOW`.trim()}
|
|
5160
5160
|
|
|
5161
5161
|
- VERIFY TOOL RESULT CONTENTS. Fix errors. No hallucinations
|
|
5162
5162
|
- Escape quotes: \\" for code strings
|
|
@@ -6394,7 +6394,7 @@ var init_thinking_prompts = __esm({
|
|
|
6394
6394
|
"src/data/thinking_prompts.json"() {
|
|
6395
6395
|
thinking_prompts_default = {
|
|
6396
6396
|
xHigh: "EFFORT LEVEL: HIGH\nThink in a continuous, relentless analytical monologue. Engage in adversarial self interrogation that treats every assumption as hostile until proven:\nDeconstruct requirements into atomic invariants. Trace every implicit dependency, side effect, and state mutation. Map the entire dependency graph and identify circular dependencies or tight coupling before they manifest\nEvaluate algorithmic complexity (time/space) for every operation. Consider memory models, cache locality, and allocation patterns. For concurrent systems, reason through race conditions, deadlocks, and memory ordering\nFormulate solutions by comparing multiple architectural approaches. Explicitly evaluate trade offs, monolithic vs modular, eager vs lazy, mutable vs immutable, sync vs async. Choose based on measured criteria, not intuition\nMentally execute the solution at multiple scales. What breaks at 10x load? 100x? Resource exhaustion? Trace error propagation paths through every layer\nActively attempt to falsify your own logic. Steel man the opposite approach\nReason about observability & vulnarability\nConsider future evolution, what changes will this architecture resist vs accommodate? Where are the extension points? What will break when requirements inevitably change?\nMap out implementation with surgical precision, exact file structure, module boundaries, interface contracts, error types, and test strategies before writing\nRULES:\n- Ruthlessly question every architectural choice. Default to skepticism\n- Think in terms of invariants, contracts, and failure modes, not just happy paths\n- Verify ALL imports and system stability, AVOID errors\n- MANDATORY THINKING: Full reasoning required for ALL requests/greetings",
|
|
6397
|
-
High: "EFFORT LEVEL: HIGH\nThink in a rigorous, technically grounded monologue within <think>...</think
|
|
6397
|
+
High: "EFFORT LEVEL: HIGH\nThink in a rigorous, technically grounded monologue within <think>...</think> \u2190 **MANDATORY**\nBreak the objective into verifiable steps with clear success criteria. Identify the critical path and potential bottlenecks\nMentally compile and execute your approach. Check for: missing imports, undefined behavior, type mismatches, unhandled errors, and resource cleanup. Trace data flow from input to output, noting transformations\nRecognize design patterns and anti patterns. If you see God objects, tight coupling, or premature optimization, call it out and refactor mentally before committing\nEvaluate performance characteristics. Will this scale? Are there O(n\xB2) operations hiding in innocent looking code? Where are the allocation hotspots?\nConsider the error surface, what can fail and how? Design error handling that preserves invariants and provides actionable feedback\nReview your architecture for, separation of concerns, single responsibility, dependency inversion, and interface segregation. Ensure clean abstractions with minimal coupling\nRULES:\n- NO HEADINGS/MARKERS/LISTS\n- Continuous analytical flow\n- Verify correctness through first principles reasoning, not pattern matching\n- Actively search for ways your solution could fail or degrade\n- Verify ALL imports and system stability, AVOID ANY Syntax errors, re-read TOOL RESULTS/files to verify\n- MANDATORY THINKING: Full technical verification for all tasks/greetings",
|
|
6398
6398
|
Medium: "EFFORT LEVEL: MEDIUM\nThink in a focused, technically-aware monologue within <think>...</think>\nIdentify the most direct path that satisfies requirements without over-engineering\nQuickly scan for obvious issues, missing error handling, incorrect input assumptions, forgotten edge cases, or missing dependencies\nVerify the solution is appropriately modular with cohesive changes\nOutline the concrete changes, which files, which functions, what the key logic looks like\nRULES:\n- NO HEADINGS/MARKERS/LISTS\n- Clean logical stream\n- Efficient but deliberate. Focus energy on actionable implementation details\n- Verify ALL imports and system stability, AVOID ANY Syntax errors, re-read TOOL RESULTS/files to verify\n- MANDATORY THINKING: Brief verification for technical tasks/greetings",
|
|
6399
6399
|
Minimal: "EFFORT LEVEL: LOW\nThink in a quick, focused monologue within <think>...</think>. Just verify the basics:\nConfirm what the user wants and whether it's straightforward or has hidden complexity\nIdentify the specific tool, file, or action needed\nCheck for any obvious correctness issues before acting\nRULES:\n- NO HEADINGS/MARKERS/LISTS\n- Few lines of clear thought\n- Just enough thinking to avoid obvious mistakes\n- Verify ALL imports and system stability, AVOID ANY Syntax errors, re-read TOOL RESULTS/files to verify\n- Suitable for simple requests/greetings",
|
|
6400
6400
|
Off: "EFFORT LEVEL: LOWEST\nNo thinking. Immediate response\nRULES:\n- Verify ALL imports and system stability, AVOID ANY Syntax errors, re-read TOOL RESULTS/files to verify"
|
|
@@ -9618,6 +9618,7 @@ var init_invoke = __esm({
|
|
|
9618
9618
|
title: title || task.substring(0, 30),
|
|
9619
9619
|
task,
|
|
9620
9620
|
status: "running",
|
|
9621
|
+
lastChunkTime: Date.now(),
|
|
9621
9622
|
progress: []
|
|
9622
9623
|
// Array of arrays containing logs for each turn
|
|
9623
9624
|
};
|
|
@@ -9626,7 +9627,16 @@ var init_invoke = __esm({
|
|
|
9626
9627
|
context.onSubagentUpdate();
|
|
9627
9628
|
}
|
|
9628
9629
|
let currentTurnLogs = [];
|
|
9629
|
-
const subagentContext = {
|
|
9630
|
+
const subagentContext = {
|
|
9631
|
+
...context,
|
|
9632
|
+
onVisualFeedback: null,
|
|
9633
|
+
onTokenChunk: () => {
|
|
9634
|
+
taskEntry.lastChunkTime = Date.now();
|
|
9635
|
+
if (context.onSubagentUpdate) {
|
|
9636
|
+
context.onSubagentUpdate();
|
|
9637
|
+
}
|
|
9638
|
+
}
|
|
9639
|
+
};
|
|
9630
9640
|
runSubagent2(task, subagentContext, model, allowedTools, 20, (logMessage) => {
|
|
9631
9641
|
if (logMessage.startsWith("[Subagent Turn")) {
|
|
9632
9642
|
if (currentTurnLogs.length > 0) {
|
|
@@ -11215,6 +11225,9 @@ ${originalTextProcessed.length > USER_CONTEXT_LENGTH ? "... (truncated) ...\n\n"
|
|
|
11215
11225
|
stream = genStream;
|
|
11216
11226
|
}
|
|
11217
11227
|
for await (const chunk of stream) {
|
|
11228
|
+
if (settings && typeof settings.onTokenChunk === "function") {
|
|
11229
|
+
settings.onTokenChunk();
|
|
11230
|
+
}
|
|
11218
11231
|
if (chunk.candidates?.[0]?.content?.parts) {
|
|
11219
11232
|
for (const part of chunk.candidates[0].content.parts) {
|
|
11220
11233
|
if (part.text && !part.thought) fullText += part.text;
|
|
@@ -12027,7 +12040,8 @@ ${boxMid}`) };
|
|
|
12027
12040
|
const boxMid = boxLines.map((line) => `${line.padEnd(boxWidth - 2).substring(0, boxWidth - 2)}`).join("\n");
|
|
12028
12041
|
const boxBottom = `${" ".repeat(boxWidth)}`;
|
|
12029
12042
|
yield { type: "visual_feedback", content: colorMainWords(`${boxBottom}
|
|
12030
|
-
${boxMid}
|
|
12043
|
+
${boxMid}
|
|
12044
|
+
`) };
|
|
12031
12045
|
}
|
|
12032
12046
|
}
|
|
12033
12047
|
}
|
|
@@ -12526,6 +12540,9 @@ ${ideErr} [/ERROR]`;
|
|
|
12526
12540
|
abortPromise
|
|
12527
12541
|
]);
|
|
12528
12542
|
if (done) break;
|
|
12543
|
+
if (settings && typeof settings.onTokenChunk === "function") {
|
|
12544
|
+
settings.onTokenChunk();
|
|
12545
|
+
}
|
|
12529
12546
|
if (isFirstChunk) {
|
|
12530
12547
|
yield { type: "status", content: "Thinking..." };
|
|
12531
12548
|
isFirstChunk = false;
|
|
@@ -12883,9 +12900,11 @@ ${ideErr} [/ERROR]`;
|
|
|
12883
12900
|
const action = normToolName === "write_file" ? "Created" : "Edited";
|
|
12884
12901
|
label2 = `\u2714 ${action}: ${parseArgs(toolCall.args).path || "..."}`;
|
|
12885
12902
|
} else if (normToolName === "write_pdf") {
|
|
12886
|
-
label2 = `\u2714 Created: ${parseArgs(toolCall.args).path || "..."}
|
|
12903
|
+
label2 = `\u2714 Created: ${parseArgs(toolCall.args).path || "..."}
|
|
12904
|
+
`;
|
|
12887
12905
|
} else if (normToolName === "write_docx") {
|
|
12888
|
-
label2 = `\u2714 Created: ${parseArgs(toolCall.args).path || "..."}
|
|
12906
|
+
label2 = `\u2714 Created: ${parseArgs(toolCall.args).path || "..."}
|
|
12907
|
+
`;
|
|
12889
12908
|
} else if (normToolName === "file_map") {
|
|
12890
12909
|
label2 = `\u2714 Get Map: ${parseArgs(toolCall.args).path || "..."}`;
|
|
12891
12910
|
} else if (normToolName.toLowerCase() === "search_keyword" || normToolName.toLowerCase() === "todo") {
|
|
@@ -13523,6 +13542,7 @@ ${boxBottom}`}`) };
|
|
|
13523
13542
|
isMultiModal: isModelMultimodal(targetModel),
|
|
13524
13543
|
onVisualFeedback: settings.onVisualFeedback,
|
|
13525
13544
|
onSubagentUpdate: settings.onSubagentUpdate,
|
|
13545
|
+
onTokenChunk: settings.onTokenChunk,
|
|
13526
13546
|
modelName: targetModel,
|
|
13527
13547
|
aiProvider: settings.aiProvider,
|
|
13528
13548
|
apiKey: settings.apiKey,
|
|
@@ -17475,6 +17495,9 @@ ${timestamp}` };
|
|
|
17475
17495
|
apiTier,
|
|
17476
17496
|
cols: terminalSize.columns - 6,
|
|
17477
17497
|
rows: 30,
|
|
17498
|
+
onTokenChunk: () => {
|
|
17499
|
+
setLastChunkTime(Date.now());
|
|
17500
|
+
},
|
|
17478
17501
|
onVisualFeedback: (content) => {
|
|
17479
17502
|
setMessages((prev) => {
|
|
17480
17503
|
const updatedPrev = prev.map((m) => m.isStreaming ? { ...m, isStreaming: false } : m);
|
|
@@ -19052,7 +19075,7 @@ Selection: ${val}`,
|
|
|
19052
19075
|
}
|
|
19053
19076
|
)));
|
|
19054
19077
|
default:
|
|
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(
|
|
19078
|
+
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(SubagentRow, { key: sa.id, sa })))), /* @__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 && !activeSubagents.some((sa) => sa.status === "running") ? /* @__PURE__ */ React15.createElement(Box14, null, /* @__PURE__ */ React15.createElement(Text15, { color: "white", 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(
|
|
19056
19079
|
Box14,
|
|
19057
19080
|
{
|
|
19058
19081
|
backgroundColor: "#555555",
|
|
@@ -19220,7 +19243,7 @@ Selection: ${val}`,
|
|
|
19220
19243
|
return /* @__PURE__ */ React15.createElement(Box14, { flexDirection: "column", borderStyle: "round", paddingX: 3, paddingY: 1, borderColor: "grey", width: Math.min(100, (stdout?.columns || 100) - 2), marginTop: 0, marginBottom: 0 }, /* @__PURE__ */ React15.createElement(Box14, { marginBottom: 1 }, /* @__PURE__ */ React15.createElement(Text15, { bold: true }, gradient2(["blue", "purple"])("Agent powering down. Goodbye!"))), /* @__PURE__ */ React15.createElement(Box14, { flexDirection: "column" }, /* @__PURE__ */ React15.createElement(Text15, { color: "white", bold: true, underline: true }, "Interaction Summary"), /* @__PURE__ */ React15.createElement(Box14, { marginTop: 1 }, /* @__PURE__ */ React15.createElement(Box14, { width: 20 }, /* @__PURE__ */ React15.createElement(Text15, { color: "blue" }, "Session ID:")), /* @__PURE__ */ React15.createElement(Text15, { color: "white" }, chatId)), /* @__PURE__ */ React15.createElement(Box14, null, /* @__PURE__ */ React15.createElement(Box14, { width: 20 }, /* @__PURE__ */ React15.createElement(Text15, { color: "blue" }, "Tool Calls:")), /* @__PURE__ */ React15.createElement(Text15, { color: "white" }, sessionToolSuccess + sessionToolFailure + sessionToolDenied, " ( ", /* @__PURE__ */ React15.createElement(Text15, { color: "green" }, "\u2713 ", sessionToolSuccess), " ", /* @__PURE__ */ React15.createElement(Text15, { color: "yellow" }, "\u2298 ", sessionToolDenied), " ", /* @__PURE__ */ React15.createElement(Text15, { color: "red" }, "\u2715 ", sessionToolFailure), " )")), /* @__PURE__ */ React15.createElement(Box14, null, /* @__PURE__ */ React15.createElement(Box14, { width: 20 }, /* @__PURE__ */ React15.createElement(Text15, { color: "blue" }, "Success Rate:")), /* @__PURE__ */ React15.createElement(Text15, { color: "white" }, successRate, "%")), /* @__PURE__ */ React15.createElement(Box14, null, /* @__PURE__ */ React15.createElement(Box14, { width: 20 }, /* @__PURE__ */ React15.createElement(Text15, { color: "blue" }, "Code Changes:")), /* @__PURE__ */ React15.createElement(Text15, { color: "white" }, /* @__PURE__ */ React15.createElement(Text15, { color: "green" }, "+", linesAdded), " ", /* @__PURE__ */ React15.createElement(Text15, { color: "red" }, "-", linesRemoved))), /* @__PURE__ */ React15.createElement(Box14, null, /* @__PURE__ */ React15.createElement(Box14, { width: 20 }, /* @__PURE__ */ React15.createElement(Text15, { color: "blue" }, "Tokens Consumed:")), /* @__PURE__ */ React15.createElement(Text15, { color: "white" }, formatTokens(sessionTotalTokens))), sessionTotalTokens > 0 && /* @__PURE__ */ React15.createElement(React15.Fragment, null, /* @__PURE__ */ React15.createElement(Box14, { marginLeft: 2 }, /* @__PURE__ */ React15.createElement(Box14, { width: 18 }, /* @__PURE__ */ React15.createElement(Text15, { color: "grey" }, "\xBB Input Tokens:")), /* @__PURE__ */ React15.createElement(Text15, { color: "white" }, formatTokens(sessionTotalTokens - sessionTotalCandidateTokens))), sessionTotalCachedTokens > 0 && /* @__PURE__ */ React15.createElement(Box14, { marginLeft: 4 }, /* @__PURE__ */ React15.createElement(Box14, { width: 16 }, /* @__PURE__ */ React15.createElement(Text15, { color: "grey" }, "\xBB Cached:")), /* @__PURE__ */ React15.createElement(Text15, { color: "white" }, formatTokens(sessionTotalCachedTokens))), sessionTotalCandidateTokens > 0 && /* @__PURE__ */ React15.createElement(Box14, { marginLeft: 2 }, /* @__PURE__ */ React15.createElement(Box14, { width: 18 }, /* @__PURE__ */ React15.createElement(Text15, { color: "grey" }, "\xBB Output Tokens:")), /* @__PURE__ */ React15.createElement(Text15, { color: "white" }, formatTokens(sessionTotalCandidateTokens)))), sessionImageCount > 0 && /* @__PURE__ */ React15.createElement(React15.Fragment, null, /* @__PURE__ */ React15.createElement(Box14, null, /* @__PURE__ */ React15.createElement(Box14, { width: 20 }, /* @__PURE__ */ React15.createElement(Text15, { color: "blue" }, "Images Made:")), /* @__PURE__ */ React15.createElement(Text15, { color: "white" }, sessionImageCount)), /* @__PURE__ */ React15.createElement(Box14, null, /* @__PURE__ */ React15.createElement(Box14, { width: 20 }, /* @__PURE__ */ React15.createElement(Text15, { color: "blue" }, "Image Credits:")), /* @__PURE__ */ React15.createElement(Text15, { color: "white" }, Number(((sessionImageCredits || 0) * 1e3).toFixed(0)), " credits")))), /* @__PURE__ */ React15.createElement(Box14, { flexDirection: "column", marginTop: 1 }, /* @__PURE__ */ React15.createElement(Text15, { color: "white", bold: true, underline: true }, "Performance"), /* @__PURE__ */ React15.createElement(Box14, { marginTop: 1 }, /* @__PURE__ */ React15.createElement(Box14, { width: 20 }, /* @__PURE__ */ React15.createElement(Text15, { color: "blue" }, "Wall Time:")), /* @__PURE__ */ React15.createElement(Text15, { color: "white" }, formatMsDuration(wallTimeMs))), /* @__PURE__ */ React15.createElement(Box14, null, /* @__PURE__ */ React15.createElement(Box14, { width: 20 }, /* @__PURE__ */ React15.createElement(Text15, { color: "blue" }, "Agent Active:")), /* @__PURE__ */ React15.createElement(Text15, { color: "white" }, formatMsDuration(agentActiveMs))), /* @__PURE__ */ React15.createElement(Box14, { marginLeft: 2 }, /* @__PURE__ */ React15.createElement(Box14, { width: 18 }, /* @__PURE__ */ React15.createElement(Text15, { color: "grey" }, "\xBB API Time:")), /* @__PURE__ */ React15.createElement(Text15, { color: "white" }, formatMsDuration(sessionApiTime), " (", apiPercent, "%)")), /* @__PURE__ */ React15.createElement(Box14, { marginLeft: 2 }, /* @__PURE__ */ React15.createElement(Box14, { width: 18 }, /* @__PURE__ */ React15.createElement(Text15, { color: "grey" }, "\xBB Tool Time:")), /* @__PURE__ */ React15.createElement(Text15, { color: "white" }, formatMsDuration(sessionToolTime), " (", toolPercent, "%)"))));
|
|
19221
19244
|
})())));
|
|
19222
19245
|
}
|
|
19223
|
-
var shouldClearValue, getPrefilledValue, getIDEName, getIDEDirName, getKeybindingsPath, parseJsonc, hasShiftEnterBinding, getPromoOptions, BridgePromo, SESSION_START_TIME, CHANGELOG_URL, DOCS_URL, linesAdded, linesRemoved, packageJsonPath, packageJson, versionFluxflow, updatedOn, ResolutionModal, parseAgentText, getProjectFiles, cachedShortcut;
|
|
19246
|
+
var shouldClearValue, getPrefilledValue, getIDEName, getIDEDirName, getKeybindingsPath, parseJsonc, hasShiftEnterBinding, getPromoOptions, BridgePromo, SESSION_START_TIME, CHANGELOG_URL, DOCS_URL, linesAdded, linesRemoved, packageJsonPath, packageJson, versionFluxflow, updatedOn, ResolutionModal, parseAgentText, getProjectFiles, cachedShortcut, SubagentRow;
|
|
19224
19247
|
var init_app = __esm({
|
|
19225
19248
|
async "src/app.jsx"() {
|
|
19226
19249
|
init_build();
|
|
@@ -19476,6 +19499,28 @@ var init_app = __esm({
|
|
|
19476
19499
|
};
|
|
19477
19500
|
})();
|
|
19478
19501
|
cachedShortcut = "\\ + Enter";
|
|
19502
|
+
SubagentRow = React15.memo(({ sa }) => {
|
|
19503
|
+
const [dotColor, setDotColor] = useState14("green");
|
|
19504
|
+
useEffect11(() => {
|
|
19505
|
+
if (sa.status !== "running") return;
|
|
19506
|
+
const checkLatency = () => {
|
|
19507
|
+
const delay = Date.now() - (sa.lastChunkTime || Date.now());
|
|
19508
|
+
if (delay < 700) {
|
|
19509
|
+
setDotColor("green");
|
|
19510
|
+
} else if (delay <= 1200) {
|
|
19511
|
+
setDotColor("yellow");
|
|
19512
|
+
} else if (delay <= 2e3) {
|
|
19513
|
+
setDotColor("#ff9f43");
|
|
19514
|
+
} else {
|
|
19515
|
+
setDotColor("#d63031");
|
|
19516
|
+
}
|
|
19517
|
+
};
|
|
19518
|
+
checkLatency();
|
|
19519
|
+
const timer = setInterval(checkLatency, 100);
|
|
19520
|
+
return () => clearInterval(timer);
|
|
19521
|
+
}, [sa.status, sa.lastChunkTime]);
|
|
19522
|
+
return /* @__PURE__ */ React15.createElement(Box14, { 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(Text15, { color: dotColor }, " \u25CF")));
|
|
19523
|
+
});
|
|
19479
19524
|
}
|
|
19480
19525
|
});
|
|
19481
19526
|
|