fifony 0.1.42 → 0.1.43

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 (58) hide show
  1. package/app/dist/assets/{CommandPalette-DNR5umI1.js → CommandPalette-M4VAMxCU.js} +1 -1
  2. package/app/dist/assets/{KeyboardShortcutsHelp-Dpl19F20.js → KeyboardShortcutsHelp-DkvPUXQq.js} +1 -1
  3. package/app/dist/assets/OnboardingWizard-B7V9hoCR.js +1 -0
  4. package/app/dist/assets/analytics.lazy-zVJdF880.js +1 -0
  5. package/app/dist/assets/{api-ChEctgc5.js → api-CkVfYg_m.js} +1 -1
  6. package/app/dist/assets/{createLucideIcon-R47sXufx.js → createLucideIcon-Dfk_Hxud.js} +1 -1
  7. package/app/dist/assets/index-BpiCi7Ew.css +1 -0
  8. package/app/dist/assets/index-D2INW0zc.js +47 -0
  9. package/app/dist/assets/vendor-BEoYbFV1.js +9 -0
  10. package/app/dist/index.html +5 -5
  11. package/app/dist/service-worker.js +9 -4
  12. package/bin/fifony.js +3 -0
  13. package/dist/agent/pty-daemon.js +177 -0
  14. package/dist/agent/run-local.js +177 -43
  15. package/dist/{agent-NNGZEKZH.js → agent-RMQTTUEC.js} +37 -16
  16. package/dist/analytics-broadcaster-O6YBP66L.js +145 -0
  17. package/dist/chunk-3NE23NYW.js +82 -0
  18. package/dist/chunk-42AMQAJG.js +404 -0
  19. package/dist/{chunk-H5N7O5NP.js → chunk-AILXZ2TD.js} +79 -147
  20. package/dist/{chunk-I2UHVKHS.js → chunk-BRSR26VK.js} +2 -2
  21. package/dist/chunk-E2EWEYA4.js +1302 -0
  22. package/dist/chunk-ESWHDHH6.js +102 -0
  23. package/dist/{chunk-NB44PCD2.js → chunk-FJNH3G2Z.js} +1061 -1138
  24. package/dist/chunk-MVTGAKQK.js +493 -0
  25. package/dist/chunk-QQQLP3PL.js +155 -0
  26. package/dist/chunk-SOBLO4YZ.js +2016 -0
  27. package/dist/chunk-YRSH2CLW.js +13784 -0
  28. package/dist/cli.js +335 -44
  29. package/dist/{issue-state-machine-GPQNZYUZ.js → fsm-issue-YGGF7SIL.js} +9 -5
  30. package/dist/helpers-L7NYO5XS.js +53 -0
  31. package/dist/issue-log-broadcaster-WZAHISYB.js +84 -0
  32. package/dist/{issues-MZLRSXD6.js → issues-3QRR7KM6.js} +10 -8
  33. package/dist/log-analyzer-K7MXQB4T.js +287 -0
  34. package/dist/mcp/server.js +109 -137
  35. package/dist/parallel-executor-6INE6NDO.js +118 -0
  36. package/dist/pid-manager-UBWXVSMD.js +21 -0
  37. package/dist/queue-workers-XFZK3TT5.js +32 -0
  38. package/dist/replan-issue.command-4UCWYHGZ.js +15 -0
  39. package/dist/scheduler-ZP7GOZDW.js +26 -0
  40. package/dist/{settings-NGY33WQE.js → settings-ZAWDCFP2.js} +32 -8
  41. package/dist/settings.resource-5CW456AZ.js +24 -0
  42. package/dist/store-M6NCKMZY.js +97 -0
  43. package/dist/{web-push-CRVDJKWR.js → web-push-AX5IIK3P.js} +2 -2
  44. package/dist/{workspace-D3F3XGSI.js → workspace-CJTWFWTJ.js} +5 -4
  45. package/package.json +8 -7
  46. package/app/dist/assets/OnboardingWizard-CijMhJDW.js +0 -1
  47. package/app/dist/assets/analytics.lazy-Dq90a756.js +0 -1
  48. package/app/dist/assets/index-Dy_fM427.js +0 -54
  49. package/app/dist/assets/index-Q9jBP0Pz.css +0 -1
  50. package/app/dist/assets/vendor-DkWeBvNl.js +0 -9
  51. package/dist/chunk-2CVTK5F2.js +0 -288
  52. package/dist/chunk-37N5OFHM.js +0 -125
  53. package/dist/chunk-JTKUWIQD.js +0 -8406
  54. package/dist/chunk-RBDBGU2C.js +0 -303
  55. package/dist/issue-runner-CMZPSVC7.js +0 -16
  56. package/dist/queue-workers-XZ6DGH4W.js +0 -23
  57. package/dist/scheduler-NVE6L3P7.js +0 -22
  58. package/dist/store-4HCGBN4L.js +0 -65
@@ -0,0 +1,118 @@
1
+ import {
2
+ runAgentSession
3
+ } from "./chunk-YRSH2CLW.js";
4
+ import "./chunk-BRSR26VK.js";
5
+ import "./chunk-QQQLP3PL.js";
6
+ import "./chunk-AILXZ2TD.js";
7
+ import {
8
+ createGitWorktree
9
+ } from "./chunk-SOBLO4YZ.js";
10
+ import {
11
+ addEvent
12
+ } from "./chunk-E2EWEYA4.js";
13
+ import "./chunk-MVTGAKQK.js";
14
+ import {
15
+ markIssueDirty
16
+ } from "./chunk-FJNH3G2Z.js";
17
+ import {
18
+ logger
19
+ } from "./chunk-DVU3CXWA.js";
20
+ import "./chunk-ESWHDHH6.js";
21
+ import {
22
+ now
23
+ } from "./chunk-42AMQAJG.js";
24
+ import "./chunk-3NE23NYW.js";
25
+
26
+ // src/agents/parallel-executor.ts
27
+ import { join } from "path";
28
+ import { execSync } from "child_process";
29
+ async function spawnParallelSubTasks(state, issue, provider, cycle, basePromptText, basePromptFile) {
30
+ const subTaskDefs = issue.plan?.executionContract?.parallelSubTasks;
31
+ if (!subTaskDefs || subTaskDefs.length < 2) return false;
32
+ issue.parallelSubTasks = subTaskDefs.map((def) => ({
33
+ id: def.id,
34
+ label: def.label,
35
+ stepIndices: def.steps,
36
+ status: "pending",
37
+ startedAt: now()
38
+ }));
39
+ markIssueDirty(issue.id);
40
+ const mainWorktree = issue.workspacePath;
41
+ const maxFanout = Math.min(subTaskDefs.length, 3);
42
+ const activeTasks = issue.parallelSubTasks.slice(0, maxFanout);
43
+ for (const subTask of activeTasks) {
44
+ const subWorktreePath = join(mainWorktree, `subtask-${subTask.id}`);
45
+ try {
46
+ const subIssue = {
47
+ ...issue,
48
+ id: `${issue.id}-sub-${subTask.id}`,
49
+ identifier: `${issue.identifier}-sub-${subTask.id}`
50
+ };
51
+ await createGitWorktree(subIssue, subWorktreePath);
52
+ subTask.worktreePath = subWorktreePath;
53
+ } catch (err) {
54
+ logger.error({ err, issueId: issue.id, subTaskId: subTask.id }, "[Parallel] Failed to create sub-worktree");
55
+ subTask.status = "failed";
56
+ subTask.result = String(err);
57
+ }
58
+ }
59
+ markIssueDirty(issue.id);
60
+ function buildSubTaskPrompt(subTask, base) {
61
+ const steps = subTask.stepIndices.map((i) => issue.plan?.steps?.[i]).filter(Boolean).map((s, idx) => `${idx + 1}. [${s.action}] ${s.step}`).join("\n");
62
+ return `${base}
63
+
64
+ ## Your Sub-Task: ${subTask.label}
65
+
66
+ Focus ONLY on these steps:
67
+ ${steps}
68
+
69
+ Ignore steps not listed above.`;
70
+ }
71
+ const readyTasks = activeTasks.filter((t) => t.worktreePath && t.status !== "failed");
72
+ addEvent(state, issue.id, "info", `Spawning ${readyTasks.length} parallel sub-agents.`);
73
+ const results = await Promise.allSettled(
74
+ readyTasks.map(async (subTask) => {
75
+ subTask.status = "running";
76
+ markIssueDirty(issue.id);
77
+ const subPrompt = buildSubTaskPrompt(subTask, basePromptText);
78
+ try {
79
+ const result = await runAgentSession(state, issue, provider, cycle, subTask.worktreePath, subPrompt, basePromptFile);
80
+ subTask.status = result.success ? "done" : "failed";
81
+ subTask.result = result.output?.slice(-500) ?? "";
82
+ subTask.completedAt = now();
83
+ subTask.tokenUsage = issue.tokenUsage;
84
+ markIssueDirty(issue.id);
85
+ return { subTask, result };
86
+ } catch (err) {
87
+ subTask.status = "failed";
88
+ subTask.result = String(err);
89
+ subTask.completedAt = now();
90
+ markIssueDirty(issue.id);
91
+ throw err;
92
+ }
93
+ })
94
+ );
95
+ const successful = results.filter((r) => r.status === "fulfilled" && r.value.result.success).map((r) => r.value.subTask);
96
+ for (const subTask of successful) {
97
+ try {
98
+ const subBranch = execSync("git rev-parse --abbrev-ref HEAD", {
99
+ cwd: subTask.worktreePath,
100
+ timeout: 1e4,
101
+ encoding: "utf8"
102
+ }).trim();
103
+ const log = execSync(`git log --oneline HEAD..${subBranch}`, { cwd: mainWorktree, timeout: 1e4, encoding: "utf8" }).trim();
104
+ if (log) {
105
+ execSync(`git cherry-pick --allow-empty ${subBranch}`, { cwd: mainWorktree, timeout: 3e4 });
106
+ }
107
+ } catch (err) {
108
+ logger.warn({ err, issueId: issue.id, subTaskId: subTask.id }, "[Parallel] Cherry-pick failed, sub-task changes may need manual merge");
109
+ addEvent(state, issue.id, "warn", `Sub-task "${subTask.label}" merge conflict \u2014 changes may need manual review.`);
110
+ }
111
+ }
112
+ const anyFailed = activeTasks.some((t) => t.status === "failed");
113
+ return !anyFailed;
114
+ }
115
+ export {
116
+ spawnParallelSubTasks
117
+ };
118
+ //# sourceMappingURL=parallel-executor-6INE6NDO.js.map
@@ -0,0 +1,21 @@
1
+ import {
2
+ cleanStalePidFile,
3
+ isAgentStillRunning,
4
+ isDaemonAlive,
5
+ isDaemonSocketReady,
6
+ isProcessAlive,
7
+ readAgentPid,
8
+ readDaemonExit,
9
+ readDaemonPid
10
+ } from "./chunk-3NE23NYW.js";
11
+ export {
12
+ cleanStalePidFile,
13
+ isAgentStillRunning,
14
+ isDaemonAlive,
15
+ isDaemonSocketReady,
16
+ isProcessAlive,
17
+ readAgentPid,
18
+ readDaemonExit,
19
+ readDaemonPid
20
+ };
21
+ //# sourceMappingURL=pid-manager-UBWXVSMD.js.map
@@ -0,0 +1,32 @@
1
+ import {
2
+ areQueueWorkersActive,
3
+ cleanTerminalWorkspaces,
4
+ enqueue,
5
+ getQueueStats,
6
+ initQueueWorkers,
7
+ recoverOrphans,
8
+ recoverState,
9
+ stopQueueWorkers
10
+ } from "./chunk-YRSH2CLW.js";
11
+ import "./chunk-BRSR26VK.js";
12
+ import "./chunk-QQQLP3PL.js";
13
+ import "./chunk-AILXZ2TD.js";
14
+ import "./chunk-SOBLO4YZ.js";
15
+ import "./chunk-E2EWEYA4.js";
16
+ import "./chunk-MVTGAKQK.js";
17
+ import "./chunk-FJNH3G2Z.js";
18
+ import "./chunk-DVU3CXWA.js";
19
+ import "./chunk-ESWHDHH6.js";
20
+ import "./chunk-42AMQAJG.js";
21
+ import "./chunk-3NE23NYW.js";
22
+ export {
23
+ areQueueWorkersActive,
24
+ cleanTerminalWorkspaces,
25
+ enqueue,
26
+ getQueueStats,
27
+ initQueueWorkers,
28
+ recoverOrphans,
29
+ recoverState,
30
+ stopQueueWorkers
31
+ };
32
+ //# sourceMappingURL=queue-workers-XFZK3TT5.js.map
@@ -0,0 +1,15 @@
1
+ import {
2
+ replanIssueCommand
3
+ } from "./chunk-QQQLP3PL.js";
4
+ import "./chunk-AILXZ2TD.js";
5
+ import "./chunk-SOBLO4YZ.js";
6
+ import "./chunk-E2EWEYA4.js";
7
+ import "./chunk-MVTGAKQK.js";
8
+ import "./chunk-FJNH3G2Z.js";
9
+ import "./chunk-DVU3CXWA.js";
10
+ import "./chunk-ESWHDHH6.js";
11
+ import "./chunk-42AMQAJG.js";
12
+ export {
13
+ replanIssueCommand
14
+ };
15
+ //# sourceMappingURL=replan-issue.command-4UCWYHGZ.js.map
@@ -0,0 +1,26 @@
1
+ import {
2
+ analyzeParallelizability,
3
+ ensureNotStale,
4
+ hasTerminalQueue,
5
+ installGracefulShutdown,
6
+ isShuttingDown
7
+ } from "./chunk-YRSH2CLW.js";
8
+ import "./chunk-BRSR26VK.js";
9
+ import "./chunk-QQQLP3PL.js";
10
+ import "./chunk-AILXZ2TD.js";
11
+ import "./chunk-SOBLO4YZ.js";
12
+ import "./chunk-E2EWEYA4.js";
13
+ import "./chunk-MVTGAKQK.js";
14
+ import "./chunk-FJNH3G2Z.js";
15
+ import "./chunk-DVU3CXWA.js";
16
+ import "./chunk-ESWHDHH6.js";
17
+ import "./chunk-42AMQAJG.js";
18
+ import "./chunk-3NE23NYW.js";
19
+ export {
20
+ analyzeParallelizability,
21
+ ensureNotStale,
22
+ hasTerminalQueue,
23
+ installGracefulShutdown,
24
+ isShuttingDown
25
+ };
26
+ //# sourceMappingURL=scheduler-ZP7GOZDW.js.map
@@ -1,19 +1,29 @@
1
1
  import {
2
2
  RUNTIME_CONFIG_SETTING_IDS,
3
+ SETTING_ID_ADAPTIVE_HARNESS_SELECTION,
4
+ SETTING_ID_ADAPTIVE_POLICY_MIN_SAMPLES,
5
+ SETTING_ID_ADAPTIVE_REVIEW_ROUTING,
3
6
  SETTING_ID_AGENT_COMMAND,
4
7
  SETTING_ID_AGENT_PROVIDER,
8
+ SETTING_ID_AUTO_REPLAN_ON_STALL,
9
+ SETTING_ID_AUTO_REPLAN_STALL_THRESHOLD,
5
10
  SETTING_ID_AUTO_REVIEW_APPROVAL,
6
11
  SETTING_ID_COMMAND_TIMEOUT_MS,
7
12
  SETTING_ID_DEFAULT_EFFORT,
8
13
  SETTING_ID_DETECTED_PROVIDERS,
14
+ SETTING_ID_DOCKER_EXECUTION,
15
+ SETTING_ID_DOCKER_IMAGE,
16
+ SETTING_ID_ENABLE_PLAYWRIGHT_REVIEW,
9
17
  SETTING_ID_LOG_LINES_TAIL,
10
18
  SETTING_ID_MAX_ATTEMPTS_DEFAULT,
11
19
  SETTING_ID_MAX_CONCURRENT_BY_STATE,
20
+ SETTING_ID_MAX_REVIEW_AUTO_RETRIES,
12
21
  SETTING_ID_MAX_TURNS,
13
22
  SETTING_ID_MERGE_MODE,
14
23
  SETTING_ID_POLL_INTERVAL_MS,
15
24
  SETTING_ID_PR_BASE_BRANCH,
16
25
  SETTING_ID_RETRY_DELAY_MS,
26
+ SETTING_ID_SERVICE_ENV,
17
27
  SETTING_ID_STALE_IN_PROGRESS_TIMEOUT_MS,
18
28
  SETTING_ID_TEST_COMMAND,
19
29
  SETTING_ID_UI_NOTIFICATIONS_ENABLED,
@@ -30,30 +40,44 @@ import {
30
40
  persistWorkerConcurrencySetting,
31
41
  persistWorkflowConfig,
32
42
  syncRuntimeConfigSettings
33
- } from "./chunk-JTKUWIQD.js";
34
- import "./chunk-RBDBGU2C.js";
35
- import "./chunk-I2UHVKHS.js";
36
- import "./chunk-H5N7O5NP.js";
37
- import "./chunk-NB44PCD2.js";
38
- import "./chunk-2CVTK5F2.js";
39
- import "./chunk-37N5OFHM.js";
43
+ } from "./chunk-YRSH2CLW.js";
44
+ import "./chunk-BRSR26VK.js";
45
+ import "./chunk-QQQLP3PL.js";
46
+ import "./chunk-AILXZ2TD.js";
47
+ import "./chunk-SOBLO4YZ.js";
48
+ import "./chunk-E2EWEYA4.js";
49
+ import "./chunk-MVTGAKQK.js";
50
+ import "./chunk-FJNH3G2Z.js";
40
51
  import "./chunk-DVU3CXWA.js";
