openfox 2.0.84 → 2.0.86

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 (61) hide show
  1. package/dist/{chat-handler-377ZHEDW.js → chat-handler-AVGJQSYW.js} +16 -15
  2. package/dist/chunk-2Y2K66PD.js +7 -0
  3. package/dist/{chunk-JKZPMRH2.js → chunk-3JYPDZT2.js} +2 -2
  4. package/dist/{chunk-SJTG56CH.js → chunk-47WNBFDO.js} +2 -2
  5. package/dist/{chunk-J5E6ZE7O.js → chunk-4YXILHQC.js} +135 -103
  6. package/dist/{chunk-3D3N2PXI.js → chunk-5W2FIWDH.js} +3 -3
  7. package/dist/{chunk-IIRXKSB5.js → chunk-ACL4YUJH.js} +10 -2
  8. package/dist/{chunk-G4PVYDVM.js → chunk-B6VZS5SC.js} +20 -17
  9. package/dist/{chunk-WL6AOKRD.js → chunk-BKH4SIWV.js} +11 -9
  10. package/dist/{chunk-XIVQNOXU.js → chunk-CK7G2JLY.js} +29 -24
  11. package/dist/chunk-FYYPQ27K.js +399 -0
  12. package/dist/{chunk-FVY2JOTO.js → chunk-H765CIHN.js} +2 -2
  13. package/dist/{chunk-AANVMTYU.js → chunk-L4S5N3WV.js} +8 -3
  14. package/dist/{chunk-VB23QPW3.js → chunk-M6X72DYZ.js} +3 -3
  15. package/dist/{chunk-SBSQD7MG.js → chunk-MTZ3PC6K.js} +2 -2
  16. package/dist/{chunk-NH2PVB6R.js → chunk-N54PQSCH.js} +33 -24
  17. package/dist/{chunk-A2IZ4PWQ.js → chunk-OHKBGMLO.js} +15 -4
  18. package/dist/{chunk-55L4SHCO.js → chunk-PUJO6ITQ.js} +7 -7
  19. package/dist/{chunk-CKWD5V4W.js → chunk-SBVKT4GT.js} +95 -366
  20. package/dist/{chunk-CNJ63FXJ.js → chunk-STFIEU5F.js} +3 -2
  21. package/dist/{chunk-X6BXZFO7.js → chunk-U7RLUZBP.js} +1 -1
  22. package/dist/{chunk-BUXIESO5.js → chunk-V5LOH363.js} +6 -74
  23. package/dist/{chunk-5ZHVQOI3.js → chunk-W23S3TU5.js} +2 -2
  24. package/dist/{chunk-DQP5HSDS.js → chunk-WVMOGE7U.js} +3 -3
  25. package/dist/cli/dev.js +1 -1
  26. package/dist/cli/index.js +1 -1
  27. package/dist/{client-TA2VD4LR.js → client-C2P67MA4.js} +4 -4
  28. package/dist/{compactor-YKESKGHL.js → compactor-2YT66FDZ.js} +10 -8
  29. package/dist/{config-EN3WEH4A.js → config-JN6MW5SL.js} +2 -2
  30. package/dist/{events-GF2WNELM.js → events-OEDAFNEI.js} +7 -4
  31. package/dist/{folding-UACKBHUZ.js → folding-FGTCP73N.js} +7 -2
  32. package/dist/{http-client-QZY7W36Q.js → http-client-I52X7GQB.js} +3 -3
  33. package/dist/{manager-WOUOQVLV.js → manager-TD2UT62O.js} +4 -4
  34. package/dist/{orchestrator-LRKFV4MN.js → orchestrator-AGJ7EMFZ.js} +15 -14
  35. package/dist/package.json +1 -1
  36. package/dist/{path-security-AWDNKRZ4.js → path-security-DWL3R2SF.js} +10 -7
  37. package/dist/{platform-7AK5MB4K.js → platform-OYKGQ7Z3.js} +3 -3
  38. package/dist/{processor-LXVRVPBN.js → processor-VCDVG7RV.js} +16 -15
  39. package/dist/{protocol-Q7X4NEME.js → protocol-BUA2W2KM.js} +3 -3
  40. package/dist/{protocol-9WP7lLec.d.ts → protocol-BzTZcNEh.d.ts} +3 -1
  41. package/dist/provider/index.d.ts +4 -4
  42. package/dist/{provider-QVVJ6XNZ.js → provider-YNYYAR6C.js} +7 -7
  43. package/dist/{provider-manager-7246YSJT.js → provider-manager-3DW3A2VC.js} +5 -5
  44. package/dist/{serve-SYGARZPL.js → serve-6GYDVM34.js} +22 -21
  45. package/dist/server/index.d.ts +4 -4
  46. package/dist/server/index.js +21 -20
  47. package/dist/{server-ZU3IU7WH.js → server-3X46OIYC.js} +17 -16
  48. package/dist/{sessions-SFG42M4W.js → sessions-V3BF2OTU.js} +5 -2
  49. package/dist/{settings-6TJIHDVX.js → settings-AGNYWEIE.js} +2 -2
  50. package/dist/shared/index.d.ts +3 -3
  51. package/dist/shared/index.js +1 -1
  52. package/dist/{tools-6NVILBHW.js → tools-X65P65KF.js} +14 -13
  53. package/dist/{types-ulRvCqQX.d.ts → types-B4wa_vGm.d.ts} +2 -0
  54. package/dist/{types-BtY5XChg.d.ts → types-CrLD4iRS.d.ts} +1 -1
  55. package/dist/{update-VHU2XFPH.js → update-EOPW72IR.js} +2 -2
  56. package/dist/web/assets/index-xfwgrYl9.js +305 -0
  57. package/dist/web/index.html +1 -1
  58. package/dist/web/sw.js +1 -1
  59. package/package.json +1 -1
  60. package/dist/chunk-YWBJRUDI.js +0 -7
  61. package/dist/web/assets/index-BhxPPOY-.js +0 -305
