fifony 0.1.43 → 0.1.47

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 (65) hide show
  1. package/app/dist/assets/{CommandPalette-M4VAMxCU.js → CommandPalette-CL8p78lG.js} +1 -1
  2. package/app/dist/assets/{KeyboardShortcutsHelp-DkvPUXQq.js → KeyboardShortcutsHelp-CqEFfGcE.js} +1 -1
  3. package/app/dist/assets/OnboardingWizard-BmI50ZUv.js +1 -0
  4. package/app/dist/assets/analytics.lazy-CXGjZabc.js +1 -0
  5. package/app/dist/assets/{api-CkVfYg_m.js → api-CEr_D4e5.js} +1 -1
  6. package/app/dist/assets/{createLucideIcon-Dfk_Hxud.js → createLucideIcon-luywpIq4.js} +1 -1
  7. package/app/dist/assets/index-CEaccpYh.js +96 -0
  8. package/app/dist/assets/index-CzzWGzux.css +1 -0
  9. package/app/dist/assets/vendor-uqBx3VSC.js +9 -0
  10. package/app/dist/index.html +12 -12
  11. package/app/dist/service-worker.js +15 -5
  12. package/dist/agent/pty-daemon.js +3 -2
  13. package/dist/agent/run-local.js +71 -52
  14. package/dist/{agent-RMQTTUEC.js → agent-DFSFG6DG.js} +18 -12
  15. package/dist/{analytics-broadcaster-O6YBP66L.js → analytics-broadcaster-O4AE3RUK.js} +21 -14
  16. package/dist/approve-plan.command-QGQZZXTQ.js +17 -0
  17. package/dist/{chunk-E2EWEYA4.js → chunk-2PRRKBG6.js} +20 -10
  18. package/dist/chunk-5AMWD66T.js +38 -0
  19. package/dist/{chunk-QQQLP3PL.js → chunk-7TXZYZR5.js} +9 -37
  20. package/dist/chunk-AAVROEQC.js +859 -0
  21. package/dist/{chunk-ESWHDHH6.js → chunk-AAZKYWOY.js} +4 -4
  22. package/dist/chunk-EBCSQFPR.js +682 -0
  23. package/dist/{chunk-BRSR26VK.js → chunk-FH7HUPZX.js} +2 -2
  24. package/dist/chunk-HOIOVUHI.js +35 -0
  25. package/dist/{chunk-AILXZ2TD.js → chunk-JRLWLZOD.js} +20 -13
  26. package/dist/{chunk-YRSH2CLW.js → chunk-K36BWMUV.js} +1741 -1216
  27. package/dist/chunk-N4KFNX2G.js +370 -0
  28. package/dist/chunk-PACI3T4I.js +125 -0
  29. package/dist/{chunk-FJNH3G2Z.js → chunk-PI7Y77R3.js} +38 -663
  30. package/dist/{chunk-DVU3CXWA.js → chunk-PXTIWKLQ.js} +2 -1
  31. package/dist/{chunk-SOBLO4YZ.js → chunk-QH6VCTET.js} +316 -127
  32. package/dist/{chunk-MVTGAKQK.js → chunk-QHISYRXJ.js} +2 -2
  33. package/dist/{chunk-42AMQAJG.js → chunk-VM5QAYP5.js} +2 -2
  34. package/dist/cli.js +17 -11
  35. package/dist/create-issue.command-VAKYRECC.js +24 -0
  36. package/dist/{fsm-issue-YGGF7SIL.js → fsm-issue-EHTSKMFN.js} +9 -8
  37. package/dist/fsm-service-7O4AJG2R.js +32 -0
  38. package/dist/{helpers-L7NYO5XS.js → helpers-ON2S7UEF.js} +2 -2
  39. package/dist/{issue-log-broadcaster-WZAHISYB.js → issue-log-broadcaster-FZGVEEIX.js} +20 -13
  40. package/dist/{issues-3QRR7KM6.js → issues-3YNNTB4U.js} +10 -7
  41. package/dist/{log-analyzer-K7MXQB4T.js → log-analyzer-EIX6R6PP.js} +82 -18
  42. package/dist/logger-IFLXTQPS.js +11 -0
  43. package/dist/mcp/server.js +2 -2
  44. package/dist/merge-workspace.command-T2NIGR4M.js +24 -0
  45. package/dist/{parallel-executor-6INE6NDO.js → parallel-executor-DWESCNX3.js} +20 -14
  46. package/dist/queue-workers-V57BYXAY.js +38 -0
  47. package/dist/replan-issue.command-2GQ3QXCR.js +17 -0
  48. package/dist/retry-issue.command-GJBUUYDJ.js +17 -0
  49. package/dist/scheduler-KYILMWLD.js +32 -0
  50. package/dist/{settings-ZAWDCFP2.js → settings-SOTIS6ZD.js} +32 -12
  51. package/dist/settings.resource-JMD3JQOS.js +30 -0
  52. package/dist/{store-M6NCKMZY.js → store-S3NAYZ3S.js} +18 -12
  53. package/dist/{web-push-AX5IIK3P.js → web-push-QCTLS7EJ.js} +3 -3
  54. package/dist/websocket-T2Y3BY4B.js +61 -0
  55. package/dist/{workspace-CJTWFWTJ.js → workspace-OS7GPMCN.js} +7 -6
  56. package/package.json +8 -5
  57. package/app/dist/assets/OnboardingWizard-B7V9hoCR.js +0 -1
  58. package/app/dist/assets/analytics.lazy-zVJdF880.js +0 -1
  59. package/app/dist/assets/index-BpiCi7Ew.css +0 -1
  60. package/app/dist/assets/index-D2INW0zc.js +0 -47
  61. package/app/dist/assets/vendor-BEoYbFV1.js +0 -9
  62. package/dist/queue-workers-XFZK3TT5.js +0 -32
  63. package/dist/replan-issue.command-4UCWYHGZ.js +0 -15
  64. package/dist/scheduler-ZP7GOZDW.js +0 -26
  65. package/dist/settings.resource-5CW456AZ.js +0 -24
