fifony 0.1.31 → 0.1.33

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.
Files changed (51) hide show
  1. package/README.md +36 -3
  2. package/app/dist/apple-touch-icon.png +0 -0
  3. package/app/dist/assets/CommandPalette-Du7aS97R.js +1 -0
  4. package/app/dist/assets/KeyboardShortcutsHelp-mguoBIXk.js +1 -0
  5. package/app/dist/assets/OnboardingWizard-dOrVz-hX.js +1 -0
  6. package/app/dist/assets/analytics.lazy-CKd9S45z.js +1 -0
  7. package/app/dist/assets/api-ChEctgc5.js +1 -0
  8. package/app/dist/assets/{createLucideIcon-DgMTp0yx.js → createLucideIcon-CBw-4t9s.js} +1 -1
  9. package/app/dist/assets/index-nWJMQsCn.js +49 -0
  10. package/app/dist/assets/{index-lf3jEP_3.css → index-rLcPCr9E.css} +1 -1
  11. package/app/dist/assets/rolldown-runtime-Dw2cE7zH.js +1 -0
  12. package/app/dist/assets/vendor-DkWeBvNl.js +9 -0
  13. package/app/dist/favicon.png +0 -0
  14. package/app/dist/icon-128.png +0 -0
  15. package/app/dist/icon-144.png +0 -0
  16. package/app/dist/icon-152.png +0 -0
  17. package/app/dist/icon-16.png +0 -0
  18. package/app/dist/icon-192.png +0 -0
  19. package/app/dist/icon-32.png +0 -0
  20. package/app/dist/icon-384.png +0 -0
  21. package/app/dist/icon-48.png +0 -0
  22. package/app/dist/icon-512.png +0 -0
  23. package/app/dist/icon-72.png +0 -0
  24. package/app/dist/icon-96.png +0 -0
  25. package/app/dist/icon-maskable-192.png +0 -0
  26. package/app/dist/icon-maskable-512.png +0 -0
  27. package/app/dist/index.html +16 -8
  28. package/app/dist/manifest.webmanifest +19 -19
  29. package/app/dist/og-image.png +0 -0
  30. package/app/dist/service-worker.js +2 -2
  31. package/dist/agent/run-local.js +22 -15
  32. package/dist/{agent-OBLUHG2W.js → agent-7BMCWKOD.js} +5 -5
  33. package/dist/{chunk-CXFEPU5Q.js → chunk-DAXG76WD.js} +8 -17
  34. package/dist/{chunk-7AMUAUY5.js → chunk-GAYQ2TXV.js} +628 -81
  35. package/dist/{chunk-VUNMXX7N.js → chunk-LX666HVP.js} +11 -11
  36. package/dist/{chunk-IYAF3SY6.js → chunk-NNPKCBAB.js} +556 -17
  37. package/dist/cli.js +4 -4
  38. package/dist/{issue-runner-CI7IUBBD.js → issue-runner-BNAW3M6E.js} +5 -5
  39. package/dist/{issue-state-machine-ETAJLBS6.js → issue-state-machine-24GKGB3W.js} +3 -3
  40. package/dist/{issues-6VCD27PA.js → issues-C4WJIF7S.js} +5 -5
  41. package/dist/{queue-workers-IEI23UUO.js → queue-workers-HF7RBVV7.js} +2 -2
  42. package/dist/{scheduler-JSH55NAQ.js → scheduler-JZCJB2IN.js} +5 -5
  43. package/dist/{store-MTE6H7WQ.js → store-MHU3G2W4.js} +5 -5
  44. package/dist/{workspace-3PV5PTR5.js → workspace-IKR6X6OE.js} +2 -2
  45. package/package.json +9 -6
  46. package/app/dist/assets/KeyboardShortcutsHelp-3vwtTKsQ.js +0 -1
  47. package/app/dist/assets/OnboardingWizard-urUin_Ob.js +0 -1
  48. package/app/dist/assets/analytics.lazy-CbuW3ebu.js +0 -1
  49. package/app/dist/assets/index-ywtlX6S8.js +0 -45
  50. package/app/dist/assets/rolldown-runtime-DF2fYuay.js +0 -1
  51. package/app/dist/assets/vendor-D-IqxHHu.js +0 -9
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -7,17 +7,25 @@
7
7
  <meta name="mobile-web-app-capable" content="yes" />
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
+ <meta name="apple-mobile-web-app-title" content="fifony" />
10
11
  <meta name="format-detection" content="telephone=no" />
