openfox 1.6.15 → 1.6.16
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/{auto-compaction-JZIM73ZY.js → auto-compaction-2RKC6DC2.js} +2 -2
- package/dist/{chat-handler-F2A2IMQB.js → chat-handler-IY2XVOO6.js} +4 -4
- package/dist/{chunk-3WHZ47PY.js → chunk-4OI4VPZ6.js} +140 -238
- package/dist/{chunk-G4E72ST3.js → chunk-NN65D5SI.js} +376 -273
- package/dist/{chunk-JFKYCGZ5.js → chunk-T5PBG2PE.js} +2 -2
- package/dist/{chunk-YM6VHAPM.js → chunk-U54QVKL2.js} +2 -2
- package/dist/cli/dev.js +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/{orchestrator-SRSG2SIZ.js → orchestrator-U5VCLBYQ.js} +3 -3
- package/dist/package.json +1 -1
- package/dist/{processor-H5BQ5HQM.js → processor-VUEJM73B.js} +2 -2
- package/dist/{serve-5AY7GMN7.js → serve-GOLQMQFA.js} +4 -4
- package/dist/server/index.js +3 -3
- package/dist/{tools-VOWNOP6V.js → tools-55YICCVH.js} +2 -2
- package/dist/web/assets/index-CZBXRYpK.js +150 -0
- package/dist/web/assets/{index-CNeIjdxm.css → index-D4V7Gtvt.css} +1 -1
- package/dist/web/index.html +2 -2
- package/dist/web/sw.js +1 -1
- package/package.json +1 -1
- package/dist/web/assets/index-mBLhctLW.js +0 -150
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
maybeAutoCompactContext,
|
|
3
3
|
performManualContextCompaction,
|
|
4
4
|
resolveCompactionStatsIdentity
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-4OI4VPZ6.js";
|
|
6
6
|
import "./chunk-NBU6KIOD.js";
|
|
7
7
|
import "./chunk-574HZVLE.js";
|
|
8
8
|
import "./chunk-55N6FAAZ.js";
|
|
@@ -22,4 +22,4 @@ export {
|
|
|
22
22
|
performManualContextCompaction,
|
|
23
23
|
resolveCompactionStatsIdentity
|
|
24
24
|
};
|
|
25
|
-
//# sourceMappingURL=auto-compaction-
|
|
25
|
+
//# sourceMappingURL=auto-compaction-2RKC6DC2.js.map
|
|
@@ -10,8 +10,8 @@ import {
|
|
|
10
10
|
} from "./chunk-F54ZJN4X.js";
|
|
11
11
|
import {
|
|
12
12
|
runChatTurn
|
|
13
|
-
} from "./chunk-
|
|
14
|
-
import "./chunk-
|
|
13
|
+
} from "./chunk-U54QVKL2.js";
|
|
14
|
+
import "./chunk-4OI4VPZ6.js";
|
|
15
15
|
import "./chunk-NBU6KIOD.js";
|
|
16
16
|
import "./chunk-574HZVLE.js";
|
|
17
17
|
import "./chunk-55N6FAAZ.js";
|
|
@@ -61,7 +61,7 @@ async function startChatSession(sessionId, content, deps, options) {
|
|
|
61
61
|
sessionManager.setRunning(sessionId, true);
|
|
62
62
|
broadcastForSession(sessionId, createSessionRunningMessage(true));
|
|
63
63
|
try {
|
|
64
|
-
const { maybeAutoCompactContext } = await import("./auto-compaction-
|
|
64
|
+
const { maybeAutoCompactContext } = await import("./auto-compaction-2RKC6DC2.js");
|
|
65
65
|
await maybeAutoCompactContext({
|
|
66
66
|
sessionManager,
|
|
67
67
|
sessionId,
|
|
@@ -170,4 +170,4 @@ export {
|
|
|
170
170
|
startChatSession,
|
|
171
171
|
stopSessionExecution
|
|
172
172
|
};
|
|
173
|
-
//# sourceMappingURL=chat-handler-
|
|
173
|
+
//# sourceMappingURL=chat-handler-IY2XVOO6.js.map
|
|
@@ -34,6 +34,7 @@ import {
|
|
|
34
34
|
} from "./chunk-22CTURMH.js";
|
|
35
35
|
import {
|
|
36
36
|
SETTINGS_KEYS,
|
|
37
|
+
deleteSetting,
|
|
37
38
|
getSetting,
|
|
38
39
|
setSetting
|
|
39
40
|
} from "./chunk-7IOZFJBW.js";
|
|
@@ -909,48 +910,17 @@ Error: ${toolResult.error}` : `Error: ${toolResult.error}`;
|
|
|
909
910
|
}
|
|
910
911
|
|
|
911
912
|
// src/server/agents/registry.ts
|
|
912
|
-
import { readdir, readFile as
|
|
913
|
-
import { join as
|
|
913
|
+
import { readdir, readFile as readFile2, writeFile, mkdir, access as access2, unlink } from "fs/promises";
|
|
914
|
+
import { join as join2, dirname as dirname2 } from "path";
|
|
914
915
|
import { constants as constants2 } from "fs";
|
|
915
916
|
import { fileURLToPath } from "url";
|
|
916
917
|
import matter from "gray-matter";
|
|
917
|
-
|
|
918
|
-
// src/server/utils/defaults.ts
|
|
919
|
-
import { readFile as readFile2 } from "fs/promises";
|
|
920
|
-
import { join as join2 } from "path";
|
|
921
|
-
async function findModifiedDefaultFiles(defaultIds, extension, bundledDirs, userDir) {
|
|
922
|
-
const [primaryDir, altDir] = bundledDirs;
|
|
923
|
-
const modified = [];
|
|
924
|
-
for (const id of defaultIds) {
|
|
925
|
-
const filename = `${id}${extension}`;
|
|
926
|
-
const userPath = join2(userDir, filename);
|
|
927
|
-
let bundledContent = null;
|
|
928
|
-
for (const dir of [primaryDir, altDir]) {
|
|
929
|
-
try {
|
|
930
|
-
bundledContent = await readFile2(join2(dir, filename), "utf-8");
|
|
931
|
-
break;
|
|
932
|
-
} catch {
|
|
933
|
-
}
|
|
934
|
-
}
|
|
935
|
-
if (!bundledContent) continue;
|
|
936
|
-
try {
|
|
937
|
-
const userContent = await readFile2(userPath, "utf-8");
|
|
938
|
-
if (userContent !== bundledContent) {
|
|
939
|
-
modified.push(id);
|
|
940
|
-
}
|
|
941
|
-
} catch {
|
|
942
|
-
}
|
|
943
|
-
}
|
|
944
|
-
return modified;
|
|
945
|
-
}
|
|
946
|
-
|
|
947
|
-
// src/server/agents/registry.ts
|
|
948
918
|
var __bundleDir = dirname2(fileURLToPath(import.meta.url));
|
|
949
|
-
var DEFAULTS_DIR =
|
|
950
|
-
var DEFAULTS_DIR_ALT =
|
|
919
|
+
var DEFAULTS_DIR = join2(__bundleDir, "defaults");
|
|
920
|
+
var DEFAULTS_DIR_ALT = join2(__bundleDir, "agent-defaults");
|
|
951
921
|
var AGENT_EXTENSION = ".agent.md";
|
|
952
922
|
function getAgentsDir(configDir) {
|
|
953
|
-
return
|
|
923
|
+
return join2(configDir, "agents");
|
|
954
924
|
}
|
|
955
925
|
async function pathExists(path) {
|
|
956
926
|
try {
|
|
@@ -960,37 +930,6 @@ async function pathExists(path) {
|
|
|
960
930
|
return false;
|
|
961
931
|
}
|
|
962
932
|
}
|
|
963
|
-
async function ensureDefaultAgents(configDir) {
|
|
964
|
-
const agentsDir = getAgentsDir(configDir);
|
|
965
|
-
if (!await pathExists(agentsDir)) {
|
|
966
|
-
await mkdir(agentsDir, { recursive: true });
|
|
967
|
-
}
|
|
968
|
-
let defaultFiles;
|
|
969
|
-
let sourceDir;
|
|
970
|
-
try {
|
|
971
|
-
defaultFiles = (await readdir(DEFAULTS_DIR)).filter((f) => f.endsWith(AGENT_EXTENSION));
|
|
972
|
-
sourceDir = DEFAULTS_DIR;
|
|
973
|
-
} catch {
|
|
974
|
-
try {
|
|
975
|
-
defaultFiles = (await readdir(DEFAULTS_DIR_ALT)).filter((f) => f.endsWith(AGENT_EXTENSION));
|
|
976
|
-
sourceDir = DEFAULTS_DIR_ALT;
|
|
977
|
-
} catch {
|
|
978
|
-
logger.warn("No bundled agent defaults found", { dir: DEFAULTS_DIR });
|
|
979
|
-
return;
|
|
980
|
-
}
|
|
981
|
-
}
|
|
982
|
-
for (const file of defaultFiles) {
|
|
983
|
-
const targetPath = join3(agentsDir, file);
|
|
984
|
-
if (!await pathExists(targetPath)) {
|
|
985
|
-
try {
|
|
986
|
-
await copyFile(join3(sourceDir, file), targetPath);
|
|
987
|
-
logger.info("Installed default agent", { file });
|
|
988
|
-
} catch (err) {
|
|
989
|
-
logger.error("Failed to copy default agent", { file, error: err instanceof Error ? err.message : String(err) });
|
|
990
|
-
}
|
|
991
|
-
}
|
|
992
|
-
}
|
|
993
|
-
}
|
|
994
933
|
function parseAgentFile(raw, filename) {
|
|
995
934
|
const { data, content } = matter(raw);
|
|
996
935
|
const meta = data;
|
|
@@ -1022,7 +961,7 @@ async function loadAgentsFromDir(dir) {
|
|
|
1022
961
|
const agents = [];
|
|
1023
962
|
for (const file of files) {
|
|
1024
963
|
try {
|
|
1025
|
-
const raw = await
|
|
964
|
+
const raw = await readFile2(join2(dir, file), "utf-8");
|
|
1026
965
|
const agent = parseAgentFile(raw, file);
|
|
1027
966
|
if (agent) {
|
|
1028
967
|
agents.push(agent);
|
|
@@ -1033,13 +972,21 @@ async function loadAgentsFromDir(dir) {
|
|
|
1033
972
|
}
|
|
1034
973
|
return agents;
|
|
1035
974
|
}
|
|
975
|
+
async function loadDefaultAgents() {
|
|
976
|
+
const agents = await loadAgentsFromDir(DEFAULTS_DIR);
|
|
977
|
+
if (agents.length > 0) return agents;
|
|
978
|
+
return loadAgentsFromDir(DEFAULTS_DIR_ALT);
|
|
979
|
+
}
|
|
980
|
+
async function loadUserAgents(configDir) {
|
|
981
|
+
return loadAgentsFromDir(getAgentsDir(configDir));
|
|
982
|
+
}
|
|
1036
983
|
async function loadAllAgents(configDir) {
|
|
1037
|
-
const [
|
|
1038
|
-
|
|
1039
|
-
|
|
984
|
+
const [defaultAgents, userAgents] = await Promise.all([
|
|
985
|
+
loadDefaultAgents(),
|
|
986
|
+
loadUserAgents(configDir)
|
|
1040
987
|
]);
|
|
1041
988
|
const agentMap = /* @__PURE__ */ new Map();
|
|
1042
|
-
for (const agent of
|
|
989
|
+
for (const agent of defaultAgents) {
|
|
1043
990
|
agentMap.set(agent.metadata.id, agent);
|
|
1044
991
|
}
|
|
1045
992
|
for (const agent of userAgents) {
|
|
@@ -1052,14 +999,9 @@ async function loadAllAgentsDefault() {
|
|
|
1052
999
|
const configDir = getGlobalConfigDir(getRuntimeConfig().mode ?? "production");
|
|
1053
1000
|
return await loadAllAgents(configDir);
|
|
1054
1001
|
} catch {
|
|
1055
|
-
return
|
|
1002
|
+
return loadDefaultAgents();
|
|
1056
1003
|
}
|
|
1057
1004
|
}
|
|
1058
|
-
async function loadBuiltinAgents() {
|
|
1059
|
-
const agents = await loadAgentsFromDir(DEFAULTS_DIR);
|
|
1060
|
-
if (agents.length > 0) return agents;
|
|
1061
|
-
return loadAgentsFromDir(DEFAULTS_DIR_ALT);
|
|
1062
|
-
}
|
|
1063
1005
|
async function getDefaultAgentIds() {
|
|
1064
1006
|
for (const dir of [DEFAULTS_DIR, DEFAULTS_DIR_ALT]) {
|
|
1065
1007
|
try {
|
|
@@ -1070,33 +1012,19 @@ async function getDefaultAgentIds() {
|
|
|
1070
1012
|
}
|
|
1071
1013
|
return [];
|
|
1072
1014
|
}
|
|
1073
|
-
async function
|
|
1074
|
-
const
|
|
1075
|
-
|
|
1076
|
-
const userPath = join3(getAgentsDir(configDir), `${agentId}${AGENT_EXTENSION}`);
|
|
1077
|
-
try {
|
|
1078
|
-
await unlink(userPath);
|
|
1079
|
-
} catch {
|
|
1080
|
-
}
|
|
1081
|
-
return true;
|
|
1015
|
+
async function getDefaultAgentContent(agentId) {
|
|
1016
|
+
const defaults = await loadDefaultAgents();
|
|
1017
|
+
return defaults.find((a) => a.metadata.id === agentId) ?? null;
|
|
1082
1018
|
}
|
|
1083
|
-
async function
|
|
1019
|
+
async function isDefaultAgent(agentId) {
|
|
1084
1020
|
const defaultIds = await getDefaultAgentIds();
|
|
1085
|
-
return
|
|
1086
|
-
}
|
|
1087
|
-
async function restoreAllDefaultAgents(configDir) {
|
|
1088
|
-
const ids = await getDefaultAgentIds();
|
|
1089
|
-
let count = 0;
|
|
1090
|
-
for (const id of ids) {
|
|
1091
|
-
if (await restoreDefaultAgent(configDir, id)) count++;
|
|
1092
|
-
}
|
|
1093
|
-
return count;
|
|
1021
|
+
return defaultIds.includes(agentId);
|
|
1094
1022
|
}
|
|
1095
1023
|
function getAgentFilePaths(agentsDir, agentId) {
|
|
1096
1024
|
const hyphenated = agentId.replace(/_/g, "-");
|
|
1097
1025
|
return [
|
|
1098
|
-
|
|
1099
|
-
|
|
1026
|
+
join2(agentsDir, `${agentId}${AGENT_EXTENSION}`),
|
|
1027
|
+
join2(agentsDir, `${hyphenated}${AGENT_EXTENSION}`)
|
|
1100
1028
|
];
|
|
1101
1029
|
}
|
|
1102
1030
|
function findAgentById(agentId, agents) {
|
|
@@ -1120,26 +1048,30 @@ async function saveAgent(configDir, agent) {
|
|
|
1120
1048
|
if (!await pathExists(agentsDir)) {
|
|
1121
1049
|
await mkdir(agentsDir, { recursive: true });
|
|
1122
1050
|
}
|
|
1123
|
-
const filePath =
|
|
1051
|
+
const filePath = join2(agentsDir, `${agent.metadata.id}${AGENT_EXTENSION}`);
|
|
1124
1052
|
const content = matter.stringify(agent.prompt, agent.metadata);
|
|
1125
1053
|
await writeFile(filePath, content, "utf-8");
|
|
1126
1054
|
}
|
|
1127
1055
|
async function deleteAgent(configDir, agentId) {
|
|
1056
|
+
const isDefault = await isDefaultAgent(agentId);
|
|
1057
|
+
if (isDefault) {
|
|
1058
|
+
return { success: false, reason: "Cannot delete built-in defaults" };
|
|
1059
|
+
}
|
|
1128
1060
|
const agentsDir = getAgentsDir(configDir);
|
|
1129
1061
|
const paths = getAgentFilePaths(agentsDir, agentId);
|
|
1130
1062
|
for (const filePath of paths) {
|
|
1131
1063
|
try {
|
|
1132
1064
|
await unlink(filePath);
|
|
1133
|
-
return true;
|
|
1065
|
+
return { success: true };
|
|
1134
1066
|
} catch {
|
|
1135
1067
|
continue;
|
|
1136
1068
|
}
|
|
1137
1069
|
}
|
|
1138
|
-
return false;
|
|
1070
|
+
return { success: false };
|
|
1139
1071
|
}
|
|
1140
1072
|
|
|
1141
1073
|
// src/server/tools/read.ts
|
|
1142
|
-
import { readFile as
|
|
1074
|
+
import { readFile as readFile4, stat as stat2 } from "fs/promises";
|
|
1143
1075
|
import { extname } from "path";
|
|
1144
1076
|
|
|
1145
1077
|
// src/server/tools/types.ts
|
|
@@ -1170,7 +1102,7 @@ import { resolve as resolve2, isAbsolute } from "path";
|
|
|
1170
1102
|
|
|
1171
1103
|
// src/server/tools/path-security.ts
|
|
1172
1104
|
import { realpath } from "fs/promises";
|
|
1173
|
-
import { resolve, normalize, join as
|
|
1105
|
+
import { resolve, normalize, join as join3, basename, sep } from "path";
|
|
1174
1106
|
import { homedir, tmpdir } from "os";
|
|
1175
1107
|
var SAFE_PATHS = /* @__PURE__ */ new Set([
|
|
1176
1108
|
"/dev/null",
|
|
@@ -1305,7 +1237,7 @@ function extractAbsolutePathsFromCommand(command) {
|
|
|
1305
1237
|
}
|
|
1306
1238
|
} else if (content.startsWith("~")) {
|
|
1307
1239
|
const pathPart = content.slice(1);
|
|
1308
|
-
const fullPath =
|
|
1240
|
+
const fullPath = join3(home, pathPart);
|
|
1309
1241
|
const resolved = normalize(resolve(fullPath));
|
|
1310
1242
|
if (!isSafePath(resolved)) {
|
|
1311
1243
|
paths.push(resolved);
|
|
@@ -1583,7 +1515,7 @@ function createTool(name, definition, handler2) {
|
|
|
1583
1515
|
|
|
1584
1516
|
// src/server/tools/file-tracker.ts
|
|
1585
1517
|
import { createHash } from "crypto";
|
|
1586
|
-
import { readFile as
|
|
1518
|
+
import { readFile as readFile3 } from "fs/promises";
|
|
1587
1519
|
import { resolve as resolve3 } from "path";
|
|
1588
1520
|
var FileNotReadError = class extends Error {
|
|
1589
1521
|
constructor(path) {
|
|
@@ -1599,7 +1531,7 @@ var FileChangedExternallyError = class extends Error {
|
|
|
1599
1531
|
};
|
|
1600
1532
|
async function computeFileHash(filePath) {
|
|
1601
1533
|
try {
|
|
1602
|
-
const content = await
|
|
1534
|
+
const content = await readFile3(filePath);
|
|
1603
1535
|
const hash = createHash("sha256");
|
|
1604
1536
|
hash.update(content);
|
|
1605
1537
|
return hash.digest("hex");
|
|
@@ -1732,7 +1664,7 @@ var readFileTool = createTool(
|
|
|
1732
1664
|
} catch {
|
|
1733
1665
|
return helpers.error(`File not found: ${args.path}`);
|
|
1734
1666
|
}
|
|
1735
|
-
const rawBuffer = await
|
|
1667
|
+
const rawBuffer = await readFile4(fullPath);
|
|
1736
1668
|
const mimeType = detectImageType(rawBuffer, args.path);
|
|
1737
1669
|
if (mimeType) {
|
|
1738
1670
|
const base64Data = rawBuffer.toString("base64");
|
|
@@ -1866,7 +1798,7 @@ var writeFileTool = createTool(
|
|
|
1866
1798
|
);
|
|
1867
1799
|
|
|
1868
1800
|
// src/server/tools/edit.ts
|
|
1869
|
-
import { readFile as
|
|
1801
|
+
import { readFile as readFile5, writeFile as writeFile3 } from "fs/promises";
|
|
1870
1802
|
|
|
1871
1803
|
// src/server/tools/edit-context.ts
|
|
1872
1804
|
var CONTEXT_LINES = 4;
|
|
@@ -2022,7 +1954,7 @@ var editFileTool = createTool(
|
|
|
2022
1954
|
}
|
|
2023
1955
|
let content;
|
|
2024
1956
|
try {
|
|
2025
|
-
content = await
|
|
1957
|
+
content = await readFile5(fullPath, "utf-8");
|
|
2026
1958
|
} catch {
|
|
2027
1959
|
return helpers.error(`File not found: ${args.path}`);
|
|
2028
1960
|
}
|
|
@@ -2545,19 +2477,20 @@ function createToolProgressHandler(messageId, callId, onMessage) {
|
|
|
2545
2477
|
}
|
|
2546
2478
|
|
|
2547
2479
|
// src/server/skills/registry.ts
|
|
2548
|
-
import { readdir as
|
|
2549
|
-
import { join as
|
|
2550
|
-
|
|
2551
|
-
// src/server/commands/registry-utils.ts
|
|
2552
|
-
import { readdir as readdir2, readFile as readFile7, writeFile as writeFile4, copyFile as copyFile2, mkdir as mkdir3, access as access3, unlink as unlink2 } from "fs/promises";
|
|
2553
|
-
import { join as join5, dirname as dirname4 } from "path";
|
|
2480
|
+
import { readdir as readdir2, readFile as readFile6, writeFile as writeFile4, mkdir as mkdir3, access as access3, unlink as unlink2 } from "fs/promises";
|
|
2481
|
+
import { join as join4, dirname as dirname4 } from "path";
|
|
2554
2482
|
import { constants as constants3 } from "fs";
|
|
2555
2483
|
import { fileURLToPath as fileURLToPath2 } from "url";
|
|
2556
2484
|
import matter2 from "gray-matter";
|
|
2557
|
-
|
|
2558
|
-
|
|
2485
|
+
var __bundleDir2 = dirname4(fileURLToPath2(import.meta.url));
|
|
2486
|
+
var DEFAULTS_DIR2 = join4(__bundleDir2, "defaults");
|
|
2487
|
+
var DEFAULTS_DIR_ALT2 = join4(__bundleDir2, "skill-defaults");
|
|
2488
|
+
var SKILL_EXTENSION = ".skill.md";
|
|
2489
|
+
var SKILL_SETTING_PREFIX = "skill.enabled.";
|
|
2490
|
+
function getSkillsDir(configDir) {
|
|
2491
|
+
return join4(configDir, "skills");
|
|
2559
2492
|
}
|
|
2560
|
-
async function
|
|
2493
|
+
async function pathExists2(path) {
|
|
2561
2494
|
try {
|
|
2562
2495
|
await access3(path, constants3.R_OK);
|
|
2563
2496
|
return true;
|
|
@@ -2565,92 +2498,65 @@ async function dirExists(path) {
|
|
|
2565
2498
|
return false;
|
|
2566
2499
|
}
|
|
2567
2500
|
}
|
|
2568
|
-
async function
|
|
2569
|
-
|
|
2570
|
-
|
|
2501
|
+
async function loadDefaultSkills() {
|
|
2502
|
+
let defaults = [];
|
|
2503
|
+
try {
|
|
2504
|
+
defaults = await loadSkillsFromDir(DEFAULTS_DIR2);
|
|
2505
|
+
} catch {
|
|
2571
2506
|
}
|
|
2507
|
+
if (!defaults.length) {
|
|
2508
|
+
try {
|
|
2509
|
+
defaults = await loadSkillsFromDir(DEFAULTS_DIR_ALT2);
|
|
2510
|
+
} catch {
|
|
2511
|
+
}
|
|
2512
|
+
}
|
|
2513
|
+
return defaults;
|
|
2572
2514
|
}
|
|
2573
|
-
async function
|
|
2574
|
-
if (!await
|
|
2515
|
+
async function loadSkillsFromDir(dir) {
|
|
2516
|
+
if (!await pathExists2(dir)) {
|
|
2517
|
+
return [];
|
|
2518
|
+
}
|
|
2575
2519
|
let files;
|
|
2576
2520
|
try {
|
|
2577
|
-
files = (await readdir2(dir)).filter((f) => f.endsWith(
|
|
2521
|
+
files = (await readdir2(dir)).filter((f) => f.endsWith(SKILL_EXTENSION));
|
|
2578
2522
|
} catch {
|
|
2579
2523
|
return [];
|
|
2580
2524
|
}
|
|
2581
|
-
const
|
|
2525
|
+
const skills = [];
|
|
2582
2526
|
for (const file of files) {
|
|
2583
2527
|
try {
|
|
2584
|
-
const raw = await
|
|
2528
|
+
const raw = await readFile6(join4(dir, file), "utf-8");
|
|
2585
2529
|
const { data, content } = matter2(raw);
|
|
2586
2530
|
if (data.id && content.trim()) {
|
|
2587
|
-
|
|
2531
|
+
skills.push({
|
|
2532
|
+
metadata: data,
|
|
2533
|
+
prompt: content.trim()
|
|
2534
|
+
});
|
|
2588
2535
|
} else {
|
|
2589
|
-
logger.warn(
|
|
2536
|
+
logger.warn("Skipping invalid skill file", { file });
|
|
2590
2537
|
}
|
|
2591
2538
|
} catch (err) {
|
|
2592
|
-
logger.warn(
|
|
2539
|
+
logger.warn("Failed to parse skill file", { file, error: err instanceof Error ? err.message : String(err) });
|
|
2593
2540
|
}
|
|
2594
2541
|
}
|
|
2595
|
-
return
|
|
2542
|
+
return skills;
|
|
2596
2543
|
}
|
|
2597
|
-
async function
|
|
2598
|
-
|
|
2599
|
-
const filePath = join5(dir, `${id}${extension}`);
|
|
2600
|
-
const content = matter2.stringify(item.prompt, item.metadata);
|
|
2601
|
-
await writeFile4(filePath, content, "utf-8");
|
|
2544
|
+
async function loadUserSkills(configDir) {
|
|
2545
|
+
return loadSkillsFromDir(getSkillsDir(configDir));
|
|
2602
2546
|
}
|
|
2603
|
-
async function
|
|
2604
|
-
const
|
|
2605
|
-
|
|
2606
|
-
|
|
2607
|
-
|
|
2608
|
-
|
|
2609
|
-
|
|
2610
|
-
|
|
2611
|
-
}
|
|
2612
|
-
function findById(id, items) {
|
|
2613
|
-
return items.find((i) => i.metadata.id === id);
|
|
2614
|
-
}
|
|
2615
|
-
async function getDefaultIds(bundleDir, defaultsDir, extension) {
|
|
2616
|
-
try {
|
|
2617
|
-
const files = (await readdir2(join5(bundleDir, defaultsDir))).filter((f) => f.endsWith(extension));
|
|
2618
|
-
return files.map((f) => f.replace(extension, ""));
|
|
2619
|
-
} catch {
|
|
2620
|
-
return [];
|
|
2547
|
+
async function loadAllSkills(configDir) {
|
|
2548
|
+
const [defaultSkills, userSkills] = await Promise.all([
|
|
2549
|
+
loadDefaultSkills(),
|
|
2550
|
+
loadUserSkills(configDir)
|
|
2551
|
+
]);
|
|
2552
|
+
const skillMap = /* @__PURE__ */ new Map();
|
|
2553
|
+
for (const skill of defaultSkills) {
|
|
2554
|
+
skillMap.set(skill.metadata.id, skill);
|
|
2621
2555
|
}
|
|
2622
|
-
|
|
2623
|
-
|
|
2624
|
-
const filename = `${id}${extension}`;
|
|
2625
|
-
const src = join5(bundleDir, defaultsDir, filename);
|
|
2626
|
-
if (await dirExists(src)) {
|
|
2627
|
-
await copyFile2(src, join5(itemDir, filename));
|
|
2628
|
-
return true;
|
|
2556
|
+
for (const skill of userSkills) {
|
|
2557
|
+
skillMap.set(skill.metadata.id, skill);
|
|
2629
2558
|
}
|
|
2630
|
-
return
|
|
2631
|
-
}
|
|
2632
|
-
|
|
2633
|
-
// src/server/skills/registry.ts
|
|
2634
|
-
var DEFAULTS_DIR2 = "defaults";
|
|
2635
|
-
var DEFAULTS_DIR_ALT2 = "skill-defaults";
|
|
2636
|
-
var SKILL_EXTENSION = ".skill.md";
|
|
2637
|
-
var SKILL_SETTING_PREFIX = "skill.enabled.";
|
|
2638
|
-
function getSkillsDir(configDir) {
|
|
2639
|
-
return join6(configDir, "skills");
|
|
2640
|
-
}
|
|
2641
|
-
async function ensureDefaultSkills(configDir) {
|
|
2642
|
-
const bundleDir = getBundleDir();
|
|
2643
|
-
const skillsDir = getSkillsDir(configDir);
|
|
2644
|
-
await ensureDir(skillsDir);
|
|
2645
|
-
const ids = await getDefaultIds(bundleDir, DEFAULTS_DIR2, SKILL_EXTENSION);
|
|
2646
|
-
for (const id of ids) {
|
|
2647
|
-
if (!await restoreDefault(skillsDir, bundleDir, DEFAULTS_DIR2, id, SKILL_EXTENSION)) {
|
|
2648
|
-
await restoreDefault(skillsDir, bundleDir, DEFAULTS_DIR_ALT2, id, SKILL_EXTENSION);
|
|
2649
|
-
}
|
|
2650
|
-
}
|
|
2651
|
-
}
|
|
2652
|
-
async function loadAllSkills(configDir) {
|
|
2653
|
-
return loadItems(getSkillsDir(configDir), SKILL_EXTENSION);
|
|
2559
|
+
return Array.from(skillMap.values());
|
|
2654
2560
|
}
|
|
2655
2561
|
async function getEnabledSkills(configDir) {
|
|
2656
2562
|
const all = await loadAllSkills(configDir);
|
|
@@ -2668,47 +2574,55 @@ function isSkillEnabled(skillId) {
|
|
|
2668
2574
|
function setSkillEnabled(skillId, enabled) {
|
|
2669
2575
|
setSetting(`${SKILL_SETTING_PREFIX}${skillId}`, String(enabled));
|
|
2670
2576
|
}
|
|
2577
|
+
async function getDefaultIds(dir, extension) {
|
|
2578
|
+
try {
|
|
2579
|
+
const files = (await readdir2(dir)).filter((f) => f.endsWith(extension));
|
|
2580
|
+
return files.map((f) => f.replace(extension, ""));
|
|
2581
|
+
} catch {
|
|
2582
|
+
return [];
|
|
2583
|
+
}
|
|
2584
|
+
}
|
|
2671
2585
|
async function getDefaultSkillIds() {
|
|
2672
|
-
const
|
|
2673
|
-
const ids = await getDefaultIds(bundleDir, DEFAULTS_DIR2, SKILL_EXTENSION);
|
|
2586
|
+
const ids = await getDefaultIds(DEFAULTS_DIR2, SKILL_EXTENSION);
|
|
2674
2587
|
if (ids.length) return ids;
|
|
2675
|
-
return getDefaultIds(
|
|
2588
|
+
return getDefaultIds(DEFAULTS_DIR_ALT2, SKILL_EXTENSION);
|
|
2676
2589
|
}
|
|
2677
|
-
async function
|
|
2678
|
-
const
|
|
2679
|
-
|
|
2680
|
-
return restoreDefault(skillsDir, bundleDir, DEFAULTS_DIR2, skillId, SKILL_EXTENSION) || restoreDefault(skillsDir, bundleDir, DEFAULTS_DIR_ALT2, skillId, SKILL_EXTENSION);
|
|
2590
|
+
async function getDefaultSkillContent(skillId) {
|
|
2591
|
+
const defaults = await loadDefaultSkills();
|
|
2592
|
+
return defaults.find((s) => s.metadata.id === skillId) ?? null;
|
|
2681
2593
|
}
|
|
2682
|
-
async function
|
|
2683
|
-
const
|
|
2684
|
-
|
|
2685
|
-
const files = (await readdir3(join6(bundleDir, DEFAULTS_DIR2))).filter((f) => f.endsWith(SKILL_EXTENSION));
|
|
2686
|
-
return files.map((f) => f.replace(SKILL_EXTENSION, "")).filter((id) => ids.includes(id));
|
|
2687
|
-
}
|
|
2688
|
-
async function restoreAllDefaultSkills(configDir) {
|
|
2689
|
-
const ids = await getDefaultSkillIds();
|
|
2690
|
-
let count = 0;
|
|
2691
|
-
for (const id of ids) {
|
|
2692
|
-
if (await restoreDefaultSkill(configDir, id)) count++;
|
|
2693
|
-
}
|
|
2694
|
-
return count;
|
|
2594
|
+
async function isDefaultSkill(skillId) {
|
|
2595
|
+
const defaultIds = await getDefaultSkillIds();
|
|
2596
|
+
return defaultIds.includes(skillId);
|
|
2695
2597
|
}
|
|
2696
2598
|
function findSkillById(skillId, skills) {
|
|
2697
|
-
return
|
|
2599
|
+
return skills.find((s) => s.metadata.id === skillId);
|
|
2698
2600
|
}
|
|
2699
2601
|
async function skillExists(configDir, skillId) {
|
|
2700
|
-
return
|
|
2602
|
+
return pathExists2(join4(getSkillsDir(configDir), `${skillId}${SKILL_EXTENSION}`));
|
|
2701
2603
|
}
|
|
2702
2604
|
async function saveSkill(configDir, skill) {
|
|
2703
|
-
|
|
2605
|
+
const skillsDir = getSkillsDir(configDir);
|
|
2606
|
+
if (!await pathExists2(skillsDir)) {
|
|
2607
|
+
await mkdir3(skillsDir, { recursive: true });
|
|
2608
|
+
}
|
|
2609
|
+
const filePath = join4(skillsDir, `${skill.metadata.id}${SKILL_EXTENSION}`);
|
|
2610
|
+
const content = matter2.stringify(skill.prompt, skill.metadata);
|
|
2611
|
+
await writeFile4(filePath, content, "utf-8");
|
|
2704
2612
|
}
|
|
2705
2613
|
async function deleteSkill(configDir, skillId) {
|
|
2706
|
-
const
|
|
2707
|
-
if (
|
|
2708
|
-
|
|
2614
|
+
const isDefault = await isDefaultSkill(skillId);
|
|
2615
|
+
if (isDefault) {
|
|
2616
|
+
return { success: false, reason: "Cannot delete built-in defaults" };
|
|
2617
|
+
}
|
|
2618
|
+
const filePath = join4(getSkillsDir(configDir), `${skillId}${SKILL_EXTENSION}`);
|
|
2619
|
+
try {
|
|
2620
|
+
await unlink2(filePath);
|
|
2709
2621
|
deleteSetting(`${SKILL_SETTING_PREFIX}${skillId}`);
|
|
2622
|
+
return { success: true };
|
|
2623
|
+
} catch {
|
|
2624
|
+
return { success: false };
|
|
2710
2625
|
}
|
|
2711
|
-
return deleted;
|
|
2712
2626
|
}
|
|
2713
2627
|
|
|
2714
2628
|
// src/server/chat/agent-loop.ts
|
|
@@ -3377,7 +3291,7 @@ var callSubAgentTool = {
|
|
|
3377
3291
|
};
|
|
3378
3292
|
}
|
|
3379
3293
|
try {
|
|
3380
|
-
const { getToolRegistryForAgent: getToolRegistryForAgent2 } = await import("./tools-
|
|
3294
|
+
const { getToolRegistryForAgent: getToolRegistryForAgent2 } = await import("./tools-55YICCVH.js");
|
|
3381
3295
|
const toolRegistry = getToolRegistryForAgent2(agentDef);
|
|
3382
3296
|
const turnMetrics = new TurnMetrics();
|
|
3383
3297
|
const result = await executeSubAgent({
|
|
@@ -3632,8 +3546,8 @@ var webFetchTool = createTool(
|
|
|
3632
3546
|
|
|
3633
3547
|
// src/server/dev-server/manager.ts
|
|
3634
3548
|
import { spawn as spawn4 } from "child_process";
|
|
3635
|
-
import { readFile as
|
|
3636
|
-
import { resolve as resolve5, join as
|
|
3549
|
+
import { readFile as readFile7, writeFile as writeFile5, mkdir as mkdir4 } from "fs/promises";
|
|
3550
|
+
import { resolve as resolve5, join as join5 } from "path";
|
|
3637
3551
|
var MAX_LOG_LINES = 2e3;
|
|
3638
3552
|
var MAX_LOG_BYTES = 1e5;
|
|
3639
3553
|
var CONFIG_PATH = ".openfox/dev.json";
|
|
@@ -3689,8 +3603,8 @@ var DevServerManager = class {
|
|
|
3689
3603
|
}
|
|
3690
3604
|
async loadConfig(workdir) {
|
|
3691
3605
|
try {
|
|
3692
|
-
const configPath =
|
|
3693
|
-
const raw = await
|
|
3606
|
+
const configPath = join5(this.resolveWorkdir(workdir), CONFIG_PATH);
|
|
3607
|
+
const raw = await readFile7(configPath, "utf-8");
|
|
3694
3608
|
const parsed = JSON.parse(raw);
|
|
3695
3609
|
if (!parsed.command || !parsed.url) return null;
|
|
3696
3610
|
return {
|
|
@@ -3704,9 +3618,9 @@ var DevServerManager = class {
|
|
|
3704
3618
|
}
|
|
3705
3619
|
async saveConfig(workdir, config) {
|
|
3706
3620
|
const resolved = this.resolveWorkdir(workdir);
|
|
3707
|
-
const dirPath =
|
|
3621
|
+
const dirPath = join5(resolved, ".openfox");
|
|
3708
3622
|
await mkdir4(dirPath, { recursive: true });
|
|
3709
|
-
const configPath =
|
|
3623
|
+
const configPath = join5(resolved, CONFIG_PATH);
|
|
3710
3624
|
await writeFile5(configPath, JSON.stringify(config, null, 2) + "\n", "utf-8");
|
|
3711
3625
|
}
|
|
3712
3626
|
async start(workdir) {
|
|
@@ -4454,14 +4368,12 @@ export {
|
|
|
4454
4368
|
cancelPathConfirmationsForSession,
|
|
4455
4369
|
checkAborted,
|
|
4456
4370
|
spawnShellProcess,
|
|
4457
|
-
|
|
4458
|
-
|
|
4371
|
+
loadDefaultAgents,
|
|
4372
|
+
loadUserAgents,
|
|
4459
4373
|
loadAllAgents,
|
|
4460
4374
|
loadAllAgentsDefault,
|
|
4461
4375
|
getDefaultAgentIds,
|
|
4462
|
-
|
|
4463
|
-
getModifiedDefaultAgentIds,
|
|
4464
|
-
restoreAllDefaultAgents,
|
|
4376
|
+
getDefaultAgentContent,
|
|
4465
4377
|
findAgentById,
|
|
4466
4378
|
getSubAgents,
|
|
4467
4379
|
agentExists,
|
|
@@ -4478,24 +4390,14 @@ export {
|
|
|
4478
4390
|
createChatDoneEvent,
|
|
4479
4391
|
getAllInstructions,
|
|
4480
4392
|
assembleAgentRequest,
|
|
4481
|
-
|
|
4482
|
-
|
|
4483
|
-
ensureDir,
|
|
4484
|
-
loadItems,
|
|
4485
|
-
saveItem,
|
|
4486
|
-
deleteItem,
|
|
4487
|
-
findById,
|
|
4488
|
-
getDefaultIds,
|
|
4489
|
-
restoreDefault,
|
|
4490
|
-
ensureDefaultSkills,
|
|
4393
|
+
loadDefaultSkills,
|
|
4394
|
+
loadUserSkills,
|
|
4491
4395
|
loadAllSkills,
|
|
4492
4396
|
getEnabledSkillMetadata,
|
|
4493
4397
|
isSkillEnabled,
|
|
4494
4398
|
setSkillEnabled,
|
|
4495
4399
|
getDefaultSkillIds,
|
|
4496
|
-
|
|
4497
|
-
getModifiedDefaultSkillIds,
|
|
4498
|
-
restoreAllDefaultSkills,
|
|
4400
|
+
getDefaultSkillContent,
|
|
4499
4401
|
findSkillById,
|
|
4500
4402
|
skillExists,
|
|
4501
4403
|
saveSkill,
|
|
@@ -4515,4 +4417,4 @@ export {
|
|
|
4515
4417
|
getToolRegistryForAgent,
|
|
4516
4418
|
createToolRegistry
|
|
4517
4419
|
};
|
|
4518
|
-
//# sourceMappingURL=chunk-
|
|
4420
|
+
//# sourceMappingURL=chunk-4OI4VPZ6.js.map
|