@@ -12,20 +12,20 @@
12
12
  <meta name="description" content="Local AI orchestrator — plan, execute, review code with Claude, Codex & Gemini" />
13
13
  <meta property="og:title" content="fifony" />
14
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" />
15
+ <meta property="og:image" content="/og-image.png" />
16
16
  <meta property="og:type" content="website" />
17
17
  <title>fifony</title>
18
- <link rel="manifest" href="/assets/manifest.webmanifest" />
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-D2INW0zc.js"></script>
24
- <link rel="modulepreload" crossorigin href="/assets/assets/rolldown-runtime-Dw2cE7zH.js">
25
- <link rel="modulepreload" crossorigin href="/assets/assets/api-CkVfYg_m.js">
26
- <link rel="modulepreload" crossorigin href="/assets/assets/vendor-BEoYbFV1.js">
27
- <link rel="modulepreload" crossorigin href="/assets/assets/createLucideIcon-Dfk_Hxud.js">
28
- <link rel="stylesheet" crossorigin href="/assets/assets/index-BpiCi7Ew.css">
18
+ <link rel="manifest" href="/manifest.webmanifest" />
19
+ <link rel="icon" href="/favicon.png" type="image/png" />
20
+ <link rel="icon" href="/icon-32.png" sizes="32x32" type="image/png" />
21
+ <link rel="icon" href="/icon-16.png" sizes="16x16" type="image/png" />
22
+ <link rel="apple-touch-icon" href="/apple-touch-icon.png" />
23
+ <script type="module" crossorigin src="/assets/index-CEaccpYh.js"></script>
24
+ <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-Dw2cE7zH.js">
25
+ <link rel="modulepreload" crossorigin href="/assets/api-CEr_D4e5.js">
26
+ <link rel="modulepreload" crossorigin href="/assets/vendor-uqBx3VSC.js">
27
+ <link rel="modulepreload" crossorigin href="/assets/createLucideIcon-luywpIq4.js">
28
+ <link rel="stylesheet" crossorigin href="/assets/index-CzzWGzux.css">
29
29
  </head>
30
30
  <body>
31
31
  <div id="root"></div>
@@ -1,4 +1,4 @@
1
- const CACHE_VERSION = "1774647226934";
1
+ const CACHE_VERSION = "1774899686368";
2
2
  const CORE_CACHE = `fifony-core-${CACHE_VERSION}`;
3
3
  const ASSET_CACHE = `fifony-assets-${CACHE_VERSION}`;
