fifony 0.1.40 → 0.1.42

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 (33) hide show
  1. package/README.md +12 -11
  2. package/app/dist/assets/{CommandPalette-dMSFpGLm.js → CommandPalette-DNR5umI1.js} +1 -1
  3. package/app/dist/assets/{KeyboardShortcutsHelp-CH5aYlDe.js → KeyboardShortcutsHelp-Dpl19F20.js} +1 -1
  4. package/app/dist/assets/OnboardingWizard-CijMhJDW.js +1 -0
  5. package/app/dist/assets/analytics.lazy-Dq90a756.js +1 -0
  6. package/app/dist/assets/index-Dy_fM427.js +54 -0
  7. package/app/dist/assets/{index-BatA8x-K.css → index-Q9jBP0Pz.css} +1 -1
  8. package/app/dist/index.html +2 -2
  9. package/app/dist/service-worker.js +53 -2
  10. package/dist/agent/run-local.js +25 -9
  11. package/dist/{agent-KDPOZCI5.js → agent-NNGZEKZH.js} +8 -7
  12. package/dist/{chunk-EPY5TTQK.js → chunk-2CVTK5F2.js} +6 -6
  13. package/dist/{chunk-UXXUTDGV.js → chunk-H5N7O5NP.js} +33 -17
  14. package/dist/chunk-I2UHVKHS.js +104 -0
  15. package/dist/{chunk-LYAI5RPK.js → chunk-JTKUWIQD.js} +3634 -3453
  16. package/dist/{chunk-O3FGX4J6.js → chunk-NB44PCD2.js} +115 -24
  17. package/dist/{chunk-3QL4QAQ5.js → chunk-RBDBGU2C.js} +14 -14
  18. package/dist/cli.js +7 -6
  19. package/dist/issue-runner-CMZPSVC7.js +16 -0
  20. package/dist/{issue-state-machine-KOZE5JWX.js → issue-state-machine-GPQNZYUZ.js} +5 -5
  21. package/dist/{issues-7HQC7OIN.js → issues-MZLRSXD6.js} +8 -7
  22. package/dist/mcp/server.js +1 -1
  23. package/dist/{queue-workers-ZEZHDX7M.js → queue-workers-XZ6DGH4W.js} +3 -3
  24. package/dist/{scheduler-4R4ZAF25.js → scheduler-NVE6L3P7.js} +8 -7
  25. package/dist/settings-NGY33WQE.js +74 -0
  26. package/dist/{store-FNUWCFOX.js → store-4HCGBN4L.js} +8 -7
  27. package/dist/web-push-CRVDJKWR.js +28 -0
  28. package/dist/{workspace-AOHHNWL5.js → workspace-D3F3XGSI.js} +8 -4
  29. package/package.json +6 -2
  30. package/app/dist/assets/OnboardingWizard-CdJHsRny.js +0 -1
  31. package/app/dist/assets/analytics.lazy-CKu4136R.js +0 -1
  32. package/app/dist/assets/index-C13WwYFD.js +0 -54
  33. package/dist/issue-runner-YZM6WQMY.js +0 -15
@@ -1,18 +1,18 @@
1
- import {
2
- logger
3
- } from "./chunk-DVU3CXWA.js";
4
1
  import {
5
2
  appendFileTail,
6
3
  idToSafePath,
7
4
  now,
8
5
  renderPrompt
9
- } from "./chunk-EPY5TTQK.js";
6
+ } from "./chunk-2CVTK5F2.js";
10
7
  import {
11
8
  SOURCE_MARKER,
12
9
  SOURCE_ROOT,
13
10
  TARGET_ROOT,
14
11
  WORKSPACE_ROOT
15
12
  } from "./chunk-37N5OFHM.js";
13
+ import {
14
+ logger
15
+ } from "./chunk-DVU3CXWA.js";
16
16
 
17
17
  // src/domains/workspace.ts
18
18
  import {
@@ -263,8 +263,15 @@ function buildExecutionPayload(issue, provider, plan, workspacePath) {
263
263
  mitigation: r.mitigation || ""
264
264
  })),
265
265
  tooling: {
266
- skills: plan.suggestedSkills || [],
267
- agents: plan.suggestedAgents || []
266
+ skills: (plan.suggestedSkills || []).map((name) => ({
267
+ name,
268
+ why: "Suggested by the planner for this issue."
269
+ })),
270
+ subagents: (plan.suggestedAgents || []).map((name) => ({
271
+ name,
272
+ role: "specialist",
273
+ why: "Suggested by the planner for parallel or specialized work."
274
+ }))
268
275
  },
269
276
  targetPaths: plan.suggestedPaths || [],
270
277
  workspacePath,
