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.
- package/FIFONY.md +4 -4
- package/README.md +10 -10
- package/app/dist/assets/{KeyboardShortcutsHelp-BRB8beRh.js → KeyboardShortcutsHelp-BTjiQe_Y.js} +1 -1
- package/app/dist/assets/OnboardingWizard-BALlquG0.js +1 -0
- package/app/dist/assets/{analytics.lazy-D9Mi0KEH.js → analytics.lazy-DjSzXIey.js} +1 -1
- package/app/dist/assets/{index-BK46risn.js → index-BV11ScVl.js} +3 -3
- package/app/dist/index.html +3 -3
- package/app/dist/manifest.webmanifest +3 -3
- package/app/dist/offline.html +2 -2
- package/app/dist/service-worker.js +1 -1
- package/app/public/manifest.webmanifest +3 -3
- package/app/public/offline.html +2 -2
- package/dist/agent/run-local.js +52 -12
- package/dist/agent/run-local.js.map +1 -1
- package/dist/{chunk-JUSVR3DW.js → chunk-SMGXYOWU.js} +6 -6
- package/dist/{chunk-JUSVR3DW.js.map → chunk-SMGXYOWU.js.map} +1 -1
- package/dist/mcp/server.js +1 -1
- package/package.json +2 -2
- package/app/dist/assets/OnboardingWizard-bjnhdgsN.js +0 -1
package/app/dist/index.html
CHANGED
|
@@ -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="
|
|
12
|
-
<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-
|
|
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": "
|
|
4
|
-
"short_name": "
|
|
5
|
-
"description": "
|
|
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": "/",
|
package/app/dist/offline.html
CHANGED
|
@@ -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 ·
|
|
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>
|
|
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 = "
|
|
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": "
|
|
4
|
-
"short_name": "
|
|
5
|
-
"description": "
|
|
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": "/",
|
package/app/public/offline.html
CHANGED
|
@@ -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 ·
|
|
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>
|
|
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>
|
package/dist/agent/run-local.js
CHANGED
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
renderPrompt,
|
|
7
7
|
renderPromptString,
|
|
8
8
|
resolveTaskCapabilities
|
|
9
|
-
} from "../chunk-
|
|
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
|
-
|
|
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.
|
|
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 || "
|
|
2537
|
-
const codexModel = discoveredModels?.codex?.[0]?.id || "
|
|
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:
|
|
2579
|
+
const codexDefault = { provider: "codex", model: codexModel, effort: codexEffort };
|
|
2540
2580
|
if (hasClaude && hasCodex) {
|
|
2541
2581
|
return {
|
|
2542
2582
|
plan: { ...claudeDefault, effort: "high" },
|