52
+ import "./chunk-ESWHDHH6.js";
53
+ import "./chunk-42AMQAJG.js";
54
+ import "./chunk-3NE23NYW.js";
41
55
  export {
42
56
  RUNTIME_CONFIG_SETTING_IDS,
57
+ SETTING_ID_ADAPTIVE_HARNESS_SELECTION,
58
+ SETTING_ID_ADAPTIVE_POLICY_MIN_SAMPLES,
59
+ SETTING_ID_ADAPTIVE_REVIEW_ROUTING,
43
60
  SETTING_ID_AGENT_COMMAND,
44
61
  SETTING_ID_AGENT_PROVIDER,
62
+ SETTING_ID_AUTO_REPLAN_ON_STALL,
63
+ SETTING_ID_AUTO_REPLAN_STALL_THRESHOLD,
45
64
  SETTING_ID_AUTO_REVIEW_APPROVAL,
46
65
  SETTING_ID_COMMAND_TIMEOUT_MS,
47
66
  SETTING_ID_DEFAULT_EFFORT,
48
67
  SETTING_ID_DETECTED_PROVIDERS,
68
+ SETTING_ID_DOCKER_EXECUTION,
69
+ SETTING_ID_DOCKER_IMAGE,
70
+ SETTING_ID_ENABLE_PLAYWRIGHT_REVIEW,
49
71
  SETTING_ID_LOG_LINES_TAIL,
50
72
  SETTING_ID_MAX_ATTEMPTS_DEFAULT,
51
73
  SETTING_ID_MAX_CONCURRENT_BY_STATE,
74
+ SETTING_ID_MAX_REVIEW_AUTO_RETRIES,
52
75
  SETTING_ID_MAX_TURNS,
53
76
  SETTING_ID_MERGE_MODE,
54
77
  SETTING_ID_POLL_INTERVAL_MS,
55
78
  SETTING_ID_PR_BASE_BRANCH,
56
79
  SETTING_ID_RETRY_DELAY_MS,
80
+ SETTING_ID_SERVICE_ENV,
57
81
  SETTING_ID_STALE_IN_PROGRESS_TIMEOUT_MS,
58
82
  SETTING_ID_TEST_COMMAND,
59
83
  SETTING_ID_UI_NOTIFICATIONS_ENABLED,
@@ -71,4 +95,4 @@ export {
71
95
  persistWorkflowConfig,
72
96
  syncRuntimeConfigSettings
73
97
  };
74
- //# sourceMappingURL=settings-NGY33WQE.js.map
98
+ //# sourceMappingURL=settings-ZAWDCFP2.js.map
@@ -0,0 +1,24 @@
1
+ import {
2
+ getSetting,
3
+ listSettings,
4
+ settings_resource_default,
5
+ updateSetting
6
+ } from "./chunk-YRSH2CLW.js";
7
+ import "./chunk-BRSR26VK.js";
8
+ import "./chunk-QQQLP3PL.js";
9
+ import "./chunk-AILXZ2TD.js";
10
+ import "./chunk-SOBLO4YZ.js";
11
+ import "./chunk-E2EWEYA4.js";
12
+ import "./chunk-MVTGAKQK.js";
13
+ import "./chunk-FJNH3G2Z.js";
14
+ import "./chunk-DVU3CXWA.js";
15
+ import "./chunk-ESWHDHH6.js";
16
+ import "./chunk-42AMQAJG.js";
17
+ import "./chunk-3NE23NYW.js";
18
+ export {
19
+ settings_resource_default as default,
20
+ getSetting,
21
+ listSettings,
22
+ updateSetting
23
+ };
24
+ //# sourceMappingURL=settings.resource-5CW456AZ.js.map
@@ -0,0 +1,97 @@
1
+ import {
2
+ closeStateStore,
3
+ deletePersistedService,
4
+ deletePersistedVariable,
5
+ getAgentPipelineResource,
6
+ getAgentSessionResource,
7
+ getContextFragmentResource,
8
+ getCurrentPlanForIssue,
9
+ getEcDailyEvents,
10
+ getEcDailyLines,
11
+ getEventStateResource,
12
+ getIssuePlanResource,
13
+ getIssueStateResource,
14
+ getMilestoneStateResource,
15
+ getPlansForIssue,
16
+ getServiceResource,
17
+ getSettingStateResource,
18
+ getStateDb,
19
+ getVariablesResource,
20
+ initStateStore,
21
+ isStateNotFoundError,
22
+ loadLegacyPersistedServices,
23
+ loadPersistedMilestones,
24
+ loadPersistedServices,
25
+ loadPersistedSettings,
26
+ loadPersistedState,
27
+ loadPersistedVariables,
28
+ loadS3dbModule,
29
+ persistState,
30
+ persistStateFull,
31
+ replaceAllServices,
32
+ replacePersistedService,
33
+ replacePersistedSetting,
34
+ savePlanForIssue,
35
+ setActiveApiPlugin,
36
+ upsertPersistedVariable
37
+ } from "./chunk-YRSH2CLW.js";
38
+ import "./chunk-BRSR26VK.js";
39
+ import "./chunk-QQQLP3PL.js";
40
+ import "./chunk-AILXZ2TD.js";
41
+ import "./chunk-SOBLO4YZ.js";
42
+ import "./chunk-E2EWEYA4.js";
43
+ import "./chunk-MVTGAKQK.js";
44
+ import {
45
+ hasDirtyState,
46
+ markEventDirty,
47
+ markIssueDirty,
48
+ markIssuePlanDirty,
49
+ markMilestoneDirty
50
+ } from "./chunk-FJNH3G2Z.js";
51
+ import "./chunk-DVU3CXWA.js";
52
+ import "./chunk-ESWHDHH6.js";
53
+ import "./chunk-42AMQAJG.js";
54
+ import "./chunk-3NE23NYW.js";
55
+ export {
56
+ closeStateStore,
57
+ deletePersistedService,
58
+ deletePersistedVariable,
59
+ getAgentPipelineResource,
60
+ getAgentSessionResource,
61
+ getContextFragmentResource,
62
+ getCurrentPlanForIssue,
63
+ getEcDailyEvents,
64
+ getEcDailyLines,
65
+ getEventStateResource,
66
+ getIssuePlanResource,
67
+ getIssueStateResource,
68
+ getMilestoneStateResource,
69
+ getPlansForIssue,
70
+ getServiceResource,
71
+ getSettingStateResource,
72
+ getStateDb,
73
+ getVariablesResource,
74
+ hasDirtyState,
75
+ initStateStore,
76
+ isStateNotFoundError,
77
+ loadLegacyPersistedServices,
78
+ loadPersistedMilestones,
79
+ loadPersistedServices,
80
+ loadPersistedSettings,
81
+ loadPersistedState,
82
+ loadPersistedVariables,
83
+ loadS3dbModule,
84
+ markEventDirty,
85
+ markIssueDirty,
86
+ markIssuePlanDirty,
87
+ markMilestoneDirty,
88
+ persistState,
89
+ persistStateFull,
90
+ replaceAllServices,
91
+ replacePersistedService,
92
+ replacePersistedSetting,
93
+ savePlanForIssue,
94
+ setActiveApiPlugin,
95
+ upsertPersistedVariable
96
+ };
97
+ //# sourceMappingURL=store-M6NCKMZY.js.map
@@ -10,7 +10,7 @@ import {
10
10
  isWebPushReady,
11
11
  removeSubscription,
12
12
  sendPushToAll
13
- } from "./chunk-I2UHVKHS.js";
13
+ } from "./chunk-BRSR26VK.js";
14
14
  import "./chunk-DVU3CXWA.js";