11
- <meta name="description" content="fifony orchestrator dashboard" />
12
+ <meta name="description" content="Local AI orchestrator — plan, execute, review code with Claude, Codex & Gemini" />
13
+ <meta property="og:title" content="fifony" />
14
+ <meta property="og:description" content="Local AI orchestrator — plan, execute, review code with Claude, Codex & Gemini" />
15
+ <meta property="og:image" content="/assets/og-image.png" />
16
+ <meta property="og:type" content="website" />
12
17
  <title>fifony</title>
13
18
  <link rel="manifest" href="/assets/manifest.webmanifest" />
14
- <link rel="icon" href="/assets/icon.svg" type="image/svg+xml" />
15
- <link rel="apple-touch-icon" href="/assets/icon.svg" />
16
- <script type="module" crossorigin src="/assets/assets/index-ywtlX6S8.js"></script>
17
- <link rel="modulepreload" crossorigin href="/assets/assets/rolldown-runtime-DF2fYuay.js">
18
- <link rel="modulepreload" crossorigin href="/assets/assets/vendor-D-IqxHHu.js">
19
- <link rel="modulepreload" crossorigin href="/assets/assets/createLucideIcon-DgMTp0yx.js">
20
- <link rel="stylesheet" crossorigin href="/assets/assets/index-lf3jEP_3.css">
19
+ <link rel="icon" href="/assets/favicon.png" type="image/png" />
20
+ <link rel="icon" href="/assets/icon-32.png" sizes="32x32" type="image/png" />
21
+ <link rel="icon" href="/assets/icon-16.png" sizes="16x16" type="image/png" />
22
+ <link rel="apple-touch-icon" href="/assets/apple-touch-icon.png" />
23
+ <script type="module" crossorigin src="/assets/assets/index-nWJMQsCn.js"></script>
24
+ <link rel="modulepreload" crossorigin href="/assets/assets/rolldown-runtime-Dw2cE7zH.js">
25
+ <link rel="modulepreload" crossorigin href="/assets/assets/api-ChEctgc5.js">
26
+ <link rel="modulepreload" crossorigin href="/assets/assets/vendor-DkWeBvNl.js">
27
+ <link rel="modulepreload" crossorigin href="/assets/assets/createLucideIcon-CBw-4t9s.js">
28
+ <link rel="stylesheet" crossorigin href="/assets/assets/index-rLcPCr9E.css">
21
29
  </head>
22
30
  <body>
23
31
  <div id="root"></div>
@@ -1,16 +1,16 @@
1
1
  {
2
2
  "id": "/",
3
- "name": "fifony Dashboard",
3
+ "name": "fifony",
4
4
  "short_name": "fifony",
5
- "description": "fifony local orchestrator dashboard (React + PWA)",
5
+ "description": "Local AI orchestrator plan, execute, review code with Claude, Codex & Gemini",
6
6
  "lang": "en-US",
7
7
  "start_url": "/kanban",
8
8
  "scope": "/",
9
- "display": "standalone",
10
- "display_override": ["window-controls-overlay", "standalone", "browser"],
9
+ "display": "fullscreen",
10
+ "display_override": ["fullscreen", "window-controls-overlay", "standalone"],
11
11
  "background_color": "#020617",
12
12
  "theme_color": "#0f172a",
13
- "orientation": "portrait-primary",
13
+ "orientation": "any",
14
14
  "prefer_related_applications": false,
15
15
  "categories": ["productivity", "developer", "business"],
16
16
  "shortcuts": [
@@ -18,32 +18,32 @@
18
18
  "name": "Kanban",
19
19
  "short_name": "Kanban",
20
20
  "url": "/kanban",
21
- "icons": [{ "src": "/icon.svg", "sizes": "any", "type": "image/svg+xml" }]
21
+ "icons": [{ "src": "/icon-96.png", "sizes": "96x96", "type": "image/png" }]
22
22
  },
23
23
  {
24
24
  "name": "Issues",
25
25
  "short_name": "Issues",
26
26
  "url": "/issues",
27
- "icons": [{ "src": "/icon.svg", "sizes": "any", "type": "image/svg+xml" }]
27
+ "icons": [{ "src": "/icon-96.png", "sizes": "96x96", "type": "image/png" }]
28
28
  },
29
29
  {
30
30
  "name": "Agents",
31
31
  "short_name": "Agents",
32
32
  "url": "/agents",
33
- "icons": [{ "src": "/icon.svg", "sizes": "any", "type": "image/svg+xml" }]
33
+ "icons": [{ "src": "/icon-96.png", "sizes": "96x96", "type": "image/png" }]
34
34
  }
35
35
  ],
