openfox 2.0.84 → 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.
Files changed (57) hide show
  1. package/dist/{chat-handler-377ZHEDW.js → chat-handler-3CWMOIOR.js} +14 -13
  2. package/dist/{chunk-3D3N2PXI.js → chunk-2KKFOVK7.js} +2 -2
  3. package/dist/{chunk-JKZPMRH2.js → chunk-3JYPDZT2.js} +2 -2
  4. package/dist/chunk-7WAOMWR3.js +7 -0
  5. package/dist/{chunk-IIRXKSB5.js → chunk-ACL4YUJH.js} +10 -2
  6. package/dist/{chunk-J5E6ZE7O.js → chunk-DLJYYWM2.js} +132 -100
  7. package/dist/{chunk-G4PVYDVM.js → chunk-FTJ7U3VN.js} +20 -17
  8. package/dist/chunk-FYYPQ27K.js +399 -0
  9. package/dist/{chunk-XIVQNOXU.js → chunk-GLRTJJOB.js} +23 -20
  10. package/dist/{chunk-FVY2JOTO.js → chunk-H765CIHN.js} +2 -2
  11. package/dist/{chunk-AANVMTYU.js → chunk-L4S5N3WV.js} +8 -3
  12. package/dist/{chunk-VB23QPW3.js → chunk-M6X72DYZ.js} +3 -3
  13. package/dist/{chunk-SBSQD7MG.js → chunk-MTZ3PC6K.js} +2 -2
  14. package/dist/{chunk-NH2PVB6R.js → chunk-N54PQSCH.js} +33 -24
  15. package/dist/{chunk-A2IZ4PWQ.js → chunk-OHKBGMLO.js} +15 -4
  16. package/dist/{chunk-CKWD5V4W.js → chunk-RSO2HKNH.js} +90 -364
  17. package/dist/{chunk-WL6AOKRD.js → chunk-SGFQWQCE.js} +10 -8
  18. package/dist/{chunk-CNJ63FXJ.js → chunk-STFIEU5F.js} +3 -2
  19. package/dist/{chunk-BUXIESO5.js → chunk-V5LOH363.js} +6 -74
  20. package/dist/{chunk-5ZHVQOI3.js → chunk-W23S3TU5.js} +2 -2
  21. package/dist/{chunk-DQP5HSDS.js → chunk-WVMOGE7U.js} +3 -3
  22. package/dist/{chunk-55L4SHCO.js → chunk-XXII6DS3.js} +7 -7
  23. package/dist/cli/dev.js +1 -1
  24. package/dist/cli/index.js +1 -1
  25. package/dist/{client-TA2VD4LR.js → client-C2P67MA4.js} +4 -4
  26. package/dist/{compactor-YKESKGHL.js → compactor-2YT66FDZ.js} +10 -8
  27. package/dist/{config-EN3WEH4A.js → config-JN6MW5SL.js} +2 -2
  28. package/dist/{events-GF2WNELM.js → events-OEDAFNEI.js} +7 -4
  29. package/dist/{folding-UACKBHUZ.js → folding-FGTCP73N.js} +7 -2
  30. package/dist/{http-client-QZY7W36Q.js → http-client-I52X7GQB.js} +3 -3
  31. package/dist/{manager-WOUOQVLV.js → manager-TD2UT62O.js} +4 -4
  32. package/dist/{orchestrator-LRKFV4MN.js → orchestrator-6RYJYR3T.js} +13 -12
  33. package/dist/package.json +1 -1
  34. package/dist/{path-security-AWDNKRZ4.js → path-security-7ZNIG3ZE.js} +8 -5
  35. package/dist/{platform-7AK5MB4K.js → platform-OYKGQ7Z3.js} +3 -3
  36. package/dist/{processor-LXVRVPBN.js → processor-IGRFA3KA.js} +14 -13
  37. package/dist/{protocol-9WP7lLec.d.ts → protocol-5NJx1N4c.d.ts} +1 -1
  38. package/dist/provider/index.d.ts +4 -4
  39. package/dist/{provider-QVVJ6XNZ.js → provider-YNYYAR6C.js} +7 -7
  40. package/dist/{provider-manager-7246YSJT.js → provider-manager-3DW3A2VC.js} +5 -5
  41. package/dist/{serve-SYGARZPL.js → serve-LFC7D5B7.js} +20 -19
  42. package/dist/server/index.d.ts +4 -4
  43. package/dist/server/index.js +19 -18
  44. package/dist/{server-ZU3IU7WH.js → server-E5IA4SK7.js} +15 -14
  45. package/dist/{sessions-SFG42M4W.js → sessions-V3BF2OTU.js} +5 -2
  46. package/dist/{settings-6TJIHDVX.js → settings-AGNYWEIE.js} +2 -2
  47. package/dist/shared/index.d.ts +3 -3
  48. package/dist/{tools-6NVILBHW.js → tools-ZUTPBREL.js} +12 -11
  49. package/dist/{types-ulRvCqQX.d.ts → types-B4wa_vGm.d.ts} +2 -0
  50. package/dist/{types-BtY5XChg.d.ts → types-CrLD4iRS.d.ts} +1 -1
  51. package/dist/{update-VHU2XFPH.js → update-KDMUVXXI.js} +2 -2
  52. package/dist/web/assets/index-mJ_RQ-yF.js +305 -0
  53. package/dist/web/index.html +1 -1
  54. package/dist/web/sw.js +1 -1
  55. package/package.json +1 -1
  56. package/dist/chunk-YWBJRUDI.js +0 -7
  57. package/dist/web/assets/index-BhxPPOY-.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-CKWD5V4W.js";