4
4
  const APP_SHELL_ROUTES = [
@@ -16,10 +16,11 @@ const APP_SHELL_ROUTES = [
16
16
  "/settings/notifications",
17
17
  "/settings/execution",
18
18
  "/settings/quality",
19
- "/settings/pipeline",
19
+ "/settings/assets",
20
20
  "/settings/services",
21
21
  "/settings/appearance",
22
22
  "/settings/providers",
23
+ "/chat",
23
24
  ];
24
25
  const APP_SHELL_FILES = ["/offline.html", "/manifest.webmanifest", "/favicon.png", "/icon-192.png", "/icon-512.png"];
25
26
  const API_PREFIXES = ["/api/", "/docs", "/ws"];
@@ -91,16 +92,25 @@ self.addEventListener("fetch", (event) => {
91
92
 
92
93
  if (request.mode === "navigate") {
93
94
  event.respondWith((async () => {
95
+ const cache = await caches.open(CORE_CACHE);
96
+
94
97
  try {
95
98
  const response = await fetch(request);
96
- const cache = await caches.open(CORE_CACHE);
97
- await cache.put(request, response.clone());
99
+ if (response.ok) {
100
+ await cache.put(request, response.clone());
101
+ return response;
102
+ }
103
+
104
+ const cached =
105
+ await cache.match(request) ||
106
+ await cache.match("/kanban") ||
107
+ await cache.match("/offline.html");
108
+ if (cached) return cached;
98
109
  return response;
99
110
  } catch {
100
111
  // Offline: notify clients
101
112
  notifyClientsOffline();
102
113
 
103
- const cache = await caches.open(CORE_CACHE);
104
114
  return (
105
115
  await cache.match(request) ||
106
116
  await cache.match("/kanban") ||
@@ -21,7 +21,8 @@ async function main() {
21
21
  process.stderr.write("[pty-daemon] Failed to parse options JSON\n");
22
22
  process.exit(1);
23
23
  }
24
- const { command, workspacePath, issueId, startedAt, commandSlice } = opts;
24
+ const { command, workspacePath, codePath, issueId, startedAt, commandSlice } = opts;
25
+ const effectiveCwd = codePath ?? workspacePath;
25
26
  const liveLogFile = join(workspacePath, "live-output.log");
26
27
  const socketPath = join(workspacePath, "agent.sock");
27
28
  const agentPidFile = join(workspacePath, "agent.pid");
@@ -99,7 +100,7 @@ async function main() {
99
100
  name: "xterm-256color",
100
101
  cols: 220,
101
102
  rows: 50,
102
- cwd: workspacePath,
103
+ cwd: effectiveCwd,
103
104
  env: process.env
104
105
  });
105
106
  const agentPid = ptyProcess.pid;
@@ -1,12 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  applyPersistedSettings,
4
- broadcastToWebSocketClients,
5
4
  cleanTerminalWorkspaces,
6
5
  closeStateStore,
7
6
  createContainer,
8
7
  hasTerminalQueue,
9
- initManagedServiceWatcher,
10
8
  initQueueWorkers,
11
9
  initStateStore,
12
10
  installGracefulShutdown,
@@ -30,22 +28,35 @@ import {
30
28
  startApiServer,
31
29
  startAutoConfiguredServices,
32
30
  startManagedAgentWatcher,
33
- startServiceLogBroadcasting,
34
31
  stopQueueWorkers,
35
- stopServiceLogBroadcasting,
36
32
  syncRuntimeConfigSettings,
37
33
  upsertPersistedVariable
38
- } from "../chunk-YRSH2CLW.js";
34
+ } from "../chunk-K36BWMUV.js";
35
+ import "../chunk-PACI3T4I.js";
36
+ import "../chunk-HOIOVUHI.js";
39
37
  import {
40
38
  initWebPush
41
- } from "../chunk-BRSR26VK.js";
42
- import "../chunk-QQQLP3PL.js";
43
- import "../chunk-AILXZ2TD.js";
39
+ } from "../chunk-FH7HUPZX.js";
40
+ import {
41
+ broadcastToWebSocketClients,
42
+ sendToMeshRoom,
43
+ startServiceLogBroadcasting,
44
+ stopServiceLogBroadcasting
45
+ } from "../chunk-N4KFNX2G.js";
46
+ import {
47
+ setServiceRuntime,
48
+ setServicesAccessor,
49
+ startTrafficProxy,
50
+ stopTrafficProxy
51
+ } from "../chunk-AAVROEQC.js";
52
+ import "../chunk-5AMWD66T.js";
53
+ import "../chunk-7TXZYZR5.js";
54
+ import "../chunk-JRLWLZOD.js";
44
55
  import {
45
56
  detectDefaultBranch,
46
57
  getGitRepoStatus,
47
58
  setSkipSource
48
- } from "../chunk-SOBLO4YZ.js";
59
+ } from "../chunk-QH6VCTET.js";
49
60
  import {
50
61
  addEvent,
51
62
  applyWorkflowConfig,
@@ -56,20 +67,17 @@ import {
56
67
  hydrate,
57
68
  resolveProjectMetadata,
58
69
  validateConfig
59
- } from "../chunk-E2EWEYA4.js";
60
- import {
61
- computeMetrics
62
- } from "../chunk-MVTGAKQK.js";
70
+ } from "../chunk-2PRRKBG6.js";
63
71
  import {
64
72
  detectAvailableProviders,
65
73
  getProviderDefaultCommand,
66
74
  resolveDefaultProvider
67
- } from "../chunk-FJNH3G2Z.js";
75
+ } from "../chunk-PI7Y77R3.js";
68
76
  import {
69
- initLogger,
70
- logger
71
- } from "../chunk-DVU3CXWA.js";
72
- import "../chunk-ESWHDHH6.js";
77
+ computeMetrics
78
+ } from "../chunk-QHISYRXJ.js";
79
+ import "../chunk-EBCSQFPR.js";
80
+ import "../chunk-AAZKYWOY.js";
73
81
  import {
74
82
  CLI_ARGS,
75
83
  PACKAGE_ROOT,
@@ -79,7 +87,11 @@ import {
79
87
  fail,
80
88
  now,
81
89
  parseIntArg
82
- } from "../chunk-42AMQAJG.js";
90
+ } from "../chunk-VM5QAYP5.js";
91
+ import {
92
+ initLogger,
93
+ logger
94
+ } from "../chunk-PXTIWKLQ.js";
83
95
  import "../chunk-3NE23NYW.js";
84
96
 
85
97
  // src/boot.ts
@@ -203,7 +215,6 @@ Options:
203
215
  );
204
216
  }
205
217
  async function main() {
206
- let serviceWatcher = null;
207
218
  let agentWatcher = null;
208
219
  debugBoot("main:start");
209
220
  const args = CLI_ARGS;
@@ -347,7 +358,7 @@ async function main() {
347
358
  } else if (!gitStatus.hasCommits) {
348
359
  logger.warn({ workspace: TARGET_ROOT, branch: gitStatus.branch }, "[Boot] Target workspace has no commits. Create an initial commit before running issues because git worktree needs a base commit.");
349
360
  }
350
- if (!state.config.testCommand) {
361
+ if (state.config.testCommand == null) {
351
362
  try {
352
363
  const pkg = JSON.parse(readFileSync(join(TARGET_ROOT, "package.json"), "utf8"));
353
364
  if (pkg?.scripts?.test && !pkg.scripts.test.includes("no test specified")) {
@@ -379,15 +390,28 @@ async function main() {
379
390
  }
380
391
  try {
381
392
  const services = state.config.services ?? [];
393
+ setServiceRuntime({
394
+ fifonyDir: STATE_ROOT,
395
+ targetRoot: TARGET_ROOT,
396
+ getEntries: () => apiState.config.services ?? [],
397
+ getGlobalEnv: () => apiState.config.serviceEnv ?? {},
398
+ onTransition: (t) => {
399
+ logger.info({ id: t.id, from: t.from, to: t.to, reason: t.reason }, "[Service] FSM transition");
400
+ broadcastToWebSocketClients({
401
+ type: "service",
402
+ id: t.id,
403
+ state: t.to,
404
+ running: t.to === "starting" || t.to === "running",
405
+ pid: t.pid ?? null
406
+ });
407
+ if (t.to === "starting") startServiceLogBroadcasting(t.id, STATE_ROOT);
408
+ else if (t.to === "stopped" || t.to === "crashed") stopServiceLogBroadcasting(t.id);
409
+ }
410
+ });
382
411
  reconcileManagedServiceStates(services, STATE_ROOT);
383
- const autoStartTransitions = startAutoConfiguredServices(
384
- services,
385
- TARGET_ROOT,
386
- STATE_ROOT,
387
- state.config.serviceEnv
388
- );
389
- for (const t of autoStartTransitions) {
390
- logger.info({ id: t.id, command: t.to }, "[Boot] Service auto-started");
412
+ const autoStarted = await startAutoConfiguredServices(services);
413
+ for (const id of autoStarted) {
414
+ logger.info({ id }, "[Boot] Service auto-started");
391
415
  }
392
416
  for (const status of listServiceStatuses(services, STATE_ROOT)) {
393
417
  if (status.running) startServiceLogBroadcasting(status.id, STATE_ROOT);
@@ -408,27 +432,18 @@ async function main() {
408
432
  } catch (error) {
409
433
  logger.warn({ err: error }, "[Boot] Queue workers failed to initialize \u2014 continuing without queue-based dispatch");
410
434
  }
411
- serviceWatcher = initManagedServiceWatcher(
412
- () => apiState.config.services ?? [],
413
- () => apiState.config.serviceEnv ?? {},
414
- STATE_ROOT,
415
- TARGET_ROOT,
416
- (t) => {
417
- logger.info({ id: t.id, from: t.from, to: t.to, reason: t.reason }, "[Service] FSM transition");
418
- broadcastToWebSocketClients({
419
- type: "service",
420
- id: t.id,
421
- state: t.to,
422
- running: t.to === "starting" || t.to === "running",
423
- pid: t.pid ?? null
435
+ if (apiState.config.meshEnabled) {
436
+ try {
437
+ setServicesAccessor(() => listServiceStatuses(apiState.config.services ?? [], STATE_ROOT));
438
+ await startTrafficProxy({
439
+ port: apiState.config.meshProxyPort ?? 0,
440
+ bufferSize: apiState.config.meshBufferSize ?? 1e3,
441
+ onEntry: (entry) => sendToMeshRoom({ type: "mesh:entry", entry })
424
442
  });
425
- if (t.to === "starting") {
426
- startServiceLogBroadcasting(t.id, STATE_ROOT);
427
- } else if (t.to === "stopped" || t.to === "crashed") {
428
- stopServiceLogBroadcasting(t.id);
429
- }
443
+ } catch (err) {
444
+ logger.warn({ err }, "[Boot] Mesh traffic proxy failed to start \u2014 continuing without mesh");
430
445
  }
431
- );
446
+ }
432
447
  agentWatcher = startManagedAgentWatcher(
433
448
  () => apiState.issues,
434
449
  STATE_ROOT,
@@ -445,6 +460,14 @@ async function main() {
445
460
  });
446
461
  }
447
462
  );
463
+ process.once("SIGINT", () => {
464
+ stopTrafficProxy().catch(() => {
465
+ });
466
+ });
467
+ process.once("SIGTERM", () => {
468
+ stopTrafficProxy().catch(() => {
469
+ });
470
+ });
448
471
  installGracefulShutdown(state);
449
472
  try {
450
473
  const settings = await loadRuntimeSettings();
@@ -488,10 +511,6 @@ async function main() {
488
511
  state.updatedAt = now();
489
512
  state.metrics = computeMetrics(state.issues);
490
513
  await persistStateFull(state);
491
- try {
492
- serviceWatcher?.stop();
493
- } catch {
494
- }
495
514
  try {
496
515
  agentWatcher?.stop();
497
516
  } catch {
@@ -13,10 +13,15 @@ import {
13
13
  runManagedReviewJob,
14
14
  runPlanningJob,
15
15
  tryParseJsonOutput
16
- } from "./chunk-YRSH2CLW.js";
17
- import "./chunk-BRSR26VK.js";
18
- import "./chunk-QQQLP3PL.js";
19
- import "./chunk-AILXZ2TD.js";
16
+ } from "./chunk-K36BWMUV.js";
17
+ import "./chunk-PACI3T4I.js";
18
+ import "./chunk-HOIOVUHI.js";
19
+ import "./chunk-FH7HUPZX.js";
20
+ import "./chunk-N4KFNX2G.js";
21
+ import "./chunk-AAVROEQC.js";
22
+ import "./chunk-5AMWD66T.js";
23
+ import "./chunk-7TXZYZR5.js";
24
+ import "./chunk-JRLWLZOD.js";
20
25
  import {
21
26
  attachToDaemon,
22
27
  buildPrompt,
@@ -35,13 +40,14 @@ import {
35
40
  runHook,
36
41
  shouldSkipMergePath,
37
42
  writeToDaemon
38
- } from "./chunk-SOBLO4YZ.js";
39
- import "./chunk-E2EWEYA4.js";
40
- import "./chunk-MVTGAKQK.js";
41
- import "./chunk-FJNH3G2Z.js";
42
- import "./chunk-DVU3CXWA.js";
43
- import "./chunk-ESWHDHH6.js";
44
- import "./chunk-42AMQAJG.js";
43
+ } from "./chunk-QH6VCTET.js";
44
+ import "./chunk-2PRRKBG6.js";
45
+ import "./chunk-PI7Y77R3.js";
46
+ import "./chunk-QHISYRXJ.js";
47
+ import "./chunk-EBCSQFPR.js";
48
+ import "./chunk-AAZKYWOY.js";
49
+ import "./chunk-VM5QAYP5.js";
50
+ import "./chunk-PXTIWKLQ.js";
45
51
  import {
46
52
  cleanStalePidFile,
47
53
  isAgentStillRunning,
@@ -93,4 +99,4 @@ export {
93
99
  tryParseJsonOutput,
94
100
  writeToDaemon
95
101
  };
96
- //# sourceMappingURL=agent-RMQTTUEC.js.map
102
+ //# sourceMappingURL=agent-DFSFG6DG.js.map
@@ -1,28 +1,35 @@
1
1
  import {
2
- analyticsRoomHasSubscribers,
3
2
  getEcDailyEvents,
4
- getEcDailyLines,
3
+ getEcDailyLines
4
+ } from "./chunk-K36BWMUV.js";
5
+ import "./chunk-PACI3T4I.js";
6
+ import "./chunk-HOIOVUHI.js";
7
+ import "./chunk-FH7HUPZX.js";
8
+ import {
9
+ analyticsRoomHasSubscribers,
5
10
  sendToAnalyticsRoom,
6
11
  setAnalyticsOnSubscribeFn,
7
12
  wsClients
8
- } from "./chunk-YRSH2CLW.js";
9
- import "./chunk-BRSR26VK.js";
10
- import "./chunk-QQQLP3PL.js";
11
- import "./chunk-AILXZ2TD.js";
12
- import "./chunk-SOBLO4YZ.js";
13
+ } from "./chunk-N4KFNX2G.js";
14
+ import "./chunk-AAVROEQC.js";
15
+ import "./chunk-5AMWD66T.js";
16
+ import "./chunk-7TXZYZR5.js";
17
+ import "./chunk-JRLWLZOD.js";
18
+ import "./chunk-QH6VCTET.js";
13
19
  import {
14
20
  getAnalytics,
15
21
  getHourlySnapshot
16
- } from "./chunk-E2EWEYA4.js";
22
+ } from "./chunk-2PRRKBG6.js";
23
+ import "./chunk-PI7Y77R3.js";
17
24
  import {
18
25
  computeQualityGateMetrics
19
- } from "./chunk-MVTGAKQK.js";
20
- import "./chunk-FJNH3G2Z.js";
26
+ } from "./chunk-QHISYRXJ.js";
27
+ import "./chunk-EBCSQFPR.js";
28
+ import "./chunk-AAZKYWOY.js";
29
+ import "./chunk-VM5QAYP5.js";
21
30
  import {
22
31
  logger
23
- } from "./chunk-DVU3CXWA.js";
24
- import "./chunk-ESWHDHH6.js";
25
- import "./chunk-42AMQAJG.js";
32
+ } from "./chunk-PXTIWKLQ.js";
26
33
  import "./chunk-3NE23NYW.js";
27
34
 
28
35
  // src/persistence/plugins/analytics-broadcaster.ts
@@ -142,4 +149,4 @@ export {
142
149
  pushLinesAnalytics,
143
150
  pushTokenAnalytics
144
151
  };
145
- //# sourceMappingURL=analytics-broadcaster-O6YBP66L.js.map
152
+ //# sourceMappingURL=analytics-broadcaster-O4AE3RUK.js.map
@@ -0,0 +1,17 @@
1
+ import {
2
+ approvePlanCommand
3
+ } from "./chunk-HOIOVUHI.js";
4
+ import "./chunk-7TXZYZR5.js";
5
+ import "./chunk-JRLWLZOD.js";
6
+ import "./chunk-QH6VCTET.js";
7
+ import "./chunk-2PRRKBG6.js";
8
+ import "./chunk-PI7Y77R3.js";
9
+ import "./chunk-QHISYRXJ.js";
10
+ import "./chunk-EBCSQFPR.js";
11
+ import "./chunk-AAZKYWOY.js";
12
+ import "./chunk-VM5QAYP5.js";
13
+ import "./chunk-PXTIWKLQ.js";
14
+ export {
15
+ approvePlanCommand
16
+ };
17
+ //# sourceMappingURL=approve-plan.command-QGQZZXTQ.js.map
@@ -1,14 +1,11 @@
1
- import {
2
- computeMetrics
3
- } from "./chunk-MVTGAKQK.js";
4
1
  import {
5
2
  markEventDirty,
6
3
  markIssueDirty,
7
4
  normalizeAgentProvider
8
- } from "./chunk-FJNH3G2Z.js";
5
+ } from "./chunk-PI7Y77R3.js";
9
6
  import {
10
- logger
11
- } from "./chunk-DVU3CXWA.js";
7
+ computeMetrics
8
+ } from "./chunk-QHISYRXJ.js";
12
9
  import {
13
10
  COMPLETED_STATES,
14
11
  PERSIST_EVENTS_MAX,
@@ -28,7 +25,10 @@ import {
28
25
  toStringArray,
29
26
  toStringValue,
30
27
  withRetryBackoff
31
- } from "./chunk-42AMQAJG.js";
28
+ } from "./chunk-VM5QAYP5.js";
29
+ import {
30
+ logger
31
+ } from "./chunk-PXTIWKLQ.js";
32
32
 
33
33
  // src/domains/tokens.ts
34
34
  var EMPTY = { inputTokens: 0, outputTokens: 0, totalTokens: 0 };
@@ -918,6 +918,8 @@ function deriveConfig(args) {
918
918
  beforeRunHook: env.FIFONY_BEFORE_RUN_HOOK ?? "",
919
919
  afterRunHook: env.FIFONY_AFTER_RUN_HOOK ?? "",
920
920
  beforeRemoveHook: env.FIFONY_BEFORE_REMOVE_HOOK ?? "",
921
+ autoApproveTrivialPlans: true,
922
+ sandboxExecution: false,
921
923
  serviceEnv: {}
922
924
  };
923
925
  }
@@ -1244,7 +1246,7 @@ function addEvent(state, issueId, kind, message) {
1244
1246
  async function transitionIssue(issue, event, context = {}) {
1245
1247
  logger.debug({ issueId: issue.id, identifier: issue.identifier, from: issue.state, event, context }, "[State] Issue transition");
1246
1248
  if (!issueTransitionExecutor) {
1247
- const { executeTransition } = await import("./fsm-issue-YGGF7SIL.js");
1249
+ const { executeTransition } = await import("./fsm-issue-EHTSKMFN.js");
1248
1250
  await executeTransition(issue, event, { ...context, issue });
1249
1251
  return;
1250
1252
  }
@@ -1263,6 +1265,13 @@ function getNextRetryAt(issue, baseMs) {
1263
1265
  const nextDelay = withRetryBackoff(nextAttempt, baseMs);
1264
1266
  return new Date(Date.now() + nextDelay).toISOString();
1265
1267
  }
1268
+ var FAST_MODE_ISSUE_TYPES = /* @__PURE__ */ new Set(["bug", "chore", "docs"]);
1269
+ var FAST_MODE_DESCRIPTION_MAX_LENGTH = 150;
1270
+ function shouldUseFastMode(issue) {
1271
+ if (issue.issueType && FAST_MODE_ISSUE_TYPES.has(issue.issueType)) return true;
1272
+ if ((issue.description ?? "").length < FAST_MODE_DESCRIPTION_MAX_LENGTH) return true;
1273
+ return false;
1274
+ }
1266
1275
 
1267
1276
  export {
1268
1277
  buildQueueTitle,
@@ -1297,6 +1306,7 @@ export {
1297
1306
  addEvent,
1298
1307
  transitionIssue,
1299
1308
  issueDependenciesResolved,
1300
- getNextRetryAt
1309
+ getNextRetryAt,
1310
+ shouldUseFastMode
1301
1311
  };
1302
- //# sourceMappingURL=chunk-E2EWEYA4.js.map
1312
+ //# sourceMappingURL=chunk-2PRRKBG6.js.map
@@ -0,0 +1,38 @@
1
+ import {
2
+ transitionIssueCommand
3
+ } from "./chunk-7TXZYZR5.js";
4
+ import {
5
+ TERMINAL_STATES
6
+ } from "./chunk-VM5QAYP5.js";
7
+
8
+ // src/commands/replan-issue.command.ts
9
+ async function replanIssueCommand(input, deps) {
10
+ const { issue } = input;
11
+ if (issue.planningStatus === "planning") {
12
+ throw new Error("Cannot replan while planning is in progress.");
13
+ }
14
+ if (TERMINAL_STATES.has(issue.state)) {
15
+ throw new Error(`Cannot replan issue in terminal state ${issue.state}.`);
16
+ }
17
+ if (issue.state === "Queued") {
18
+ throw new Error(`Cannot replan issue in ${issue.state} state \u2014 move it out of the execution queue first.`);
19
+ }
20
+ issue.plan = void 0;
21
+ issue.planVersion = (issue.planVersion ?? 0) + 1;
22
+ issue.executeAttempt = 0;
23
+ issue.reviewAttempt = 0;
24
+ issue.attempts = 0;
25
+ await transitionIssueCommand(
26
+ { issue, target: "Planning", note: "Replan requested." },
27
+ deps
28
+ );
29
+ issue.planningStatus = "idle";
30
+ issue.planningError = void 0;
31
+ issue.planningStartedAt = void 0;
32
+ deps.eventStore.addEvent(issue.id, "manual", `Replan requested for ${issue.identifier} \u2014 now at plan v${issue.planVersion}.`);
33
+ }
34
+
35
+ export {
36
+ replanIssueCommand
37
+ };
38
+ //# sourceMappingURL=chunk-5AMWD66T.js.map
@@ -6,20 +6,19 @@ import {
6
6
  getIssueTransitionHistory,
7
7
  getStateMachineTransitions,
8
8
  visualizeStateMachine
9
- } from "./chunk-AILXZ2TD.js";
9
+ } from "./chunk-JRLWLZOD.js";
10
10
  import {
11
11
  transitionIssue
12
- } from "./chunk-E2EWEYA4.js";
12
+ } from "./chunk-2PRRKBG6.js";
13
13
  import {
14
14
  markIssueDirty
15
- } from "./chunk-FJNH3G2Z.js";
15
+ } from "./chunk-PI7Y77R3.js";
16
16
  import {
17
- logger
18
- } from "./chunk-DVU3CXWA.js";
19
- import {
20
- TERMINAL_STATES,
21
17
  now
22
- } from "./chunk-42AMQAJG.js";
18
+ } from "./chunk-VM5QAYP5.js";
19
+ import {
20
+ logger
21
+ } from "./chunk-PXTIWKLQ.js";
23
22
 
24
23
  // src/domains/issue-state.ts
25
24
  function syncIssueStateInMemory(issue, targetState, options = {}) {
@@ -116,32 +115,6 @@ async function transitionIssueCommand(input, _deps) {
116
115
  }
117
116
  }
118
117
 
119
- // src/commands/replan-issue.command.ts
120
- async function replanIssueCommand(input, deps) {
121
- const { issue } = input;
122
- if (issue.planningStatus === "planning") {
123
- throw new Error("Cannot replan while planning is in progress.");
124
- }
125
- if (TERMINAL_STATES.has(issue.state)) {
126
- throw new Error(`Cannot replan issue in terminal state ${issue.state}.`);
127
- }
128
- if (issue.state === "Queued") {
129
- throw new Error(`Cannot replan issue in ${issue.state} state \u2014 move it out of the execution queue first.`);
130
- }
131
- issue.plan = void 0;
132
- issue.planVersion = (issue.planVersion ?? 0) + 1;
133
- issue.executeAttempt = 0;
134
- issue.reviewAttempt = 0;
135
- await transitionIssueCommand(
136
- { issue, target: "Planning", note: "Replan requested." },
137
- deps
138
- );
139
- issue.planningStatus = "idle";
140
- issue.planningError = void 0;
141
- issue.planningStartedAt = void 0;
142
- deps.eventStore.addEvent(issue.id, "manual", `Replan requested for ${issue.identifier} \u2014 now at plan v${issue.planVersion}.`);
143
- }
144
-
145
118
  export {
146
119
  syncIssueStateInMemory,
147
120
  syncIssueStateFromFsm,
@@ -149,7 +122,6 @@ export {
149
122
  getIssueStateMachineVisualization,
150
123
  getIssueTransitionHistoryForIssue,
151
124
  deleteIssueStateMachineResourceState,
152
- transitionIssueCommand,
153
- replanIssueCommand
125
+ transitionIssueCommand
154
126
  };
155
- //# sourceMappingURL=chunk-QQQLP3PL.js.map
127
+ //# sourceMappingURL=chunk-7TXZYZR5.js.map