36
36
  "icons": [
37
- {
38
- "src": "/icon.svg",
39
- "type": "image/svg+xml",
40
- "sizes": "any"
41
- },
42
- {
43
- "src": "/icon-maskable.svg",
44
- "type": "image/svg+xml",
45
- "sizes": "any",
46
- "purpose": "any maskable"
47
- }
37
+ { "src": "/icon-48.png", "sizes": "48x48", "type": "image/png" },
38
+ { "src": "/icon-72.png", "sizes": "72x72", "type": "image/png" },
39
+ { "src": "/icon-96.png", "sizes": "96x96", "type": "image/png" },
40
+ { "src": "/icon-128.png", "sizes": "128x128", "type": "image/png" },
41
+ { "src": "/icon-144.png", "sizes": "144x144", "type": "image/png" },
42
+ { "src": "/icon-152.png", "sizes": "152x152", "type": "image/png" },
43
+ { "src": "/icon-192.png", "sizes": "192x192", "type": "image/png" },
44
+ { "src": "/icon-384.png", "sizes": "384x384", "type": "image/png" },
45
+ { "src": "/icon-512.png", "sizes": "512x512", "type": "image/png" },
46
+ { "src": "/icon-maskable-192.png", "sizes": "192x192", "type": "image/png", "purpose": "maskable" },
47
+ { "src": "/icon-maskable-512.png", "sizes": "512x512", "type": "image/png", "purpose": "maskable" }
48
48
  ]
49
49
  }
Binary file
@@ -1,8 +1,8 @@
1
- const CACHE_VERSION = "1774160943990";
1
+ const CACHE_VERSION = "1774232641793";
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"];
5
- const APP_SHELL_FILES = ["/offline.html", "/manifest.webmanifest", "/icon.svg", "/icon-maskable.svg"];
5
+ const APP_SHELL_FILES = ["/offline.html", "/manifest.webmanifest", "/favicon.png", "/icon-192.png", "/icon-512.png"];
6
6
  const API_PREFIXES = ["/api/", "/docs", "/ws"];
7
7
 