9
+ } from "./chunk-RSO2HKNH.js";
13
10
  import {
14
11
  PathAccessDeniedError
15
- } from "./chunk-3D3N2PXI.js";
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-FVY2JOTO.js";
20
+ } from "./chunk-H765CIHN.js";
24
21
  import {
25
22
  getCurrentContextWindowId,
26
23
  getCurrentWindowMessageOptions,
27
- getEventStore,
28
- getRuntimeConfig
29
- } from "./chunk-BUXIESO5.js";
24
+ getEventStore
25
+ } from "./chunk-V5LOH363.js";
30
26
  import {
31
27
  buildSnapshotFromSessionState
32
- } from "./chunk-A2IZ4PWQ.js";
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("planner", allAgents);
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-6NVILBHW.js");
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-6NVILBHW.js");
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("planner", allAgents);
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-6TJIHDVX.js");
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("planner", allAgents);
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-G4PVYDVM.js.map
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-G4PVYDVM.js";
6
+ } from "./chunk-FTJ7U3VN.js";
7
7
  import {
8
- deleteItemFromDir,
9
8
  devServerManager,
10
9
  executeSubAgent,
11
- findAgentById,
12
- getToolRegistryForAgent,
13
- jsonSerializer,
14
- loadAllAgentsDefault,
15
- saveItemToDir
16
- } from "./chunk-CKWD5V4W.js";
10
+ getToolRegistryForAgent
11
+ } from "./chunk-RSO2HKNH.js";
17
12
  import {
18
13
  checkAborted,
19
14
  onProcessEvent,
20
15
  spawnShellProcess
21
- } from "./chunk-JKZPMRH2.js";
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-DQP5HSDS.js";
41
+ } from "./chunk-WVMOGE7U.js";
47
42
  import {
48
43
  TurnMetrics,
49
44
  createMessageStartEvent
50
- } from "./chunk-FVY2JOTO.js";
45
+ } from "./chunk-H765CIHN.js";
51
46
  import {
52
47
  getPlatformShell
53
- } from "./chunk-5ZHVQOI3.js";
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
- getRuntimeConfig
63
- } from "./chunk-BUXIESO5.js";
56
+ getEventStore
57
+ } from "./chunk-V5LOH363.js";
64
58
  import {
65
59
  buildMessagesFromStoredEvents,
66
60
  foldPendingConfirmations
67
- } from "./chunk-A2IZ4PWQ.js";
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-CNJ63FXJ.js";
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 ?? "planner");
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 ?? "planner",
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-XIVQNOXU.js.map
2223
+ //# sourceMappingURL=chunk-GLRTJJOB.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getPlatformShell
3
- } from "./chunk-5ZHVQOI3.js";
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-FVY2JOTO.js.map
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', 'planner', 'plan', 0, ?, ?, ?, ?, ?, ?)
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: "planner",
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-AANVMTYU.js.map
332
+ //# sourceMappingURL=chunk-L4S5N3WV.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createLLMClient
3
- } from "./chunk-SBSQD7MG.js";
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-IIRXKSB5.js";
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-VB23QPW3.js.map
813
+ //# sourceMappingURL=chunk-M6X72DYZ.js.map
@@ -17,7 +17,7 @@ import {
17
17
  import {
18
18
  LLMError,
19
19
  OpenAIHttpClient
20
- } from "./chunk-IIRXKSB5.js";
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-SBSQD7MG.js.map
271
+ //# sourceMappingURL=chunk-MTZ3PC6K.js.map