fifony 0.1.20 → 0.1.21

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.
@@ -8,12 +8,12 @@
8
8
  <meta name="apple-mobile-web-app-capable" content="yes" />
9
9
  <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
10
10
  <meta name="format-detection" content="telephone=no" />
11
- <meta name="description" content="Fifony orchestrator dashboard" />
12
- <title>Fifony</title>
11
+ <meta name="description" content="fifony orchestrator dashboard" />
12
+ <title>fifony</title>
13
13
  <link rel="manifest" href="/assets/manifest.webmanifest" />
14
14
  <link rel="icon" href="/assets/icon.svg" type="image/svg+xml" />
15
15
  <link rel="apple-touch-icon" href="/assets/icon.svg" />
16
- <script type="module" crossorigin src="/assets/assets/index-BK46risn.js"></script>
16
+ <script type="module" crossorigin src="/assets/assets/index-BV11ScVl.js"></script>
17
17
  <link rel="modulepreload" crossorigin href="/assets/assets/rolldown-runtime-DF2fYuay.js">
18
18
  <link rel="modulepreload" crossorigin href="/assets/assets/vendor-BoGBoEwT.js">
19
19
  <link rel="modulepreload" crossorigin href="/assets/assets/createLucideIcon-DtZs0TX0.js">
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "id": "/",
3
- "name": "Fifony Dashboard",
4
- "short_name": "Fifony",
5
- "description": "Fifony local orchestrator dashboard (React + PWA)",
3
+ "name": "fifony Dashboard",
4
+ "short_name": "fifony",
5
+ "description": "fifony local orchestrator dashboard (React + PWA)",
6
6
  "lang": "en-US",
7
7
  "start_url": "/kanban",
8
8
  "scope": "/",
@@ -4,7 +4,7 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1" />
6
6
  <meta name="theme-color" content="#0f172a" />
7
- <title>Offline · Fifony</title>
7
+ <title>Offline · fifony</title>
8
8
  <style>
