fluxflow-cli 1.9.22 → 1.9.23
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 +89 -27
- package/package.json +1 -1
package/dist/fluxflow.js
CHANGED
|
@@ -1026,30 +1026,30 @@ ${parts.join("\n\n")}
|
|
|
1026
1026
|
${foundFiles.map((f) => `- ${f.name}: ${f.desc}`).join("\n")}
|
|
1027
1027
|
Check these first; these files > training data for project consistency. Safety rules still apply` : "";
|
|
1028
1028
|
return `${nameStr}${nicknameStr}${userInstrStr}
|
|
1029
|
-
|
|
1029
|
+
[SYSTEM (OVERRIDES EVERYTHING)]
|
|
1030
1030
|
Identity: Flux Flow (by Kushal Roy Chowdhury). Sassy, Friendly CLI Agent. No flirting
|
|
1031
1031
|
Mode: ${mode}. ${mode === "Flux" ? "Goal-oriented" : "Conversational & UX-focused"}
|
|
1032
|
-
CWD: ${cwdStr}.${isSystemDir ? " [PROTECTED: ASK BEFORE MODIFYING]" : ""} OS: ${osDetected}${osDetected === "Windows" ? ".
|
|
1033
|
-
High Priority: [SYSTEM]
|
|
1032
|
+
CWD: ${cwdStr}.${isSystemDir ? " [PROTECTED: ASK BEFORE MODIFYING]" : ""} OS: ${osDetected}${osDetected === "Windows" ? ". PS via CMD" : ""}
|
|
1033
|
+
High Priority: [SYSTEM], [STEERING HINT]
|
|
1034
1034
|
|
|
1035
1035
|
-- THINKING RULES --
|
|
1036
1036
|
${thinkingConfig}
|
|
1037
1037
|
***THINKING POLICY***
|
|
1038
1038
|
- Always use <think> ... </think> before responding
|
|
1039
1039
|
- Never skip thinking, even for simple tasks, code, or greetings
|
|
1040
|
-
- Never jump to responses
|
|
1040
|
+
- Never jump to responses, regardless of task complexity
|
|
1041
1041
|
|
|
1042
1042
|
${TOOL_PROTOCOL(mode)}
|
|
1043
1043
|
${projectContextBlock}
|
|
1044
1044
|
|
|
1045
1045
|
-- MEMORY RULES --
|
|
1046
1046
|
- Memory: ${isMemoryEnabled ? "Use memories to subtly personalize" : "OFF (tell user to enable in /settings if needed)"}
|
|
1047
|
-
- Time: Logs are timestamped. RELATIVE TIME REFERENCE e.g. few mins ago
|
|
1047
|
+
- Time: Logs are timestamped. RELATIVE TIME REFERENCE e.g. few mins ago <dd/mm/yyyy>
|
|
1048
1048
|
|
|
1049
1049
|
-- SECURITY RULES --
|
|
1050
|
-
- EXTERNAL ACCESS: ${systemSettings.allowExternalAccess ? "ENABLED" : "RESTRICTED
|
|
1051
|
-
-
|
|
1052
|
-
-
|
|
1050
|
+
- EXTERNAL ACCESS: ${systemSettings.allowExternalAccess ? "ENABLED" : "RESTRICTED CWD only"}
|
|
1051
|
+
- Sensitive files? Ask before Read
|
|
1052
|
+
- [SYSTEM] >>> [USER]
|
|
1053
1053
|
|
|
1054
1054
|
-- FORMATTING --
|
|
1055
1055
|
- Clean, concise responses
|
|
@@ -1060,7 +1060,7 @@ ${projectContextBlock}
|
|
|
1060
1060
|
- End with [turn: continue] for more steps or [turn: finish] when done
|
|
1061
1061
|
- Stack tools if needed, but always end with [turn: continue] if called any tools
|
|
1062
1062
|
TO END THE LOOP, **MUST** WRITE [turn: finish] AT END OF RESPONSE
|
|
1063
|
-
|
|
1063
|
+
[/SYSTEM]`.trim();
|
|
1064
1064
|
};
|
|
1065
1065
|
getJanitorInstruction = (originalText, agentRaws, userMemories = "", isMemoryEnabled = true, needTitle = true) => {
|
|
1066
1066
|
let agentRes = `${agentRaws.replace(/\[tool:functions\..*?\]/g, "").replace(/<think>.*<\/think>/g, "").replace(/\[Prompted on:.*?\]/g, "").replace(/\[turn: continue\]/g, "").replace(/\[turn: finish\]/g, "").replace(/\[TOOL RESULTS\]/g, "").replace(/\[tool results\]/g, "").substring(0, 3500)}`;
|
|
@@ -2129,6 +2129,11 @@ var init_exec_command = __esm({
|
|
|
2129
2129
|
continue;
|
|
2130
2130
|
}
|
|
2131
2131
|
if (char === "\\") {
|
|
2132
|
+
if (command[i + 1] === " ") {
|
|
2133
|
+
current += " ";
|
|
2134
|
+
i++;
|
|
2135
|
+
continue;
|
|
2136
|
+
}
|
|
2132
2137
|
current += char;
|
|
2133
2138
|
isEscaped = true;
|
|
2134
2139
|
continue;
|
|
@@ -2142,6 +2147,18 @@ var init_exec_command = __esm({
|
|
|
2142
2147
|
if (char === '"' || char === "'") {
|
|
2143
2148
|
inQuote = char;
|
|
2144
2149
|
current += char;
|
|
2150
|
+
} else if (char === ";" && !current.includes("://")) {
|
|
2151
|
+
if (current.length > 0) {
|
|
2152
|
+
tokens.push(current);
|
|
2153
|
+
current = "";
|
|
2154
|
+
}
|
|
2155
|
+
tokens.push("&");
|
|
2156
|
+
} else if (char === "|" && !current.includes("://")) {
|
|
2157
|
+
if (current.length > 0) {
|
|
2158
|
+
tokens.push(current);
|
|
2159
|
+
current = "";
|
|
2160
|
+
}
|
|
2161
|
+
tokens.push("|");
|
|
2145
2162
|
} else if (/\s/.test(char)) {
|
|
2146
2163
|
if (current.length > 0) {
|
|
2147
2164
|
tokens.push(current);
|
|
@@ -2156,26 +2173,71 @@ var init_exec_command = __esm({
|
|
|
2156
2173
|
tokens.push(current);
|
|
2157
2174
|
}
|
|
2158
2175
|
const looksLikePath = (str) => {
|
|
2159
|
-
if (!str.includes("/")
|
|
2160
|
-
|
|
2161
|
-
|
|
2162
|
-
const firstSlashIdx = str.indexOf("/");
|
|
2163
|
-
const lastSlashIdx = str.lastIndexOf("/");
|
|
2164
|
-
if (firstSlashIdx === 0 && lastSlashIdx === 0) {
|
|
2176
|
+
if (!str.includes("/")) return false;
|
|
2177
|
+
if (/^(https?|file|ftp):\/\//i.test(str)) return false;
|
|
2178
|
+
if (str.startsWith("/") && (str.match(/\//g) || []).length === 1) {
|
|
2165
2179
|
return false;
|
|
2166
2180
|
}
|
|
2167
|
-
|
|
2168
|
-
|
|
2169
|
-
|
|
2170
|
-
const hasExtension = /\.[a-zA-Z0-9_-]+$/.test(str);
|
|
2171
|
-
return hasDriveLetter || hasRelativeStart || hasMultipleSlashes || hasExtension;
|
|
2181
|
+
if (/\s\/|\/\s/.test(str)) return false;
|
|
2182
|
+
if (/[\(\)\{\}\;\<\>\=\'\"]/.test(str)) return false;
|
|
2183
|
+
return true;
|
|
2172
2184
|
};
|
|
2173
|
-
const
|
|
2174
|
-
|
|
2185
|
+
const translatedTokens = [];
|
|
2186
|
+
for (let i = 0; i < tokens.length; i++) {
|
|
2187
|
+
const token = tokens[i];
|
|
2188
|
+
if (token === "|" && tokens[i + 1] === "tee") {
|
|
2189
|
+
if (tokens[i + 2] === "-a") {
|
|
2190
|
+
translatedTokens.push(">>");
|
|
2191
|
+
i += 2;
|
|
2192
|
+
} else {
|
|
2193
|
+
translatedTokens.push(">");
|
|
2194
|
+
i += 1;
|
|
2195
|
+
}
|
|
2196
|
+
continue;
|
|
2197
|
+
}
|
|
2198
|
+
if (token === "|" && tokens[i + 1] === "cat" && tokens[i + 2] === ">") {
|
|
2199
|
+
translatedTokens.push(">");
|
|
2200
|
+
i += 2;
|
|
2201
|
+
continue;
|
|
2202
|
+
}
|
|
2203
|
+
if (token === "|") {
|
|
2204
|
+
const nextToken = tokens[i + 1];
|
|
2205
|
+
if (nextToken) {
|
|
2206
|
+
const nextUnquoted = nextToken.replace(/^['"]|['"]$/g, "");
|
|
2207
|
+
const isWritableFile = /\.(txt|md|json|log|csv|html|css|py|js|xml|yaml|yml|pdf|docx|pptx|xlsx)$/i.test(nextUnquoted);
|
|
2208
|
+
if (looksLikePath(nextUnquoted) && isWritableFile) {
|
|
2209
|
+
translatedTokens.push(">");
|
|
2210
|
+
continue;
|
|
2211
|
+
}
|
|
2212
|
+
}
|
|
2213
|
+
}
|
|
2214
|
+
translatedTokens.push(token);
|
|
2215
|
+
}
|
|
2216
|
+
let inEchoArguments = false;
|
|
2217
|
+
const processedTokens = translatedTokens.map((token) => {
|
|
2218
|
+
if (token === "echo") {
|
|
2219
|
+
inEchoArguments = true;
|
|
2220
|
+
return token;
|
|
2221
|
+
}
|
|
2222
|
+
const controlOperators = [">", ">>", "<", "&", "&&", "|", "||", ";"];
|
|
2223
|
+
if (controlOperators.includes(token)) {
|
|
2224
|
+
inEchoArguments = false;
|
|
2225
|
+
}
|
|
2226
|
+
const hasOuterQuotes = /^['"]|['"]$/.test(token);
|
|
2227
|
+
let processed = token;
|
|
2228
|
+
if (inEchoArguments && hasOuterQuotes) {
|
|
2229
|
+
processed = token.replace(/^['"]|['"]$/g, "");
|
|
2230
|
+
}
|
|
2231
|
+
const currentHasOuterQuotes = /^['"]|['"]$/.test(processed);
|
|
2232
|
+
const unquoted = processed.replace(/^['"]|['"]$/g, "");
|
|
2175
2233
|
if (looksLikePath(unquoted)) {
|
|
2176
|
-
|
|
2234
|
+
processed = processed.replace(/\//g, "\\");
|
|
2235
|
+
}
|
|
2236
|
+
const finalUnquoted = processed.replace(/^['"]|['"]$/g, "");
|
|
2237
|
+
if (finalUnquoted.includes(" ") && !currentHasOuterQuotes) {
|
|
2238
|
+
processed = `"${finalUnquoted}"`;
|
|
2177
2239
|
}
|
|
2178
|
-
return
|
|
2240
|
+
return processed;
|
|
2179
2241
|
});
|
|
2180
2242
|
return processedTokens.join(" ");
|
|
2181
2243
|
};
|
|
@@ -2223,18 +2285,18 @@ ${stderr}`);
|
|
|
2223
2285
|
if (code !== 0) result.push(`EXIT CODE: ${code}`);
|
|
2224
2286
|
const finalOutput = result.join("\n\n") || "Command executed with no output.";
|
|
2225
2287
|
if (code !== 0) {
|
|
2226
|
-
resolve(`ERROR: Command [${
|
|
2288
|
+
resolve(`ERROR: Command [${rawCommand}] failed with exit code [${code}].
|
|
2227
2289
|
|
|
2228
2290
|
${finalOutput}`);
|
|
2229
2291
|
} else {
|
|
2230
|
-
resolve(`SUCCESS: Command [${
|
|
2292
|
+
resolve(`SUCCESS: Command [${rawCommand}] completed.
|
|
2231
2293
|
|
|
2232
2294
|
${finalOutput}`);
|
|
2233
2295
|
}
|
|
2234
2296
|
});
|
|
2235
2297
|
child.on("error", (err) => {
|
|
2236
2298
|
activeChildProcess = null;
|
|
2237
|
-
resolve(`ERROR: Failed to start command [${
|
|
2299
|
+
resolve(`ERROR: Failed to start command [${rawCommand}]: ${err.message}`);
|
|
2238
2300
|
});
|
|
2239
2301
|
});
|
|
2240
2302
|
};
|