@@ -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
@@ -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
@@ -52,22 +52,24 @@ var providerSchema = z.object({
52
52
  authAdapter: z.string().optional(),
53
53
  transportAdapter: z.string().optional(),
54
54
  credentialRef: z.string().optional()
55
- }).transform((provider) => ({
56
- id: provider.id,
57
- ...provider.preset ? { preset: provider.preset } : {},
58
- name: provider.name ?? provider.id,
59
- url: provider.url ?? "",
60
- backend: provider.backend ?? "unknown",
61
- ...provider.apiKey ? { apiKey: provider.apiKey } : {},
62
- models: provider.models ?? [],
63
- isActive: provider.isActive ?? false,
64
- createdAt: provider.createdAt ?? (/* @__PURE__ */ new Date()).toISOString(),
65
- ...provider.isLocal !== void 0 ? { isLocal: provider.isLocal } : {},
66
- ...provider.thinkingField ? { thinkingField: provider.thinkingField } : {},
67
- ...provider.authAdapter ? { authAdapter: provider.authAdapter } : {},
68
- ...provider.transportAdapter ? { transportAdapter: provider.transportAdapter } : {},
69
- ...provider.credentialRef ? { credentialRef: provider.credentialRef } : {}
70
- }));
55
+ }).transform(
56
+ (provider) => ({
57
+ id: provider.id,
58
+ ...provider.preset ? { preset: provider.preset } : {},
59
+ name: provider.name ?? provider.id,
60
+ url: provider.url ?? "",
61
+ backend: provider.backend ?? "unknown",
62
+ ...provider.apiKey ? { apiKey: provider.apiKey } : {},
63
+ models: provider.models ?? [],
64
+ isActive: provider.isActive ?? false,
65
+ createdAt: provider.createdAt ?? (/* @__PURE__ */ new Date()).toISOString(),
66
+ ...provider.isLocal !== void 0 ? { isLocal: provider.isLocal } : {},
67
+ ...provider.thinkingField ? { thinkingField: provider.thinkingField } : {},
68
+ ...provider.authAdapter ? { authAdapter: provider.authAdapter } : {},
69
+ ...provider.transportAdapter ? { transportAdapter: provider.transportAdapter } : {},
70
+ ...provider.credentialRef ? { credentialRef: provider.credentialRef } : {}
71
+ })
72
+ );
71
73
  var serverSchema = z.object({
72
74
  port: z.number().default(10369),
73
75
  host: z.string().default("127.0.0.1"),
@@ -129,7 +131,8 @@ var configSchema = z.object({
129
131
  workspace: workspaceSchema.default(() => ({ workdir: process.cwd() })),
130
132
  llm: llmConfigSchema.optional(),
131
133
  visionFallback: visionFallbackSchema.optional(),
132
- disableAutoSessionTitle: z.boolean().optional()
134
+ disableAutoSessionTitle: z.boolean().optional(),
135
+ defaultAgent: z.string().optional()
133
136
  }).transform((data) => ({
134
137
  providers: data.providers ?? [],
135
138
  mcpServers: data.mcpServers,
@@ -142,7 +145,8 @@ var configSchema = z.object({
142
145
  workspace: data.workspace ?? { workdir: process.cwd() },
143
146
  llm: data.llm,
144
147
  visionFallback: data.visionFallback ?? defaultVisionFallback,
145
- ...data.disableAutoSessionTitle !== void 0 ? { disableAutoSessionTitle: data.disableAutoSessionTitle } : {}
148
+ ...data.disableAutoSessionTitle !== void 0 ? { disableAutoSessionTitle: data.disableAutoSessionTitle } : {},
149
+ ...data.defaultAgent !== void 0 ? { defaultAgent: data.defaultAgent } : {}
146
150
  }));
147
151
  function getVisionFallback(config) {
148
152
  return config.visionFallback ?? getDefaultVisionFallback();
@@ -174,7 +178,8 @@ async function saveGlobalConfig(mode, config, configPathOverride) {
174
178
  workspace: config.workspace ?? { workdir: process.cwd() },
175
179
  llm: config.llm,
176
180
  visionFallback: config.visionFallback ?? defaultVisionFallback,
177
- ...config.disableAutoSessionTitle !== void 0 ? { disableAutoSessionTitle: config.disableAutoSessionTitle } : {}
181
+ ...config.disableAutoSessionTitle !== void 0 ? { disableAutoSessionTitle: config.disableAutoSessionTitle } : {},
182
+ ...config.defaultAgent !== void 0 ? { defaultAgent: config.defaultAgent } : {}
178
183
  };
179
184
  await mkdir(dirname(configPath), { recursive: true });
180
185
  await writeFile(configPath, JSON.stringify(fullConfig, null, 2));
@@ -206,7 +211,8 @@ function setDefaultModelSelection(config, providerId, model) {
206
211
  database: config.database ?? { path: "" },
207
212
  workspace: config.workspace ?? { workdir: process.cwd() },
208
213
  llm: config.llm,
209
- visionFallback: config.visionFallback ?? defaultVisionFallback
214
+ visionFallback: config.visionFallback ?? defaultVisionFallback,
215
+ ...config.defaultAgent !== void 0 ? { defaultAgent: config.defaultAgent } : {}
210
216
  };
211
217
  }
212
218
  function addProvider(config, provider) {
@@ -230,7 +236,8 @@ function addProvider(config, provider) {
230
236
  database: config.database ?? { path: "" },
231
237
  workspace: config.workspace ?? { workdir: process.cwd() },
232
238
  llm: config.llm,
233
- visionFallback: config.visionFallback ?? defaultVisionFallback
239
+ visionFallback: config.visionFallback ?? defaultVisionFallback,
240
+ ...config.defaultAgent !== void 0 ? { defaultAgent: config.defaultAgent } : {}
234
241
  };
235
242
  }
236
243
  function updateProvider(config, providerId, updates) {
@@ -264,7 +271,8 @@ function removeProvider(config, providerId) {
264
271
  database: config.database ?? { path: "" },
265
272
  workspace: config.workspace ?? { workdir: process.cwd() },
266
273
  llm: config.llm,
267
- visionFallback: config.visionFallback ?? defaultVisionFallback
274
+ visionFallback: config.visionFallback ?? defaultVisionFallback,
275
+ ...config.defaultAgent !== void 0 ? { defaultAgent: config.defaultAgent } : {}
268
276
  };
269
277
  }
270
278
  function activateProvider(config, providerId) {
@@ -295,7 +303,8 @@ function activateProvider(config, providerId) {
295
303
  database: config.database ?? { path: "" },
296
304
  workspace: config.workspace ?? { workdir: process.cwd() },
297
305
  llm: config.llm,
298
- visionFallback: config.visionFallback ?? defaultVisionFallback
306
+ visionFallback: config.visionFallback ?? defaultVisionFallback,
307
+ ...config.defaultAgent !== void 0 ? { defaultAgent: config.defaultAgent } : {}
299
308
  };
300
309
  }
301
310
 
@@ -313,4 +322,4 @@ export {
313
322
  removeProvider,
314
323
  activateProvider
315
324
  };
316
- //# sourceMappingURL=chunk-NH2PVB6R.js.map
325
+ //# sourceMappingURL=chunk-N54PQSCH.js.map
@@ -1,3 +1,7 @@
1
+ import {
2
+ resolveDefaultAgentId
3
+ } from "./chunk-FYYPQ27K.js";
4
+
1
5
  // src/server/events/apply-events.ts
2
6
  function markComplete(msg, reason) {
3
7
  msg.isComplete = true;
@@ -613,7 +617,10 @@ function foldContextState(events, initialWindowId) {
613
617
  latestContextState
614
618
  };
615
619
  }
616
- function foldMode(events, defaultMode = "planner") {
620
+ function foldMode(events, defaultMode) {
621
+ if (defaultMode === void 0) {
622
+ defaultMode = resolveDefaultAgentId();
623
+ }
617
624
  let mode = defaultMode;
618
625
  for (const event of events) {
619
626
  if (event.type === "mode.changed") {
@@ -692,14 +699,18 @@ function foldSessionState(events, initialWindowId, maxTokens, initialMessages, d
692
699
  const contextState = baseContextState.compactionCount !== contextResult.compactionCount || baseContextState.maxTokens !== maxTokens ? { ...baseContextState, compactionCount: contextResult.compactionCount, maxTokens } : { ...baseContextState, maxTokens };
693
700
  let cachedSystemPrompt;
694
701
  let dynamicContextHash;
702
+ let metadataEntriesMerged = false;
695
703
  for (let i = events.length - 1; i >= 0; i--) {
696
704
  const event = events[i];
697
705
  if (event.type === "turn.snapshot") {
698
706
  const snapshotData = event.data;
699
707
  if (snapshotData.cachedSystemPrompt && !cachedSystemPrompt) cachedSystemPrompt = snapshotData.cachedSystemPrompt;
700
708
  if (snapshotData.dynamicContextHash && !dynamicContextHash) dynamicContextHash = snapshotData.dynamicContextHash;
701
- if (snapshotData.metadataEntries && Object.keys(metadataEntries).length === 0)
702
- metadataEntries = snapshotData.metadataEntries;
709
+ if (snapshotData.metadataEntries && !metadataEntriesMerged) {
710
+ metadataEntries = { ...snapshotData.metadataEntries, ...metadataEntries };
711
+ metadataEntriesMerged = true;
712
+ }
713
+ if (cachedSystemPrompt && dynamicContextHash && metadataEntriesMerged) break;
703
714
  }
704
715
  }
705
716
  let sessionInit;
@@ -898,4 +909,4 @@ export {
898
909
  buildSnapshot,
899
910
  buildSnapshotFromSessionState
900
911
  };
901
- //# sourceMappingURL=chunk-A2IZ4PWQ.js.map
912
+ //# sourceMappingURL=chunk-OHKBGMLO.js.map