@@ -837,7 +844,7 @@ var collectClaudeUsageFromCli = () => collectProviderUsageSnapshotFromCli("claud
837
844
  "--dangerously-skip-permissions"
838
845
  ]);
839
846
  function buildClaudeCommand(options) {
840
- const parts = ["claude", "--print", "--bare"];
847
+ const parts = ["claude", "--print"];
841
848
  if (options.readOnly) {
842
849
  parts.push("--permission-mode plan");
843
850
  } else if (!options.noToolAccess) {
@@ -901,7 +908,7 @@ async function compile(issue, provider, plan, config, workspacePath, skillContex
901
908
  const env3 = {
902
909
  FIFONY_PLAN_COMPLEXITY: plan.estimatedComplexity,
903
910
  FIFONY_PLAN_STEPS: String(plan.steps.length),
904
- FIFONY_EXECUTION_PAYLOAD_FILE: "fifony-execution-payload.json"
911
+ FIFONY_EXECUTION_PAYLOAD_FILE: "execution-payload.json"
905
912
  };
906
913
  if (plan.suggestedPaths?.length) env3.FIFONY_PLAN_PATHS = plan.suggestedPaths.join(",");
907
914
  if (plan.suggestedSkills?.length) {
@@ -1455,6 +1462,27 @@ function getEffectiveAgentProviders(state, issue, _workflowDefinition, workflowC
1455
1462
  }
1456
1463
 
1457
1464
  // src/agents/command-executor.ts
1465
+ var HOOK_RUNTIME_CONFIG = {
1466
+ pollIntervalMs: 0,
1467
+ workerConcurrency: 1,
1468
+ maxConcurrentByState: {},
1469
+ commandTimeoutMs: 18e5,
1470
+ maxAttemptsDefault: 1,
1471
+ maxTurns: 1,
1472
+ retryDelayMs: 0,
1473
+ staleInProgressTimeoutMs: 0,
1474
+ logLinesTail: 12e3,
1475
+ maxPreviousOutputChars: 12e3,
1476
+ agentProvider: "codex",
1477
+ agentCommand: "",
1478
+ defaultEffort: { default: "medium" },
1479
+ runMode: "filesystem",
1480
+ autoReviewApproval: true,
1481
+ afterCreateHook: "",
1482
+ beforeRunHook: "",
1483
+ afterRunHook: "",
1484
+ beforeRemoveHook: ""
1485
+ };
1458
1486
  async function runCommandWithTimeout(command, workspacePath, issue, config, promptText, promptFile, extraEnv = {}, outputFile) {
1459
1487
  return new Promise((resolve2) => {
1460
1488
  const started = Date.now();
@@ -1542,7 +1570,7 @@ async function runCommandWithTimeout(command, workspacePath, issue, config, prom
1542
1570
  };
1543
1571
  child.stdout?.on("data", onChunk);
1544
1572
  child.stderr?.on("data", onChunk);
1545
- const AGENT_STALE_OUTPUT_MS = 3e5;
1573
+ const AGENT_STALE_OUTPUT_MS = 18e5;
1546
1574
  const timer = setTimeout(() => {
1547
1575
  timedOut = true;
1548
1576
  if (pid) {
@@ -1639,19 +1667,9 @@ Command exit code ${code ?? "unknown"} after ${duration}ms.`) });
1639
1667
  async function runHook(command, workspacePath, issue, hookName, extraEnv = {}) {
1640
1668
  if (!command.trim()) return;
1641
1669
  const result = await runCommandWithTimeout(command, workspacePath, issue, {
1642
- pollIntervalMs: 0,
1643
- workerConcurrency: 1,
1644
- maxConcurrentByState: {},
1645
- commandTimeoutMs: 3e5,
1646
- maxAttemptsDefault: 1,
1647
- retryDelayMs: 0,
1648
- staleInProgressTimeoutMs: 0,
1649
- logLinesTail: 12e3,
1670
+ ...HOOK_RUNTIME_CONFIG,
1650
1671
  agentProvider: normalizeAgentProvider(env2.FIFONY_AGENT_PROVIDER ?? "codex"),
1651
- agentCommand: command,
1652
- maxTurns: 1,
1653
- runMode: "filesystem",
1654
- autoReviewApproval: true
1672
+ agentCommand: command
1655
1673
  }, "", "", { FIFONY_HOOK_NAME: hookName, ...extraEnv });
1656
1674
  if (!result.success) {
1657
1675
  throw new Error(`${hookName} hook failed: ${result.output}`);
@@ -1986,6 +2004,69 @@ function copyCliConfigDirs(sourceRoot, worktreePath) {
1986
2004
  }
1987
2005
  }
1988
2006
  }
2007
+ function isGitWorkingTree(dir) {
2008
+ try {
2009
+ execSync("git rev-parse --git-dir", { cwd: dir, stdio: "pipe", timeout: 5e3 });
2010
+ return true;
2011
+ } catch {
2012
+ return false;
2013
+ }
2014
+ }
2015
+ function resolveTestWorkspacePath(issue) {
2016
+ const workspaceRoot = issue.workspacePath ?? join7(WORKSPACE_ROOT, idToSafePath(issue.id));
2017
+ return join7(workspaceRoot, "test-worktree");
2018
+ }
2019
+ function createTestWorkspace(issue) {
2020
+ ensureGitRepoReadyForWorktrees(TARGET_ROOT, "create isolated test workspaces");
2021
+ assertIssueHasGitWorktree(issue, "create a test workspace");
2022
+ const workspaceRoot = issue.workspacePath ?? join7(WORKSPACE_ROOT, idToSafePath(issue.id));
2023
+ const testWorkspacePath = issue.testWorkspacePath ?? resolveTestWorkspacePath(issue);
2024
+ mkdirSync(workspaceRoot, { recursive: true });
2025
+ if (existsSync7(testWorkspacePath)) {
2026
+ if (isGitWorkingTree(testWorkspacePath)) {
2027
+ issue.testWorkspacePath = testWorkspacePath;
2028
+ issue.testApplied = true;
2029
+ return testWorkspacePath;
2030
+ }
2031
+ rmSync2(testWorkspacePath, { recursive: true, force: true });
2032
+ }
2033
+ try {
2034
+ execSync(`git worktree add --detach "${testWorkspacePath}" "${issue.branchName}"`, {
2035
+ cwd: TARGET_ROOT,
2036
+ stdio: "pipe",
2037
+ timeout: 3e4
2038
+ });
2039
+ } catch (err) {
2040
+ const msg = err.stderr || err.stdout || String(err);
2041
+ throw new Error(`Failed to create isolated test workspace: ${msg}`);
2042
+ }
2043
+ copyCliConfigDirs(TARGET_ROOT, testWorkspacePath);
2044
+ issue.testWorkspacePath = testWorkspacePath;
2045
+ issue.testApplied = true;
2046
+ return testWorkspacePath;
2047
+ }
2048
+ function removeTestWorkspace(issue) {
2049
+ const testWorkspacePath = issue.testWorkspacePath;
2050
+ issue.testApplied = false;
2051
+ issue.testWorkspacePath = void 0;
2052
+ if (!testWorkspacePath) return;
2053
+ try {
2054
+ execSync(`git worktree remove --force "${testWorkspacePath}"`, {
2055
+ cwd: TARGET_ROOT,
2056
+ stdio: "pipe",
2057
+ timeout: 3e4
2058
+ });
2059
+ logger.info({ issueId: issue.id, testWorkspacePath }, "[Workspace] Removed isolated test workspace");
2060
+ return;
2061
+ } catch (error) {
2062
+ logger.warn({ issueId: issue.id, testWorkspacePath, err: String(error) }, "[Workspace] Failed to remove isolated test workspace via git worktree");
2063
+ }
2064
+ try {
2065
+ rmSync2(testWorkspacePath, { recursive: true, force: true });
2066
+ } catch (error) {
2067
+ logger.warn({ issueId: issue.id, testWorkspacePath, err: String(error) }, "[Workspace] Failed to remove isolated test workspace directory");
2068
+ }
2069
+ }
1989
2070
  async function createGitWorktree(issue, worktreePath, baseBranch) {
1990
2071
  let headCommitAtStart = "";
1991
2072
  const resolvedBaseBranch = baseBranch ?? detectDefaultBranch(TARGET_ROOT);
@@ -2056,6 +2137,9 @@ async function cleanWorkspace(issueId, issue, state) {
2056
2137
  logger.warn(`before_remove hook failed for ${issueId}: ${String(error)}`);
2057
2138
  }
2058
2139
  }
2140
+ if (issue?.testWorkspacePath) {
2141
+ removeTestWorkspace(issue);
2142
+ }
2059
2143
  if (issue?.branchName && issue.worktreePath) {
2060
2144
  try {
2061
2145
  execSync(`git worktree remove --force "${issue.worktreePath}"`, { cwd: TARGET_ROOT, stdio: "pipe" });
@@ -2130,7 +2214,7 @@ function parseDiffStats(issue, raw) {
2130
2214
  }
2131
2215
  async function syncIssueDiffStatsToStore(issue) {
2132
2216
  if (!issue?.id) return;
2133
- const { getIssueStateResource } = await import("./store-FNUWCFOX.js");
2217
+ const { getIssueStateResource } = await import("./store-4HCGBN4L.js");
2134
2218
  const issueResource = getIssueStateResource();
2135
2219
  if (!issueResource) return;
2136
2220
  const toNumber = (value) => {
@@ -2296,8 +2380,13 @@ function dryMerge(issue) {
2296
2380
  execSync("git merge --abort", { cwd: TARGET_ROOT, stdio: "pipe" });
2297
2381
  } catch {
2298
2382
  try {
2299
- execSync("git reset --hard HEAD", { cwd: TARGET_ROOT, stdio: "pipe" });
2383
+ execSync("git reset --merge ORIG_HEAD", { cwd: TARGET_ROOT, stdio: "pipe" });
2300
2384
  } catch {
2385
+ try {
2386
+ execSync("git reset --merge", { cwd: TARGET_ROOT, stdio: "pipe" });
2387
+ } catch (error) {
2388
+ logger.warn({ issueId: issue.id, err: String(error) }, "[Workspace] Failed to safely clean dry-merge state");
2389
+ }
2301
2390
  }
2302
2391
  }
2303
2392
  let changedFiles = 0;
@@ -2382,6 +2471,8 @@ export {
2382
2471
  initializeGitRepoForWorktrees,
2383
2472
  assertIssueHasGitWorktree,
2384
2473
  detectDefaultBranch,
2474
+ createTestWorkspace,
2475
+ removeTestWorkspace,
2385
2476
  createGitWorktree,
2386
2477
  prepareWorkspace,
2387
2478
  cleanWorkspace,
@@ -2397,4 +2488,4 @@ export {
2397
2488
  hydrateIssuePathsFromWorkspace,
2398
2489
  writeVersionedArtifacts
2399
2490
  };
2400
- //# sourceMappingURL=chunk-O3FGX4J6.js.map
2491
+ //# sourceMappingURL=chunk-NB44PCD2.js.map
@@ -1,9 +1,9 @@
1
- import {
2
- logger
3
- } from "./chunk-DVU3CXWA.js";
4
1
  import {
5
2
  TERMINAL_STATES
6
3
  } from "./chunk-37N5OFHM.js";
4
+ import {
5
+ logger
6
+ } from "./chunk-DVU3CXWA.js";
7
7
 
8
8
  // src/persistence/plugins/queue-workers.ts
9
9
  var PHASE_ORDER = { review: 0, execute: 1, plan: 2 };
@@ -26,7 +26,7 @@ async function initQueueWorkers(state) {
26
26
  }, 3e4);
27
27
  persistInterval = setInterval(() => {
28
28
  if (!active || !runtimeState) return;
29
- import("./store-FNUWCFOX.js").then(
29
+ import("./store-4HCGBN4L.js").then(
30
30
  ({ persistState }) => persistState(runtimeState).catch(() => {
31
31
  })
32
32
  ).catch(() => {
@@ -116,11 +116,11 @@ function sortQueue() {
116
116
  }
117
117
  async function dispatchPlan(issue) {
118
118
  logger.info({ issueId: issue.id, identifier: issue.identifier }, "[Queue] Dispatching plan job");
119
- const { runPlanningJob } = await import("./issue-runner-YZM6WQMY.js");
119
+ const { runPlanningJob } = await import("./issue-runner-CMZPSVC7.js");
120
120
  await runPlanningJob(runtimeState, issue);
121
121
  }
122
122
  async function dispatchExecute(issue) {
123
- const { runIssueOnce } = await import("./issue-runner-YZM6WQMY.js");
123
+ const { runIssueOnce } = await import("./issue-runner-CMZPSVC7.js");
124
124
  while (active && runtimeState) {
125
125
  const current = getCurrentIssue(issue.id);
126
126
  if (!current || current.state !== "Queued" && current.state !== "Running") break;
@@ -130,12 +130,12 @@ async function dispatchExecute(issue) {
130
130
  }
131
131
  async function dispatchReview(issue) {
132
132
  logger.info({ issueId: issue.id, identifier: issue.identifier }, "[Queue] Dispatching review job");
133
- const { runIssueOnce } = await import("./issue-runner-YZM6WQMY.js");
133
+ const { runIssueOnce } = await import("./issue-runner-CMZPSVC7.js");
134
134
  await runIssueOnce(runtimeState, issue, running);
135
135
  }
136
136
  async function checkStaleIssues() {
137
137
  if (!runtimeState) return;
138
- const { ensureNotStale } = await import("./scheduler-4R4ZAF25.js");
138
+ const { ensureNotStale } = await import("./scheduler-NVE6L3P7.js");
139
139
  await ensureNotStale(runtimeState, runtimeState.config.staleInProgressTimeoutMs);
140
140
  }
141
141
  var draining = false;
@@ -188,7 +188,7 @@ async function enqueue(issue, job) {
188
188
  async function recoverState() {
189
189
  if (!runtimeState) return;
190
190
  try {
191
- const { getIssueStateMachinePlugin, ISSUE_STATE_MACHINE_ID } = await import("./issue-state-machine-KOZE5JWX.js");
191
+ const { getIssueStateMachinePlugin, ISSUE_STATE_MACHINE_ID } = await import("./issue-state-machine-GPQNZYUZ.js");
192
192
  const fsmPlugin = getIssueStateMachinePlugin();
193
193
  if (fsmPlugin?.getState) {
194
194
  for (const issue of runtimeState.issues) {
@@ -226,9 +226,9 @@ async function recoverState() {
226
226
  }
227
227
  async function recoverOrphans() {
228
228
  if (!runtimeState) return;
229
- const { isAgentStillRunning, cleanStalePidFile } = await import("./agent-KDPOZCI5.js");
230
- const { executeTransition } = await import("./issue-state-machine-KOZE5JWX.js");
231
- const { addEvent } = await import("./issues-7HQC7OIN.js");
229
+ const { isAgentStillRunning, cleanStalePidFile } = await import("./agent-NNGZEKZH.js");
230
+ const { executeTransition } = await import("./issue-state-machine-GPQNZYUZ.js");
231
+ const { addEvent } = await import("./issues-MZLRSXD6.js");
232
232
  const candidates = runtimeState.issues.filter((i) => i.state === "Running" || i.state === "Queued");
233
233
  logger.debug({ count: candidates.length }, "[Queue] Checking for orphaned agent processes");
234
234
  for (const issue of candidates) {
@@ -266,7 +266,7 @@ function cleanTerminalWorkspaces() {
266
266
  logger.info({ count: terminals.length }, "[Queue] Scheduling terminal workspace cleanup in background");
267
267
  const state = runtimeState;
268
268
  setImmediate(async () => {
269
- const { cleanWorkspace } = await import("./agent-KDPOZCI5.js");
269
+ const { cleanWorkspace } = await import("./agent-NNGZEKZH.js");
270
270
  for (const issue of terminals) {
271
271
  try {
272
272
  await cleanWorkspace(issue.id, issue, state);
@@ -300,4 +300,4 @@ export {
300
300
  cleanTerminalWorkspaces,
301
301
  getQueueStats
302
302
  };
303
- //# sourceMappingURL=chunk-3QL4QAQ5.js.map
303
+ //# sourceMappingURL=chunk-RBDBGU2C.js.map
package/dist/cli.js CHANGED
@@ -3,13 +3,14 @@ import {
3
3
  importReferenceArtifacts,
4
4
  listReferenceRepositories,
5
5
  syncReferenceRepositories
6
- } from "./chunk-LYAI5RPK.js";
7
- import "./chunk-3QL4QAQ5.js";
8
- import "./chunk-UXXUTDGV.js";
9
- import "./chunk-O3FGX4J6.js";
10
- import "./chunk-DVU3CXWA.js";
11
- import "./chunk-EPY5TTQK.js";
6
+ } from "./chunk-JTKUWIQD.js";
7
+ import "./chunk-RBDBGU2C.js";
8
+ import "./chunk-I2UHVKHS.js";
9
+ import "./chunk-H5N7O5NP.js";
10
+ import "./chunk-NB44PCD2.js";
11
+ import "./chunk-2CVTK5F2.js";
12
12
  import "./chunk-37N5OFHM.js";
13
+ import "./chunk-DVU3CXWA.js";
13
14
 
14
15
  // src/cli.ts
15
16
  import { spawn } from "child_process";
@@ -0,0 +1,16 @@
1
+ import {
2
+ runIssueOnce,
3
+ runPlanningJob
4
+ } from "./chunk-JTKUWIQD.js";
5
+ import "./chunk-RBDBGU2C.js";
6
+ import "./chunk-I2UHVKHS.js";
7
+ import "./chunk-H5N7O5NP.js";
8
+ import "./chunk-NB44PCD2.js";
9
+ import "./chunk-2CVTK5F2.js";
10
+ import "./chunk-37N5OFHM.js";
11
+ import "./chunk-DVU3CXWA.js";
12
+ export {
13
+ runIssueOnce,
14
+ runPlanningJob
15
+ };
16
+ //# sourceMappingURL=issue-runner-CMZPSVC7.js.map
@@ -16,11 +16,11 @@ import {
16
16
  setIssueResourceStateApi,
17
17
  setIssueStateMachinePlugin,
18
18
  visualizeStateMachine
19
- } from "./chunk-UXXUTDGV.js";
20
- import "./chunk-O3FGX4J6.js";
21
- import "./chunk-DVU3CXWA.js";
22
- import "./chunk-EPY5TTQK.js";
19
+ } from "./chunk-H5N7O5NP.js";
20
+ import "./chunk-NB44PCD2.js";
21
+ import "./chunk-2CVTK5F2.js";
23
22
  import "./chunk-37N5OFHM.js";
23
+ import "./chunk-DVU3CXWA.js";
24
24
  export {
25
25
  ISSUE_STATE_MACHINE_ID,
26
26
  canTransitionIssue,
@@ -40,4 +40,4 @@ export {
40
40
  setIssueStateMachinePlugin,
41
41
  visualizeStateMachine
42
42
  };
43
- //# sourceMappingURL=issue-state-machine-KOZE5JWX.js.map
43
+ //# sourceMappingURL=issue-state-machine-GPQNZYUZ.js.map
@@ -11,15 +11,16 @@ import {
11
11
  normalizeIssue,
12
12
  transitionIssue,
13
13
  validateConfig
14
- } from "./chunk-LYAI5RPK.js";
15
- import "./chunk-3QL4QAQ5.js";
14
+ } from "./chunk-JTKUWIQD.js";
15
+ import "./chunk-RBDBGU2C.js";
16
+ import "./chunk-I2UHVKHS.js";
16
17
  import {
17
18
  computeMetrics
18
- } from "./chunk-UXXUTDGV.js";
19
- import "./chunk-O3FGX4J6.js";
20
- import "./chunk-DVU3CXWA.js";
21
- import "./chunk-EPY5TTQK.js";
19
+ } from "./chunk-H5N7O5NP.js";
20
+ import "./chunk-NB44PCD2.js";
21
+ import "./chunk-2CVTK5F2.js";
22
22
  import "./chunk-37N5OFHM.js";
23
+ import "./chunk-DVU3CXWA.js";
23
24
  export {
24
25
  addEvent,
25
26
  applyWorkflowConfig,
@@ -35,4 +36,4 @@ export {
35
36
  transitionIssue,
36
37
  validateConfig
37
38
  };
38
- //# sourceMappingURL=issues-7HQC7OIN.js.map
39
+ //# sourceMappingURL=issues-MZLRSXD6.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  parseIssueState,
3
3
  renderPrompt
4
- } from "../chunk-EPY5TTQK.js";
4
+ } from "../chunk-2CVTK5F2.js";
5
5
  import "../chunk-37N5OFHM.js";
6
6
 
7
7
  // src/mcp/server.ts
@@ -7,9 +7,9 @@ import {
7
7
  recoverOrphans,
8
8
  recoverState,
9
9
  stopQueueWorkers
10
- } from "./chunk-3QL4QAQ5.js";
11
- import "./chunk-DVU3CXWA.js";
10
+ } from "./chunk-RBDBGU2C.js";
12
11
  import "./chunk-37N5OFHM.js";
12
+ import "./chunk-DVU3CXWA.js";
13
13
  export {
14
14
  areQueueWorkersActive,
15
15
  cleanTerminalWorkspaces,
@@ -20,4 +20,4 @@ export {
20
20
  recoverState,
21
21
  stopQueueWorkers
22
22
  };
23
- //# sourceMappingURL=queue-workers-ZEZHDX7M.js.map
23
+ //# sourceMappingURL=queue-workers-XZ6DGH4W.js.map
@@ -4,13 +4,14 @@ import {
4
4
  hasTerminalQueue,
5
5
  installGracefulShutdown,
6
6
  isShuttingDown
7
- } from "./chunk-LYAI5RPK.js";
8
- import "./chunk-3QL4QAQ5.js";
9
- import "./chunk-UXXUTDGV.js";
10
- import "./chunk-O3FGX4J6.js";
11
- import "./chunk-DVU3CXWA.js";
12
- import "./chunk-EPY5TTQK.js";
7
+ } from "./chunk-JTKUWIQD.js";
8
+ import "./chunk-RBDBGU2C.js";
9
+ import "./chunk-I2UHVKHS.js";
10
+ import "./chunk-H5N7O5NP.js";
11
+ import "./chunk-NB44PCD2.js";
12
+ import "./chunk-2CVTK5F2.js";
13
13
  import "./chunk-37N5OFHM.js";
14
+ import "./chunk-DVU3CXWA.js";
14
15
  export {
15
16
  analyzeParallelizability,
16
17
  ensureNotStale,
@@ -18,4 +19,4 @@ export {
18
19
  installGracefulShutdown,
19
20
  isShuttingDown
20
21
  };
21
- //# sourceMappingURL=scheduler-4R4ZAF25.js.map
22
+ //# sourceMappingURL=scheduler-NVE6L3P7.js.map
@@ -0,0 +1,74 @@
1
+ import {
2
+ RUNTIME_CONFIG_SETTING_IDS,
3
+ SETTING_ID_AGENT_COMMAND,
4
+ SETTING_ID_AGENT_PROVIDER,
5
+ SETTING_ID_AUTO_REVIEW_APPROVAL,
6
+ SETTING_ID_COMMAND_TIMEOUT_MS,
7
+ SETTING_ID_DEFAULT_EFFORT,
8
+ SETTING_ID_DETECTED_PROVIDERS,
9
+ SETTING_ID_LOG_LINES_TAIL,
10
+ SETTING_ID_MAX_ATTEMPTS_DEFAULT,
11
+ SETTING_ID_MAX_CONCURRENT_BY_STATE,
12
+ SETTING_ID_MAX_TURNS,
13
+ SETTING_ID_MERGE_MODE,
14
+ SETTING_ID_POLL_INTERVAL_MS,
15
+ SETTING_ID_PR_BASE_BRANCH,
16
+ SETTING_ID_RETRY_DELAY_MS,
17
+ SETTING_ID_STALE_IN_PROGRESS_TIMEOUT_MS,
18
+ SETTING_ID_TEST_COMMAND,
19
+ SETTING_ID_UI_NOTIFICATIONS_ENABLED,
20
+ SETTING_ID_UI_THEME,
21
+ SETTING_ID_WORKER_CONCURRENCY,
22
+ SETTING_ID_WORKFLOW_CONFIG,
23
+ applyPersistedSettings,
24
+ buildDefaultWorkflowConfig,
25
+ getWorkflowConfig,
26
+ inferSettingScope,
27
+ loadRuntimeSettings,
28
+ persistDetectedProvidersSetting,
29
+ persistSetting,
30
+ persistWorkerConcurrencySetting,
31
+ persistWorkflowConfig,
32
+ 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";
40
+ import "./chunk-DVU3CXWA.js";
41
+ export {
42
+ RUNTIME_CONFIG_SETTING_IDS,
43
+ SETTING_ID_AGENT_COMMAND,
44
+ SETTING_ID_AGENT_PROVIDER,
45
+ SETTING_ID_AUTO_REVIEW_APPROVAL,
46
+ SETTING_ID_COMMAND_TIMEOUT_MS,
47
+ SETTING_ID_DEFAULT_EFFORT,
48
+ SETTING_ID_DETECTED_PROVIDERS,
49
+ SETTING_ID_LOG_LINES_TAIL,
50
+ SETTING_ID_MAX_ATTEMPTS_DEFAULT,
51
+ SETTING_ID_MAX_CONCURRENT_BY_STATE,
52
+ SETTING_ID_MAX_TURNS,
53
+ SETTING_ID_MERGE_MODE,
54
+ SETTING_ID_POLL_INTERVAL_MS,
55
+ SETTING_ID_PR_BASE_BRANCH,
56
+ SETTING_ID_RETRY_DELAY_MS,
57
+ SETTING_ID_STALE_IN_PROGRESS_TIMEOUT_MS,
58
+ SETTING_ID_TEST_COMMAND,
59
+ SETTING_ID_UI_NOTIFICATIONS_ENABLED,
60
+ SETTING_ID_UI_THEME,
61
+ SETTING_ID_WORKER_CONCURRENCY,
62
+ SETTING_ID_WORKFLOW_CONFIG,
63
+ applyPersistedSettings,
64
+ buildDefaultWorkflowConfig,
65
+ getWorkflowConfig,
66
+ inferSettingScope,
67
+ loadRuntimeSettings,
68
+ persistDetectedProvidersSetting,
69
+ persistSetting,
70
+ persistWorkerConcurrencySetting,
71
+ persistWorkflowConfig,
72
+ syncRuntimeConfigSettings
73
+ };
74
+ //# sourceMappingURL=settings-NGY33WQE.js.map
@@ -21,18 +21,19 @@ import {
21
21
  replacePersistedSetting,
22
22
  savePlanForIssue,
23
23
  setActiveApiPlugin
24
- } from "./chunk-LYAI5RPK.js";
25
- import "./chunk-3QL4QAQ5.js";
24
+ } from "./chunk-JTKUWIQD.js";
25
+ import "./chunk-RBDBGU2C.js";
26
+ import "./chunk-I2UHVKHS.js";
26
27
  import {
27
28
  hasDirtyState,
28
29
  markEventDirty,
29
30
  markIssueDirty,
30
31
  markIssuePlanDirty
31
- } from "./chunk-UXXUTDGV.js";
32
- import "./chunk-O3FGX4J6.js";
33
- import "./chunk-DVU3CXWA.js";
34
- import "./chunk-EPY5TTQK.js";
32
+ } from "./chunk-H5N7O5NP.js";
33
+ import "./chunk-NB44PCD2.js";
34
+ import "./chunk-2CVTK5F2.js";
35
35
  import "./chunk-37N5OFHM.js";
36
+ import "./chunk-DVU3CXWA.js";
36
37
  export {
37
38
  closeStateStore,
38
39
  getAgentPipelineResource,
@@ -61,4 +62,4 @@ export {
61
62
  savePlanForIssue,
62
63
  setActiveApiPlugin
63
64
  };
64
- //# sourceMappingURL=store-FNUWCFOX.js.map
65
+ //# sourceMappingURL=store-4HCGBN4L.js.map
@@ -0,0 +1,28 @@
1
+ import {
2
+ SETTING_ID_PUSH_CONTACT,
3
+ SETTING_ID_PUSH_SUBSCRIPTIONS,
4
+ SETTING_ID_VAPID_PRIVATE,
5
+ SETTING_ID_VAPID_PUBLIC,
6
+ addSubscription,
7
+ getSubscriptionCount,
8
+ getVapidPublicKey,
9
+ initWebPush,
10
+ isWebPushReady,
11
+ removeSubscription,
12
+ sendPushToAll
13
+ } from "./chunk-I2UHVKHS.js";
14
+ import "./chunk-DVU3CXWA.js";
15
+ export {
16
+ SETTING_ID_PUSH_CONTACT,
17
+ SETTING_ID_PUSH_SUBSCRIPTIONS,
18
+ SETTING_ID_VAPID_PRIVATE,
19
+ SETTING_ID_VAPID_PUBLIC,
20
+ addSubscription,
21
+ getSubscriptionCount,
22
+ getVapidPublicKey,
23
+ initWebPush,
24
+ isWebPushReady,
25
+ removeSubscription,
26
+ sendPushToAll
27
+ };
28
+ //# sourceMappingURL=web-push-CRVDJKWR.js.map
@@ -4,6 +4,7 @@ import {
4
4
  cleanWorkspace,
5
5
  computeDiffStats,
6
6
  createGitWorktree,
7
+ createTestWorkspace,
7
8
  detectDefaultBranch,
8
9
  dryMerge,
9
10
  ensureGitRepoReadyForWorktrees,
@@ -17,20 +18,22 @@ import {
17
18
  parseDiffStats,
18
19
  prepareWorkspace,
19
20
  rebaseWorktree,
21
+ removeTestWorkspace,
20
22
  setSkipSource,
21
23
  shouldSkipMergePath,
22
24
  syncIssueDiffStatsToStore,
23
25
  writeVersionedArtifacts
24
- } from "./chunk-O3FGX4J6.js";
25
- import "./chunk-DVU3CXWA.js";
26
- import "./chunk-EPY5TTQK.js";
26
+ } from "./chunk-NB44PCD2.js";
27
+ import "./chunk-2CVTK5F2.js";
27
28
  import "./chunk-37N5OFHM.js";
29
+ import "./chunk-DVU3CXWA.js";
28
30
  export {
29
31
  assertIssueHasGitWorktree,
30
32
  bootstrapSource,
31
33
  cleanWorkspace,
32
34
  computeDiffStats,
33
35
  createGitWorktree,
36
+ createTestWorkspace,
34
37
  detectDefaultBranch,
35
38
  dryMerge,
36
39
  ensureGitRepoReadyForWorktrees,
@@ -44,9 +47,10 @@ export {
44
47
  parseDiffStats,
45
48
  prepareWorkspace,
46
49
  rebaseWorktree,
50
+ removeTestWorkspace,
47
51
  setSkipSource,
48
52
  shouldSkipMergePath,
49
53
  syncIssueDiffStatsToStore,
50
54
  writeVersionedArtifacts
51
55
  };
52
- //# sourceMappingURL=workspace-AOHHNWL5.js.map
56
+ //# sourceMappingURL=workspace-D3F3XGSI.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fifony",
3
- "version": "0.1.40",
3
+ "version": "0.1.42",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -53,6 +53,7 @@
53
53
  "react-hotkeys-hook": "^5.2.4",
54
54
  "recker": "^1.0.86",
55
55
  "s3db.js": "21.3.16",
56
+ "web-push": "^3.6.7",
56
57
  "yaml": "^2.8.3"
57
58
  },
58
59
  "devDependencies": {
@@ -82,6 +83,9 @@
82
83
  "build:server": "pnpm prompts:generate && tsup",
83
84
  "build:ui": "vite build --config app/vite.config.js",
84
85
  "mcp": "pnpm prompts:generate && node ./bin/fifony.js mcp",
85
- "test": "node --import tsx/esm --test 'tests/**/*.test.ts'"
86
+ "lint": "tsx ./scripts/lint.ts",
87
+ "test": "node --import tsx/esm --test 'tests/**/*.test.ts'",
88
+ "typecheck": "tsc --noEmit",
89
+ "release:check": "bash scripts/release-check.sh"
86
90
  }
87
91
  }