8
8
  self.addEventListener("install", (event) => {
@@ -23,10 +23,10 @@ import {
23
23
  startApiServer,
24
24
  syncRuntimeConfigSettings,
25
25
  validateConfig
26
- } from "../chunk-7AMUAUY5.js";
26
+ } from "../chunk-GAYQ2TXV.js";
27
27
  import {
28
28
  computeMetrics
29
- } from "../chunk-CXFEPU5Q.js";
29
+ } from "../chunk-DAXG76WD.js";
30
30
  import {
31
31
  detectAvailableProviders,
32
32
  detectDefaultBranch,
@@ -34,7 +34,7 @@ import {
34
34
  getProviderDefaultCommand,
35
35
  resolveDefaultProvider,
36
36
  setSkipSource
37
- } from "../chunk-IYAF3SY6.js";
37
+ } from "../chunk-NNPKCBAB.js";
38
38
  import {
39
39
  debugBoot,
40
40
  fail,
@@ -47,7 +47,7 @@ import {
47
47
  recoverOrphans,
48
48
  recoverState,
49
49
  stopQueueWorkers
50
- } from "../chunk-VUNMXX7N.js";
50
+ } from "../chunk-LX666HVP.js";
51
51
  import {
52
52
  initLogger,
53
53
  logger
@@ -65,7 +65,7 @@ import { env, exit, argv } from "process";
65
65
 
66
66
  // src/persistence/plugins/dev-server.ts
67
67
  import { resolve } from "path";
68
- async function startDevFrontend(apiPort, devPort) {
68
+ async function startDevFrontend(apiPort, devPort, options) {
69
69
  const VITE_CONFIG_PATH = resolve(PACKAGE_ROOT, "app/vite.config.js");
70
70
  let createViteServer;
71
71
  try {
@@ -75,9 +75,14 @@ async function startDevFrontend(apiPort, devPort) {
75
75
  logger.warn("Vite not installed (devDependency). Run 'pnpm install' in the project to enable --dev mode.");
76
76
  return;
77
77
  }
78
+ const tls = options?.tls ?? false;
79
+ const scheme = tls ? "https" : "http";
80
+ const wsScheme = tls ? "wss" : "ws";
78
81
  for (let attempt = 0; attempt < 20; attempt++) {
79
82
  try {
80
- const res = await fetch(`http://localhost:${apiPort}/api/health`);
83
+ const res = await fetch(`${scheme}://localhost:${apiPort}/api/health`, {
84
+ ...tls ? { dispatcher: void 0 } : {}
85
+ });
81
86
  if (res.ok) break;
82
87
  } catch {
83
88
  await new Promise((r) => setTimeout(r, 250));
@@ -106,10 +111,11 @@ async function startDevFrontend(apiPort, devPort) {
106
111
  port: devPort,
107
112
  host: true,
108
113
  proxy: {
109
- "/api": `http://localhost:${apiPort}`,
114
+ "/api": { target: `${scheme}://localhost:${apiPort}`, secure: false },
110
115
  "/ws": {
111
- target: `ws://localhost:${apiPort}`,
116
+ target: `${wsScheme}://localhost:${apiPort}`,
112
117
  ws: true,
118
+ secure: false,
113
119
  configure: (proxy) => {
114
120
  const silence = (err) => {
115
121
  logger.debug(`[Vite] WS proxy transient: ${err.code || err.message}`);
@@ -120,13 +126,13 @@ async function startDevFrontend(apiPort, devPort) {
120
126
  });
121
127
  }
122
128
  },
123
- "/docs": `http://localhost:${apiPort}`,
124
- "/health": `http://localhost:${apiPort}`,
125
- "/manifest.webmanifest": `http://localhost:${apiPort}`,
126
- "/service-worker.js": `http://localhost:${apiPort}`,
127
- "/icon.svg": `http://localhost:${apiPort}`,
128
- "/icon-maskable.svg": `http://localhost:${apiPort}`,
129
- "/offline.html": `http://localhost:${apiPort}`
129
+ "/docs": { target: `${scheme}://localhost:${apiPort}`, secure: false },
130
+ "/health": { target: `${scheme}://localhost:${apiPort}`, secure: false },
131
+ "/manifest.webmanifest": { target: `${scheme}://localhost:${apiPort}`, secure: false },
132
+ "/service-worker.js": { target: `${scheme}://localhost:${apiPort}`, secure: false },
133
+ "/icon.svg": { target: `${scheme}://localhost:${apiPort}`, secure: false },
134
+ "/icon-maskable.svg": { target: `${scheme}://localhost:${apiPort}`, secure: false },
135
+ "/offline.html": { target: `${scheme}://localhost:${apiPort}`, secure: false }
130
136
  }
131
137
  }
132
138
  });
@@ -164,6 +170,7 @@ Options:
164
170
  --poll <ms> Scheduler interval in ms
165
171
  --timeout <ms> Agent command timeout in ms (default: 1800000)
166
172
  --dev Start Vite dev server alongside API (HMR on port+1)
173
+ --no-tls Disable HTTPS (use plain HTTP)
167
174
  --once Process once and exit
168
175
  --skip-source Skip source snapshot copy
169
176
  --skip-scan Skip project analysis
@@ -15,8 +15,8 @@ import {
15
15
  runIssueOnce,
16
16
  runPlanningJob,
17
17
  tryParseJsonOutput
18
- } from "./chunk-7AMUAUY5.js";
19
- import "./chunk-CXFEPU5Q.js";
18
+ } from "./chunk-GAYQ2TXV.js";
19
+ import "./chunk-DAXG76WD.js";
20
20
  import {
21
21
  buildPrompt,
22
22
  buildProviderBasePrompt,
@@ -33,9 +33,9 @@ import {
33
33
  runCommandWithTimeout,
34
34
  runHook,
35
35
  shouldSkipMergePath
36
- } from "./chunk-IYAF3SY6.js";
36
+ } from "./chunk-NNPKCBAB.js";
37
37
  import "./chunk-O5AEQXUV.js";
38
- import "./chunk-VUNMXX7N.js";
38
+ import "./chunk-LX666HVP.js";
39
39
  import "./chunk-DVU3CXWA.js";
40
40
  import "./chunk-OONOOWNC.js";
41
41
  export {
@@ -71,4 +71,4 @@ export {
71
71
  shouldSkipMergePath,
72
72
  tryParseJsonOutput
73
73
  };
74
- //# sourceMappingURL=agent-OBLUHG2W.js.map
74
+ //# sourceMappingURL=agent-7BMCWKOD.js.map
@@ -1,6 +1,7 @@
1
1
  import {
2
- computeDiffStats
3
- } from "./chunk-IYAF3SY6.js";
2
+ computeDiffStats,
3
+ syncIssueDiffStatsToStore
4
+ } from "./chunk-NNPKCBAB.js";
4
5
  import {
5
6
  isoWeek,
6
7
  now
@@ -323,7 +324,7 @@ function emitFsmEvent(issueId, kind, message) {
323
324
  }
324
325
  }
325
326
  async function lazyEnqueue(issue, job) {
326
- const { enqueue } = await import("./queue-workers-IEI23UUO.js");
327
+ const { enqueue } = await import("./queue-workers-HF7RBVV7.js");
327
328
  return enqueue(issue, job);
328
329
  }
329
330
  var ISSUE_STATE_MACHINE_ID = "issue-lifecycle";
@@ -536,6 +537,9 @@ var issueStateMachineConfig = {
536
537
  if (!issue.linesAdded && !issue.linesRemoved && issue.baseBranch && issue.branchName) {
537
538
  computeDiffStats(issue);
538
539
  }
540
+ await syncIssueDiffStatsToStore(issue).catch((err) => {
541
+ logger.warn({ err, issueId: issue.id }, "[FSM] Failed to sync diff stats to EC on approval");
542
+ });
539
543
  emitFsmEvent(issue.id, "state", `${issue.identifier} approved \u2014 waiting for merge.`);
540
544
  }
541
545
  },
@@ -556,31 +560,18 @@ var issueStateMachineConfig = {
556
560
  }
557
561
  const res = issueResource(machine);
558
562
  if (res) {
559
- const churnAdded = issue?.linesAdded ?? 0;
560
- const churnRemoved = issue?.linesRemoved ?? 0;
561
- const churnFiles = issue?.filesChanged ?? 0;
562
- if (churnAdded || churnRemoved || churnFiles) {
563
- await res.patch(machine.entityId, { linesAdded: 0, linesRemoved: 0, filesChanged: 0 }).catch(() => {
564
- });
565
- }
566
563
  await res.patch(machine.entityId, {
567
564
  completedAt: ts,
568
565
  terminalWeek: week,
569
566
  mergedAt: issue?.mergedAt ?? ts,
570
567
  nextRetryAt: void 0,
571
568
  lastError: void 0,
572
- linesAdded: churnAdded,
573
- linesRemoved: churnRemoved,
574
- filesChanged: churnFiles,
575
569
  branchName: issue?.branchName,
576
570
  workspacePath: issue?.workspacePath,
577
571
  worktreePath: issue?.worktreePath,
578
572
  mergedReason: issue?.mergedReason
579
573
  }).catch(() => {
580
574
  });
581
- if (churnAdded || churnRemoved || churnFiles) {
582
- logger.info({ issueId: issue?.id, linesAdded: churnAdded, linesRemoved: churnRemoved, filesChanged: churnFiles }, "[FSM] EC diff stats patched on merge (reset\u2192set for delta tracking)");
583
- }
584
575
  }
585
576
  },
586
577
  onEnterCancelled: async (context, _event, machine) => {
@@ -844,4 +835,4 @@ export {
844
835
  canTransitionIssue,
845
836
  visualizeStateMachine
846
837
  };
847
- //# sourceMappingURL=chunk-CXFEPU5Q.js.map
838
+ //# sourceMappingURL=chunk-DAXG76WD.js.map