15
15
  export {
16
16
  SETTING_ID_PUSH_CONTACT,
@@ -25,4 +25,4 @@ export {
25
25
  removeSubscription,
26
26
  sendPushToAll
27
27
  };
28
- //# sourceMappingURL=web-push-CRVDJKWR.js.map
28
+ //# sourceMappingURL=web-push-AX5IIK3P.js.map
@@ -23,10 +23,11 @@ import {
23
23
  shouldSkipMergePath,
24
24
  syncIssueDiffStatsToStore,
25
25
  writeVersionedArtifacts
26
- } from "./chunk-NB44PCD2.js";
27
- import "./chunk-2CVTK5F2.js";
28
- import "./chunk-37N5OFHM.js";
26
+ } from "./chunk-SOBLO4YZ.js";
27
+ import "./chunk-FJNH3G2Z.js";
29
28
  import "./chunk-DVU3CXWA.js";
29
+ import "./chunk-ESWHDHH6.js";
30
+ import "./chunk-42AMQAJG.js";
30
31
  export {
31
32
  assertIssueHasGitWorktree,
32
33
  bootstrapSource,
@@ -53,4 +54,4 @@ export {
53
54
  syncIssueDiffStatsToStore,
54
55
  writeVersionedArtifacts
55
56
  };
56
- //# sourceMappingURL=workspace-D3F3XGSI.js.map
57
+ //# sourceMappingURL=workspace-CJTWFWTJ.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fifony",
3
- "version": "0.1.42",
3
+ "version": "0.1.43",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -44,6 +44,7 @@
44
44
  "node": ">=23"
45
45
  },
46
46
  "dependencies": {
47
+ "@huggingface/transformers": "^3.8.1",
47
48
  "cli-args-parser": "^1.0.6",
48
49
  "node-cron": "^4.2.1",
49
50
  "node-pty": "1.2.0-beta.12",
@@ -52,18 +53,18 @@
52
53
  "raffel": "^1.0.19",
53
54
  "react-hotkeys-hook": "^5.2.4",
54
55
  "recker": "^1.0.86",
55
- "s3db.js": "21.3.16",
56
+ "s3db.js": "21.3.20",
56
57
  "web-push": "^3.6.7",
57
58
  "yaml": "^2.8.3"
58
59
  },
59
60
  "devDependencies": {
60
61
  "@tailwindcss/vite": "^4.2.2",
61
62
  "@tanstack/react-query": "^5.95.2",
62
- "@tanstack/react-router": "^1.168.3",
63
- "@tanstack/router-plugin": "^1.167.4",
63
+ "@tanstack/react-router": "^1.168.7",
64
+ "@tanstack/router-plugin": "^1.167.8",
64
65
  "@vitejs/plugin-react": "^6.0.1",
65
66
  "daisyui": "^5.5.19",
66
- "lucide-react": "^1.0.1",
67
+ "lucide-react": "^1.7.0",
67
68
  "react": "^19.2.4",
68
69
  "react-dom": "^19.2.4",
69
70
  "sharp": "^0.34.5",
@@ -71,10 +72,10 @@
71
72
  "tsup": "^8.5.1",
72
73
  "tsx": "^4.21.0",
73
74
  "typescript": "^6.0.2",
74
- "vite": "^8.0.2"
75
+ "vite": "^8.0.3"
75
76
  },
