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.
- package/dist/{chat-handler-377ZHEDW.js → chat-handler-AVGJQSYW.js} +16 -15
- package/dist/chunk-2Y2K66PD.js +7 -0
- package/dist/{chunk-JKZPMRH2.js → chunk-3JYPDZT2.js} +2 -2
- package/dist/{chunk-SJTG56CH.js → chunk-47WNBFDO.js} +2 -2
- package/dist/{chunk-J5E6ZE7O.js → chunk-4YXILHQC.js} +135 -103
- package/dist/{chunk-3D3N2PXI.js → chunk-5W2FIWDH.js} +3 -3
- package/dist/{chunk-IIRXKSB5.js → chunk-ACL4YUJH.js} +10 -2
- package/dist/{chunk-G4PVYDVM.js → chunk-B6VZS5SC.js} +20 -17
- package/dist/{chunk-WL6AOKRD.js → chunk-BKH4SIWV.js} +11 -9
- package/dist/{chunk-XIVQNOXU.js → chunk-CK7G2JLY.js} +29 -24
- package/dist/chunk-FYYPQ27K.js +399 -0
- 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-55L4SHCO.js → chunk-PUJO6ITQ.js} +7 -7
- package/dist/{chunk-CKWD5V4W.js → chunk-SBVKT4GT.js} +95 -366
- package/dist/{chunk-CNJ63FXJ.js → chunk-STFIEU5F.js} +3 -2
- package/dist/{chunk-X6BXZFO7.js → chunk-U7RLUZBP.js} +1 -1
- 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/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-LRKFV4MN.js → orchestrator-AGJ7EMFZ.js} +15 -14
- package/dist/package.json +1 -1
- package/dist/{path-security-AWDNKRZ4.js → path-security-DWL3R2SF.js} +10 -7
- package/dist/{platform-7AK5MB4K.js → platform-OYKGQ7Z3.js} +3 -3
- package/dist/{processor-LXVRVPBN.js → processor-VCDVG7RV.js} +16 -15
- package/dist/{protocol-Q7X4NEME.js → protocol-BUA2W2KM.js} +3 -3
- package/dist/{protocol-9WP7lLec.d.ts → protocol-BzTZcNEh.d.ts} +3 -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-SYGARZPL.js → serve-6GYDVM34.js} +22 -21
- package/dist/server/index.d.ts +4 -4
- package/dist/server/index.js +21 -20
- package/dist/{server-ZU3IU7WH.js → server-3X46OIYC.js} +17 -16
- 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/shared/index.js +1 -1
- package/dist/{tools-6NVILBHW.js → tools-X65P65KF.js} +14 -13
- 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-VHU2XFPH.js → update-EOPW72IR.js} +2 -2
- package/dist/web/assets/index-xfwgrYl9.js +305 -0
- package/dist/web/index.html +1 -1
- package/dist/web/sw.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-YWBJRUDI.js +0 -7
- 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-
|
|
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
|
|
@@ -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(
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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-
|
|
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
|
|
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 &&
|
|
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-
|
|
912
|
+
//# sourceMappingURL=chunk-OHKBGMLO.js.map
|