9
9
  :root {
10
10
  color-scheme: dark;
@@ -75,7 +75,7 @@
75
75
  <body>
76
76
  <main>
77
77
  <div class="eyebrow">Offline</div>
78
- <h1>Fifony is temporarily disconnected.</h1>
78
+ <h1>fifony is temporarily disconnected.</h1>
79
79
  <p>The dashboard shell is available, but live runtime data needs the local server connection to come back.</p>
80
80
  <div class="actions">
81
81
  <a href="/kanban">Try again</a>
@@ -1,4 +1,4 @@
1
- const CACHE_VERSION = "1773798360781";
1
+ const CACHE_VERSION = "1773801135498";
2
2
  const CORE_CACHE = `fifony-core-${CACHE_VERSION}`;
3
3
  const ASSET_CACHE = `fifony-assets-${CACHE_VERSION}`;
4
4
  const APP_SHELL_ROUTES = ["/kanban", "/issues", "/agents", "/settings", "/onboarding"];
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "id": "/",
3
- "name": "Fifony Dashboard",
4
- "short_name": "Fifony",
5
- "description": "Fifony local orchestrator dashboard (React + PWA)",
3
+ "name": "fifony Dashboard",
4
+ "short_name": "fifony",
5
+ "description": "fifony local orchestrator dashboard (React + PWA)",
6
6
  "lang": "en-US",
7
7
  "start_url": "/kanban",
8
8
  "scope": "/",
@@ -4,7 +4,7 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1" />
6
6
  <meta name="theme-color" content="#0f172a" />
7
- <title>Offline · Fifony</title>
7
+ <title>Offline · fifony</title>
8
8
  <style>
9
9
  :root {
10
10
  color-scheme: dark;
@@ -75,7 +75,7 @@
75
75
  <body>
76
76
  <main>
77
77
  <div class="eyebrow">Offline</div>
78
- <h1>Fifony is temporarily disconnected.</h1>
78
+ <h1>fifony is temporarily disconnected.</h1>
79
79
  <p>The dashboard shell is available, but live runtime data needs the local server connection to come back.</p>
80
80
  <div class="actions">
81
81
  <a href="/kanban">Try again</a>
@@ -6,7 +6,7 @@ import {
6
6
  renderPrompt,
7
7
  renderPromptString,
8
8
  resolveTaskCapabilities
9
- } from "../chunk-JUSVR3DW.js";
9
+ } from "../chunk-SMGXYOWU.js";
10
10
 
11
11
  // src/agent/run-local.ts
12
12
  import { mkdirSync as mkdirSync6 } from "fs";
@@ -727,18 +727,14 @@ function buildClaudeCommand(options) {
727
727
  if (options.jsonSchema) {
728
728
  parts.push(`--json-schema '${options.jsonSchema}'`);
729
729
  }
730
- if (options.model) {
730
+ if (options.model && options.model !== "claude") {
731
731
  parts.splice(1, 0, `--model ${options.model}`);
732
732
  }
733
733
  parts.push('< "$FIFONY_PROMPT_FILE"');
734
734
  return parts.join(" ");
735
735
  }
736
736
  function buildCodexCommand(options) {
737
- const parts = ["codex"];
738
- if (options.reasoningEffort) {
739
- parts.push(`--reasoning-effort ${options.reasoningEffort}`);
740
- }
741
- parts.push("exec", "--skip-git-repo-check");
737
+ const parts = ["codex", "exec", "--skip-git-repo-check"];
742
738
  if (options.model && options.model !== "codex") {
743
739
  parts.push(`--model ${options.model}`);
744
740
  }
@@ -837,6 +833,29 @@ function detectAvailableProviders() {
837
833
  }
838
834
  var modelCache = /* @__PURE__ */ new Map();
839
835
  var MODEL_CACHE_TTL_MS = 5 * 60 * 1e3;
836
+ function readCodexConfig() {
837
+ try {
838
+ const configPath = join3(homedir2(), ".codex", "config.toml");
839
+ if (!existsSync(configPath)) return {};
840
+ const raw = readFileSync(configPath, "utf8");
841
+ const model = raw.match(/^model\s*=\s*"([^"]+)"/m)?.[1];
842
+ const reasoningEffort = raw.match(/^model_reasoning_effort\s*=\s*"([^"]+)"/m)?.[1];
843
+ return { model, reasoningEffort };
844
+ } catch {
845
+ return {};
846
+ }
847
+ }
848
+ function readClaudeConfig() {
849
+ try {
850
+ const settingsPath = join3(homedir2(), ".claude", "settings.json");
851
+ if (!existsSync(settingsPath)) return {};
852
+ const raw = readFileSync(settingsPath, "utf8");
853
+ const settings = JSON.parse(raw);
854
+ return { model: typeof settings.model === "string" ? settings.model : void 0 };
855
+ } catch {
856
+ return {};
857
+ }
858
+ }
840
859
  async function fetchCodexModels() {
841
860
  const cachePath = join3(homedir2(), ".codex", "models_cache.json");
842
861
  try {
@@ -1007,7 +1026,27 @@ async function discoverModels(providers) {
1007
1026
  const settled = await Promise.allSettled(tasks.map((t) => t.fetch()));
1008
1027
  for (let i = 0; i < tasks.length; i++) {
1009
1028
  const res = settled[i];
1010
- const models = res.status === "fulfilled" ? res.value : [];
1029
+ let models = res.status === "fulfilled" ? res.value : [];
1030
+ if (tasks[i].name === "codex") {
1031
+ const { model: configuredModel } = readCodexConfig();
1032
+ if (configuredModel) {
1033
+ const idx = models.findIndex((m) => m.id === configuredModel);
1034
+ if (idx > 0) {
1035
+ models = [models[idx], ...models.slice(0, idx), ...models.slice(idx + 1)];
1036
+ } else if (idx === -1) {
1037
+ models = [{ id: configuredModel, provider: "codex", label: configuredModel, tier: "Configured default" }, ...models];
1038
+ }
1039
+ }
1040
+ }
1041
+ if (tasks[i].name === "claude") {
1042
+ const { model: configuredModel } = readClaudeConfig();
1043
+ if (configuredModel) {
1044
+ const idx = models.findIndex((m) => m.id === configuredModel || m.id.includes(configuredModel));
1045
+ if (idx > 0) {
1046
+ models = [models[idx], ...models.slice(0, idx), ...models.slice(idx + 1)];
1047
+ }
1048
+ }
1049
+ }
1011
1050
  result[tasks[i].name] = models;
1012
1051
  modelCache.set(tasks[i].name, { models, fetchedAt: Date.now() });
1013
1052
  }
@@ -2527,16 +2566,17 @@ async function syncRuntimeConfigSettings(config, settings) {
2527
2566
  function isValidStage(v) {
2528
2567
  if (!v || typeof v !== "object") return false;
2529
2568
  const s = v;
2530
- return typeof s.provider === "string" && typeof s.model === "string" && typeof s.effort === "string";
2569
+ return typeof s.provider === "string" && typeof s.effort === "string";
2531
2570
  }
2532
2571
  function buildDefaultWorkflowConfig(detectedProviders, discoveredModels) {
2533
2572
  const available = detectedProviders.filter((p) => p.available);
2534
2573
  const hasClaude = available.some((p) => p.name === "claude");
2535
2574
  const hasCodex = available.some((p) => p.name === "codex");
2536
- const claudeModel = discoveredModels?.claude?.[0]?.id || "claude";
2537
- const codexModel = discoveredModels?.codex?.[0]?.id || "codex";
2575
+ const claudeModel = discoveredModels?.claude?.[0]?.id || "";
2576
+ const codexModel = discoveredModels?.codex?.[0]?.id || "";
2577
+ const codexEffort = readCodexConfig().reasoningEffort || "medium";
2538
2578
  const claudeDefault = { provider: "claude", model: claudeModel, effort: "medium" };
2539
- const codexDefault = { provider: "codex", model: codexModel, effort: "medium" };
2579
+ const codexDefault = { provider: "codex", model: codexModel, effort: codexEffort };
2540
2580
  if (hasClaude && hasCodex) {
2541
2581
  return {
2542
2582
  plan: { ...claudeDefault, effort: "high" },