76
77
  "scripts": {
77
- "prompts:generate": "tsx ./scripts/generate-prompts.ts",
78
+ "prompts:generate": "node --import tsx ./scripts/generate-prompts.ts",
78
79
  "start": "pnpm prompts:generate && node ./bin/fifony.js",
79
80
  "dev": "pnpm prompts:generate && node ./bin/fifony.js --port 4000 --dev",
80
81
  "dev:api": "pnpm prompts:generate && node ./bin/fifony.js --port 4000",
@@ -1 +0,0 @@
1
- import{r as e}from"./rolldown-runtime-Dw2cE7zH.js";import{I as t,h as n,m as r}from"./vendor-DkWeBvNl.js";import{t as i}from"./api-ChEctgc5.js";import{t as a}from"./createLucideIcon-R47sXufx.js";import{B as o,C as s,D as c,E as l,F as u,G as d,H as f,I as p,K as m,L as h,M as g,N as _,P as v,Q as y,R as b,S as x,T as S,U as C,V as w,W as T,X as E,_ as D,a as O,b as k,d as A,f as j,g as ee,h as M,j as N,l as P,m as te,n as ne,o as F,p as I,q as L,r as R,u as z,w as re}from"./index-Dy_fM427.js";var B=a(`brain`,[[`path`,{d:`M12 18V5`,key:`adv99a`}],[`path`,{d:`M15 13a4.17 4.17 0 0 1-3-4 4.17 4.17 0 0 1-3 4`,key:`1e3is1`}],[`path`,{d:`M17.598 6.5A3 3 0 1 0 12 5a3 3 0 1 0-5.598 1.5`,key:`1gqd8o`}],[`path`,{d:`M17.997 5.125a4 4 0 0 1 2.526 5.77`,key:`iwvgf7`}],[`path`,{d:`M18 18a4 4 0 0 0 2-7.464`,key:`efp6ie`}],[`path`,{d:`M19.967 17.483A4 4 0 1 1 12 18a4 4 0 1 1-7.967-.517`,key:`1gq6am`}],[`path`,{d:`M6 18a4 4 0 0 1-2-7.464`,key:`k1g0md`}],[`path`,{d:`M6.003 5.125a4 4 0 0 0-2.526 5.77`,key:`q97ue3`}]]),V=e(t(),1),H=n();function ie(){let e=(0,V.useRef)(null),t=(0,V.useRef)([]),n=(0,V.useRef)(null);return(0,V.useEffect)(()=>{let r=e.current;if(!r)return;let i=r.getContext(`2d`),a=[`♪`,`♫`,`♩`,`♬`],o=[`oklch(0.75 0.18 250)`,`oklch(0.80 0.16 200)`,`oklch(0.70 0.20 330)`,`oklch(0.85 0.14 85)`,`oklch(0.75 0.18 145)`,`oklch(0.80 0.12 280)`,`oklch(0.78 0.15 30)`],s=o.length,c=a.length,l=document.createElement(`canvas`);l.width=s*56,l.height=c*56;let u=l.getContext(`2d`);u.textAlign=`center`,u.textBaseline=`middle`,u.font=`48px serif`;let d=[];for(let e=0;e<c;e++){d[e]=[];for(let t=0;t<s;t++){let n=t*56+56/2,r=e*56+56/2;u.fillStyle=o[t],u.fillText(a[e],n,r),d[e][t]={x:t*56,y:e*56}}}let f=0,p=0,m=()=>{let e=window.devicePixelRatio||1;f=window.innerWidth,p=window.innerHeight,r.width=f*e,r.height=p*e,r.style.width=f+`px`,r.style.height=p+`px`,i.setTransform(e,0,0,e,0,0)};m();function h(){let e=f/2,t=p*.38,n=Math.random()*Math.PI*2,r=Math.random()*1.8+.4,i=Math.random()*20,a=Math.floor(Math.random()*c),o=Math.floor(Math.random()*s);return{x:e+Math.cos(n)*i,y:t+Math.sin(n)*i,vx:Math.cos(n)*r,vy:Math.sin(n)*r,gravity:.003+Math.random()*.005,scale:Math.random()*.4+.25,si:a,ci:o,rotation:Math.random()*Math.PI*2,rotationSpeed:(Math.random()-.5)*.04,life:0,maxLife:180+Math.random()*200,fadeIn:15}}let g=Math.min(Math.floor(f*p/6e3),120);t.current=[];for(let e=0;e<g;e++){let e=h(),n=Math.random()*e.maxLife*.8;e.x+=e.vx*n,e.y+=e.vy*n+.5*e.gravity*n*n,e.rotation+=e.rotationSpeed*n,e.life=n,t.current.push(e)}let _=Math.max(1,Math.floor(g/90)),v=0,y=()=>{if(i.clearRect(0,0,f,p),v++,v%2==0)for(let e=0;e<_;e++)t.current.push(h());let e=[];for(let n of t.current){if(n.life++,n.x+=n.vx,n.y+=n.vy,n.vy+=n.gravity,n.rotation+=n.rotationSpeed,n.vx*=.998,n.vy*=.998,n.life>n.maxLife||n.x<-60||n.x>f+60||n.y<-60||n.y>p+60)continue;e.push(n);let t=Math.min(1,n.life/n.fadeIn),r=n.maxLife*.6,a=t*(n.life>r?1-(n.life-r)/(n.maxLife-r):1)*.45;if(a<=.01)continue;let o=d[n.si][n.ci],s=56*n.scale,c=s/2;i.save(),i.translate(n.x,n.y),i.rotate(n.rotation),i.globalAlpha=a,i.drawImage(l,o.x,o.y,56,56,-c,-c,s,s),i.restore()}t.current=e,n.current=requestAnimationFrame(y)};return n.current=requestAnimationFrame(y),window.addEventListener(`resize`,m),()=>{cancelAnimationFrame(n.current),window.removeEventListener(`resize`,m)}},[]),(0,H.jsx)(`canvas`,{ref:e,className:`fixed inset-0 pointer-events-none`,style:{zIndex:0},"aria-hidden":`true`})}var ae=[`Welcome`,`Setup`,`Pipeline`,`Agents & Skills`,`Preferences`,`Launch`];function oe(){return ae}function se(){return ae.length}var U=[`Setup`,`Pipeline`,`Agents`,`Preferences`,`Launch`];function ce(){return U}var W=[{value:`low`,label:`Low`,icon:R,description:`Quick and light -- fast responses, less thorough`,color:`text-info`},{value:`medium`,label:`Medium`,icon:re,description:`Balanced -- good mix of speed and quality`,color:`text-success`},{value:`high`,label:`High`,icon:B,description:`Thorough -- deeper analysis, takes more time`,color:`text-warning`},{value:`extra-high`,label:`Extra High`,icon:c,description:`Maximum depth -- most thorough, slowest`,color:`text-error`}],G={codex:W,claude:W.filter(e=>e.value!==`extra-high`),gemini:W.filter(e=>e.value!==`extra-high`)};function K(e,t){return G[t?.[e]||`codex`]||W}var le=[{value:`auto`,label:`Auto`},{value:`light`,label:`Light`},{value:`dark`,label:`Dark`},{value:`black`,label:`Black`},{value:`cupcake`,label:`Cupcake`},{value:`night`,label:`Night`},{value:`sunset`,label:`Sunset`}],q=[{role:`planner`,label:`Planner`,description:`Scopes the issue, breaks it into steps, and decides the approach`,icon:B,color:`text-info`},{role:`executor`,label:`Executor`,description:`Implements the plan — writes code, edits files, runs commands`,icon:R,color:`text-primary`},{role:`reviewer`,label:`Reviewer`,description:`Validates the result — checks correctness, scope, and quality`,icon:A,color:`text-secondary`}];async function J(e,t,n=`ui`){return i.post(`/settings/${encodeURIComponent(e)}`,{value:t,scope:n,source:`user`})}function Y(e,t=`medium`){return W.some(t=>t.value===e)?e:t}function ue(e){return!e||typeof e!=`object`||Array.isArray(e)?{planner:`medium`,executor:`medium`,reviewer:`medium`}:{planner:Y(e.planner??e.default,`medium`),executor:Y(e.executor??e.default,`medium`),reviewer:Y(e.reviewer??e.default,`medium`)}}function de(e,t,n={}){return{plan:{provider:e.planner||e.executor||``,model:n.plan||``,effort:t.planner||`medium`},execute:{provider:e.executor||``,model:n.execute||``,effort:t.executor||`medium`},review:{provider:e.reviewer||e.executor||``,model:n.review||``,effort:t.reviewer||`medium`}}}function X(e){return!!(e?.isGit&&e?.hasCommits)}function fe(e,t){return!!e&&X(t)}function pe({current:e}){let t=ce(),n=e-1;return(0,H.jsx)(`ul`,{className:`steps steps-horizontal w-full max-w-2xl text-xs`,children:t.map((e,t)=>{let r=t<n,i=t===n;return(0,H.jsx)(`li`,{"data-content":r?`✓`:t+1,className:`step ${r||i?`step-primary`:``}`,style:{transition:`color 0.3s ease`},children:e},e)})})}function me({direction:e,stepKey:t,center:n,children:r}){return(0,H.jsx)(`div`,{className:`${e===`forward`?`animate-slide-in-right`:`animate-slide-in-left`} w-full max-w-2xl mx-auto ${n?`my-auto`:``}`,children:r},t)}function he({step:e,stepCount:t,stepName:n,canProceed:r,launching:i,onBack:a,onNext:o,onLaunch:s}){return e===0?null:(0,H.jsxs)(`div`,{className:`relative z-10 p-4 pb-6 flex items-center max-w-2xl mx-auto w-full justify-between`,children:[(0,H.jsxs)(`button`,{className:`btn btn-ghost gap-1`,onClick:a,disabled:i,children:[(0,H.jsx)(u,{className:`size-4`}),` Back`]}),e<t-1?(0,H.jsxs)(`button`,{className:`btn btn-primary gap-1`,onClick:o,disabled:!r,children:[`Next `,(0,H.jsx)(v,{className:`size-4`})]}):(0,H.jsx)(`button`,{className:`btn btn-primary btn-lg gap-2 animate-pulse-soft`,onClick:s,disabled:i,children:i?(0,H.jsxs)(H.Fragment,{children:[(0,H.jsx)(D,{className:`size-5 animate-spin`}),` Launching...`]}):(0,H.jsxs)(H.Fragment,{children:[(0,H.jsx)(j,{className:`size-5`}),` Launch fifony`]})})]})}function ge({workspacePath:e,onGetStarted:t}){return(0,H.jsxs)(`div`,{className:`flex flex-col items-center text-center gap-6 stagger-children py-4`,children:[(0,H.jsx)(`img`,{src:y,alt:`fifony mascot`,className:`h-72 sm:h-96 object-contain animate-bounce-in select-none pointer-events-none`,style:{filter:`drop-shadow(0 12px 40px rgba(128, 0, 255, 0.3))`}}),(0,H.jsxs)(`h1`,{className:`text-4xl sm:text-5xl font-bold tracking-tight leading-none`,style:{fontFamily:`'Space Grotesk', system-ui, sans-serif`},children:[`Welcome to `,(0,H.jsx)(`span`,{className:`text-primary`,children:`fifony`})]}),(0,H.jsx)(`p`,{className:`text-base-content/60 text-lg max-w-md`,children:`Let's set up your AI orchestration project in just a few steps.`}),e&&(0,H.jsxs)(`div`,{className:`badge badge-lg badge-soft badge-primary gap-2`,children:[(0,H.jsx)(P,{className:`size-3.5`}),`Project target: `,e]}),(0,H.jsxs)(`button`,{className:`btn btn-primary btn-lg gap-2 mt-2`,onClick:t,children:[`Get Started `,(0,H.jsx)(v,{className:`size-5`})]})]})}var Z=new Set([`main`,`master`]);function _e(){let[e,t]=(0,V.useState)(null),[n,r]=(0,V.useState)(!1),[a,o]=(0,V.useState)(!1);return(0,V.useEffect)(()=>{i.get(`/gitignore/status`).then(t).catch(()=>t({exists:!1,hasFifony:!1}))},[]),e===null||e.hasFifony?null:a?(0,H.jsxs)(`div`,{className:`alert alert-success py-2.5 text-sm animate-fade-in`,children:[(0,H.jsx)(z,{className:`size-4 shrink-0`}),(0,H.jsxs)(`span`,{children:[(0,H.jsx)(`code`,{children:`.fifony/`}),` adicionado ao `,(0,H.jsx)(`code`,{children:`.gitignore`})]})]}):(0,H.jsxs)(`div`,{className:`alert alert-warning py-2.5 text-sm`,children:[(0,H.jsx)(z,{className:`size-4 shrink-0`}),(0,H.jsxs)(`div`,{className:`flex-1`,children:[(0,H.jsxs)(`span`,{children:[(0,H.jsx)(`code`,{children:`.fifony/`}),` não está no `,(0,H.jsx)(`code`,{children:`.gitignore`})]}),(0,H.jsx)(`span`,{className:`text-base-content/50 block text-xs mt-0.5`,children:`O fifony guarda estado local lá — não deve ser commitado.`})]}),(0,H.jsx)(`button`,{className:`btn btn-xs btn-warning`,onClick:async()=>{r(!0);try{await i.post(`/gitignore/add`),o(!0)}catch{}finally{r(!1)}},disabled:n,children:n?(0,H.jsx)(D,{className:`size-3 animate-spin`}):`Adicionar`})]})}function ve({currentBranch:e,onBranchCreated:t,onGitStatusChange:n}){let[r,a]=(0,V.useState)(null),[o,c]=(0,V.useState)(!1),[l,u]=(0,V.useState)(null),[d,f]=(0,V.useState)(e);(0,V.useEffect)(()=>{i.get(`/git/status`).then(e=>{a(e),e.branch&&f(e.branch)}).catch(()=>a({isGit:!1,branch:e||null,hasCommits:!1}))},[]),(0,V.useEffect)(()=>{n?.(r)},[r,n]);let[p,m]=(0,V.useState)(!1),[h,g]=(0,V.useState)(``),[v,y]=(0,V.useState)(!1),[b,S]=(0,V.useState)(null),[C,w]=(0,V.useState)(null),T=r===null||r.isGit,E=r?.hasCommits??!1,O=Z.has(d),k=h.trim(),A=/^[a-zA-Z0-9/_.-]+$/.test(k)&&k.length>0,j=k===d;function M(){m(!0),g(d||``),S(null),w(null)}async function N(){if(!(!A||j||v)){y(!0),S(null);try{let e=await i.post(`/git/switch`,{branchName:k});if(!e.ok)throw Error(e.error||`Failed to switch branch.`);f(k),w({branch:k,created:e.created}),m(!1),t?.(k)}catch(e){S(e instanceof Error?e.message:String(e))}finally{y(!1)}}}async function P(){c(!0),u(null);try{let e=await i.post(`/git/init`,{});if(!e.ok)throw Error(e.error||`Failed to initialize git.`);a({isGit:!!(e.isGit??!0),branch:e.branch||null,hasCommits:!!(e.hasCommits??!0)}),f(e.branch||d)}catch(e){u(e instanceof Error?e.message:String(e))}finally{c(!1)}}return(0,H.jsxs)(`div`,{className:`bg-base-200 rounded-2xl p-5 flex flex-col gap-4`,children:[(0,H.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,H.jsx)(s,{className:`size-4 text-primary`}),(0,H.jsx)(`div`,{className:`text-sm font-semibold`,children:`Working branch`})]}),(0,H.jsx)(`p`,{className:`text-xs text-base-content/50 -mt-2`,children:`Agents create worktrees based on the current branch. We recommend not working directly on main.`}),r!==null&&!r.isGit&&(0,H.jsxs)(`div`,{className:`flex flex-col gap-3`,children:[(0,H.jsxs)(`div`,{className:`alert alert-warning py-3`,children:[(0,H.jsx)(x,{className:`size-4 shrink-0`}),(0,H.jsxs)(`div`,{className:`text-sm`,children:[(0,H.jsx)(`p`,{className:`font-semibold`,children:`Not a git repository`}),(0,H.jsx)(`p`,{className:`opacity-80 mt-0.5`,children:`fifony requires git and an initial commit to create agent worktrees. Initialize it here to continue.`})]})]}),l&&(0,H.jsxs)(`p`,{className:`text-xs text-error flex items-center gap-1`,children:[(0,H.jsx)(F,{className:`size-3`}),` `,l]}),(0,H.jsxs)(`button`,{className:`btn btn-primary gap-2 self-start`,onClick:P,disabled:o,children:[o?(0,H.jsx)(D,{className:`size-4 animate-spin`}):(0,H.jsx)(x,{className:`size-4`}),`Initialize git repository`]})]}),r!==null&&r.isGit&&!E&&(0,H.jsxs)(`div`,{className:`flex flex-col gap-3`,children:[(0,H.jsxs)(`div`,{className:`alert alert-warning py-3`,children:[(0,H.jsx)(x,{className:`size-4 shrink-0`}),(0,H.jsxs)(`div`,{className:`text-sm`,children:[(0,H.jsx)(`p`,{className:`font-semibold`,children:`Repository has no commits yet`}),(0,H.jsx)(`p`,{className:`opacity-80 mt-0.5`,children:`fifony needs one initial commit before it can create per-issue git worktrees. Create it here to continue.`})]})]}),l&&(0,H.jsxs)(`p`,{className:`text-xs text-error flex items-center gap-1`,children:[(0,H.jsx)(F,{className:`size-3`}),` `,l]}),(0,H.jsxs)(`button`,{className:`btn btn-primary gap-2 self-start`,onClick:P,disabled:o,children:[o?(0,H.jsx)(D,{className:`size-4 animate-spin`}):(0,H.jsx)(x,{className:`size-4`}),`Create initial commit`]})]}),r?.isGit&&r?.hasCommits&&r?.isClean===!1&&(0,H.jsxs)(`div`,{className:`alert alert-info py-3 text-sm`,children:[(0,H.jsx)(F,{className:`size-4 shrink-0`}),(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`p`,{className:`font-semibold`,children:`Working tree has uncommitted changes`}),(0,H.jsxs)(`p`,{className:`opacity-80 mt-0.5`,children:[r.untrackedCount>0?`${r.untrackedCount} untracked file${r.untrackedCount>1?`s`:``} found. `:``,`Commit or stash your changes before merging issues — fifony requires a clean working tree to merge agent work.`]})]})]}),T&&(0,H.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[p?(0,H.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[(0,H.jsxs)(`div`,{className:`flex gap-2`,children:[(0,H.jsxs)(`label`,{className:`input input-bordered flex items-center gap-2 flex-1`,children:[(0,H.jsx)(s,{className:`size-3.5 opacity-40`}),(0,H.jsx)(`input`,{type:`text`,className:`grow font-mono text-sm`,value:h,onChange:e=>{g(e.target.value),S(null)},onKeyDown:e=>{e.key===`Enter`&&N(),e.key===`Escape`&&(m(!1),S(null))},placeholder:`develop`,autoFocus:!0,disabled:v})]}),(0,H.jsx)(`button`,{className:`btn btn-primary`,onClick:N,disabled:!A||j||v,children:v?(0,H.jsx)(ee,{className:`size-4 animate-spin`}):`Switch`}),(0,H.jsx)(`button`,{className:`btn btn-ghost`,onClick:()=>{m(!1),S(null)},disabled:v,children:`Cancel`})]}),b&&(0,H.jsxs)(`p`,{className:`text-xs text-error flex items-center gap-1`,children:[(0,H.jsx)(F,{className:`size-3`}),` `,b]}),(0,H.jsx)(`p`,{className:`text-xs opacity-40`,children:`Switches to the branch if it exists, or creates it from the current HEAD.`})]}):(0,H.jsxs)(`div`,{className:`flex items-center gap-2 px-4 py-3 rounded-box border border-base-300 bg-base-100 cursor-pointer hover:border-primary/40 transition-colors group`,onClick:M,role:`button`,tabIndex:0,onKeyDown:e=>e.key===`Enter`&&M(),children:[(0,H.jsx)(s,{className:`size-4 opacity-50 shrink-0`}),(0,H.jsx)(`span`,{className:`text-sm opacity-50`,children:`Current branch:`}),(0,H.jsx)(`span`,{className:`font-mono text-sm font-semibold`,children:d||(r===null?`…`:`—`)}),O&&(0,H.jsx)(`span`,{className:`badge badge-warning badge-sm ml-auto shrink-0`,children:`protected`}),!O&&(0,H.jsx)(te,{className:`size-3.5 opacity-0 group-hover:opacity-40 ml-auto shrink-0 transition-opacity`})]}),C&&(0,H.jsxs)(`div`,{className:`alert alert-success py-3 text-sm animate-fade-in`,children:[(0,H.jsx)(_,{className:`size-4 shrink-0`}),(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`p`,{className:`font-semibold`,children:C.created?`Branch created`:`Switched to branch`}),(0,H.jsxs)(`p`,{className:`opacity-75 font-mono mt-0.5`,children:[`Now on `,(0,H.jsx)(`span`,{className:`text-success-content`,children:C.branch}),` — agents will use this as the base branch`]})]})]}),O&&!p&&(0,H.jsxs)(`div`,{className:`alert alert-warning py-3`,children:[(0,H.jsx)(F,{className:`size-4 shrink-0`}),(0,H.jsxs)(`div`,{className:`text-sm`,children:[(0,H.jsxs)(`p`,{className:`font-semibold`,children:[`Working directly on `,(0,H.jsx)(`span`,{className:`font-mono`,children:d})]}),(0,H.jsx)(`p`,{className:`opacity-80 mt-0.5`,children:`In teams with protected branches, local merges are rejected. Click the branch above to switch, or use Push PR mode.`})]})]}),(0,H.jsx)(_e,{})]})]})}function ye({mergeMode:e,setMergeMode:t,prBaseBranch:n,setPrBaseBranch:r,currentBranch:i}){return(0,H.jsxs)(`div`,{className:`bg-base-200 rounded-2xl p-5 flex flex-col gap-4`,children:[(0,H.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,H.jsx)(k,{className:`size-4 text-primary`}),(0,H.jsx)(`div`,{className:`text-sm font-semibold`,children:`Merge mode`})]}),(0,H.jsx)(`p`,{className:`text-xs text-base-content/50 -mt-2`,children:`Choose how completed issues are integrated: local git merge or push a PR to GitHub.`}),(0,H.jsxs)(`div`,{className:`flex gap-3`,children:[(0,H.jsxs)(`label`,{className:`flex-1 cursor-pointer rounded-xl border-2 p-3 text-center text-sm font-medium transition-colors ${e===`local`?`border-primary bg-primary/10`:`border-base-300 bg-base-100`}`,children:[(0,H.jsx)(`input`,{type:`radio`,name:`mergeMode`,className:`hidden`,checked:e===`local`,onChange:()=>t(`local`)}),(0,H.jsx)(x,{className:`size-4 mx-auto mb-1 opacity-60`}),`Local merge`]}),(0,H.jsxs)(`label`,{className:`flex-1 cursor-pointer rounded-xl border-2 p-3 text-center text-sm font-medium transition-colors ${e===`push-pr`?`border-primary bg-primary/10`:`border-base-300 bg-base-100`}`,children:[(0,H.jsx)(`input`,{type:`radio`,name:`mergeMode`,className:`hidden`,checked:e===`push-pr`,onChange:()=>t(`push-pr`)}),(0,H.jsx)(k,{className:`size-4 mx-auto mb-1 opacity-60`}),`Push PR`]})]}),e===`push-pr`&&(0,H.jsxs)(`label`,{className:`form-control w-full gap-2`,children:[(0,H.jsx)(`span`,{className:`label-text text-sm font-medium`,children:`PR base branch`}),(0,H.jsx)(`input`,{type:`text`,className:`input input-bordered w-full text-sm font-mono`,placeholder:i||`main`,value:n,onChange:e=>r(e.target.value)}),(0,H.jsx)(`p`,{className:`text-xs opacity-40`,children:`Branch that PRs will target. Defaults to the current branch.`})]})]})}function be({testCommand:e,setTestCommand:t}){return(0,H.jsxs)(`div`,{className:`bg-base-200 rounded-2xl p-5 flex flex-col gap-4`,children:[(0,H.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,H.jsx)(l,{className:`size-4 text-primary`}),(0,H.jsx)(`div`,{className:`text-sm font-semibold`,children:`Test command`})]}),(0,H.jsx)(`p`,{className:`text-xs text-base-content/50 -mt-2`,children:`Validation gate: this command runs before merge/done. Leave empty to skip.`}),(0,H.jsx)(`input`,{type:`text`,className:`input input-bordered w-full text-sm font-mono`,placeholder:`pnpm test`,value:e,onChange:e=>t(e.target.value)})]})}function xe({autoReviewApproval:e,setAutoReviewApproval:t}){return(0,H.jsxs)(`div`,{className:`bg-base-200 rounded-2xl p-5 flex flex-col gap-4`,children:[(0,H.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,H.jsx)(z,{className:`size-4 text-primary`}),(0,H.jsx)(`div`,{className:`text-sm font-semibold`,children:`Review completion`})]}),(0,H.jsx)(`p`,{className:`text-xs text-base-content/50 -mt-2`,children:`Control whether completed reviews move issues directly to Done or require manual confirmation.`}),(0,H.jsxs)(`label`,{className:`label cursor-pointer justify-start gap-3`,children:[(0,H.jsx)(`input`,{type:`checkbox`,className:`toggle toggle-sm toggle-primary`,checked:e,onChange:e=>t(e.target.checked)}),(0,H.jsx)(`span`,{className:`label-text text-sm`,children:`Automatic review approval`})]}),(0,H.jsx)(`p`,{className:`text-xs text-base-content/50`,children:e?`Checked: issues move to Approved when the reviewer succeeds, or when no reviewer is configured.`:`Unchecked: issues stop in Pending Decision and require manual approval action.`})]})}function Se({projectName:e,setProjectName:t,detectedProjectName:n,projectSource:r,workspacePath:i,currentBranch:a,onGitStatusChange:o,onBranchCreated:s,mergeMode:c,setMergeMode:l,prBaseBranch:u,setPrBaseBranch:d,autoReviewApproval:p,setAutoReviewApproval:m,testCommand:h,setTestCommand:g}){let _=C(e),v=f(_||n),y=_?r===`saved`||r===`detected`?r:`manual`:n?`detected`:`missing`;return(0,H.jsxs)(`div`,{className:`flex flex-col gap-6 py-4`,children:[(0,H.jsxs)(`div`,{className:`text-center space-y-3`,children:[(0,H.jsx)(`div`,{className:`inline-flex size-14 items-center justify-center rounded-full bg-primary/10 text-primary mx-auto`,children:(0,H.jsx)(S,{className:`size-7`})}),(0,H.jsxs)(`div`,{className:`space-y-2`,children:[(0,H.jsx)(`h2`,{className:`text-2xl font-bold tracking-tight`,children:`Set up your workspace`}),(0,H.jsx)(`p`,{className:`text-base-content/60 max-w-xl mx-auto text-sm`,children:`Name your project and configure the working branch`})]})]}),(0,H.jsxs)(`div`,{className:`bg-base-200 rounded-2xl p-5 flex flex-col gap-4`,children:[(0,H.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3`,children:[(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`div`,{className:`text-sm font-semibold`,children:`Project name`}),(0,H.jsx)(`div`,{className:`text-xs text-base-content/50`,children:`This becomes the default queue title for future runs.`})]}),y===`saved`&&(0,H.jsxs)(`span`,{className:`badge badge-primary badge-soft gap-1.5`,children:[(0,H.jsx)(P,{className:`size-3`}),`Saved configuration`]}),y===`detected`&&(0,H.jsxs)(`span`,{className:`badge badge-secondary badge-soft gap-1.5`,children:[(0,H.jsx)(P,{className:`size-3`}),`Detected automatically`]}),y===`manual`&&(0,H.jsxs)(`span`,{className:`badge badge-accent badge-soft gap-1.5`,children:[(0,H.jsx)(te,{className:`size-3`}),`Edited manually`]}),y===`missing`&&(0,H.jsxs)(`span`,{className:`badge badge-warning badge-soft gap-1.5`,children:[(0,H.jsx)(F,{className:`size-3`}),`Manual entry required`]})]}),(0,H.jsxs)(`label`,{className:`form-control w-full gap-2`,children:[(0,H.jsx)(`span`,{className:`label-text text-sm font-medium`,children:`Project`}),(0,H.jsx)(`input`,{type:`text`,className:`input input-bordered w-full text-base`,placeholder:n||`Enter your project name`,value:e,onChange:e=>t(e.target.value),onBlur:n=>{let r=C(n.target.value);r!==e&&t(r)}})]}),i&&(0,H.jsxs)(`div`,{className:`text-xs text-base-content/50 break-all`,children:[`Workspace: `,i]}),!n&&!_&&(0,H.jsxs)(`div`,{className:`alert alert-warning text-sm`,children:[(0,H.jsx)(F,{className:`size-4 shrink-0`}),(0,H.jsx)(`span`,{children:`We could not detect a project name from the current directory. Enter one to continue.`})]}),(0,H.jsxs)(`div`,{className:`rounded-xl border border-base-300/70 bg-base-100 px-4 py-3`,children:[(0,H.jsx)(`div`,{className:`text-xs uppercase tracking-[0.2em] text-base-content/40`,children:`Queue title preview`}),(0,H.jsx)(`div`,{className:`mt-1.5 text-base font-semibold tracking-tight break-words`,children:v})]})]}),(0,H.jsx)(ve,{currentBranch:a,onGitStatusChange:o,onBranchCreated:s}),(0,H.jsx)(ye,{mergeMode:c,setMergeMode:l,prBaseBranch:u,setPrBaseBranch:d,currentBranch:a}),(0,H.jsx)(xe,{autoReviewApproval:p,setAutoReviewApproval:m}),(0,H.jsx)(be,{testCommand:h,setTestCommand:g})]})}var Ce={planner:`plan`,executor:`execute`,reviewer:`review`};function Q({options:e,value:t,onChange:n}){return(0,H.jsx)(`div`,{className:`flex gap-1 flex-wrap`,children:e.map(e=>{let r=e.value===t,i=e.icon;return(0,H.jsxs)(`button`,{type:`button`,onClick:()=>n(e.value),className:`flex items-center gap-1 px-2.5 py-1 rounded-full text-[11px] font-medium border transition-all ${r?`${e.color} border-current bg-base-300`:`text-base-content/35 border-base-content/10 hover:border-base-content/30 hover:text-base-content/60`}`,children:[(0,H.jsx)(i,{className:`size-2.5`}),e.label]},e.value)})})}function we({providers:e,providersLoading:t,pipeline:n,setPipeline:r,efforts:i,setEfforts:a,models:o,setModels:s,modelsByProvider:c}){let l=Array.isArray(e)?e:[],u=l.filter(e=>e.available!==!1),d=n.planner&&n.planner===n.executor&&n.planner===n.reviewer,f=(0,V.useMemo)(()=>{let e=q.map(e=>new Set(K(e.role,n).map(e=>e.value)));if(e.length===0)return W;let t=[...e[0]].filter(t=>e.every(e=>e.has(t))),r=W.filter(e=>t.includes(e.value));return r.length>0?r:W},[n]),p=(0,V.useMemo)(()=>{let e=(i.planner===i.executor&&i.planner===i.reviewer?i.planner:null)||f[0]?.value||`high`;return f.some(t=>t.value===e)?e:`high`},[i,f]),m=e=>e?.id||e?.name||e,h=e=>(c?.[e]||[])[0]?.id||``,_=e=>{let t=m(e);if(!t)return;let n=h(t);r({planner:t,executor:t,reviewer:t}),s({plan:n,execute:n,review:n})};return(0,V.useEffect)(()=>{for(let e of[`planner`,`executor`,`reviewer`]){let t=K(e,n),r=i[e];r&&!t.some(e=>e.value===r)&&a(t=>({...t,[e]:`high`}))}},[n,i,a]),(0,H.jsxs)(`div`,{className:`flex flex-col gap-5 w-full max-w-lg`,children:[(0,H.jsxs)(`div`,{className:`text-center`,children:[(0,H.jsx)(j,{className:`size-9 text-primary mx-auto mb-2`}),(0,H.jsx)(`h2`,{className:`text-2xl font-bold`,children:`Agent Pipeline`}),(0,H.jsx)(`p`,{className:`text-sm text-base-content/50 mt-1`,children:`Configure which CLI and reasoning depth runs each stage`})]}),t?(0,H.jsxs)(`div`,{className:`flex flex-col items-center gap-3 py-10`,children:[(0,H.jsx)(D,{className:`size-7 text-primary animate-spin`}),(0,H.jsx)(`p`,{className:`text-sm text-base-content/50`,children:`Detecting available CLIs…`})]}):u.length===0?(0,H.jsx)(`div`,{className:`alert alert-warning text-sm`,children:`No providers detected. Install claude, codex, or gemini CLI first.`}):(0,H.jsxs)(H.Fragment,{children:[(0,H.jsxs)(`div`,{className:`bg-base-200 rounded-xl p-4 space-y-4`,children:[(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`h3`,{className:`text-sm font-semibold mb-2`,children:`Apply to all stages`}),(0,H.jsx)(`p`,{className:`text-xs text-base-content/50 mb-2`,children:`Use one CLI and one effort across Planner, Executor, and Reviewer.`}),(0,H.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:u.map(e=>{let t=m(e);return(0,H.jsx)(`button`,{type:`button`,className:`btn btn-xs ${d&&n.planner===t?`btn-primary`:`btn-soft`}`,onClick:()=>_(e),children:t},t)})})]}),(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`div`,{className:`text-[10px] text-base-content/40 mb-2`,children:`Effort (applies to all)`}),(0,H.jsx)(Q,{options:f,value:p,onChange:e=>{e&&f.some(t=>t.value===e)&&a({planner:e,executor:e,reviewer:e})}})]})]}),(0,H.jsx)(`div`,{className:`flex flex-wrap gap-2 justify-center`,children:l.map(e=>{let t=m(e),n=e.available!==!1;return(0,H.jsxs)(`span`,{className:`badge gap-1.5 badge-sm ${n?`badge-success`:`badge-ghost opacity-40`}`,children:[n?(0,H.jsx)(g,{className:`size-3`}):(0,H.jsx)(N,{className:`size-3`}),(0,H.jsx)(`span`,{className:`font-mono`,children:t}),e.path&&(0,H.jsx)(`span`,{className:`opacity-50 text-[9px] hidden sm:inline`,children:e.path})]},t)})}),(0,H.jsx)(`div`,{className:`flex flex-col`,children:q.map((e,t)=>{let l=e.icon,d=n[e.role]||u[0]?.id||u[0]?.name||``,f=Ce[e.role],p=o?.[f]||``,m=c?.[d]||[],h=K(e.role,n),g=i?.[e.role]||`high`;return(0,H.jsxs)(`div`,{children:[t>0&&(0,H.jsx)(`div`,{className:`flex justify-center py-1.5 text-base-content/20`,children:(0,H.jsx)(b,{className:`size-4`})}),(0,H.jsx)(`div`,{className:`bg-base-200 rounded-xl p-4`,children:(0,H.jsxs)(`div`,{className:`flex flex-col gap-3`,children:[(0,H.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,H.jsx)(`div`,{className:`size-8 rounded-lg flex items-center justify-center bg-base-300 shrink-0 ${e.color}`,children:(0,H.jsx)(l,{className:`size-4`})}),(0,H.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,H.jsx)(`span`,{className:`font-semibold text-sm`,children:e.label}),(0,H.jsx)(`p`,{className:`text-[11px] text-base-content/40 leading-tight mt-0.5 truncate`,children:e.description})]}),(0,H.jsx)(`select`,{className:`select select-sm select-bordered w-28 shrink-0`,value:d,onChange:t=>{let n=t.target.value;r(t=>({...t,[e.role]:n}));let i=c?.[n]?.[0]?.id||``;s(e=>({...e,[f]:i}))},children:u.map(e=>{let t=e.id||e.name||e;return(0,H.jsx)(`option`,{value:t,children:t},t)})})]}),(0,H.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,H.jsx)(`span`,{className:`text-[10px] text-base-content/40 shrink-0 w-10`,children:`Effort`}),(0,H.jsx)(Q,{options:h,value:g,onChange:t=>a(n=>({...n,[e.role]:t}))})]}),m.length>0&&(0,H.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,H.jsx)(`span`,{className:`text-[10px] text-base-content/40 shrink-0 w-10`,children:`Model`}),(0,H.jsx)(`select`,{className:`select select-xs select-bordered flex-1`,value:p,onChange:e=>s(t=>({...t,[f]:e.target.value})),children:m.map(e=>(0,H.jsx)(`option`,{value:e.id,children:e.label||e.id},e.id))})]})]})})]},e.role)})}),(0,H.jsx)(`p`,{className:`text-[11px] text-base-content/35 text-center`,children:`Pipeline runs top to bottom: plan → execute → review`})]})]})}function Te({selectedAgents:e,setSelectedAgents:t,existingAgents:n,autoSelectAgents:r=!0}){let[a,o]=(0,V.useState)([]),[s,c]=(0,V.useState)(!1),l=(0,V.useRef)(!1),[u,d]=(0,V.useState)([]),[f,m]=(0,V.useState)(!1),[g,_]=(0,V.useState)(``),[v,y]=(0,V.useState)(()=>new Set),[b,x]=(0,V.useState)({}),S=(0,V.useRef)(!1),[C,w]=(0,V.useState)(``),T=(0,V.useCallback)(()=>i.get(`/catalog/agents`).catch(()=>({agents:[]})).then(e=>{let t=e?.agents||[];return o(t),t}),[]);(0,V.useEffect)(()=>{l.current||(l.current=!0,c(!0),T().then(i=>{let a=new Set((n||[]).map(e=>e.name)),o=i.filter(e=>!a.has(e.name)).map(e=>e.name);r&&o.length>0&&e.length===0&&t(o)}).finally(()=>c(!1)))},[]);let E=(0,V.useCallback)(()=>(_(``),m(!0),i.get(`/reference-repositories`).then(e=>{d(e?.repositories||[])}).catch(e=>{let t=e?.message||`Failed to load reference repositories.`;t.toLowerCase().includes(`route not found`)?_(`Backend route not loaded. Start Fifony with --dev (or run pnpm build:server) and retry.`):_(t)}).finally(()=>m(!1))),[]);(0,V.useEffect)(()=>{S.current||(S.current=!0,E())},[E]);let O=(0,V.useMemo)(()=>new Set((n||[]).map(e=>e.name)),[n]),k=(0,V.useMemo)(()=>{let e=C.trim().toLowerCase();return e?a.filter(t=>[t?.name,t?.displayName,t?.description].filter(Boolean).join(` `).toLowerCase().includes(e)):a},[C,a]),j=(0,V.useCallback)(e=>{t(t=>t.includes(e)?t.filter(t=>t!==e):[...t,e])},[t]),ee=(0,V.useCallback)(()=>{t(a.filter(e=>!O.has(e.name)).map(e=>e.name))},[a,O,t]),M=(0,V.useCallback)(()=>t([]),[t]),N=(0,V.useCallback)(async e=>{y(t=>new Set([...t,e])),x(t=>({...t,[e]:``}));try{let t=((await i.post(`/reference-repositories/sync`,{repository:e}))?.results||[]).find(t=>t.id===e);if(t?.action===`failed`){x(n=>({...n,[e]:t.message||`Sync failed.`}));return}await i.post(`/reference-repositories/import`,{repository:e,kind:`agents`,global:!1}),await Promise.all([E(),T()]),x(t=>({...t,[e]:`Synced & imported.`}))}catch(t){x(n=>({...n,[e]:t?.message||`Failed.`}))}finally{y(t=>{let n=new Set(t);return n.delete(e),n})}},[E,T]);return s?(0,H.jsxs)(`div`,{className:`flex flex-col items-center gap-3 py-12`,children:[(0,H.jsx)(D,{className:`size-8 text-primary animate-spin`}),(0,H.jsx)(`p`,{className:`text-sm text-base-content/50`,children:`Loading catalog...`})]}):(0,H.jsxs)(`div`,{className:`flex flex-col gap-6 stagger-children`,children:[(0,H.jsxs)(`div`,{className:`text-center`,children:[(0,H.jsx)(h,{className:`size-10 text-primary mx-auto mb-3`}),(0,H.jsx)(`h2`,{className:`text-2xl font-bold`,children:`Agents`}),(0,H.jsx)(`p`,{className:`text-base-content/60 mt-1`,children:`Choose which agents to install`})]}),(0,H.jsx)(`div`,{className:`card bg-base-200`,children:(0,H.jsxs)(`div`,{className:`card-body gap-3 p-4`,children:[(0,H.jsx)(`h3`,{className:`font-semibold text-sm`,children:`Sources`}),g&&(0,H.jsx)(`div`,{className:`alert alert-warning text-xs`,children:g}),f?(0,H.jsxs)(`div`,{className:`flex items-center gap-2 text-xs text-base-content/60`,children:[(0,H.jsx)(D,{className:`size-3 animate-spin`}),` Loading...`]}):(0,H.jsx)(`div`,{className:`grid grid-cols-2 xl:grid-cols-4 gap-2`,children:u.map(e=>{let t=v.has(e.id),n=e?.artifactCounts??null,r=e?.present&&e?.synced;return(0,H.jsxs)(`div`,{className:`rounded-lg border border-base-300/70 bg-base-100 p-2 flex flex-col gap-1.5`,children:[(0,H.jsx)(`div`,{className:`font-medium text-xs truncate`,children:e.name}),r&&n?(0,H.jsxs)(`div`,{className:`text-[11px] text-base-content/60`,children:[n.agents,` agents`]}):(0,H.jsx)(`span`,{className:`badge badge-xs badge-warning`,children:`Not synced`}),b[e.id]&&(0,H.jsx)(`p`,{className:`text-[11px] text-base-content/60 truncate`,children:b[e.id]}),(0,H.jsxs)(`button`,{className:`btn btn-xs btn-outline gap-1 mt-auto`,onClick:()=>N(e.id),disabled:t,children:[t?(0,H.jsx)(D,{className:`size-3 animate-spin`}):(0,H.jsx)(I,{className:`size-3`}),t?`Syncing…`:r?`Re-sync`:`Sync`]})]},e.id)})})]})}),(0,H.jsxs)(`div`,{className:`space-y-2`,children:[(0,H.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,H.jsxs)(`h3`,{className:`font-semibold text-sm flex items-center gap-2`,children:[(0,H.jsx)(h,{className:`size-4 opacity-50`}),`Agents (`,a.length,`)`]}),(0,H.jsxs)(`div`,{className:`flex gap-1`,children:[(0,H.jsx)(`button`,{className:`btn btn-xs btn-ghost`,onClick:ee,children:`Select All`}),(0,H.jsx)(`button`,{className:`btn btn-xs btn-ghost`,onClick:M,children:`None`})]})]}),(0,H.jsxs)(`label`,{className:`input input-bordered input-sm flex items-center gap-2`,children:[(0,H.jsx)(A,{className:`size-4 opacity-60`}),(0,H.jsx)(`input`,{type:`text`,className:`grow`,placeholder:`Search agents...`,value:C,onChange:e=>w(e.target.value)})]}),k.length===0&&a.length>0&&(0,H.jsx)(`div`,{className:`text-sm text-base-content/60`,children:`No agents match your search.`}),(0,H.jsx)(`div`,{className:`space-y-1 pt-1`,children:k.map(t=>{let n=O.has(t.name),r=n||e.includes(t.name);return(0,H.jsx)(`button`,{className:`w-full rounded-md border border-transparent px-2 py-2 text-left transition-all ${n?`opacity-70 bg-base-100/40`:`hover:bg-base-100`} ${r&&!n?`ring-1 ring-primary ring-offset-1 ring-offset-base-200`:``}`,onClick:()=>!n&&j(t.name),disabled:n,children:(0,H.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,H.jsx)(`span`,{className:`mt-0.5 text-base`,children:t.emoji||`🤖`}),(0,H.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,H.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,H.jsx)(`span`,{className:`font-medium text-sm truncate`,children:t.displayName||t.name}),t.source&&(0,H.jsx)(`span`,{className:`badge badge-xs badge-ghost shrink-0`,children:t.source}),n?(0,H.jsxs)(`span`,{className:`badge badge-xs badge-success gap-1 shrink-0`,children:[(0,H.jsx)(p,{className:`size-3`}),` Installed`]}):(0,H.jsx)(`input`,{type:`checkbox`,className:`checkbox checkbox-primary checkbox-sm self-start mt-0.5 shrink-0`,checked:r,readOnly:!0,tabIndex:-1})]}),t.description&&(0,H.jsx)(`p`,{className:`text-xs text-base-content/60 mt-1 truncate`,children:t.description})]})]})},t.name)})})]}),a.length===0&&(0,H.jsx)(`div`,{className:`alert alert-info text-sm`,children:`No agents found in the catalog. Sync a source above or add them later from the settings page.`})]})}var Ee={auto:{bg:null,label:`Auto`},light:{bg:`#ffffff`,accent:`#7c3aed`},dark:{bg:`#1d232a`,accent:`#661ae6`},black:{bg:`#000000`,accent:`#ffffff`},cupcake:{bg:`#faf7f5`,accent:`#ef9fbc`},night:{bg:`#0f172a`,accent:`#38bdf8`},sunset:{bg:`#1a1019`,accent:`#ff865b`}};function De({theme:e,selected:t,onClick:n}){let r=Ee[e.value];return(0,H.jsxs)(`button`,{onClick:n,title:e.label,className:`flex flex-col items-center gap-1.5 group focus:outline-none`,children:[(0,H.jsx)(`div`,{className:`w-10 h-10 rounded-xl border-2 transition-all overflow-hidden flex-shrink-0 ${t?`border-primary ring-2 ring-primary ring-offset-2 ring-offset-base-200 scale-110`:`border-base-300 group-hover:border-base-content/30 group-hover:scale-105`}`,style:r.bg?{background:r.bg}:void 0,children:r.bg?(0,H.jsxs)(`div`,{className:`w-full h-full flex flex-col`,children:[(0,H.jsx)(`div`,{className:`flex-1`,style:{background:r.bg}}),(0,H.jsx)(`div`,{className:`h-3 w-full`,style:{background:r.accent}})]}):(0,H.jsxs)(`div`,{className:`w-full h-full flex`,children:[(0,H.jsx)(`div`,{className:`flex-1 bg-white`}),(0,H.jsx)(`div`,{className:`flex-1 bg-neutral`})]})}),(0,H.jsx)(`span`,{className:`text-xs font-medium transition-colors ${t?`text-primary`:`text-base-content/50 group-hover:text-base-content/80`}`,children:e.label})]})}function Oe({concurrency:e,setConcurrency:t,selectedTheme:n,setSelectedTheme:r}){let i=Number.isFinite(e)?Math.max(1,Math.min(10,e)):1;return(0,H.jsxs)(`div`,{className:`flex flex-col gap-6 stagger-children`,children:[(0,H.jsxs)(`div`,{className:`text-center`,children:[(0,H.jsx)(O,{className:`size-10 text-primary mx-auto mb-3`}),(0,H.jsx)(`h2`,{className:`text-2xl font-bold`,children:`Workers & Theme`}),(0,H.jsx)(`p`,{className:`text-base-content/60 mt-1 text-sm`,children:`Configure parallel workers and visual theme`})]}),(0,H.jsx)(`div`,{className:`card bg-base-200`,children:(0,H.jsxs)(`div`,{className:`card-body p-5 gap-3`,children:[(0,H.jsxs)(`h3`,{className:`font-semibold text-sm flex items-center gap-2`,children:[(0,H.jsx)(O,{className:`size-4 opacity-50`}),`Worker Concurrency`]}),(0,H.jsxs)(`p`,{className:`text-xs text-base-content/60`,children:[`How many agents can work in parallel (`,i,` worker`,i===1?``:`s`,`)`]}),(0,H.jsxs)(`div`,{className:`w-full max-w-xs`,children:[(0,H.jsx)(`input`,{type:`range`,min:1,max:10,step:1,value:i,onChange:e=>t(Math.round(Number(e.target.value))),"aria-label":`Number of parallel workers`,className:`range range-primary range-sm w-full`}),(0,H.jsx)(`div`,{className:`flex justify-between px-2.5 mt-2 text-xs`,children:Array.from({length:10},(e,t)=>(0,H.jsx)(`span`,{children:`|`},t))}),(0,H.jsx)(`div`,{className:`flex justify-between px-2.5 mt-2 text-xs`,children:Array.from({length:10},(e,t)=>(0,H.jsx)(`span`,{children:t+1},t))})]}),(0,H.jsxs)(`p`,{className:`text-xs text-base-content/50 bg-base-100 rounded-lg px-3 py-2 mt-1`,children:[(0,H.jsx)(`span`,{className:`font-medium text-base-content/70`,children:`Tip:`}),` 2–4 workers is recommended for most projects. More workers consume more API quota and may hit rate limits.`]})]})}),(0,H.jsx)(`div`,{className:`card bg-base-200`,children:(0,H.jsxs)(`div`,{className:`card-body p-5 gap-4`,children:[(0,H.jsxs)(`h3`,{className:`font-semibold text-sm flex items-center gap-2`,children:[(0,H.jsx)(M,{className:`size-4 opacity-50`}),`Theme`]}),(0,H.jsx)(`div`,{className:`flex flex-wrap gap-5 justify-center py-1`,children:le.map(e=>(0,H.jsx)(De,{theme:e,selected:n===e.value,onClick:()=>r(e.value)},e.value))})]})})]})}function ke({config:e,launching:t}){return(0,H.jsxs)(`div`,{className:`flex flex-col items-center text-center gap-6 stagger-children py-4`,children:[(0,H.jsx)(`div`,{className:`animate-bounce-in`,children:(0,H.jsx)(j,{className:`size-16 sm:size-20 text-primary mx-auto`})}),(0,H.jsx)(`h2`,{className:`text-2xl sm:text-3xl font-bold`,children:`You're All Set!`}),(0,H.jsx)(`p`,{className:`text-base-content/60 max-w-md`,children:`Here's a summary of your configuration. Hit launch when you're ready.`}),(0,H.jsx)(`div`,{className:`card bg-base-200 w-full max-w-sm`,children:(0,H.jsxs)(`div`,{className:`card-body p-4 gap-2 text-sm text-left`,children:[(0,H.jsxs)(`div`,{className:`flex justify-between gap-4`,children:[(0,H.jsx)(`span`,{className:`text-base-content/60`,children:`Queue title`}),(0,H.jsx)(`span`,{className:`font-semibold text-right break-words`,children:e.queueTitle||`fifony`})]}),(0,H.jsx)(`div`,{className:`divider my-0`}),(0,H.jsxs)(`div`,{className:`flex justify-between`,children:[(0,H.jsx)(`span`,{className:`text-base-content/60`,children:`Pipeline`}),(0,H.jsxs)(`span`,{className:`font-semibold capitalize text-xs font-mono`,children:[e.pipeline?.planner||`?`,` → `,e.pipeline?.executor||`?`,` → `,e.pipeline?.reviewer||`?`]})]}),(0,H.jsx)(`div`,{className:`divider my-0`}),(0,H.jsxs)(`div`,{className:`flex justify-between`,children:[(0,H.jsx)(`span`,{className:`text-base-content/60`,children:`Domains`}),(0,H.jsx)(`span`,{className:`font-semibold`,children:e.domains?.length>0?e.domains.length+` selected`:`none`})]}),(0,H.jsx)(`div`,{className:`divider my-0`}),(0,H.jsxs)(`div`,{className:`flex justify-between`,children:[(0,H.jsx)(`span`,{className:`text-base-content/60`,children:`Agents`}),(0,H.jsxs)(`span`,{className:`font-semibold`,children:[e.agents?.length||0,` to install`]})]}),(0,H.jsx)(`div`,{className:`divider my-0`}),(0,H.jsxs)(`div`,{className:`flex justify-between`,children:[(0,H.jsx)(`span`,{className:`text-base-content/60`,children:`Skills`}),(0,H.jsxs)(`span`,{className:`font-semibold`,children:[e.skills?.length||0,` to install`]})]}),(0,H.jsx)(`div`,{className:`divider my-0`}),(0,H.jsxs)(`div`,{className:`flex justify-between`,children:[(0,H.jsx)(`span`,{className:`text-base-content/60`,children:`Plan`}),(0,H.jsx)(`span`,{className:`font-semibold capitalize`,children:e.efforts.planner})]}),(0,H.jsx)(`div`,{className:`divider my-0`}),(0,H.jsxs)(`div`,{className:`flex justify-between`,children:[(0,H.jsx)(`span`,{className:`text-base-content/60`,children:`Execute`}),(0,H.jsx)(`span`,{className:`font-semibold capitalize`,children:e.efforts.executor})]}),(0,H.jsx)(`div`,{className:`divider my-0`}),(0,H.jsxs)(`div`,{className:`flex justify-between`,children:[(0,H.jsx)(`span`,{className:`text-base-content/60`,children:`Review`}),(0,H.jsx)(`span`,{className:`font-semibold capitalize`,children:e.efforts.reviewer})]}),(0,H.jsx)(`div`,{className:`divider my-0`}),(0,H.jsxs)(`div`,{className:`flex justify-between`,children:[(0,H.jsx)(`span`,{className:`text-base-content/60`,children:`Workers`}),(0,H.jsx)(`span`,{className:`font-semibold`,children:e.concurrency})]}),(0,H.jsx)(`div`,{className:`divider my-0`}),(0,H.jsxs)(`div`,{className:`flex justify-between`,children:[(0,H.jsx)(`span`,{className:`text-base-content/60`,children:`Theme`}),(0,H.jsx)(`span`,{className:`font-semibold capitalize`,children:e.theme})]})]})}),t&&(0,H.jsxs)(`div`,{className:`flex items-center gap-2 text-sm text-base-content/50`,children:[(0,H.jsx)(D,{className:`size-4 animate-spin`}),`Saving configuration & installing agents...`]})]})}function Ae({onComplete:e}){let t=r(),n=E(),a=m(n.data),[s,c]=(0,V.useState)(0),[l,u]=(0,V.useState)(`forward`),[p,h]=(0,V.useState)(!1),[g,_]=(0,V.useState)(null),v=(0,V.useRef)(!1),y=(0,V.useRef)(!1),[b,x]=(0,V.useState)({planner:``,executor:``,reviewer:``}),[S,D]=(0,V.useState)(()=>ue(null)),[O,k]=(0,V.useState)(3),[A,j]=(0,V.useState)(`auto`),[ee,M]=(0,V.useState)(``),[N,P]=(0,V.useState)(`missing`),[te,F]=(0,V.useState)(null),[I,R]=(0,V.useState)(null),[z,re]=(0,V.useState)([]),[B,ae]=(0,V.useState)([]),[U,ce]=(0,V.useState)(`local`),[W,G]=(0,V.useState)(``),[K,le]=(0,V.useState)(``),[q,Y]=(0,V.useState)(!0),X=se(),Z=oe()[s]||``,[_e,ve]=(0,V.useState)(null),[ye,be]=(0,V.useState)(!1),[xe,Ce]=(0,V.useState)({}),[Q,Ee]=(0,V.useState)({plan:``,execute:``,review:``}),[De,Ae]=(0,V.useState)(``),[je,Me]=(0,V.useState)(``);(0,V.useEffect)(()=>{i.get(`/state`).then(e=>{R(e||{}),Ae(e?.sourceRepoUrl||e?.config?.sourceRepo||``),Me(e?.config?.defaultBranch||``)}).catch(()=>{R({})})},[]),(0,V.useEffect)(()=>{if(v.current||n.isLoading)return;v.current=!0;let e=d(a,`runtime.pipeline`,null),t=d(a,`runtime.workflowConfig`,null),r=d(a,`runtime.defaultEffort`,null),i=d(a,`ui.theme`,`auto`),o=d(a,`runtime.workerConcurrency`,3);if(Array.isArray(e)&&e.length>0){let t=Object.fromEntries(e.map(e=>[e.role,e.provider]));x({planner:t.planner||``,executor:t.executor||``,reviewer:t.reviewer||``})}t&&typeof t==`object`&&Ee({plan:t.plan?.model||``,execute:t.execute?.model||``,review:t.review?.model||``}),D(ue(r)),typeof i==`string`&&i.trim()&&j(i);let s=Number.parseInt(String(o??2),10);Number.isFinite(s)&&k(Math.min(10,Math.max(1,s)));let c=d(a,`runtime.autoReviewApproval`,!0);typeof c==`boolean`&&Y(c);let l=d(a,`runtime.mergeMode`,`local`);(l===`local`||l===`push-pr`)&&ce(l);let u=d(a,`runtime.prBaseBranch`,``);typeof u==`string`&&G(u);let f=d(a,`runtime.testCommand`,``);typeof f==`string`&&le(f)},[a,n.isLoading]),(0,V.useEffect)(()=>{if(y.current||n.isLoading||I===null)return;y.current=!0;let e=w(a,I);M(e.projectName),P(e.source)},[I,a,n.isLoading]);let Ne=(0,V.useCallback)(e=>{M(e),P(`manual`)},[]),$=C(ee),Pe=f($);(0,V.useEffect)(()=>{document.title=f($||I?.detectedProjectName||I?.projectName||``)},[$,I]),(0,V.useEffect)(()=>{s>=1&&_e===null&&(be(!0),Promise.all([i.get(`/providers`),i.get(`/config/workflow?details=1`).catch(()=>null)]).then(([e,t])=>{let n=Array.isArray(e)?e:e?.providers||[];ve(n);let r=t?.models||{};Ce(r);let i=n.filter(e=>e.available!==!1),a=i[0]?.id||i[0]?.name||``,o=i.find(e=>(e.id||e.name)===`claude`),s=a,c=o?`claude`:s,l={planner:c,executor:s,reviewer:c};x(e=>({planner:e.planner||l.planner,executor:e.executor||l.executor,reviewer:e.reviewer||l.reviewer})),Ee(e=>({plan:e.plan||r[c]?.[0]?.id||``,execute:e.execute||r[s]?.[0]?.id||``,review:e.review||r[c]?.[0]?.id||``}))}).catch(()=>{ve([])}).finally(()=>{be(!1)}))},[s,_e]),(0,V.useEffect)(()=>{let e=A===`auto`?window.matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`:A;document.documentElement.setAttribute(`data-theme`,e)},[A]);let Fe=(0,V.useCallback)(e=>{if(e===`Setup`)$&&J(o,$,`system`).catch(()=>{}),J(`runtime.mergeMode`,U,`runtime`).catch(()=>{}),U===`push-pr`&&W.trim()&&J(`runtime.prBaseBranch`,W.trim(),`runtime`).catch(()=>{}),J(`runtime.autoReviewApproval`,q,`runtime`).catch(()=>{}),K.trim()&&J(`runtime.testCommand`,K.trim(),`runtime`).catch(()=>{});else if(e===`Pipeline`){let e=[{provider:b.planner,role:`planner`},{provider:b.executor,role:`executor`},{provider:b.reviewer,role:`reviewer`}];J(`runtime.agentProvider`,b.executor,`runtime`).catch(()=>{}),J(`runtime.pipeline`,e,`runtime`).catch(()=>{}),J(`runtime.defaultEffort`,S,`runtime`).catch(()=>{}),J(`runtime.workflowConfig`,de(b,S,Q),`runtime`).catch(()=>{})}else e===`Preferences`&&(J(`ui.theme`,A,`ui`).catch(()=>{}),i.post(`/config/concurrency`,{concurrency:O}).catch(()=>{}))},[b,S,Q,O,A,$,U,W,K,q]),Ie=(0,V.useCallback)(()=>{s<X-1&&(Fe(Z),u(`forward`),c(e=>e+1))},[s,X,Z,Fe]),Le=(0,V.useCallback)(()=>{s>0&&(u(`backward`),c(e=>e-1))},[s]),Re=(0,V.useCallback)(async()=>{if($){h(!0);try{let n=[J(o,$,`system`),J(`ui.theme`,A,`ui`),J(`ui.onboarding.completed`,!0,`ui`)],r=[{provider:b.planner,role:`planner`},{provider:b.executor,role:`executor`},{provider:b.reviewer,role:`reviewer`}];n.push(J(`runtime.agentProvider`,b.executor,`runtime`)),n.push(J(`runtime.pipeline`,r,`runtime`)),n.push(J(`runtime.defaultEffort`,S,`runtime`)),n.push(J(`runtime.workflowConfig`,de(b,S,Q),`runtime`)),n.push(i.post(`/config/concurrency`,{concurrency:O})),n.push(J(`runtime.mergeMode`,U,`runtime`)),n.push(J(`runtime.autoReviewApproval`,q,`runtime`)),U===`push-pr`&&W.trim()&&n.push(J(`runtime.prBaseBranch`,W.trim(),`runtime`)),K.trim()&&n.push(J(`runtime.testCommand`,K.trim(),`runtime`)),z.length>0&&n.push(i.post(`/install/agents`,{agents:z})),B.length>0&&n.push(i.post(`/install/skills`,{skills:B})),await Promise.allSettled(n),t.setQueryData(T,e=>L(e,{id:o,scope:`system`,value:$,source:`user`,updatedAt:new Date().toISOString()})),t.setQueryData(T,e=>L(e,{id:`ui.onboarding.completed`,scope:`ui`,value:!0,source:`user`,updatedAt:new Date().toISOString()})),_({x:window.innerWidth/2,y:window.innerHeight/3}),setTimeout(()=>{t.invalidateQueries({queryKey:T}),e?.()},1200)}catch{t.setQueryData(T,e=>L(e,{id:o,scope:`system`,value:$,source:`user`,updatedAt:new Date().toISOString()})),t.setQueryData(T,e=>L(e,{id:`ui.onboarding.completed`,scope:`ui`,value:!0,source:`user`,updatedAt:new Date().toISOString()})),await J(`ui.onboarding.completed`,!0,`ui`).catch(()=>{}),t.invalidateQueries({queryKey:T}),e?.()}}},[$,b,S,Q,O,A,z,B,U,W,K,q,t,e]),ze=Z===`Welcome`||Z===`Setup`&&fe($,te)||Z===`Pipeline`&&(b.executor||ye)||Z===`Agents & Skills`||Z===`Preferences`||Z===`Launch`,Be=[],Ve=[],He={projectName:$,queueTitle:Pe,pipeline:b,efforts:S,concurrency:O,theme:A,agents:z,skills:B};return(0,H.jsxs)(`div`,{className:`fixed inset-0 z-50 bg-base-100 flex flex-col overflow-hidden`,children:[s===0&&(0,H.jsx)(ie,{}),g&&(0,H.jsx)(ne,{x:g.x,y:g.y,active:!0,onDone:()=>_(null)}),s>0&&(0,H.jsx)(`div`,{className:`relative z-10 pt-6 pb-2 px-4 flex justify-center`,children:(0,H.jsx)(pe,{current:s})}),(0,H.jsx)(`div`,{className:`relative z-10 flex-1 flex flex-col items-center justify-start px-4 py-6 overflow-y-auto`,children:(0,H.jsxs)(me,{direction:l,stepKey:s,center:Z===`Welcome`||Z===`Setup`||Z===`Pipeline`||Z===`Launch`,children:[Z===`Welcome`&&(0,H.jsx)(ge,{workspacePath:De,onGetStarted:Ie}),Z===`Setup`&&(0,H.jsx)(Se,{projectName:ee,setProjectName:Ne,detectedProjectName:I?.detectedProjectName||``,projectSource:N,workspacePath:De,currentBranch:je,onGitStatusChange:F,onBranchCreated:e=>{Me(e),W||G(e)},mergeMode:U,setMergeMode:ce,prBaseBranch:W,setPrBaseBranch:G,autoReviewApproval:q,setAutoReviewApproval:Y,testCommand:K,setTestCommand:le}),Z===`Pipeline`&&(0,H.jsx)(we,{providers:_e||[],providersLoading:ye,pipeline:b,setPipeline:x,efforts:S,setEfforts:D,models:Q,setModels:Ee,modelsByProvider:xe}),Z===`Agents & Skills`&&(0,H.jsx)(Te,{selectedAgents:z,setSelectedAgents:re,selectedSkills:B,setSelectedSkills:ae,existingAgents:Be,existingSkills:Ve}),Z===`Preferences`&&(0,H.jsx)(Oe,{concurrency:O,setConcurrency:k,selectedTheme:A,setSelectedTheme:j}),Z===`Launch`&&(0,H.jsx)(ke,{config:He,launching:p})]})}),(0,H.jsx)(he,{step:s,stepCount:X,stepName:Z,canProceed:ze,launching:p,onBack:Le,onNext:Ie,onLaunch:Re})]})}export{Ae as default};