openfox 2.0.83 → 2.0.85
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/{chat-handler-6KBOE4YA.js → chat-handler-3CWMOIOR.js} +15 -14
- package/dist/{chunk-3D3N2PXI.js → chunk-2KKFOVK7.js} +2 -2
- package/dist/{chunk-JKZPMRH2.js → chunk-3JYPDZT2.js} +2 -2
- package/dist/{chunk-JXTHW3YX.js → chunk-7PZBCATU.js} +18 -4
- package/dist/chunk-7WAOMWR3.js +7 -0
- package/dist/{chunk-IIRXKSB5.js → chunk-ACL4YUJH.js} +10 -2
- package/dist/{chunk-7ROIY3QN.js → chunk-DLJYYWM2.js} +169 -111
- package/dist/{chunk-D324ULDG.js → chunk-FTJ7U3VN.js} +20 -17
- package/dist/chunk-FYYPQ27K.js +399 -0
- package/dist/{chunk-KMGVUOLT.js → chunk-GLRTJJOB.js} +23 -20
- package/dist/{chunk-FVY2JOTO.js → chunk-H765CIHN.js} +2 -2
- package/dist/{chunk-AANVMTYU.js → chunk-L4S5N3WV.js} +8 -3
- package/dist/{chunk-VB23QPW3.js → chunk-M6X72DYZ.js} +3 -3
- package/dist/{chunk-SBSQD7MG.js → chunk-MTZ3PC6K.js} +2 -2
- package/dist/{chunk-NH2PVB6R.js → chunk-N54PQSCH.js} +33 -24
- package/dist/{chunk-A2IZ4PWQ.js → chunk-OHKBGMLO.js} +15 -4
- package/dist/{chunk-OBQN5ATP.js → chunk-RSO2HKNH.js} +98 -365
- package/dist/{chunk-WL6AOKRD.js → chunk-SGFQWQCE.js} +10 -8
- package/dist/{chunk-CNJ63FXJ.js → chunk-STFIEU5F.js} +3 -2
- package/dist/{chunk-BUXIESO5.js → chunk-V5LOH363.js} +6 -74
- package/dist/{chunk-5ZHVQOI3.js → chunk-W23S3TU5.js} +2 -2
- package/dist/{chunk-DQP5HSDS.js → chunk-WVMOGE7U.js} +3 -3
- package/dist/{chunk-HLZUN7OR.js → chunk-XXII6DS3.js} +7 -7
- package/dist/cli/dev.js +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/{client-TA2VD4LR.js → client-C2P67MA4.js} +4 -4
- package/dist/{compactor-YKESKGHL.js → compactor-2YT66FDZ.js} +10 -8
- package/dist/{config-EN3WEH4A.js → config-JN6MW5SL.js} +2 -2
- package/dist/{events-GF2WNELM.js → events-OEDAFNEI.js} +7 -4
- package/dist/{folding-UACKBHUZ.js → folding-FGTCP73N.js} +7 -2
- package/dist/{http-client-QZY7W36Q.js → http-client-I52X7GQB.js} +3 -3
- package/dist/{manager-WOUOQVLV.js → manager-TD2UT62O.js} +4 -4
- package/dist/{orchestrator-BO62JYFM.js → orchestrator-6RYJYR3T.js} +14 -13
- package/dist/package.json +1 -1
- package/dist/{path-security-AWDNKRZ4.js → path-security-7ZNIG3ZE.js} +8 -5
- package/dist/{platform-7AK5MB4K.js → platform-OYKGQ7Z3.js} +3 -3
- package/dist/{processor-BLGEVOPK.js → processor-IGRFA3KA.js} +15 -14
- package/dist/{protocol-9WP7lLec.d.ts → protocol-5NJx1N4c.d.ts} +1 -1
- package/dist/provider/index.d.ts +4 -4
- package/dist/{provider-QVVJ6XNZ.js → provider-YNYYAR6C.js} +7 -7
- package/dist/{provider-manager-7246YSJT.js → provider-manager-3DW3A2VC.js} +5 -5
- package/dist/{serve-HXV2RX3Q.js → serve-LFC7D5B7.js} +21 -20
- package/dist/server/index.d.ts +4 -4
- package/dist/server/index.js +20 -19
- package/dist/{server-V4VA4A2E.js → server-E5IA4SK7.js} +16 -15
- package/dist/{sessions-SFG42M4W.js → sessions-V3BF2OTU.js} +5 -2
- package/dist/{settings-6TJIHDVX.js → settings-AGNYWEIE.js} +2 -2
- package/dist/shared/index.d.ts +3 -3
- package/dist/{tools-X4YLRR2Y.js → tools-ZUTPBREL.js} +13 -12
- package/dist/{types-ulRvCqQX.d.ts → types-B4wa_vGm.d.ts} +2 -0
- package/dist/{types-BtY5XChg.d.ts → types-CrLD4iRS.d.ts} +1 -1
- package/dist/{update-MFOCAROI.js → update-KDMUVXXI.js} +2 -2
- package/dist/web/assets/{index-DfmXvFVe.css → index-CsWZt1m8.css} +1 -1
- package/dist/web/assets/index-mJ_RQ-yF.js +305 -0
- package/dist/web/index.html +2 -2
- package/dist/web/sw.js +1 -1
- package/dist/{workspace-N2PIBOJV.js → workspace-MMV6V5P4.js} +4 -2
- package/package.json +1 -1
- package/dist/chunk-2X3V4SQC.js +0 -7
- package/dist/web/assets/index-C9jXZWzN.js +0 -305
|
@@ -1,18 +1,15 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createAssemblyResult,
|
|
3
|
-
findAgentById,
|
|
4
3
|
getAllInstructions,
|
|
5
4
|
getConversationMessages,
|
|
6
5
|
getEnabledSkillMetadata,
|
|
7
|
-
getSubAgents,
|
|
8
6
|
getToolRegistryForAgent,
|
|
9
|
-
loadAllAgentsDefault,
|
|
10
7
|
processEventsForConversation,
|
|
11
8
|
runTopLevelAgentLoop
|
|
12
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-RSO2HKNH.js";
|
|
13
10
|
import {
|
|
14
11
|
PathAccessDeniedError
|
|
15
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-2KKFOVK7.js";
|
|
16
13
|
import {
|
|
17
14
|
TurnMetrics,
|
|
18
15
|
buildAgentReminder,
|
|
@@ -20,16 +17,22 @@ import {
|
|
|
20
17
|
buildTopLevelSystemPrompt,
|
|
21
18
|
createChatDoneEvent,
|
|
22
19
|
createMessageStartEvent
|
|
23
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-H765CIHN.js";
|
|
24
21
|
import {
|
|
25
22
|
getCurrentContextWindowId,
|
|
26
23
|
getCurrentWindowMessageOptions,
|
|
27
|
-
getEventStore
|
|
28
|
-
|
|
29
|
-
} from "./chunk-BUXIESO5.js";
|
|
24
|
+
getEventStore
|
|
25
|
+
} from "./chunk-V5LOH363.js";
|
|
30
26
|
import {
|
|
31
27
|
buildSnapshotFromSessionState
|
|
32
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-OHKBGMLO.js";
|
|
29
|
+
import {
|
|
30
|
+
findAgentById,
|
|
31
|
+
getRuntimeConfig,
|
|
32
|
+
getSubAgents,
|
|
33
|
+
loadAllAgentsDefault,
|
|
34
|
+
resolveDefaultAgentId
|
|
35
|
+
} from "./chunk-FYYPQ27K.js";
|
|
33
36
|
import {
|
|
34
37
|
logger
|
|
35
38
|
} from "./chunk-K44MW7JJ.js";
|
|
@@ -61,12 +64,12 @@ async function loadSessionContext(sessionManager, sessionId) {
|
|
|
61
64
|
function resolveAgentDef(sessionManager, sessionId) {
|
|
62
65
|
return loadAllAgentsDefault().then((allAgents) => {
|
|
63
66
|
const session = sessionManager.requireSession(sessionId);
|
|
64
|
-
return findAgentById(session.mode, allAgents) ?? findAgentById(
|
|
67
|
+
return findAgentById(session.mode, allAgents) ?? findAgentById(resolveDefaultAgentId(), allAgents);
|
|
65
68
|
});
|
|
66
69
|
}
|
|
67
70
|
async function buildCachedPrompt(sessionManager, sessionId, agentDef) {
|
|
68
71
|
const { instructionContent, skills } = await loadSessionContext(sessionManager, sessionId);
|
|
69
|
-
const { getToolRegistryForAgent: getToolRegistryForAgent2 } = await import("./tools-
|
|
72
|
+
const { getToolRegistryForAgent: getToolRegistryForAgent2 } = await import("./tools-ZUTPBREL.js");
|
|
70
73
|
const tools = getToolRegistryForAgent2(agentDef).definitions;
|
|
71
74
|
const toolFingerprint = getToolFingerprint(tools);
|
|
72
75
|
const allAgents = await loadAllAgentsDefault();
|
|
@@ -79,7 +82,7 @@ async function buildCachedPrompt(sessionManager, sessionId, agentDef) {
|
|
|
79
82
|
async function computeSessionHash(sessionManager, sessionId) {
|
|
80
83
|
const { instructionContent, skills } = await loadSessionContext(sessionManager, sessionId);
|
|
81
84
|
const agentDef = await resolveAgentDef(sessionManager, sessionId);
|
|
82
|
-
const { getToolRegistryForAgent: getToolRegistryForAgent2 } = await import("./tools-
|
|
85
|
+
const { getToolRegistryForAgent: getToolRegistryForAgent2 } = await import("./tools-ZUTPBREL.js");
|
|
83
86
|
const tools = getToolRegistryForAgent2(agentDef).definitions;
|
|
84
87
|
const toolFingerprint = getToolFingerprint(tools);
|
|
85
88
|
return computeDynamicContextHash(instructionContent, skills, toolFingerprint);
|
|
@@ -87,7 +90,7 @@ async function computeSessionHash(sessionManager, sessionId) {
|
|
|
87
90
|
async function applyDynamicContext(sessionManager, sessionId) {
|
|
88
91
|
const session = sessionManager.requireSession(sessionId);
|
|
89
92
|
const allAgents = await loadAllAgentsDefault();
|
|
90
|
-
const agentDef = findAgentById(session.mode, allAgents) ?? findAgentById(
|
|
93
|
+
const agentDef = findAgentById(session.mode, allAgents) ?? findAgentById(resolveDefaultAgentId(), allAgents);
|
|
91
94
|
const { systemPrompt, tools, hash } = await buildCachedPrompt(sessionManager, sessionId, agentDef);
|
|
92
95
|
sessionManager.setCachedPrompt(sessionId, systemPrompt, tools, hash);
|
|
93
96
|
sessionManager.setDynamicContextChanged(sessionId, false);
|
|
@@ -97,7 +100,7 @@ async function applyDynamicContext(sessionManager, sessionId) {
|
|
|
97
100
|
|
|
98
101
|
// src/server/chat/orchestrator.ts
|
|
99
102
|
async function buildRetryPatterns() {
|
|
100
|
-
const { getSetting, SETTINGS_KEYS } = await import("./settings-
|
|
103
|
+
const { getSetting, SETTINGS_KEYS } = await import("./settings-AGNYWEIE.js");
|
|
101
104
|
const raw = getSetting(SETTINGS_KEYS.RETRY_PATTERNS);
|
|
102
105
|
if (!raw) {
|
|
103
106
|
const oldXmlProtection = getSetting("llm.disableXmlProtection");
|
|
@@ -274,7 +277,7 @@ function injectAgentReminder(sessionId, agentDef) {
|
|
|
274
277
|
async function runAgentTurn(options, turnMetrics, agentId, append, callbacks) {
|
|
275
278
|
const statsIdentity = resolveStatsIdentity(options);
|
|
276
279
|
const allAgents = await loadAllAgentsDefault();
|
|
277
|
-
const agentDef = findAgentById(agentId, allAgents) ?? findAgentById(
|
|
280
|
+
const agentDef = findAgentById(agentId, allAgents) ?? findAgentById(resolveDefaultAgentId(), allAgents);
|
|
278
281
|
if (!options.warmup) {
|
|
279
282
|
injectAgentReminder(options.sessionId, agentDef);
|
|
280
283
|
}
|
|
@@ -359,4 +362,4 @@ export {
|
|
|
359
362
|
runChatTurn,
|
|
360
363
|
runAgentTurn
|
|
361
364
|
};
|
|
362
|
-
//# sourceMappingURL=chunk-
|
|
365
|
+
//# sourceMappingURL=chunk-FTJ7U3VN.js.map
|
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
import {
|
|
2
|
+
SETTINGS_KEYS,
|
|
3
|
+
getSetting
|
|
4
|
+
} from "./chunk-STFIEU5F.js";
|
|
5
|
+
import {
|
|
6
|
+
logger
|
|
7
|
+
} from "./chunk-K44MW7JJ.js";
|
|
8
|
+
import {
|
|
9
|
+
getGlobalConfigDir
|
|
10
|
+
} from "./chunk-CQGTEGKL.js";
|
|
11
|
+
|
|
12
|
+
// src/server/config.ts
|
|
13
|
+
import { z } from "zod";
|
|
14
|
+
var backendSchema = z.enum(["vllm", "sglang", "ollama", "llamacpp", "unknown"]).default("unknown");
|
|
15
|
+
var envSchema = z.object({
|
|
16
|
+
// New env var name, with fallback to old name for backward compatibility
|
|
17
|
+
OPENFOX_LLM_URL: z.string().url().optional(),
|
|
18
|
+
OPENFOX_VLLM_URL: z.string().url().optional(),
|
|
19
|
+
OPENFOX_BACKEND: backendSchema,
|
|
20
|
+
OPENFOX_MODEL_NAME: z.string().default(""),
|
|
21
|
+
OPENFOX_MAX_CONTEXT: z.coerce.number().default(2e5),
|
|
22
|
+
OPENFOX_PORT: z.coerce.number().default(10369),
|
|
23
|
+
OPENFOX_HOST: z.string().optional(),
|
|
24
|
+
OPENFOX_WORKDIR: z.string().optional(),
|
|
25
|
+
OPENFOX_DB_PATH: z.string().default("./openfox.db"),
|
|
26
|
+
OPENFOX_LOG_LEVEL: z.enum(["debug", "info", "warn", "error"]).default("info"),
|
|
27
|
+
OPENFOX_REASONING_EFFORT: z.string().optional(),
|
|
28
|
+
// Deprecated: use OPENFOX_REASONING_EFFORT=none instead
|
|
29
|
+
OPENFOX_DISABLE_THINKING: z.coerce.boolean().default(false),
|
|
30
|
+
OPENFOX_LLM_TIMEOUT: z.coerce.number().default(3e5),
|
|
31
|
+
OPENFOX_LLM_IDLE_TIMEOUT: z.coerce.number().default(3e5),
|
|
32
|
+
OPENFOX_DEV: z.coerce.boolean().default(false),
|
|
33
|
+
OPENFOX_DISABLE_AUTO_SESSION_TITLE: z.coerce.boolean().optional(),
|
|
34
|
+
OPENFOX_DEFAULT_AGENT: z.string().optional()
|
|
35
|
+
});
|
|
36
|
+
function loadConfig() {
|
|
37
|
+
const env = envSchema.parse(process.env);
|
|
38
|
+
const llmUrl = env.OPENFOX_LLM_URL ?? env.OPENFOX_VLLM_URL ?? "http://localhost:8000/v1";
|
|
39
|
+
const workdir = env.OPENFOX_WORKDIR ?? process.cwd();
|
|
40
|
+
return {
|
|
41
|
+
llm: {
|
|
42
|
+
baseUrl: llmUrl,
|
|
43
|
+
model: env.OPENFOX_MODEL_NAME,
|
|
44
|
+
timeout: env.OPENFOX_LLM_TIMEOUT,
|
|
45
|
+
idleTimeout: env.OPENFOX_LLM_IDLE_TIMEOUT,
|
|
46
|
+
backend: env.OPENFOX_BACKEND,
|
|
47
|
+
...env.OPENFOX_REASONING_EFFORT ? { reasoningEffort: env.OPENFOX_REASONING_EFFORT } : env.OPENFOX_DISABLE_THINKING ? { reasoningEffort: "none" } : {}
|
|
48
|
+
},
|
|
49
|
+
context: {
|
|
50
|
+
maxTokens: env.OPENFOX_MAX_CONTEXT,
|
|
51
|
+
compactionThreshold: 0.85,
|
|
52
|
+
compactionTarget: 0.6
|
|
53
|
+
},
|
|
54
|
+
agent: {
|
|
55
|
+
maxIterations: 10,
|
|
56
|
+
maxConsecutiveFailures: 3,
|
|
57
|
+
toolTimeout: 3e5
|
|
58
|
+
},
|
|
59
|
+
server: {
|
|
60
|
+
port: env.OPENFOX_PORT,
|
|
61
|
+
...env.OPENFOX_HOST !== void 0 ? { host: env.OPENFOX_HOST } : {}
|
|
62
|
+
},
|
|
63
|
+
database: {
|
|
64
|
+
path: env.OPENFOX_DB_PATH
|
|
65
|
+
},
|
|
66
|
+
mode: env.OPENFOX_DEV ? "development" : "production",
|
|
67
|
+
workdir,
|
|
68
|
+
...env.OPENFOX_DISABLE_AUTO_SESSION_TITLE !== void 0 ? { disableAutoSessionTitle: env.OPENFOX_DISABLE_AUTO_SESSION_TITLE } : {},
|
|
69
|
+
...env.OPENFOX_DEFAULT_AGENT !== void 0 ? { defaultAgent: env.OPENFOX_DEFAULT_AGENT } : {}
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// src/server/runtime-config.ts
|
|
74
|
+
var runtimeConfig = null;
|
|
75
|
+
function setRuntimeConfig(config) {
|
|
76
|
+
runtimeConfig = config;
|
|
77
|
+
}
|
|
78
|
+
function getRuntimeConfig() {
|
|
79
|
+
return runtimeConfig ?? loadConfig();
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// src/server/agents/registry.ts
|
|
83
|
+
import { readdir as readdir2, readFile as readFile2, writeFile as writeFile2, mkdir as mkdir2, access as access2, unlink as unlink2 } from "fs/promises";
|
|
84
|
+
import { join as join2, dirname } from "path";
|
|
85
|
+
import { constants as constants2 } from "fs";
|
|
86
|
+
import { fileURLToPath } from "url";
|
|
87
|
+
import matter2 from "gray-matter";
|
|
88
|
+
|
|
89
|
+
// src/server/shared/item-loader.ts
|
|
90
|
+
import { readdir, readFile, access, writeFile, mkdir, unlink } from "fs/promises";
|
|
91
|
+
import { join } from "path";
|
|
92
|
+
import { constants } from "fs";
|
|
93
|
+
import matter from "gray-matter";
|
|
94
|
+
async function pathExists(path) {
|
|
95
|
+
try {
|
|
96
|
+
await access(path, constants.R_OK);
|
|
97
|
+
return true;
|
|
98
|
+
} catch {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
async function getDefaultIds(dir, extension) {
|
|
103
|
+
try {
|
|
104
|
+
const files = (await readdir(dir)).filter((f) => f.endsWith(extension));
|
|
105
|
+
return files.map((f) => f.replace(extension, ""));
|
|
106
|
+
} catch {
|
|
107
|
+
return [];
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
async function loadItemsFromDir(dir, options) {
|
|
111
|
+
if (!await pathExists(dir)) {
|
|
112
|
+
return [];
|
|
113
|
+
}
|
|
114
|
+
let files;
|
|
115
|
+
try {
|
|
116
|
+
files = (await readdir(dir)).filter((f) => f.endsWith(options.extension));
|
|
117
|
+
} catch {
|
|
118
|
+
return [];
|
|
119
|
+
}
|
|
120
|
+
const items = [];
|
|
121
|
+
for (const file of files) {
|
|
122
|
+
try {
|
|
123
|
+
const raw = await readFile(join(dir, file), "utf-8");
|
|
124
|
+
const { data, content } = matter(raw);
|
|
125
|
+
if (data.id && content.trim()) {
|
|
126
|
+
items.push({
|
|
127
|
+
metadata: data,
|
|
128
|
+
prompt: content.trim()
|
|
129
|
+
});
|
|
130
|
+
} else {
|
|
131
|
+
logger.warn(`Skipping invalid ${options.logName} file`, { file });
|
|
132
|
+
}
|
|
133
|
+
} catch (err) {
|
|
134
|
+
logger.warn(`Failed to parse ${options.logName} file`, {
|
|
135
|
+
file,
|
|
136
|
+
error: err instanceof Error ? err.message : String(err)
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return items;
|
|
141
|
+
}
|
|
142
|
+
async function saveItemToDir(dir, item, ext, serialize) {
|
|
143
|
+
if (!await pathExists(dir)) {
|
|
144
|
+
await mkdir(dir, { recursive: true });
|
|
145
|
+
}
|
|
146
|
+
const meta = item.metadata;
|
|
147
|
+
const filePath = join(dir, `${meta.id}${ext}`);
|
|
148
|
+
await writeFile(filePath, serialize(item), "utf-8");
|
|
149
|
+
}
|
|
150
|
+
var jsonSerializer = (item) => JSON.stringify(item, null, 2) + "\n";
|
|
151
|
+
async function deleteItemFromDir(dir, id, ext) {
|
|
152
|
+
const filePath = join(dir, `${id}${ext}`);
|
|
153
|
+
try {
|
|
154
|
+
await unlink(filePath);
|
|
155
|
+
return { success: true };
|
|
156
|
+
} catch {
|
|
157
|
+
return { success: false };
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// src/server/agents/registry.ts
|
|
162
|
+
var __bundleDir = dirname(fileURLToPath(import.meta.url));
|
|
163
|
+
var DEFAULTS_DIR = join2(__bundleDir, "defaults");
|
|
164
|
+
var DEFAULTS_DIR_ALT = join2(__bundleDir, "agent-defaults");
|
|
165
|
+
var AGENT_EXTENSION = ".agent.md";
|
|
166
|
+
function getAgentsDir(configDir) {
|
|
167
|
+
return join2(configDir, "agents");
|
|
168
|
+
}
|
|
169
|
+
function getProjectAgentsDir(projectDir) {
|
|
170
|
+
return join2(projectDir, ".openfox", "agents");
|
|
171
|
+
}
|
|
172
|
+
async function pathExists2(path) {
|
|
173
|
+
try {
|
|
174
|
+
await access2(path, constants2.R_OK);
|
|
175
|
+
return true;
|
|
176
|
+
} catch {
|
|
177
|
+
return false;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
function parseAgentFile(raw, filename) {
|
|
181
|
+
const { data, content } = matter2(raw);
|
|
182
|
+
const meta = data;
|
|
183
|
+
if (!meta["id"] || !content.trim()) {
|
|
184
|
+
logger.warn("Skipping invalid agent file", { filename });
|
|
185
|
+
return void 0;
|
|
186
|
+
}
|
|
187
|
+
const metadata = {
|
|
188
|
+
id: String(meta["id"]),
|
|
189
|
+
name: String(meta["name"] ?? meta["id"]),
|
|
190
|
+
description: String(meta["description"] ?? ""),
|
|
191
|
+
subagent: meta["subagent"] === true,
|
|
192
|
+
allowedTools: Array.isArray(meta["allowedTools"]) ? meta["allowedTools"].map(String) : [],
|
|
193
|
+
...typeof meta["color"] === "string" ? { color: meta["color"] } : {},
|
|
194
|
+
...Array.isArray(meta["results"]) ? { results: meta["results"].map(String) } : {}
|
|
195
|
+
};
|
|
196
|
+
return { metadata, prompt: content.trim() };
|
|
197
|
+
}
|
|
198
|
+
async function loadAgentsFromDir(dir) {
|
|
199
|
+
if (!await pathExists2(dir)) {
|
|
200
|
+
return [];
|
|
201
|
+
}
|
|
202
|
+
let files;
|
|
203
|
+
try {
|
|
204
|
+
files = (await readdir2(dir)).filter((f) => f.endsWith(AGENT_EXTENSION));
|
|
205
|
+
} catch {
|
|
206
|
+
return [];
|
|
207
|
+
}
|
|
208
|
+
const agents = [];
|
|
209
|
+
for (const file of files) {
|
|
210
|
+
try {
|
|
211
|
+
const raw = await readFile2(join2(dir, file), "utf-8");
|
|
212
|
+
const agent = parseAgentFile(raw, file);
|
|
213
|
+
if (agent) {
|
|
214
|
+
agents.push(agent);
|
|
215
|
+
}
|
|
216
|
+
} catch (err) {
|
|
217
|
+
logger.warn("Failed to parse agent file", { file, error: err instanceof Error ? err.message : String(err) });
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return agents;
|
|
221
|
+
}
|
|
222
|
+
async function loadDefaultAgents() {
|
|
223
|
+
const agents = await loadAgentsFromDir(DEFAULTS_DIR);
|
|
224
|
+
if (agents.length > 0) return agents;
|
|
225
|
+
return loadAgentsFromDir(DEFAULTS_DIR_ALT);
|
|
226
|
+
}
|
|
227
|
+
async function loadUserAgents(configDir) {
|
|
228
|
+
return loadAgentsFromDir(getAgentsDir(configDir));
|
|
229
|
+
}
|
|
230
|
+
async function loadProjectAgents(projectDir) {
|
|
231
|
+
return loadAgentsFromDir(getProjectAgentsDir(projectDir));
|
|
232
|
+
}
|
|
233
|
+
async function loadAllAgents(configDir, projectDir) {
|
|
234
|
+
const [defaultAgents, userAgents] = await Promise.all([loadDefaultAgents(), loadUserAgents(configDir)]);
|
|
235
|
+
const agentMap = /* @__PURE__ */ new Map();
|
|
236
|
+
for (const agent of defaultAgents) {
|
|
237
|
+
agentMap.set(agent.metadata.id, agent);
|
|
238
|
+
}
|
|
239
|
+
for (const agent of userAgents) {
|
|
240
|
+
agentMap.set(agent.metadata.id, agent);
|
|
241
|
+
}
|
|
242
|
+
if (projectDir) {
|
|
243
|
+
const projectAgents = await loadProjectAgents(projectDir);
|
|
244
|
+
for (const agent of projectAgents) {
|
|
245
|
+
agentMap.set(agent.metadata.id, agent);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
return Array.from(agentMap.values());
|
|
249
|
+
}
|
|
250
|
+
async function saveAgentToProject(projectDir, agent) {
|
|
251
|
+
await saveItemToDir(
|
|
252
|
+
getProjectAgentsDir(projectDir),
|
|
253
|
+
agent,
|
|
254
|
+
AGENT_EXTENSION,
|
|
255
|
+
(a) => matter2.stringify(a.prompt, a.metadata)
|
|
256
|
+
);
|
|
257
|
+
}
|
|
258
|
+
async function deleteProjectAgent(projectDir, agentId) {
|
|
259
|
+
const agentsDir = getProjectAgentsDir(projectDir);
|
|
260
|
+
const paths = getAgentFilePaths(agentsDir, agentId);
|
|
261
|
+
for (const filePath of paths) {
|
|
262
|
+
try {
|
|
263
|
+
await unlink2(filePath);
|
|
264
|
+
return { success: true };
|
|
265
|
+
} catch {
|
|
266
|
+
continue;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return { success: false };
|
|
270
|
+
}
|
|
271
|
+
async function loadAllAgentsDefault() {
|
|
272
|
+
try {
|
|
273
|
+
const config = getRuntimeConfig();
|
|
274
|
+
const configDir = getGlobalConfigDir(config.mode ?? "production");
|
|
275
|
+
return await loadAllAgents(configDir, config.workdir);
|
|
276
|
+
} catch {
|
|
277
|
+
return loadDefaultAgents();
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
async function getDefaultAgentIds() {
|
|
281
|
+
for (const dir of [DEFAULTS_DIR, DEFAULTS_DIR_ALT]) {
|
|
282
|
+
try {
|
|
283
|
+
const files = (await readdir2(dir)).filter((f) => f.endsWith(AGENT_EXTENSION));
|
|
284
|
+
return files.map((f) => f.replace(AGENT_EXTENSION, ""));
|
|
285
|
+
} catch {
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
return [];
|
|
289
|
+
}
|
|
290
|
+
async function isDefaultAgent(agentId) {
|
|
291
|
+
const defaultIds = await getDefaultAgentIds();
|
|
292
|
+
return defaultIds.includes(agentId);
|
|
293
|
+
}
|
|
294
|
+
function getAgentFilePaths(agentsDir, agentId) {
|
|
295
|
+
const hyphenated = agentId.replace(/_/g, "-");
|
|
296
|
+
return [join2(agentsDir, `${agentId}${AGENT_EXTENSION}`), join2(agentsDir, `${hyphenated}${AGENT_EXTENSION}`)];
|
|
297
|
+
}
|
|
298
|
+
function findAgentById(agentId, agents) {
|
|
299
|
+
return agents.find((a) => a.metadata.id === agentId);
|
|
300
|
+
}
|
|
301
|
+
function getSubAgents(agents) {
|
|
302
|
+
return agents.filter((a) => a.metadata.subagent);
|
|
303
|
+
}
|
|
304
|
+
function getTopLevelAgents(agents) {
|
|
305
|
+
return agents.filter((a) => !a.metadata.subagent);
|
|
306
|
+
}
|
|
307
|
+
async function agentExists(configDir, agentId, projectDir) {
|
|
308
|
+
const agentsDir = getAgentsDir(configDir);
|
|
309
|
+
const paths = getAgentFilePaths(agentsDir, agentId);
|
|
310
|
+
for (const filePath of paths) {
|
|
311
|
+
if (await pathExists2(filePath)) {
|
|
312
|
+
return true;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
if (projectDir) {
|
|
316
|
+
const projectPaths = getAgentFilePaths(getProjectAgentsDir(projectDir), agentId);
|
|
317
|
+
for (const filePath of projectPaths) {
|
|
318
|
+
if (await pathExists2(filePath)) {
|
|
319
|
+
return true;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
return false;
|
|
324
|
+
}
|
|
325
|
+
async function saveAgent(configDir, agent) {
|
|
326
|
+
const agentsDir = getAgentsDir(configDir);
|
|
327
|
+
if (!await pathExists2(agentsDir)) {
|
|
328
|
+
await mkdir2(agentsDir, { recursive: true });
|
|
329
|
+
}
|
|
330
|
+
const filePath = join2(agentsDir, `${agent.metadata.id}${AGENT_EXTENSION}`);
|
|
331
|
+
const content = matter2.stringify(agent.prompt, agent.metadata);
|
|
332
|
+
await writeFile2(filePath, content, "utf-8");
|
|
333
|
+
}
|
|
334
|
+
async function deleteAgent(configDir, agentId) {
|
|
335
|
+
const isDefault = await isDefaultAgent(agentId);
|
|
336
|
+
if (isDefault) {
|
|
337
|
+
return { success: false, reason: "Cannot delete built-in defaults" };
|
|
338
|
+
}
|
|
339
|
+
const agentsDir = getAgentsDir(configDir);
|
|
340
|
+
const paths = getAgentFilePaths(agentsDir, agentId);
|
|
341
|
+
for (const filePath of paths) {
|
|
342
|
+
try {
|
|
343
|
+
await unlink2(filePath);
|
|
344
|
+
return { success: true };
|
|
345
|
+
} catch {
|
|
346
|
+
continue;
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
return { success: false };
|
|
350
|
+
}
|
|
351
|
+
function resolveDefaultAgentId() {
|
|
352
|
+
try {
|
|
353
|
+
const dbSetting = getSetting(SETTINGS_KEYS.DEFAULT_AGENT);
|
|
354
|
+
if (dbSetting && dbSetting.trim().length > 0) {
|
|
355
|
+
return dbSetting.trim();
|
|
356
|
+
}
|
|
357
|
+
} catch (err) {
|
|
358
|
+
logger.debug("Failed to read defaultAgent from DB settings", {
|
|
359
|
+
error: err instanceof Error ? err.message : String(err)
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
try {
|
|
363
|
+
const config = getRuntimeConfig();
|
|
364
|
+
if (config.defaultAgent && config.defaultAgent.trim().length > 0) {
|
|
365
|
+
return config.defaultAgent.trim();
|
|
366
|
+
}
|
|
367
|
+
} catch {
|
|
368
|
+
}
|
|
369
|
+
return "planner";
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
export {
|
|
373
|
+
pathExists,
|
|
374
|
+
getDefaultIds,
|
|
375
|
+
loadItemsFromDir,
|
|
376
|
+
saveItemToDir,
|
|
377
|
+
jsonSerializer,
|
|
378
|
+
deleteItemFromDir,
|
|
379
|
+
loadConfig,
|
|
380
|
+
setRuntimeConfig,
|
|
381
|
+
getRuntimeConfig,
|
|
382
|
+
loadDefaultAgents,
|
|
383
|
+
loadUserAgents,
|
|
384
|
+
loadProjectAgents,
|
|
385
|
+
loadAllAgents,
|
|
386
|
+
saveAgentToProject,
|
|
387
|
+
deleteProjectAgent,
|
|
388
|
+
loadAllAgentsDefault,
|
|
389
|
+
getDefaultAgentIds,
|
|
390
|
+
isDefaultAgent,
|
|
391
|
+
findAgentById,
|
|
392
|
+
getSubAgents,
|
|
393
|
+
getTopLevelAgents,
|
|
394
|
+
agentExists,
|
|
395
|
+
saveAgent,
|
|
396
|
+
deleteAgent,
|
|
397
|
+
resolveDefaultAgentId
|
|
398
|
+
};
|
|
399
|
+
//# sourceMappingURL=chunk-FYYPQ27K.js.map
|
|
@@ -3,22 +3,17 @@ import {
|
|
|
3
3
|
computeSessionHash,
|
|
4
4
|
runAgentTurn,
|
|
5
5
|
runChatTurn
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-FTJ7U3VN.js";
|
|
7
7
|
import {
|
|
8
|
-
deleteItemFromDir,
|
|
9
8
|
devServerManager,
|
|
10
9
|
executeSubAgent,
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
jsonSerializer,
|
|
14
|
-
loadAllAgentsDefault,
|
|
15
|
-
saveItemToDir
|
|
16
|
-
} from "./chunk-OBQN5ATP.js";
|
|
10
|
+
getToolRegistryForAgent
|
|
11
|
+
} from "./chunk-RSO2HKNH.js";
|
|
17
12
|
import {
|
|
18
13
|
checkAborted,
|
|
19
14
|
onProcessEvent,
|
|
20
15
|
spawnShellProcess
|
|
21
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-3JYPDZT2.js";
|
|
22
17
|
import {
|
|
23
18
|
gitSpawnEnv
|
|
24
19
|
} from "./chunk-J7GAZGZT.js";
|
|
@@ -43,14 +38,14 @@ import {
|
|
|
43
38
|
} from "./chunk-EU3WWTFH.js";
|
|
44
39
|
import {
|
|
45
40
|
appendCompactionPrompt
|
|
46
|
-
} from "./chunk-
|
|
41
|
+
} from "./chunk-WVMOGE7U.js";
|
|
47
42
|
import {
|
|
48
43
|
TurnMetrics,
|
|
49
44
|
createMessageStartEvent
|
|
50
|
-
} from "./chunk-
|
|
45
|
+
} from "./chunk-H765CIHN.js";
|
|
51
46
|
import {
|
|
52
47
|
getPlatformShell
|
|
53
|
-
} from "./chunk-
|
|
48
|
+
} from "./chunk-W23S3TU5.js";
|
|
54
49
|
import {
|
|
55
50
|
killProcessTree,
|
|
56
51
|
terminateProcessTree
|
|
@@ -58,16 +53,24 @@ import {
|
|
|
58
53
|
import {
|
|
59
54
|
combineEventsWithSnapshot,
|
|
60
55
|
getCurrentContextWindowId,
|
|
61
|
-
getEventStore
|
|
62
|
-
|
|
63
|
-
} from "./chunk-BUXIESO5.js";
|
|
56
|
+
getEventStore
|
|
57
|
+
} from "./chunk-V5LOH363.js";
|
|
64
58
|
import {
|
|
65
59
|
buildMessagesFromStoredEvents,
|
|
66
60
|
foldPendingConfirmations
|
|
67
|
-
} from "./chunk-
|
|
61
|
+
} from "./chunk-OHKBGMLO.js";
|
|
62
|
+
import {
|
|
63
|
+
deleteItemFromDir,
|
|
64
|
+
findAgentById,
|
|
65
|
+
getRuntimeConfig,
|
|
66
|
+
jsonSerializer,
|
|
67
|
+
loadAllAgentsDefault,
|
|
68
|
+
resolveDefaultAgentId,
|
|
69
|
+
saveItemToDir
|
|
70
|
+
} from "./chunk-FYYPQ27K.js";
|
|
68
71
|
import {
|
|
69
72
|
getMaxVisibleItems
|
|
70
|
-
} from "./chunk-
|
|
73
|
+
} from "./chunk-STFIEU5F.js";
|
|
71
74
|
import {
|
|
72
75
|
logger
|
|
73
76
|
} from "./chunk-K44MW7JJ.js";
|
|
@@ -818,7 +821,7 @@ async function executeWorkflow(workflow, options, subGroup) {
|
|
|
818
821
|
sessionManager.setPhase(sessionId, step.phase);
|
|
819
822
|
if (step.type === "agent") {
|
|
820
823
|
const agentStep = step;
|
|
821
|
-
sessionManager.setMode(sessionId, agentStep.agentId ??
|
|
824
|
+
sessionManager.setMode(sessionId, agentStep.agentId ?? resolveDefaultAgentId());
|
|
822
825
|
}
|
|
823
826
|
logger.debug("Workflow step executing", { sessionId, iteration: iterations, stepId: step.id, stepType: step.type });
|
|
824
827
|
let stepOutcome = null;
|
|
@@ -881,7 +884,7 @@ async function executeWorkflow(workflow, options, subGroup) {
|
|
|
881
884
|
...onMessage ? { onMessage } : {}
|
|
882
885
|
},
|
|
883
886
|
turnMetrics,
|
|
884
|
-
agentStep.agentId ??
|
|
887
|
+
agentStep.agentId ?? resolveDefaultAgentId(),
|
|
885
888
|
append,
|
|
886
889
|
{
|
|
887
890
|
...!firstEntryForStep.has(step.id) && !agentStep.prompt ? { injectKickoff: () => injectGenericKickoff(sessionId) } : {},
|
|
@@ -2217,4 +2220,4 @@ export {
|
|
|
2217
2220
|
signalMcpReady,
|
|
2218
2221
|
createWebSocketServer
|
|
2219
2222
|
};
|
|
2220
|
-
//# sourceMappingURL=chunk-
|
|
2223
|
+
//# sourceMappingURL=chunk-GLRTJJOB.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getPlatformShell
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-W23S3TU5.js";
|
|
4
4
|
import {
|
|
5
5
|
streamWithSegments
|
|
6
6
|
} from "./chunk-J2GP3J3X.js";
|
|
@@ -680,4 +680,4 @@ export {
|
|
|
680
680
|
createChatDoneEvent,
|
|
681
681
|
consumeStreamGenerator
|
|
682
682
|
};
|
|
683
|
-
//# sourceMappingURL=chunk-
|
|
683
|
+
//# sourceMappingURL=chunk-H765CIHN.js.map
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import {
|
|
2
|
+
resolveDefaultAgentId
|
|
3
|
+
} from "./chunk-FYYPQ27K.js";
|
|
1
4
|
import {
|
|
2
5
|
getDatabase
|
|
3
6
|
} from "./chunk-RGUUZD5B.js";
|
|
@@ -17,10 +20,11 @@ function createSession(projectId, workdir, title, providerId, providerModel, wor
|
|
|
17
20
|
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
18
21
|
const id = crypto.randomUUID();
|
|
19
22
|
const dangerLevel = getProjectDangerLevel(projectId);
|
|
23
|
+
const defaultAgent = resolveDefaultAgentId();
|
|
20
24
|
db.prepare(
|
|
21
25
|
`
|
|
22
26
|
INSERT INTO sessions (id, project_id, workdir, workspace, branch, phase, mode, workflow_phase, is_running, created_at, updated_at, title, provider_id, provider_model, danger_level)
|
|
23
|
-
VALUES (?, ?, ?, ?, ?, 'idle',
|
|
27
|
+
VALUES (?, ?, ?, ?, ?, 'idle', ?, 'plan', 0, ?, ?, ?, ?, ?, ?)
|
|
24
28
|
`
|
|
25
29
|
).run(
|
|
26
30
|
id,
|
|
@@ -28,6 +32,7 @@ function createSession(projectId, workdir, title, providerId, providerModel, wor
|
|
|
28
32
|
workdir,
|
|
29
33
|
workspace ?? null,
|
|
30
34
|
branch ?? null,
|
|
35
|
+
defaultAgent,
|
|
31
36
|
now,
|
|
32
37
|
now,
|
|
33
38
|
title ?? null,
|
|
@@ -41,7 +46,7 @@ function createSession(projectId, workdir, title, providerId, providerModel, wor
|
|
|
41
46
|
workdir,
|
|
42
47
|
...workspace ? { workspace } : {},
|
|
43
48
|
...branch ? { branch } : {},
|
|
44
|
-
mode:
|
|
49
|
+
mode: defaultAgent,
|
|
45
50
|
phase: "plan",
|
|
46
51
|
isRunning: false,
|
|
47
52
|
providerId: providerId ?? null,
|
|
@@ -324,4 +329,4 @@ export {
|
|
|
324
329
|
updateSessionBranch,
|
|
325
330
|
deleteSession
|
|
326
331
|
};
|
|
327
|
-
//# sourceMappingURL=chunk-
|
|
332
|
+
//# sourceMappingURL=chunk-L4S5N3WV.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createLLMClient
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-MTZ3PC6K.js";
|
|
4
4
|
import {
|
|
5
5
|
getModelProfile
|
|
6
6
|
} from "./chunk-V4IE7HJY.js";
|
|
@@ -17,7 +17,7 @@ import {
|
|
|
17
17
|
} from "./chunk-RMXPVQP4.js";
|
|
18
18
|
import {
|
|
19
19
|
proxyFetch
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-ACL4YUJH.js";
|
|
21
21
|
import {
|
|
22
22
|
logger
|
|
23
23
|
} from "./chunk-K44MW7JJ.js";
|
|
@@ -810,4 +810,4 @@ export {
|
|
|
810
810
|
parseDefaultModelSelection,
|
|
811
811
|
createProviderManager
|
|
812
812
|
};
|
|
813
|
-
//# sourceMappingURL=chunk-
|
|
813
|
+
//# sourceMappingURL=chunk-M6X72DYZ.js.map
|
|
@@ -17,7 +17,7 @@ import {
|
|
|
17
17
|
import {
|
|
18
18
|
LLMError,
|
|
19
19
|
OpenAIHttpClient
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-ACL4YUJH.js";
|
|
21
21
|
import {
|
|
22
22
|
logger
|
|
23
23
|
} from "./chunk-K44MW7JJ.js";
|
|
@@ -268,4 +268,4 @@ function createLLMClient(config, initialBackend = "unknown") {
|
|
|
268
268
|
export {
|
|
269
269
|
createLLMClient
|
|
270
270
|
};
|
|
271
|
-
//# sourceMappingURL=chunk-
|
|
271
|
+
//# sourceMappingURL=chunk-MTZ3PC6K.js.map
|