openfox 1.6.16 → 1.6.17

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.
@@ -2,7 +2,7 @@ import {
2
2
  maybeAutoCompactContext,
3
3
  performManualContextCompaction,
4
4
  resolveCompactionStatsIdentity
5
- } from "./chunk-4OI4VPZ6.js";
5
+ } from "./chunk-R7U3CD2U.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-2RKC6DC2.js.map
25
+ //# sourceMappingURL=auto-compaction-VOWM5ZHF.js.map
@@ -10,8 +10,8 @@ import {
10
10
  } from "./chunk-F54ZJN4X.js";
11
11
  import {
12
12
  runChatTurn
13
- } from "./chunk-U54QVKL2.js";
14
- import "./chunk-4OI4VPZ6.js";
13
+ } from "./chunk-RPPEIB3F.js";
14
+ import "./chunk-R7U3CD2U.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-2RKC6DC2.js");
64
+ const { maybeAutoCompactContext } = await import("./auto-compaction-VOWM5ZHF.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-IY2XVOO6.js.map
173
+ //# sourceMappingURL=chat-handler-7HWNXQ4G.js.map
@@ -154,7 +154,7 @@ async function runCli(options) {
154
154
  if (!configExists) {
155
155
  await runNetworkSetup(mode);
156
156
  }
157
- const { runServe } = await import("./serve-GOLQMQFA.js");
157
+ const { runServe } = await import("./serve-FEG4BUYZ.js");
158
158
  await runServe({
159
159
  mode,
160
160
  port: values.port ? parseInt(values.port) : void 0,
@@ -167,4 +167,4 @@ async function runCli(options) {
167
167
  export {
168
168
  runCli
169
169
  };
170
- //# sourceMappingURL=chunk-T5PBG2PE.js.map
170
+ //# sourceMappingURL=chunk-EAQNNNUR.js.map
@@ -2477,19 +2477,16 @@ function createToolProgressHandler(messageId, callId, onMessage) {
2477
2477
  }
2478
2478
 
2479
2479
  // src/server/skills/registry.ts
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";
2482
- import { constants as constants3 } from "fs";
2480
+ import { writeFile as writeFile4, mkdir as mkdir3, unlink as unlink2 } from "fs/promises";
2481
+ import { join as join5, dirname as dirname4 } from "path";
2483
2482
  import { fileURLToPath as fileURLToPath2 } from "url";
2483
+ import matter3 from "gray-matter";
2484
+
2485
+ // src/server/shared/item-loader.ts
2486
+ import { readdir as readdir2, readFile as readFile6, access as access3 } from "fs/promises";
2487
+ import { join as join4 } from "path";
2488
+ import { constants as constants3 } from "fs";
2484
2489
  import matter2 from "gray-matter";
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");
2492
- }
2493
2490
  async function pathExists2(path) {
2494
2491
  try {
2495
2492
  await access3(path, constants3.R_OK);
@@ -2498,51 +2495,74 @@ async function pathExists2(path) {
2498
2495
  return false;
2499
2496
  }
2500
2497
  }
2501
- async function loadDefaultSkills() {
2502
- let defaults = [];
2498
+ async function getDefaultIds(dir, extension) {
2503
2499
  try {
2504
- defaults = await loadSkillsFromDir(DEFAULTS_DIR2);
2500
+ const files = (await readdir2(dir)).filter((f) => f.endsWith(extension));
2501
+ return files.map((f) => f.replace(extension, ""));
2505
2502
  } catch {
2503
+ return [];
2506
2504
  }
2507
- if (!defaults.length) {
2508
- try {
2509
- defaults = await loadSkillsFromDir(DEFAULTS_DIR_ALT2);
2510
- } catch {
2511
- }
2512
- }
2513
- return defaults;
2514
2505
  }
2515
- async function loadSkillsFromDir(dir) {
2506
+ async function loadItemsFromDir(dir, options) {
2516
2507
  if (!await pathExists2(dir)) {
2517
2508
  return [];
2518
2509
  }
2519
2510
  let files;
2520
2511
  try {
2521
- files = (await readdir2(dir)).filter((f) => f.endsWith(SKILL_EXTENSION));
2512
+ files = (await readdir2(dir)).filter((f) => f.endsWith(options.extension));
2522
2513
  } catch {
2523
2514
  return [];
2524
2515
  }
2525
- const skills = [];
2516
+ const items = [];
2526
2517
  for (const file of files) {
2527
2518
  try {
2528
2519
  const raw = await readFile6(join4(dir, file), "utf-8");
2529
2520
  const { data, content } = matter2(raw);
2530
2521
  if (data.id && content.trim()) {
2531
- skills.push({
2522
+ items.push({
2532
2523
  metadata: data,
2533
2524
  prompt: content.trim()
2534
2525
  });
2535
2526
  } else {
2536
- logger.warn("Skipping invalid skill file", { file });
2527
+ logger.warn(`Skipping invalid ${options.logName} file`, { file });
2537
2528
  }
2538
2529
  } catch (err) {
2539
- logger.warn("Failed to parse skill file", { file, error: err instanceof Error ? err.message : String(err) });
2530
+ logger.warn(`Failed to parse ${options.logName} file`, {
2531
+ file,
2532
+ error: err instanceof Error ? err.message : String(err)
2533
+ });
2540
2534
  }
2541
2535
  }
2542
- return skills;
2536
+ return items;
2537
+ }
2538
+
2539
+ // src/server/skills/registry.ts
2540
+ var __bundleDir2 = dirname4(fileURLToPath2(import.meta.url));
2541
+ var DEFAULTS_DIR2 = join5(__bundleDir2, "defaults");
2542
+ var DEFAULTS_DIR_ALT2 = join5(__bundleDir2, "skill-defaults");
2543
+ var SKILL_EXTENSION = ".skill.md";
2544
+ var SKILL_SETTING_PREFIX = "skill.enabled.";
2545
+ function getSkillsDir(configDir) {
2546
+ return join5(configDir, "skills");
2547
+ }
2548
+ async function loadDefaultSkills() {
2549
+ let defaults = await loadItemsFromDir(DEFAULTS_DIR2, {
2550
+ extension: SKILL_EXTENSION,
2551
+ logName: "skill"
2552
+ });
2553
+ if (!defaults.length) {
2554
+ defaults = await loadItemsFromDir(DEFAULTS_DIR_ALT2, {
2555
+ extension: SKILL_EXTENSION,
2556
+ logName: "skill"
2557
+ });
2558
+ }
2559
+ return defaults;
2543
2560
  }
2544
2561
  async function loadUserSkills(configDir) {
2545
- return loadSkillsFromDir(getSkillsDir(configDir));
2562
+ return loadItemsFromDir(getSkillsDir(configDir), {
2563
+ extension: SKILL_EXTENSION,
2564
+ logName: "skill"
2565
+ });
2546
2566
  }
2547
2567
  async function loadAllSkills(configDir) {
2548
2568
  const [defaultSkills, userSkills] = await Promise.all([
@@ -2574,14 +2594,6 @@ function isSkillEnabled(skillId) {
2574
2594
  function setSkillEnabled(skillId, enabled) {
2575
2595
  setSetting(`${SKILL_SETTING_PREFIX}${skillId}`, String(enabled));
2576
2596
  }
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
- }
2585
2597
  async function getDefaultSkillIds() {
2586
2598
  const ids = await getDefaultIds(DEFAULTS_DIR2, SKILL_EXTENSION);
2587
2599
  if (ids.length) return ids;
@@ -2599,15 +2611,15 @@ function findSkillById(skillId, skills) {
2599
2611
  return skills.find((s) => s.metadata.id === skillId);
2600
2612
  }
2601
2613
  async function skillExists(configDir, skillId) {
2602
- return pathExists2(join4(getSkillsDir(configDir), `${skillId}${SKILL_EXTENSION}`));
2614
+ return pathExists2(join5(getSkillsDir(configDir), `${skillId}${SKILL_EXTENSION}`));
2603
2615
  }
2604
2616
  async function saveSkill(configDir, skill) {
2605
2617
  const skillsDir = getSkillsDir(configDir);
2606
2618
  if (!await pathExists2(skillsDir)) {
2607
2619
  await mkdir3(skillsDir, { recursive: true });
2608
2620
  }
2609
- const filePath = join4(skillsDir, `${skill.metadata.id}${SKILL_EXTENSION}`);
2610
- const content = matter2.stringify(skill.prompt, skill.metadata);
2621
+ const filePath = join5(skillsDir, `${skill.metadata.id}${SKILL_EXTENSION}`);
2622
+ const content = matter3.stringify(skill.prompt, skill.metadata);
2611
2623
  await writeFile4(filePath, content, "utf-8");
2612
2624
  }
2613
2625
  async function deleteSkill(configDir, skillId) {
@@ -2615,7 +2627,7 @@ async function deleteSkill(configDir, skillId) {
2615
2627
  if (isDefault) {
2616
2628
  return { success: false, reason: "Cannot delete built-in defaults" };
2617
2629
  }
2618
- const filePath = join4(getSkillsDir(configDir), `${skillId}${SKILL_EXTENSION}`);
2630
+ const filePath = join5(getSkillsDir(configDir), `${skillId}${SKILL_EXTENSION}`);
2619
2631
  try {
2620
2632
  await unlink2(filePath);
2621
2633
  deleteSetting(`${SKILL_SETTING_PREFIX}${skillId}`);
@@ -3291,7 +3303,7 @@ var callSubAgentTool = {
3291
3303
  };
3292
3304
  }
3293
3305
  try {
3294
- const { getToolRegistryForAgent: getToolRegistryForAgent2 } = await import("./tools-55YICCVH.js");
3306
+ const { getToolRegistryForAgent: getToolRegistryForAgent2 } = await import("./tools-YRDPOS6P.js");
3295
3307
  const toolRegistry = getToolRegistryForAgent2(agentDef);
3296
3308
  const turnMetrics = new TurnMetrics();
3297
3309
  const result = await executeSubAgent({
@@ -3547,7 +3559,7 @@ var webFetchTool = createTool(
3547
3559
  // src/server/dev-server/manager.ts
3548
3560
  import { spawn as spawn4 } from "child_process";
3549
3561
  import { readFile as readFile7, writeFile as writeFile5, mkdir as mkdir4 } from "fs/promises";
3550
- import { resolve as resolve5, join as join5 } from "path";
3562
+ import { resolve as resolve5, join as join6 } from "path";
3551
3563
  var MAX_LOG_LINES = 2e3;
3552
3564
  var MAX_LOG_BYTES = 1e5;
3553
3565
  var CONFIG_PATH = ".openfox/dev.json";
@@ -3603,7 +3615,7 @@ var DevServerManager = class {
3603
3615
  }
3604
3616
  async loadConfig(workdir) {
3605
3617
  try {
3606
- const configPath = join5(this.resolveWorkdir(workdir), CONFIG_PATH);
3618
+ const configPath = join6(this.resolveWorkdir(workdir), CONFIG_PATH);
3607
3619
  const raw = await readFile7(configPath, "utf-8");
3608
3620
  const parsed = JSON.parse(raw);
3609
3621
  if (!parsed.command || !parsed.url) return null;
@@ -3618,9 +3630,9 @@ var DevServerManager = class {
3618
3630
  }
3619
3631
  async saveConfig(workdir, config) {
3620
3632
  const resolved = this.resolveWorkdir(workdir);
3621
- const dirPath = join5(resolved, ".openfox");
3633
+ const dirPath = join6(resolved, ".openfox");
3622
3634
  await mkdir4(dirPath, { recursive: true });
3623
- const configPath = join5(resolved, CONFIG_PATH);
3635
+ const configPath = join6(resolved, CONFIG_PATH);
3624
3636
  await writeFile5(configPath, JSON.stringify(config, null, 2) + "\n", "utf-8");
3625
3637
  }
3626
3638
  async start(workdir) {
@@ -4390,6 +4402,9 @@ export {
4390
4402
  createChatDoneEvent,
4391
4403
  getAllInstructions,
4392
4404
  assembleAgentRequest,
4405
+ pathExists2 as pathExists,
4406
+ getDefaultIds,
4407
+ loadItemsFromDir,
4393
4408
  loadDefaultSkills,
4394
4409
  loadUserSkills,
4395
4410
  loadAllSkills,
@@ -4417,4 +4432,4 @@ export {
4417
4432
  getToolRegistryForAgent,
4418
4433
  createToolRegistry
4419
4434
  };
4420
- //# sourceMappingURL=chunk-4OI4VPZ6.js.map
4435
+ //# sourceMappingURL=chunk-R7U3CD2U.js.map
@@ -13,7 +13,7 @@ import {
13
13
  getToolRegistryForAgent,
14
14
  loadAllAgentsDefault,
15
15
  runTopLevelAgentLoop
16
- } from "./chunk-4OI4VPZ6.js";
16
+ } from "./chunk-R7U3CD2U.js";
17
17
  import {
18
18
  getCurrentContextWindowId,
19
19
  getEventStore
@@ -293,4 +293,4 @@ export {
293
293
  runBuilderTurn,
294
294
  runVerifierTurn
295
295
  };
296
- //# sourceMappingURL=chunk-U54QVKL2.js.map
296
+ //# sourceMappingURL=chunk-RPPEIB3F.js.map
@@ -6,7 +6,7 @@ import {
6
6
  createVerifierNudgeConfig,
7
7
  runBuilderTurn,
8
8
  runChatTurn
9
- } from "./chunk-U54QVKL2.js";
9
+ } from "./chunk-RPPEIB3F.js";
10
10
  import {
11
11
  TurnMetrics,
12
12
  agentExists,
@@ -25,6 +25,7 @@ import {
25
25
  getAllInstructions,
26
26
  getDefaultAgentContent,
27
27
  getDefaultAgentIds,
28
+ getDefaultIds,
28
29
  getDefaultSkillContent,
29
30
  getDefaultSkillIds,
30
31
  getEnabledSkillMetadata,
@@ -35,16 +36,18 @@ import {
35
36
  loadAllSkills,
36
37
  loadDefaultAgents,
37
38
  loadDefaultSkills,
39
+ loadItemsFromDir,
38
40
  loadUserAgents,
39
41
  loadUserSkills,
40
42
  maybeAutoCompactContext,
43
+ pathExists,
41
44
  performManualContextCompaction,
42
45
  saveAgent,
43
46
  saveSkill,
44
47
  setSkillEnabled,
45
48
  skillExists,
46
49
  spawnShellProcess
47
- } from "./chunk-4OI4VPZ6.js";
50
+ } from "./chunk-R7U3CD2U.js";
48
51
  import {
49
52
  getPathSeparator,
50
53
  getPlatformShell,
@@ -145,8 +148,8 @@ import express from "express";
145
148
  import cors from "cors";
146
149
  import { createServer as createHttpServer } from "http";
147
150
  import { fileURLToPath as fileURLToPath4 } from "url";
148
- import { dirname as dirname5, resolve, join as join6 } from "path";
149
- import { readFile as readFile4 } from "fs/promises";
151
+ import { dirname as dirname5, resolve, join as join5 } from "path";
152
+ import { readFile as readFile3 } from "fs/promises";
150
153
  import { createServer as createViteServer } from "vite";
151
154
 
152
155
  // src/server/llm/mock.ts
@@ -1425,7 +1428,7 @@ var WORKFLOW_EXTENSION = ".workflow.json";
1425
1428
  function getWorkflowsDir(configDir) {
1426
1429
  return join(configDir, "workflows");
1427
1430
  }
1428
- async function pathExists(path) {
1431
+ async function pathExists2(path) {
1429
1432
  try {
1430
1433
  await access(path, constants.R_OK);
1431
1434
  return true;
@@ -1434,7 +1437,7 @@ async function pathExists(path) {
1434
1437
  }
1435
1438
  }
1436
1439
  async function loadWorkflowsFromDir(dir) {
1437
- if (!await pathExists(dir)) {
1440
+ if (!await pathExists2(dir)) {
1438
1441
  return [];
1439
1442
  }
1440
1443
  let files;
@@ -1506,11 +1509,11 @@ function findWorkflowById(workflowId, workflows) {
1506
1509
  }
1507
1510
  async function workflowExists(configDir, workflowId) {
1508
1511
  const filePath = join(getWorkflowsDir(configDir), `${workflowId}${WORKFLOW_EXTENSION}`);
1509
- return pathExists(filePath);
1512
+ return pathExists2(filePath);
1510
1513
  }
1511
1514
  async function saveWorkflow(configDir, workflow) {
1512
1515
  const workflowsDir = getWorkflowsDir(configDir);
1513
- if (!await pathExists(workflowsDir)) {
1516
+ if (!await pathExists2(workflowsDir)) {
1514
1517
  await mkdir(workflowsDir, { recursive: true });
1515
1518
  }
1516
1519
  const filePath = join(workflowsDir, `${workflow.metadata.id}${WORKFLOW_EXTENSION}`);
@@ -4982,102 +4985,35 @@ function createSkillRoutes(configDir) {
4982
4985
  import { Router as Router2 } from "express";
4983
4986
 
4984
4987
  // src/server/commands/registry.ts
4985
- import { join as join5 } from "path";
4986
-
4987
- // src/server/commands/registry-utils.ts
4988
- import { readdir as readdir2, readFile as readFile3, writeFile as writeFile3, mkdir as mkdir3, access as access3, unlink as unlink2 } from "fs/promises";
4988
+ import { writeFile as writeFile3, mkdir as mkdir3, unlink as unlink2 } from "fs/promises";
4989
4989
  import { join as join4, dirname as dirname4 } from "path";
4990
- import { constants as constants3 } from "fs";
4991
4990
  import { fileURLToPath as fileURLToPath3 } from "url";
4992
4991
  import matter from "gray-matter";
4993
- function getBundleDir() {
4994
- return dirname4(fileURLToPath3(import.meta.url));
4995
- }
4996
- async function dirExists(path) {
4997
- try {
4998
- await access3(path, constants3.R_OK);
4999
- return true;
5000
- } catch {
5001
- return false;
5002
- }
5003
- }
5004
- async function ensureDir(path) {
5005
- if (!await dirExists(path)) {
5006
- await mkdir3(path, { recursive: true });
5007
- }
5008
- }
5009
- async function loadItems(dir, extension) {
5010
- if (!await dirExists(dir)) return [];
5011
- let files;
5012
- try {
5013
- files = (await readdir2(dir)).filter((f) => f.endsWith(extension));
5014
- } catch {
5015
- return [];
5016
- }
5017
- const items = [];
5018
- for (const file of files) {
5019
- try {
5020
- const raw = await readFile3(join4(dir, file), "utf-8");
5021
- const { data, content } = matter(raw);
5022
- if (data.id && content.trim()) {
5023
- items.push({ metadata: data, prompt: content.trim() });
5024
- } else {
5025
- logger.warn(`Skipping invalid ${extension} file`, { file });
5026
- }
5027
- } catch (err) {
5028
- logger.warn(`Failed to parse ${extension} file`, { file, error: err instanceof Error ? err.message : String(err) });
5029
- }
5030
- }
5031
- return items;
5032
- }
5033
- async function saveItem(dir, id, extension, item) {
5034
- await ensureDir(dir);
5035
- const filePath = join4(dir, `${id}${extension}`);
5036
- const content = matter.stringify(item.prompt, item.metadata);
5037
- await writeFile3(filePath, content, "utf-8");
5038
- }
5039
- async function deleteItem(dir, id, extension) {
5040
- const filePath = join4(dir, `${id}${extension}`);
5041
- try {
5042
- await unlink2(filePath);
5043
- return true;
5044
- } catch {
5045
- return false;
5046
- }
5047
- }
5048
- function findById(id, items) {
5049
- return items.find((i) => i.metadata.id === id);
5050
- }
5051
- async function getDefaultIds(bundleDir, defaultsDir, extension) {
5052
- try {
5053
- const files = (await readdir2(join4(bundleDir, defaultsDir))).filter((f) => f.endsWith(extension));
5054
- return files.map((f) => f.replace(extension, ""));
5055
- } catch {
5056
- return [];
5057
- }
5058
- }
5059
- async function loadDefaults(bundleDir, defaultsDir, extension) {
5060
- const dir = join4(bundleDir, defaultsDir);
5061
- return loadItems(dir, extension);
5062
- }
5063
-
5064
- // src/server/commands/registry.ts
5065
- var DEFAULTS_DIR2 = "defaults";
5066
- var DEFAULTS_DIR_ALT2 = "command-defaults";
4992
+ var __bundleDir2 = dirname4(fileURLToPath3(import.meta.url));
4993
+ var DEFAULTS_DIR2 = join4(__bundleDir2, "defaults");
4994
+ var DEFAULTS_DIR_ALT2 = join4(__bundleDir2, "command-defaults");
5067
4995
  var COMMAND_EXTENSION = ".command.md";
5068
4996
  function getCommandsDir(configDir) {
5069
- return join5(configDir, "commands");
4997
+ return join4(configDir, "commands");
5070
4998
  }
5071
4999
  async function loadDefaultCommands() {
5072
- const bundleDir = getBundleDir();
5073
- let defaults = await loadDefaults(bundleDir, DEFAULTS_DIR2, COMMAND_EXTENSION);
5000
+ let defaults = await loadItemsFromDir(DEFAULTS_DIR2, {
5001
+ extension: COMMAND_EXTENSION,
5002
+ logName: "command"
5003
+ });
5074
5004
  if (!defaults.length) {
5075
- defaults = await loadDefaults(bundleDir, DEFAULTS_DIR_ALT2, COMMAND_EXTENSION);
5005
+ defaults = await loadItemsFromDir(DEFAULTS_DIR_ALT2, {
5006
+ extension: COMMAND_EXTENSION,
5007
+ logName: "command"
5008
+ });
5076
5009
  }
5077
5010
  return defaults;
5078
5011
  }
5079
5012
  async function loadUserCommands(configDir) {
5080
- return loadItems(getCommandsDir(configDir), COMMAND_EXTENSION);
5013
+ return loadItemsFromDir(getCommandsDir(configDir), {
5014
+ extension: COMMAND_EXTENSION,
5015
+ logName: "command"
5016
+ });
5081
5017
  }
5082
5018
  async function loadAllCommands(configDir) {
5083
5019
  const [defaultCommands, userCommands] = await Promise.all([
@@ -5094,10 +5030,9 @@ async function loadAllCommands(configDir) {
5094
5030
  return Array.from(commandMap.values());
5095
5031
  }
5096
5032
  async function getDefaultCommandIds() {
5097
- const bundleDir = getBundleDir();
5098
- const ids = await getDefaultIds(bundleDir, DEFAULTS_DIR2, COMMAND_EXTENSION);
5033
+ const ids = await getDefaultIds(DEFAULTS_DIR2, COMMAND_EXTENSION);
5099
5034
  if (ids.length) return ids;
5100
- return getDefaultIds(bundleDir, DEFAULTS_DIR_ALT2, COMMAND_EXTENSION);
5035
+ return getDefaultIds(DEFAULTS_DIR_ALT2, COMMAND_EXTENSION);
5101
5036
  }
5102
5037
  async function getDefaultCommandContent(commandId) {
5103
5038
  const defaults = await loadDefaultCommands();
@@ -5108,21 +5043,32 @@ async function isDefaultCommand(commandId) {
5108
5043
  return defaultIds.includes(commandId);
5109
5044
  }
5110
5045
  function findCommandById(commandId, commands) {
5111
- return findById(commandId, commands);
5046
+ return commands.find((c) => c.metadata.id === commandId);
5112
5047
  }
5113
5048
  async function commandExists(configDir, commandId) {
5114
- return dirExists(join5(getCommandsDir(configDir), `${commandId}${COMMAND_EXTENSION}`));
5049
+ return pathExists(join4(getCommandsDir(configDir), `${commandId}${COMMAND_EXTENSION}`));
5115
5050
  }
5116
5051
  async function saveCommand(configDir, command) {
5117
- return saveItem(getCommandsDir(configDir), command.metadata.id, COMMAND_EXTENSION, command);
5052
+ const commandsDir = getCommandsDir(configDir);
5053
+ if (!await pathExists(commandsDir)) {
5054
+ await mkdir3(commandsDir, { recursive: true });
5055
+ }
5056
+ const filePath = join4(commandsDir, `${command.metadata.id}${COMMAND_EXTENSION}`);
5057
+ const content = matter.stringify(command.prompt, command.metadata);
5058
+ await writeFile3(filePath, content, "utf-8");
5118
5059
  }
5119
5060
  async function deleteCommand(configDir, commandId) {
5120
5061
  const isDefault = await isDefaultCommand(commandId);
5121
5062
  if (isDefault) {
5122
5063
  return { success: false, reason: "Cannot delete built-in defaults" };
5123
5064
  }
5124
- const deleted = await deleteItem(getCommandsDir(configDir), commandId, COMMAND_EXTENSION);
5125
- return { success: deleted };
5065
+ const filePath = join4(getCommandsDir(configDir), `${commandId}${COMMAND_EXTENSION}`);
5066
+ try {
5067
+ await unlink2(filePath);
5068
+ return { success: true };
5069
+ } catch {
5070
+ return { success: false };
5071
+ }
5126
5072
  }
5127
5073
 
5128
5074
  // src/server/routes/commands.ts
@@ -5526,7 +5472,7 @@ function createTerminalRoutes() {
5526
5472
  }
5527
5473
 
5528
5474
  // src/constants.ts
5529
- var VERSION = "1.6.16";
5475
+ var VERSION = "1.6.17";
5530
5476
 
5531
5477
  // src/server/index.ts
5532
5478
  var __dirname2 = dirname5(fileURLToPath4(import.meta.url));
@@ -5828,7 +5774,7 @@ async function createServerHandle(config) {
5828
5774
  if (!callId || approved === void 0) {
5829
5775
  return res.status(400).json({ error: "callId and approved are required" });
5830
5776
  }
5831
- const { providePathConfirmation: providePathConfirmation2 } = await import("./tools-55YICCVH.js");
5777
+ const { providePathConfirmation: providePathConfirmation2 } = await import("./tools-YRDPOS6P.js");
5832
5778
  const result = providePathConfirmation2(callId, approved, alwaysAllow);
5833
5779
  if (!result.found) {
5834
5780
  return res.status(404).json({ error: "No pending path confirmation with that ID" });
@@ -5853,7 +5799,7 @@ async function createServerHandle(config) {
5853
5799
  if (!callId || !answer) {
5854
5800
  return res.status(400).json({ error: "callId and answer are required" });
5855
5801
  }
5856
- const { provideAnswer: provideAnswer2 } = await import("./tools-55YICCVH.js");
5802
+ const { provideAnswer: provideAnswer2 } = await import("./tools-YRDPOS6P.js");
5857
5803
  const found = provideAnswer2(callId, answer);
5858
5804
  if (!found) {
5859
5805
  return res.status(404).json({ error: "No pending question with that ID" });
@@ -5889,8 +5835,8 @@ async function createServerHandle(config) {
5889
5835
  if (!session) {
5890
5836
  return res.status(404).json({ error: "Session not found" });
5891
5837
  }
5892
- const { stopSessionExecution } = await import("./chat-handler-IY2XVOO6.js");
5893
- const { cancelQuestionsForSession: cancelQuestionsForSession2, cancelPathConfirmationsForSession: cancelPathConfirmationsForSession2 } = await import("./tools-55YICCVH.js");
5838
+ const { stopSessionExecution } = await import("./chat-handler-7HWNXQ4G.js");
5839
+ const { cancelQuestionsForSession: cancelQuestionsForSession2, cancelPathConfirmationsForSession: cancelPathConfirmationsForSession2 } = await import("./tools-YRDPOS6P.js");
5894
5840
  stopSessionExecution(sessionId, sessionManager);
5895
5841
  abortSession(sessionId);
5896
5842
  cancelQuestionsForSession2(sessionId, "Session stopped by user");
@@ -6210,7 +6156,7 @@ async function createServerHandle(config) {
6210
6156
  const entries = await import("fs/promises").then((m) => m.readdir(resolvedPath, { withFileTypes: true }));
6211
6157
  const directories = entries.filter((entry) => entry.isDirectory() && !entry.name.startsWith(".")).map((entry) => ({
6212
6158
  name: entry.name,
6213
- path: join6(resolvedPath, entry.name)
6159
+ path: join5(resolvedPath, entry.name)
6214
6160
  })).sort((a, b) => a.name.localeCompare(b.name));
6215
6161
  const parent = dirname5(resolvedPath);
6216
6162
  const hasParent = parent !== resolvedPath;
@@ -6257,7 +6203,7 @@ async function createServerHandle(config) {
6257
6203
  }
6258
6204
  });
6259
6205
  app.get("/fox.svg", (_req, res) => {
6260
- readFile4(join6(webDir, "fox.svg")).then((content) => {
6206
+ readFile3(join5(webDir, "fox.svg")).then((content) => {
6261
6207
  res.set("Content-Type", "image/svg+xml");
6262
6208
  res.send(content);
6263
6209
  }).catch(() => {
@@ -6266,7 +6212,7 @@ async function createServerHandle(config) {
6266
6212
  });
6267
6213
  app.use(
6268
6214
  "/sounds",
6269
- express.static(join6(webDir, "public", "sounds"), {
6215
+ express.static(join5(webDir, "public", "sounds"), {
6270
6216
  setHeaders: (res) => {
6271
6217
  res.set("Content-Type", "audio/mpeg");
6272
6218
  }
@@ -6276,7 +6222,7 @@ async function createServerHandle(config) {
6276
6222
  if (req.path.startsWith("/api/")) {
6277
6223
  return;
6278
6224
  }
6279
- readFile4(join6(webDir, "index.html"), "utf-8").then((indexHtml) => viteServer.transformIndexHtml(req.originalUrl, indexHtml)).then((transformed) => res.send(transformed)).catch((err) => {
6225
+ readFile3(join5(webDir, "index.html"), "utf-8").then((indexHtml) => viteServer.transformIndexHtml(req.originalUrl, indexHtml)).then((transformed) => res.send(transformed)).catch((err) => {
6280
6226
  logger.error("Error serving index.html", { error: err });
6281
6227
  res.status(500).send("Server error");
6282
6228
  });
@@ -6287,7 +6233,7 @@ async function createServerHandle(config) {
6287
6233
  const distWebDir = resolve(__dirname2, "web");
6288
6234
  app.use(
6289
6235
  "/assets",
6290
- express.static(join6(distWebDir, "assets"), {
6236
+ express.static(join5(distWebDir, "assets"), {
6291
6237
  setHeaders: (res, filepath) => {
6292
6238
  if (filepath.endsWith(".css")) {
6293
6239
  res.set("Content-Type", "text/css");
@@ -6295,11 +6241,11 @@ async function createServerHandle(config) {
6295
6241
  }
6296
6242
  })
6297
6243
  );
6298
- app.use("/manifest.webmanifest", express.static(join6(distWebDir, "manifest.webmanifest")));
6299
- app.use("/registerSW.js", express.static(join6(distWebDir, "registerSW.js")));
6300
- app.use("/sw.js", express.static(join6(distWebDir, "sw.js")));
6244
+ app.use("/manifest.webmanifest", express.static(join5(distWebDir, "manifest.webmanifest")));
6245
+ app.use("/registerSW.js", express.static(join5(distWebDir, "registerSW.js")));
6246
+ app.use("/sw.js", express.static(join5(distWebDir, "sw.js")));
6301
6247
  app.get("/fox.svg", (_req, res) => {
6302
- readFile4(join6(distWebDir, "fox.svg")).then((content) => {
6248
+ readFile3(join5(distWebDir, "fox.svg")).then((content) => {
6303
6249
  res.set("Content-Type", "image/svg+xml");
6304
6250
  res.send(content);
6305
6251
  }).catch(() => {
@@ -6308,14 +6254,14 @@ async function createServerHandle(config) {
6308
6254
  });
6309
6255
  app.use(
6310
6256
  "/sounds",
6311
- express.static(join6(distWebDir, "sounds"), {
6257
+ express.static(join5(distWebDir, "sounds"), {
6312
6258
  setHeaders: (res) => {
6313
6259
  res.set("Content-Type", "audio/mpeg");
6314
6260
  }
6315
6261
  })
6316
6262
  );
6317
6263
  app.get("/", (_req, res) => {
6318
- readFile4(join6(distWebDir, "index.html"), "utf-8").then((content) => res.send(content)).catch(() => {
6264
+ readFile3(join5(distWebDir, "index.html"), "utf-8").then((content) => res.send(content)).catch(() => {
6319
6265
  res.status(404).send("Web UI not built. Run `npm run build:web`");
6320
6266
  });
6321
6267
  });
@@ -6323,7 +6269,7 @@ async function createServerHandle(config) {
6323
6269
  if (req.path.startsWith("/api/") || req.path.startsWith("/assets/") || req.path.startsWith("/sounds/") || req.path.startsWith("/manifest.webmanifest") || req.path.startsWith("/registerSW.js") || req.path.startsWith("/sw.js") || req.path === "/fox.svg") {
6324
6270
  return;
6325
6271
  }
6326
- readFile4(join6(distWebDir, "index.html"), "utf-8").then((content) => res.send(content)).catch(() => {
6272
+ readFile3(join5(distWebDir, "index.html"), "utf-8").then((content) => res.send(content)).catch(() => {
6327
6273
  res.status(404).send("Web UI not built");
6328
6274
  });
6329
6275
  });
@@ -6338,7 +6284,7 @@ async function createServerHandle(config) {
6338
6284
  providerManager
6339
6285
  );
6340
6286
  const wss = wssExports.wss;
6341
- const { QueueProcessor } = await import("./processor-VUEJM73B.js");
6287
+ const { QueueProcessor } = await import("./processor-PVYCX5GK.js");
6342
6288
  const queueProcessor = new QueueProcessor({
6343
6289
  sessionManager,
6344
6290
  providerManager,
@@ -6411,4 +6357,4 @@ export {
6411
6357
  createServerHandle,
6412
6358
  createServer
6413
6359
  };
6414
- //# sourceMappingURL=chunk-NN65D5SI.js.map
6360
+ //# sourceMappingURL=chunk-UJANEDP5.js.map
package/dist/cli/dev.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  runCli
4
- } from "../chunk-T5PBG2PE.js";
4
+ } from "../chunk-EAQNNNUR.js";
5
5
  import {
6
6
  logger
7
7
  } from "../chunk-PNBH3RAX.js";
package/dist/cli/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  runCli
4
- } from "../chunk-T5PBG2PE.js";
4
+ } from "../chunk-EAQNNNUR.js";
5
5
  import {
6
6
  logger
7
7
  } from "../chunk-PNBH3RAX.js";
@@ -3,7 +3,7 @@ import {
3
3
  runBuilderTurn,
4
4
  runChatTurn,
5
5
  runVerifierTurn
6
- } from "./chunk-U54QVKL2.js";
6
+ } from "./chunk-RPPEIB3F.js";
7
7
  import {
8
8
  TurnMetrics,
9
9
  createChatDoneEvent,
@@ -11,7 +11,7 @@ import {
11
11
  createMessageStartEvent,
12
12
  createToolCallEvent,
13
13
  createToolResultEvent
14
- } from "./chunk-4OI4VPZ6.js";
14
+ } from "./chunk-R7U3CD2U.js";
15
15
  import "./chunk-NBU6KIOD.js";
16
16
  import "./chunk-574HZVLE.js";
17
17
  import "./chunk-55N6FAAZ.js";
@@ -38,4 +38,4 @@ export {
38
38
  runChatTurn,
39
39
  runVerifierTurn
40
40
  };
41
- //# sourceMappingURL=orchestrator-U5VCLBYQ.js.map
41
+ //# sourceMappingURL=orchestrator-DJZZPPE7.js.map
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openfox",
3
- "version": "1.6.16",
3
+ "version": "1.6.17",
4
4
  "description": "Local-LLM-first agentic coding assistant",
5
5
  "type": "module",
6
6
  "bin": {
@@ -27,7 +27,7 @@
27
27
  "dev": "OPENFOX_DEV=true tsx watch src/cli/dev.ts --no-browser",
28
28
  "dev:web": "vite --config web/vite.config.ts",
29
29
  "build": "FORCE_COLOR=1 npm run build:server && FORCE_COLOR=1 npm run build:web",
30
- "build:server": "FORCE_COLOR=1 tsup && mkdir -p dist/server/commands/defaults dist/server/skills/defaults && cp src/server/skills/defaults/*.md dist/server/skills/defaults/ && cp src/server/commands/defaults/*.md dist/server/commands/defaults/ && cp src/server/agents/defaults/*.md dist/agent-defaults/ && cp src/server/workflows/defaults/*.json dist/workflow-defaults/ && cp package.json dist/",
30
+ "build:server": "FORCE_COLOR=1 tsup && mkdir -p dist/command-defaults dist/skill-defaults dist/agent-defaults dist/workflow-defaults && cp src/server/commands/defaults/*.md dist/command-defaults/ && cp src/server/skills/defaults/*.md dist/skill-defaults/ && cp src/server/agents/defaults/*.md dist/agent-defaults/ && cp src/server/workflows/defaults/*.json dist/workflow-defaults/ && cp package.json dist/",
31
31
  "build:web": "cd web && FORCE_COLOR=1 vite build --outDir ../dist/web",
32
32
  "start": "node dist/cli/index.js",
33
33
  "start:dev": "node dist/cli/dev.js",
@@ -175,7 +175,7 @@ var QueueProcessor = class {
175
175
  backend: provider?.backend ?? llmClient.getBackend(),
176
176
  model: llmClient.getModel()
177
177
  };
178
- const { runChatTurn } = await import("./orchestrator-U5VCLBYQ.js");
178
+ const { runChatTurn } = await import("./orchestrator-DJZZPPE7.js");
179
179
  const runChatTurnParams = buildRunChatTurnParams({
180
180
  sessionManager,
181
181
  sessionId,
@@ -208,4 +208,4 @@ var QueueProcessor = class {
208
208
  export {
209
209
  QueueProcessor
210
210
  };
211
- //# sourceMappingURL=processor-VUEJM73B.js.map
211
+ //# sourceMappingURL=processor-PVYCX5GK.js.map
@@ -6,10 +6,10 @@ import {
6
6
  import {
7
7
  VERSION,
8
8
  createServer
9
- } from "./chunk-NN65D5SI.js";
9
+ } from "./chunk-UJANEDP5.js";
10
10
  import "./chunk-F54ZJN4X.js";
11
- import "./chunk-U54QVKL2.js";
12
- import "./chunk-4OI4VPZ6.js";
11
+ import "./chunk-RPPEIB3F.js";
12
+ import "./chunk-R7U3CD2U.js";
13
13
  import "./chunk-NBU6KIOD.js";
14
14
  import "./chunk-574HZVLE.js";
15
15
  import "./chunk-KOUMYBYM.js";
@@ -188,4 +188,4 @@ async function runServe(options) {
188
188
  export {
189
189
  runServe
190
190
  };
191
- //# sourceMappingURL=serve-GOLQMQFA.js.map
191
+ //# sourceMappingURL=serve-FEG4BUYZ.js.map
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  createServer,
3
3
  createServerHandle
4
- } from "../chunk-NN65D5SI.js";
4
+ } from "../chunk-UJANEDP5.js";
5
5
  import "../chunk-F54ZJN4X.js";
6
- import "../chunk-U54QVKL2.js";
7
- import "../chunk-4OI4VPZ6.js";
6
+ import "../chunk-RPPEIB3F.js";
7
+ import "../chunk-R7U3CD2U.js";
8
8
  import "../chunk-NBU6KIOD.js";
9
9
  import "../chunk-574HZVLE.js";
10
10
  import "../chunk-KOUMYBYM.js";
@@ -11,7 +11,7 @@ import {
11
11
  requestPathAccess,
12
12
  stepDoneTool,
13
13
  validateToolAction
14
- } from "./chunk-4OI4VPZ6.js";
14
+ } from "./chunk-R7U3CD2U.js";
15
15
  import "./chunk-NBU6KIOD.js";
16
16
  import "./chunk-574HZVLE.js";
17
17
  import "./chunk-55N6FAAZ.js";
@@ -47,4 +47,4 @@ export {
47
47
  stepDoneTool,
48
48
  validateToolAction
49
49
  };
50
- //# sourceMappingURL=tools-55YICCVH.js.map
50
+ //# sourceMappingURL=tools-YRDPOS6P.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openfox",
3
- "version": "1.6.16",
3
+ "version": "1.6.17",
4
4
  "description": "Local-LLM-first agentic coding assistant",
5
5
  "type": "module",
6
6
  "bin": {
@@ -27,7 +27,7 @@
27
27
  "dev": "OPENFOX_DEV=true tsx watch src/cli/dev.ts --no-browser",
28
28
  "dev:web": "vite --config web/vite.config.ts",
29
29
  "build": "FORCE_COLOR=1 npm run build:server && FORCE_COLOR=1 npm run build:web",
30
- "build:server": "FORCE_COLOR=1 tsup && mkdir -p dist/server/commands/defaults dist/server/skills/defaults && cp src/server/skills/defaults/*.md dist/server/skills/defaults/ && cp src/server/commands/defaults/*.md dist/server/commands/defaults/ && cp src/server/agents/defaults/*.md dist/agent-defaults/ && cp src/server/workflows/defaults/*.json dist/workflow-defaults/ && cp package.json dist/",
30
+ "build:server": "FORCE_COLOR=1 tsup && mkdir -p dist/command-defaults dist/skill-defaults dist/agent-defaults dist/workflow-defaults && cp src/server/commands/defaults/*.md dist/command-defaults/ && cp src/server/skills/defaults/*.md dist/skill-defaults/ && cp src/server/agents/defaults/*.md dist/agent-defaults/ && cp src/server/workflows/defaults/*.json dist/workflow-defaults/ && cp package.json dist/",
31
31
  "build:web": "cd web && FORCE_COLOR=1 vite build --outDir ../dist/web",
32
32
  "start": "node dist/cli/index.js",
33
33
  "start:dev": "node dist/cli/dev.js",