fifony 0.1.21 → 0.1.22-next.4ab1d2e

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/README.md +40 -9
  2. package/app/dist/assets/KeyboardShortcutsHelp-BB5jLK_E.js +1 -0
  3. package/app/dist/assets/OnboardingWizard-xyM3Okjv.js +1 -0
  4. package/app/dist/assets/analytics.lazy-CfJXsh6r.js +1 -0
  5. package/app/dist/assets/{createLucideIcon-DtZs0TX0.js → createLucideIcon-BWC-guQt.js} +1 -1
  6. package/app/dist/assets/index-C1QEwHZG.js +43 -0
  7. package/app/dist/assets/index-DjmUHXd1.css +1 -0
  8. package/app/dist/assets/vendor-BTlTWMUF.js +9 -0
  9. package/app/dist/dinofffaur.png +0 -0
  10. package/app/dist/index.html +4 -5
  11. package/app/dist/service-worker.js +1 -1
  12. package/app/public/dinofffaur.png +0 -0
  13. package/bin/fifony-wrap.js +53 -0
  14. package/dist/agent/cli-wrapper.js +78 -0
  15. package/dist/agent/cli-wrapper.js.map +1 -0
  16. package/dist/agent/run-local.js +228 -7894
  17. package/dist/agent/run-local.js.map +1 -1
  18. package/dist/chunk-3QSBGJMT.js +2190 -0
  19. package/dist/chunk-3QSBGJMT.js.map +1 -0
  20. package/dist/chunk-4OLABTVH.js +7083 -0
  21. package/dist/chunk-4OLABTVH.js.map +1 -0
  22. package/dist/chunk-D564G33G.js +91 -0
  23. package/dist/chunk-D564G33G.js.map +1 -0
  24. package/dist/{chunk-SMGXYOWU.js → chunk-DD5BE2W6.js} +430 -31
  25. package/dist/chunk-DD5BE2W6.js.map +1 -0
  26. package/dist/chunk-DVU3CXWA.js +75 -0
  27. package/dist/chunk-DVU3CXWA.js.map +1 -0
  28. package/dist/cli.js +187 -1
  29. package/dist/cli.js.map +1 -1
  30. package/dist/issue-runner-4WL4EK6R.js +13 -0
  31. package/dist/issue-runner-4WL4EK6R.js.map +1 -0
  32. package/dist/issue-state-machine-IWLKOTPI.js +39 -0
  33. package/dist/issue-state-machine-IWLKOTPI.js.map +1 -0
  34. package/dist/mcp/server.js +592 -605
  35. package/dist/mcp/server.js.map +1 -1
  36. package/dist/queue-workers-2I7VRZA7.js +20 -0
  37. package/dist/queue-workers-2I7VRZA7.js.map +1 -0
  38. package/dist/store-3JLC6EXY.js +56 -0
  39. package/dist/store-3JLC6EXY.js.map +1 -0
  40. package/package.json +10 -9
  41. package/FIFONY.md +0 -173
  42. package/app/dist/assets/KeyboardShortcutsHelp-BTjiQe_Y.js +0 -1
  43. package/app/dist/assets/OnboardingWizard-BALlquG0.js +0 -1
  44. package/app/dist/assets/analytics.lazy-DjSzXIey.js +0 -1
  45. package/app/dist/assets/index-BV11ScVl.js +0 -42
  46. package/app/dist/assets/index-DWbxgKSd.css +0 -1
  47. package/app/dist/assets/vendor-BoGBoEwT.js +0 -9
  48. package/app/dist/assets/zap-DpjdVd1i.js +0 -1
  49. package/dist/chunk-SMGXYOWU.js.map +0 -1
  50. package/src/fixtures/agent-catalog.json +0 -208
  51. package/src/fixtures/skill-catalog.json +0 -67
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/agents/issue-runner.ts","../src/domains/tokens.ts","../src/domains/project.ts","../src/persistence/plugins/api-runtime-context.ts","../src/persistence/plugins/api-server.ts","../src/persistence/resources/runtime-state.resource.ts","../src/agents/directive-parser.ts","../src/agents/pid-manager.ts","../src/agents/session-state.ts","../src/agents/agent-pipeline.ts","../src/agents/adapters/index.ts","../src/agents/skills.ts","../src/agents/agent.ts","../src/persistence/s3db-issue-repository.ts","../src/routes/helpers.ts","../src/persistence/s3db-event-store.ts","../src/persistence/s3queue-adapter.ts","../src/persistence/container.ts","../src/commands/create-issue.command.ts","../src/commands/transition-issue.command.ts","../src/commands/cancel-issue.command.ts","../src/persistence/resources/issues.resource.ts","../src/persistence/resources/issue-plans.resource.ts","../src/persistence/resources/events.resource.ts","../src/persistence/resources/settings.resource.ts","../src/persistence/resources/agent-sessions.resource.ts","../src/persistence/resources/agent-pipelines.resource.ts","../src/persistence/resources/index.ts","../src/routes/websocket.ts","../src/persistence/plugins/scheduler.ts","../src/agents/providers-usage.ts","../src/routes/state.ts","../src/commands/approve-plan.command.ts","../src/commands/execute-issue.command.ts","../src/commands/replan-issue.command.ts","../src/commands/merge-workspace.command.ts","../src/agents/planning/planning-session.ts","../src/agents/planning/plan-generator.ts","../src/agents/planning/planning-parser.ts","../src/agents/planning/planning-prompts.ts","../src/agents/planning/planning-schema.ts","../src/persistence/settings.ts","../src/agents/planning/plan-refiner.ts","../src/agents/planning/planning-background.ts","../src/agents/planning/issue-enhancer.ts","../src/routes/plan.ts","../src/routes/settings.ts","../src/routes/analytics.ts","../src/routes/scanning.ts","../src/agents/catalog.ts","../src/routes/catalog.ts","../src/routes/reference-repositories.ts","../src/routes/misc.ts","../src/persistence/store.ts","../src/domains/config.ts","../src/domains/issues.ts"],"sourcesContent":["import {\n existsSync,\n mkdirSync,\n readFileSync,\n writeFileSync,\n} from \"node:fs\";\nimport { join } from \"node:path\";\nimport { execSync } from \"node:child_process\";\nimport type {\n IssueEntry,\n RuntimeState,\n WorkflowConfig,\n} from \"../types.ts\";\nimport { SOURCE_ROOT, TARGET_ROOT, WORKSPACE_ROOT } from \"../concerns/constants.ts\";\nimport { now, idToSafePath } from \"../concerns/helpers.ts\";\nimport { logger } from \"../concerns/logger.ts\";\nimport { markIssueDirty, markIssuePlanDirty } from \"../persistence/dirty-tracker.ts\";\nimport { getEffectiveAgentProviders } from \"./providers.ts\";\nimport { addEvent, computeMetrics, getNextRetryAt } from \"../domains/issues.ts\";\nimport { compileReview, buildExecutionAudit, persistExecutionAudit } from \"./adapters/index.ts\";\nimport { generatePlan } from \"./planning/issue-planner.ts\";\nimport { persistState } from \"../persistence/store.ts\";\nimport { addTokenUsage } from \"./directive-parser.ts\";\nimport { runAgentSession, runAgentPipeline } from \"./agent-pipeline.ts\";\nimport { computeDiffStats, syncIssueDiffStatsToStore } from \"../domains/workspace.ts\";\nimport { ensureWorktreeCommitted, hydrateIssuePathsFromWorkspace, describeRoutingSignals } from \"../domains/workspace.ts\";\nimport { prepareWorkspace } from \"../domains/workspace.ts\";\nimport { inferCapabilityPaths } from \"../routing/capability-resolver.ts\";\nimport { getWorkflowConfig, loadRuntimeSettings } from \"../persistence/settings.ts\";\nimport { getContainer } from \"../persistence/container.ts\";\nimport { transitionIssueCommand } from \"../commands/transition-issue.command.ts\";\n\n/**\n * Run a planning job for an issue in the Planning state within a worker slot.\n * Blocks until plan generation completes, writing versioned artifacts to the workspace.\n */\nexport async function runPlanningJob(\n state: RuntimeState,\n issue: IssueEntry,\n): Promise<void> {\n issue.planningStatus = \"planning\";\n issue.planningStartedAt = now();\n issue.planningError = undefined;\n issue.updatedAt = now();\n markIssueDirty(issue.id);\n\n // Ensure workspace directory exists (no git worktree — planning only needs file storage)\n const safeId = idToSafePath(issue.id);\n const workspaceDir = join(WORKSPACE_ROOT, safeId);\n mkdirSync(workspaceDir, { recursive: true });\n\n addEvent(state, issue.id, \"info\", `Plan generation started for ${issue.identifier} (v${(issue.planVersion ?? 0) + 1}).`);\n\n try {\n const { plan, usage, prompt } = await generatePlan(\n issue.title,\n issue.description,\n state.config,\n null,\n { persistSession: false },\n );\n\n issue.plan = plan;\n markIssuePlanDirty(issue.id);\n issue.planVersion = Math.max((issue.planVersion ?? 0), 1);\n\n // Apply plan suggestions (paths, labels, effort)\n if (plan.suggestedPaths?.length && !(issue.paths?.length)) issue.paths = plan.suggestedPaths;\n if (plan.suggestedLabels?.length && !issue.labels?.length) issue.labels = plan.suggestedLabels;\n if (plan.suggestedEffort && !issue.effort) issue.effort = plan.suggestedEffort;\n\n // Apply token usage\n if (usage.totalTokens > 0) {\n addTokenUsage(issue, {\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n totalTokens: usage.totalTokens,\n model: usage.model,\n }, \"planner\");\n }\n\n // Write versioned artifacts to workspace\n const pv = issue.planVersion;\n try {\n writeFileSync(join(workspaceDir, `plan.v${pv}.json`), JSON.stringify(plan, null, 2), \"utf8\");\n writeFileSync(join(workspaceDir, `plan.v${pv}.prompt.md`), prompt, \"utf8\");\n } catch (artifactErr) {\n logger.warn({ err: String(artifactErr) }, \"[Agent] Failed to write versioned plan artifacts\");\n }\n\n issue.planningStatus = \"idle\";\n issue.planningStartedAt = undefined;\n issue.updatedAt = now();\n markIssueDirty(issue.id);\n // Issue remains in Planning state — user must approve before execution\n addEvent(state, issue.id, \"progress\", `Plan v${pv} generated for ${issue.identifier}: ${plan.steps.length} steps, complexity: ${plan.estimatedComplexity}.`);\n if (usage.totalTokens > 0) {\n addEvent(state, issue.id, \"info\", `Plan tokens (${issue.identifier}): ${usage.totalTokens.toLocaleString()} [${usage.model}]`);\n }\n } catch (error) {\n issue.planningStatus = \"idle\";\n issue.planningStartedAt = undefined;\n issue.planningError = error instanceof Error ? error.message : String(error);\n issue.updatedAt = now();\n markIssueDirty(issue.id);\n addEvent(state, issue.id, \"error\", `Plan generation failed for ${issue.identifier}: ${issue.planningError}`);\n logger.error({ err: error }, `[Agent] Planning job failed for ${issue.identifier}`);\n }\n}\n\nasync function handleReviewStage(\n state: RuntimeState,\n issue: IssueEntry,\n workspacePath: string,\n startTs: number,\n routedProviders: ReturnType<typeof getEffectiveAgentProviders>,\n): Promise<void> {\n issue.reviewAttempt = (issue.reviewAttempt ?? 0) + 1;\n markIssueDirty(issue.id);\n\n const container = getContainer();\n const reviewer = routedProviders.find((p) => p.role === \"reviewer\");\n if (!reviewer) {\n // No reviewer configured → auto-approve\n issue.mergedReason = \"Auto-approved: no reviewer configured.\";\n await transitionIssueCommand({ issue, target: \"Done\", note: `No reviewer configured; auto-approved for ${issue.identifier}.` }, container);\n // completedAt and lastError handled by FSM onEnterDone\n return;\n }\n\n addEvent(state, issue.id, \"info\", `Review provider: ${reviewer.role}:${reviewer.provider}${reviewer.model ? `/${reviewer.model}` : \"\"}${reviewer.profile ? `:${reviewer.profile}` : \"\"}.`);\n\n // Get diff summary for the review prompt\n let diffSummary = \"\";\n try {\n if (issue.baseBranch && issue.branchName) {\n const diffResult = execSync(\n `git diff --stat \"${issue.baseBranch}\"...\"${issue.branchName}\"`,\n { cwd: TARGET_ROOT, encoding: \"utf8\", maxBuffer: 512_000, timeout: 10_000 },\n );\n diffSummary = diffResult.trim();\n } else {\n const diffTarget = issue.worktreePath ?? workspacePath;\n const diffResult = execSync(\n `git diff --no-index --stat -- \"${SOURCE_ROOT}\" \"${diffTarget}\" 2>/dev/null`,\n { encoding: \"utf8\", maxBuffer: 512_000, timeout: 10_000 },\n );\n diffSummary = diffResult.trim();\n }\n } catch (err: any) {\n diffSummary = (err.stdout || \"\").trim();\n }\n\n const compiled = await compileReview(issue, reviewer, workspacePath, diffSummary);\n const effectiveReviewer = { ...reviewer, command: compiled.command || reviewer.command };\n const reviewPromptFile = join(workspacePath, \"review-prompt.md\");\n writeFileSync(reviewPromptFile, `${compiled.prompt}\\n`, \"utf8\");\n const reviewResult = await runAgentSession(state, issue, effectiveReviewer, 1, workspacePath, compiled.prompt, reviewPromptFile);\n issue.durationMs = (issue.durationMs ?? 0) + (Date.now() - startTs);\n issue.commandExitCode = reviewResult.code;\n issue.commandOutputTail = reviewResult.output;\n const reviewAudit = buildExecutionAudit(effectiveReviewer, null, issue, Date.now() - startTs, reviewResult.success ? \"approved\" : reviewResult.continueRequested ? \"rework\" : \"rejected\");\n persistExecutionAudit(workspacePath, reviewAudit);\n try {\n const rpv = issue.planVersion ?? 1;\n const rra = issue.reviewAttempt ?? 1;\n const vReviewPromptSrc = join(workspacePath, \"review-prompt.md\");\n const vReviewAuditSrc = join(workspacePath, \"execution-audit.json\");\n if (existsSync(vReviewPromptSrc)) {\n writeFileSync(join(workspacePath, `review.v${rpv}a${rra}.prompt.md`), readFileSync(vReviewPromptSrc, \"utf8\"), \"utf8\");\n }\n if (existsSync(vReviewAuditSrc)) {\n writeFileSync(join(workspacePath, `review.v${rpv}a${rra}.audit.json`), readFileSync(vReviewAuditSrc, \"utf8\"), \"utf8\");\n }\n } catch (vErr) {\n logger.warn({ err: String(vErr) }, \"[Agent] Failed to write versioned review artifacts\");\n }\n\n if (reviewResult.success) {\n issue.mergedReason = `Auto-approved by reviewer in ${reviewResult.turns} turn(s).`;\n await transitionIssueCommand({ issue, target: \"Reviewed\", note: `Reviewer completed for ${issue.identifier}.` }, container);\n await transitionIssueCommand({ issue, target: \"Done\", note: `Reviewer approved ${issue.identifier} in ${reviewResult.turns} turn(s).` }, container);\n // completedAt and lastError are set by FSM onEnterDone\n } else if (reviewResult.continueRequested) {\n await transitionIssueCommand({ issue, target: \"Reviewed\", note: `Reviewer completed for ${issue.identifier}.` }, container);\n await transitionIssueCommand({ issue, target: \"Queued\", note: `Reviewer requested rework for ${issue.identifier}.` }, container);\n // nextRetryAt and lastError are cleared by FSM onEnterQueued\n container.eventStore.addEvent(issue.id, \"runner\", `Issue ${issue.identifier} sent back for rework by reviewer.`);\n } else {\n // Reviewer blocked or failed\n issue.lastError = reviewResult.output;\n issue.attempts += 1;\n if (issue.attempts >= issue.maxAttempts) {\n issue.cancelledReason = `Max attempts reached (${issue.attempts}/${issue.maxAttempts}): reviewer failed or blocked.`;\n await transitionIssueCommand({ issue, target: \"Cancelled\", note: `Review failed, max attempts reached for ${issue.identifier}.` }, container);\n } else {\n issue.nextRetryAt = getNextRetryAt(issue, state.config.retryDelayMs);\n await transitionIssueCommand({ issue, target: \"Blocked\", note: `Review failed for ${issue.identifier}. Retry at ${issue.nextRetryAt}.` }, container);\n }\n }\n}\n\nasync function handleExecutionStage(\n state: RuntimeState,\n issue: IssueEntry,\n workspacePath: string,\n promptText: string,\n promptFile: string,\n workflowConfig: WorkflowConfig | null,\n workspaceDerivedPaths: string[],\n startTs: number,\n routedProviders: ReturnType<typeof getEffectiveAgentProviders>,\n): Promise<void> {\n const container = getContainer();\n issue.executeAttempt = (issue.executeAttempt ?? 0) + 1;\n container.issueRepository.markDirty(issue.id);\n\n container.eventStore.addEvent(issue.id, \"info\",\n `Capability routing selected ${routedProviders.map((p) => `${p.role}:${p.provider}${p.model ? `/${p.model}` : \"\"}${p.profile ? `:${p.profile}` : \"\"}${p.reasoningEffort ? ` [${p.reasoningEffort}]` : \"\"}`).join(\", \")}.`);\n\n const routingSignals = describeRoutingSignals(issue, workspaceDerivedPaths);\n if (routingSignals) {\n container.eventStore.addEvent(issue.id, \"info\", `Capability routing signals: ${routingSignals}.`);\n }\n\n const runResult = await runAgentPipeline(state, issue, workspacePath, promptText, promptFile, workflowConfig);\n\n issue.durationMs = Date.now() - startTs;\n issue.commandExitCode = runResult.code;\n issue.commandOutputTail = runResult.output;\n\n if (runResult.success) {\n ensureWorktreeCommitted(issue);\n\n computeDiffStats(issue);\n container.issueRepository.markDirty(issue.id);\n await syncIssueDiffStatsToStore(issue).catch(() => {});\n if (issue.filesChanged) {\n container.eventStore.addEvent(issue.id, \"info\", `Diff: ${issue.filesChanged} files, +${issue.linesAdded || 0} -${issue.linesRemoved || 0} lines.`);\n }\n\n container.eventStore.addEvent(issue.id, \"info\", `Workspace prepared for review on branch ${issue.branchName ?? \"workspace\"}.`);\n\n const executor = routedProviders.find((p) => p.role === \"executor\") || routedProviders[0];\n if (executor && workspacePath) {\n const audit = buildExecutionAudit(executor, null, issue, Date.now() - startTs, \"success\");\n persistExecutionAudit(workspacePath, audit);\n\n try {\n const epv = issue.planVersion ?? 1;\n const eea = issue.executeAttempt ?? 1;\n const vExecPromptSrc = join(workspacePath, \"prompt.md\");\n const vExecAuditSrc = join(workspacePath, \"execution-audit.json\");\n if (existsSync(vExecPromptSrc)) {\n writeFileSync(join(workspacePath, `execute.v${epv}a${eea}.prompt.md`), readFileSync(vExecPromptSrc, \"utf8\"), \"utf8\");\n }\n if (existsSync(vExecAuditSrc)) {\n writeFileSync(join(workspacePath, `execute.v${epv}a${eea}.audit.json`), readFileSync(vExecAuditSrc, \"utf8\"), \"utf8\");\n }\n } catch (vErr) {\n logger.warn({ err: String(vErr) }, \"[Agent] Failed to write versioned execute artifacts\");\n }\n }\n\n await transitionIssueCommand({ issue, target: \"Reviewing\", note: `Agent execution finished in ${runResult.turns} turn(s) for ${issue.identifier}. Awaiting review.` }, container);\n } else if (runResult.continueRequested) {\n issue.updatedAt = now();\n issue.commandExitCode = runResult.code;\n issue.commandOutputTail = runResult.output;\n issue.lastError = undefined;\n issue.nextRetryAt = new Date(Date.now() + 1000).toISOString();\n issue.history.push(`[${issue.updatedAt}] Agent requested another turn (${runResult.turns}/${state.config.maxTurns}).`);\n container.eventStore.addEvent(issue.id, \"runner\", `Issue ${issue.identifier} queued for next turn.`);\n } else {\n issue.lastError = runResult.output;\n issue.attempts += 1;\n\n if (issue.attempts >= issue.maxAttempts) {\n issue.commandExitCode = runResult.code;\n issue.cancelledReason = `Max attempts reached (${issue.attempts}/${issue.maxAttempts}): execution failed repeatedly.`;\n await transitionIssueCommand({ issue, target: \"Cancelled\", note: `Max attempts reached (${issue.attempts}/${issue.maxAttempts}).` }, container);\n // FSM onEnterCancelled emits the state event\n } else {\n issue.nextRetryAt = getNextRetryAt(issue, state.config.retryDelayMs);\n await transitionIssueCommand({ issue, target: \"Blocked\", note: `${runResult.blocked ? \"Agent requested manual intervention\" : \"Failure\"} on attempt ${issue.attempts}/${issue.maxAttempts}; retry scheduled at ${issue.nextRetryAt}.` }, container);\n // FSM onEnterBlocked emits the error event\n }\n }\n}\n\nexport async function runIssueOnce(\n state: RuntimeState,\n issue: IssueEntry,\n running: Set<string>,\n): Promise<void> {\n const startTs = Date.now();\n const isReviewing = issue.state === \"Reviewing\";\n const isResuming = issue.state === \"Running\";\n logger.info({ issueId: issue.id, identifier: issue.identifier, state: issue.state, isReviewing, isResuming, attempt: issue.attempts + 1, maxAttempts: issue.maxAttempts }, \"[Agent] Starting issue execution\");\n\n // Planning jobs run in the background without occupying a worker slot.\n // planningStatus=\"planning\" (set immediately by runPlanningJob) acts as the dispatch guard\n // so canRunIssue returns false while planning is in progress, preventing double-dispatch.\n if (issue.state === \"Planning\") {\n issue.startedAt = issue.startedAt ?? now();\n runPlanningJob(state, issue)\n .catch((err) => logger.error({ err, issueId: issue.id, identifier: issue.identifier }, \"[Agent] Unexpected error in background planning job\"))\n .finally(() => {\n state.metrics = computeMetrics(state.issues);\n state.updatedAt = now();\n persistState(state).catch(() => {});\n });\n return;\n }\n\n running.add(issue.id);\n state.metrics.activeWorkers += 1;\n issue.startedAt = issue.startedAt ?? now();\n\n let workflowConfig: WorkflowConfig | null = null;\n try {\n const settings = await loadRuntimeSettings();\n workflowConfig = getWorkflowConfig(settings);\n } catch {\n // Fall through — use defaults\n }\n\n const container = getContainer();\n\n if (isReviewing) {\n issue.updatedAt = now();\n issue.history.push(`[${issue.updatedAt}] Review stage started for ${issue.identifier}.`);\n container.eventStore.addEvent(issue.id, \"progress\", `Review started for ${issue.identifier}.`);\n } else if (isResuming) {\n await transitionIssueCommand({ issue, target: \"Running\", note: `Resuming runner for ${issue.identifier}.` }, container);\n container.eventStore.addEvent(issue.id, \"progress\", `Runner resumed for ${issue.identifier}.`);\n } else {\n if (issue.state !== \"Queued\") {\n await transitionIssueCommand({ issue, target: \"Queued\", note: `Issue ${issue.identifier} queued for execution.` }, container);\n }\n await transitionIssueCommand({ issue, target: \"Running\", note: `Agent started for ${issue.identifier}.` }, container);\n container.eventStore.addEvent(issue.id, \"progress\", `Runner started for ${issue.identifier}.`);\n }\n\n try {\n const workspaceDerivedPaths = hydrateIssuePathsFromWorkspace(issue);\n if ((issue.paths ?? []).length > 0) {\n issue.inferredPaths = [...new Set([...(issue.inferredPaths ?? []), ...inferCapabilityPaths({\n id: issue.id,\n identifier: issue.identifier,\n title: issue.title,\n description: issue.description,\n labels: issue.labels,\n paths: issue.paths,\n })])];\n }\n\n const { workspacePath, promptText, promptFile } = await prepareWorkspace(issue, state, state.config.defaultBranch);\n container.issueRepository.markDirty(issue.id);\n // Persist workspace fields via resource.patch so they survive restarts\n try {\n const { getIssueStateResource } = await import(\"../persistence/store.ts\");\n const res = getIssueStateResource();\n if (res) {\n await (res as any).patch(issue.id, {\n branchName: issue.branchName,\n baseBranch: issue.baseBranch,\n workspacePath: issue.workspacePath,\n worktreePath: issue.worktreePath,\n });\n }\n } catch { /* non-critical */ }\n container.eventStore.addEvent(issue.id, \"info\", `Workspace ready at ${workspacePath}.`);\n\n const routedProviders = getEffectiveAgentProviders(state, issue, null, workflowConfig);\n\n if (isReviewing) {\n await handleReviewStage(state, issue, workspacePath, startTs, routedProviders);\n return;\n }\n\n await handleExecutionStage(state, issue, workspacePath, promptText, promptFile, workflowConfig, workspaceDerivedPaths, startTs, routedProviders);\n } catch (error) {\n issue.attempts += 1;\n issue.lastError = String(error);\n\n if (issue.attempts >= issue.maxAttempts) {\n issue.cancelledReason = `Max attempts reached (${issue.attempts}/${issue.maxAttempts}): unexpected failure — ${issue.lastError?.slice(0, 120) ?? \"unknown error\"}.`;\n await transitionIssueCommand({ issue, target: \"Cancelled\", note: `Issue failed unexpectedly: ${issue.lastError}` }, container);\n } else {\n issue.nextRetryAt = getNextRetryAt(issue, state.config.retryDelayMs);\n await transitionIssueCommand({ issue, target: \"Blocked\", note: `Unexpected failure. Retry scheduled at ${issue.nextRetryAt}.` }, container);\n }\n } finally {\n const elapsedMs = Date.now() - startTs;\n logger.info({ issueId: issue.id, identifier: issue.identifier, finalState: issue.state, elapsedMs, attempts: issue.attempts }, \"[Agent] Issue execution finished\");\n issue.updatedAt = now();\n container.issueRepository.markDirty(issue.id);\n state.metrics.activeWorkers = Math.max(state.metrics.activeWorkers - 1, 0);\n running.delete(issue.id);\n state.metrics = computeMetrics(state.issues);\n state.metrics.activeWorkers = Math.max(state.metrics.activeWorkers, 0);\n state.updatedAt = now();\n await container.persistencePort.persistState(state);\n }\n}\n","/**\n * In-memory token usage ledger.\n *\n * Updated O(1) per turn via `record()`.\n * Queried O(1) for all analytics views — no disk I/O, no scans.\n *\n * Hydrated once at startup from existing issue data,\n * then kept in sync incrementally as turns complete.\n *\n * Event counts (events/day) are tracked via the EventualConsistencyPlugin\n * using the `eventsCount` field on IssueEntry — not here.\n */\n\nimport type { AgentProviderRole, AgentTokenUsage, IssueEntry } from \"../types.ts\";\n\n// ── Types ────────────────────────────────────────────────────────────────────\n\nexport type TokenBucket = {\n inputTokens: number;\n outputTokens: number;\n totalTokens: number;\n};\n\nexport type DailyBucket = TokenBucket & {\n date: string; // \"2026-03-16\"\n events?: number;\n};\n\nexport type HourlyBucket = TokenBucket & {\n hour: string; // \"2026-03-16T14\" (ISO date + hour)\n};\n\nexport type HourlySnapshot = {\n tokensPerHour: HourlyBucket[];\n};\n\nexport type TokenAnalytics = {\n overall: TokenBucket;\n byPhase: Record<string, TokenBucket>;\n byModel: Record<string, TokenBucket>;\n daily: DailyBucket[];\n dailyByPhase: Record<string, DailyBucket[]>;\n dailyByModel: Record<string, DailyBucket[]>;\n topIssues: Array<{ id: string; identifier: string; title: string; totalTokens: number }>;\n};\n\n// ── Internal state ───────────────────────────────────────────────────────────\n\nconst EMPTY: TokenBucket = { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n\n/** Overall aggregate */\nlet overall: TokenBucket = { ...EMPTY };\n\n/** Per-phase aggregate */\nconst byPhase = new Map<string, TokenBucket>();\n\n/** Per-model aggregate */\nconst byModel = new Map<string, TokenBucket>();\n\n/** Daily overall: date → bucket */\nconst daily = new Map<string, TokenBucket>();\n\n/** Daily per-phase: \"phase:date\" → bucket */\nconst dailyByPhase = new Map<string, TokenBucket>();\n\n/** Daily per-model: \"model:date\" → bucket */\nconst dailyByModel = new Map<string, TokenBucket>();\n\n/** Per-issue totals (for top-N) */\nconst byIssue = new Map<string, { identifier: string; title: string; totalTokens: number }>();\n\n/** Daily event counts: date → count */\nconst dailyEvents = new Map<string, number>();\n\n/** Hourly token buckets: \"2026-03-16T14\" → bucket */\nconst hourly = new Map<string, TokenBucket>();\n\nconst HOURLY_RETENTION = 48; // keep last 48 hours\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction todayDate(): string {\n return new Date().toISOString().slice(0, 10);\n}\n\nfunction currentHour(): string {\n return new Date().toISOString().slice(0, 13); // \"2026-03-16T14\"\n}\n\nfunction pruneOldHours(): void {\n if (hourly.size <= HOURLY_RETENTION) return;\n const cutoff = new Date(Date.now() - HOURLY_RETENTION * 3600_000).toISOString().slice(0, 13);\n for (const key of hourly.keys()) {\n if (key < cutoff) hourly.delete(key);\n }\n}\n\nfunction addTo(target: TokenBucket, usage: AgentTokenUsage): void {\n target.inputTokens += usage.inputTokens;\n target.outputTokens += usage.outputTokens;\n target.totalTokens += usage.totalTokens;\n}\n\nfunction getOrCreate(map: Map<string, TokenBucket>, key: string): TokenBucket {\n let bucket = map.get(key);\n if (!bucket) {\n bucket = { ...EMPTY };\n map.set(key, bucket);\n }\n return bucket;\n}\n\nfunction mapToDailyArray(map: Map<string, TokenBucket>, prefix: string): DailyBucket[] {\n const result: DailyBucket[] = [];\n for (const [key, bucket] of map) {\n if (!key.startsWith(prefix)) continue;\n const date = key.slice(prefix.length);\n result.push({ ...bucket, date });\n }\n result.sort((a, b) => a.date.localeCompare(b.date));\n return result;\n}\n\n// ── Public API ───────────────────────────────────────────────────────────────\n\n/**\n * Record a token usage event. Called once per turn completion.\n * O(1) — just increments counters.\n */\nexport function record(\n issue: IssueEntry,\n usage: AgentTokenUsage,\n role?: AgentProviderRole,\n): void {\n if (!usage || usage.totalTokens === 0) return;\n\n const date = todayDate();\n const hour = currentHour();\n const model = usage.model || \"unknown\";\n\n // Overall\n addTo(overall, usage);\n\n // Daily overall\n addTo(getOrCreate(daily, date), usage);\n\n // Hourly overall\n addTo(getOrCreate(hourly, hour), usage);\n pruneOldHours();\n\n // By phase\n if (role) {\n addTo(getOrCreate(byPhase, role), usage);\n addTo(getOrCreate(dailyByPhase, `${role}:${date}`), usage);\n }\n\n // By model\n addTo(getOrCreate(byModel, model), usage);\n addTo(getOrCreate(dailyByModel, `${model}:${date}`), usage);\n\n // By issue\n const prev = byIssue.get(issue.id);\n if (prev) {\n prev.totalTokens += usage.totalTokens;\n prev.title = issue.title; // keep fresh\n } else {\n byIssue.set(issue.id, {\n identifier: issue.identifier,\n title: issue.title,\n totalTokens: usage.totalTokens,\n });\n }\n}\n\n/**\n * Record a single event occurrence for daily analytics.\n * Called from addEvent() in issues.ts.\n */\nexport function recordEvent(): void {\n const date = todayDate();\n dailyEvents.set(date, (dailyEvents.get(date) || 0) + 1);\n}\n\n/**\n * Get hourly snapshot for sparkline display.\n * Returns last N hours of token usage.\n */\nexport function getHourlySnapshot(hours = 24): HourlySnapshot {\n const now = Date.now();\n const tokensPerHour: HourlyBucket[] = [];\n\n for (let i = hours - 1; i >= 0; i--) {\n const h = new Date(now - i * 3600_000).toISOString().slice(0, 13);\n const tokenBucket = hourly.get(h);\n tokensPerHour.push({\n hour: h,\n inputTokens: tokenBucket?.inputTokens || 0,\n outputTokens: tokenBucket?.outputTokens || 0,\n totalTokens: tokenBucket?.totalTokens || 0,\n });\n }\n\n return { tokensPerHour };\n}\n\n/**\n * Hydrate the ledger from existing issues at startup.\n * Called once. O(n) over issues — amortized at boot, never at query time.\n */\nexport function hydrate(issues: IssueEntry[]): void {\n // Reset\n overall = { ...EMPTY };\n byPhase.clear();\n byModel.clear();\n daily.clear();\n dailyByPhase.clear();\n dailyByModel.clear();\n byIssue.clear();\n dailyEvents.clear();\n\n for (const issue of issues) {\n // Per-issue totals\n if (issue.tokenUsage && issue.tokenUsage.totalTokens > 0) {\n byIssue.set(issue.id, {\n identifier: issue.identifier,\n title: issue.title,\n totalTokens: issue.tokenUsage.totalTokens,\n });\n addTo(overall, issue.tokenUsage);\n }\n\n // Per-phase\n if (issue.tokensByPhase) {\n for (const [phase, pu] of Object.entries(issue.tokensByPhase)) {\n if (pu.totalTokens > 0) addTo(getOrCreate(byPhase, phase), pu);\n }\n }\n\n // Per-model\n if (issue.tokensByModel) {\n for (const [model, mu] of Object.entries(issue.tokensByModel)) {\n if (mu.totalTokens > 0) addTo(getOrCreate(byModel, model), mu);\n }\n }\n\n // Reconstruct daily token buckets from completedAt date\n const date = issue.completedAt?.slice(0, 10);\n if (date && issue.tokenUsage && issue.tokenUsage.totalTokens > 0) {\n addTo(getOrCreate(daily, date), issue.tokenUsage);\n }\n if (date && issue.tokensByPhase) {\n for (const [phase, pu] of Object.entries(issue.tokensByPhase)) {\n if (pu.totalTokens > 0) addTo(getOrCreate(dailyByPhase, `${phase}:${date}`), pu);\n }\n }\n if (date && issue.tokensByModel) {\n for (const [model, mu] of Object.entries(issue.tokensByModel)) {\n if (mu.totalTokens > 0) addTo(getOrCreate(dailyByModel, `${model}:${date}`), mu);\n }\n }\n }\n}\n\n/**\n * Get full analytics snapshot. O(1) — reads from pre-computed maps.\n * Note: daily[].events is populated by the API layer from EventualConsistency.\n */\nexport function getAnalytics(topN = 20): TokenAnalytics {\n // Daily overall (merge token buckets with event counts)\n const allDates = new Set([...daily.keys(), ...dailyEvents.keys()]);\n const dailyArray: DailyBucket[] = [];\n for (const date of allDates) {\n const bucket = daily.get(date) ?? { ...EMPTY };\n const events = dailyEvents.get(date) || 0;\n dailyArray.push({ ...bucket, date, ...(events > 0 ? { events } : {}) });\n }\n dailyArray.sort((a, b) => a.date.localeCompare(b.date));\n\n // Daily by phase\n const dailyByPhaseResult: Record<string, DailyBucket[]> = {};\n for (const phase of byPhase.keys()) {\n dailyByPhaseResult[phase] = mapToDailyArray(dailyByPhase, `${phase}:`);\n }\n\n // Daily by model\n const dailyByModelResult: Record<string, DailyBucket[]> = {};\n for (const model of byModel.keys()) {\n dailyByModelResult[model] = mapToDailyArray(dailyByModel, `${model}:`);\n }\n\n // Top issues\n const topIssues = [...byIssue.entries()]\n .map(([id, data]) => ({ id, ...data }))\n .sort((a, b) => b.totalTokens - a.totalTokens)\n .slice(0, topN);\n\n // Phase/model aggregates\n const byPhaseResult: Record<string, TokenBucket> = {};\n for (const [k, v] of byPhase) byPhaseResult[k] = { ...v };\n\n const byModelResult: Record<string, TokenBucket> = {};\n for (const [k, v] of byModel) byModelResult[k] = { ...v };\n\n return {\n overall: { ...overall },\n byPhase: byPhaseResult,\n byModel: byModelResult,\n daily: dailyArray,\n dailyByPhase: dailyByPhaseResult,\n dailyByModel: dailyByModelResult,\n topIssues,\n };\n}\n","import { execFileSync, spawn } from \"node:child_process\";\nimport { createHash } from \"node:crypto\";\nimport {\n Dirent,\n existsSync,\n mkdirSync,\n mkdtempSync,\n readdirSync,\n readFileSync,\n rmSync,\n writeFileSync,\n} from \"node:fs\";\nimport { homedir, tmpdir } from \"node:os\";\nimport { basename, dirname, join, relative as relativePath, resolve } from \"node:path\";\nimport { env } from \"node:process\";\n\nimport { appendFileTail } from \"../concerns/helpers.ts\";\nimport { logger } from \"../concerns/logger.ts\";\nimport { detectAvailableProviders } from \"../agents/providers.ts\";\nimport { renderPrompt } from \"../agents/prompting.ts\";\nimport { getSettingStateResource } from \"../persistence/store.ts\";\nimport type { ProjectNameSource, RuntimeSettingRecord } from \"../types.ts\";\n\n// ── Project metadata ─────────────────────────────────────────────────────────\n\nexport const SETTING_ID_PROJECT_NAME = \"system.projectName\";\nexport const LEGACY_PROJECT_SETTING_IDS = [\n \"runtime.projectName\",\n \"ui.projectName\",\n \"projectName\",\n \"project.name\",\n];\n\nexport type ProjectMetadata = {\n projectName: string;\n detectedProjectName: string;\n projectNameSource: ProjectNameSource;\n queueTitle: string;\n};\n\nexport function normalizeProjectName(value: unknown): string {\n return typeof value === \"string\"\n ? value.trim().replace(/\\s+/g, \" \")\n : \"\";\n}\n\nexport function detectProjectName(targetRoot: string): string {\n const normalizedPath = typeof targetRoot === \"string\"\n ? targetRoot.trim().replace(/[\\\\/]+$/, \"\")\n : \"\";\n if (!normalizedPath) return \"\";\n return normalizeProjectName(basename(normalizedPath));\n}\n\nexport function readSavedProjectName(settings: RuntimeSettingRecord[]): string {\n const settingIds = [SETTING_ID_PROJECT_NAME, ...LEGACY_PROJECT_SETTING_IDS];\n\n for (const id of settingIds) {\n const value = normalizeProjectName(settings.find((setting) => setting.id === id)?.value);\n if (value) {\n return value;\n }\n }\n\n return \"\";\n}\n\nexport function buildQueueTitle(projectName: string): string {\n const normalizedProjectName = normalizeProjectName(projectName);\n return normalizedProjectName ? `fifony: ${normalizedProjectName}` : \"fifony\";\n}\n\nexport function resolveProjectMetadata(\n settings: RuntimeSettingRecord[],\n targetRoot: string,\n): ProjectMetadata {\n const savedProjectName = readSavedProjectName(settings);\n const detectedProjectName = detectProjectName(targetRoot);\n const projectName = savedProjectName || detectedProjectName;\n\n return {\n projectName,\n detectedProjectName,\n projectNameSource: savedProjectName ? \"saved\" : detectedProjectName ? \"detected\" : \"missing\",\n queueTitle: buildQueueTitle(projectName),\n };\n}\n\n// ── Project scanner ──────────────────────────────────────────────────────────\n\nexport type ProjectScanResult = {\n root: string;\n files: {\n claudeMd: boolean;\n claudeDir: boolean;\n codexDir: boolean;\n readmeMd: boolean;\n packageJson: boolean;\n agentsMd: boolean;\n claudeAgentsDir: boolean;\n claudeSkillsDir: boolean;\n codexAgentsDir: boolean;\n codexSkillsDir: boolean;\n };\n existingAgents: string[];\n existingSkills: string[];\n readmeExcerpt: string;\n packageName: string;\n packageDescription: string;\n};\n\nexport type ProjectAnalysis = {\n description: string;\n language: string;\n domains: string[];\n stack: string[];\n suggestedAgents: string[];\n source: \"cli\" | \"fallback\";\n};\n\n// ── Filesystem scan (no CLI needed) ──────────────────────────────────────────\n\nexport function scanProjectFiles(targetRoot: string): ProjectScanResult {\n const check = (rel: string) => existsSync(join(targetRoot, rel));\n\n const files = {\n claudeMd: check(\"CLAUDE.md\"),\n claudeDir: check(\".claude\"),\n codexDir: check(\".codex\"),\n readmeMd: check(\"README.md\"),\n packageJson: check(\"package.json\"),\n cargoToml: check(\"Cargo.toml\"),\n pyprojectToml: check(\"pyproject.toml\"),\n goMod: check(\"go.mod\"),\n buildGradle: check(\"build.gradle\") || check(\"build.gradle.kts\"),\n gemfile: check(\"Gemfile\"),\n dockerfile: check(\"Dockerfile\"),\n agentsMd: check(\"AGENTS.md\"),\n claudeAgentsDir: check(\".claude/agents\"),\n claudeSkillsDir: check(\".claude/skills\"),\n codexAgentsDir: check(\".codex/agents\"),\n codexSkillsDir: check(\".codex/skills\"),\n };\n\n // List existing agents\n const existingAgents: string[] = [];\n for (const agentDir of [\".claude/agents\", \".codex/agents\"]) {\n const fullPath = join(targetRoot, agentDir);\n if (!existsSync(fullPath)) continue;\n try {\n const entries = readdirSync(fullPath);\n for (const entry of entries) {\n if (entry.endsWith(\".md\")) {\n existingAgents.push(basename(entry, \".md\"));\n }\n }\n } catch {\n // ignore read errors\n }\n }\n\n // List existing skills\n const existingSkills: string[] = [];\n for (const skillDir of [\".claude/skills\", \".codex/skills\"]) {\n const fullPath = join(targetRoot, skillDir);\n if (!existsSync(fullPath)) continue;\n try {\n const entries = readdirSync(fullPath);\n for (const entry of entries) {\n const skillFile = join(fullPath, entry, \"SKILL.md\");\n if (existsSync(skillFile)) {\n existingSkills.push(entry);\n }\n }\n } catch {\n // ignore read errors\n }\n }\n\n // Read README excerpt\n let readmeExcerpt = \"\";\n const readmePath = join(targetRoot, \"README.md\");\n if (existsSync(readmePath)) {\n try {\n const content = readFileSync(readmePath, \"utf8\");\n readmeExcerpt = content.slice(0, 200).trim();\n } catch {\n // ignore read errors\n }\n }\n\n // Read package.json name + description\n let packageName = \"\";\n let packageDescription = \"\";\n const pkgPath = join(targetRoot, \"package.json\");\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf8\"));\n packageName = typeof pkg.name === \"string\" ? pkg.name : \"\";\n packageDescription = typeof pkg.description === \"string\" ? pkg.description : \"\";\n } catch {\n // ignore parse errors\n }\n }\n\n return {\n root: targetRoot,\n files,\n existingAgents: [...new Set(existingAgents)],\n existingSkills: [...new Set(existingSkills)],\n readmeExcerpt,\n packageName,\n packageDescription,\n };\n}\n\n// ── CLI-based analysis ───────────────────────────────────────────────────────\n\n// Detect language from build files present in the project root\nconst BUILD_FILE_SIGNALS: Record<string, { language: string; stack: string[] }> = {\n \"package.json\": { language: \"javascript\", stack: [\"node\"] },\n \"Cargo.toml\": { language: \"rust\", stack: [\"cargo\"] },\n \"pyproject.toml\": { language: \"python\", stack: [\"python\"] },\n \"setup.py\": { language: \"python\", stack: [\"python\"] },\n \"requirements.txt\": { language: \"python\", stack: [\"pip\"] },\n \"Pipfile\": { language: \"python\", stack: [\"pipenv\"] },\n \"go.mod\": { language: \"go\", stack: [\"go\"] },\n \"build.gradle\": { language: \"java\", stack: [\"gradle\"] },\n \"build.gradle.kts\": { language: \"kotlin\", stack: [\"gradle\"] },\n \"pom.xml\": { language: \"java\", stack: [\"maven\"] },\n \"Gemfile\": { language: \"ruby\", stack: [\"bundler\"] },\n \"mix.exs\": { language: \"elixir\", stack: [\"mix\"] },\n \"pubspec.yaml\": { language: \"dart\", stack: [\"flutter\"] },\n \"CMakeLists.txt\": { language: \"c++\", stack: [\"cmake\"] },\n \"Makefile\": { language: \"unknown\", stack: [\"make\"] },\n \"Dockerfile\": { language: \"unknown\", stack: [\"docker\"] },\n \"composer.json\": { language: \"php\", stack: [\"composer\"] },\n \"Package.swift\": { language: \"swift\", stack: [\"spm\"] },\n \"deno.json\": { language: \"typescript\", stack: [\"deno\"] },\n \"bun.lockb\": { language: \"typescript\", stack: [\"bun\"] },\n};\n\nfunction buildFallbackAnalysis(targetRoot: string): ProjectAnalysis {\n // Read any available project description\n let description = \"\";\n let readmeExcerpt = \"\";\n\n for (const readmeFile of [\"README.md\", \"README.rst\", \"README.txt\", \"README\"]) {\n const p = join(targetRoot, readmeFile);\n if (existsSync(p)) {\n try {\n readmeExcerpt = readFileSync(p, \"utf8\").slice(0, 300).trim();\n break;\n } catch { /* ignore */ }\n }\n }\n\n // Try package.json description (JS/TS projects)\n const pkgPath = join(targetRoot, \"package.json\");\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf8\"));\n const name = typeof pkg.name === \"string\" ? pkg.name : \"\";\n const desc = typeof pkg.description === \"string\" ? pkg.description : \"\";\n if (desc) description = name ? `${name}: ${desc}` : desc;\n } catch { /* ignore */ }\n }\n\n // Try Cargo.toml description (Rust)\n const cargoPath = join(targetRoot, \"Cargo.toml\");\n if (!description && existsSync(cargoPath)) {\n try {\n const content = readFileSync(cargoPath, \"utf8\");\n const descMatch = content.match(/^description\\s*=\\s*\"([^\"]+)\"/m);\n const nameMatch = content.match(/^name\\s*=\\s*\"([^\"]+)\"/m);\n if (descMatch) description = nameMatch ? `${nameMatch[1]}: ${descMatch[1]}` : descMatch[1];\n } catch { /* ignore */ }\n }\n\n // Try pyproject.toml description (Python)\n const pyprojectPath = join(targetRoot, \"pyproject.toml\");\n if (!description && existsSync(pyprojectPath)) {\n try {\n const content = readFileSync(pyprojectPath, \"utf8\");\n const descMatch = content.match(/^description\\s*=\\s*\"([^\"]+)\"/m);\n const nameMatch = content.match(/^name\\s*=\\s*\"([^\"]+)\"/m);\n if (descMatch) description = nameMatch ? `${nameMatch[1]}: ${descMatch[1]}` : descMatch[1];\n } catch { /* ignore */ }\n }\n\n if (!description) {\n description = readmeExcerpt\n ? readmeExcerpt.split(\"\\n\").filter(Boolean).slice(0, 2).join(\". \")\n : \"A software project.\";\n }\n\n // Detect language and stack from build files\n let language = \"unknown\";\n const stack: string[] = [];\n\n for (const [file, signal] of Object.entries(BUILD_FILE_SIGNALS)) {\n if (existsSync(join(targetRoot, file))) {\n if (language === \"unknown\" && signal.language !== \"unknown\") {\n language = signal.language;\n }\n for (const s of signal.stack) {\n if (!stack.includes(s)) stack.push(s);\n }\n }\n }\n\n return {\n description,\n language,\n domains: [],\n stack: stack.length ? stack : [language],\n suggestedAgents: [\"code-reviewer\", \"software-architect\"],\n source: \"fallback\",\n };\n}\n\nfunction parseAnalysisOutput(raw: string): ProjectAnalysis | null {\n const text = raw.trim();\n if (!text) return null;\n\n // Try to extract JSON from the output (may be wrapped in markdown or Claude JSON envelope)\n let jsonText = text;\n\n // Handle Claude --output-format json envelope: { \"result\": \"...\" }\n try {\n const envelope = JSON.parse(text);\n if (typeof envelope.result === \"string\") {\n jsonText = envelope.result.trim();\n } else if (envelope.description || envelope.domains) {\n // Already the analysis object\n return validateAnalysis(envelope);\n }\n } catch {\n // not a JSON envelope, proceed\n }\n\n // Strip markdown fences if present\n const fenced = jsonText.match(/```(?:json)?\\s*([\\s\\S]*?)\\s*```/i);\n if (fenced) {\n jsonText = fenced[1].trim();\n }\n\n try {\n const parsed = JSON.parse(jsonText);\n return validateAnalysis(parsed);\n } catch {\n // try to find JSON object in the text\n const match = jsonText.match(/\\{[\\s\\S]*\\}/);\n if (match) {\n try {\n const parsed = JSON.parse(match[0]);\n return validateAnalysis(parsed);\n } catch {\n return null;\n }\n }\n return null;\n }\n}\n\nfunction validateAnalysis(parsed: Record<string, unknown>): ProjectAnalysis | null {\n if (!parsed || typeof parsed !== \"object\") return null;\n\n const description = typeof parsed.description === \"string\" ? parsed.description.trim() : \"\";\n const language = typeof parsed.language === \"string\" ? parsed.language.trim().toLowerCase() : \"\";\n const domains = Array.isArray(parsed.domains)\n ? (parsed.domains as unknown[]).filter((d): d is string => typeof d === \"string\")\n : [];\n const stack = Array.isArray(parsed.stack)\n ? (parsed.stack as unknown[]).filter((s): s is string => typeof s === \"string\")\n : [];\n const suggestedAgents = Array.isArray(parsed.suggestedAgents)\n ? (parsed.suggestedAgents as unknown[]).filter((a): a is string => typeof a === \"string\")\n : [];\n\n if (!description && domains.length === 0 && stack.length === 0) return null;\n\n return {\n description: description || \"A software project.\",\n language,\n domains,\n stack,\n suggestedAgents,\n source: \"cli\",\n };\n}\n\nfunction isBlockedProjectAnalysisResponse(analysis: ProjectAnalysis): boolean {\n const normalized = `${analysis.description || \"\"}`.toLowerCase();\n const indicators = [\n \"could not inspect the repository files\",\n \"local command execution is blocked\",\n \"please provide access\",\n \"paste the key files\",\n \"failed to inspect\",\n \"unable to access the repository\",\n ];\n return indicators.some((indicator) => normalized.includes(indicator));\n}\n\n// ── Analysis cache ────────────────────────────────────────────────────────────\n\nconst ANALYSIS_CACHE_TTL_MS = 24 * 60 * 60 * 1000; // 24h\n\nfunction computeProjectHash(targetRoot: string): string {\n const buildFiles = Object.keys(BUILD_FILE_SIGNALS);\n const found = buildFiles.filter((f) => existsSync(join(targetRoot, f))).sort();\n return createHash(\"sha256\").update(found.join(\",\")).digest(\"hex\").slice(0, 16);\n}\n\nasync function loadCachedAnalysis(targetRoot: string): Promise<ProjectAnalysis | null> {\n const resource = getSettingStateResource();\n if (!resource) return null;\n const hash = computeProjectHash(targetRoot);\n const key = `project-analysis:${hash}`;\n try {\n const record = await resource.get(key);\n if (!record?.value) return null;\n const cached = record.value as { analysis: ProjectAnalysis; updatedAt: string };\n if (!cached.analysis || !cached.updatedAt) return null;\n if (Date.now() - Date.parse(cached.updatedAt) > ANALYSIS_CACHE_TTL_MS) return null;\n return cached.analysis;\n } catch {\n return null;\n }\n}\n\nasync function saveCachedAnalysis(targetRoot: string, analysis: ProjectAnalysis): Promise<void> {\n const resource = getSettingStateResource();\n if (!resource) return;\n const hash = computeProjectHash(targetRoot);\n const key = `project-analysis:${hash}`;\n try {\n await resource.replace(key, {\n id: key,\n scope: \"system\",\n source: \"detected\",\n value: { analysis, updatedAt: new Date().toISOString() },\n });\n } catch {\n // non-critical\n }\n}\n\nexport { buildFallbackAnalysis };\n\nexport async function analyzeProjectWithCli(\n provider: string,\n targetRoot: string,\n options?: { forceRefresh?: boolean },\n): Promise<ProjectAnalysis> {\n // Check cache first\n if (!options?.forceRefresh) {\n const cached = await loadCachedAnalysis(targetRoot);\n if (cached) {\n logger.info(\"Using cached project analysis.\");\n return cached;\n }\n }\n\n const normalizedProvider = provider.trim().toLowerCase();\n const providers = detectAvailableProviders();\n const providerInfo = providers.find((p) => p.name === normalizedProvider && p.available);\n\n if (!providerInfo) {\n logger.warn(\n { provider: normalizedProvider },\n \"Requested CLI provider not available, using fallback analysis\",\n );\n return buildFallbackAnalysis(targetRoot);\n }\n\n const tempDir = mkdtempSync(join(tmpdir(), \"fifony-scan-\"));\n const promptFile = join(tempDir, \"fifony-scan-prompt.txt\");\n const analysisPrompt = await renderPrompt(\"project-analysis\");\n writeFileSync(promptFile, analysisPrompt, \"utf8\");\n\n // Build environment with prompt file path\n const processEnv: Record<string, string> = {};\n for (const [key, value] of Object.entries(env)) {\n if (typeof value === \"string\") processEnv[key] = value;\n }\n processEnv.FIFONY_PROMPT_FILE = promptFile;\n\n try {\n const output = await new Promise<string>((resolve, reject) => {\n let stdout = \"\";\n let stderr = \"\";\n let timedOut = false;\n\n let args: string[];\n let command: string;\n\n if (normalizedProvider === \"claude\") {\n command = \"claude\";\n args = [\n \"--print\",\n \"--no-session-persistence\",\n \"--output-format\", \"json\",\n \"-p\", analysisPrompt,\n ];\n } else if (normalizedProvider === \"codex\") {\n command = \"sh\";\n args = [\"-c\", `codex exec --skip-git-repo-check < \"${promptFile}\"`];\n } else {\n reject(new Error(`Unsupported provider: ${normalizedProvider}`));\n return;\n }\n\n const child = spawn(command, args, {\n cwd: targetRoot,\n env: processEnv,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n if (child.stdin) child.stdin.end();\n\n child.stdout?.on(\"data\", (chunk: Buffer) => {\n stdout = appendFileTail(stdout, chunk.toString(\"utf8\"), 64_000);\n });\n\n child.stderr?.on(\"data\", (chunk: Buffer) => {\n stderr = appendFileTail(stderr, chunk.toString(\"utf8\"), 16_000);\n });\n\n const timer = setTimeout(() => {\n timedOut = true;\n child.kill(\"SIGTERM\");\n }, 120_000);\n\n child.on(\"error\", (err) => {\n clearTimeout(timer);\n reject(new Error(`Failed to spawn ${normalizedProvider}: ${err.message}`));\n });\n\n child.on(\"close\", (code) => {\n clearTimeout(timer);\n if (timedOut) {\n reject(new Error(`CLI analysis timed out after 120s`));\n return;\n }\n if (code !== 0) {\n logger.debug(\n { provider: normalizedProvider, code, stderr: stderr.slice(0, 500) },\n \"CLI analysis command exited with non-zero code\",\n );\n }\n resolve(stdout);\n });\n });\n\n const analysis = parseAnalysisOutput(output);\n if (analysis && !isBlockedProjectAnalysisResponse(analysis)) {\n logger.info(\n { provider: normalizedProvider, domains: analysis.domains, stack: analysis.stack },\n \"CLI project analysis completed\",\n );\n // Cache the result for future use\n await saveCachedAnalysis(targetRoot, analysis);\n return analysis;\n }\n\n if (!analysis) {\n logger.warn(\n { provider: normalizedProvider, rawOutput: output.slice(0, 500) },\n \"CLI returned unparseable output, using fallback\",\n );\n } else {\n logger.warn(\n { provider: normalizedProvider, blockedAnalysis: analysis.description },\n \"CLI analysis returned blocked/insufficient context response, using fallback\",\n );\n }\n return buildFallbackAnalysis(targetRoot);\n } catch (error) {\n logger.warn(\n { err: error, provider: normalizedProvider },\n \"CLI analysis failed, using fallback\",\n );\n return buildFallbackAnalysis(targetRoot);\n } finally {\n try {\n rmSync(tempDir, { recursive: true, force: true });\n } catch {\n // ignore cleanup errors\n }\n }\n}\n\n// ── Reference repositories ───────────────────────────────────────────────────\n\ntype ArtifactKind = \"agent\" | \"skill\";\n\ntype RepositoryReferenceInput = {\n id: string;\n name: string;\n url: string;\n description: string;\n fallbackUrls?: string[];\n};\n\nexport type ReferenceImportKind = \"all\" | \"agents\" | \"skills\";\n\nexport type ReferenceRepositoryStatus = {\n id: string;\n name: string;\n url: string;\n path: string;\n present: boolean;\n synced: boolean;\n error?: string;\n remote?: string;\n branch?: string;\n artifactCounts?: {\n agents: number;\n skills: number;\n };\n};\n\nexport type ReferenceSyncResult = {\n id: string;\n path: string;\n action: \"cloned\" | \"updated\" | \"failed\";\n message: string;\n};\n\ntype ReferenceArtifact = {\n kind: ArtifactKind;\n sourcePath: string;\n targetName: string;\n};\n\ntype ReferenceArtifactCollector = (repoPath: string) => ReferenceArtifact[];\n\nexport type ReferenceImportSummary = {\n repositoryId: string;\n localPath: string;\n requestedKind: ReferenceImportKind;\n dryRun: boolean;\n importedAgents: string[];\n importedSkills: string[];\n skippedAgents: string[];\n skippedSkills: string[];\n errors: Array<{ kind: ArtifactKind; targetName: string; error: string }>;\n};\n\nconst DEFAULT_REFERENCE_REPOSITORIES: RepositoryReferenceInput[] = [\n {\n id: \"ring\",\n name: \"LerianStudio/ring\",\n url: \"https://github.com/LerianStudio/ring.git\",\n description: \"Massive reference library for agents, skills, commands, and engineering standards.\",\n fallbackUrls: [\"git@github.com:LerianStudio/ring.git\"],\n },\n {\n id: \"agency-agents\",\n name: \"msitarzewski/agency-agents\",\n url: \"https://github.com/msitarzewski/agency-agents.git\",\n description: \"Reference agent set focused on frontend, backend, QA, and review roles.\",\n },\n {\n id: \"impeccable\",\n name: \"pbakaus/impeccable\",\n url: \"https://github.com/pbakaus/impeccable.git\",\n description: \"Frontend polish and impeccable-style quality workflows.\",\n },\n];\n\nconst REPOSITORY_ROOT = resolve(homedir(), \".fifony\", \"repositories\");\nconst MAX_SCAN_DEPTH = 8;\nconst SKIP_DIRS = new Set([\n \".git\",\n \".github\",\n \"node_modules\",\n \"dist\",\n \"build\",\n \"coverage\",\n \"tmp\",\n \"temp\",\n]);\nconst AGENCY_AGENTS_EXCLUDED_DIRS = new Set([\n \"examples\",\n \"strategy\",\n]);\n\nconst REFERENCE_REPOSITORY_PARSERS: Record<string, ReferenceArtifactCollector> = {\n ring: collectStandardArtifacts,\n \"agency-agents\": collectAgencyArtifacts,\n impeccable: collectImpeccableArtifacts,\n};\n\nfunction runGit(args: string[], cwd?: string): string {\n return execFileSync(\"git\", args, {\n cwd,\n encoding: \"utf8\",\n stdio: \"pipe\",\n timeout: 120_000,\n }).toString().trim();\n}\n\nfunction slugify(value: string): string {\n const safe = value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9._-]+/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/(^-|-$)/g, \"\");\n return safe || \"reference-item\";\n}\n\nfunction uniqueSuffix(base: string, used: Set<string>): string {\n if (!used.has(base)) {\n used.add(base);\n return base;\n }\n\n let i = 0;\n while (true) {\n const candidate = `${base}-${++i}`;\n if (!used.has(candidate)) {\n used.add(candidate);\n return candidate;\n }\n }\n}\n\nfunction collectDirectoryEntries(path: string): Dirent[] {\n try {\n return readdirSync(path, { withFileTypes: true });\n } catch {\n return [];\n }\n}\n\nfunction readRepositoryLine(path: string): string | undefined {\n try {\n return runGit([\"-C\", path, \"remote\", \"get-url\", \"origin\"]);\n } catch {\n return undefined;\n }\n}\n\nfunction readCurrentBranch(path: string): string | undefined {\n try {\n return runGit([\"-C\", path, \"rev-parse\", \"--abbrev-ref\", \"HEAD\"]);\n } catch {\n return undefined;\n }\n}\n\nfunction isMarkdownFile(value: string, expectedName: string): boolean {\n const lower = value.toLowerCase();\n return lower.endsWith(\".md\") && lower !== expectedName;\n}\n\nfunction isReferenceFrontMatterFile(filePath: string): boolean {\n let source: string;\n try {\n source = readFileSync(filePath, \"utf8\");\n } catch {\n return false;\n }\n\n const match = source.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/);\n if (!match) {\n return false;\n }\n\n const header = match[1];\n return /^name:\\s*.+/im.test(header) && /^description:\\s*.+/im.test(header);\n}\n\nfunction buildRelativeArtifactName(repoPath: string, sourcePath: string): string {\n const relative = sourcePath.startsWith(repoPath) ? relativePath(repoPath, sourcePath) : sourcePath;\n const parent = dirname(relative);\n const parentSlug = parent === \".\" ? \"\" : parent.split(/[/\\\\]/).map((segment) => slugify(segment)).filter(Boolean).join(\"__\");\n const baseName = slugify(basename(relative, \".md\"));\n return parentSlug ? `${parentSlug}__${baseName}` : baseName;\n}\n\nfunction collectAgentArtifacts(\n agentsDir: string,\n usedNames: Set<string>,\n out: ReferenceArtifact[],\n): void {\n const parent = slugify(basename(dirname(agentsDir)));\n const entries = collectDirectoryEntries(agentsDir);\n\n for (const entry of entries) {\n const itemPath = join(agentsDir, entry.name);\n\n if (entry.isDirectory()) {\n const nestedAgentSpec = join(itemPath, \"AGENT.md\");\n if (existsSync(nestedAgentSpec)) {\n const name = uniqueSuffix(`${parent}__${slugify(entry.name)}`, usedNames);\n out.push({ kind: \"agent\", sourcePath: nestedAgentSpec, targetName: name });\n }\n continue;\n }\n\n if (!isMarkdownFile(entry.name, \"readme.md\")) {\n continue;\n }\n\n const baseName = basename(entry.name, \".md\");\n if (baseName.trim().length === 0 || baseName.toLowerCase() === \"changelog\") {\n continue;\n }\n\n const name = uniqueSuffix(`${parent}__${slugify(baseName)}`, usedNames);\n out.push({ kind: \"agent\", sourcePath: itemPath, targetName: name });\n }\n}\n\nfunction collectSkillArtifacts(\n skillsDir: string,\n usedNames: Set<string>,\n out: ReferenceArtifact[],\n): void {\n const parent = slugify(basename(dirname(skillsDir)));\n const entries = collectDirectoryEntries(skillsDir);\n\n for (const entry of entries) {\n const itemPath = join(skillsDir, entry.name);\n if (entry.isDirectory()) {\n const skillFile = join(itemPath, \"SKILL.md\");\n if (existsSync(skillFile)) {\n const name = uniqueSuffix(`${parent}__${slugify(entry.name)}`, usedNames);\n out.push({ kind: \"skill\", sourcePath: skillFile, targetName: name });\n }\n continue;\n }\n\n if (entry.isFile() && entry.name.toLowerCase() === \"skill.md\") {\n const name = uniqueSuffix(`${parent}__skill`, usedNames);\n out.push({ kind: \"skill\", sourcePath: itemPath, targetName: name });\n }\n }\n}\n\nfunction collectStandardArtifacts(repoPath: string): ReferenceArtifact[] {\n const agentsUsed = new Set<string>();\n const skillsUsed = new Set<string>();\n const artifacts: ReferenceArtifact[] = [];\n const queue: Array<{ path: string; depth: number }> = [{ path: repoPath, depth: 0 }];\n\n while (queue.length > 0) {\n const state = queue.shift();\n if (!state) break;\n\n if (state.depth > MAX_SCAN_DEPTH) {\n continue;\n }\n\n const entries = collectDirectoryEntries(state.path);\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n if (SKIP_DIRS.has(entry.name)) continue;\n\n const childPath = join(state.path, entry.name);\n if (entry.name === \"agents\") {\n collectAgentArtifacts(childPath, agentsUsed, artifacts);\n }\n\n if (entry.name === \"skills\") {\n collectSkillArtifacts(childPath, skillsUsed, artifacts);\n }\n\n queue.push({ path: childPath, depth: state.depth + 1 });\n }\n }\n\n return artifacts;\n}\n\nfunction collectAgencyArtifacts(repoPath: string): ReferenceArtifact[] {\n const agentsUsed = new Set<string>();\n const artifacts: ReferenceArtifact[] = [];\n const queue: Array<{ path: string; depth: number }> = [{ path: repoPath, depth: 0 }];\n\n while (queue.length > 0) {\n const state = queue.shift();\n if (!state) break;\n\n if (state.depth > MAX_SCAN_DEPTH) {\n continue;\n }\n\n const entries = collectDirectoryEntries(state.path);\n for (const entry of entries) {\n if (entry.isDirectory()) {\n if (SKIP_DIRS.has(entry.name) || AGENCY_AGENTS_EXCLUDED_DIRS.has(entry.name)) {\n continue;\n }\n queue.push({ path: join(state.path, entry.name), depth: state.depth + 1 });\n continue;\n }\n\n if (!isMarkdownFile(entry.name, \"readme.md\") || !isReferenceFrontMatterFile(join(state.path, entry.name))) {\n continue;\n }\n\n const itemPath = join(state.path, entry.name);\n const targetName = uniqueSuffix(buildRelativeArtifactName(repoPath, itemPath), agentsUsed);\n artifacts.push({\n kind: \"agent\",\n sourcePath: itemPath,\n targetName,\n });\n }\n }\n\n return artifacts;\n}\n\nfunction collectImpeccableArtifacts(repoPath: string): ReferenceArtifact[] {\n const skillsUsed = new Set<string>();\n const artifacts: ReferenceArtifact[] = [];\n const sourceSkills = join(repoPath, \"source\", \"skills\");\n if (existsSync(sourceSkills)) {\n collectSkillArtifacts(sourceSkills, skillsUsed, artifacts);\n return artifacts;\n }\n\n const claudeSkills = join(repoPath, \".claude\", \"skills\");\n if (existsSync(claudeSkills)) {\n collectSkillArtifacts(claudeSkills, skillsUsed, artifacts);\n }\n\n return artifacts;\n}\n\nexport function collectArtifacts(repoPath: string, repositoryId?: string): ReferenceArtifact[] {\n const parser = repositoryId && REFERENCE_REPOSITORY_PARSERS[repositoryId]\n ? REFERENCE_REPOSITORY_PARSERS[repositoryId]\n : collectStandardArtifacts;\n return parser(repoPath);\n}\n\nfunction countArtifactKinds(artifacts: ReferenceArtifact[]): { agents: number; skills: number } {\n let agents = 0;\n let skills = 0;\n for (const artifact of artifacts) {\n if (artifact.kind === \"agent\") {\n agents += 1;\n } else {\n skills += 1;\n }\n }\n return { agents, skills };\n}\n\nexport function getReferenceRepositoriesRoot(): string {\n return REPOSITORY_ROOT;\n}\n\nexport function listReferenceRepositories(): ReferenceRepositoryStatus[] {\n return DEFAULT_REFERENCE_REPOSITORIES.map((repo) => {\n const path = join(REPOSITORY_ROOT, repo.id);\n const status: ReferenceRepositoryStatus = {\n id: repo.id,\n name: repo.name,\n url: repo.url,\n path,\n present: existsSync(path),\n synced: false,\n };\n\n if (!status.present) {\n return status;\n }\n\n if (!existsSync(join(path, \".git\"))) {\n status.error = \"Path exists but is not a git repo\";\n return status;\n }\n\n status.remote = readRepositoryLine(path);\n status.branch = readCurrentBranch(path);\n status.synced = typeof status.remote === \"string\";\n if (status.synced) {\n const artifacts = collectArtifacts(path, repo.id);\n status.artifactCounts = countArtifactKinds(artifacts);\n }\n return status;\n });\n}\n\nexport function resolveReferenceRepository(query: string): RepositoryReferenceInput | undefined {\n const normalized = query.trim().toLowerCase();\n if (!normalized) return undefined;\n const normalizedWithoutGit = normalized.endsWith(\".git\") ? normalized.slice(0, -4) : normalized;\n\n return DEFAULT_REFERENCE_REPOSITORIES.find((repo) =>\n repo.id.toLowerCase() === normalizedWithoutGit\n || repo.name.toLowerCase() === normalizedWithoutGit\n || repo.url.toLowerCase() === normalized\n || repo.url.toLowerCase() === normalizedWithoutGit\n || repo.url.toLowerCase().endsWith(`/${normalizedWithoutGit}.git`)\n || repo.url.toLowerCase().endsWith(`/${normalizedWithoutGit}`),\n );\n}\n\nexport function syncReferenceRepositories(\n repositoryId?: string,\n): ReferenceSyncResult[] {\n const root = REPOSITORY_ROOT;\n mkdirSync(root, { recursive: true });\n const repos = repositoryId\n ? [resolveReferenceRepository(repositoryId)]\n : DEFAULT_REFERENCE_REPOSITORIES;\n const selected = repos.filter((repo): repo is RepositoryReferenceInput => Boolean(repo));\n if (repositoryId && selected.length === 0) {\n throw new Error(`Unknown reference repository: ${repositoryId}`);\n }\n\n const results: ReferenceSyncResult[] = [];\n\n for (const repo of selected) {\n const target = join(root, repo.id);\n const candidates = [repo.url, ...(repo.fallbackUrls ?? [])];\n\n if (!existsSync(target)) {\n let cloneError: string | undefined;\n for (const candidate of candidates) {\n try {\n runGit([\"clone\", \"--depth\", \"1\", candidate, target]);\n results.push({\n id: repo.id,\n path: target,\n action: \"cloned\",\n message: `Cloned ${candidate}`,\n });\n cloneError = undefined;\n break;\n } catch (error) {\n cloneError = error instanceof Error ? error.message : String(error);\n }\n }\n\n if (cloneError) {\n results.push({\n id: repo.id,\n path: target,\n action: \"failed\",\n message: cloneError,\n });\n }\n continue;\n }\n\n if (!existsSync(join(target, \".git\"))) {\n results.push({\n id: repo.id,\n path: target,\n action: \"failed\",\n message: \"Path exists but is not a git repository\",\n });\n continue;\n }\n\n try {\n runGit([\"-C\", target, \"fetch\", \"--all\", \"--prune\"]);\n runGit([\"-C\", target, \"pull\", \"--ff-only\"]);\n results.push({\n id: repo.id,\n path: target,\n action: \"updated\",\n message: \"Updated from remote\",\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n results.push({\n id: repo.id,\n path: target,\n action: \"failed\",\n message,\n });\n }\n }\n\n return results;\n}\n\nexport function importReferenceArtifacts(\n repositoryId: string,\n workspaceRoot: string,\n options: {\n kind: ReferenceImportKind;\n overwrite: boolean;\n dryRun: boolean;\n importToGlobal: boolean;\n },\n): ReferenceImportSummary {\n const repository = resolveReferenceRepository(repositoryId);\n if (!repository) {\n throw new Error(`Unknown reference repository: ${repositoryId}`);\n }\n\n const localPath = join(REPOSITORY_ROOT, repository.id);\n if (!existsSync(localPath)) {\n throw new Error(`Repository not synced yet: ${repository.id}. Run 'fifony onboarding sync --repository ${repository.id}' first.`);\n }\n\n const basePath = resolve(workspaceRoot);\n const targetBase = options.importToGlobal\n ? join(homedir(), \".codex\")\n : join(basePath, \".codex\");\n\n const agentsDir = join(targetBase, \"agents\");\n const skillsDir = join(targetBase, \"skills\");\n\n const artifacts = collectArtifacts(localPath, repository.id);\n const filtered = options.kind === \"all\"\n ? artifacts\n : artifacts.filter((artifact) => artifact.kind === options.kind.slice(0, -1));\n\n const summary: ReferenceImportSummary = {\n repositoryId: repository.id,\n localPath,\n requestedKind: options.kind,\n dryRun: options.dryRun,\n importedAgents: [],\n importedSkills: [],\n skippedAgents: [],\n skippedSkills: [],\n errors: [],\n };\n\n if (filtered.length === 0) {\n return summary;\n }\n\n if (!options.dryRun) {\n mkdirSync(targetBase, { recursive: true });\n mkdirSync(agentsDir, { recursive: true });\n mkdirSync(skillsDir, { recursive: true });\n }\n\n for (const artifact of filtered) {\n try {\n const source = readFileSync(artifact.sourcePath, \"utf8\");\n if (artifact.kind === \"agent\") {\n const target = join(agentsDir, `${artifact.targetName}.md`);\n if (!options.overwrite && existsSync(target)) {\n summary.skippedAgents.push(artifact.targetName);\n continue;\n }\n if (options.dryRun) {\n summary.importedAgents.push(artifact.targetName);\n continue;\n }\n writeFileSync(target, source, \"utf8\");\n summary.importedAgents.push(artifact.targetName);\n } else {\n const targetDir = join(skillsDir, artifact.targetName);\n const target = join(targetDir, \"SKILL.md\");\n if (!options.overwrite && existsSync(target)) {\n summary.skippedSkills.push(artifact.targetName);\n continue;\n }\n if (options.dryRun) {\n summary.importedSkills.push(artifact.targetName);\n continue;\n }\n mkdirSync(targetDir, { recursive: true });\n writeFileSync(target, source, \"utf8\");\n summary.importedSkills.push(artifact.targetName);\n }\n } catch (error) {\n summary.errors.push({\n kind: artifact.kind,\n targetName: artifact.targetName,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n return summary;\n}\n","import type { RuntimeState } from \"../../types.ts\";\n\ntype RuntimeApiContext = {\n state: RuntimeState;\n};\n\nlet context: RuntimeApiContext | null = null;\n\nexport function setApiRuntimeContext(state: RuntimeState): void {\n context = { state };\n}\n\nexport function clearApiRuntimeContext(): void {\n context = null;\n}\n\nexport function getApiRuntimeContextOrThrow(): RuntimeApiContext {\n if (!context) {\n throw new Error(\"API runtime context was not initialized.\");\n }\n return context;\n}\n","import type {\n RuntimeState,\n} from \"../../types.ts\";\nimport {\n existsSync,\n readFileSync,\n} from \"node:fs\";\nimport {\n FRONTEND_DIR,\n FRONTEND_ICON_SVG,\n FRONTEND_INDEX,\n FRONTEND_MANIFEST_JSON,\n FRONTEND_MASKABLE_ICON_SVG,\n FRONTEND_OFFLINE_HTML,\n FRONTEND_SERVICE_WORKER_JS,\n} from \"../../concerns/constants.ts\";\nimport { NATIVE_RESOURCE_CONFIGS } from \"../resources/index.ts\";\nimport { logger } from \"../../concerns/logger.ts\";\nimport {\n loadS3dbModule,\n getStateDb,\n setActiveApiPlugin,\n} from \"../store.ts\";\nimport { setApiRuntimeContext } from \"./api-runtime-context.ts\";\nimport { makeWebSocketConfig } from \"../../routes/websocket.ts\";\nexport { broadcastToWebSocketClients } from \"../../routes/websocket.ts\";\n\nimport { registerStateRoutes } from \"../../routes/state.js\";\nimport { registerPlanRoutes } from \"../../routes/plan.js\";\nimport { registerSettingsRoutes } from \"../../routes/settings.js\";\nimport { registerAnalyticsRoutes } from \"../../routes/analytics.js\";\nimport { registerScanningRoutes } from \"../../routes/scanning.js\";\nimport { registerCatalogRoutes } from \"../../routes/catalog.js\";\nimport { registerReferenceRepositoryRoutes } from \"../../routes/reference-repositories.js\";\nimport { registerMiscRoutes } from \"../../routes/misc.js\";\n\n// ── Route collector ──────────────────────────────────────────────────────────\n// Accumulates routes before ApiPlugin construction (ApiPlugin only accepts routes\n// via constructor config, not via .get()/.post() methods after creation).\n\nclass RouteCollector {\n readonly routes: Record<string, (c: any) => any> = {};\n\n get(path: string, handler: (c: any) => any) { this.routes[`GET ${path}`] = handler; }\n post(path: string, handler: (c: any) => any) { this.routes[`POST ${path}`] = handler; }\n put(path: string, handler: (c: any) => any) { this.routes[`PUT ${path}`] = handler; }\n patch(path: string, handler: (c: any) => any) { this.routes[`PATCH ${path}`] = handler; }\n delete(path: string, handler: (c: any) => any) { this.routes[`DELETE ${path}`] = handler; }\n}\n\n// ── API server ───────────────────────────────────────────────────────────────\n\nexport async function startApiServer(\n state: RuntimeState,\n port: number,\n): Promise<void> {\n logger.info({ port }, \"[API] Starting API server\");\n const stateDb = getStateDb();\n if (!stateDb) {\n throw new Error(\"Cannot start API plugin before the database is initialized.\");\n }\n\n const { ApiPlugin } = await loadS3dbModule();\n\n const resourceConfigs: Record<string, Record<string, unknown>> = Object.fromEntries(\n NATIVE_RESOURCE_CONFIGS.map((resourceConfig) => [\n resourceConfig.name,\n {\n ...(resourceConfig.api ?? {}),\n versionPrefix: \"api\",\n },\n ]),\n );\n const nativeResourceNames = new Set(Object.keys(resourceConfigs));\n\n const existingResources = await (stateDb as { listResources?: () => Promise<Array<{ name: string }>> }).listResources?.();\n for (const item of existingResources || []) {\n if (\n typeof item?.name === \"string\" &&\n item.name.startsWith(\"fifony_\") &&\n !nativeResourceNames.has(item.name)\n ) {\n resourceConfigs[item.name] = { enabled: false };\n }\n }\n\n setApiRuntimeContext(state);\n\n const serveTextFile = (filePath: string, contentType: string, cacheControl = \"no-cache\") => {\n if (!existsSync(filePath)) {\n return new Response(\"Not found\", { status: 404 });\n }\n return new Response(readFileSync(filePath), {\n headers: {\n \"content-type\": contentType,\n \"cache-control\": cacheControl,\n },\n });\n };\n\n const serveAppShell = () => {\n if (!existsSync(FRONTEND_INDEX)) {\n return new Response(\"Not found\", { status: 404 });\n }\n const html = readFileSync(FRONTEND_INDEX, \"utf8\")\n .replace('href=\"/assets/manifest.webmanifest\"', 'href=\"/manifest.webmanifest\"')\n .replaceAll('href=\"/assets/icon.svg\"', 'href=\"/icon.svg\"');\n return new Response(html, {\n headers: {\n \"content-type\": \"text/html; charset=utf-8\",\n \"cache-control\": \"no-cache\",\n },\n });\n };\n\n // Collect routes from route modules before plugin instantiation\n const collector = new RouteCollector();\n registerStateRoutes(collector, state);\n registerPlanRoutes(collector, state);\n registerSettingsRoutes(collector, state);\n registerAnalyticsRoutes(collector);\n registerScanningRoutes(collector, state);\n registerCatalogRoutes(collector);\n registerReferenceRepositoryRoutes(collector);\n registerMiscRoutes(collector, state);\n\n const apiPlugin = new ApiPlugin({\n port,\n host: \"0.0.0.0\",\n versionPrefix: false,\n // HTTP + WebSocket on the same port via listeners\n listeners: [{\n bind: { host: \"0.0.0.0\", port },\n protocols: {\n http: true,\n websocket: makeWebSocketConfig(state),\n },\n }],\n rootRoute: () => new Response(null, {\n status: 302,\n headers: { location: \"/kanban\" },\n }),\n static: [{\n driver: \"filesystem\",\n path: \"/assets\",\n root: FRONTEND_DIR,\n pwa: false,\n config: { etag: true },\n }],\n docs: { enabled: true, title: \"Fifony API\", version: \"1.0.0\", description: \"Local orchestration API for Fifony\" },\n cors: { enabled: true, origin: \"*\" },\n security: { enabled: false },\n logging: { enabled: true, excludePaths: [\"/health\", \"/status\", \"/**/*.js\", \"/**/*.css\", \"/**/*.svg\"] },\n compression: { enabled: true, threshold: 1024 },\n health: { enabled: true },\n resources: {\n ...resourceConfigs,\n },\n routes: {\n ...collector.routes,\n \"GET /manifest.webmanifest\": () =>\n serveTextFile(FRONTEND_MANIFEST_JSON, \"application/manifest+json; charset=utf-8\"),\n \"GET /service-worker.js\": () =>\n serveTextFile(FRONTEND_SERVICE_WORKER_JS, \"application/javascript; charset=utf-8\", \"no-cache\"),\n \"GET /offline.html\": () =>\n serveTextFile(FRONTEND_OFFLINE_HTML, \"text/html; charset=utf-8\"),\n \"GET /icon.svg\": () =>\n serveTextFile(FRONTEND_ICON_SVG, \"image/svg+xml\", \"public, max-age=604800, immutable\"),\n \"GET /icon-maskable.svg\": () =>\n serveTextFile(FRONTEND_MASKABLE_ICON_SVG, \"image/svg+xml\", \"public, max-age=604800, immutable\"),\n \"GET /onboarding\": () => serveAppShell(),\n \"GET /kanban\": () => serveAppShell(),\n \"GET /issues\": () => serveAppShell(),\n \"GET /discover\": () => serveAppShell(),\n \"GET /agents\": () => serveAppShell(),\n \"GET /settings\": () => serveAppShell(),\n \"GET /settings/general\": () => serveAppShell(),\n \"GET /settings/notifications\": () => serveAppShell(),\n \"GET /settings/workflow\": () => serveAppShell(),\n \"GET /settings/providers\": () => serveAppShell(),\n \"GET /api/health\": (c: any) =>\n c.json({ status: state.booting ? \"booting\" : \"ready\" }),\n },\n });\n\n const plugin = await stateDb.usePlugin(apiPlugin, \"api\") as { stop?: () => Promise<void> };\n setActiveApiPlugin(plugin);\n logger.info(`Local dashboard available at http://localhost:${port}`);\n logger.info(`WebSocket available at ws://localhost:${port}/ws`);\n logger.info(`State API: http://localhost:${port}/api/state`);\n logger.info(`OpenAPI docs available at http://localhost:${port}/docs`);\n}\n","import { S3DB_RUNTIME_RESOURCE } from \"../../concerns/constants.ts\";\n\nexport default {\n name: S3DB_RUNTIME_RESOURCE,\n attributes: {\n id: \"string|required\",\n schemaVersion: \"number|required\",\n trackerKind: \"string|required\",\n runtimeTag: \"string|optional\",\n updatedAt: \"datetime|required\",\n state: \"json|required\",\n },\n behavior: \"body-overflow\",\n paranoid: false,\n timestamps: false,\n api: {\n auth: false,\n methods: [\"GET\", \"HEAD\", \"OPTIONS\"],\n description: \"Runtime state snapshots\",\n },\n};\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type {\n AgentDirective,\n AgentDirectiveStatus,\n AgentProviderRole,\n AgentTokenUsage,\n IssueEntry,\n JsonRecord,\n} from \"../types.ts\";\nimport { toStringValue } from \"../concerns/helpers.ts\";\nimport { logger } from \"../concerns/logger.ts\";\n\nexport function normalizeAgentDirectiveStatus(value: unknown, fallback: AgentDirectiveStatus): AgentDirectiveStatus {\n const normalized = typeof value === \"string\" ? value.trim().toLowerCase() : \"\";\n if (normalized === \"done\" || normalized === \"continue\" || normalized === \"blocked\" || normalized === \"failed\") {\n return normalized;\n }\n return fallback;\n}\n\nexport function addTokenUsage(issue: IssueEntry, usage?: AgentTokenUsage, role?: AgentProviderRole): void {\n if (!usage || usage.totalTokens === 0) return;\n\n // 1. Aggregate overall tokenUsage summary\n const prev = issue.tokenUsage ?? { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n issue.tokenUsage = {\n inputTokens: prev.inputTokens + usage.inputTokens,\n outputTokens: prev.outputTokens + usage.outputTokens,\n totalTokens: prev.totalTokens + usage.totalTokens,\n model: usage.model || prev.model,\n };\n\n // 2. Per-phase breakdown (planner / executor / reviewer)\n if (role) {\n if (!issue.tokensByPhase) issue.tokensByPhase = {} as Record<AgentProviderRole, AgentTokenUsage>;\n const prevPhase = issue.tokensByPhase[role] ?? { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n issue.tokensByPhase[role] = {\n inputTokens: prevPhase.inputTokens + usage.inputTokens,\n outputTokens: prevPhase.outputTokens + usage.outputTokens,\n totalTokens: prevPhase.totalTokens + usage.totalTokens,\n model: usage.model || prevPhase.model,\n };\n }\n\n // 3. Per-model breakdown with full input/output detail\n const model = usage.model || issue.tokenUsage?.model || \"unknown\";\n if (!issue.tokensByModel) issue.tokensByModel = {};\n const prevModel = issue.tokensByModel[model] ?? { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n issue.tokensByModel[model] = {\n inputTokens: prevModel.inputTokens + usage.inputTokens,\n outputTokens: prevModel.outputTokens + usage.outputTokens,\n totalTokens: prevModel.totalTokens + usage.totalTokens,\n model,\n };\n\n // 4. Legacy per-model totals for EventualConsistency analytics\n if (!issue.usage) issue.usage = { tokens: {} };\n issue.usage.tokens[model] = (issue.usage.tokens[model] || 0) + usage.totalTokens;\n}\n\nexport function extractOutputMarker(output: string, name: string): string {\n const match = output.match(new RegExp(`^${name}=(.+)$`, \"im\"));\n return match?.[1]?.trim() ?? \"\";\n}\n\nexport function extractTokenUsage(output: string, jsonObj?: JsonRecord | null): AgentTokenUsage | undefined {\n if (jsonObj) {\n // 1a. Claude --output-format json: modelUsage field (richer — includes cache tokens, per-model breakdown)\n const modelUsage = jsonObj.modelUsage as Record<string, Record<string, unknown>> | undefined;\n if (modelUsage && typeof modelUsage === \"object\") {\n let totalInput = 0, totalOutput = 0, primaryModel = \"\", maxTokens = 0;\n for (const [model, data] of Object.entries(modelUsage)) {\n const inp = Number(data?.inputTokens || 0) + Number(data?.cacheReadInputTokens || 0) + Number(data?.cacheCreationInputTokens || 0);\n const out = Number(data?.outputTokens || 0);\n totalInput += inp;\n totalOutput += out;\n if (inp + out > maxTokens) { maxTokens = inp + out; primaryModel = model; }\n }\n if (totalInput > 0 || totalOutput > 0) {\n return {\n inputTokens: totalInput,\n outputTokens: totalOutput,\n totalTokens: totalInput + totalOutput,\n costUsd: typeof jsonObj.cost_usd === \"number\" ? jsonObj.cost_usd : undefined,\n model: primaryModel || (typeof jsonObj.model === \"string\" ? jsonObj.model : undefined),\n };\n }\n }\n\n // 1b. Claude --output-format json: usage field (aggregate totals)\n const usage = jsonObj.usage as Record<string, unknown> | undefined;\n if (usage && typeof usage === \"object\") {\n const inp = Number(usage.input_tokens) || 0;\n const out = Number(usage.output_tokens) || 0;\n if (inp > 0 || out > 0) {\n return {\n inputTokens: inp,\n outputTokens: out,\n totalTokens: inp + out,\n costUsd: typeof jsonObj.cost_usd === \"number\" ? jsonObj.cost_usd : undefined,\n model: typeof jsonObj.model === \"string\" ? jsonObj.model : undefined,\n };\n }\n }\n }\n\n // 2. Codex: \"tokens used\\n1,681\\n\" and \"model: gpt-5.3\" in stdout\n const codexMatch = output.match(/tokens?\\s+used\\s*\\n\\s*([\\d,]+)/i);\n if (codexMatch) {\n const total = parseInt(codexMatch[1].replace(/,/g, \"\"), 10);\n if (total > 0) {\n const modelMatch = output.match(/^model:\\s*(.+)$/im);\n return {\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: total,\n model: modelMatch?.[1]?.trim() || undefined,\n };\n }\n }\n\n return undefined;\n}\n\nexport function tryParseJsonOutput(output: string): JsonRecord | null {\n const trimmed = output.trim();\n // --output-format json wraps the result in a JSON object with a \"result\" field\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n const obj = parsed as JsonRecord;\n\n // --json-schema puts structured output in .structured_output (not .result)\n if (obj.structured_output && typeof obj.structured_output === \"object\" && !Array.isArray(obj.structured_output)) {\n return obj.structured_output as JsonRecord;\n }\n\n // Claude --output-format json returns { result: \"...\" } — the result may itself be JSON\n if (typeof obj.result === \"string\") {\n try {\n const inner = JSON.parse(obj.result) as unknown;\n if (inner && typeof inner === \"object\" && !Array.isArray(inner)) {\n return inner as JsonRecord;\n }\n } catch {\n // result is plain text, not JSON\n }\n }\n // Direct JSON with status field (from --json-schema)\n if (obj.status) return obj;\n }\n } catch {\n // Not JSON output — fall through to legacy parsing\n }\n return null;\n}\n\nexport function readAgentDirective(workspacePath: string, output: string, success: boolean): AgentDirective {\n const fallbackStatus: AgentDirectiveStatus = success ? \"done\" : \"failed\";\n const resultFile = join(workspacePath, \"result.json\");\n let resultPayload: JsonRecord = {};\n\n // 1. Try structured JSON from stdout (claude --output-format json --json-schema)\n const fullJson = (() => {\n try { return JSON.parse(output.trim()) as JsonRecord; } catch { return null; }\n })();\n const jsonOutput = tryParseJsonOutput(output);\n const tokenUsage = extractTokenUsage(output, fullJson);\n\n if (jsonOutput?.status) {\n return {\n status: normalizeAgentDirectiveStatus(jsonOutput.status, fallbackStatus),\n summary: toStringValue(jsonOutput.summary) || toStringValue(jsonOutput.message) || \"\",\n nextPrompt: toStringValue(jsonOutput.nextPrompt) || toStringValue(jsonOutput.next_prompt) || \"\",\n tokenUsage,\n };\n }\n\n // 2. Try result.json file\n if (existsSync(resultFile)) {\n try {\n const parsed = JSON.parse(readFileSync(resultFile, \"utf8\")) as unknown;\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n resultPayload = parsed as JsonRecord;\n }\n } catch (error) {\n logger.warn(`Invalid result.json in ${workspacePath}: ${String(error)}`);\n }\n }\n\n // 3. Fall back to file + output marker parsing\n const status = normalizeAgentDirectiveStatus(\n resultPayload.status ?? extractOutputMarker(output, \"FIFONY_STATUS\"),\n fallbackStatus,\n );\n const summary =\n toStringValue(resultPayload.summary)\n || toStringValue(resultPayload.message)\n || extractOutputMarker(output, \"FIFONY_SUMMARY\");\n const nextPrompt =\n toStringValue(resultPayload.nextPrompt)\n || toStringValue(resultPayload.next_prompt)\n || \"\";\n\n return { status, summary, nextPrompt, tokenUsage };\n}\n","import { existsSync, readFileSync, rmSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { IssueEntry } from \"../types.ts\";\n\nexport type AgentPidInfo = {\n pid: number;\n issueId: string;\n startedAt: string;\n command: string;\n};\n\n/** Read PID file from workspace, returns null if missing/invalid. */\nexport function readAgentPid(workspacePath: string): AgentPidInfo | null {\n const pidFile = join(workspacePath, \"agent.pid\");\n if (!existsSync(pidFile)) return null;\n try {\n const data = JSON.parse(readFileSync(pidFile, \"utf8\")) as AgentPidInfo;\n if (!data?.pid || typeof data.pid !== \"number\") return null;\n return data;\n } catch {\n return null;\n }\n}\n\n/** Check if a process is still running by PID. */\nexport function isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0); // signal 0 = check existence\n return true;\n } catch {\n return false;\n }\n}\n\n/** Check if an issue's agent is still running from a previous session. */\nexport function isAgentStillRunning(issue: IssueEntry): { alive: boolean; pid: AgentPidInfo | null } {\n const wp = issue.workspacePath;\n if (!wp || !existsSync(wp)) return { alive: false, pid: null };\n const pidInfo = readAgentPid(wp);\n if (!pidInfo) return { alive: false, pid: null };\n return { alive: isProcessAlive(pidInfo.pid), pid: pidInfo };\n}\n\n/** Clean stale PID file if the process is dead. */\nexport function cleanStalePidFile(workspacePath: string): void {\n const pidInfo = readAgentPid(workspacePath);\n if (!pidInfo) return;\n if (!isProcessAlive(pidInfo.pid)) {\n try { rmSync(join(workspacePath, \"agent.pid\"), { force: true }); } catch {}\n }\n}\n","import type {\n AgentPipelineRecord,\n AgentPipelineState,\n AgentProviderDefinition,\n AgentSessionRecord,\n AgentSessionState,\n AgentSessionTurn,\n IssueEntry,\n} from \"../types.ts\";\nimport {\n now,\n clamp,\n idToSafePath,\n toNumberValue,\n} from \"../concerns/helpers.ts\";\nimport { logger } from \"../concerns/logger.ts\";\nimport {\n getAgentSessionResource,\n getAgentPipelineResource,\n isStateNotFoundError,\n} from \"../persistence/store.ts\";\n\nexport function buildAgentSessionState(\n issue: IssueEntry,\n attempt: number,\n maxTurns: number,\n): AgentSessionState {\n const createdAt = now();\n return {\n issueId: issue.id,\n issueIdentifier: issue.identifier,\n attempt,\n status: \"running\",\n startedAt: createdAt,\n updatedAt: createdAt,\n maxTurns,\n turns: [],\n lastPrompt: \"\",\n lastPromptFile: \"\",\n lastOutput: \"\",\n lastCode: null,\n lastDirectiveStatus: \"continue\",\n lastDirectiveSummary: \"\",\n nextPrompt: \"\",\n };\n}\n\nexport async function loadAgentSessionState(\n sessionKey: string,\n issue: IssueEntry,\n attempt: number,\n maxTurns: number,\n): Promise<{ session: AgentSessionState; key: string }> {\n const agentSessionResource = getAgentSessionResource();\n if (agentSessionResource) {\n try {\n const record = await agentSessionResource.get(sessionKey) as AgentSessionRecord;\n if (\n record?.session\n && record.issueId === issue.id\n && record.attempt === attempt\n && Array.isArray(record.session.turns)\n ) {\n return {\n session: {\n ...buildAgentSessionState(issue, attempt, maxTurns),\n ...record.session,\n maxTurns,\n turns: record.session.turns as AgentSessionTurn[],\n updatedAt: now(),\n },\n key: sessionKey,\n };\n }\n } catch (error) {\n if (!isStateNotFoundError(error)) {\n logger.warn(`Failed to load session state for ${issue.id}: ${String(error)}`);\n }\n }\n }\n\n return { session: buildAgentSessionState(issue, attempt, maxTurns), key: sessionKey };\n}\n\nexport async function persistAgentSessionState(\n key: string,\n issue: IssueEntry,\n provider: AgentProviderDefinition,\n cycle: number,\n session: AgentSessionState,\n): Promise<void> {\n session.updatedAt = now();\n const agentSessionResource = getAgentSessionResource();\n if (!agentSessionResource) return;\n\n await agentSessionResource.replace(key, {\n id: key,\n issueId: issue.id,\n issueIdentifier: issue.identifier,\n attempt: session.attempt,\n cycle,\n provider: provider.provider,\n role: provider.role,\n updatedAt: session.updatedAt,\n session,\n } satisfies AgentSessionRecord);\n}\n\nexport function buildProviderSessionKey(issue: IssueEntry, attempt: number, provider: AgentProviderDefinition, cycle: number): string {\n return `${idToSafePath(issue.id)}-a${attempt}-${provider.role}-${provider.provider}-c${cycle}`;\n}\n\nexport function buildPipelineKey(issue: IssueEntry, attempt: number): string {\n return `${idToSafePath(issue.id)}-a${attempt}`;\n}\n\nexport function getLatestPipelineAttempt(issue: IssueEntry): number {\n if (issue.state === \"Blocked\" || issue.state === \"Cancelled\") {\n return Math.max(1, issue.attempts);\n }\n return Math.max(1, issue.attempts + 1);\n}\n\nexport function stateConfigMaxTurnsFallback(): number {\n return 4;\n}\n\nexport async function loadAgentPipelineState(\n issue: IssueEntry,\n attempt: number,\n providers: AgentProviderDefinition[],\n): Promise<{ pipeline: AgentPipelineState; key: string }> {\n const pipelineKey = buildPipelineKey(issue, attempt);\n const agentPipelineResource = getAgentPipelineResource();\n\n if (agentPipelineResource) {\n try {\n const record = await agentPipelineResource.get(pipelineKey) as AgentPipelineRecord;\n if (record?.pipeline && record.issueId === issue.id && record.attempt === attempt) {\n return {\n pipeline: {\n issueId: issue.id,\n issueIdentifier: issue.identifier,\n attempt,\n cycle: Math.max(1, toNumberValue(record.pipeline.cycle, 1)),\n activeIndex: clamp(toNumberValue(record.pipeline.activeIndex, 0), 0, Math.max(0, providers.length - 1)),\n updatedAt: now(),\n history: Array.isArray(record.pipeline.history)\n ? record.pipeline.history.filter((entry): entry is string => typeof entry === \"string\")\n : [],\n },\n key: pipelineKey,\n };\n }\n } catch (error) {\n if (!isStateNotFoundError(error)) {\n logger.warn(`Failed to load pipeline state for ${issue.id}: ${String(error)}`);\n }\n }\n }\n\n return {\n pipeline: {\n issueId: issue.id,\n issueIdentifier: issue.identifier,\n attempt,\n cycle: 1,\n activeIndex: 0,\n updatedAt: now(),\n history: [],\n },\n key: pipelineKey,\n };\n}\n\nexport async function persistAgentPipelineState(key: string, pipeline: AgentPipelineState): Promise<void> {\n pipeline.updatedAt = now();\n const agentPipelineResource = getAgentPipelineResource();\n if (!agentPipelineResource) return;\n\n await agentPipelineResource.replace(key, {\n id: key,\n issueId: pipeline.issueId,\n issueIdentifier: pipeline.issueIdentifier,\n attempt: pipeline.attempt,\n updatedAt: pipeline.updatedAt,\n pipeline,\n } satisfies AgentPipelineRecord);\n}\n\nexport async function loadAgentPipelineSnapshotForIssue(\n issue: IssueEntry,\n providers: AgentProviderDefinition[],\n): Promise<AgentPipelineState | null> {\n const attempt = getLatestPipelineAttempt(issue);\n const agentPipelineResource = getAgentPipelineResource();\n\n if (agentPipelineResource?.list) {\n try {\n const records = await agentPipelineResource.list({\n partition: \"byIssueAttempt\",\n partitionValues: { issueId: issue.id, attempt },\n limit: 10,\n });\n const record = records\n .map((entry) => entry as AgentPipelineRecord)\n .find((entry) => entry.issueId === issue.id && entry.attempt === attempt && entry.pipeline);\n if (record?.pipeline) {\n return {\n issueId: issue.id,\n issueIdentifier: issue.identifier,\n attempt,\n cycle: Math.max(1, toNumberValue(record.pipeline.cycle, 1)),\n activeIndex: clamp(toNumberValue(record.pipeline.activeIndex, 0), 0, Math.max(0, providers.length - 1)),\n updatedAt: now(),\n history: Array.isArray(record.pipeline.history)\n ? record.pipeline.history.filter((entry): entry is string => typeof entry === \"string\")\n : [],\n };\n }\n } catch (error) {\n logger.warn(`Failed to load partitioned pipeline snapshot for ${issue.id}: ${String(error)}`);\n }\n }\n\n const loaded = await loadAgentPipelineState(issue, attempt, providers);\n return loaded.pipeline.history.length > 0 ? loaded.pipeline : null;\n}\n\nexport async function loadAgentSessionSnapshotsForIssue(\n issue: IssueEntry,\n providers: AgentProviderDefinition[],\n pipeline: AgentPipelineState | null,\n _workflowDefinition: null,\n): Promise<Array<{ key: string; session: AgentSessionState; provider: string; role: string; cycle: number }>> {\n if (!pipeline) return [];\n\n const sessions: Array<{ key: string; session: AgentSessionState; provider: string; role: string; cycle: number }> = [];\n const attempt = pipeline.attempt;\n const agentSessionResource = getAgentSessionResource();\n const maxTurns = stateConfigMaxTurnsFallback();\n\n if (agentSessionResource?.list) {\n try {\n const records = await agentSessionResource.list({\n partition: \"byIssueAttempt\",\n partitionValues: { issueId: issue.id, attempt },\n limit: Math.max(12, providers.length * Math.max(1, pipeline.cycle) * 2),\n });\n const loadedSessions = records\n .map((entry) => entry as AgentSessionRecord)\n .filter((entry) => entry.issueId === issue.id && entry.attempt === attempt && entry.session && Array.isArray(entry.session.turns));\n\n for (const record of loadedSessions) {\n if (!record.session.turns.length) continue;\n sessions.push({\n key: record.id,\n session: {\n ...buildAgentSessionState(issue, attempt, maxTurns),\n ...record.session,\n maxTurns,\n turns: record.session.turns as AgentSessionTurn[],\n updatedAt: now(),\n },\n provider: record.provider,\n role: record.role,\n cycle: record.cycle,\n });\n }\n\n sessions.sort((a, b) => a.cycle !== b.cycle ? a.cycle - b.cycle : a.key.localeCompare(b.key));\n if (sessions.length > 0) return sessions;\n } catch (error) {\n logger.warn(`Failed to load partitioned session snapshots for ${issue.id}: ${String(error)}`);\n }\n }\n\n for (let cycle = 1; cycle <= pipeline.cycle; cycle += 1) {\n for (const provider of providers) {\n const key = buildProviderSessionKey(issue, attempt, provider, cycle);\n const loaded = await loadAgentSessionState(key, issue, attempt, maxTurns);\n if (loaded.session.turns.length === 0) continue;\n sessions.push({\n key,\n session: loaded.session,\n provider: provider.provider,\n role: provider.role,\n cycle,\n });\n }\n }\n\n return sessions;\n}\n","import {\n writeFileSync,\n} from \"node:fs\";\nimport { join } from \"node:path\";\nimport type {\n AgentProviderDefinition,\n AgentSessionResult,\n IssueEntry,\n RuntimeState,\n WorkflowConfig,\n} from \"../types.ts\";\nimport { now, clamp } from \"../concerns/helpers.ts\";\nimport { logger } from \"../concerns/logger.ts\";\nimport { getEffectiveAgentProviders } from \"./providers.ts\";\nimport { addEvent } from \"../domains/issues.ts\";\nimport { compileExecution, persistCompilationArtifacts } from \"./adapters/index.ts\";\nimport { discoverSkills, buildSkillContext } from \"../agents/skills.ts\";\nimport {\n loadAgentSessionState,\n persistAgentSessionState,\n loadAgentPipelineState,\n persistAgentPipelineState,\n buildProviderSessionKey,\n} from \"./session-state.ts\";\nimport { readAgentDirective, addTokenUsage } from \"./directive-parser.ts\";\nimport { buildTurnPrompt, buildProviderBasePrompt } from \"./prompt-builder.ts\";\nimport { runCommandWithTimeout, runHook } from \"./command-executor.ts\";\nimport { record as recordTokens } from \"../domains/tokens.ts\";\n\nexport async function runAgentSession(\n state: RuntimeState,\n issue: IssueEntry,\n provider: AgentProviderDefinition,\n cycle: number,\n workspacePath: string,\n basePromptText: string,\n basePromptFile: string,\n): Promise<AgentSessionResult> {\n const maxTurns = clamp(state.config.maxTurns, 1, 16);\n const attempt = issue.attempts + 1;\n const sessionLookupKey = buildProviderSessionKey(issue, attempt, provider, cycle);\n const loadedSession = await loadAgentSessionState(sessionLookupKey, issue, attempt, maxTurns);\n const sessionKey = loadedSession.key;\n const session = loadedSession.session;\n let previousOutput = session.lastOutput;\n let nextPrompt = session.nextPrompt;\n let lastCode: number | null = session.lastCode;\n let lastOutput = session.lastOutput;\n const resultFile = join(workspacePath, `result-${provider.role}-${provider.provider}.json`);\n\n if (session.status === \"done\" && session.turns.length > 0) {\n logger.debug({ issueId: issue.id, identifier: issue.identifier, provider: provider.provider, role: provider.role }, \"[Agent] Session already completed, returning cached result\");\n return { success: true, blocked: false, continueRequested: false, code: session.lastCode, output: session.lastOutput, turns: session.turns.length };\n }\n\n const turnIndex = session.turns.length + 1;\n if (turnIndex > maxTurns) {\n session.status = \"blocked\";\n session.lastOutput = session.lastOutput + `\\nAgent requested additional turns beyond configured limit (${maxTurns}).`;\n await persistAgentSessionState(sessionKey, issue, provider, cycle, session);\n return { success: false, blocked: true, continueRequested: false, code: lastCode, output: session.lastOutput, turns: session.turns.length };\n }\n\n const maxOutputChars = state.config.maxPreviousOutputChars;\n const compactedOutput = previousOutput.length > maxOutputChars\n ? `[...${previousOutput.length - maxOutputChars} chars truncated...]\\n${previousOutput.slice(-maxOutputChars)}`\n : previousOutput;\n const turnPrompt = await buildTurnPrompt(issue, basePromptText, compactedOutput, turnIndex, maxTurns, nextPrompt);\n const turnPromptFile = turnIndex === 1\n ? basePromptFile\n : join(workspacePath, `turn-${String(turnIndex).padStart(2, \"0\")}.md`);\n\n if (turnIndex > 1) writeFileSync(turnPromptFile, `${turnPrompt}\\n`, \"utf8\");\n\n session.status = \"running\";\n session.lastPrompt = turnPrompt;\n session.lastPromptFile = turnPromptFile;\n session.maxTurns = maxTurns;\n await persistAgentSessionState(sessionKey, issue, provider, cycle, session);\n\n logger.info({ issueId: issue.id, identifier: issue.identifier, turn: turnIndex, maxTurns, provider: provider.provider, role: provider.role, cycle, command: provider.command.slice(0, 120) }, \"[Agent] Spawning agent command\");\n const turnStartedAt = now();\n const turnEnv = {\n FIFONY_AGENT_PROVIDER: provider.provider,\n FIFONY_AGENT_ROLE: provider.role,\n FIFONY_REASONING_EFFORT: provider.reasoningEffort || \"\",\n FIFONY_SESSION_KEY: sessionKey,\n FIFONY_SESSION_ID: `${issue.id}-attempt-${attempt}`,\n FIFONY_TURN_INDEX: String(turnIndex),\n FIFONY_MAX_TURNS: String(maxTurns),\n FIFONY_TURN_PROMPT: turnPrompt,\n FIFONY_TURN_PROMPT_FILE: turnPromptFile,\n FIFONY_CONTINUE: turnIndex > 1 ? \"1\" : \"0\",\n FIFONY_PREVIOUS_OUTPUT: compactedOutput,\n FIFONY_RESULT_FILE: resultFile,\n FIFONY_AGENT_PROFILE: provider.profile,\n FIFONY_AGENT_PROFILE_FILE: provider.profilePath,\n FIFONY_AGENT_PROFILE_INSTRUCTIONS: provider.profileInstructions,\n };\n\n if (state.config.beforeRunHook) {\n await runHook(state.config.beforeRunHook, workspacePath, issue, \"before_run\", turnEnv);\n }\n\n addEvent(state, issue.id, \"runner\", `Turn ${turnIndex}/${maxTurns} started for ${issue.identifier}.`);\n\n const turnResult = await runCommandWithTimeout(provider.command, workspacePath, issue, state.config, turnPrompt, turnPromptFile, turnEnv);\n\n if (state.config.afterRunHook) {\n await runHook(state.config.afterRunHook, workspacePath, issue, \"after_run\", {\n ...turnEnv,\n FIFONY_LAST_EXIT_CODE: String(turnResult.code ?? \"\"),\n FIFONY_LAST_OUTPUT: turnResult.output,\n FIFONY_PRESERVE_RESULT_FILE: \"1\",\n });\n }\n\n logger.info({ issueId: issue.id, identifier: issue.identifier, turn: turnIndex, exitCode: turnResult.code, success: turnResult.success, outputBytes: turnResult.output.length }, \"[Agent] Agent command finished\");\n const directive = readAgentDirective(workspacePath, turnResult.output, turnResult.success);\n lastCode = turnResult.code;\n lastOutput = turnResult.output;\n previousOutput = turnResult.output;\n nextPrompt = directive.nextPrompt;\n if (!directive.tokenUsage) {\n logger.warn({ issueId: issue.id, identifier: issue.identifier, turn: turnIndex, role: provider.role, outputBytes: turnResult.output.length }, \"[Agent] Token extraction failed — no usage data in CLI output\");\n }\n addTokenUsage(issue, directive.tokenUsage, provider.role);\n if (directive.tokenUsage) recordTokens(issue, directive.tokenUsage, provider.role);\n\n if (directive.tokenUsage) {\n const tu = directive.tokenUsage;\n const parts = [\n `Turn ${turnIndex} (${provider.role})`,\n `${tu.totalTokens.toLocaleString()} tokens`,\n `(in: ${tu.inputTokens.toLocaleString()}, out: ${tu.outputTokens.toLocaleString()})`,\n ];\n if (tu.model) parts.push(`[${tu.model}]`);\n const cumulative = issue.tokenUsage;\n if (cumulative && cumulative.totalTokens > tu.totalTokens) {\n parts.push(`| cumulative: ${cumulative.totalTokens.toLocaleString()}`);\n }\n addEvent(state, issue.id, \"info\", parts.join(\" \"));\n }\n\n session.turns.push({\n turn: turnIndex,\n role: provider.role,\n model: directive.tokenUsage?.model || provider.model || provider.provider,\n startedAt: turnStartedAt,\n completedAt: now(),\n promptFile: turnPromptFile,\n prompt: turnPrompt,\n output: turnResult.output,\n code: turnResult.code,\n success: turnResult.success,\n directiveStatus: directive.status,\n directiveSummary: directive.summary,\n nextPrompt: directive.nextPrompt,\n tokenUsage: directive.tokenUsage,\n });\n\n session.lastCode = lastCode;\n session.lastOutput = lastOutput;\n session.lastDirectiveStatus = directive.status;\n session.lastDirectiveSummary = directive.summary;\n session.nextPrompt = nextPrompt;\n\n const directiveSummary = directive.summary ? ` ${directive.summary}` : \"\";\n addEvent(state, issue.id, \"runner\", `Turn ${turnIndex}/${maxTurns} finished with status ${directive.status}.${directiveSummary}`.trim());\n\n if (!turnResult.success || directive.status === \"failed\") {\n logger.info({ issueId: issue.id, identifier: issue.identifier, turn: turnIndex, directiveStatus: directive.status, exitCode: lastCode }, \"[Agent] Session turn failed\");\n session.status = \"failed\";\n await persistAgentSessionState(sessionKey, issue, provider, cycle, session);\n return { success: false, blocked: false, continueRequested: false, code: lastCode, output: lastOutput, turns: turnIndex };\n }\n\n if (directive.status === \"blocked\") {\n logger.info({ issueId: issue.id, identifier: issue.identifier, turn: turnIndex }, \"[Agent] Session turn blocked — manual intervention requested\");\n session.status = \"blocked\";\n await persistAgentSessionState(sessionKey, issue, provider, cycle, session);\n return { success: false, blocked: true, continueRequested: false, code: lastCode, output: lastOutput, turns: turnIndex };\n }\n\n if (directive.status === \"continue\") {\n logger.info({ issueId: issue.id, identifier: issue.identifier, turn: turnIndex, maxTurns }, \"[Agent] Session requests continuation\");\n session.status = \"running\";\n await persistAgentSessionState(sessionKey, issue, provider, cycle, session);\n return { success: false, blocked: false, continueRequested: true, code: lastCode, output: lastOutput, turns: turnIndex };\n }\n\n logger.info({ issueId: issue.id, identifier: issue.identifier, turn: turnIndex }, \"[Agent] Session completed successfully\");\n session.status = \"done\";\n await persistAgentSessionState(sessionKey, issue, provider, cycle, session);\n return { success: true, blocked: false, continueRequested: false, code: lastCode, output: lastOutput, turns: turnIndex };\n}\n\nexport async function runAgentPipeline(\n state: RuntimeState,\n issue: IssueEntry,\n workspacePath: string,\n basePromptText: string,\n basePromptFile: string,\n workflowConfig?: WorkflowConfig | null,\n): Promise<AgentSessionResult> {\n const providers = getEffectiveAgentProviders(state, issue, null, workflowConfig);\n const attempt = issue.attempts + 1;\n logger.debug({ issueId: issue.id, identifier: issue.identifier, attempt, providers: providers.map((p) => `${p.role}:${p.provider}`) }, \"[Agent] Starting pipeline\");\n const { pipeline, key: pipelineFile } = await loadAgentPipelineState(issue, attempt, providers);\n const activeProvider = providers[clamp(pipeline.activeIndex, 0, Math.max(0, providers.length - 1))];\n const executorIndex = providers.findIndex((provider) => provider.role === \"executor\");\n\n // Discover skills and build context\n const skills = discoverSkills(workspacePath);\n const skillContext = buildSkillContext(skills);\n\n // Write skills reference to workspace\n if (skillContext) {\n writeFileSync(join(workspacePath, \"skills.md\"), skillContext, \"utf8\");\n }\n\n // Compile plan-aware execution if plan exists\n const compiled = await compileExecution(issue, activeProvider, state.config, workspacePath, skillContext);\n\n let providerPrompt: string;\n let effectiveProvider = activeProvider;\n\n if (compiled) {\n providerPrompt = compiled.prompt;\n effectiveProvider = { ...activeProvider, command: compiled.command };\n persistCompilationArtifacts(workspacePath, compiled);\n addEvent(state, issue.id, \"info\",\n `Plan compiled for ${compiled.meta.adapter}: effort=${compiled.meta.reasoningEffort}, skills=[${compiled.meta.skillsActivated.join(\",\")}], subagents=[${compiled.meta.subagentsRequested.join(\",\")}].`);\n\n if (Object.keys(compiled.env).length > 0) {\n const envFile = join(workspacePath, \".compiled-env.sh\");\n const envLines = Object.entries(compiled.env).map(([k, v]) => `export ${k}=${JSON.stringify(v)}`).join(\"\\n\");\n writeFileSync(envFile, envLines, \"utf8\");\n }\n } else {\n providerPrompt = await buildProviderBasePrompt(activeProvider, issue, basePromptText, workspacePath, skillContext);\n }\n\n if (!effectiveProvider.command.trim()) {\n throw new Error(`No command configured for provider ${effectiveProvider.provider} (${effectiveProvider.role}).`);\n }\n\n pipeline.history.push(`[${now()}] Running ${effectiveProvider.role}:${effectiveProvider.provider} in cycle ${pipeline.cycle}${compiled ? ` [${compiled.meta.adapter} adapter]` : \"\"}.`);\n await persistAgentPipelineState(pipelineFile, pipeline);\n\n const result = await runAgentSession(state, issue, effectiveProvider, pipeline.cycle, workspacePath, providerPrompt, basePromptFile);\n\n if (result.success) {\n if (pipeline.activeIndex < providers.length - 1) {\n pipeline.activeIndex += 1;\n pipeline.history.push(`[${now()}] ${activeProvider.role}:${activeProvider.provider} completed; advancing to next provider.`);\n await persistAgentPipelineState(pipelineFile, pipeline);\n return { success: false, blocked: false, continueRequested: true, code: result.code, output: result.output, turns: result.turns };\n }\n pipeline.history.push(`[${now()}] Final provider ${activeProvider.role}:${activeProvider.provider} completed the issue.`);\n await persistAgentPipelineState(pipelineFile, pipeline);\n return result;\n }\n\n if (result.continueRequested && activeProvider.role === \"reviewer\" && executorIndex >= 0) {\n pipeline.cycle += 1;\n pipeline.activeIndex = executorIndex;\n pipeline.history.push(`[${now()}] Reviewer requested rework; returning to executor for cycle ${pipeline.cycle}.`);\n await persistAgentPipelineState(pipelineFile, pipeline);\n return result;\n }\n\n if (result.continueRequested) {\n pipeline.history.push(`[${now()}] ${activeProvider.role}:${activeProvider.provider} requested another turn.`);\n await persistAgentPipelineState(pipelineFile, pipeline);\n return result;\n }\n\n if (result.blocked) {\n pipeline.history.push(`[${now()}] ${activeProvider.role}:${activeProvider.provider} blocked the pipeline.`);\n await persistAgentPipelineState(pipelineFile, pipeline);\n return result;\n }\n\n pipeline.history.push(`[${now()}] ${activeProvider.role}:${activeProvider.provider} failed the pipeline.`);\n await persistAgentPipelineState(pipelineFile, pipeline);\n return result;\n}\n","import { writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { IssueEntry, AgentProviderDefinition, RuntimeConfig, AgentTokenUsage } from \"../../types.ts\";\nimport type { CompiledExecution, CompiledReview, ExecutionAudit } from \"./types.ts\";\nimport { buildExecutionPayload } from \"./shared.ts\";\nimport type { ExecutionPayload } from \"./shared.ts\";\nimport { ADAPTERS } from \"./registry.ts\";\nimport { renderPrompt } from \"../prompting.ts\";\nimport { buildFullPlanPrompt } from \"./shared.ts\";\n\nexport type { CompiledExecution, CompiledReview, ExecutionAudit };\n\n// ── Compile execution ────────────────────────────────────────────────────────\n\nexport async function compileExecution(\n issue: IssueEntry,\n provider: AgentProviderDefinition,\n config: RuntimeConfig,\n workspacePath: string,\n skillContext: string,\n): Promise<CompiledExecution | null> {\n const plan = issue.plan;\n if (!plan?.steps?.length) return null;\n\n const adapter = ADAPTERS[provider.provider];\n if (!adapter) return null;\n\n const payload = buildExecutionPayload(issue, provider, plan, workspacePath);\n const compiled = await adapter.compile(issue, provider, plan, config, workspacePath, skillContext);\n compiled.payload = payload;\n return compiled;\n}\n\n// ── Compile review ───────────────────────────────────────────────────────────\n\nexport async function compileReview(\n issue: IssueEntry,\n reviewer: AgentProviderDefinition,\n workspacePath: string,\n diffSummary: string,\n): Promise<CompiledReview> {\n const plan = issue.plan;\n const prompt = await renderPrompt(\"compile-review\", {\n issueIdentifier: issue.identifier,\n title: issue.title,\n description: issue.description || \"(none)\",\n workspacePath,\n planPrompt: plan ? buildFullPlanPrompt(plan) : \"\",\n successCriteria: (plan?.successCriteria ?? []).map((value) => ({ value })),\n deliverables: (plan?.deliverables ?? []).map((value) => ({ value })),\n diffSummary,\n });\n\n const adapter = ADAPTERS[reviewer.provider];\n const command = adapter\n ? adapter.buildReviewCommand(reviewer)\n : reviewer.command;\n\n return { prompt, command };\n}\n\n// ── Audit ────────────────────────────────────────────────────────────────────\n\nexport function buildExecutionAudit(\n provider: AgentProviderDefinition,\n compiled: CompiledExecution | null,\n issue: IssueEntry,\n durationMs: number,\n result: string,\n): ExecutionAudit {\n return {\n runtime: provider.provider,\n model: provider.model || compiled?.meta.model || \"default\",\n effort: provider.reasoningEffort || compiled?.meta.reasoningEffort || \"default\",\n role: provider.role,\n skillsActivated: compiled?.meta.skillsActivated || [],\n subagentsRequested: compiled?.meta.subagentsRequested || [],\n durationMs,\n tokenUsage: issue.tokenUsage ?? null,\n diffStats: issue.filesChanged != null\n ? { filesChanged: issue.filesChanged, linesAdded: issue.linesAdded || 0, linesRemoved: issue.linesRemoved || 0 }\n : null,\n result,\n compiledAt: compiled ? new Date().toISOString() : \"\",\n completedAt: new Date().toISOString(),\n };\n}\n\n// ── Persistence ──────────────────────────────────────────────────────────────\n\nexport function persistCompilationArtifacts(workspacePath: string, compiled: CompiledExecution): void {\n try {\n writeFileSync(\n join(workspacePath, \"compiled-execution.json\"),\n JSON.stringify({\n adapter: compiled.meta.adapter,\n model: compiled.meta.model,\n reasoningEffort: compiled.meta.reasoningEffort,\n skillsActivated: compiled.meta.skillsActivated,\n subagentsRequested: compiled.meta.subagentsRequested,\n phasesCount: compiled.meta.phasesCount,\n preHooks: compiled.preHooks,\n postHooks: compiled.postHooks,\n hasOutputSchema: !!compiled.outputSchema,\n hasPayload: !!compiled.payload,\n command: compiled.command,\n promptLength: compiled.prompt.length,\n compiledAt: new Date().toISOString(),\n }, null, 2),\n \"utf8\",\n );\n } catch { /* optional audit data */ }\n\n try {\n writeFileSync(join(workspacePath, \"prompt.md\"), compiled.prompt, \"utf8\");\n } catch { /* optional */ }\n\n if (compiled.payload) {\n try {\n writeFileSync(\n join(workspacePath, \"execution-payload.json\"),\n JSON.stringify(compiled.payload, null, 2),\n \"utf8\",\n );\n } catch { /* optional */ }\n }\n}\n\nexport function persistExecutionAudit(workspacePath: string, audit: ExecutionAudit): void {\n try {\n writeFileSync(\n join(workspacePath, \"execution-audit.json\"),\n JSON.stringify(audit, null, 2),\n \"utf8\",\n );\n } catch { /* optional audit data */ }\n}\n","import { existsSync, readdirSync, readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\n\nexport type DiscoveredSkill = {\n name: string;\n content: string;\n};\n\nexport function discoverSkills(workspacePath: string): DiscoveredSkill[] {\n const home = homedir();\n const codePath = existsSync(join(workspacePath, \"worktree\")) ? join(workspacePath, \"worktree\") : workspacePath;\n const searchPaths = [\n resolve(codePath, \".codex\", \"skills\"),\n resolve(codePath, \".claude\", \"skills\"),\n join(home, \".codex\", \"skills\"),\n join(home, \".claude\", \"skills\"),\n ];\n\n const seen = new Set<string>();\n const skills: DiscoveredSkill[] = [];\n\n for (const basePath of searchPaths) {\n if (!existsSync(basePath)) continue;\n\n for (const entry of readdirSync(basePath, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue;\n if (seen.has(entry.name)) continue;\n\n const skillFile = join(basePath, entry.name, \"SKILL.md\");\n if (!existsSync(skillFile)) continue;\n\n try {\n const content = readFileSync(skillFile, \"utf8\").trim();\n if (content) {\n seen.add(entry.name);\n skills.push({ name: entry.name, content });\n }\n } catch {\n // skip unreadable skills\n }\n }\n }\n\n return skills;\n}\n\nexport function buildSkillContext(skills: DiscoveredSkill[]): string {\n if (skills.length === 0) return \"\";\n\n const sections = skills.map((skill) =>\n `### Skill: ${skill.name}\\n${skill.content}`\n );\n\n return `## Available Skills\\n\\n${sections.join(\"\\n\\n\")}`;\n}\n","/**\n * agent.ts — public entry point\n *\n * Re-exports the full agent API consumed by scheduler.ts, api-server.ts, and other modules.\n * Implementation is split across the following modules:\n * directive-parser.ts — output parsing, token extraction, directive normalization\n * pid-manager.ts — PID file management and process liveness checks\n * workspace-diff.ts — diff computation and changed-path inference\n * workspace-merge.ts — worktree commit, merge, path hydration, routing signals\n * session-state.ts — session/pipeline state load, persist, and snapshot helpers\n * prompt-builder.ts — prompt construction for sessions, turns, and providers\n * command-executor.ts — runCommandWithTimeout and runHook\n * workspace-setup.ts — workspace creation, git worktree, and cleanWorkspace\n * agent-pipeline.ts — runAgentSession, runAgentPipeline, runPlanningJob, runIssueOnce\n */\n\n// ── Re-exports from directive-parser ──────────────────────────────────────\nexport { addTokenUsage, readAgentDirective, extractTokenUsage, tryParseJsonOutput } from \"./directive-parser.ts\";\n\n// ── Re-exports from pid-manager ───────────────────────────────────────────\nexport { readAgentPid, isProcessAlive, cleanStalePidFile } from \"./pid-manager.ts\";\nexport type { AgentPidInfo } from \"./pid-manager.ts\";\n\n// ── Re-exports from workspace-diff ────────────────────────────────────────\nexport { computeDiffStats, inferChangedWorkspacePaths, parseDiffStats } from \"../domains/workspace.ts\";\n\n// ── Re-exports from workspace-merge ───────────────────────────────────────\nexport { mergeWorkspace, pushWorktreeBranch, hydrateIssuePathsFromWorkspace, describeRoutingSignals, shouldSkipMergePath, ensureWorktreeCommitted } from \"../domains/workspace.ts\";\nexport type { MergeResult } from \"../domains/workspace.ts\";\n\n// ── Re-exports from session-state ─────────────────────────────────────────\nexport {\n loadAgentPipelineState,\n loadAgentPipelineSnapshotForIssue,\n loadAgentSessionSnapshotsForIssue,\n} from \"./session-state.ts\";\n\n// ── Re-exports from prompt-builder ────────────────────────────────────────\nexport { buildPrompt, buildTurnPrompt, buildProviderBasePrompt } from \"./prompt-builder.ts\";\n\n// ── Re-exports from command-executor ──────────────────────────────────────\nexport { runCommandWithTimeout, runHook } from \"./command-executor.ts\";\n\n// ── Re-exports from workspace-setup ───────────────────────────────────────\nexport { cleanWorkspace, prepareWorkspace, createGitWorktree } from \"../domains/workspace.ts\";\n\n// ── Re-exports from agent-pipeline ────────────────────────────────────────\nexport { runAgentPipeline, runAgentSession } from \"./agent-pipeline.ts\";\n\n// ── Re-exports from issue-runner ──────────────────────────────────────────\nexport { runPlanningJob } from \"./issue-runner.ts\";\n\n// ── Public functions consumed by scheduler.ts / api-server.ts ─────────────\n\nimport type { IssueEntry, RuntimeState } from \"../types.ts\";\nimport { TERMINAL_STATES } from \"../concerns/constants.ts\";\nimport { logger } from \"../concerns/logger.ts\";\nimport { isAgentStillRunning } from \"./pid-manager.ts\";\n\nexport { isAgentStillRunning };\nexport { runIssueOnce } from \"./issue-runner.ts\";\n\nexport function issueHasResumableSession(issue: IssueEntry): boolean {\n return Boolean(issue.workspacePath) && issue.state === \"Running\";\n}\n\nfunction issueDepsResolved(issue: IssueEntry, allIssues: IssueEntry[]): boolean {\n if (issue.blockedBy.length === 0) return true;\n const map = new Map(allIssues.map((entry) => [entry.id, entry]));\n return issue.blockedBy.every((depId) => {\n const dep = map.get(depId);\n return dep?.state === \"Done\";\n });\n}\n\nexport function canRunIssue(issue: IssueEntry, running: Set<string>, state: RuntimeState): boolean {\n if (!issue.assignedToWorker) return false;\n if (running.has(issue.id)) return false;\n if (TERMINAL_STATES.has(issue.state)) return false;\n\n // Planning state: only dispatch when no plan exists yet and no job is active\n if (issue.state === \"Planning\") {\n if (issue.plan) return false; // plan already generated — waiting for user approval\n return issue.planningStatus === \"idle\" || !issue.planningStatus;\n }\n\n // Don't spawn a new agent if one is still alive from a previous session\n const { alive } = isAgentStillRunning(issue);\n if (alive) {\n logger.debug({ issueId: issue.id, identifier: issue.identifier }, \"[Agent] Skipping issue — agent still alive from previous session\");\n return false;\n }\n\n if (issue.state === \"Blocked\") {\n if (!issue.nextRetryAt) return false;\n if (issue.attempts >= issue.maxAttempts) {\n logger.debug({ issueId: issue.id, identifier: issue.identifier, attempts: issue.attempts, maxAttempts: issue.maxAttempts }, \"[Agent] Skipping blocked issue — max attempts reached\");\n return false;\n }\n if (Date.parse(issue.nextRetryAt) > Date.now()) return false;\n }\n\n if (!issueDepsResolved(issue, state.issues)) {\n logger.debug({ issueId: issue.id, identifier: issue.identifier, blockedBy: issue.blockedBy }, \"[Agent] Skipping issue — unresolved dependencies\");\n return false;\n }\n\n if (issue.state === \"Queued\") return true;\n if (issue.state === \"Blocked\") return true;\n if (issue.state === \"Running\" && issueHasResumableSession(issue)) return true;\n if (issue.state === \"Reviewing\") return true;\n\n return false;\n}\n","import type { IssueEntry } from \"../types.ts\";\nimport type { RuntimeState } from \"../types.ts\";\nimport type { IIssueRepository } from \"../ports/index.ts\";\nimport { markIssueDirty } from \"./dirty-tracker.ts\";\n\n/**\n * Wraps in-memory RuntimeState.issues array + s3db dirty tracking.\n */\nexport function createS3dbIssueRepository(state: RuntimeState): IIssueRepository {\n return {\n findById(id: string): IssueEntry | undefined {\n return state.issues.find((i) => i.id === id || i.identifier === id);\n },\n\n findAll(): IssueEntry[] {\n return state.issues;\n },\n\n save(issue: IssueEntry): void {\n const idx = state.issues.findIndex((i) => i.id === issue.id);\n if (idx >= 0) {\n state.issues[idx] = issue;\n } else {\n state.issues.push(issue);\n }\n markIssueDirty(issue.id);\n },\n\n markDirty(issueId: string): void {\n markIssueDirty(issueId);\n },\n };\n}\n","import type { IssueEntry, RuntimeEvent, RuntimeState } from \"../types.ts\";\nimport type { PlanningSessionUsage } from \"../agents/planning/issue-planner.ts\";\nimport { logger } from \"../concerns/logger.ts\";\nimport { now } from \"../concerns/helpers.ts\";\nimport { getEventStateResource } from \"../persistence/store.ts\";\nimport { persistState } from \"../persistence/store.ts\";\n\nexport async function listEvents(\n state: RuntimeState,\n filters: { issueId?: string; kind?: string; since?: string } = {},\n): Promise<RuntimeEvent[]> {\n const eventResource = getEventStateResource();\n const { issueId, kind, since } = filters;\n\n let events: RuntimeEvent[];\n if (eventResource?.list) {\n const partition = issueId && kind ? \"byIssueIdAndKind\"\n : issueId ? \"byIssueId\"\n : kind ? \"byKind\"\n : null;\n const partitionValues = issueId && kind ? { issueId, kind }\n : issueId ? { issueId }\n : kind ? { kind }\n : {};\n events = (await eventResource.list({ partition, partitionValues, limit: 200 }))\n .map((record) => record as RuntimeEvent);\n } else {\n events = state.events.filter((event) => {\n if (issueId && event.issueId !== issueId) return false;\n if (kind && event.kind !== kind) return false;\n return true;\n });\n }\n\n return typeof since === \"string\" && since\n ? events.filter((entry) => entry.at > since)\n : events;\n}\n\nexport function findIssue(state: RuntimeState, issueId: string): IssueEntry | undefined {\n return state.issues.find((issue) => issue.id === issueId || issue.identifier === issueId);\n}\n\nexport function parseIssue(c: any): string | null {\n const value = c.req?.param ? c.req.param(\"id\") : undefined;\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim();\n return trimmed ? trimmed : null;\n}\n\n/** Apply plan token usage to issue tracking fields */\nexport function applyPlanUsage(issue: IssueEntry, usage: PlanningSessionUsage): void {\n if (usage.totalTokens <= 0) return;\n const prev = issue.tokenUsage ?? { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n issue.tokenUsage = {\n inputTokens: prev.inputTokens + usage.inputTokens,\n outputTokens: prev.outputTokens + usage.outputTokens,\n totalTokens: prev.totalTokens + usage.totalTokens,\n model: usage.model || prev.model,\n };\n if (!issue.tokensByPhase) issue.tokensByPhase = {} as any;\n const prevPlanner = issue.tokensByPhase.planner ?? { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n issue.tokensByPhase.planner = {\n inputTokens: prevPlanner.inputTokens + usage.inputTokens,\n outputTokens: prevPlanner.outputTokens + usage.outputTokens,\n totalTokens: prevPlanner.totalTokens + usage.totalTokens,\n model: usage.model || prevPlanner.model,\n };\n if (!issue.tokensByModel) issue.tokensByModel = {};\n const model = usage.model || \"unknown\";\n const prevModel = issue.tokensByModel[model] ?? { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n issue.tokensByModel[model] = {\n inputTokens: prevModel.inputTokens + usage.inputTokens,\n outputTokens: prevModel.outputTokens + usage.outputTokens,\n totalTokens: prevModel.totalTokens + usage.totalTokens,\n model,\n };\n if (!issue.usage) issue.usage = { tokens: {} };\n issue.usage.tokens[model] = (issue.usage.tokens[model] || 0) + usage.totalTokens;\n}\n\n/** Apply plan suggestions to issue (paths, labels, effort) */\nexport function applyPlanSuggestions(issue: IssueEntry, plan: import(\"../types.ts\").IssuePlan): void {\n if (plan.suggestedPaths?.length && !(issue.paths?.length)) issue.paths = plan.suggestedPaths;\n if (plan.suggestedLabels?.length && !issue.labels?.length) issue.labels = plan.suggestedLabels;\n if (plan.suggestedEffort && !issue.effort) issue.effort = plan.suggestedEffort;\n}\n\nexport async function mutateIssueState(\n state: RuntimeState,\n c: any,\n updater: (issue: IssueEntry) => Promise<void> | void,\n): Promise<any> {\n const issueId = parseIssue(c);\n if (!issueId) {\n return c.json({ ok: false, error: \"Issue id is required.\" }, 400);\n }\n\n const issue = findIssue(state, issueId);\n if (!issue) {\n return c.json({ ok: false, error: \"Issue not found\" }, 404);\n }\n\n try {\n await updater(issue);\n await persistState(state);\n return c.json({ ok: true, issue });\n } catch (error) {\n logger.error({ err: error, issueId }, \"[API] mutateIssueState failed\");\n return c.json({ ok: false, error: error instanceof Error ? error.message : String(error) }, 500);\n }\n}\n","import type { RuntimeEvent, RuntimeEventType, RuntimeState } from \"../types.ts\";\nimport type { IEventStore } from \"../ports/index.ts\";\nimport { addEvent } from \"../domains/issues.ts\";\nimport { listEvents } from \"../routes/helpers.ts\";\n\n/**\n * Wraps existing addEvent and listEvents functions.\n */\nexport function createS3dbEventStore(state: RuntimeState): IEventStore {\n return {\n addEvent(issueId: string | undefined, kind: RuntimeEventType, message: string): void {\n addEvent(state, issueId, kind, message);\n },\n\n async listEvents(filters?: { issueId?: string; kind?: string; since?: string }): Promise<RuntimeEvent[]> {\n return listEvents(state, filters);\n },\n };\n}\n","import type { IssueEntry } from \"../types.ts\";\nimport type { IQueuePort } from \"../ports/index.ts\";\nimport {\n enqueueForPlanning,\n enqueueForExecution,\n enqueueForReview,\n areQueueWorkersActive,\n} from \"./plugins/queue-workers.ts\";\n\n/**\n * Wraps existing queue-workers.ts functions behind the IQueuePort interface.\n */\nexport function createS3QueueAdapter(): IQueuePort {\n return {\n async enqueueForPlanning(issue: IssueEntry): Promise<void> {\n return enqueueForPlanning(issue);\n },\n\n async enqueueForExecution(issue: IssueEntry): Promise<void> {\n return enqueueForExecution(issue);\n },\n\n async enqueueForReview(issue: IssueEntry): Promise<void> {\n return enqueueForReview(issue);\n },\n\n isActive(): boolean {\n return areQueueWorkersActive();\n },\n };\n}\n","import type { RuntimeState } from \"../types.ts\";\nimport type {\n IIssueRepository,\n IEventStore,\n IQueuePort,\n IPersistencePort,\n} from \"../ports/index.ts\";\n\n// Persistence adapters\nimport { createS3dbIssueRepository } from \"./s3db-issue-repository.ts\";\nimport { createS3dbEventStore } from \"./s3db-event-store.ts\";\nimport { createS3QueueAdapter } from \"./s3queue-adapter.ts\";\nimport { setFsmEventEmitter } from \"./plugins/issue-state-machine.ts\";\n\n// Store\nimport { persistState } from \"./store.ts\";\n\nexport type Container = {\n issueRepository: IIssueRepository;\n eventStore: IEventStore;\n queuePort: IQueuePort;\n persistencePort: IPersistencePort;\n};\n\nlet _container: Container | null = null;\n\nexport function createContainer(state: RuntimeState): Container {\n const issueRepository = createS3dbIssueRepository(state);\n const eventStore = createS3dbEventStore(state);\n const queuePort = createS3QueueAdapter();\n\n const persistencePort: IPersistencePort = {\n persistState: (s) => persistState(s),\n loadState: async () => null,\n };\n\n const container: Container = {\n issueRepository, eventStore, queuePort, persistencePort,\n };\n\n _container = container;\n\n // Wire FSM event emitter so entry actions can emit events through the event store\n setFsmEventEmitter((issueId, kind, message) => {\n eventStore.addEvent(issueId, kind as any, message);\n });\n\n return container;\n}\n\nexport function getContainer(): Container {\n if (!_container) throw new Error(\"Container not initialized. Call createContainer(state) first.\");\n return _container;\n}\n","import type { IssueEntry, JsonRecord, RuntimeState } from \"../types.ts\";\nimport type { IIssueRepository, IQueuePort, IEventStore, IPersistencePort } from \"../ports/index.ts\";\nimport { createIssueFromPayload } from \"../domains/issues.ts\";\nimport { existsSync, mkdirSync, renameSync } from \"node:fs\";\nimport { basename, join } from \"node:path\";\nimport { ATTACHMENTS_ROOT } from \"../concerns/constants.ts\";\n\nexport type CreateIssueInput = {\n payload: JsonRecord;\n state: RuntimeState;\n};\n\nexport type CreateIssueResult = {\n issue: IssueEntry;\n};\n\nexport async function createIssueCommand(\n input: CreateIssueInput,\n deps: {\n issueRepository: IIssueRepository;\n eventStore: IEventStore;\n queuePort: IQueuePort;\n persistencePort: IPersistencePort;\n },\n): Promise<CreateIssueResult> {\n const { payload, state } = input;\n\n const issue = createIssueFromPayload(payload, state.issues, state.config.defaultBranch);\n\n // Move temp attachment files to permanent issue directory\n const tempImages = Array.isArray(payload.images) ? payload.images as string[] : [];\n if (tempImages.length) {\n const issueAttachDir = join(ATTACHMENTS_ROOT, issue.id);\n mkdirSync(issueAttachDir, { recursive: true });\n const finalPaths: string[] = [];\n for (const tempPath of tempImages) {\n if (typeof tempPath === \"string\" && existsSync(tempPath)) {\n const dest = join(issueAttachDir, basename(tempPath));\n try { renameSync(tempPath, dest); finalPaths.push(dest); } catch { finalPaths.push(tempPath); }\n }\n }\n if (finalPaths.length) issue.images = finalPaths;\n }\n\n deps.issueRepository.save(issue);\n deps.issueRepository.markDirty(issue.id);\n deps.eventStore.addEvent(issue.id, \"info\", `Issue ${issue.identifier} created via API.`);\n\n if (issue.plan) {\n deps.eventStore.addEvent(issue.id, \"info\", `Plan: ${issue.plan.steps.length} steps, complexity: ${issue.plan.estimatedComplexity}.`);\n }\n\n await deps.persistencePort.persistState(state);\n\n // Enqueue based on initial state\n if (issue.state === \"Planning\") {\n deps.queuePort.enqueueForPlanning(issue).catch(() => {});\n } else if (issue.state === \"Queued\" || issue.state === \"Running\") {\n deps.queuePort.enqueueForExecution(issue).catch(() => {});\n } else if (issue.state === \"Reviewing\") {\n deps.queuePort.enqueueForReview(issue).catch(() => {});\n }\n\n return { issue };\n}\n","import type { IssueEntry, IssueState } from \"../types.ts\";\nimport type { IIssueRepository } from \"../ports/index.ts\";\nimport {\n findIssueStateMachineTransitionPath,\n getIssueStateMachinePlugin,\n ISSUE_STATE_MACHINE_ID,\n} from \"../persistence/plugins/issue-state-machine.ts\";\nimport { transitionIssue } from \"../domains/issues.ts\";\nimport { logger } from \"../concerns/logger.ts\";\n\nexport type TransitionIssueInput = {\n issue: IssueEntry;\n target: IssueState;\n note: string;\n fallbackToLocal?: boolean;\n};\n\n/**\n * THE SINGLE WAY to transition an issue's state from commands/callers.\n * Queries the FSM for the real current state, finds the event path, then sends each event.\n */\nexport async function transitionIssueCommand(\n input: TransitionIssueInput,\n deps: {\n issueRepository: IIssueRepository;\n },\n): Promise<void> {\n const { issue, target, note } = input;\n\n // Resolve the real FSM state (source of truth) — in-memory may be stale\n let currentState = issue.state;\n try {\n const plugin = getIssueStateMachinePlugin();\n if (plugin?.getState) {\n const fsmState = await plugin.getState(ISSUE_STATE_MACHINE_ID, issue.id);\n if (fsmState && fsmState !== currentState) {\n logger.debug({ issueId: issue.id, memoryState: currentState, fsmState }, \"[Transition] Syncing stale in-memory state with FSM\");\n issue.state = fsmState as typeof issue.state;\n currentState = fsmState;\n }\n }\n } catch { /* FSM not available — use in-memory */ }\n\n if (currentState === target) return;\n\n const path = findIssueStateMachineTransitionPath(null, currentState, target);\n if (!path || path.length === 0) {\n throw new Error(`State machine does not allow transition from '${currentState}' to '${target}' for issue ${issue.id}.`);\n }\n\n for (const event of path) {\n await transitionIssue(issue, event, { note });\n }\n}\n","import type { IssueEntry } from \"../types.ts\";\nimport type { IIssueRepository, IEventStore } from \"../ports/index.ts\";\nimport { transitionIssueCommand } from \"./transition-issue.command.ts\";\nimport { readAgentPid } from \"../agents/pid-manager.ts\";\nimport { logger } from \"../concerns/logger.ts\";\n\nexport type CancelIssueInput = {\n issue: IssueEntry;\n};\n\nexport async function cancelIssueCommand(\n input: CancelIssueInput,\n deps: {\n issueRepository: IIssueRepository;\n eventStore: IEventStore;\n },\n): Promise<void> {\n const { issue } = input;\n\n // Kill running agent process if one exists\n const pidInfo = issue.workspacePath ? readAgentPid(issue.workspacePath) : null;\n if (pidInfo) {\n try {\n process.kill(-pidInfo.pid, \"SIGTERM\");\n logger.info({ pid: pidInfo.pid, issueId: issue.id }, \"[Command] Sent SIGTERM to agent process group\");\n } catch {\n try { process.kill(pidInfo.pid, \"SIGTERM\"); } catch {}\n }\n }\n\n issue.cancelledReason = \"Manually cancelled by user.\";\n\n await transitionIssueCommand(\n { issue, target: \"Cancelled\", note: \"Manual cancel requested.\" },\n deps,\n );\n\n deps.eventStore.addEvent(issue.id, \"manual\", `Manual cancel requested for ${issue.id}.`);\n}\n","import { S3DB_ISSUE_RESOURCE } from \"../../concerns/constants.ts\";\nimport type { JsonRecord, RuntimeState } from \"../../types.ts\";\nimport { TERMINAL_STATES } from \"../../concerns/constants.ts\";\nimport { loadAgentPipelineSnapshotForIssue, loadAgentSessionSnapshotsForIssue } from \"../../agents/agent.ts\";\nimport { getApiRuntimeContextOrThrow } from \"../plugins/api-runtime-context.ts\";\nimport { persistState } from \"../store.ts\";\nimport { getEffectiveAgentProviders } from \"../../agents/providers.ts\";\nimport { addEvent, handleStatePatch } from \"../../domains/issues.ts\";\nimport { now } from \"../../concerns/helpers.ts\";\nimport { getContainer } from \"../container.ts\";\nimport { createIssueCommand } from \"../../commands/create-issue.command.ts\";\nimport { cancelIssueCommand } from \"../../commands/cancel-issue.command.ts\";\nimport { transitionIssueCommand } from \"../../commands/transition-issue.command.ts\";\nimport { findIssue } from \"../../routes/helpers.ts\";\n\nfunction getIssueId(c: unknown): string | null {\n if (!c || typeof c !== \"object\" || !(\"req\" in c) || !c.req || typeof (c as { req: unknown }).req !== \"object\") {\n return null;\n }\n const req = (c as { req: { param: (name: string) => unknown } }).req;\n const value = req.param(\"id\");\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim();\n return trimmed ? trimmed : null;\n}\n\nasync function getIssuePipeline(c: unknown) {\n const context = getApiRuntimeContextOrThrow();\n const issueId = getIssueId(c);\n if (!issueId) {\n return { status: 400, body: { ok: false, error: \"Issue id is required.\" } };\n }\n\n const issue = findIssue(context.state, issueId);\n if (!issue) {\n return { status: 404, body: { ok: false, error: \"Issue not found\" } };\n }\n\n const providers = getEffectiveAgentProviders(context.state, issue, null);\n const pipeline = await loadAgentPipelineSnapshotForIssue(issue, providers);\n return { body: { ok: true, issueId: issue.id, pipeline } };\n}\n\nasync function getIssueSessions(c: unknown) {\n const context = getApiRuntimeContextOrThrow();\n const issueId = getIssueId(c);\n if (!issueId) {\n return { status: 400, body: { ok: false, error: \"Issue id is required.\" } };\n }\n\n const issue = findIssue(context.state, issueId);\n if (!issue) {\n return { status: 404, body: { ok: false, error: \"Issue not found\" } };\n }\n\n const providers = getEffectiveAgentProviders(context.state, issue, null);\n const pipeline = await loadAgentPipelineSnapshotForIssue(issue, providers);\n const sessions = await loadAgentSessionSnapshotsForIssue(issue, providers, pipeline, null);\n return { body: { ok: true, issueId: issue.id, pipeline, sessions } };\n}\n\nasync function patchIssueState(c: unknown) {\n const context = getApiRuntimeContextOrThrow();\n const issueId = getIssueId(c);\n if (!issueId) {\n return { status: 400, body: { ok: false, error: \"Issue id is required.\" } };\n }\n\n const issue = findIssue(context.state, issueId);\n if (!issue) {\n return { status: 404, body: { ok: false, error: \"Issue not found\" } };\n }\n\n try {\n const payload = await (c as { req: { json: () => Promise<unknown> } }).req.json() as JsonRecord;\n await handleStatePatch(context.state, issue, payload);\n await persistState(context.state);\n return { body: { ok: true, issue } };\n } catch (error) {\n return { status: 400, body: { ok: false, error: error instanceof Error ? error.message : String(error) } };\n }\n}\n\nasync function retryIssue(c: unknown) {\n const context = getApiRuntimeContextOrThrow();\n const issueId = getIssueId(c);\n if (!issueId) {\n return { status: 400, body: { ok: false, error: \"Issue id is required.\" } };\n }\n\n const issue = findIssue(context.state, issueId);\n if (!issue) {\n return { status: 404, body: { ok: false, error: \"Issue not found\" } };\n }\n const container = getContainer();\n\n if (TERMINAL_STATES.has(issue.state)) {\n issue.lastError = undefined;\n issue.nextRetryAt = undefined;\n await transitionIssueCommand(\n { issue, target: \"Queued\", note: \"Manual retry requested.\" },\n container,\n );\n } else {\n issue.nextRetryAt = undefined;\n issue.lastError = undefined;\n issue.updatedAt = now();\n }\n\n addEvent(context.state, issue.id, \"manual\", `Manual retry requested for ${issue.id}.`);\n await persistState(context.state);\n return { body: { ok: true, issue } };\n}\n\nasync function createIssue(c: unknown) {\n const context = getApiRuntimeContextOrThrow();\n try {\n const payload = await (c as { req: { json: () => Promise<unknown> } }).req.json() as JsonRecord;\n const container = getContainer();\n const { issue } = await createIssueCommand(\n { payload, state: context.state },\n container,\n );\n return { body: { ok: true, issue } };\n } catch (error) {\n return { status: 400, body: { ok: false, error: error instanceof Error ? error.message : String(error) } };\n }\n}\n\nasync function cancelIssue(c: unknown) {\n const context = getApiRuntimeContextOrThrow();\n const issueId = getIssueId(c);\n if (!issueId) {\n return { status: 400, body: { ok: false, error: \"Issue id is required.\" } };\n }\n\n const issue = findIssue(context.state, issueId);\n if (!issue) {\n return { status: 404, body: { ok: false, error: \"Issue not found\" } };\n }\n\n await cancelIssueCommand(\n { issue },\n getContainer(),\n );\n addEvent(context.state, issue.id, \"manual\", `Manual cancel requested for ${issue.id}.`);\n await persistState(context.state);\n return { body: { ok: true, issue } };\n}\n\nexport default {\n name: S3DB_ISSUE_RESOURCE,\n attributes: {\n id: \"string|required\",\n identifier: \"string|required\",\n title: \"string|required\",\n description: \"string|optional\",\n priority: \"number|required\",\n state: \"string|required\",\n branchName: \"string|optional\",\n url: \"string|optional\",\n assigneeId: \"string|optional\",\n labels: \"json|required\",\n paths: \"json|optional\",\n inferredPaths: \"json|optional\",\n capabilityCategory: \"string|optional\",\n capabilityOverlays: \"json|optional\",\n capabilityRationale: \"json|optional\",\n blockedBy: \"json|required\",\n assignedToWorker: \"boolean|required\",\n createdAt: \"datetime|required\",\n updatedAt: \"datetime|required\",\n history: \"json|required\",\n startedAt: \"datetime|optional\",\n completedAt: \"datetime|optional\",\n attempts: \"number|required\",\n maxAttempts: \"number|required\",\n nextRetryAt: \"datetime|optional\",\n workspacePath: \"string|optional\",\n worktreePath: \"string|optional\",\n baseBranch: \"string|optional\",\n headCommitAtStart: \"string|optional\",\n mergedAt: \"datetime|optional\",\n mergeResult: \"json|optional\",\n mergedReason: \"string|optional\",\n cancelledReason: \"string|optional\",\n reviewingAt: \"datetime|optional\",\n workspacePreparedAt: \"datetime|optional\",\n lastError: \"string|optional\",\n durationMs: \"number|optional\",\n commandExitCode: \"number|optional\",\n commandOutputTail: \"string|optional\",\n terminalWeek: \"string|optional\",\n usage: \"json|optional\",\n tokenUsage: \"json|optional\",\n tokensByPhase: \"json|optional\",\n tokensByModel: \"json|optional\",\n plan: \"json|optional\",\n planHistory: \"json|optional\",\n planVersion: \"number|optional\",\n planningStatus: \"string|optional\",\n planningStartedAt: \"datetime|optional\",\n planningError: \"string|optional\",\n executeAttempt: \"number|optional\",\n reviewAttempt: \"number|optional\",\n issueType: \"string|optional\",\n eventsCount: \"number|optional\",\n images: \"json|optional\",\n linesAdded: \"number|optional\",\n linesRemoved: \"number|optional\",\n filesChanged: \"number|optional\",\n effort: \"json|optional\",\n },\n partitions: {\n byState: { fields: { state: \"string\" } },\n byCapabilityCategory: { fields: { capabilityCategory: \"string\" } },\n byStateAndCapability: {\n fields: { state: \"string\", capabilityCategory: \"string\" },\n },\n byTerminalWeek: { fields: { terminalWeek: \"string\" } },\n },\n asyncPartitions: true,\n behavior: \"body-overflow\",\n paranoid: false,\n timestamps: true,\n api: {\n auth: false,\n methods: [\"GET\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\", \"HEAD\", \"OPTIONS\"],\n description: \"Issue registry for orchestration runtime\",\n \"POST /create\": async (c: unknown) => {\n const result = await createIssue(c);\n if (result.status) {\n return c.json(result.body, result.status);\n }\n return c.json(result.body, 201);\n },\n \"POST /\": async (c: unknown) => {\n const result = await createIssue(c);\n if (result.status) {\n return c.json(result.body, result.status);\n }\n return c.json(result.body, 201);\n },\n \"GET /:id/pipeline\": async (c: unknown) => {\n const result = await getIssuePipeline(c);\n if (result.status) {\n return c.json(result.body, result.status);\n }\n return result.body;\n },\n \"GET /:id/sessions\": async (c: unknown) => {\n const result = await getIssueSessions(c);\n if (result.status) {\n return c.json(result.body, result.status);\n }\n return result.body;\n },\n \"POST /:id/state\": async (c: unknown) => {\n const result = await patchIssueState(c);\n if (result.status) {\n return c.json(result.body, result.status);\n }\n return result.body;\n },\n \"POST /:id/retry\": async (c: unknown) => {\n const result = await retryIssue(c);\n if (result.status) {\n return c.json(result.body, result.status);\n }\n return result.body;\n },\n \"POST /:id/cancel\": async (c: unknown) => {\n const result = await cancelIssue(c);\n if (result.status) {\n return c.json(result.body, result.status);\n }\n return result.body;\n },\n },\n};\n","import { S3DB_ISSUE_PLAN_RESOURCE } from \"../../concerns/constants.ts\";\n\nexport default {\n name: S3DB_ISSUE_PLAN_RESOURCE,\n attributes: {\n id: \"string|required\",\n plan: \"json|optional\",\n planHistory: \"json|optional\",\n planVersion: \"number|required\",\n },\n behavior: \"body-overflow\",\n paranoid: false,\n timestamps: true,\n};\n","import { S3DB_EVENT_RESOURCE } from \"../../concerns/constants.ts\";\n\nexport default {\n name: S3DB_EVENT_RESOURCE,\n attributes: {\n id: \"string|required\",\n issueId: \"string|optional\",\n kind: \"string|required\",\n message: \"string|required\",\n at: \"datetime|required\",\n },\n partitions: {\n byIssueId: { fields: { issueId: \"string\" } },\n byKind: { fields: { kind: \"string\" } },\n byIssueIdAndKind: { fields: { issueId: \"string\", kind: \"string\" } },\n },\n asyncPartitions: true,\n behavior: \"body-overflow\",\n paranoid: false,\n timestamps: false,\n api: {\n auth: false,\n methods: [\"GET\", \"HEAD\", \"OPTIONS\"],\n description: \"Runtime event log entries\",\n },\n};\n","import { S3DB_SETTINGS_RESOURCE } from \"../../concerns/constants.ts\";\n\nexport default {\n name: S3DB_SETTINGS_RESOURCE,\n attributes: {\n id: \"string|required\",\n scope: \"string|required\",\n value: \"json|required\",\n source: \"string|required\",\n updatedAt: \"datetime|required\",\n },\n partitions: {\n byScope: { fields: { scope: \"string\" } },\n },\n asyncPartitions: true,\n behavior: \"body-overflow\",\n paranoid: false,\n timestamps: false,\n api: {\n enabled: false,\n },\n};\n","import { S3DB_AGENT_SESSION_RESOURCE } from \"../../concerns/constants.ts\";\n\nexport default {\n name: S3DB_AGENT_SESSION_RESOURCE,\n attributes: {\n id: \"string|required\",\n issueId: \"string|required\",\n issueIdentifier: \"string|required\",\n attempt: \"number|required\",\n cycle: \"number|required\",\n provider: \"string|required\",\n role: \"string|required\",\n updatedAt: \"datetime|required\",\n session: \"json|required\",\n },\n partitions: {\n byIssueId: { fields: { issueId: \"string\" } },\n byIssueAttempt: { fields: { issueId: \"string\", attempt: \"number\" } },\n byProviderRole: { fields: { provider: \"string\", role: \"string\" } },\n },\n asyncPartitions: true,\n behavior: \"body-overflow\",\n paranoid: false,\n timestamps: false,\n api: {\n auth: false,\n methods: [\"GET\", \"HEAD\", \"OPTIONS\"],\n description: \"Agent session snapshots per attempt\",\n },\n};\n","import { S3DB_AGENT_PIPELINE_RESOURCE } from \"../../concerns/constants.ts\";\n\nexport default {\n name: S3DB_AGENT_PIPELINE_RESOURCE,\n attributes: {\n id: \"string|required\",\n issueId: \"string|required\",\n issueIdentifier: \"string|required\",\n attempt: \"number|required\",\n updatedAt: \"datetime|required\",\n pipeline: \"json|required\",\n },\n partitions: {\n byIssueId: { fields: { issueId: \"string\" } },\n byIssueAttempt: { fields: { issueId: \"string\", attempt: \"number\" } },\n },\n asyncPartitions: true,\n behavior: \"body-overflow\",\n paranoid: false,\n timestamps: false,\n api: {\n auth: false,\n methods: [\"GET\", \"HEAD\", \"OPTIONS\"],\n description: \"Agent pipeline snapshots per attempt\",\n },\n};\n","import runtimeStateResource from \"./runtime-state.resource.ts\";\nimport issuesResource from \"./issues.resource.ts\";\nimport issuePlansResource from \"./issue-plans.resource.ts\";\nimport eventsResource from \"./events.resource.ts\";\nimport settingsResource from \"./settings.resource.ts\";\nimport agentSessionsResource from \"./agent-sessions.resource.ts\";\nimport agentPipelinesResource from \"./agent-pipelines.resource.ts\";\n\nexport const NATIVE_RESOURCE_CONFIGS = [\n runtimeStateResource,\n issuesResource,\n issuePlansResource,\n eventsResource,\n settingsResource,\n agentSessionsResource,\n agentPipelinesResource,\n] as const;\n\nexport const NATIVE_RESOURCE_NAMES = NATIVE_RESOURCE_CONFIGS.map((resource) => resource.name);\n","import { now } from \"../concerns/helpers.ts\";\nimport { logger } from \"../concerns/logger.ts\";\nimport { computeCapabilityCounts, computeMetrics } from \"../domains/metrics.ts\";\nimport type { RuntimeState } from \"../types.ts\";\n\n// ── WebSocket broadcast (same port via listeners) ────────────────────────────\n// s3db.js 21.2.7 WebSocket contract: handlers receive (socketId, send, req)\n// instead of raw socket objects. We track socketId → send function.\n\nexport type WsSendFn = (data: string) => void;\nexport const wsClients = new Map<string, WsSendFn>(); // socketId → send\nexport let broadcastSeq = 0;\nexport let lastBroadcastIssueSnapshot: Map<string, string> = new Map(); // id → JSON\n\nexport function sendToAllClients(data: string): void {\n for (const [socketId, send] of [...wsClients]) {\n try { send(data); } catch (error) {\n logger.debug(`WebSocket send failed for ${socketId}, removing (remaining: ${wsClients.size - 1}): ${String(error)}`);\n wsClients.delete(socketId);\n }\n }\n}\n\nexport function broadcastToWebSocketClients(message: Record<string, unknown>): void {\n if (wsClients.size === 0) return;\n\n broadcastSeq++;\n logger.debug({ seq: broadcastSeq, type: message.type, clientCount: wsClients.size }, \"[WebSocket] Broadcasting state update\");\n const issues = message.issues as Array<Record<string, unknown>> | undefined;\n\n if (issues && lastBroadcastIssueSnapshot.size > 0) {\n // Compute delta: only changed/new/removed issues\n const currentIds = new Set<string>();\n const changedIssues: Array<Record<string, unknown>> = [];\n\n for (const issue of issues) {\n const id = issue.id as string;\n currentIds.add(id);\n const serialized = JSON.stringify(issue);\n if (lastBroadcastIssueSnapshot.get(id) !== serialized) {\n changedIssues.push(issue);\n }\n }\n\n const removedIds: string[] = [];\n for (const prevId of lastBroadcastIssueSnapshot.keys()) {\n if (!currentIds.has(prevId)) {\n removedIds.push(prevId);\n }\n }\n\n // Update snapshot\n lastBroadcastIssueSnapshot = new Map(\n issues.map((issue) => [issue.id as string, JSON.stringify(issue)]),\n );\n\n // If fewer than half changed, send a delta instead of full state\n if (changedIssues.length < issues.length / 2 || changedIssues.length <= 3) {\n const delta: Record<string, unknown> = {\n type: \"state:delta\",\n seq: broadcastSeq,\n metrics: message.metrics,\n capabilities: message.capabilities,\n updatedAt: message.updatedAt,\n issuesDelta: changedIssues,\n issuesRemoved: removedIds,\n events: message.events,\n };\n sendToAllClients(JSON.stringify(delta));\n return;\n }\n }\n\n // Full state broadcast (first time or too many changes)\n if (issues) {\n lastBroadcastIssueSnapshot = new Map(\n issues.map((issue) => [issue.id as string, JSON.stringify(issue)]),\n );\n }\n\n sendToAllClients(JSON.stringify({\n ...message,\n seq: broadcastSeq,\n }));\n}\n\nexport function makeWebSocketConfig(state: RuntimeState) {\n return {\n enabled: true,\n path: \"/ws\",\n maxPayloadBytes: 512_000,\n onConnection: (socketId: string, send: WsSendFn) => {\n wsClients.set(socketId, send);\n logger.debug(`WebSocket client connected: ${socketId} (total: ${wsClients.size})`);\n try {\n send(JSON.stringify({\n type: \"connected\",\n seq: broadcastSeq,\n timestamp: now(),\n metrics: computeMetrics(state.issues),\n capabilities: computeCapabilityCounts(state.issues),\n issues: state.issues,\n events: state.events.slice(0, 50),\n }));\n } catch (error) {\n logger.debug(`WebSocket initial send failed for ${socketId}: ${String(error)}`);\n }\n },\n onMessage: (socketId: string, message: string | Buffer, send: WsSendFn) => {\n try {\n const msg = JSON.parse(typeof message === \"string\" ? message : message.toString(\"utf8\"));\n if (msg.type === \"ping\") {\n send(JSON.stringify({ type: \"pong\", timestamp: now() }));\n }\n } catch {}\n },\n onClose: (socketId: string) => {\n wsClients.delete(socketId);\n logger.debug(`WebSocket client disconnected: ${socketId} (total: ${wsClients.size})`);\n },\n };\n}\n","import type {\n IssueEntry,\n ParallelismAnalysis,\n RuntimeState,\n} from \"../../types.ts\";\nimport { EXECUTING_STATES, TERMINAL_STATES } from \"../../concerns/constants.ts\";\nimport { now } from \"../../concerns/helpers.ts\";\nimport { logger } from \"../../concerns/logger.ts\";\nimport { persistState } from \"../store.ts\";\nimport { computeMetrics, getNextRetryAt } from \"../../domains/issues.ts\";\nimport { getContainer } from \"../container.ts\";\nimport { transitionIssueCommand } from \"../../commands/transition-issue.command.ts\";\nimport { issueHasResumableSession, isAgentStillRunning } from \"../../agents/agent.ts\";\n\nlet shuttingDown = false;\n\nexport function isShuttingDown(): boolean {\n return shuttingDown;\n}\n\nexport function installGracefulShutdown(\n state: RuntimeState,\n running: Set<string>,\n): void {\n const handler = async (signal: string) => {\n if (shuttingDown) {\n logger.warn(`Received ${signal} again, forcing exit.`);\n process.exit(1);\n }\n shuttingDown = true;\n logger.info(`Received ${signal}, shutting down gracefully...`);\n const container = getContainer();\n container.eventStore.addEvent(undefined, \"info\", `Graceful shutdown initiated (${signal}).`);\n\n // Mark running/reviewing issues as Queued so they resume on next boot\n for (const issue of state.issues) {\n if (running.has(issue.id) && (issue.state === \"Running\" || issue.state === \"Reviewing\")) {\n try {\n await transitionIssueCommand({ issue, target: \"Queued\", note: `Interrupted by ${signal} — queued for resume on next start.`, fallbackToLocal: true }, container);\n } catch {\n logger.warn(`Could not transition issue ${issue.identifier} to Queued during shutdown.`);\n }\n container.eventStore.addEvent(issue.id, \"info\", `Issue ${issue.identifier} queued for resume on next start.`);\n }\n\n if (issue.state === \"Planning\" && issue.planningStatus === \"planning\") {\n issue.planningStatus = \"idle\";\n issue.planningError = `Interrupted by ${signal} — will resume.`;\n issue.planningStartedAt = undefined;\n container.issueRepository.markDirty(issue.id);\n container.eventStore.addEvent(issue.id, \"info\", `Planning for ${issue.identifier} interrupted by shutdown — will resume.`);\n }\n }\n\n state.updatedAt = now();\n state.metrics = computeMetrics(state.issues);\n try {\n await persistState(state);\n logger.info(\"State persisted.\");\n } catch (error) {\n logger.error(`Failed to persist state during shutdown: ${String(error)}`);\n }\n logger.info(\"Goodbye.\");\n process.exit(0);\n };\n\n process.on(\"SIGINT\", () => handler(\"SIGINT\"));\n process.on(\"SIGTERM\", () => handler(\"SIGTERM\"));\n}\n\nexport function analyzeParallelizability(issues: IssueEntry[]): ParallelismAnalysis {\n const todo = issues.filter((issue) =>\n issue.state === \"Planned\"\n && issue.assignedToWorker\n && issue.blockedBy.length === 0,\n );\n\n if (todo.length === 0) {\n return {\n canParallelize: false,\n maxSafeParallelism: 0,\n reason: \"No runnable issues in Planned state.\",\n groups: [],\n };\n }\n\n const getIssuePaths = (issue: IssueEntry): Set<string> =>\n new Set([...(issue.paths ?? []), ...(issue.inferredPaths ?? [])]);\n\n const hasPathOverlap = (a: IssueEntry, b: IssueEntry): boolean => {\n const pathsA = getIssuePaths(a);\n const pathsB = getIssuePaths(b);\n if (pathsA.size === 0 || pathsB.size === 0) return false;\n for (const p of pathsA) {\n if (pathsB.has(p)) return true;\n }\n return false;\n };\n\n const hasDep = (a: IssueEntry, b: IssueEntry): boolean =>\n a.blockedBy.includes(b.id) || b.blockedBy.includes(a.id);\n\n const groups: string[][] = [];\n const assigned = new Set<string>();\n\n for (const issue of todo) {\n if (assigned.has(issue.id)) continue;\n\n let placed = false;\n for (const group of groups) {\n const canJoin = group.every((memberId) => {\n const member = todo.find((i) => i.id === memberId)!;\n return !hasPathOverlap(issue, member) && !hasDep(issue, member);\n });\n\n if (canJoin) {\n group.push(issue.id);\n assigned.add(issue.id);\n placed = true;\n break;\n }\n }\n\n if (!placed) {\n groups.push([issue.id]);\n assigned.add(issue.id);\n }\n }\n\n const maxSafe = Math.max(...groups.map((g) => g.length));\n const conflictingPairs = todo.filter((a, i) =>\n todo.slice(i + 1).some((b) => hasPathOverlap(a, b)),\n ).length;\n\n const reason = conflictingPairs > 0\n ? `${conflictingPairs} issue(s) share file paths with other issues. Maximum safe parallelism is ${maxSafe}.`\n : `All ${todo.length} runnable issues have independent paths. Safe to parallelize up to ${maxSafe}.`;\n\n return {\n canParallelize: maxSafe > 1,\n maxSafeParallelism: maxSafe,\n reason,\n groups,\n };\n}\n\nexport async function ensureNotStale(state: RuntimeState, staleTimeoutMs: number): Promise<void> {\n const limit = Date.now() - staleTimeoutMs;\n const container = getContainer();\n\n for (const issue of state.issues) {\n if (issue.state !== \"Planning\" || issue.planningStatus !== \"planning\") continue;\n if (!issue.planningStartedAt) continue;\n const elapsed = Date.now() - Date.parse(issue.planningStartedAt);\n if (elapsed > staleTimeoutMs) {\n issue.planningStatus = \"idle\";\n issue.planningError = \"Planning worker stalled — auto-recovered.\";\n issue.planningStartedAt = undefined;\n container.issueRepository.markDirty(issue.id);\n container.eventStore.addEvent(issue.id, \"info\", `Planning for ${issue.identifier} recovered from stale.`);\n logger.info({ issueId: issue.id, identifier: issue.identifier, elapsed }, \"[Scheduler] Recovered stale planning job\");\n }\n }\n\n for (const issue of state.issues) {\n if (!EXECUTING_STATES.has(issue.state)) continue;\n if (issueHasResumableSession(issue)) continue;\n\n const agentStatus = isAgentStillRunning(issue);\n const pidDead = agentStatus.pid !== null && !agentStatus.alive;\n\n if (pidDead) {\n logger.info({ issueId: issue.id, identifier: issue.identifier, state: issue.state, pid: agentStatus.pid?.pid }, \"[Scheduler] PID dead — silently recovering to Queued\");\n issue.startedAt = undefined;\n container.issueRepository.markDirty(issue.id);\n await transitionIssueCommand({ issue, target: \"Queued\", note: `Agent process died (PID ${agentStatus.pid!.pid}) — auto-recovering.` }, container);\n container.eventStore.addEvent(issue.id, \"info\", `Issue ${issue.identifier} agent process died (PID ${agentStatus.pid!.pid}), silently recovered to Queued.`);\n continue;\n }\n\n if (Date.parse(issue.updatedAt) < limit) {\n const staleMinutes = Math.round((Date.now() - Date.parse(issue.updatedAt)) / 60_000);\n const reason = `Stale execution — no updates for over ${staleMinutes} minute(s) in ${issue.state} state.`;\n logger.info({ issueId: issue.id, identifier: issue.identifier, state: issue.state, updatedAt: issue.updatedAt }, \"[Scheduler] Recovering stale issue → Blocked\");\n issue.attempts += 1;\n issue.nextRetryAt = getNextRetryAt(issue, state.config.retryDelayMs);\n issue.startedAt = undefined;\n container.issueRepository.markDirty(issue.id);\n await transitionIssueCommand({ issue, target: \"Blocked\", note: reason }, container);\n container.eventStore.addEvent(issue.id, \"info\", `Issue ${issue.identifier} was stale for over ${staleMinutes} minute(s) in ${issue.state} state, moved to Blocked for retry.`);\n }\n }\n}\n\nexport function hasTerminalQueue(state: RuntimeState): boolean {\n return state.issues.every((issue) => TERMINAL_STATES.has(issue.state) || issue.attempts >= issue.maxAttempts);\n}\n","import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\n\nconst execFileAsync = promisify(execFile);\nimport { existsSync, readFileSync, readdirSync, realpathSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { env } from \"node:process\";\nimport { logger } from \"../concerns/logger.ts\";\n\nasync function whichExists(cmd: string): Promise<boolean> {\n try {\n await execFileAsync(\"which\", [cmd], { encoding: \"utf8\", timeout: 3000 });\n return true;\n } catch {\n return false;\n }\n}\n\n// ── Types ────────────────────────────────────────────────────────────────────\n\ninterface ModelInfo {\n slug: string;\n displayName: string;\n description: string;\n}\n\ninterface UsagePeriod {\n inputTokens: number;\n outputTokens: number;\n tokensUsed: number;\n sessions: number;\n since: string;\n}\n\ninterface ProviderUsage {\n name: string;\n available: boolean;\n models: ModelInfo[];\n currentModel: string;\n usage: {\n today: UsagePeriod;\n thisWeek: UsagePeriod;\n allTime: UsagePeriod;\n };\n resetInfo: string;\n nextResetAt: string;\n weeklyLimitEstimate: number | null;\n percentUsed: number | null;\n}\n\ninterface ProvidersUsageResult {\n providers: ProviderUsage[];\n collectedAt: string;\n}\n\nfunction resolveCodexHomeCandidates(): string[] {\n const homePaths = new Set<string>([\n homedir(),\n env.XDG_STATE_HOME?.trim() || \"\",\n env.XDG_DATA_HOME?.trim() || \"\",\n ]);\n\n const sudoUser = env.SUDO_USER?.trim();\n if (sudoUser && sudoUser !== \"root\") {\n homePaths.add(`/home/${sudoUser}`);\n }\n\n const direct = new Set<string>([\n env.CODEX_HOME?.trim() || \"\",\n ]);\n\n const candidates = [...homePaths, ...direct]\n .filter(Boolean)\n .flatMap((candidate) => {\n if (candidate.endsWith(\"/.codex\") || candidate.endsWith(\"/codex\")) return [candidate];\n return [join(candidate, \".codex\"), join(candidate, \"codex\")];\n });\n\n return [...new Set(candidates)];\n}\n\nfunction resolveCodexDir(): string | null {\n for (const candidate of resolveCodexHomeCandidates()) {\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n\n return null;\n}\n\nfunction findLatestCodexDb(codexDir: string): string | null {\n const explicit = join(codexDir, \"state_5.sqlite\");\n if (existsSync(explicit)) return explicit;\n\n const candidates = readdirSync(codexDir)\n .filter((name) => name.startsWith(\"state_\") && name.endsWith(\".sqlite\"))\n .sort()\n .reverse();\n\n if (candidates.length === 0) return null;\n return join(codexDir, candidates[0]);\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction computeNextMonday(): Date {\n const now = new Date();\n const utcDay = now.getUTCDay();\n const daysUntilMonday = utcDay === 0 ? 1 : utcDay === 1 ? 7 : 8 - utcDay;\n const next = new Date(now);\n next.setUTCDate(next.getUTCDate() + daysUntilMonday);\n next.setUTCHours(0, 0, 0, 0);\n return next;\n}\n\nfunction computeWeekStart(): Date {\n const d = new Date();\n d.setUTCHours(0, 0, 0, 0);\n const utcDay = d.getUTCDay();\n const daysFromMonday = utcDay === 0 ? 6 : utcDay - 1;\n d.setUTCDate(d.getUTCDate() - daysFromMonday);\n return d;\n}\n\nfunction computeTodayStart(): Date {\n const d = new Date();\n d.setUTCHours(0, 0, 0, 0);\n return d;\n}\n\nfunction makePeriod(input: number, output: number, sessions: number, since: string): UsagePeriod {\n return { inputTokens: input, outputTokens: output, tokensUsed: input + output, sessions, since };\n}\n\n// Known weekly token limits per plan (approximate, based on public info)\nconst CLAUDE_PLAN_LIMITS: Record<string, number> = {\n pro: 45_000_000, // ~45M tokens/week (Pro plan estimate)\n max: 135_000_000, // ~135M tokens/week (Max plan)\n max5x: 675_000_000, // ~675M tokens/week (Max 5x plan)\n};\n\n// ── Claude usage (from JSONL session files) ──────────────────────────────────\n\nasync function collectClaudeUsage(): Promise<ProviderUsage | null> {\n const home = homedir();\n const claudeDir = join(home, \".claude\");\n if (!existsSync(claudeDir)) return null;\n\n const available = await whichExists(\"claude\");\n\n // Aggregate token usage from all project session files\n const projectsDir = join(claudeDir, \"projects\");\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n let totalSessions = 0;\n let todayInputTokens = 0;\n let todayOutputTokens = 0;\n let todaySessions = 0;\n let weekInputTokens = 0;\n let weekOutputTokens = 0;\n let weekSessions = 0;\n\n const todayStart = computeTodayStart();\n const todayMs = todayStart.getTime();\n const weekStart = computeWeekStart();\n const weekMs = weekStart.getTime();\n\n if (existsSync(projectsDir)) {\n try {\n const projectDirs = readdirSync(projectsDir, { withFileTypes: true });\n for (const dir of projectDirs) {\n if (!dir.isDirectory()) continue;\n const projectPath = join(projectsDir, dir.name);\n\n let sessionFiles: string[];\n try {\n sessionFiles = readdirSync(projectPath)\n .filter((f) => f.endsWith(\".jsonl\"));\n } catch {\n continue;\n }\n\n for (const file of sessionFiles) {\n const filePath = join(projectPath, file);\n let content: string;\n try {\n content = readFileSync(filePath, \"utf8\");\n } catch {\n continue;\n }\n\n let sessionCounted = false;\n let sessionTodayCounted = false;\n let sessionWeekCounted = false;\n\n for (const line of content.split(\"\\n\")) {\n if (!line.trim()) continue;\n try {\n const entry = JSON.parse(line);\n if (entry.type !== \"assistant\" || !entry.message?.usage) continue;\n\n const usage = entry.message.usage;\n // Only count actual billed tokens — cache reads are free/cheap\n const inputTokens = (usage.input_tokens || 0) +\n (usage.cache_creation_input_tokens || 0);\n const outputTokens = usage.output_tokens || 0;\n\n totalInputTokens += inputTokens;\n totalOutputTokens += outputTokens;\n if (!sessionCounted) {\n totalSessions++;\n sessionCounted = true;\n }\n\n const timestamp = entry.timestamp ? new Date(entry.timestamp).getTime() : 0;\n\n if (timestamp >= todayMs) {\n todayInputTokens += inputTokens;\n todayOutputTokens += outputTokens;\n if (!sessionTodayCounted) {\n todaySessions++;\n sessionTodayCounted = true;\n }\n }\n\n if (timestamp >= weekMs) {\n weekInputTokens += inputTokens;\n weekOutputTokens += outputTokens;\n if (!sessionWeekCounted) {\n weekSessions++;\n sessionWeekCounted = true;\n }\n }\n } catch {}\n }\n }\n }\n } catch (err) {\n logger.debug(`Failed to read Claude session files: ${String(err)}`);\n }\n }\n\n // Claude models (known models for Claude Code)\n const models: ModelInfo[] = [\n { slug: \"claude-opus-4-6\", displayName: \"Claude Opus 4.6\", description: \"Most capable model for complex tasks\" },\n { slug: \"claude-sonnet-4-6\", displayName: \"Claude Sonnet 4.6\", description: \"Balanced performance and speed\" },\n { slug: \"claude-haiku-4-5\", displayName: \"Claude Haiku 4.5\", description: \"Fast and efficient model\" },\n ];\n\n // Detect subscription type and configured model from settings\n let plan = \"pro\";\n let resetInfo = \"Weekly reset (every Monday 00:00 UTC)\";\n let currentModel = \"\";\n const settingsPath = join(claudeDir, \"settings.json\");\n if (existsSync(settingsPath)) {\n try {\n const settings = JSON.parse(readFileSync(settingsPath, \"utf8\"));\n if (settings.plan === \"max\" || settings.plan === \"max5x\") {\n plan = settings.plan;\n resetInfo = `Plan: ${settings.plan.toUpperCase()} — Weekly token limit resets every Monday 00:00 UTC`;\n }\n if (typeof settings.model === \"string\" && settings.model.trim()) {\n currentModel = settings.model.trim();\n }\n } catch {}\n }\n\n const nextResetAt = computeNextMonday().toISOString();\n const weeklyLimit = CLAUDE_PLAN_LIMITS[plan] ?? null;\n const weeklyUsed = weekInputTokens + weekOutputTokens;\n const percentUsed = weeklyLimit ? Math.min(100, Math.round((weeklyUsed / weeklyLimit) * 100)) : null;\n\n return {\n name: \"claude\",\n available,\n models,\n currentModel,\n usage: {\n today: makePeriod(todayInputTokens, todayOutputTokens, todaySessions, todayStart.toISOString()),\n thisWeek: makePeriod(weekInputTokens, weekOutputTokens, weekSessions, weekStart.toISOString()),\n allTime: makePeriod(totalInputTokens, totalOutputTokens, totalSessions, \"\"),\n },\n resetInfo,\n nextResetAt,\n weeklyLimitEstimate: weeklyLimit,\n percentUsed,\n };\n}\n\n// ── Codex usage (from SQLite state DB) ───────────────────────────────────────\n\nasync function collectCodexUsage(): Promise<ProviderUsage | null> {\n const codexDir = resolveCodexDir();\n if (!codexDir) return null;\n\n const available = await whichExists(\"codex\");\n\n // Read models from cache\n const models: ModelInfo[] = [];\n const modelsCachePath = join(codexDir, \"models_cache.json\");\n let currentModel = \"\";\n\n if (existsSync(modelsCachePath)) {\n try {\n const cache = JSON.parse(readFileSync(modelsCachePath, \"utf8\"));\n for (const m of cache.models || []) {\n models.push({\n slug: m.slug,\n displayName: m.display_name || m.slug,\n description: (m.description || \"\").slice(0, 80),\n });\n }\n } catch {}\n }\n\n // Read current model from config\n const configPath = join(codexDir, \"config.toml\");\n if (existsSync(configPath)) {\n try {\n const configContent = readFileSync(configPath, \"utf8\");\n const modelMatch = configContent.match(/^model\\s*=\\s*\"([^\"]+)\"/m);\n if (modelMatch) currentModel = modelMatch[1];\n } catch {}\n }\n\n const todayStart = computeTodayStart();\n const weekStart = computeWeekStart();\n const nextResetAt = computeNextMonday().toISOString();\n\n // Find the right SQLite file\n const dbPath = findLatestCodexDb(codexDir);\n if (!dbPath) {\n return {\n name: \"codex\",\n available,\n models,\n currentModel,\n usage: {\n today: makePeriod(0, 0, 0, todayStart.toISOString()),\n thisWeek: makePeriod(0, 0, 0, weekStart.toISOString()),\n allTime: makePeriod(0, 0, 0, \"\"),\n },\n resetInfo: \"Weekly rate limit resets every Monday\",\n nextResetAt,\n weeklyLimitEstimate: null,\n percentUsed: null,\n };\n }\n\n let allTimeTokens = 0;\n let allTimeSessions = 0;\n let todayTokens = 0;\n let todaySessions = 0;\n let weekTokens = 0;\n let weekSessions = 0;\n\n const todayUnix = Math.floor(todayStart.getTime() / 1000);\n const weekUnix = Math.floor(weekStart.getTime() / 1000);\n\n try {\n const query = `\n SELECT\n SUM(tokens_used) as total_tokens,\n COUNT(*) as total_sessions,\n SUM(CASE WHEN created_at >= ${todayUnix} THEN tokens_used ELSE 0 END) as today_tokens,\n SUM(CASE WHEN created_at >= ${todayUnix} THEN 1 ELSE 0 END) as today_sessions,\n SUM(CASE WHEN created_at >= ${weekUnix} THEN tokens_used ELSE 0 END) as week_tokens,\n SUM(CASE WHEN created_at >= ${weekUnix} THEN 1 ELSE 0 END) as week_sessions\n FROM threads;\n `;\n const { stdout } = await execFileAsync(\"sqlite3\", [dbPath, query], {\n encoding: \"utf8\",\n timeout: 5000,\n });\n const result = stdout.trim();\n\n if (result) {\n const parts = result.split(\"|\");\n allTimeTokens = parseInt(parts[0], 10) || 0;\n allTimeSessions = parseInt(parts[1], 10) || 0;\n todayTokens = parseInt(parts[2], 10) || 0;\n todaySessions = parseInt(parts[3], 10) || 0;\n weekTokens = parseInt(parts[4], 10) || 0;\n weekSessions = parseInt(parts[5], 10) || 0;\n }\n } catch (err) {\n logger.debug(`Failed to query Codex SQLite: ${String(err)}`);\n }\n\n // Codex doesn't expose input/output split from SQLite, report all as input\n return {\n name: \"codex\",\n available,\n models,\n currentModel,\n usage: {\n today: makePeriod(todayTokens, 0, todaySessions, todayStart.toISOString()),\n thisWeek: makePeriod(weekTokens, 0, weekSessions, weekStart.toISOString()),\n allTime: makePeriod(allTimeTokens, 0, allTimeSessions, \"\"),\n },\n resetInfo: \"Weekly rate limit resets every Monday\",\n nextResetAt,\n weeklyLimitEstimate: null,\n percentUsed: null,\n };\n}\n\n// ── Gemini usage (stub — CLI has no local usage DB yet) ───────────────────────\n\nasync function collectGeminiUsage(): Promise<ProviderUsage | null> {\n const available = await whichExists(\"gemini\");\n if (!available) return null;\n\n const todayStart = computeTodayStart();\n const weekStart = computeWeekStart();\n const nextResetAt = computeNextMonday().toISOString();\n\n // Read models from the installed CLI package (same source as discoverModels)\n const models: ModelInfo[] = [];\n try {\n const { stdout: binPath } = await execFileAsync(\"which\", [\"gemini\"], { encoding: \"utf8\", timeout: 3000 });\n const realBin = realpathSync(binPath.trim());\n const modelsPath = join(dirname(dirname(realBin)), \"node_modules\", \"@google\", \"gemini-cli-core\", \"dist\", \"src\", \"config\", \"models.js\");\n if (existsSync(modelsPath)) {\n const content = readFileSync(modelsPath, \"utf8\");\n const regex = /export const ([A-Z0-9_]+)\\s*=\\s*'(gemini-[^']+)';/g;\n const seen = new Set<string>();\n let m: RegExpExecArray | null;\n while ((m = regex.exec(content)) !== null) {\n const [, constName, slug] = m;\n if (seen.has(slug) || slug.includes(\"embedding\")) continue;\n seen.add(slug);\n models.push({\n slug,\n displayName: slug,\n description: constName.startsWith(\"PREVIEW_\") ? \"Preview\" : \"Stable\",\n });\n }\n }\n } catch { /* fall through — models stays empty */ }\n\n let currentModel = \"\";\n const settingsPath = join(homedir(), \".gemini\", \"settings.json\");\n if (existsSync(settingsPath)) {\n try {\n const settings = JSON.parse(readFileSync(settingsPath, \"utf8\"));\n if (typeof settings.model === \"string\" && settings.model.trim()) {\n currentModel = settings.model.trim();\n }\n } catch {}\n }\n\n return {\n name: \"gemini\",\n available,\n models,\n currentModel,\n usage: {\n today: makePeriod(0, 0, 0, todayStart.toISOString()),\n thisWeek: makePeriod(0, 0, 0, weekStart.toISOString()),\n allTime: makePeriod(0, 0, 0, \"\"),\n },\n resetInfo: \"Usage data not available for Gemini CLI\",\n nextResetAt,\n weeklyLimitEstimate: null,\n percentUsed: null,\n };\n}\n\n// ── Public API ───────────────────────────────────────────────────────────────\n\nlet usageCache: ProvidersUsageResult | null = null;\nlet usageCacheAt = 0;\nconst USAGE_CACHE_TTL = 60_000; // 1 minute\n\nexport async function collectProvidersUsage(): Promise<ProvidersUsageResult> {\n if (usageCache && Date.now() - usageCacheAt < USAGE_CACHE_TTL) {\n return usageCache;\n }\n\n const results = await Promise.all([\n collectClaudeUsage(),\n collectCodexUsage(),\n collectGeminiUsage(),\n ]);\n\n usageCache = {\n providers: results.filter((p): p is ProviderUsage => p !== null),\n collectedAt: new Date().toISOString(),\n };\n usageCacheAt = Date.now();\n return usageCache;\n}\n","import type { IssueEntry, RuntimeMetrics, RuntimeState } from \"../types.ts\";\nimport { isoWeek, now, parseIssueState, toStringValue } from \"../concerns/helpers.ts\";\nimport { logger } from \"../concerns/logger.ts\";\nimport { persistState } from \"../persistence/store.ts\";\nimport { markIssueDirty } from \"../persistence/dirty-tracker.ts\";\nimport { addEvent, computeCapabilityCounts, computeMetrics } from \"../domains/issues.ts\";\nimport { ATTACHMENTS_ROOT, TERMINAL_STATES, TARGET_ROOT } from \"../concerns/constants.ts\";\nimport { findIssue, mutateIssueState, parseIssue } from \"../routes/helpers.ts\";\nimport { cleanWorkspace } from \"../domains/workspace.ts\";\nimport { detectAvailableProviders } from \"../agents/providers.ts\";\nimport { analyzeParallelizability } from \"../persistence/plugins/scheduler.ts\";\nimport { collectProvidersUsage } from \"../agents/providers-usage.ts\";\nimport { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { randomUUID } from \"node:crypto\";\nimport { execSync } from \"node:child_process\";\nimport { basename, extname, join } from \"node:path\";\n\n// Hexagonal architecture\nimport { getContainer } from \"../persistence/container.ts\";\nimport { createIssueCommand } from \"../commands/create-issue.command.ts\";\nimport { cancelIssueCommand } from \"../commands/cancel-issue.command.ts\";\nimport { approvePlanCommand } from \"../commands/approve-plan.command.ts\";\nimport { executeIssueCommand } from \"../commands/execute-issue.command.ts\";\nimport { replanIssueCommand } from \"../commands/replan-issue.command.ts\";\nimport { mergeWorkspaceCommand } from \"../commands/merge-workspace.command.ts\";\nimport { transitionIssueCommand } from \"../commands/transition-issue.command.ts\";\n\ntype GetStateResult = RuntimeState & {\n capabilities: Record<string, number>;\n metrics: RuntimeMetrics;\n _filter: \"all\" | \"recent\";\n _totalIssues: number;\n};\n\nfunction getStateQuery(\n state: RuntimeState,\n showAll = false,\n): GetStateResult {\n let issues: IssueEntry[] = state.issues;\n\n if (!showAll) {\n const thisWeek = isoWeek();\n const lastWeekDate = new Date();\n lastWeekDate.setUTCDate(lastWeekDate.getUTCDate() - 7);\n const lastWeek = isoWeek(lastWeekDate);\n const recentWeeks = new Set([thisWeek, lastWeek]);\n\n issues = state.issues.filter((i) => {\n if (!i.terminalWeek) return true;\n return recentWeeks.has(i.terminalWeek);\n });\n }\n\n return {\n ...state,\n issues,\n capabilities: computeCapabilityCounts(issues),\n metrics: computeMetrics(issues),\n _filter: showAll ? \"all\" : \"recent\",\n _totalIssues: state.issues.length,\n };\n}\n\nexport function registerStateRoutes(\n app: any,\n state: RuntimeState,\n): void {\n app.get(\"/api/state\", async (c: any) => {\n const showAll = c.req.query(\"all\") === \"1\";\n return c.json(getStateQuery(state, showAll));\n });\n\n app.get(\"/api/status\", async (c: any) =>\n c.json({\n status: \"ok\",\n updatedAt: state.updatedAt,\n config: state.config,\n trackerKind: state.trackerKind,\n }),\n );\n\n app.get(\"/api/providers\", async (c: any) => {\n const providers = detectAvailableProviders();\n return c.json({ providers });\n });\n\n app.get(\"/api/parallelism\", async (c: any) => {\n return c.json(analyzeParallelizability(state.issues));\n });\n\n app.get(\"/api/providers/usage\", async (c: any) => {\n try {\n const usage = await collectProvidersUsage();\n return c.json(usage);\n } catch (error) {\n logger.error({ err: error }, \"Failed to collect providers usage\");\n return c.json({ providers: [] }, 500);\n }\n });\n\n app.post(\"/api/issues/create\", async (c: any) => {\n try {\n const payload = await c.req.json();\n logger.info({ title: (payload.title ?? \"\").toString().slice(0, 80) }, \"[API] POST /api/issues/create\");\n const container = getContainer();\n const result = await createIssueCommand({ payload, state }, container);\n return c.json({ ok: true, issue: result.issue }, 201);\n } catch (error) {\n return c.json({ ok: false, error: error instanceof Error ? error.message : String(error) }, 400);\n }\n });\n\n app.post(\"/api/issues/:id/state\", async (c: any) => {\n const issueId = parseIssue(c);\n if (!issueId) {\n return c.json({ ok: false, error: \"Issue id is required.\" }, 400);\n }\n\n const issue = findIssue(state, issueId);\n if (!issue) {\n return c.json({ ok: false, error: \"Issue not found\" }, 404);\n }\n\n try {\n const payload = await c.req.json();\n logger.info({ issueId, identifier: issue.identifier, targetState: payload.state }, \"[API] POST /api/issues/:id/state\");\n const nextState = parseIssueState(payload.state);\n if (!nextState) {\n throw new Error(`Unsupported state: ${String(payload.state)}`);\n }\n const container = getContainer();\n await transitionIssueCommand({ issue, target: nextState, note: `Manual state update: ${nextState}` }, container);\n // nextRetryAt/lastError are now handled by FSM entry actions\n if (nextState === \"Cancelled\" && payload.reason) {\n issue.lastError = toStringValue(payload.reason);\n }\n await persistState(state);\n return c.json({ ok: true, issue });\n } catch (error) {\n return c.json({ ok: false, error: error instanceof Error ? error.message : String(error) }, 400);\n }\n });\n\n app.post(\"/api/issues/:id/retry\", async (c: any) => {\n logger.info({ issueId: parseIssue(c) }, \"[API] POST /api/issues/:id/retry\");\n return mutateIssueState(state, c, async (issue) => {\n const container = getContainer();\n if (TERMINAL_STATES.has(issue.state)) {\n // Terminal → REOPEN → Planning, then if plan exists → Planned → Queued\n await transitionIssueCommand(\n { issue, target: \"Planning\", note: \"Manual retry — reopened.\" },\n container,\n );\n if (issue.plan?.steps?.length) {\n await transitionIssueCommand(\n { issue, target: \"Planned\", note: \"Existing plan found.\" },\n container,\n );\n await transitionIssueCommand(\n { issue, target: \"Queued\", note: \"Auto-queued after plan approval.\" },\n container,\n );\n }\n } else if (issue.state === \"Blocked\") {\n // lastError/nextRetryAt cleared by FSM onEnterQueued\n await transitionIssueCommand(\n { issue, target: \"Queued\", note: \"Manual retry from Blocked.\" },\n container,\n );\n } else if (issue.state === \"Planned\") {\n await transitionIssueCommand(\n { issue, target: \"Queued\", note: \"Manual retry — queued for execution.\" },\n container,\n );\n } else {\n issue.lastError = undefined;\n issue.nextRetryAt = undefined;\n issue.updatedAt = now();\n }\n addEvent(state, issue.id, \"manual\", `Manual retry requested for ${issue.id}.`);\n });\n });\n\n app.post(\"/api/issues/:id/cancel\", async (c: any) => {\n logger.info({ issueId: parseIssue(c) }, \"[API] POST /api/issues/:id/cancel\");\n return mutateIssueState(state, c, async (issue) => {\n const container = getContainer();\n await cancelIssueCommand({ issue }, container);\n });\n });\n\n app.post(\"/api/issues/:id/approve\", async (c: any) => {\n logger.info({ issueId: parseIssue(c) }, \"[API] POST /api/issues/:id/approve\");\n return mutateIssueState(state, c, async (issue) => {\n const container = getContainer();\n await approvePlanCommand({ issue }, container);\n });\n });\n\n app.post(\"/api/issues/:id/execute\", async (c: any) => {\n logger.info({ issueId: parseIssue(c) }, \"[API] POST /api/issues/:id/execute\");\n return mutateIssueState(state, c, async (issue) => {\n const container = getContainer();\n await executeIssueCommand({ issue }, container);\n });\n });\n\n app.post(\"/api/issues/:id/replan\", async (c: any) => {\n logger.info({ issueId: parseIssue(c) }, \"[API] POST /api/issues/:id/replan\");\n return mutateIssueState(state, c, async (issue) => {\n const container = getContainer();\n await replanIssueCommand({ issue }, container);\n });\n });\n\n app.post(\"/api/issues/:id/merge\", async (c: any) => {\n logger.info({ issueId: parseIssue(c) }, \"[API] POST /api/issues/:id/merge\");\n try {\n const issueId = parseIssue(c);\n if (!issueId) return c.json({ ok: false, error: \"Issue id is required.\" }, 400);\n const issue = findIssue(state, issueId);\n if (!issue) return c.json({ ok: false, error: \"Issue not found.\" }, 404);\n const container = getContainer();\n const result = await mergeWorkspaceCommand({ issue, state }, container);\n return c.json({ ok: true, ...result });\n } catch (error) {\n const issueId = parseIssue(c);\n logger.error(`Failed to merge workspace for ${issueId || \"<unknown>\"}: ${String(error)}`);\n return c.json({ ok: false, error: String(error) }, 500);\n }\n });\n\n app.post(\"/api/issues/:id/try\", async (c: any) => {\n logger.info({ issueId: parseIssue(c) }, \"[API] POST /api/issues/:id/try\");\n return mutateIssueState(state, c, async (issue) => {\n if (![\"Reviewing\", \"Reviewed\"].includes(issue.state)) {\n throw new Error(`Cannot apply test for issue in state ${issue.state}.`);\n }\n if (!issue.branchName) {\n throw new Error(\"No branch name found for this issue.\");\n }\n try {\n execSync(\n `git merge --squash \"${issue.branchName}\"`,\n { encoding: \"utf8\", cwd: TARGET_ROOT, stdio: \"pipe\", timeout: 30_000 },\n );\n } catch (err: any) {\n const msg = err.stderr || err.stdout || String(err);\n throw new Error(`git merge --squash failed: ${msg}`);\n }\n addEvent(state, issue.id, \"manual\", `Test squash applied to workspace: git merge --squash ${issue.branchName}`);\n });\n });\n\n app.post(\"/api/issues/:id/revert-try\", async (c: any) => {\n logger.info({ issueId: parseIssue(c) }, \"[API] POST /api/issues/:id/revert-try\");\n return mutateIssueState(state, c, async (issue) => {\n try {\n execSync(\"git reset --hard HEAD\", { cwd: TARGET_ROOT, stdio: \"pipe\", timeout: 15_000 });\n execSync(\"git clean -fd\", { cwd: TARGET_ROOT, stdio: \"pipe\", timeout: 15_000 });\n } catch (err: any) {\n const msg = err.stderr || err.stdout || String(err);\n throw new Error(`git reset/clean failed: ${msg}`);\n }\n addEvent(state, issue.id, \"manual\", `Test reverted: git reset --hard HEAD && git clean -fd`);\n });\n });\n\n app.post(\"/api/issues/:id/rollback\", async (c: any) => {\n logger.info({ issueId: parseIssue(c) }, \"[API] POST /api/issues/:id/rollback\");\n return mutateIssueState(state, c, async (issue) => {\n if (![\"Reviewing\", \"Reviewed\", \"Done\"].includes(issue.state)) {\n throw new Error(`Cannot rollback issue in state ${issue.state}. Must be in Reviewing, Reviewed, or Done.`);\n }\n if (issue.workspacePath) {\n try {\n await cleanWorkspace(issue.id, issue, state);\n issue.workspacePath = undefined as any;\n issue.worktreePath = undefined as any;\n } catch (error) {\n logger.warn({ err: error }, `[API] Workspace cleanup failed during rollback for ${issue.id}`);\n }\n }\n const container = getContainer();\n await transitionIssueCommand(\n { issue, target: \"Queued\", note: \"Rolled back by user — worktree removed.\" },\n container,\n );\n addEvent(state, issue.id, \"manual\", `${issue.identifier} rolled back. Worktree and branch removed.`);\n });\n });\n\n app.post(\"/api/issues/:id/images\", async (c: any) => {\n try {\n const issueId = parseIssue(c);\n if (!issueId) return c.json({ ok: false, error: \"Issue id is required.\" }, 400);\n const issue = findIssue(state, issueId);\n if (!issue) return c.json({ ok: false, error: \"Issue not found.\" }, 404);\n\n const payload = await c.req.json() as { files?: Array<{ name: string; data: string; type: string }> };\n if (!Array.isArray(payload.files) || payload.files.length === 0) {\n return c.json({ ok: false, error: \"No files provided.\" }, 400);\n }\n\n const issueAttachDir = join(ATTACHMENTS_ROOT, issue.id);\n mkdirSync(issueAttachDir, { recursive: true });\n const newPaths: string[] = [];\n for (const file of payload.files) {\n if (typeof file.data !== \"string\" || !file.name) continue;\n const safeExt = extname(file.name).replace(/[^a-z0-9.]/gi, \"\").slice(0, 10) || \".bin\";\n const safeName = `${randomUUID()}${safeExt}`;\n const dest = join(issueAttachDir, safeName);\n writeFileSync(dest, Buffer.from(file.data, \"base64\"));\n newPaths.push(dest);\n }\n\n issue.images = [...(issue.images ?? []), ...newPaths];\n issue.updatedAt = now();\n markIssueDirty(issue.id);\n await persistState(state);\n return c.json({ ok: true, paths: newPaths, issue });\n } catch (error) {\n logger.error({ err: error }, \"[API] Issue image upload failed\");\n return c.json({ ok: false, error: error instanceof Error ? error.message : String(error) }, 500);\n }\n });\n\n app.get(\"/api/issues/:id/images/:filename\", async (c: any) => {\n try {\n const issueId = parseIssue(c);\n if (!issueId) return c.json({ ok: false, error: \"Issue id is required.\" }, 400);\n const filename = c.req.param?.(\"filename\") ?? c.req.params?.filename ?? \"\";\n if (!filename) return c.json({ ok: false, error: \"Filename is required.\" }, 400);\n const safeName = basename(filename);\n const filePath = join(ATTACHMENTS_ROOT, issueId, safeName);\n if (!existsSync(filePath)) return c.json({ ok: false, error: \"Image not found.\" }, 404);\n const ext = extname(safeName).toLowerCase();\n const mimeMap: Record<string, string> = {\n \".png\": \"image/png\", \".jpg\": \"image/jpeg\", \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\", \".webp\": \"image/webp\", \".svg\": \"image/svg+xml\",\n };\n const mime = mimeMap[ext] ?? \"application/octet-stream\";\n const { readFileSync } = await import(\"node:fs\");\n const data = readFileSync(filePath);\n return new Response(data, { headers: { \"Content-Type\": mime, \"Cache-Control\": \"private, max-age=86400\" } });\n } catch (error) {\n return c.json({ ok: false, error: error instanceof Error ? error.message : String(error) }, 500);\n }\n });\n\n app.get(\"/api/issues/:id/history\", async (c: any) => {\n const issueId = parseIssue(c);\n if (!issueId) return c.json({ ok: false, error: \"Issue id is required.\" }, 400);\n const issue = findIssue(state, issueId);\n if (!issue) return c.json({ ok: false, error: \"Issue not found.\" }, 404);\n try {\n const { getIssueTransitionHistory } = await import(\"../persistence/plugins/issue-state-machine.ts\");\n const limit = parseInt(c.req.query(\"limit\") ?? \"50\", 10);\n const offset = parseInt(c.req.query(\"offset\") ?? \"0\", 10);\n const transitions = await getIssueTransitionHistory(issue.id, { limit, offset });\n return c.json({ ok: true, issueId: issue.id, transitions, localHistory: issue.history });\n } catch (error) {\n return c.json({ ok: false, error: error instanceof Error ? error.message : String(error) }, 500);\n }\n });\n\n app.get(\"/api/state-machine/transitions\", async (c: any) => {\n try {\n const { getStateMachineTransitions } = await import(\"../persistence/plugins/issue-state-machine.ts\");\n return c.json({ ok: true, transitions: getStateMachineTransitions() });\n } catch (error) {\n return c.json({ ok: false, error: error instanceof Error ? error.message : String(error) }, 500);\n }\n });\n\n app.get(\"/api/state-machine/visualize\", async (c: any) => {\n try {\n const { visualizeStateMachine } = await import(\"../persistence/plugins/issue-state-machine.ts\");\n const dot = visualizeStateMachine();\n if (!dot) return c.json({ ok: false, error: \"Visualization not available.\" }, 404);\n return c.json({ ok: true, dot });\n } catch (error) {\n return c.json({ ok: false, error: error instanceof Error ? error.message : String(error) }, 500);\n }\n });\n\n app.post(\"/api/refresh\", async (c: any) => {\n addEvent(state, undefined, \"manual\", \"Manual refresh requested via API.\");\n await persistState(state);\n return c.json({ queued: true, requestedAt: now() }, 202);\n });\n}\n","import type { IssueEntry } from \"../types.ts\";\nimport type { IIssueRepository, IEventStore } from \"../ports/index.ts\";\nimport { transitionIssueCommand } from \"./transition-issue.command.ts\";\n\nexport type ApprovePlanInput = {\n issue: IssueEntry;\n};\n\nexport async function approvePlanCommand(\n input: ApprovePlanInput,\n deps: {\n issueRepository: IIssueRepository;\n eventStore: IEventStore;\n },\n): Promise<void> {\n const { issue } = input;\n\n if (issue.state !== \"Planning\") {\n throw new Error(`Cannot approve issue in state ${issue.state}. Must be in Planning.`);\n }\n\n await transitionIssueCommand(\n { issue, target: \"Planned\", note: `Plan approved for ${issue.identifier}. Ready for execution.` },\n deps,\n );\n // Event emitted by FSM onEnterPlanned\n\n // Explicitly queue for execution (no auto-queue hack in FSM)\n await transitionIssueCommand(\n { issue, target: \"Queued\", note: `${issue.identifier} queued for execution after plan approval.` },\n deps,\n );\n}\n","import type { IssueEntry } from \"../types.ts\";\nimport type { IIssueRepository, IEventStore } from \"../ports/index.ts\";\nimport { transitionIssueCommand } from \"./transition-issue.command.ts\";\n\nexport type ExecuteIssueInput = {\n issue: IssueEntry;\n};\n\nexport async function executeIssueCommand(\n input: ExecuteIssueInput,\n deps: {\n issueRepository: IIssueRepository;\n eventStore: IEventStore;\n },\n): Promise<void> {\n const { issue } = input;\n\n if (issue.state !== \"Planned\") {\n throw new Error(`Cannot execute issue in state ${issue.state}. Must be in Planned.`);\n }\n\n await transitionIssueCommand(\n { issue, target: \"Queued\", note: `Execution requested for ${issue.identifier}.` },\n deps,\n );\n\n deps.eventStore.addEvent(issue.id, \"state\", `Execute requested — ${issue.identifier} moved to Queued.`);\n}\n","import type { IssueEntry } from \"../types.ts\";\nimport type { IIssueRepository, IEventStore } from \"../ports/index.ts\";\nimport { markIssuePlanDirty } from \"../persistence/dirty-tracker.ts\";\nimport { TERMINAL_STATES } from \"../concerns/constants.ts\";\nimport { transitionIssueCommand } from \"./transition-issue.command.ts\";\n\nexport type ReplanIssueInput = {\n issue: IssueEntry;\n};\n\nexport async function replanIssueCommand(\n input: ReplanIssueInput,\n deps: {\n issueRepository: IIssueRepository;\n eventStore: IEventStore;\n },\n): Promise<void> {\n const { issue } = input;\n\n if (issue.planningStatus === \"planning\") {\n throw new Error(\"Cannot replan while planning is in progress.\");\n }\n if (TERMINAL_STATES.has(issue.state)) {\n throw new Error(`Cannot replan issue in terminal state ${issue.state}.`);\n }\n if (issue.state === \"Running\" || issue.state === \"Reviewing\" || issue.state === \"Queued\") {\n throw new Error(`Cannot replan issue in ${issue.state} state — wait for it to finish or cancel it first.`);\n }\n\n // Archive current plan\n if (issue.plan) {\n if (!Array.isArray(issue.planHistory)) issue.planHistory = [];\n issue.planHistory.push(issue.plan);\n issue.plan = undefined;\n markIssuePlanDirty(issue.id);\n }\n\n issue.planVersion = (issue.planVersion ?? 0) + 1;\n issue.executeAttempt = 0;\n issue.reviewAttempt = 0;\n\n // Transition to Planning — FSM onEnterPlanning action handles enqueue\n await transitionIssueCommand(\n { issue, target: \"Planning\", note: \"Replan requested.\" },\n deps,\n );\n\n issue.planningStatus = \"idle\";\n issue.planningError = undefined;\n issue.planningStartedAt = undefined;\n\n deps.eventStore.addEvent(issue.id, \"manual\", `Replan requested for ${issue.identifier} — now at plan v${issue.planVersion}.`);\n}\n","import { existsSync } from \"node:fs\";\nimport { execSync } from \"node:child_process\";\nimport type { IssueEntry, RuntimeState } from \"../types.ts\";\nimport type { IIssueRepository, IEventStore, IPersistencePort } from \"../ports/index.ts\";\nimport { transitionIssueCommand } from \"./transition-issue.command.ts\";\nimport { mergeWorkspace } from \"../agents/agent.ts\";\nimport { cleanWorkspace } from \"../domains/workspace.ts\";\nimport { TARGET_ROOT } from \"../concerns/constants.ts\";\nimport { now } from \"../concerns/helpers.ts\";\nimport { logger } from \"../concerns/logger.ts\";\nimport { parseDiffStats, syncIssueDiffStatsToStore } from \"../domains/workspace.ts\";\n\nexport type MergeWorkspaceInput = {\n issue: IssueEntry;\n state: RuntimeState;\n};\n\nexport type MergeWorkspaceResult = {\n copied: string[];\n deleted: string[];\n skipped: string[];\n conflicts: string[];\n};\n\nexport async function mergeWorkspaceCommand(\n input: MergeWorkspaceInput,\n deps: {\n issueRepository: IIssueRepository;\n eventStore: IEventStore;\n persistencePort: IPersistencePort;\n },\n): Promise<MergeWorkspaceResult> {\n const { issue, state } = input;\n\n if (![\"Done\", \"Reviewing\", \"Reviewed\"].includes(issue.state)) {\n throw new Error(`Issue ${issue.identifier} is in state ${issue.state}. Merge is only allowed in Reviewing, Reviewed, or Done state.`);\n }\n\n // Auto-transition to Done if still in review\n if (issue.state === \"Reviewing\" || issue.state === \"Reviewed\") {\n await transitionIssueCommand(\n { issue, target: \"Done\", note: \"Approved and merged by user.\" },\n deps,\n );\n deps.eventStore.addEvent(issue.id, \"state\", `${issue.identifier} approved — moved to Done before merge.`);\n }\n\n const wp = issue.worktreePath ?? issue.workspacePath;\n if (!wp || !existsSync(wp)) {\n throw new Error(\"No workspace found for this issue.\");\n }\n\n // Compute line stats from git diff before merge (use --stat for file-level detail)\n if (issue.branchName && issue.baseBranch) {\n try {\n const stat = execSync(\n `git diff --stat \"${issue.baseBranch}\"...\"${issue.branchName}\"`,\n { encoding: \"utf8\", cwd: TARGET_ROOT, stdio: \"pipe\", maxBuffer: 512_000, timeout: 10_000 },\n );\n parseDiffStats(issue, stat);\n await syncIssueDiffStatsToStore(issue);\n } catch { /* non-critical */ }\n }\n\n // Clear residual squash from index\n try {\n const indexStatus = execSync(\"git diff --cached --name-only\", { cwd: TARGET_ROOT, encoding: \"utf8\", stdio: \"pipe\" }).trim();\n const wtStatus = execSync(\"git diff --name-only\", { cwd: TARGET_ROOT, encoding: \"utf8\", stdio: \"pipe\" }).trim();\n if (indexStatus && !wtStatus) {\n execSync(\"git reset --hard HEAD\", { cwd: TARGET_ROOT, stdio: \"pipe\" });\n logger.info({ issueId: issue.id }, \"[Command] Cleared residual squash from index before merge\");\n }\n } catch { /* non-critical */ }\n\n const result = mergeWorkspace(issue);\n issue.mergeResult = {\n copied: result.copied.length,\n deleted: result.deleted.length,\n skipped: result.skipped.length,\n conflicts: result.conflicts.length,\n };\n\n if (result.conflicts.length === 0) {\n issue.mergedAt = now();\n if (!issue.mergedReason) issue.mergedReason = \"Merged by user via PreviewModal.\";\n // Cleanup worktree + branch after successful merge\n if (issue.workspacePath) {\n try {\n await cleanWorkspace(issue.id, issue, state);\n issue.workspacePath = undefined as any;\n issue.worktreePath = undefined as any;\n } catch { /* non-critical */ }\n }\n }\n\n const conflictMsg = result.conflicts.length > 0\n ? ` ${result.conflicts.length} conflict(s): ${result.conflicts.join(\", \")}.`\n : \"\";\n deps.eventStore.addEvent(issue.id, \"merge\", `Workspace merged: ${result.copied.length} file(s) copied, ${result.deleted.length} deleted.${conflictMsg}`);\n\n if (result.conflicts.length > 0) {\n deps.eventStore.addEvent(issue.id, \"error\", `Merge conflicts: ${result.conflicts.join(\", \")}`);\n }\n\n await deps.persistencePort.persistState(state);\n\n return result;\n}\n","import type { IssuePlan } from \"../../types.ts\";\nimport { now } from \"../../concerns/helpers.ts\";\nimport { replacePersistedSetting, getSettingStateResource } from \"../../persistence/store.ts\";\nimport { logger } from \"../../concerns/logger.ts\";\n\n// ── Planning session persistence ─────────────────────────────────────────────\n\nexport type PlanningSessionStatus = \"input\" | \"planning\" | \"done\" | \"error\" | \"interrupted\";\n\nexport type PlanningSessionUsage = {\n inputTokens: number;\n outputTokens: number;\n totalTokens: number;\n model: string;\n promptChars: number;\n outputChars: number;\n durationMs: number;\n};\n\nexport type PlanningSession = {\n title: string;\n description: string;\n status: PlanningSessionStatus;\n plan: IssuePlan | null;\n error: string | null;\n pid: number | null;\n provider: string | null;\n startedAt: string | null;\n completedAt: string | null;\n updatedAt: string;\n /** Live progress: output bytes received so far (updated during planning) */\n outputBytes: number;\n /** Token usage extracted after planning completes */\n usage: PlanningSessionUsage | null;\n};\n\nconst PLANNING_SETTING_ID = \"planning:active\";\n\nfunction emptySession(): PlanningSession {\n return {\n title: \"\", description: \"\", status: \"input\",\n plan: null, error: null, pid: null, provider: null,\n startedAt: null, completedAt: null, updatedAt: now(),\n outputBytes: 0, usage: null,\n };\n}\n\nexport async function persistSession(session: PlanningSession): Promise<void> {\n session.updatedAt = now();\n try {\n await replacePersistedSetting({\n id: PLANNING_SETTING_ID,\n scope: \"runtime\",\n value: session,\n source: \"system\",\n updatedAt: session.updatedAt,\n });\n } catch (error) {\n logger.warn(`Failed to persist planning session: ${String(error)}`);\n }\n}\n\nexport async function loadPlanningSession(): Promise<PlanningSession | null> {\n const resource = getSettingStateResource();\n if (!resource) return null;\n try {\n const record = await resource.get(PLANNING_SETTING_ID);\n if (record?.value && typeof record.value === \"object\") {\n return record.value as PlanningSession;\n }\n } catch {\n // not found\n }\n return null;\n}\n\nexport async function clearPlanningSession(): Promise<void> {\n await persistSession(emptySession());\n}\n\n/** Check on boot if a planning process is still alive. */\nexport async function recoverPlanningSession(): Promise<void> {\n const session = await loadPlanningSession();\n if (!session || session.status !== \"planning\") return;\n\n if (session.pid) {\n let alive = false;\n try { process.kill(session.pid, 0); alive = true; } catch {}\n\n if (alive) {\n logger.info(`Planning process still alive (PID ${session.pid}), keeping status.`);\n return;\n }\n }\n\n // Process died — mark as interrupted\n session.status = \"interrupted\";\n session.error = \"Planning process was interrupted by server restart.\";\n session.pid = null;\n await persistSession(session);\n logger.info(\"Planning session marked as interrupted (process not found).\");\n}\n","import { writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { mkdtempSync, rmSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport type { IssuePlan, RuntimeConfig, IssueEntry, AgentTokenUsage } from \"../../types.ts\";\nimport { now } from \"../../concerns/helpers.ts\";\nimport { logger } from \"../../concerns/logger.ts\";\nimport { record as recordTokens } from \"../../domains/tokens.ts\";\nimport { persistSession, type PlanningSession, type PlanningSessionUsage } from \"./planning-session.ts\";\nimport { parsePlanOutput, extractPlanTokenUsage } from \"./planning-parser.ts\";\nimport {\n buildPlanPrompt,\n getPlanCommand,\n savePlanDebugFiles,\n resolvePlanStageConfig,\n runPlanningProcess,\n} from \"./planning-prompts.ts\";\n\n// ── Public types ──────────────────────────────────────────────────────────────\n\nexport type GeneratePlanResult = {\n plan: IssuePlan;\n usage: PlanningSessionUsage;\n prompt: string;\n};\n\n// ── savePlanningInput ─────────────────────────────────────────────────────────\n\nexport async function savePlanningInput(title: string, description: string): Promise<PlanningSession> {\n const session: PlanningSession = {\n title, description, status: \"input\",\n plan: null, error: null, pid: null, provider: null,\n startedAt: null, completedAt: null, updatedAt: now(),\n outputBytes: 0, usage: null,\n };\n await persistSession(session);\n return session;\n}\n\n// ── Main: generate plan ───────────────────────────────────────────────────────\n\nexport async function generatePlan(\n title: string,\n description: string,\n config: RuntimeConfig,\n _workflowDefinition: null,\n options?: { fast?: boolean; persistSession?: boolean; images?: string[] },\n): Promise<GeneratePlanResult> {\n const fast = options?.fast ?? false;\n const images = options?.images;\n const shouldPersistSession = options?.persistSession !== false; // default true\n logger.info({ title: title.slice(0, 80), fast }, \"[Planner] Starting plan generation\");\n\n const { provider: preferred, model: planStageModel, effort: planStageEffort } = await resolvePlanStageConfig(config);\n\n // Fast mode: same model, effort low (embedded in prompt since CLIs don't support effort flags)\n const effectiveEffort = fast ? \"low\" : (planStageEffort || \"medium\");\n void effectiveEffort; // used in prompt logic\n\n // Persist: planning started\n const planStartMs = Date.now();\n const session: PlanningSession = {\n title, description, status: \"planning\",\n plan: null, error: null, pid: null, provider: preferred,\n startedAt: now(), completedAt: null, updatedAt: now(),\n outputBytes: 0, usage: null,\n };\n if (shouldPersistSession) await persistSession(session);\n\n const prompt = await buildPlanPrompt(title, description, fast, images);\n\n let plan: IssuePlan | null = null;\n let planUsage: PlanningSessionUsage;\n\n {\n const command = getPlanCommand(preferred, planStageModel, images);\n if (!command) throw new Error(`No command configured for provider ${preferred}.`);\n\n logger.debug({ provider: preferred, model: planStageModel, command: command.slice(0, 120) }, \"[Planner] Provider selected for plan generation\");\n\n const tempDir = mkdtempSync(join(tmpdir(), \"fifony-plan-\"));\n const promptFile = join(tempDir, \"fifony-plan-prompt.md\");\n writeFileSync(promptFile, `${prompt}\\n`, \"utf8\");\n\n // Track output bytes live — persist progress periodically so the UI can show it\n let lastProgressPersist = 0;\n const PROGRESS_INTERVAL_MS = 2000;\n\n const output = await runPlanningProcess({\n command,\n tempDir,\n promptFile,\n provider: preferred,\n extraEnv: images?.length ? { FIFONY_IMAGE_PATHS: images.join(\",\") } : {},\n onPid: (pid) => {\n session.pid = pid;\n if (shouldPersistSession) persistSession(session).catch(() => {});\n },\n onChunk: (bytes) => {\n session.outputBytes = bytes;\n if (shouldPersistSession) {\n const elapsed = Date.now() - planStartMs;\n if (elapsed - lastProgressPersist > PROGRESS_INTERVAL_MS) {\n lastProgressPersist = elapsed;\n persistSession(session).catch(() => {});\n }\n }\n },\n }).finally(() => {\n rmSync(tempDir, { recursive: true, force: true });\n });\n\n logger.info({ rawOutput: output.slice(0, 2000) }, `Plan raw output from ${preferred}`);\n savePlanDebugFiles(\"cli\", prompt, output);\n\n logger.debug({ outputLength: output.length }, \"[Planner] Plan command completed, parsing output\");\n plan = parsePlanOutput(output);\n\n const durationMs = Date.now() - planStartMs;\n const tokenInfo = extractPlanTokenUsage(output);\n planUsage = {\n inputTokens: tokenInfo?.inputTokens ?? 0,\n outputTokens: tokenInfo?.outputTokens ?? 0,\n totalTokens: tokenInfo?.totalTokens ?? 0,\n model: tokenInfo?.model || planStageModel || preferred,\n promptChars: prompt.length,\n outputChars: output.length,\n durationMs,\n };\n }\n\n if (!plan) {\n const durationMs = Date.now() - planStartMs;\n session.status = \"error\";\n session.error = `Could not parse plan from AI output. Duration: ${durationMs}ms`;\n session.pid = null;\n if (shouldPersistSession) await persistSession(session);\n logger.error({ durationMs }, \"[Planner] Could not parse plan from AI output\");\n throw new Error(session.error);\n }\n\n plan.provider = planStageModel ? `${preferred}/${planStageModel}` : preferred;\n\n if (planUsage.totalTokens > 0) {\n const tokenUsage: AgentTokenUsage = {\n inputTokens: planUsage.inputTokens,\n outputTokens: planUsage.outputTokens,\n totalTokens: planUsage.totalTokens,\n model: planUsage.model,\n };\n recordTokens({ id: \"planning\", identifier: \"PLAN\", title } as IssueEntry, tokenUsage, \"planner\");\n }\n\n session.status = \"done\";\n session.plan = plan;\n session.pid = null;\n session.completedAt = now();\n session.error = null;\n session.usage = planUsage;\n if (shouldPersistSession) await persistSession(session);\n\n const tokenSummary = planUsage.totalTokens > 0\n ? `, ${planUsage.totalTokens.toLocaleString()} tokens (in: ${planUsage.inputTokens.toLocaleString()}, out: ${planUsage.outputTokens.toLocaleString()})`\n : `, ${planUsage.outputChars.toLocaleString()} output chars`;\n logger.info(`Plan generated for \"${title}\" via ${planUsage.model}: ${plan.steps.length} steps, complexity: ${plan.estimatedComplexity}${tokenSummary}, ${planUsage.durationMs}ms`);\n return { plan, usage: planUsage, prompt };\n}\n","import type { IssuePlan } from \"../../types.ts\";\nimport { now, toStringArray, extractJsonObjects, repairTruncatedJson } from \"../../concerns/helpers.ts\";\nimport { logger } from \"../../concerns/logger.ts\";\n\n// ── Parser ────────────────────────────────────────────────────────────────────\n\n// Detect plans that are just the prompt template echoed back verbatim\nconst PLACEHOLDER_PATTERNS = [\n /^one-line summary/i,\n /^what to do/i,\n /^<YOUR /,\n /path\\/to\\/file\\.ts/,\n /path\\/to\\/relevant/,\n /additional context if needed/i,\n /acceptance criterion as a single string/i,\n];\n\nfunction isPlanPlaceholder(parsed: any): boolean {\n const summary = String(parsed.summary || parsed.title || \"\");\n if (PLACEHOLDER_PATTERNS.some((p) => p.test(summary))) return true;\n if (Array.isArray(parsed.steps) && parsed.steps.length > 0) {\n const action = String(parsed.steps[0].action || parsed.steps[0].what || \"\");\n if (PLACEHOLDER_PATTERNS.some((p) => p.test(action))) return true;\n }\n return false;\n}\n\nexport function tryBuildPlan(parsed: any): IssuePlan | null {\n if (!parsed || typeof parsed !== \"object\") return null;\n if (!Array.isArray(parsed.steps) || parsed.steps.length === 0) return null;\n if (isPlanPlaceholder(parsed)) {\n logger.warn(\"[Planner] Rejected plan — model returned template placeholders instead of real content\");\n return null;\n }\n // Accept various summary field names that different models use\n const summary = parsed.summary || parsed.issueTitle || parsed.title || parsed.issue_title || parsed.description || \"\";\n\n const complexities = [\"trivial\", \"low\", \"medium\", \"high\"];\n\n return {\n summary: String(summary),\n estimatedComplexity: complexities.includes(parsed.estimatedComplexity) ? parsed.estimatedComplexity\n : complexities.includes(parsed.complexity) ? parsed.complexity : \"medium\",\n\n steps: parsed.steps.map((s: any, i: number) => ({\n step: typeof s.step === \"number\" ? s.step : typeof s.id === \"number\" ? s.id : i + 1,\n action: String(s.action || s.what || s.description || s.title || s.task_name || (typeof s.step === \"string\" ? s.step : \"\") || \"\"),\n files: toStringArray(s.files),\n details: s.details ? String(s.details) : undefined,\n ownerType: s.ownerType || s.owner_type || undefined,\n doneWhen: Array.isArray(s.doneWhen) ? s.doneWhen.join(\"\\n\") : (s.doneWhen || s.done_when || undefined),\n })),\n\n assumptions: toStringArray(parsed.assumptions),\n constraints: toStringArray(parsed.constraints),\n unknowns: Array.isArray(parsed.unknowns) ? parsed.unknowns.map((u: any) => ({\n question: String(u.question || \"\"),\n whyItMatters: String(u.whyItMatters || u.why_it_matters || \"\"),\n howToResolve: String(u.howToResolve || u.how_to_resolve || \"\"),\n })) : undefined,\n successCriteria: toStringArray(parsed.successCriteria || parsed.success_criteria),\n risks: Array.isArray(parsed.risks) ? parsed.risks.map((r: any) => ({\n risk: String(r.risk || \"\"),\n impact: String(r.impact || \"\"),\n mitigation: String(r.mitigation || \"\"),\n })) : undefined,\n validation: toStringArray(parsed.validation),\n deliverables: toStringArray(parsed.deliverables),\n\n executionStrategy: parsed.executionStrategy || parsed.execution_strategy || undefined,\n toolingDecision: parsed.toolingDecision || parsed.tooling_decision || undefined,\n\n suggestedPaths: toStringArray(parsed.suggestedPaths || parsed.suggested_paths || parsed.suggestedFilePaths || parsed.filePaths || parsed.file_paths || parsed.paths),\n suggestedLabels: toStringArray(parsed.suggestedLabels || parsed.suggested_labels || parsed.labels),\n suggestedEffort: parsed.suggestedEffort || parsed.suggested_effort || parsed.effortSuggestion || parsed.effort_suggestion || parsed.effort || { default: \"medium\" },\n\n provider: \"\",\n createdAt: now(),\n };\n}\n\nexport function parsePlanOutput(raw: string): IssuePlan | null {\n const text = raw.trim();\n if (!text) return null;\n\n const candidates: string[] = [];\n\n // 1. Try to unwrap --output-format json envelope\n try {\n const outer = JSON.parse(text);\n\n // --json-schema puts structured output in .structured_output (not .result)\n if (outer?.structured_output && typeof outer.structured_output === \"object\") {\n const plan = tryBuildPlan(outer.structured_output);\n if (plan) return plan;\n // If it didn't validate, still try as a candidate string\n candidates.push(JSON.stringify(outer.structured_output));\n }\n\n if (outer?.result && typeof outer.result === \"string\") {\n const result = outer.result;\n candidates.push(result);\n // Also extract any JSON objects embedded in the result string\n candidates.push(...extractJsonObjects(result));\n // Try code blocks inside .result\n const resultCodeBlocks = result.matchAll(/```(?:json)?\\s*([\\s\\S]*?)\\s*```/gi);\n for (const match of resultCodeBlocks) candidates.push(match[1]);\n }\n // If the outer object itself looks like a plan (no .type envelope)\n if (outer?.summary) candidates.push(text);\n } catch {}\n\n // 2. Try code blocks in full output\n const codeBlocks = text.matchAll(/```(?:json)?\\s*([\\s\\S]*?)\\s*```/gi);\n for (const match of codeBlocks) candidates.push(match[1]);\n\n // 3. Extract top-level JSON objects from full text\n candidates.push(...extractJsonObjects(text));\n\n for (const candidate of candidates) {\n try {\n const parsed = JSON.parse(candidate.trim());\n // Direct plan\n const plan = tryBuildPlan(parsed);\n if (plan) return plan;\n // Envelope with structured_output\n if (parsed?.structured_output && typeof parsed.structured_output === \"object\") {\n const innerPlan = tryBuildPlan(parsed.structured_output);\n if (innerPlan) return innerPlan;\n }\n } catch {}\n }\n\n // Last resort: try to repair truncated JSON output\n const repaired = repairTruncatedJson(text);\n if (repaired) {\n try {\n const parsed = JSON.parse(repaired);\n const plan = tryBuildPlan(parsed);\n if (plan) {\n logger.warn(\"[Planner] Plan parsed from repaired truncated JSON output\");\n return plan;\n }\n // Check for envelope\n if (parsed?.structured_output && typeof parsed.structured_output === \"object\") {\n const innerPlan = tryBuildPlan(parsed.structured_output);\n if (innerPlan) {\n logger.warn(\"[Planner] Plan parsed from repaired truncated JSON envelope\");\n return innerPlan;\n }\n }\n } catch {\n logger.debug(\"[Planner] JSON repair attempted but result still not parseable\");\n }\n }\n\n return null;\n}\n\n/** Extract token usage from CLI output (Claude JSON or Codex text) */\nexport function extractPlanTokenUsage(raw: string): { inputTokens: number; outputTokens: number; totalTokens: number; model: string } | null {\n // 1. Claude --output-format json: parse the outer JSON envelope\n try {\n const parsed = JSON.parse(raw.trim());\n\n // Try modelUsage field first (richer data, per-model breakdown)\n if (parsed?.modelUsage && typeof parsed.modelUsage === \"object\") {\n let totalInput = 0, totalOutput = 0, primaryModel = \"\";\n let maxTokens = 0;\n for (const [model, data] of Object.entries<any>(parsed.modelUsage)) {\n const inp = Number(data?.inputTokens || 0) + Number(data?.cacheReadInputTokens || 0) + Number(data?.cacheCreationInputTokens || 0);\n const out = Number(data?.outputTokens || 0);\n totalInput += inp;\n totalOutput += out;\n if (inp + out > maxTokens) {\n maxTokens = inp + out;\n primaryModel = model;\n }\n }\n if (totalInput > 0 || totalOutput > 0) {\n return { inputTokens: totalInput, outputTokens: totalOutput, totalTokens: totalInput + totalOutput, model: primaryModel };\n }\n }\n\n // Fallback: usage field\n const usage = parsed?.usage;\n if (usage && typeof usage === \"object\") {\n const input = Number(usage.input_tokens) || 0;\n const output = Number(usage.output_tokens) || 0;\n if (input > 0 || output > 0) {\n return {\n inputTokens: input,\n outputTokens: output,\n totalTokens: input + output,\n model: typeof parsed.model === \"string\" ? parsed.model : \"\",\n };\n }\n }\n\n // Fallback: total_cost_usd present means we can at least log the cost\n } catch { /* not JSON — try Codex format */ }\n\n // 2. Codex: \"tokens used\\n1,681\\n\"\n const codexMatch = raw.match(/tokens?\\s+used\\s*\\n\\s*([\\d,]+)/i);\n if (codexMatch) {\n const total = parseInt(codexMatch[1].replace(/,/g, \"\"), 10);\n const modelMatch = raw.match(/^model:\\s*(.+)$/im);\n if (total > 0) {\n return { inputTokens: 0, outputTokens: 0, totalTokens: total, model: modelMatch?.[1]?.trim() || \"\" };\n }\n }\n\n return null;\n}\n","import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { spawn } from \"node:child_process\";\nimport { join } from \"node:path\";\nimport { appendFileTail } from \"../../concerns/helpers.ts\";\nimport type { IssuePlan, RuntimeConfig, PipelineStageConfig } from \"../../types.ts\";\nimport { PLAN_JSON_SCHEMA } from \"./planning-schema.ts\";\nimport { ADAPTERS } from \"../adapters/registry.ts\";\nimport { CLAUDE_RESULT_SCHEMA } from \"../adapters/commands.ts\";\nimport { renderPrompt } from \"../prompting.ts\";\nimport { STATE_ROOT } from \"../../concerns/constants.ts\";\nimport { detectAvailableProviders } from \"../providers.ts\";\nimport { getWorkflowConfig, loadRuntimeSettings } from \"../../persistence/settings.ts\";\n\n// ── Prompt builders ───────────────────────────────────────────────────────────\n\nexport async function buildPlanPrompt(title: string, description: string, fast = false, images?: string[]): Promise<string> {\n return renderPrompt(\"issue-planner\", {\n title,\n description: description || \"(none provided)\",\n fast,\n images: images?.length ? images : undefined,\n });\n}\n\nexport async function buildRefinePrompt(\n title: string,\n description: string,\n currentPlan: IssuePlan,\n feedback: string,\n): Promise<string> {\n return renderPrompt(\"issue-planner-refine\", {\n title,\n description: description || \"(none provided)\",\n currentPlan: JSON.stringify(currentPlan, null, 2),\n feedback,\n });\n}\n\n// ── Provider command ──────────────────────────────────────────────────────────\n\nexport function getPlanCommand(provider: string, model?: string, imagePaths?: string[]): string {\n const adapter = ADAPTERS[provider];\n if (!adapter) return \"\";\n const jsonSchema = provider === \"claude\" ? PLAN_JSON_SCHEMA : undefined;\n return adapter.buildCommand({ model, imagePaths, jsonSchema, noToolAccess: provider === \"claude\" });\n}\n\n// ── Shared: debug file saving ─────────────────────────────────────────────────\n\nexport function savePlanDebugFiles(slug: string, prompt: string, output: string): void {\n try {\n const debugDir = join(STATE_ROOT, \"debug\");\n mkdirSync(debugDir, { recursive: true });\n const ts = new Date().toISOString().replace(/[:.]/g, \"-\").slice(0, 19);\n writeFileSync(join(debugDir, `plan-${slug}-${ts}-prompt.md`), prompt, \"utf8\");\n if (output) writeFileSync(join(debugDir, `plan-${slug}-${ts}-output.txt`), output, \"utf8\");\n } catch {\n // non-critical\n }\n}\n\n// ── Shared: provider resolution ───────────────────────────────────────────────\n\nexport type PlanStageConfig = {\n provider: string;\n model: string | undefined;\n effort: string | undefined;\n};\n\nexport async function resolvePlanStageConfig(config: RuntimeConfig): Promise<PlanStageConfig> {\n const providers = detectAvailableProviders();\n const available = providers.filter((p) => p.available).map((p) => p.name);\n\n let configuredProvider: string | undefined;\n let configuredModel: string | undefined;\n let configuredEffort: string | undefined;\n\n try {\n const settings = await loadRuntimeSettings();\n const workflowConfig = getWorkflowConfig(settings);\n if (workflowConfig?.plan) {\n configuredProvider = workflowConfig.plan.provider;\n configuredModel = workflowConfig.plan.model;\n configuredEffort = workflowConfig.plan.effort;\n }\n } catch {\n // fall through to defaults\n }\n\n const provider =\n (configuredProvider && available.includes(configuredProvider)) ? configuredProvider :\n (config.agentProvider && available.includes(config.agentProvider)) ? config.agentProvider :\n available[0];\n\n if (!provider) throw new Error(\"No AI provider available for planning.\");\n\n // If the configured provider wasn't available and we fell back, discard its model\n // to avoid passing a model ID that belongs to a different CLI.\n const model = provider === configuredProvider ? configuredModel : undefined;\n\n return { provider, model, effort: configuredEffort };\n}\n\n// ── Shared: subprocess runner ─────────────────────────────────────────────────\n\nconst PLAN_TIMEOUT_MS = 1_800_000; // 30 minutes\nconst PLAN_STALE_OUTPUT_MS = 300_000; // 5 minutes without output growth\n\nexport async function runPlanningProcess(options: {\n command: string;\n tempDir: string;\n promptFile: string;\n provider: string;\n extraEnv?: Record<string, string>;\n onPid?: (pid: number) => void;\n onChunk?: (bytes: number) => void;\n}): Promise<string> {\n const { command, tempDir, promptFile, provider, extraEnv = {}, onPid, onChunk } = options;\n\n return new Promise<string>((resolve, reject) => {\n let stdout = \"\";\n const child = spawn(command, {\n shell: true,\n cwd: tempDir,\n detached: true,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n env: { ...process.env, FIFONY_PROMPT_FILE: promptFile, FIFONY_AGENT_PROVIDER: provider, ...extraEnv },\n });\n child.unref();\n child.stdin?.end();\n\n if (child.pid) onPid?.(child.pid);\n\n let outputBytes = 0;\n const onData = (chunk: Buffer | string) => {\n const text = String(chunk);\n stdout = appendFileTail(stdout, text, 32_000);\n outputBytes += text.length;\n onChunk?.(outputBytes);\n };\n child.stdout?.on(\"data\", onData);\n child.stderr?.on(\"data\", onData);\n\n const timer = setTimeout(() => {\n if (child.pid) { try { process.kill(-child.pid, \"SIGTERM\"); } catch {} }\n else { child.kill(\"SIGTERM\"); }\n reject(new Error(\"Plan generation timed out after 30 minutes.\"));\n }, PLAN_TIMEOUT_MS);\n\n let lastWatchdogBytes = 0;\n let lastGrowthAt = Date.now();\n const watchdog = setInterval(() => {\n if (child.pid) {\n try { process.kill(child.pid, 0); } catch {\n clearInterval(watchdog);\n clearTimeout(timer);\n reject(new Error(`Planning process died unexpectedly (PID ${child.pid}).`));\n return;\n }\n }\n if (outputBytes > lastWatchdogBytes) {\n lastWatchdogBytes = outputBytes;\n lastGrowthAt = Date.now();\n } else if (Date.now() - lastGrowthAt > PLAN_STALE_OUTPUT_MS) {\n clearInterval(watchdog);\n clearTimeout(timer);\n if (child.pid) { try { process.kill(-child.pid, \"SIGTERM\"); } catch {} }\n else { child.kill(\"SIGTERM\"); }\n reject(new Error(`Planning process stuck — no output for ${Math.round(PLAN_STALE_OUTPUT_MS / 60_000)} minutes.`));\n }\n }, 30_000);\n\n child.on(\"error\", () => { clearInterval(watchdog); clearTimeout(timer); reject(new Error(\"Failed to execute planning command.\")); });\n child.on(\"close\", (code) => {\n clearInterval(watchdog);\n clearTimeout(timer);\n if (code !== 0) {\n reject(new Error(`Planning failed (exit ${code}): ${stdout.slice(0, 500)}`));\n return;\n }\n resolve(stdout);\n });\n });\n}\n","// ── Plan JSON schema definitions ─────────────────────────────────────────────\n\n// Reusable step schema (used in both steps[] and phases[].tasks[])\nexport const STEP_SCHEMA = {\n type: \"object\",\n additionalProperties: false,\n required: [\"step\", \"action\", \"files\", \"details\", \"ownerType\", \"doneWhen\"],\n properties: {\n step: { type: \"number\" },\n action: { type: \"string\" },\n files: { type: \"array\", items: { type: \"string\" } },\n details: { type: \"string\" },\n ownerType: { type: \"string\", enum: [\"human\", \"agent\", \"skill\", \"subagent\", \"tool\"] },\n doneWhen: { type: \"string\" },\n },\n};\n\nexport const PLAN_JSON_SCHEMA = JSON.stringify({\n type: \"object\",\n additionalProperties: false,\n required: [\"summary\", \"steps\", \"phases\", \"estimatedComplexity\", \"suggestedPaths\", \"suggestedLabels\", \"assumptions\", \"constraints\", \"unknowns\", \"successCriteria\", \"executionStrategy\", \"toolingDecision\", \"risks\", \"validation\", \"deliverables\", \"suggestedEffort\"],\n properties: {\n summary: { type: \"string\" },\n estimatedComplexity: { type: \"string\", enum: [\"trivial\", \"low\", \"medium\", \"high\"] },\n assumptions: { type: \"array\", items: { type: \"string\" } },\n constraints: { type: \"array\", items: { type: \"string\" } },\n unknowns: { type: \"array\", items: { type: \"object\", additionalProperties: false, properties: { question: { type: \"string\" }, whyItMatters: { type: \"string\" }, howToResolve: { type: \"string\" } }, required: [\"question\", \"whyItMatters\", \"howToResolve\"] } },\n successCriteria: { type: \"array\", items: { type: \"string\" } },\n executionStrategy: { type: \"object\", additionalProperties: false, required: [\"approach\", \"whyThisApproach\", \"alternativesConsidered\"], properties: { approach: { type: \"string\" }, whyThisApproach: { type: \"string\" }, alternativesConsidered: { type: \"array\", items: { type: \"string\" } } } },\n toolingDecision: { type: \"object\", additionalProperties: false, required: [\"shouldUseSkills\", \"skillsToUse\", \"shouldUseSubagents\", \"subagentsToUse\", \"decisionSummary\"], properties: {\n shouldUseSkills: { type: \"boolean\" },\n skillsToUse: { type: \"array\", items: { type: \"object\", additionalProperties: false, properties: { name: { type: \"string\" }, why: { type: \"string\" } }, required: [\"name\", \"why\"] } },\n shouldUseSubagents: { type: \"boolean\" },\n subagentsToUse: { type: \"array\", items: { type: \"object\", additionalProperties: false, properties: { name: { type: \"string\" }, role: { type: \"string\" }, why: { type: \"string\" } }, required: [\"name\", \"role\", \"why\"] } },\n decisionSummary: { type: \"string\" },\n } },\n steps: { type: \"array\", items: STEP_SCHEMA },\n phases: { type: \"array\", items: { type: \"object\", additionalProperties: false, required: [\"phaseName\", \"goal\", \"tasks\", \"dependencies\", \"outputs\"], properties: {\n phaseName: { type: \"string\" },\n goal: { type: \"string\" },\n tasks: { type: \"array\", items: STEP_SCHEMA },\n dependencies: { type: \"array\", items: { type: \"string\" } },\n outputs: { type: \"array\", items: { type: \"string\" } },\n } } },\n risks: { type: \"array\", items: { type: \"object\", additionalProperties: false, required: [\"risk\", \"impact\", \"mitigation\"], properties: { risk: { type: \"string\" }, impact: { type: \"string\" }, mitigation: { type: \"string\" } } } },\n validation: { type: \"array\", items: { type: \"string\" } },\n deliverables: { type: \"array\", items: { type: \"string\" } },\n suggestedPaths: { type: \"array\", items: { type: \"string\" } },\n suggestedLabels: { type: \"array\", items: { type: \"string\" } },\n suggestedEffort: { type: \"object\", additionalProperties: false, required: [\"default\", \"planner\", \"executor\", \"reviewer\"], properties: { default: { type: \"string\" }, planner: { type: \"string\" }, executor: { type: \"string\" }, reviewer: { type: \"string\" } } },\n },\n});\n\n/** Parsed schema object for OpenAI API json_schema response_format. */\nexport const PLAN_SCHEMA_OBJECT = JSON.parse(PLAN_JSON_SCHEMA) as Record<string, unknown>;\n","import type {\n DetectedProvider,\n EffortConfig,\n JsonRecord,\n PipelineStageConfig,\n ReasoningEffort,\n RuntimeConfig,\n RuntimeSettingRecord,\n RuntimeSettingScope,\n RuntimeSettingSource,\n WorkflowConfig,\n} from \"../types.ts\";\nimport type { DiscoveredModel } from \"../agents/providers.ts\";\nimport { clamp, now } from \"../concerns/helpers.ts\";\nimport { loadPersistedSettings, replacePersistedSetting } from \"./store.ts\";\nimport { getProviderDefaultCommand, normalizeAgentProvider, readCodexConfig } from \"../agents/providers.ts\";\n\nexport const SETTING_ID_POLL_INTERVAL_MS = \"runtime.pollIntervalMs\";\nexport const SETTING_ID_WORKER_CONCURRENCY = \"runtime.workerConcurrency\";\nexport const SETTING_ID_COMMAND_TIMEOUT_MS = \"runtime.commandTimeoutMs\";\nexport const SETTING_ID_MAX_ATTEMPTS_DEFAULT = \"runtime.maxAttemptsDefault\";\nexport const SETTING_ID_MAX_TURNS = \"runtime.maxTurns\";\nexport const SETTING_ID_RETRY_DELAY_MS = \"runtime.retryDelayMs\";\nexport const SETTING_ID_STALE_IN_PROGRESS_TIMEOUT_MS = \"runtime.staleInProgressTimeoutMs\";\nexport const SETTING_ID_LOG_LINES_TAIL = \"runtime.logLinesTail\";\nexport const SETTING_ID_MAX_CONCURRENT_BY_STATE = \"runtime.maxConcurrentByState\";\nexport const SETTING_ID_AGENT_PROVIDER = \"runtime.agentProvider\";\nexport const SETTING_ID_AGENT_COMMAND = \"runtime.agentCommand\";\nexport const SETTING_ID_DEFAULT_EFFORT = \"runtime.defaultEffort\";\nexport const SETTING_ID_DETECTED_PROVIDERS = \"providers.detected\";\nexport const SETTING_ID_UI_THEME = \"ui.theme\";\nexport const SETTING_ID_UI_NOTIFICATIONS_ENABLED = \"ui.notifications.enabled\";\nexport const SETTING_ID_WORKFLOW_CONFIG = \"runtime.workflowConfig\";\n\nexport async function loadRuntimeSettings(): Promise<RuntimeSettingRecord[]> {\n return loadPersistedSettings();\n}\n\nexport const RUNTIME_CONFIG_SETTING_IDS = new Set<string>([\n SETTING_ID_POLL_INTERVAL_MS,\n SETTING_ID_WORKER_CONCURRENCY,\n SETTING_ID_COMMAND_TIMEOUT_MS,\n SETTING_ID_MAX_ATTEMPTS_DEFAULT,\n SETTING_ID_MAX_TURNS,\n SETTING_ID_RETRY_DELAY_MS,\n SETTING_ID_STALE_IN_PROGRESS_TIMEOUT_MS,\n SETTING_ID_LOG_LINES_TAIL,\n SETTING_ID_MAX_CONCURRENT_BY_STATE,\n SETTING_ID_AGENT_PROVIDER,\n SETTING_ID_AGENT_COMMAND,\n SETTING_ID_DEFAULT_EFFORT,\n]);\n\nconst VALID_REASONING_EFFORTS = new Set<ReasoningEffort>([\"low\", \"medium\", \"high\", \"extra-high\"]);\n\nfunction parseIntegerSetting(value: unknown): number | null {\n const parsed = typeof value === \"number\"\n ? value\n : Number.parseInt(String(value ?? \"\"), 10);\n return Number.isFinite(parsed) ? parsed : null;\n}\n\nfunction sanitizeMaxConcurrentByState(value: unknown): Record<string, number> | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return null;\n }\n\n const result: Record<string, number> = {};\n for (const [key, rawLimit] of Object.entries(value as JsonRecord)) {\n const limit = parseIntegerSetting(rawLimit);\n if (!limit || limit < 1) continue;\n const normalizedKey = key.trim().toLowerCase();\n if (!normalizedKey) continue;\n result[normalizedKey] = limit;\n }\n\n return result;\n}\n\nfunction sanitizeReasoningEffort(value: unknown): ReasoningEffort | undefined {\n return typeof value === \"string\" && VALID_REASONING_EFFORTS.has(value as ReasoningEffort)\n ? value as ReasoningEffort\n : undefined;\n}\n\nfunction sanitizeDefaultEffort(value: unknown): EffortConfig | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return null;\n }\n\n const raw = value as JsonRecord;\n const next: EffortConfig = {};\n const keys: Array<keyof EffortConfig> = [\"default\", \"planner\", \"executor\", \"reviewer\"];\n\n for (const key of keys) {\n const effort = sanitizeReasoningEffort(raw[key]);\n if (effort) {\n next[key] = effort;\n }\n }\n\n return Object.keys(next).length > 0 ? next : {};\n}\n\nfunction buildRuntimeConfigSettings(\n config: RuntimeConfig,\n source: RuntimeSettingSource,\n): RuntimeSettingRecord[] {\n const updatedAt = now();\n return [\n { id: SETTING_ID_POLL_INTERVAL_MS, scope: \"runtime\", value: config.pollIntervalMs, source, updatedAt },\n { id: SETTING_ID_WORKER_CONCURRENCY, scope: \"runtime\", value: config.workerConcurrency, source, updatedAt },\n { id: SETTING_ID_COMMAND_TIMEOUT_MS, scope: \"runtime\", value: config.commandTimeoutMs, source, updatedAt },\n { id: SETTING_ID_MAX_ATTEMPTS_DEFAULT, scope: \"runtime\", value: config.maxAttemptsDefault, source, updatedAt },\n { id: SETTING_ID_MAX_TURNS, scope: \"runtime\", value: config.maxTurns, source, updatedAt },\n { id: SETTING_ID_RETRY_DELAY_MS, scope: \"runtime\", value: config.retryDelayMs, source, updatedAt },\n {\n id: SETTING_ID_STALE_IN_PROGRESS_TIMEOUT_MS,\n scope: \"runtime\",\n value: config.staleInProgressTimeoutMs,\n source,\n updatedAt,\n },\n { id: SETTING_ID_LOG_LINES_TAIL, scope: \"runtime\", value: config.logLinesTail, source, updatedAt },\n { id: SETTING_ID_MAX_CONCURRENT_BY_STATE, scope: \"runtime\", value: config.maxConcurrentByState, source, updatedAt },\n { id: SETTING_ID_AGENT_PROVIDER, scope: \"runtime\", value: config.agentProvider, source, updatedAt },\n { id: SETTING_ID_AGENT_COMMAND, scope: \"runtime\", value: config.agentCommand, source, updatedAt },\n { id: SETTING_ID_DEFAULT_EFFORT, scope: \"runtime\", value: config.defaultEffort, source, updatedAt },\n ];\n}\n\nexport function applyPersistedSettings(config: RuntimeConfig, settings: RuntimeSettingRecord[]): RuntimeConfig {\n let nextConfig = { ...config };\n let agentProviderOverridden = false;\n let agentCommandOverridden = false;\n\n for (const setting of settings) {\n switch (setting.id) {\n case SETTING_ID_POLL_INTERVAL_MS: {\n const parsed = parseIntegerSetting(setting.value);\n if (parsed !== null) {\n nextConfig.pollIntervalMs = clamp(parsed, 200, 10_000);\n }\n break;\n }\n case SETTING_ID_WORKER_CONCURRENCY: {\n const parsed = parseIntegerSetting(setting.value);\n if (parsed !== null) {\n nextConfig.workerConcurrency = clamp(parsed, 1, 10);\n }\n break;\n }\n case SETTING_ID_COMMAND_TIMEOUT_MS: {\n const parsed = parseIntegerSetting(setting.value);\n if (parsed !== null) {\n nextConfig.commandTimeoutMs = clamp(parsed, 1_000, 3_600_000);\n }\n break;\n }\n case SETTING_ID_MAX_ATTEMPTS_DEFAULT: {\n const parsed = parseIntegerSetting(setting.value);\n if (parsed !== null) {\n nextConfig.maxAttemptsDefault = clamp(parsed, 1, 10);\n }\n break;\n }\n case SETTING_ID_MAX_TURNS: {\n const parsed = parseIntegerSetting(setting.value);\n if (parsed !== null) {\n nextConfig.maxTurns = clamp(parsed, 1, 16);\n }\n break;\n }\n case SETTING_ID_RETRY_DELAY_MS: {\n const parsed = parseIntegerSetting(setting.value);\n if (parsed !== null) {\n nextConfig.retryDelayMs = Math.max(0, parsed);\n }\n break;\n }\n case SETTING_ID_STALE_IN_PROGRESS_TIMEOUT_MS: {\n const parsed = parseIntegerSetting(setting.value);\n if (parsed !== null) {\n nextConfig.staleInProgressTimeoutMs = Math.max(0, parsed);\n }\n break;\n }\n case SETTING_ID_LOG_LINES_TAIL: {\n const parsed = parseIntegerSetting(setting.value);\n if (parsed !== null) {\n nextConfig.logLinesTail = clamp(parsed, 1_000, 200_000);\n }\n break;\n }\n case SETTING_ID_MAX_CONCURRENT_BY_STATE: {\n const parsed = sanitizeMaxConcurrentByState(setting.value);\n if (parsed) {\n nextConfig.maxConcurrentByState = parsed;\n }\n break;\n }\n case SETTING_ID_AGENT_PROVIDER: {\n if (typeof setting.value === \"string\") {\n nextConfig.agentProvider = normalizeAgentProvider(setting.value);\n agentProviderOverridden = true;\n }\n break;\n }\n case SETTING_ID_AGENT_COMMAND: {\n nextConfig.agentCommand = typeof setting.value === \"string\" ? setting.value.trim() : \"\";\n agentCommandOverridden = true;\n break;\n }\n case SETTING_ID_DEFAULT_EFFORT: {\n const parsed = sanitizeDefaultEffort(setting.value);\n if (parsed) {\n nextConfig.defaultEffort = parsed;\n }\n break;\n }\n default:\n break;\n }\n }\n\n if (agentProviderOverridden && !agentCommandOverridden) {\n nextConfig.agentCommand = getProviderDefaultCommand(\n nextConfig.agentProvider,\n nextConfig.defaultEffort?.default,\n );\n }\n\n return nextConfig;\n}\n\nexport function inferSettingScope(settingId: string): RuntimeSettingScope {\n if (settingId.startsWith(\"runtime.\")) return \"runtime\";\n if (settingId.startsWith(\"providers.\")) return \"providers\";\n if (settingId.startsWith(\"ui.\")) return \"ui\";\n return \"system\";\n}\n\nexport async function persistSetting(\n id: string,\n value: unknown,\n options: {\n scope?: RuntimeSettingScope;\n source?: RuntimeSettingSource;\n } = {},\n): Promise<RuntimeSettingRecord> {\n const setting: RuntimeSettingRecord = {\n id,\n scope: options.scope ?? inferSettingScope(id),\n value,\n source: options.source ?? \"user\",\n updatedAt: now(),\n };\n await replacePersistedSetting(setting);\n return setting;\n}\n\nexport async function persistWorkerConcurrencySetting(value: number, source: RuntimeSettingRecord[\"source\"] = \"user\"): Promise<void> {\n await persistSetting(\n SETTING_ID_WORKER_CONCURRENCY,\n clamp(Math.round(value), 1, 10),\n { scope: \"runtime\", source },\n );\n}\n\nexport async function persistDetectedProvidersSetting(providers: DetectedProvider[]): Promise<void> {\n await persistSetting(\n SETTING_ID_DETECTED_PROVIDERS,\n {\n providers,\n detectedAt: now(),\n },\n { scope: \"providers\", source: \"detected\" },\n );\n}\n\nexport async function syncRuntimeConfigSettings(\n config: RuntimeConfig,\n settings: RuntimeSettingRecord[],\n): Promise<void> {\n const existingById = new Map(settings.map((setting) => [setting.id, setting]));\n const desiredSettings = buildRuntimeConfigSettings(config, \"system\");\n\n await Promise.all(\n desiredSettings.map(async (setting) => {\n const existing = existingById.get(setting.id);\n if (existing?.source === \"user\") return;\n await replacePersistedSetting({\n ...setting,\n source: existing?.source === \"workflow\" ? \"workflow\" : \"system\",\n });\n }),\n );\n}\n\n// ── Workflow Config (pipeline stage configuration) ────────────────────────\n\nfunction isValidStage(v: unknown): v is PipelineStageConfig {\n if (!v || typeof v !== \"object\") return false;\n const s = v as Record<string, unknown>;\n // model is optional — empty string means \"use CLI default\"\n return typeof s.provider === \"string\" && typeof s.effort === \"string\";\n}\n\n/**\n * Build a default workflow config using discovered models.\n * Never hardcodes model IDs — always uses the first model from each provider's discovery.\n * Falls back to provider name as model if discovery returned nothing.\n */\nexport function buildDefaultWorkflowConfig(\n detectedProviders: DetectedProvider[],\n discoveredModels?: Record<string, DiscoveredModel[]>,\n): WorkflowConfig {\n const available = detectedProviders.filter((p) => p.available);\n const hasClaude = available.some((p) => p.name === \"claude\");\n const hasCodex = available.some((p) => p.name === \"codex\");\n\n // Pick the first discovered model per provider (discoverModels promotes the user's configured CLI default to [0])\n const claudeModel = discoveredModels?.claude?.[0]?.id || \"\";\n const codexModel = discoveredModels?.codex?.[0]?.id || \"\";\n\n // Use the effort the user already configured in ~/.codex/config.toml as the execute default\n const codexEffort = (readCodexConfig().reasoningEffort as ReasoningEffort | undefined) || \"medium\";\n\n const claudeDefault: PipelineStageConfig = { provider: \"claude\", model: claudeModel, effort: \"medium\" };\n const codexDefault: PipelineStageConfig = { provider: \"codex\", model: codexModel, effort: codexEffort };\n\n // Default: claude for plan+review (better reasoning), codex for execute (better code)\n if (hasClaude && hasCodex) {\n return {\n plan: { ...claudeDefault, effort: \"high\" },\n execute: { ...codexDefault },\n review: { ...claudeDefault },\n };\n }\n if (hasClaude) {\n return { plan: { ...claudeDefault, effort: \"high\" }, execute: claudeDefault, review: claudeDefault };\n }\n if (hasCodex) {\n return { plan: { ...codexDefault, effort: \"high\" }, execute: codexDefault, review: codexDefault };\n }\n return { plan: claudeDefault, execute: codexDefault, review: claudeDefault };\n}\n\n/** Load workflow config from settings */\nexport function getWorkflowConfig(settings: RuntimeSettingRecord[]): WorkflowConfig | null {\n const setting = settings.find((s) => s.id === SETTING_ID_WORKFLOW_CONFIG);\n if (!setting?.value || typeof setting.value !== \"object\") return null;\n const wf = setting.value as Record<string, unknown>;\n if (isValidStage(wf.plan) && isValidStage(wf.execute) && isValidStage(wf.review)) {\n return wf as unknown as WorkflowConfig;\n }\n return null;\n}\n\n/** Persist workflow config */\nexport async function persistWorkflowConfig(config: WorkflowConfig): Promise<void> {\n await persistSetting(SETTING_ID_WORKFLOW_CONFIG, config, { scope: \"runtime\", source: \"user\" });\n}\n","import { writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { mkdtempSync, rmSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport type { IssuePlan, RuntimeConfig, IssueEntry, AgentTokenUsage } from \"../../types.ts\";\nimport { now } from \"../../concerns/helpers.ts\";\nimport { logger } from \"../../concerns/logger.ts\";\nimport { record as recordTokens } from \"../../domains/tokens.ts\";\nimport { type PlanningSessionUsage } from \"./planning-session.ts\";\nimport { parsePlanOutput, extractPlanTokenUsage } from \"./planning-parser.ts\";\nimport {\n buildRefinePrompt,\n getPlanCommand,\n savePlanDebugFiles,\n resolvePlanStageConfig,\n runPlanningProcess,\n} from \"./planning-prompts.ts\";\n\n// ── Public types ──────────────────────────────────────────────────────────────\n\nexport type RefinePlanResult = {\n plan: IssuePlan;\n usage: PlanningSessionUsage;\n};\n\n// ── Refine plan ───────────────────────────────────────────────────────────────\n\nexport async function refinePlan(\n issue: IssueEntry,\n feedback: string,\n config: RuntimeConfig,\n _workflowDefinition: null,\n): Promise<RefinePlanResult> {\n if (!issue.plan) throw new Error(\"Issue has no plan to refine.\");\n\n const { provider: preferred, model: planStageModel } = await resolvePlanStageConfig(config);\n\n const refineStartMs = Date.now();\n const prompt = await buildRefinePrompt(issue.title, issue.description, issue.plan, feedback);\n\n let plan: IssuePlan | null = null;\n let refineUsage: PlanningSessionUsage;\n\n {\n const command = getPlanCommand(preferred, planStageModel);\n if (!command) throw new Error(`No command configured for provider ${preferred}.`);\n\n const tempDir = mkdtempSync(join(tmpdir(), \"fifony-refine-\"));\n const promptFile = join(tempDir, \"fifony-refine-prompt.md\");\n writeFileSync(promptFile, `${prompt}\\n`, \"utf8\");\n\n const output = await runPlanningProcess({\n command,\n tempDir,\n promptFile,\n provider: preferred,\n }).finally(() => {\n rmSync(tempDir, { recursive: true, force: true });\n });\n\n logger.info({ rawOutput: output.slice(0, 2000) }, `Refine raw output from ${preferred}`);\n savePlanDebugFiles(\"refine-cli\", prompt, output);\n\n plan = parsePlanOutput(output);\n\n const durationMs = Date.now() - refineStartMs;\n const tokenInfo = extractPlanTokenUsage(output);\n refineUsage = {\n inputTokens: tokenInfo?.inputTokens ?? 0,\n outputTokens: tokenInfo?.outputTokens ?? 0,\n totalTokens: tokenInfo?.totalTokens ?? 0,\n model: tokenInfo?.model || planStageModel || preferred,\n promptChars: prompt.length,\n outputChars: output.length,\n durationMs,\n };\n }\n\n if (!plan) {\n logger.error(\"[Planner] Could not parse refined plan from AI output\");\n throw new Error(\"Could not parse refined plan from AI output.\");\n }\n\n plan.provider = planStageModel ? `${preferred}/${planStageModel}` : preferred;\n\n const existingRefinements = issue.plan.refinements ?? [];\n const nextVersion = existingRefinements.length + 1;\n plan.refinements = [\n ...existingRefinements,\n { feedback, at: now(), version: nextVersion },\n ];\n\n const durationMs = Date.now() - refineStartMs;\n refineUsage.durationMs = durationMs;\n\n if (refineUsage.totalTokens > 0) {\n const tokenUsage: AgentTokenUsage = {\n inputTokens: refineUsage.inputTokens,\n outputTokens: refineUsage.outputTokens,\n totalTokens: refineUsage.totalTokens,\n model: refineUsage.model,\n };\n recordTokens({ id: issue.id, identifier: issue.identifier, title: issue.title } as IssueEntry, tokenUsage, \"planner\");\n }\n\n const tokenSummary = refineUsage.totalTokens > 0\n ? `, ${refineUsage.totalTokens.toLocaleString()} tokens (in: ${refineUsage.inputTokens.toLocaleString()}, out: ${refineUsage.outputTokens.toLocaleString()})`\n : `, ${refineUsage.outputChars.toLocaleString()} output chars`;\n logger.info(`Plan refined for \"${issue.title}\" via ${refineUsage.model}: ${plan.steps.length} steps, complexity: ${plan.estimatedComplexity}${tokenSummary}, ${durationMs}ms`);\n return { plan, usage: refineUsage };\n}\n","import type { IssuePlan, RuntimeConfig, IssueEntry } from \"../../types.ts\";\nimport { now } from \"../../concerns/helpers.ts\";\nimport { logger } from \"../../concerns/logger.ts\";\nimport { markIssuePlanDirty } from \"../../persistence/dirty-tracker.ts\";\nimport { type PlanningSessionUsage } from \"./planning-session.ts\";\nimport { generatePlan } from \"./plan-generator.ts\";\nimport { refinePlan } from \"./plan-refiner.ts\";\n\n// ── Callbacks type ────────────────────────────────────────────────────────────\n\nexport type PlanCallbacks = {\n addEvent: (issueId: string, kind: string, message: string) => void;\n persistState: () => Promise<void>;\n applyUsage: (issue: IssueEntry, usage: PlanningSessionUsage) => void;\n applySuggestions: (issue: IssueEntry, plan: IssuePlan) => void;\n};\n\n/**\n * Start plan generation in the background. Returns immediately.\n * Updates issue.plan and broadcasts via WS when done.\n */\nexport function generatePlanInBackground(\n issue: IssueEntry,\n config: RuntimeConfig,\n _workflowDefinition: null,\n callbacks: PlanCallbacks,\n options?: { fast?: boolean },\n): void {\n const { addEvent, persistState, applyUsage, applySuggestions } = callbacks;\n const fast = options?.fast ?? false;\n\n issue.planningStatus = \"planning\";\n issue.planningStartedAt = now();\n issue.planningError = undefined;\n issue.updatedAt = now();\n\n addEvent(issue.id, \"info\", `${fast ? \"Fast plan\" : \"Plan\"} generation starting for ${issue.identifier} (provider detection in progress).`);\n\n // Fire-and-forget — errors are caught and stored on the issue\n generatePlan(issue.title, issue.description, config, null, { fast })\n .then(async ({ plan, usage }) => {\n issue.plan = plan;\n markIssuePlanDirty(issue.id);\n issue.planningStatus = \"idle\";\n issue.planningStartedAt = undefined;\n issue.planningError = undefined;\n issue.updatedAt = now();\n\n applyUsage(issue, usage);\n applySuggestions(issue, plan);\n\n addEvent(issue.id, \"progress\", `${fast ? \"Fast plan\" : \"Plan\"} generated for ${issue.identifier}: ${plan.steps.length} steps, complexity: ${plan.estimatedComplexity}.`);\n if (usage.totalTokens > 0) {\n addEvent(issue.id, \"info\", `Plan tokens (${issue.identifier}): ${usage.totalTokens.toLocaleString()} (in: ${usage.inputTokens.toLocaleString()}, out: ${usage.outputTokens.toLocaleString()}) [${usage.model}]`);\n }\n await persistState();\n })\n .catch(async (err) => {\n issue.planningStatus = \"idle\";\n issue.planningStartedAt = undefined;\n issue.planningError = err instanceof Error ? err.message : String(err);\n issue.updatedAt = now();\n addEvent(issue.id, \"error\", `Plan generation failed for ${issue.identifier}: ${issue.planningError}`);\n await persistState();\n logger.error({ err }, `Background plan generation failed for ${issue.identifier}`);\n });\n}\n\n/**\n * Start plan refinement in the background. Returns immediately.\n * Updates issue.plan and broadcasts via WS when done.\n */\nexport function refinePlanInBackground(\n issue: IssueEntry,\n feedback: string,\n config: RuntimeConfig,\n _workflowDefinition: null,\n callbacks: PlanCallbacks,\n): void {\n const { addEvent, persistState, applyUsage, applySuggestions } = callbacks;\n\n issue.planningStatus = \"planning\";\n issue.planningStartedAt = now();\n issue.planningError = undefined;\n issue.updatedAt = now();\n\n const feedbackSnippet = feedback.length > 60 ? `${feedback.slice(0, 57)}...` : feedback;\n addEvent(issue.id, \"info\", `Plan refinement starting for ${issue.identifier}: \"${feedbackSnippet}\".`);\n\n refinePlan(issue, feedback, config, null)\n .then(async ({ plan, usage }) => {\n issue.plan = plan;\n markIssuePlanDirty(issue.id);\n issue.planningStatus = \"idle\";\n issue.planningStartedAt = undefined;\n issue.planningError = undefined;\n issue.updatedAt = now();\n\n applyUsage(issue, usage);\n applySuggestions(issue, plan);\n\n const feedbackPreview = feedback.length > 80 ? `${feedback.slice(0, 77)}...` : feedback;\n addEvent(issue.id, \"progress\", `Plan refined for ${issue.identifier}: \"${feedbackPreview}\" → ${plan.steps.length} steps, complexity: ${plan.estimatedComplexity}.`);\n if (usage.totalTokens > 0) {\n addEvent(issue.id, \"info\", `Refinement tokens (${issue.identifier}): ${usage.totalTokens.toLocaleString()} (in: ${usage.inputTokens.toLocaleString()}, out: ${usage.outputTokens.toLocaleString()}) [${usage.model}]`);\n }\n await persistState();\n })\n .catch(async (err) => {\n issue.planningStatus = \"idle\";\n issue.planningStartedAt = undefined;\n issue.planningError = err instanceof Error ? err.message : String(err);\n issue.updatedAt = now();\n addEvent(issue.id, \"error\", `Plan refinement failed for ${issue.identifier}: ${issue.planningError}`);\n await persistState();\n logger.error({ err }, `Background plan refinement failed for ${issue.identifier}`);\n });\n}\n","import { appendFileTail, extractJsonObjects } from \"../../concerns/helpers.ts\";\nimport { logger } from \"../../concerns/logger.ts\";\nimport { detectAvailableProviders, normalizeAgentProvider, resolveAgentCommand } from \"../providers.ts\";\nimport type { RuntimeConfig } from \"../../types.ts\";\nimport { renderPrompt } from \"../prompting.ts\";\nimport { env } from \"node:process\";\nimport { existsSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from \"node:fs\";\nimport { spawn } from \"node:child_process\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\n\n\nexport type EnhancementField = \"title\" | \"description\";\n\ntype EnhanceIssuePayload = {\n field: EnhancementField;\n title: string;\n description: string;\n issueType?: string;\n images?: string[];\n provider?: string;\n preferredProvider?: string;\n};\n\ntype EnhanceResult = {\n field: EnhancementField;\n value: string;\n provider: string;\n};\n\nfunction getProviderCommand(\n provider: string,\n config: RuntimeConfig,\n): string {\n return resolveAgentCommand(provider, config.agentCommand || \"\", \"\", \"\");\n}\n\nasync function buildPrompt(field: EnhancementField, title: string, description: string, issueType?: string, images?: string[]): Promise<string> {\n const context = {\n title: title || \"(empty)\",\n description: description || \"(empty)\",\n issueType: issueType || \"blank\",\n images: images?.length ? images : undefined,\n };\n\n if (field === \"title\") {\n return renderPrompt(\"issue-enhancer-title\", context);\n }\n\n return renderPrompt(\"issue-enhancer-description\", context);\n}\n\nfunction parseEnhancerOutput(raw: string, expectedField: EnhancementField): string {\n const text = raw.trim();\n if (!text) {\n throw new Error(\"AI provider returned an empty response.\");\n }\n\n const candidates = extractJsonObjects(\n text.match(/```(?:json)?\\s*([\\s\\S]*?)\\s*```/i)?.[1]?.trim() ?? text,\n );\n for (const candidate of candidates) {\n const value = parseCandidate(candidate, expectedField);\n if (value) return value;\n }\n\n const cleanedRaw = text.trim();\n const trimmed = cleanedRaw.replace(/^\\\"|\\\"$/g, \"\").trim();\n if (trimmed) {\n const candidatesFromRaw = extractJsonObjects(trimmed);\n for (const candidate of candidatesFromRaw) {\n const value = parseCandidate(candidate, expectedField);\n if (value) return value;\n }\n }\n\n const fallback = cleanedRaw.replace(/^`+\\s*|\\s*`+$/g, \"\").trim();\n if (!fallback) {\n throw new Error(\"AI provider response could not be parsed.\");\n }\n return fallback;\n}\n\nfunction parseCandidate(raw: string, expectedField: EnhancementField): string {\n const candidate = raw.trim();\n if (!candidate) return \"\";\n\n try {\n const parsed = JSON.parse(candidate) as {\n field?: string;\n value?: unknown;\n text?: unknown;\n result?: unknown;\n };\n const value =\n typeof parsed.value === \"string\" ? parsed.value.trim() :\n typeof parsed.text === \"string\" ? parsed.text.trim() :\n \"\";\n const field = parsed.field;\n const isPlaceholder = /^\\.{2,}$/.test(value);\n if (value && !isPlaceholder && (!field || field === expectedField)) {\n return value;\n }\n if (typeof parsed.result === \"string\") {\n const nested = parsed.result.trim();\n if (nested) {\n const nestedClean = nested.replace(/^```(?:json)?\\s*|\\s*```$/g, \"\").trim();\n for (const nestedCandidate of extractJsonObjects(nestedClean)) {\n const parsedNested = parseCandidate(nestedCandidate, expectedField);\n if (parsedNested) return parsedNested;\n }\n }\n }\n } catch {\n // ignore parse errors for heuristic parsing\n }\n return \"\";\n}\n\nfunction readProviderOutput(resultFile: string, fallback: string): string {\n if (existsSync(resultFile)) {\n try {\n return readFileSync(resultFile, \"utf8\").trim();\n } catch {\n // ignore, keep fallback\n }\n }\n return fallback;\n}\n\nasync function runProviderCommand(\n command: string,\n provider: string,\n prompt: string,\n title: string,\n description: string,\n field: EnhancementField,\n timeoutMs: number,\n images?: string[],\n): Promise<string> {\n const tempDir = mkdtempSync(join(tmpdir(), \"fifony-enhance-\"));\n const promptFile = join(tempDir, \"fifony-enhance-prompt.md\");\n const issuePayloadFile = join(tempDir, \"fifony-issue.json\");\n const resultFile = join(tempDir, \"fifony-result.txt\");\n writeFileSync(promptFile, `${prompt}\\n`, \"utf8\");\n writeFileSync(issuePayloadFile, JSON.stringify({ title, description, field }, null, 2), \"utf8\");\n\n // For Codex: inject --image flags before the stdin redirect\n let effectiveCommand = command;\n if (provider === \"codex\" && images?.length) {\n const imageFlags = images.map((p) => `--image \"${p}\"`).join(\" \");\n effectiveCommand = command.replace('< \"$FIFONY_PROMPT_FILE\"', `${imageFlags} < \"$FIFONY_PROMPT_FILE\"`);\n }\n\n const spawnEnv = {\n ...env,\n FIFONY_ISSUE_TITLE: title,\n FIFONY_ISSUE_DESCRIPTION: description,\n FIFONY_ENHANCE_FIELD: field,\n FIFONY_PROMPT_FILE: promptFile,\n FIFONY_PROMPT: prompt,\n FIFONY_ISSUE_JSON: issuePayloadFile,\n FIFONY_AGENT_PROVIDER: provider,\n FIFONY_RESULT_FILE: resultFile,\n ...(images?.length ? { FIFONY_IMAGE_PATHS: images.join(\",\") } : {}),\n };\n\n return await new Promise((resolve, reject) => {\n const startedAt = Date.now();\n let output = \"\";\n let timeout = false;\n\n const child = spawn(effectiveCommand, {\n shell: true,\n cwd: tempDir,\n env: spawnEnv,\n });\n\n if (child.stdin) child.stdin.end();\n\n child.stdout?.on(\"data\", (chunk) => {\n output = appendFileTail(output, String(chunk), 12_000);\n });\n child.stderr?.on(\"data\", (chunk) => {\n output = appendFileTail(output, String(chunk), 12_000);\n });\n\n const timer = setTimeout(() => {\n timeout = true;\n child.kill(\"SIGTERM\");\n }, Math.max(timeoutMs, 1_000));\n\n child.on(\"error\", () => {\n clearTimeout(timer);\n rmSync(tempDir, { recursive: true, force: true });\n reject(new Error(\"Could not execute AI command.\"));\n });\n\n child.on(\"close\", (code) => {\n clearTimeout(timer);\n\n if (timeout) {\n rmSync(tempDir, { recursive: true, force: true });\n reject(new Error(`Enhance command timeout after ${Date.now() - startedAt}ms.`));\n return;\n }\n\n const commandOutput = readProviderOutput(resultFile, output);\n rmSync(tempDir, { recursive: true, force: true });\n\n if (code !== 0) {\n const providerOutput = appendFileTail(commandOutput, \"\", 12_000);\n const reason = providerOutput.trim()\n ? ` Enhance command output: ${providerOutput.slice(0, 1200)}`\n : \"\";\n reject(new Error(`Enhance command failed (exit ${code ?? \"unknown\"}).${reason}`));\n return;\n }\n resolve(commandOutput);\n });\n });\n}\n\nexport async function enhanceIssueField(\n payload: EnhanceIssuePayload,\n config: RuntimeConfig,\n _workflowDefinition: null,\n): Promise<EnhanceResult> {\n const field: EnhancementField = payload.field === \"description\" ? \"description\" : \"title\";\n const title = typeof payload.title === \"string\" ? payload.title.trim() : \"\";\n const description = typeof payload.description === \"string\" ? payload.description.trim() : \"\";\n const issueType = typeof payload.issueType === \"string\" ? payload.issueType.trim() : undefined;\n const requestedProvider = normalizeAgentProvider(\n typeof payload.preferredProvider === \"string\" ? payload.preferredProvider : payload.provider ?? config.agentProvider,\n );\n const providers = detectAvailableProviders();\n const availableSet = new Set(providers.filter((entry) => entry.available).map((entry) => entry.name));\n const orderedProviders: string[] = [];\n const addProvider = (candidate: string) => {\n if (availableSet.has(candidate) && !orderedProviders.includes(candidate)) {\n orderedProviders.push(candidate);\n }\n };\n\n addProvider(requestedProvider);\n // Fall back to any other available provider, in detection order\n for (const entry of providers) {\n if (entry.available) addProvider(entry.name);\n }\n\n if (!orderedProviders.length) {\n const known = providers.map((entry) => `${entry.name}:${entry.available ? \"available\" : \"missing\"}`).join(\", \");\n throw new Error(`No AI provider available (codex/claude). Detected: ${known}`);\n }\n\n const images = Array.isArray(payload.images) ? payload.images.filter((p): p is string => typeof p === \"string\") : undefined;\n const prompt = await buildPrompt(field, title, description, issueType, images);\n const errors: string[] = [];\n\n // JSON schema for structured enhance output via OpenAI API\n const enhanceSchema = {\n type: \"object\" as const,\n properties: {\n field: { type: \"string\" as const },\n value: { type: \"string\" as const },\n },\n required: [\"field\", \"value\"] as const,\n additionalProperties: false as const,\n };\n\n for (const selectedProvider of orderedProviders) {\n // ── All providers: spawn CLI process ──\n const command = getProviderCommand(selectedProvider, config);\n if (!command) {\n errors.push(`Provider \"${selectedProvider}\" has no command.`);\n continue;\n }\n\n try {\n const output = await runProviderCommand(\n command,\n selectedProvider,\n prompt,\n title,\n description,\n field,\n config.commandTimeoutMs,\n images,\n );\n logger.info({ provider: selectedProvider, field, rawOutput: output.slice(0, 2000) }, \"Enhance raw output\");\n const value = parseEnhancerOutput(output, field);\n logger.info({ provider: selectedProvider, field, parsedValue: value }, \"Enhance parsed value\");\n return { field, value, provider: selectedProvider };\n } catch (error) {\n errors.push(\n `Provider \"${selectedProvider}\" failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n throw new Error(`Could not enhance issue field. ${errors.join(\" | \")}`);\n}\n","import type { RuntimeState } from \"../types.ts\";\nimport { logger } from \"../concerns/logger.ts\";\nimport { toStringValue } from \"../concerns/helpers.ts\";\nimport { addEvent } from \"../domains/issues.ts\";\nimport { mutateIssueState } from \"../routes/helpers.ts\";\nimport { applyPlanUsage, applyPlanSuggestions } from \"../routes/helpers.ts\";\nimport { persistState } from \"../persistence/store.ts\";\nimport {\n generatePlan,\n refinePlan,\n generatePlanInBackground,\n refinePlanInBackground,\n loadPlanningSession,\n savePlanningInput,\n clearPlanningSession,\n} from \"../agents/planning/issue-planner.ts\";\nimport { enhanceIssueField } from \"../agents/planning/issue-enhancer.ts\";\n\nexport function registerPlanRoutes(\n app: any,\n state: RuntimeState,\n): void {\n app.get(\"/api/planning/session\", async (c: any) => {\n const session = await loadPlanningSession();\n return c.json({ ok: true, session });\n });\n\n app.post(\"/api/planning/save\", async (c: any) => {\n try {\n const payload = await c.req.json();\n const title = toStringValue(payload.title);\n const description = toStringValue(payload.description);\n const session = await savePlanningInput(title, description);\n return c.json({ ok: true, session });\n } catch (error) {\n return c.json({ ok: false, error: error instanceof Error ? error.message : String(error) }, 500);\n }\n });\n\n app.post(\"/api/planning/generate\", async (c: any) => {\n try {\n const payload = await c.req.json();\n const title = toStringValue(payload.title);\n const description = toStringValue(payload.description);\n if (!title) return c.json({ ok: false, error: \"Title is required.\" }, 400);\n logger.info({ title: title.slice(0, 80) }, \"[API] POST /api/planning/generate\");\n const result = await generatePlan(title, description, state.config, null);\n return c.json({ ok: true, plan: result.plan, usage: result.usage });\n } catch (error) {\n logger.error({ err: error }, `Plan generation failed: ${String(error)}`);\n return c.json({ ok: false, error: error instanceof Error ? error.message : String(error) }, 500);\n }\n });\n\n app.post(\"/api/planning/clear\", async (c: any) => {\n await clearPlanningSession();\n return c.json({ ok: true });\n });\n\n // Legacy alias\n app.post(\"/api/issues/plan\", async (c: any) => {\n try {\n const payload = await c.req.json();\n const title = toStringValue(payload.title);\n const description = toStringValue(payload.description);\n if (!title) return c.json({ ok: false, error: \"Title is required.\" }, 400);\n const result = await generatePlan(title, description, state.config, null);\n return c.json({ ok: true, plan: result.plan, usage: result.usage });\n } catch (error) {\n logger.error({ err: error }, `Plan generation failed: ${String(error)}`);\n return c.json({ ok: false, error: error instanceof Error ? error.message : String(error) }, 500);\n }\n });\n\n app.post(\"/api/issues/:id/plan\", async (c: any) => {\n return mutateIssueState(state, c, async (issue) => {\n if (issue.state !== \"Planning\") {\n throw new Error(`Cannot plan issue in state ${issue.state}. Must be in Planning.`);\n }\n if (issue.planningStatus === \"planning\") {\n throw new Error(\"Planning already running in worker slot.\");\n }\n const body = await c.req.json().catch(() => ({})) as Record<string, unknown>;\n const fast = body.fast === true;\n\n // Fire-and-forget — plan runs in background, updates via WS\n generatePlanInBackground(issue, state.config, null, {\n addEvent: (issueId, kind, message) => addEvent(state, issueId, kind as any, message),\n persistState: () => persistState(state),\n applyUsage: (iss, usage) => applyPlanUsage(iss, usage),\n applySuggestions: (iss, plan) => applyPlanSuggestions(iss, plan),\n }, { fast });\n\n addEvent(state, issue.id, \"progress\", `${fast ? \"Fast plan\" : \"Plan\"} generation started for ${issue.identifier}.`);\n });\n });\n\n app.post(\"/api/issues/:id/plan/refine\", async (c: any) => {\n return mutateIssueState(state, c, async (issue) => {\n if (issue.state !== \"Planning\") {\n throw new Error(`Cannot refine plan for issue in state ${issue.state}. Must be in Planning.`);\n }\n if (!issue.plan) {\n throw new Error(\"Issue has no plan to refine. Generate a plan first.\");\n }\n if (issue.planningStatus === \"planning\") {\n throw new Error(\"A plan operation is already in progress for this issue.\");\n }\n const body = await c.req.json().catch(() => ({})) as Record<string, unknown>;\n const feedback = typeof body.feedback === \"string\" ? body.feedback.trim() : \"\";\n if (!feedback) {\n throw new Error(\"Feedback message is required.\");\n }\n\n // Fire-and-forget — refinement runs in background, updates via WS\n refinePlanInBackground(issue, feedback, state.config, null, {\n addEvent: (issueId, kind, message) => addEvent(state, issueId, kind as any, message),\n persistState: () => persistState(state),\n applyUsage: (iss, usage) => applyPlanUsage(iss, usage),\n applySuggestions: (iss, plan) => {\n if (plan.suggestedPaths?.length) iss.paths = plan.suggestedPaths;\n if (plan.suggestedLabels?.length) iss.labels = plan.suggestedLabels;\n if (plan.suggestedEffort) iss.effort = plan.suggestedEffort;\n },\n });\n\n addEvent(state, issue.id, \"progress\", `Plan refinement started for ${issue.identifier}.`);\n });\n });\n\n app.post(\"/api/issues/enhance\", async (c: any) => {\n try {\n const payload = await c.req.json();\n const field = payload.field === \"description\" ? \"description\" : payload.field === \"title\" ? \"title\" : null;\n if (!field) {\n return c.json({ ok: false, error: 'Invalid field. Expected \"title\" or \"description\".' }, 400);\n }\n\n const title = toStringValue(payload.title);\n const description = toStringValue(payload.description);\n const provider = toStringValue(payload.provider, state.config.agentProvider);\n const issueType = toStringValue(payload.issueType);\n const images = Array.isArray(payload.images) ? payload.images.filter((p: unknown): p is string => typeof p === \"string\") : undefined;\n\n const result = await enhanceIssueField(\n { field, title, description, issueType, images, provider },\n state.config,\n null,\n );\n\n return c.json({ ok: true, field: result.field, value: result.value, provider: result.provider });\n } catch (error) {\n logger.error({ err: error }, `Issue enhance failed: ${String(error)}`);\n return c.json(\n { ok: false, error: error instanceof Error ? error.message : String(error) },\n 500,\n );\n }\n });\n}\n","import type { JsonRecord, RuntimeState, RuntimeSettingScope, RuntimeSettingSource } from \"../types.ts\";\nimport { logger } from \"../concerns/logger.ts\";\nimport { now, clamp } from \"../concerns/helpers.ts\";\nimport { addEvent } from \"../domains/issues.ts\";\nimport { persistState } from \"../persistence/store.ts\";\nimport { detectAvailableProviders, discoverModels } from \"../agents/providers.ts\";\nimport { resolveProjectMetadata, SETTING_ID_PROJECT_NAME } from \"../domains/project.ts\";\nimport {\n applyPersistedSettings,\n buildDefaultWorkflowConfig,\n getWorkflowConfig,\n inferSettingScope,\n loadRuntimeSettings,\n persistSetting,\n persistWorkerConcurrencySetting,\n persistWorkflowConfig,\n RUNTIME_CONFIG_SETTING_IDS,\n} from \"../persistence/settings.ts\";\n\nconst VALID_SETTING_SCOPES = new Set<RuntimeSettingScope>([\"runtime\", \"providers\", \"ui\", \"system\"]);\nconst VALID_SETTING_SOURCES = new Set<RuntimeSettingSource>([\"user\", \"detected\", \"workflow\", \"system\"]);\n\nexport function registerSettingsRoutes(\n app: any,\n state: RuntimeState,\n): void {\n app.get(\"/api/settings\", async (c: any) => {\n const settings = await loadRuntimeSettings();\n return c.json({ settings });\n });\n\n app.get(\"/api/settings/:id\", async (c: any) => {\n const settingId = c.req?.param ? c.req.param(\"id\") : \"\";\n const settings = await loadRuntimeSettings();\n const setting = settings.find((entry) => entry.id === settingId);\n if (!setting) {\n return c.json({ ok: false, error: \"Setting not found\" }, 404);\n }\n return c.json({ ok: true, setting });\n });\n\n app.post(\"/api/settings/:id\", async (c: any) => {\n const settingId = c.req?.param ? c.req.param(\"id\") : \"\";\n if (!settingId) {\n return c.json({ ok: false, error: \"Setting id is required\" }, 400);\n }\n\n const payload = await c.req.json() as JsonRecord;\n const scopeValue = typeof payload.scope === \"string\" ? payload.scope : inferSettingScope(settingId);\n const sourceValue = typeof payload.source === \"string\" ? payload.source : \"user\";\n\n if (!VALID_SETTING_SCOPES.has(scopeValue as RuntimeSettingScope)) {\n return c.json({ ok: false, error: \"Invalid setting scope\" }, 400);\n }\n\n if (!VALID_SETTING_SOURCES.has(sourceValue as RuntimeSettingSource)) {\n return c.json({ ok: false, error: \"Invalid setting source\" }, 400);\n }\n\n const setting = await persistSetting(settingId, payload.value, {\n scope: scopeValue as RuntimeSettingScope,\n source: sourceValue as RuntimeSettingSource,\n });\n if (settingId === SETTING_ID_PROJECT_NAME) {\n const settings = await loadRuntimeSettings();\n const projectMetadata = resolveProjectMetadata(settings, state.sourceRepoUrl);\n state.projectName = projectMetadata.projectName;\n state.detectedProjectName = projectMetadata.detectedProjectName;\n state.projectNameSource = projectMetadata.projectNameSource;\n state.queueTitle = projectMetadata.queueTitle;\n state.updatedAt = now();\n addEvent(state, undefined, \"manual\", `Project title updated to ${projectMetadata.queueTitle}.`);\n await persistState(state);\n }\n if (RUNTIME_CONFIG_SETTING_IDS.has(settingId)) {\n state.config = applyPersistedSettings(state.config, [setting]);\n state.updatedAt = now();\n addEvent(state, undefined, \"manual\", `Runtime setting ${settingId} updated.`);\n await persistState(state);\n }\n return c.json({ ok: true, setting });\n });\n\n app.post(\"/api/config/concurrency\", async (c: any) => {\n const payload = await c.req.json() as JsonRecord;\n const value = typeof payload.concurrency === \"number\" ? payload.concurrency : undefined;\n if (!value || value < 1 || value > 10) {\n return c.json({ ok: false, error: \"concurrency must be between 1 and 10\" }, 400);\n }\n state.config.workerConcurrency = clamp(Math.round(value), 1, 10);\n state.updatedAt = now();\n addEvent(state, undefined, \"manual\", `Worker concurrency updated to ${state.config.workerConcurrency}.`);\n await persistWorkerConcurrencySetting(state.config.workerConcurrency);\n await persistState(state);\n return c.json({ ok: true, workerConcurrency: state.config.workerConcurrency });\n });\n\n app.get(\"/api/config/workflow\", async (c: any) => {\n const settings = await loadRuntimeSettings();\n const saved = getWorkflowConfig(settings);\n const includeDetails = c.req.query(\"details\") === \"1\";\n if (!includeDetails) {\n const providers = detectAvailableProviders();\n const workflow = saved || buildDefaultWorkflowConfig(providers);\n return c.json({ ok: true, workflow, isDefault: !saved });\n }\n const providers = detectAvailableProviders();\n const models = await discoverModels(providers);\n const defaultConfig = buildDefaultWorkflowConfig(providers, models);\n return c.json({ ok: true, workflow: saved || defaultConfig, isDefault: !saved, providers, models });\n });\n\n app.get(\"/api/config/models\", async (c: any) => {\n const providers = detectAvailableProviders();\n const models = await discoverModels(providers);\n return c.json({ ok: true, models });\n });\n\n app.post(\"/api/config/workflow\", async (c: any) => {\n try {\n const payload = await c.req.json() as JsonRecord;\n const workflow = payload.workflow as any;\n if (!workflow?.plan?.provider || !workflow?.execute?.provider || !workflow?.review?.provider) {\n return c.json({ ok: false, error: \"Invalid workflow config. Each stage needs provider, model, and effort.\" }, 400);\n }\n await persistWorkflowConfig(workflow);\n addEvent(state, undefined, \"manual\", `Workflow config updated: plan=${workflow.plan.provider}/${workflow.plan.model}, execute=${workflow.execute.provider}/${workflow.execute.model}, review=${workflow.review.provider}/${workflow.review.model}.`);\n return c.json({ ok: true, workflow });\n } catch (error) {\n return c.json({ ok: false, error: error instanceof Error ? error.message : String(error) }, 500);\n }\n });\n}\n","import { getAnalytics as getTokenAnalytics, getHourlySnapshot } from \"../domains/tokens.ts\";\nimport { getEcDailyEvents, getEcDailyLines } from \"../persistence/store.ts\";\nimport { logger } from \"../concerns/logger.ts\";\nimport { getApiRuntimeContextOrThrow } from \"../persistence/plugins/api-runtime-context.ts\";\n\nexport function registerAnalyticsRoutes(app: any): void {\n app.get(\"/api/analytics/tokens\", async (c: any) => {\n const [tokenData, ecEvents] = await Promise.all([\n Promise.resolve(getTokenAnalytics()),\n getEcDailyEvents(),\n ]);\n // Merge EC daily event counts into the daily token array\n if (ecEvents.length > 0) {\n const eventsByDate = new Map(ecEvents.map((e) => [e.date, e.events]));\n const dateSet = new Set(tokenData.daily.map((d: { date: string }) => d.date));\n const merged = tokenData.daily.map((d: { date: string; events?: number }) => ({\n ...d,\n events: (eventsByDate.get(d.date) || 0) + (d.events || 0),\n }));\n for (const e of ecEvents) {\n if (!dateSet.has(e.date)) {\n merged.push({ date: e.date, inputTokens: 0, outputTokens: 0, totalTokens: 0, events: e.events });\n }\n }\n merged.sort((a: { date: string }, b: { date: string }) => a.date.localeCompare(b.date));\n return c.json({ ok: true, ...tokenData, daily: merged });\n }\n return c.json({ ok: true, ...tokenData });\n });\n\n app.get(\"/api/analytics/tokens/weekly\", async (c: any) => {\n // Weekly is part of the daily data in the ledger — filter client-side\n return c.json({ ok: true, ...getTokenAnalytics() });\n });\n\n app.get(\"/api/analytics/hourly\", async (c: any) => {\n const hours = Math.min(parseInt(c.req.query(\"hours\") || \"24\", 10) || 24, 48);\n return c.json({ ok: true, ...getHourlySnapshot(hours) });\n });\n\n app.get(\"/api/analytics/lines\", async (c: any) => {\n try {\n const days = Math.min(parseInt(c.req.query(\"days\") || \"90\", 10) || 90, 180);\n const lines = await getEcDailyLines(days);\n return c.json({ ok: true, lines });\n } catch (error) {\n logger.error({ err: error }, \"Failed to collect lines analytics\");\n return c.json({ ok: true, lines: [] });\n }\n });\n\n app.get(\"/api/analytics/kpis\", (c: any) => {\n try {\n const context = getApiRuntimeContextOrThrow();\n const doneIssues = context.state.issues.filter(\n (i) => i.state === \"Done\" && i.completedAt,\n );\n\n const msToDay = (ms: number) => ms / (1000 * 60 * 60 * 24);\n const avg = (arr: number[]) =>\n arr.length ? arr.reduce((a, b) => a + b, 0) / arr.length : null;\n const median = (arr: number[]) => {\n if (!arr.length) return null;\n const sorted = [...arr].sort((a, b) => a - b);\n const mid = Math.floor(sorted.length / 2);\n return sorted.length % 2 ? sorted[mid] : (sorted[mid - 1] + sorted[mid]) / 2;\n };\n\n // Code review turnaround: reviewingAt → completedAt\n const reviewMs = doneIssues\n .filter((i) => i.reviewingAt && i.completedAt)\n .map((i) => Date.parse(i.completedAt!) - Date.parse(i.reviewingAt!))\n .filter((ms) => ms > 0);\n\n // PR cycle time: startedAt → completedAt\n const cycleMs = doneIssues\n .filter((i) => i.startedAt && i.completedAt)\n .map((i) => Date.parse(i.completedAt!) - Date.parse(i.startedAt!))\n .filter((ms) => ms > 0);\n\n // PR size: linesAdded + linesRemoved (only issues with diff data)\n const prSizes = doneIssues\n .filter((i) => typeof i.linesAdded === \"number\" || typeof i.linesRemoved === \"number\")\n .map((i) => (i.linesAdded || 0) + (i.linesRemoved || 0));\n\n // Issue cycle time: createdAt → completedAt\n const issueCycleMs = doneIssues\n .filter((i) => i.createdAt && i.completedAt)\n .map((i) => Date.parse(i.completedAt!) - Date.parse(i.createdAt))\n .filter((ms) => ms > 0);\n\n return c.json({\n ok: true,\n sampleSize: doneIssues.length,\n reviewTurnaroundDays: reviewMs.length\n ? { avg: msToDay(avg(reviewMs)!), median: msToDay(median(reviewMs)!), n: reviewMs.length }\n : null,\n prCycleTimeDays: cycleMs.length\n ? { avg: msToDay(avg(cycleMs)!), median: msToDay(median(cycleMs)!), n: cycleMs.length }\n : null,\n prSizeLines: prSizes.length\n ? { avg: avg(prSizes)!, median: median(prSizes)!, n: prSizes.length }\n : null,\n issueCycleTimeDays: issueCycleMs.length\n ? { avg: msToDay(avg(issueCycleMs)!), median: msToDay(median(issueCycleMs)!), n: issueCycleMs.length }\n : null,\n });\n } catch (error) {\n logger.error({ err: error }, \"Failed to compute KPI analytics\");\n return c.json({ ok: false, error: String(error) }, 500);\n }\n });\n}\n","import type { RuntimeState } from \"../types.ts\";\nimport { logger } from \"../concerns/logger.ts\";\nimport { TARGET_ROOT } from \"../concerns/constants.ts\";\nimport { broadcastToWebSocketClients } from \"./websocket.ts\";\nimport { scanProjectFiles, analyzeProjectWithCli } from \"../domains/project.ts\";\n\nexport function registerScanningRoutes(\n app: any,\n state: RuntimeState,\n): void {\n app.get(\"/api/scan/project\", async (c: any) => {\n try {\n const result = scanProjectFiles(TARGET_ROOT);\n return c.json(result);\n } catch (error) {\n logger.error({ err: error }, \"Failed to scan project files\");\n return c.json({ ok: false, error: \"Failed to scan project.\" }, 500);\n }\n });\n\n app.post(\"/api/scan/analyze\", async (c: any) => {\n try {\n const payload = await c.req.json() as { provider?: string };\n const provider = typeof payload.provider === \"string\" ? payload.provider : state.config.agentProvider;\n const result = await analyzeProjectWithCli(provider, TARGET_ROOT);\n return c.json(result);\n } catch (error) {\n logger.error({ err: error }, \"Failed to analyze project with CLI\");\n return c.json({ ok: false, error: \"Failed to analyze project.\" }, 500);\n }\n });\n\n app.post(\"/api/boot/skip-scan\", async (c: any) => {\n broadcastToWebSocketClients({ type: \"boot:scan:skipped\" });\n return c.json({ ok: true, message: \"Scan skipped.\" });\n });\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { logger } from \"../concerns/logger.ts\";\nimport { listReferenceRepositories, collectArtifacts } from \"../domains/project.js\";\n\n// ── Types ────────────────────────────────────────────────────────────────────\n\nexport type AgentCatalogEntry = {\n name: string;\n displayName: string;\n description: string;\n emoji: string;\n domains: string[];\n source: string;\n content: string;\n};\n\nexport type SkillCatalogEntry = {\n name: string;\n displayName: string;\n description: string;\n domains: string[];\n source: string;\n installType: \"reference\" | \"bundled\";\n url?: string;\n content?: string;\n};\n\nexport type InstallResult = {\n installed: string[];\n skipped: string[];\n errors: Array<{ name: string; error: string }>;\n};\n\n// ── Catalog loaders ──────────────────────────────────────────────────────────\n\nfunction parseFrontmatter(content: string): Record<string, string> {\n const match = content.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/);\n if (!match) return {};\n const result: Record<string, string> = {};\n for (const line of match[1].split(\"\\n\")) {\n const idx = line.indexOf(\":\");\n if (idx === -1) continue;\n const key = line.slice(0, idx).trim();\n const value = line.slice(idx + 1).trim().replace(/^[\"']|[\"']$/g, \"\");\n if (key) result[key] = value;\n }\n return result;\n}\n\nexport function loadAgentCatalog(): AgentCatalogEntry[] {\n const entries: AgentCatalogEntry[] = [];\n try {\n const repos = listReferenceRepositories();\n for (const repo of repos) {\n if (!repo.present || !repo.synced) continue;\n const artifacts = collectArtifacts(repo.path, repo.id).filter((a) => a.kind === \"agent\");\n for (const artifact of artifacts) {\n try {\n const content = readFileSync(artifact.sourcePath, \"utf8\");\n const fm = parseFrontmatter(content);\n entries.push({\n name: artifact.targetName,\n displayName: fm.name || artifact.targetName,\n description: fm.description || \"\",\n emoji: fm.emoji || \"\\u{1F916}\",\n domains: fm.domains ? fm.domains.split(\",\").map((d) => d.trim()).filter(Boolean) : [],\n source: repo.id,\n content,\n });\n } catch (err) {\n logger.warn({ err, path: artifact.sourcePath }, \"Failed to read agent file\");\n }\n }\n }\n } catch (error) {\n logger.error({ err: error }, \"Failed to load agent catalog from repositories\");\n }\n return entries;\n}\n\nexport function loadSkillCatalog(): SkillCatalogEntry[] {\n return [];\n}\n\n// ── Filter by domains ────────────────────────────────────────────────────────\n\nexport function filterByDomains<T extends { domains: string[] }>(\n catalog: T[],\n domains: string[],\n): T[] {\n const domainSet = new Set(domains.map((d) => d.toLowerCase().trim()));\n if (domainSet.size === 0) return catalog;\n\n const scored = catalog.map((entry) => {\n const matchCount = entry.domains.filter((d) => domainSet.has(d.toLowerCase())).length;\n return { entry, matchCount };\n });\n\n // Include only entries that match at least one domain, sorted by match count descending\n return scored\n .filter((item) => item.matchCount > 0)\n .sort((a, b) => b.matchCount - a.matchCount)\n .map((item) => item.entry);\n}\n\n// ── Install agents ───────────────────────────────────────────────────────────\n\nexport function installAgents(\n targetRoot: string,\n agentNames: string[],\n catalog: AgentCatalogEntry[],\n): InstallResult {\n const result: InstallResult = { installed: [], skipped: [], errors: [] };\n const catalogMap = new Map(catalog.map((entry) => [entry.name, entry]));\n const agentsDir = join(targetRoot, \".claude\", \"agents\");\n\n // Ensure directory exists\n try {\n mkdirSync(agentsDir, { recursive: true });\n } catch (error) {\n logger.error({ err: error, path: agentsDir }, \"Failed to create agents directory\");\n result.errors.push({ name: \"_directory\", error: `Failed to create ${agentsDir}` });\n return result;\n }\n\n for (const name of agentNames) {\n const entry = catalogMap.get(name);\n if (!entry) {\n result.errors.push({ name, error: \"Agent not found in catalog\" });\n continue;\n }\n\n const filePath = join(agentsDir, `${name}.md`);\n if (existsSync(filePath)) {\n result.skipped.push(name);\n continue;\n }\n\n try {\n writeFileSync(filePath, entry.content, \"utf8\");\n result.installed.push(name);\n logger.info({ agent: name, path: filePath }, \"Agent installed\");\n } catch (error) {\n result.errors.push({\n name,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n return result;\n}\n\n// ── Install skills ───────────────────────────────────────────────────────────\n\nexport function installSkills(\n targetRoot: string,\n skillNames: string[],\n catalog: SkillCatalogEntry[],\n): InstallResult {\n const result: InstallResult = { installed: [], skipped: [], errors: [] };\n const catalogMap = new Map(catalog.map((entry) => [entry.name, entry]));\n const skillsDir = join(targetRoot, \".claude\", \"skills\");\n\n // Ensure directory exists\n try {\n mkdirSync(skillsDir, { recursive: true });\n } catch (error) {\n logger.error({ err: error, path: skillsDir }, \"Failed to create skills directory\");\n result.errors.push({ name: \"_directory\", error: `Failed to create ${skillsDir}` });\n return result;\n }\n\n for (const name of skillNames) {\n const entry = catalogMap.get(name);\n if (!entry) {\n result.errors.push({ name, error: \"Skill not found in catalog\" });\n continue;\n }\n\n const skillDir = join(skillsDir, name);\n const filePath = join(skillDir, \"SKILL.md\");\n if (existsSync(filePath)) {\n result.skipped.push(name);\n continue;\n }\n\n try {\n mkdirSync(skillDir, { recursive: true });\n\n if (entry.installType === \"bundled\" && entry.content) {\n writeFileSync(filePath, entry.content, \"utf8\");\n } else {\n // For reference skills, create a SKILL.md pointing to the external source\n const referenceContent = [\n `# ${entry.displayName}`,\n \"\",\n entry.description,\n \"\",\n `**Source**: ${entry.source}`,\n entry.url ? `**URL**: ${entry.url}` : \"\",\n \"\",\n `> This skill references an external resource. Install it from the source above.`,\n ]\n .filter(Boolean)\n .join(\"\\n\");\n writeFileSync(filePath, referenceContent, \"utf8\");\n }\n\n result.installed.push(name);\n logger.info({ skill: name, path: filePath, type: entry.installType }, \"Skill installed\");\n } catch (error) {\n result.errors.push({\n name,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n return result;\n}\n","import { logger } from \"../concerns/logger.ts\";\nimport { TARGET_ROOT } from \"../concerns/constants.ts\";\nimport {\n loadAgentCatalog,\n loadSkillCatalog,\n filterByDomains,\n installAgents,\n installSkills,\n} from \"../agents/catalog.ts\";\n\nexport function registerCatalogRoutes(app: any): void {\n app.get(\"/api/catalog/agents\", async (c: any) => {\n const domainsParam = c.req.query(\"domains\");\n const domains = typeof domainsParam === \"string\"\n ? domainsParam.split(\",\").map((d: string) => d.trim()).filter(Boolean)\n : [];\n const catalog = loadAgentCatalog();\n return c.json({ agents: domains.length ? filterByDomains(catalog, domains) : catalog });\n });\n\n app.get(\"/api/catalog/skills\", async (c: any) => {\n const catalog = loadSkillCatalog();\n return c.json({ skills: catalog });\n });\n\n app.post(\"/api/install/agents\", async (c: any) => {\n try {\n const payload = await c.req.json() as { agents?: string[] };\n const agentNames = Array.isArray(payload.agents) ? payload.agents.filter((a): a is string => typeof a === \"string\") : [];\n if (agentNames.length === 0) {\n return c.json({ ok: false, error: \"No agent names provided.\" }, 400);\n }\n const catalog = loadAgentCatalog();\n const result = installAgents(TARGET_ROOT, agentNames, catalog);\n return c.json({ ok: true, ...result });\n } catch (error) {\n logger.error({ err: error }, \"Failed to install agents\");\n return c.json({ ok: false, error: \"Failed to install agents.\" }, 500);\n }\n });\n\n app.post(\"/api/install/skills\", async (c: any) => {\n try {\n const payload = await c.req.json() as { skills?: string[] };\n const skillNames = Array.isArray(payload.skills) ? payload.skills.filter((s): s is string => typeof s === \"string\") : [];\n if (skillNames.length === 0) {\n return c.json({ ok: false, error: \"No skill names provided.\" }, 400);\n }\n const catalog = loadSkillCatalog();\n const result = installSkills(TARGET_ROOT, skillNames, catalog);\n return c.json({ ok: true, ...result });\n } catch (error) {\n logger.error({ err: error }, \"Failed to install skills\");\n return c.json({ ok: false, error: \"Failed to install skills.\" }, 500);\n }\n });\n}\n","import { logger } from \"../concerns/logger.ts\";\nimport {\n importReferenceArtifacts,\n listReferenceRepositories,\n syncReferenceRepositories,\n} from \"../domains/project.ts\";\nimport { TARGET_ROOT } from \"../concerns/constants.ts\";\nimport type { ReferenceImportKind } from \"../domains/project.ts\";\n\nfunction normalizeReferenceKind(value: unknown): ReferenceImportKind {\n const normalized = typeof value === \"string\" ? value.trim().toLowerCase() : \"all\";\n if (normalized === \"all\" || normalized === \"\" || typeof value === \"undefined\") {\n return \"all\";\n }\n if (normalized === \"agents\" || normalized === \"agent\") {\n return \"agents\";\n }\n if (normalized === \"skills\" || normalized === \"skill\") {\n return \"skills\";\n }\n throw new Error(`Invalid import kind: ${normalized}`);\n}\n\nexport function registerReferenceRepositoryRoutes(app: any): void {\n app.get(\"/api/reference-repositories\", async (c: any) => {\n const repositories = listReferenceRepositories();\n return c.json({\n ok: true,\n repositories,\n });\n });\n\n app.post(\"/api/reference-repositories/sync\", async (c: any) => {\n try {\n const payload = await c.req.json().catch(() => ({})) as { repository?: string };\n const repository = typeof payload?.repository === \"string\"\n ? payload.repository.trim() || undefined\n : undefined;\n\n const results = syncReferenceRepositories(repository);\n const hasFailed = results.some((item) => item.action === \"failed\");\n return c.json({\n ok: true,\n failed: hasFailed,\n results,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error({ err: error }, \"Failed to sync reference repositories\");\n const status = message.startsWith(\"Unknown reference repository\") ? 400 : 500;\n return c.json({ ok: false, error: message }, status);\n }\n });\n\n app.post(\"/api/reference-repositories/import\", async (c: any) => {\n try {\n const payload = await c.req.json() as {\n repository?: string;\n kind?: unknown;\n overwrite?: boolean;\n dryRun?: boolean;\n global?: boolean;\n };\n\n const repository = typeof payload?.repository === \"string\" ? payload.repository.trim() : \"\";\n if (!repository) {\n return c.json({ ok: false, error: \"repository is required.\" }, 400);\n }\n\n const kind = normalizeReferenceKind(payload?.kind);\n const summary = importReferenceArtifacts(repository, TARGET_ROOT, {\n kind,\n overwrite: payload?.overwrite === true,\n dryRun: payload?.dryRun === true,\n importToGlobal: payload?.global === true,\n });\n\n return c.json({\n ok: true,\n ...summary,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error({ err: error }, \"Failed to import reference repository artifacts\");\n const status = message.startsWith(\"Unknown reference repository\") || message.startsWith(\"Repository not synced\")\n ? 400\n : 500;\n return c.json({ ok: false, error: message }, status);\n }\n });\n}\n","import type { RuntimeState } from \"../types.ts\";\nimport { logger } from \"../concerns/logger.ts\";\nimport { toStringValue } from \"../concerns/helpers.ts\";\nimport { isAgentStillRunning, pushWorktreeBranch } from \"../agents/agent.ts\";\nimport { addEvent } from \"../domains/issues.ts\";\nimport { persistState } from \"../persistence/store.ts\";\nimport { findIssue, listEvents, parseIssue } from \"../routes/helpers.ts\";\nimport { TARGET_ROOT, SOURCE_ROOT, ATTACHMENTS_ROOT } from \"../concerns/constants.ts\";\nimport { execSync } from \"node:child_process\";\nimport {\n appendFileSync,\n closeSync,\n existsSync,\n mkdirSync,\n openSync,\n readFileSync,\n readSync,\n statSync,\n writeFileSync,\n} from \"node:fs\";\nimport { randomUUID } from \"node:crypto\";\nimport { basename, extname, join } from \"node:path\";\nimport { now } from \"../concerns/helpers.ts\";\n\nexport function registerMiscRoutes(\n app: any,\n state: RuntimeState,\n): void {\n app.post(\"/api/issues/:id/push\", async (c: any) => {\n const issueId = parseIssue(c);\n if (!issueId) return c.json({ ok: false, error: \"Issue id is required.\" }, 400);\n const issue = findIssue(state, issueId);\n if (!issue) return c.json({ ok: false, error: \"Issue not found.\" }, 404);\n if (issue.state !== \"Done\") {\n return c.json({ ok: false, error: `Issue ${issue.identifier} must be in Done state to push. Current state: ${issue.state}.` }, 409);\n }\n try {\n const prUrl = pushWorktreeBranch(issue);\n issue.mergedAt = new Date().toISOString();\n addEvent(state, issue.id, \"merge\", `Branch ${issue.branchName} pushed to origin. PR: ${prUrl}`);\n await persistState(state);\n return c.json({ ok: true, prUrl });\n } catch (error) {\n logger.error({ err: error }, `[API] Failed to push branch for ${issueId}`);\n return c.json({ ok: false, error: error instanceof Error ? error.message : String(error) }, 500);\n }\n });\n\n app.get(\"/api/live/:id/stream\", (c: any) => {\n const issueId = parseIssue(c);\n if (!issueId) return c.json({ ok: false, error: \"Issue id is required.\" }, 400);\n const issue = findIssue(state, issueId);\n if (!issue) return c.json({ ok: false, error: \"Issue not found.\" }, 404);\n\n const enc = new TextEncoder();\n const sseMsg = (data: unknown) => enc.encode(`data: ${JSON.stringify(data)}\\n\\n`);\n const sseComment = () => enc.encode(\": keepalive\\n\\n\");\n\n let intervalId: ReturnType<typeof setInterval>;\n let keepaliveId: ReturnType<typeof setInterval>;\n\n const stream = new ReadableStream({\n start(ctrl) {\n // Send initial content\n const wp = issue.workspacePath;\n const liveLog = wp ? `${wp}/live-output.log` : null;\n let lastSize = 0;\n\n if (liveLog && existsSync(liveLog)) {\n try {\n const stat = statSync(liveLog);\n lastSize = stat.size;\n const readSize = Math.min(lastSize, 16_384);\n const fd = openSync(liveLog, \"r\");\n const buf = Buffer.alloc(readSize);\n readSync(fd, buf, 0, readSize, Math.max(0, lastSize - readSize));\n closeSync(fd);\n ctrl.enqueue(sseMsg({ type: \"init\", text: buf.toString(\"utf8\"), size: lastSize }));\n } catch {}\n } else {\n ctrl.enqueue(sseMsg({ type: \"init\", text: \"\", size: 0 }));\n }\n\n // Stream new bytes every second\n intervalId = setInterval(() => {\n const currentIssue = findIssue(state, issueId);\n if (!currentIssue || (currentIssue.state !== \"Running\" && currentIssue.state !== \"Reviewing\" && currentIssue.state !== \"Planning\")) {\n ctrl.enqueue(sseMsg({ type: \"done\", state: currentIssue?.state }));\n clearInterval(intervalId);\n clearInterval(keepaliveId);\n try { ctrl.close(); } catch {}\n return;\n }\n const logPath = currentIssue.workspacePath ? `${currentIssue.workspacePath}/live-output.log` : null;\n if (logPath && existsSync(logPath)) {\n try {\n const stat = statSync(logPath);\n if (stat.size > lastSize) {\n const readSize = stat.size - lastSize;\n const fd = openSync(logPath, \"r\");\n const buf = Buffer.alloc(readSize);\n readSync(fd, buf, 0, readSize, lastSize);\n closeSync(fd);\n lastSize = stat.size;\n ctrl.enqueue(sseMsg({ type: \"chunk\", text: buf.toString(\"utf8\"), size: lastSize }));\n }\n } catch {}\n }\n }, 1_000);\n\n // Keepalive every 15s to prevent proxy timeouts\n keepaliveId = setInterval(() => {\n try { ctrl.enqueue(sseComment()); } catch {}\n }, 15_000);\n },\n cancel() {\n clearInterval(intervalId);\n clearInterval(keepaliveId);\n },\n });\n\n return c.body(stream, 200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n \"Connection\": \"keep-alive\",\n \"X-Accel-Buffering\": \"no\",\n });\n });\n\n app.get(\"/api/live/:id\", async (c: any) => {\n try {\n const issueId = parseIssue(c);\n if (!issueId) return c.json({ ok: false, error: \"Issue id is required.\" }, 400);\n const issue = findIssue(state, issueId);\n if (!issue) return c.json({ ok: false, error: \"Issue not found.\" }, 404);\n\n const parseStartedAt = (value: unknown): number | null => {\n const valueText = typeof value === \"string\" ? value.trim() : \"\";\n if (!valueText) return null;\n const ts = Date.parse(valueText);\n return Number.isFinite(ts) ? ts : null;\n };\n\n const startedAtText = toStringValue(issue.startedAt, \"\");\n const updatedAtText = toStringValue(issue.updatedAt, \"\");\n const startedAtTs = parseStartedAt(startedAtText) ?? parseStartedAt(updatedAtText);\n const elapsed = startedAtTs ? Date.now() - startedAtTs : 0;\n\n const wp = issue.workspacePath;\n const liveLog = wp ? `${wp}/live-output.log` : null;\n let logTail = \"\";\n let logSize = 0;\n if (liveLog && existsSync(liveLog)) {\n try {\n const stat = statSync(liveLog);\n logSize = stat.size;\n // Read last 8KB\n const fd = openSync(liveLog, \"r\");\n const readSize = Math.min(logSize, 8192);\n const buf = Buffer.alloc(readSize);\n readSync(fd, buf, 0, readSize, Math.max(0, logSize - readSize));\n closeSync(fd);\n logTail = buf.toString(\"utf8\");\n } catch {}\n }\n const agentStatus = isAgentStillRunning(issue);\n return c.json({\n ok: true,\n issueId: issue.id,\n state: issue.state,\n running: issue.state === \"Running\" || issue.state === \"Reviewing\",\n agentAlive: agentStatus.alive,\n agentPid: agentStatus.pid?.pid ?? null,\n startedAt: startedAtText || updatedAtText || now(),\n elapsed: Number.isFinite(elapsed) ? elapsed : 0,\n logSize,\n logTail,\n outputTail: issue.commandOutputTail || \"\",\n });\n } catch (error) {\n const issueId = parseIssue(c);\n logger.error(`Failed to load live issue state for ${issueId || \"<unknown>\"}: ${String(error)}`);\n return c.json({ ok: false, error: \"Failed to load live issue state.\" }, 500);\n }\n });\n\n app.get(\"/api/diff/:id\", async (c: any) => {\n try {\n const issueId = parseIssue(c);\n if (!issueId) return c.json({ ok: false, error: \"Issue id is required.\" }, 400);\n const issue = findIssue(state, issueId);\n if (!issue) return c.json({ ok: false, error: \"Issue not found.\" }, 404);\n const wp = issue.workspacePath;\n if (!wp || !existsSync(wp)) {\n return c.json({ ok: true, files: [], diff: \"\", message: \"No workspace found.\" });\n }\n let raw = \"\";\n if (issue.branchName && issue.baseBranch) {\n // Git worktree: proper branch diff\n try {\n raw = execSync(\n `git diff --no-color \"${issue.baseBranch}\"...\"${issue.branchName}\"`,\n { encoding: \"utf8\", maxBuffer: 4 * 1024 * 1024, timeout: 15_000, cwd: TARGET_ROOT, stdio: \"pipe\" },\n );\n } catch (err: any) {\n raw = err.stdout || \"\";\n }\n } else {\n // Legacy: no-index diff between SOURCE_ROOT and workspace\n if (!existsSync(SOURCE_ROOT)) {\n return c.json({ ok: true, files: [], diff: \"\", message: \"Source root not found.\" });\n }\n try {\n raw = execSync(\n `git diff --no-index --no-color -- \"${SOURCE_ROOT}\" \"${wp}\"`,\n { encoding: \"utf8\", maxBuffer: 4 * 1024 * 1024, timeout: 15_000 },\n );\n } catch (err: any) {\n raw = err.stdout || \"\";\n }\n }\n\n if (!raw.trim()) {\n return c.json({ ok: true, files: [], diff: \"\", message: \"No changes\" });\n }\n\n // Clean paths for legacy diff (git worktree diff already uses a/ b/ prefixes)\n let cleaned = raw;\n if (!issue.branchName || !issue.baseBranch) {\n const esc = (s: string) => s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const sourcePrefix = SOURCE_ROOT.endsWith(\"/\") ? SOURCE_ROOT : `${SOURCE_ROOT}/`;\n const wpPrefix = wp.endsWith(\"/\") ? wp : `${wp}/`;\n cleaned = raw\n .replace(new RegExp(esc(wpPrefix), \"g\"), \"b/\")\n .replace(new RegExp(esc(sourcePrefix), \"g\"), \"a/\");\n }\n\n // Split into per-file chunks and filter internals\n const internalRe = /^(fifony[-_]|\\.fifony-|WORKFLOW\\.local)/;\n const chunks = cleaned.split(/(?=^diff --git )/m);\n const filtered = chunks.filter((chunk) => {\n const m = chunk.match(/^diff --git a\\/(.+?) b\\//);\n if (!m) return false;\n const basename = m[1].split(\"/\").pop() || \"\";\n return !internalRe.test(basename);\n });\n\n const diff = filtered.join(\"\").trim();\n\n // Per-file summary (like GitHub PR file list)\n const files = filtered.map((chunk) => {\n const pathMatch = chunk.match(/^diff --git a\\/(.+?) b\\//);\n const path = pathMatch?.[1] || \"unknown\";\n const additions = (chunk.match(/^\\+[^+]/gm) || []).length;\n const deletions = (chunk.match(/^-[^-]/gm) || []).length;\n const isNew = chunk.includes(\"new file mode\");\n const isDeleted = chunk.includes(\"deleted file mode\");\n const status = isNew ? \"added\" : isDeleted ? \"removed\" : \"modified\";\n return { path, status, additions, deletions };\n });\n\n const totalAdditions = files.reduce((s, f) => s + f.additions, 0);\n const totalDeletions = files.reduce((s, f) => s + f.deletions, 0);\n\n return c.json({ ok: true, files, diff, totalAdditions, totalDeletions });\n } catch (error) {\n const issueId = parseIssue(c);\n logger.error(`Failed to load issue diff for ${issueId || \"<unknown>\"}: ${String(error)}`);\n return c.json({ ok: false, error: \"Failed to load issue diff.\" }, 500);\n }\n });\n\n app.get(\"/api/git/status\", async (c: any) => {\n try {\n const isGit = (() => {\n try { execSync(\"git rev-parse --git-dir\", { cwd: TARGET_ROOT, stdio: \"pipe\" }); return true; } catch { return false; }\n })();\n if (!isGit) return c.json({ isGit: false, branch: null, hasCommits: false });\n const branch = (() => {\n try { return execSync(\"git rev-parse --abbrev-ref HEAD\", { cwd: TARGET_ROOT, encoding: \"utf8\", stdio: \"pipe\" }).trim(); } catch { return null; }\n })();\n const hasCommits = (() => {\n try { execSync(\"git rev-parse HEAD\", { cwd: TARGET_ROOT, stdio: \"pipe\" }); return true; } catch { return false; }\n })();\n return c.json({ isGit: true, branch, hasCommits });\n } catch (error) {\n return c.json({ ok: false, error: String(error) }, 500);\n }\n });\n\n app.post(\"/api/git/init\", async (c: any) => {\n try {\n execSync(\"git init\", { cwd: TARGET_ROOT, stdio: \"pipe\" });\n // Create an empty initial commit so HEAD exists and branching works normally\n execSync('git commit --allow-empty -m \"Initial commit\"', { cwd: TARGET_ROOT, stdio: \"pipe\" });\n const branch = execSync(\"git rev-parse --abbrev-ref HEAD\", { cwd: TARGET_ROOT, encoding: \"utf8\", stdio: \"pipe\" }).trim();\n state.config.defaultBranch = branch;\n await persistState(state);\n return c.json({ ok: true, branch });\n } catch (error) {\n return c.json({ ok: false, error: error instanceof Error ? error.message : String(error) }, 500);\n }\n });\n\n app.post(\"/api/git/branch\", async (c: any) => {\n try {\n const { branchName } = await c.req.json() as { branchName?: string };\n if (!branchName || !/^[a-zA-Z0-9/_.-]+$/.test(branchName)) {\n return c.json({ ok: false, error: \"Invalid branch name.\" }, 400);\n }\n execSync(`git checkout -b \"${branchName}\"`, { cwd: TARGET_ROOT, stdio: \"pipe\" });\n state.config.defaultBranch = branchName;\n await persistState(state);\n return c.json({ ok: true, defaultBranch: branchName });\n } catch (error) {\n return c.json({ ok: false, error: error instanceof Error ? error.message : String(error) }, 500);\n }\n });\n\n app.get(\"/api/events/feed\", async (c: any) => {\n const since = c.req.query(\"since\");\n const issueId = c.req.query(\"issueId\");\n const kind = c.req.query(\"kind\");\n const events = await listEvents(state, {\n since: typeof since === \"string\" ? since : undefined,\n issueId: typeof issueId === \"string\" && issueId ? issueId : undefined,\n kind: typeof kind === \"string\" && kind ? kind : undefined,\n });\n return c.json({ events: events.slice(0, 200) });\n });\n\n app.get(\"/api/gitignore/status\", async (c: any) => {\n try {\n const gitignorePath = join(TARGET_ROOT, \".gitignore\");\n if (!existsSync(gitignorePath)) {\n return c.json({ exists: false, hasFifony: false });\n }\n const content = readFileSync(gitignorePath, \"utf-8\");\n const lines = content.split(\"\\n\").map((l: string) => l.trim());\n const hasFifony = lines.some((l: string) => l === \".fifony\" || l === \".fifony/\" || l === \"/.fifony\" || l === \"/.fifony/\");\n return c.json({ exists: true, hasFifony });\n } catch (error) {\n logger.error({ err: error }, \"Failed to check .gitignore\");\n return c.json({ exists: false, hasFifony: false, error: \"Failed to check .gitignore\" }, 500);\n }\n });\n\n app.post(\"/api/gitignore/add\", async (c: any) => {\n try {\n const gitignorePath = join(TARGET_ROOT, \".gitignore\");\n if (!existsSync(gitignorePath)) {\n writeFileSync(gitignorePath, \"# Fifony state directory\\n.fifony/\\n\", \"utf-8\");\n return c.json({ ok: true, created: true });\n }\n const content = readFileSync(gitignorePath, \"utf-8\");\n const lines = content.split(\"\\n\").map((l: string) => l.trim());\n const hasFifony = lines.some((l: string) => l === \".fifony\" || l === \".fifony/\" || l === \"/.fifony\" || l === \"/.fifony/\");\n if (hasFifony) {\n return c.json({ ok: true, alreadyPresent: true });\n }\n const suffix = content.endsWith(\"\\n\") ? \"\" : \"\\n\";\n appendFileSync(gitignorePath, `${suffix}\\n# Fifony state directory\\n.fifony/\\n`, \"utf-8\");\n return c.json({ ok: true, added: true });\n } catch (error) {\n logger.error({ err: error }, \"Failed to update .gitignore\");\n return c.json({ ok: false, error: \"Failed to update .gitignore\" }, 500);\n }\n });\n\n app.post(\"/api/attachments/upload\", async (c: any) => {\n try {\n const payload = await c.req.json() as { files?: Array<{ name: string; data: string; type: string }> };\n if (!Array.isArray(payload.files) || payload.files.length === 0) {\n return c.json({ ok: false, error: \"No files provided.\" }, 400);\n }\n const uploadId = randomUUID();\n const uploadDir = join(ATTACHMENTS_ROOT, \"temp\", uploadId);\n mkdirSync(uploadDir, { recursive: true });\n const paths: string[] = [];\n for (const file of payload.files) {\n if (typeof file.data !== \"string\" || !file.name) continue;\n const safeExt = extname(file.name).replace(/[^a-z0-9.]/gi, \"\").slice(0, 10) || \".bin\";\n const safeName = `${randomUUID()}${safeExt}`;\n const dest = join(uploadDir, safeName);\n writeFileSync(dest, Buffer.from(file.data, \"base64\"));\n paths.push(dest);\n }\n return c.json({ ok: true, paths, uploadId });\n } catch (error) {\n logger.error({ err: error }, \"[API] Attachment upload failed\");\n return c.json({ ok: false, error: error instanceof Error ? error.message : String(error) }, 500);\n }\n });\n}\n","import type {\n RuntimeState,\n RuntimeStateRecord,\n IssueEntry,\n RuntimeEvent,\n RuntimeSettingRecord,\n S3dbModule,\n S3dbDatabase,\n S3dbResource,\n} from \"../types.ts\";\nimport {\n S3DB_DATABASE_PATH,\n S3DB_ISSUE_RESOURCE,\n S3DB_RUNTIME_RECORD_ID,\n S3DB_RUNTIME_SCHEMA_VERSION,\n} from \"../concerns/constants.ts\";\nimport { now, debugBoot, fail } from \"../concerns/helpers.ts\";\nimport { logger } from \"../concerns/logger.ts\";\nimport { computeCapabilityCounts } from \"../domains/metrics.ts\";\nimport { getMetrics } from \"./metrics-cache.ts\";\nimport { clearApiRuntimeContext } from \"../persistence/plugins/api-runtime-context.ts\";\nimport { broadcastToWebSocketClients } from \"../persistence/plugins/api-server.ts\";\nimport { NATIVE_RESOURCE_CONFIGS, NATIVE_RESOURCE_NAMES } from \"./resources/index.ts\";\nimport {\n setIssueStateMachinePlugin,\n setIssueResourceStateApi,\n issueStateMachineConfig,\n ISSUE_STATE_MACHINE_ID,\n} from \"./plugins/issue-state-machine.ts\";\n\nlet loadedS3dbModule: S3dbModule | null = null;\nlet stateDb: S3dbDatabase | null = null;\nlet runtimeStateResource: S3dbResource | null = null;\nlet issueStateResource: S3dbResource | null = null;\nlet issuePlanResource: S3dbResource | null = null;\nlet eventStateResource: S3dbResource | null = null;\nlet settingStateResource: S3dbResource | null = null;\nlet agentSessionResource: S3dbResource | null = null;\nlet agentPipelineResource: S3dbResource | null = null;\nlet activeApiPlugin: { stop?: () => Promise<void> } | null = null;\nlet activeStateMachinePlugin: { stop?: () => Promise<void> } | null = null;\nlet activeEcPlugin: S3dbModule[\"EventualConsistencyPlugin\"] extends new (...a: never[]) => infer R ? R | null : null = null;\n\nimport {\n markIssueDirty,\n markIssuePlanDirty,\n markEventDirty,\n hasDirtyState,\n getDirtyIssueIds,\n getDirtyIssuePlanIds,\n getDirtyEventIds,\n snapshotAndClearDirtyIssueIds,\n snapshotAndClearDirtyIssuePlanIds,\n snapshotAndClearDirtyEventIds,\n markAllIssuesDirty,\n markAllIssuePlansDirty,\n markAllEventsDirty,\n} from \"./dirty-tracker.ts\";\n\nexport { markIssueDirty, markIssuePlanDirty, markEventDirty, hasDirtyState };\n\nexport function getStateDb(): S3dbDatabase | null { return stateDb; }\nexport function getIssueStateResource(): S3dbResource | null { return issueStateResource; }\nexport function getIssuePlanResource(): S3dbResource | null { return issuePlanResource; }\nexport function getEventStateResource(): S3dbResource | null { return eventStateResource; }\nexport function getSettingStateResource(): S3dbResource | null { return settingStateResource; }\nexport function getAgentSessionResource(): S3dbResource | null { return agentSessionResource; }\nexport function getAgentPipelineResource(): S3dbResource | null { return agentPipelineResource; }\nexport function setActiveApiPlugin(plugin: { stop?: () => Promise<void> } | null): void { activeApiPlugin = plugin; }\nlet activeWebSocketPlugin: { stop?: () => Promise<void> } | null = null;\n\nexport async function loadS3dbModule(): Promise<S3dbModule> {\n if (loadedS3dbModule) return loadedS3dbModule;\n\n try {\n const imported = await import(\"s3db.js\");\n const ApiPlugin = await imported.loadApiPlugin();\n\n loadedS3dbModule = {\n S3db: imported.S3db as S3dbModule[\"S3db\"],\n SqliteClient: imported.SqliteClient as S3dbModule[\"SqliteClient\"],\n ApiPlugin: ApiPlugin as S3dbModule[\"ApiPlugin\"],\n WebSocketPlugin: imported.WebSocketPlugin as S3dbModule[\"WebSocketPlugin\"],\n StateMachinePlugin: imported.StateMachinePlugin as S3dbModule[\"StateMachinePlugin\"],\n EventualConsistencyPlugin: imported.EventualConsistencyPlugin as S3dbModule[\"EventualConsistencyPlugin\"],\n S3QueuePlugin: imported.S3QueuePlugin as S3dbModule[\"S3QueuePlugin\"],\n };\n return loadedS3dbModule;\n } catch (error) {\n fail(`Failed to load s3db.js: ${String(error)}`);\n }\n}\n\nexport async function initStateStore(): Promise<void> {\n debugBoot(\"initStateStore:start\");\n const { S3db, SqliteClient, StateMachinePlugin } = await loadS3dbModule();\n debugBoot(\"initStateStore:module-loaded\");\n\n stateDb = new S3db({\n client: new SqliteClient({ basePath: S3DB_DATABASE_PATH }),\n });\n\n await stateDb.connect();\n debugBoot(\"initStateStore:connected\");\n\n for (const resourceConfig of NATIVE_RESOURCE_CONFIGS) {\n await stateDb.createResource(resourceConfig);\n }\n\n if (StateMachinePlugin) {\n const stateMachinePlugin = await stateDb.usePlugin(\n new StateMachinePlugin(issueStateMachineConfig) as unknown,\n \"state-machine\",\n ) as Record<string, unknown>;\n\n activeStateMachinePlugin = stateMachinePlugin as { stop?: () => Promise<void> };\n const bind = (method: unknown) => typeof method === \"function\" ? (method as Function).bind(stateMachinePlugin) : undefined;\n setIssueStateMachinePlugin({\n send: bind(stateMachinePlugin.send),\n getMachineDefinition: bind(stateMachinePlugin.getMachineDefinition),\n getState: bind(stateMachinePlugin.getState),\n initializeEntity: bind(stateMachinePlugin.initializeEntity),\n getValidEvents: bind(stateMachinePlugin.getValidEvents),\n getTransitionHistory: bind(stateMachinePlugin.getTransitionHistory),\n visualize: bind(stateMachinePlugin.visualize),\n waitForPendingEvents: bind(stateMachinePlugin.waitForPendingEvents),\n } as any);\n } else {\n logger.warn(\"StateMachinePlugin not available. Issue transitions will use local logic only.\");\n }\n\n // EventualConsistency plugin for token usage analytics\n const { EventualConsistencyPlugin } = await loadS3dbModule();\n if (EventualConsistencyPlugin) {\n try {\n const ecPlugin = new EventualConsistencyPlugin({\n resources: {\n [S3DB_ISSUE_RESOURCE]: [\n // Per-model totals (dynamic keys: { \"claude-sonnet-4-6\": 12345, \"o4-mini\": 6789 })\n { field: \"usage.tokens\", fieldPath: \"usage.tokens\", initialValue: 0, cohort: { granularity: \"day\" } },\n // Overall volume\n { field: \"tokenUsage.totalTokens\", fieldPath: \"tokenUsage.totalTokens\", initialValue: 0, cohort: { granularity: \"day\" } },\n { field: \"tokenUsage.inputTokens\", fieldPath: \"tokenUsage.inputTokens\", initialValue: 0, cohort: { granularity: \"day\" } },\n { field: \"tokenUsage.outputTokens\", fieldPath: \"tokenUsage.outputTokens\", initialValue: 0, cohort: { granularity: \"day\" } },\n // Per-phase volume\n { field: \"tokensByPhase.planner.totalTokens\", fieldPath: \"tokensByPhase.planner.totalTokens\", initialValue: 0, cohort: { granularity: \"day\" } },\n { field: \"tokensByPhase.executor.totalTokens\", fieldPath: \"tokensByPhase.executor.totalTokens\", initialValue: 0, cohort: { granularity: \"day\" } },\n { field: \"tokensByPhase.reviewer.totalTokens\", fieldPath: \"tokensByPhase.reviewer.totalTokens\", initialValue: 0, cohort: { granularity: \"day\" } },\n // Event count (incremented on each addEvent call for this issue)\n { field: \"eventsCount\", fieldPath: \"eventsCount\", initialValue: 0, cohort: { granularity: \"day\" } },\n // Code churn (set at merge time, accumulated per day)\n { field: \"linesAdded\", fieldPath: \"linesAdded\", initialValue: 0, cohort: { granularity: \"day\" } },\n { field: \"linesRemoved\", fieldPath: \"linesRemoved\", initialValue: 0, cohort: { granularity: \"day\" } },\n { field: \"filesChanged\", fieldPath: \"filesChanged\", initialValue: 0, cohort: { granularity: \"day\" } },\n ],\n },\n enableAnalytics: true,\n analytics: { enabled: true },\n cohort: { granularity: \"day\", timezone: \"UTC\" },\n analyticsConfig: { rollupStrategy: \"incremental\", retentionDays: 90 },\n autoConsolidate: true,\n consolidationInterval: 30_000,\n });\n await stateDb.usePlugin(ecPlugin as unknown, \"eventual-consistency\");\n activeEcPlugin = ecPlugin as typeof activeEcPlugin;\n logger.info(\"EventualConsistency plugin installed for token usage analytics.\");\n } catch (error) {\n logger.warn(`EventualConsistency plugin failed to install: ${String(error)}`);\n }\n }\n\n const [\n runtimeStateResourceName,\n issueResourceName,\n issuePlanResourceName,\n eventResourceName,\n settingResourceName,\n agentSessionResourceName,\n agentPipelineResourceName,\n ] = NATIVE_RESOURCE_NAMES;\n runtimeStateResource = await stateDb.getResource(runtimeStateResourceName);\n issueStateResource = await stateDb.getResource(issueResourceName);\n issuePlanResource = await stateDb.getResource(issuePlanResourceName);\n eventStateResource = await stateDb.getResource(eventResourceName);\n settingStateResource = await stateDb.getResource(settingResourceName);\n agentSessionResource = await stateDb.getResource(agentSessionResourceName);\n agentPipelineResource = await stateDb.getResource(agentPipelineResourceName);\n\n // Capture resource.state API injected by StateMachinePlugin (resource-level shortcuts)\n if (issueStateResource && (issueStateResource as any).state) {\n const stateApi = (issueStateResource as any).state;\n setIssueResourceStateApi({\n send: stateApi.send?.bind(stateApi),\n get: stateApi.get?.bind(stateApi),\n canTransition: stateApi.canTransition?.bind(stateApi),\n history: stateApi.history?.bind(stateApi),\n initialize: stateApi.initialize?.bind(stateApi),\n getValidEvents: stateApi.getValidEvents?.bind(stateApi),\n delete: stateApi.delete?.bind(stateApi),\n });\n debugBoot(\"initStateStore:resource-state-api-bound\");\n }\n\n debugBoot(\"initStateStore:resources-ready\");\n}\n\nexport function isStateNotFoundError(error: unknown): boolean {\n if (error instanceof Error) {\n return /not found|does not exist|no such key/i.test(error.message);\n }\n if (typeof error === \"string\") {\n return /not found|does not exist|no such key/i.test(error);\n }\n return false;\n}\n\nexport async function loadPersistedState(): Promise<RuntimeState | null> {\n if (!runtimeStateResource) {\n logger.debug(\"[Store] No runtime state resource available, skipping load\");\n return null;\n }\n\n logger.debug(\"[Store] Loading persisted state from s3db\");\n try {\n const record = await runtimeStateResource.get(S3DB_RUNTIME_RECORD_ID);\n if (record?.state && typeof record.state === \"object\") {\n const state = record.state as RuntimeState;\n if (Array.isArray(state.issues) && state.issues.length > 0) {\n return state;\n }\n // State blob has no issues — try recovering from individual issue records\n logger.warn(\"Runtime state blob has no issues, attempting recovery from issue resource...\");\n }\n } catch (error) {\n if (!isStateNotFoundError(error)) {\n logger.warn(`Could not load persisted state from s3db (will attempt issue recovery): ${String(error)}`);\n }\n }\n\n // Fallback: recover issues from individual s3db issue records\n return recoverStateFromIssueResource();\n}\n\nasync function recoverStateFromIssueResource(): Promise<RuntimeState | null> {\n if (!issueStateResource) return null;\n\n try {\n const records = await (issueStateResource as any).list({ limit: 500 });\n if (!Array.isArray(records) || records.length === 0) return null;\n\n const issues = records\n .filter((r: any) => r?.id && r?.identifier && r?.state)\n .map((r: any) => r as RuntimeState[\"issues\"][number]);\n\n if (issues.length === 0) return null;\n\n logger.info(`Recovered ${issues.length} issue(s) from s3db issue resource.`);\n\n if (issuePlanResource) {\n for (const issue of issues) {\n try {\n const planRecord = await issuePlanResource.get(issue.id) as Record<string, unknown> | null | undefined;\n if (planRecord?.plan) issue.plan = planRecord.plan as IssueEntry[\"plan\"];\n if (planRecord?.planHistory) issue.planHistory = planRecord.planHistory as IssueEntry[\"planHistory\"];\n } catch {\n // plan may not exist yet — ok\n }\n }\n }\n\n return {\n startedAt: now(),\n updatedAt: now(),\n trackerKind: \"filesystem\",\n sourceRepoUrl: \"\",\n sourceRef: \"workspace\",\n config: {} as any,\n issues,\n events: [],\n metrics: getMetrics(issues),\n notes: [\"State recovered from individual issue records after corruption.\"],\n };\n } catch (error) {\n logger.warn(`Failed to recover issues from s3db: ${String(error)}`);\n return null;\n }\n}\n\nexport async function persistState(state: RuntimeState): Promise<void> {\n state.metrics = {\n ...getMetrics(state.issues),\n activeWorkers: state.metrics.activeWorkers,\n };\n\n if (!runtimeStateResource) return;\n\n // Only write the runtime state blob if something changed\n const dirty = hasDirtyState();\n const dirtyIssueCount = getDirtyIssueIds().size;\n const dirtyEventCount = getDirtyEventIds().size;\n if (dirty || dirtyIssueCount > 0 || dirtyEventCount > 0) {\n logger.debug({ dirty, dirtyIssues: dirtyIssueCount, dirtyEvents: dirtyEventCount }, \"[Store] Persisting state\");\n }\n\n if (dirty) {\n await runtimeStateResource.replace(S3DB_RUNTIME_RECORD_ID, {\n id: S3DB_RUNTIME_RECORD_ID,\n schemaVersion: S3DB_RUNTIME_SCHEMA_VERSION,\n trackerKind: \"filesystem\",\n runtimeTag: \"local-only\",\n updatedAt: now(),\n state,\n } satisfies RuntimeStateRecord);\n }\n\n // Snapshot dirty IDs before iterating to avoid losing IDs added during persist\n const dirtyIssues = issueStateResource ? snapshotAndClearDirtyIssueIds() : new Set<string>();\n if (issueStateResource && dirtyIssues.size > 0) {\n for (const issue of state.issues) {\n if (!dirtyIssues.has(issue.id)) continue;\n // s3db requires valid datetime or undefined — clean empty strings\n // Exclude plan/planHistory — those live in issue_plans resource\n const { plan: _plan, planHistory: _planHistory, ...issueCore } = issue;\n const clean = {\n ...issueCore,\n nextRetryAt: issue.nextRetryAt || undefined,\n startedAt: issue.startedAt || undefined,\n completedAt: issue.completedAt || undefined,\n workspacePreparedAt: issue.workspacePreparedAt || undefined,\n commandExitCode: typeof issue.commandExitCode === \"number\" ? issue.commandExitCode : undefined,\n };\n try {\n await issueStateResource.replace(issue.id, clean);\n } catch (error) {\n logger.warn(`Failed to persist issue ${issue.id}: ${String(error)}`);\n }\n }\n }\n\n const dirtyIssuePlans = issuePlanResource ? snapshotAndClearDirtyIssuePlanIds() : new Set<string>();\n if (issuePlanResource && dirtyIssuePlans.size > 0) {\n for (const issue of state.issues) {\n if (!dirtyIssuePlans.has(issue.id)) continue;\n try {\n await issuePlanResource.replace(issue.id, {\n id: issue.id,\n plan: issue.plan,\n planHistory: issue.planHistory,\n planVersion: issue.planVersion ?? 0,\n });\n } catch (error) {\n logger.warn(`Failed to persist issue plan ${issue.id}: ${String(error)}`);\n }\n }\n }\n\n const dirtyEvents = eventStateResource ? snapshotAndClearDirtyEventIds() : new Set<string>();\n if (eventStateResource && dirtyEvents.size > 0) {\n for (const event of state.events) {\n if (!dirtyEvents.has(event.id)) continue;\n await eventStateResource.replace(event.id, event satisfies RuntimeEvent);\n }\n }\n\n // Push state to connected WebSocket clients\n broadcastToWebSocketClients({\n type: \"state:update\",\n metrics: state.metrics,\n capabilities: computeCapabilityCounts(state.issues),\n issues: state.issues,\n events: state.events.slice(0, 50),\n updatedAt: state.updatedAt,\n });\n}\n\n/** Force persist all issues (used during boot and shutdown). */\nexport async function persistStateFull(state: RuntimeState): Promise<void> {\n markAllIssuesDirty(state.issues.map((i) => i.id));\n markAllIssuePlansDirty(state.issues.map((i) => i.id));\n markAllEventsDirty(state.events.map((e) => e.id));\n await persistState(state);\n}\n\nexport async function loadPersistedSettings(): Promise<RuntimeSettingRecord[]> {\n if (!settingStateResource?.list) return [];\n\n try {\n const records = await settingStateResource.list({ limit: 500 });\n return Array.isArray(records)\n ? records.filter((record): record is RuntimeSettingRecord =>\n Boolean(\n record &&\n typeof record.id === \"string\" &&\n typeof record.scope === \"string\",\n ),\n )\n : [];\n } catch (error) {\n logger.warn(`Failed to load persisted settings from s3db: ${String(error)}`);\n return [];\n }\n}\n\nexport async function replacePersistedSetting(setting: RuntimeSettingRecord): Promise<void> {\n if (!settingStateResource) return;\n await settingStateResource.replace(setting.id, setting);\n}\n\n/**\n * Query EC plugin for daily event counts (sum of eventsCount deltas per day).\n * Returns last N days as { date: \"2026-03-18\", events: 5 }[].\n */\nexport async function getEcDailyEvents(days = 90): Promise<Array<{ date: string; events: number }>> {\n if (!activeEcPlugin?.getLastNDays) return [];\n try {\n const raw = await activeEcPlugin.getLastNDays(S3DB_ISSUE_RESOURCE, \"eventsCount\", days);\n if (!Array.isArray(raw)) return [];\n return raw\n .map((r: unknown) => {\n const rec = r as Record<string, unknown>;\n const date = (rec.date ?? rec.cohort ?? rec.key ?? \"\") as string;\n const events = Number(rec.total ?? rec.value ?? rec.sum ?? rec.count ?? 0);\n return { date: String(date).slice(0, 10), events };\n })\n .filter((e) => e.date && e.events > 0);\n } catch {\n return [];\n }\n}\n\n/**\n * Query EC plugin for daily code churn (linesAdded + linesRemoved + filesChanged per day).\n */\nexport async function getEcDailyLines(days = 90): Promise<Array<{ date: string; linesAdded: number; linesRemoved: number; filesChanged: number }>> {\n if (!activeEcPlugin?.getLastNDays) return [];\n try {\n const [addedRaw, removedRaw, filesRaw] = await Promise.all([\n activeEcPlugin.getLastNDays(S3DB_ISSUE_RESOURCE, \"linesAdded\", days),\n activeEcPlugin.getLastNDays(S3DB_ISSUE_RESOURCE, \"linesRemoved\", days),\n activeEcPlugin.getLastNDays(S3DB_ISSUE_RESOURCE, \"filesChanged\", days),\n ]);\n\n const toMap = (raw: unknown): Map<string, number> => {\n if (!Array.isArray(raw)) return new Map();\n return new Map(\n raw\n .map((r: unknown) => {\n const rec = r as Record<string, unknown>;\n const date = String(rec.date ?? rec.cohort ?? rec.key ?? \"\").slice(0, 10);\n const value = Number(rec.total ?? rec.value ?? rec.sum ?? rec.count ?? 0);\n return [date, value] as [string, number];\n })\n .filter(([date]) => date.length === 10),\n );\n };\n\n const addedMap = toMap(addedRaw);\n const removedMap = toMap(removedRaw);\n const filesMap = toMap(filesRaw);\n const allDates = new Set([...addedMap.keys(), ...removedMap.keys(), ...filesMap.keys()]);\n\n return Array.from(allDates)\n .map((date) => ({\n date,\n linesAdded: addedMap.get(date) ?? 0,\n linesRemoved: removedMap.get(date) ?? 0,\n filesChanged: filesMap.get(date) ?? 0,\n }))\n .filter((e) => e.linesAdded > 0 || e.linesRemoved > 0)\n .sort((a, b) => a.date.localeCompare(b.date));\n } catch {\n return [];\n }\n}\n\nexport async function closeStateStore(): Promise<void> {\n logger.info(\"[Store] Closing state store and plugins\");\n clearApiRuntimeContext();\n\n try {\n const { stopQueueWorkers } = await import(\"./queue-workers.ts\");\n await stopQueueWorkers();\n } catch (error) {\n logger.warn(`Failed to stop queue workers: ${String(error)}`);\n }\n\n if (activeEcPlugin?.stop) {\n try {\n await activeEcPlugin.stop();\n } catch (error) {\n logger.warn(`Failed to stop EventualConsistency plugin: ${String(error)}`);\n } finally {\n activeEcPlugin = null;\n }\n }\n if (activeStateMachinePlugin?.stop) {\n try {\n await activeStateMachinePlugin.stop();\n } catch (error) {\n logger.warn(`Failed to stop StateMachine plugin: ${String(error)}`);\n } finally {\n activeStateMachinePlugin = null;\n setIssueStateMachinePlugin(null);\n setIssueResourceStateApi(null);\n }\n }\n if (activeWebSocketPlugin?.stop) {\n try {\n await activeWebSocketPlugin.stop();\n } catch (error) {\n logger.warn(`Failed to stop WebSocket plugin: ${String(error)}`);\n } finally {\n activeWebSocketPlugin = null;\n }\n }\n if (activeApiPlugin?.stop) {\n try {\n await activeApiPlugin.stop();\n } catch (error) {\n logger.warn(`Failed to stop API plugin: ${String(error)}`);\n } finally {\n activeApiPlugin = null;\n }\n }\n\n if (!stateDb) return;\n\n try {\n await stateDb.disconnect();\n } catch (error) {\n logger.warn(`Failed to close s3db runtime store: ${String(error)}`);\n } finally {\n stateDb = null;\n runtimeStateResource = null;\n issueStateResource = null;\n issuePlanResource = null;\n eventStateResource = null;\n settingStateResource = null;\n agentSessionResource = null;\n agentPipelineResource = null;\n }\n}\n","import { env } from \"node:process\";\nimport type { RuntimeConfig, ReasoningEffort, EffortConfig } from \"../types.ts\";\nimport {\n clamp,\n toStringValue,\n parseEnvNumber,\n parseIntArg,\n parsePositiveIntEnv,\n fail,\n} from \"../concerns/helpers.ts\";\nimport { normalizeAgentProvider } from \"../agents/providers.ts\";\n\nconst VALID_EFFORTS = new Set([\"low\", \"medium\", \"high\", \"extra-high\"]);\n\nfunction parseEffortValue(value: unknown): ReasoningEffort | undefined {\n const str = typeof value === \"string\" ? value.trim().toLowerCase() : \"\";\n return VALID_EFFORTS.has(str) ? (str as ReasoningEffort) : undefined;\n}\n\nexport function parseEffortConfig(value: unknown): EffortConfig | undefined {\n if (!value || typeof value !== \"object\") {\n // Simple string → default effort for all roles\n const simple = parseEffortValue(value);\n return simple ? { default: simple } : undefined;\n }\n const obj = value as Record<string, unknown>;\n const config: EffortConfig = {};\n const d = parseEffortValue(obj.default);\n const p = parseEffortValue(obj.planner);\n const e = parseEffortValue(obj.executor);\n const r = parseEffortValue(obj.reviewer);\n if (d) config.default = d;\n if (p) config.planner = p;\n if (e) config.executor = e;\n if (r) config.reviewer = r;\n return Object.keys(config).length > 0 ? config : undefined;\n}\n\nexport function deriveConfig(args: string[]): RuntimeConfig {\n const parsedConcurrency = parsePositiveIntEnv(\"FIFONY_WORKER_CONCURRENCY\", 3);\n let pollIntervalMs = parseEnvNumber(\"FIFONY_POLL_INTERVAL_MS\", 1200);\n let workerConcurrency = parsedConcurrency;\n let maxAttemptsDefault = parseEnvNumber(\"FIFONY_MAX_ATTEMPTS\", 3);\n let commandTimeoutMs = parseEnvNumber(\"FIFONY_AGENT_TIMEOUT_MS\", 1_800_000);\n\n for (let i = 0; i < args.length; i += 1) {\n const arg = args[i];\n if (arg === \"--poll\") {\n const value = args[i + 1] ?? \"\";\n if (!/^\\d+$/.test(value)) fail(`Invalid value for --poll: ${value}`);\n pollIntervalMs = parseIntArg(value, pollIntervalMs);\n }\n if (arg === \"--concurrency\") {\n const value = args[i + 1] ?? \"\";\n if (!/^\\d+$/.test(value)) fail(`Invalid value for --concurrency: ${value}`);\n workerConcurrency = parseIntArg(value, workerConcurrency);\n }\n if (arg === \"--attempts\") {\n const value = args[i + 1] ?? \"\";\n if (!/^\\d+$/.test(value)) fail(`Invalid value for --attempts: ${value}`);\n maxAttemptsDefault = parseIntArg(value, maxAttemptsDefault);\n }\n if (arg === \"--timeout\") {\n const value = args[i + 1] ?? \"\";\n if (!/^\\d+$/.test(value)) fail(`Invalid value for --timeout: ${value}`);\n commandTimeoutMs = parseIntArg(value, commandTimeoutMs);\n }\n }\n\n return {\n pollIntervalMs: clamp(pollIntervalMs, 200, 10_000),\n workerConcurrency: clamp(workerConcurrency, 1, 10),\n commandTimeoutMs: clamp(commandTimeoutMs, 1_000, 3_600_000),\n maxAttemptsDefault: clamp(maxAttemptsDefault, 1, 10),\n maxTurns: clamp(parseEnvNumber(\"FIFONY_AGENT_MAX_TURNS\", 4), 1, 16),\n retryDelayMs: parseEnvNumber(\"FIFONY_RETRY_DELAY_MS\", 3_000),\n staleInProgressTimeoutMs: parseEnvNumber(\"FIFONY_STALE_IN_PROGRESS_MS\", 2_400_000),\n logLinesTail: parseEnvNumber(\"FIFONY_LOG_TAIL_CHARS\", 12_000),\n maxPreviousOutputChars: parseEnvNumber(\"FIFONY_PREVIOUS_OUTPUT_CHARS\", 20_000),\n agentProvider: normalizeAgentProvider(env.FIFONY_AGENT_PROVIDER ?? \"codex\"),\n agentCommand: toStringValue(env.FIFONY_AGENT_COMMAND, \"\"),\n defaultEffort: {\n default: parseEffortValue(env.FIFONY_REASONING_EFFORT),\n planner: parseEffortValue(env.FIFONY_PLANNER_EFFORT),\n executor: parseEffortValue(env.FIFONY_EXECUTOR_EFFORT),\n reviewer: parseEffortValue(env.FIFONY_REVIEWER_EFFORT),\n },\n maxConcurrentByState: {},\n runMode: \"filesystem\",\n afterCreateHook: env.FIFONY_AFTER_CREATE_HOOK ?? \"\",\n beforeRunHook: env.FIFONY_BEFORE_RUN_HOOK ?? \"\",\n afterRunHook: env.FIFONY_AFTER_RUN_HOOK ?? \"\",\n beforeRemoveHook: env.FIFONY_BEFORE_REMOVE_HOOK ?? \"\",\n };\n}\n\nexport function applyWorkflowConfig(\n config: RuntimeConfig,\n port: number | undefined,\n): RuntimeConfig {\n return {\n ...config,\n dashboardPort: port ? String(port) : config.dashboardPort,\n };\n}\n\nexport function validateConfig(config: RuntimeConfig): string[] {\n const errors: string[] = [];\n if (config.pollIntervalMs < 200) errors.push(`pollIntervalMs too low: ${config.pollIntervalMs} (min 200)`);\n if (config.workerConcurrency < 1 || config.workerConcurrency > 10) errors.push(`workerConcurrency out of range: ${config.workerConcurrency} (1-10)`);\n if (config.maxAttemptsDefault < 1 || config.maxAttemptsDefault > 10) errors.push(`maxAttemptsDefault out of range: ${config.maxAttemptsDefault} (1-10)`);\n if (config.maxTurns < 1 || config.maxTurns > 16) errors.push(`maxTurns out of range: ${config.maxTurns} (1-16)`);\n if (config.commandTimeoutMs < 1000) errors.push(`commandTimeoutMs too low: ${config.commandTimeoutMs} (min 1000)`);\n if (config.retryDelayMs < 0) errors.push(`retryDelayMs negative: ${config.retryDelayMs}`);\n for (const [stateKey, limit] of Object.entries(config.maxConcurrentByState)) {\n if (limit < 1) errors.push(`maxConcurrentByState[${stateKey}] must be >= 1, got ${limit}`);\n }\n return errors;\n}\n","import { markIssueDirty, markEventDirty } from \"../persistence/dirty-tracker.ts\";\nimport { recordEvent as recordLedgerEvent } from \"./tokens.ts\";\nimport type {\n IssueEntry,\n IssueState,\n JsonRecord,\n RuntimeConfig,\n RuntimeEvent,\n RuntimeEventType,\n RuntimeState,\n} from \"../types.ts\";\nimport {\n findIssueStateMachineTransitionPath,\n executeTransition,\n} from \"../persistence/plugins/issue-state-machine.ts\";\nimport {\n ALLOWED_STATES,\n PERSIST_EVENTS_MAX,\n TERMINAL_STATES,\n TARGET_ROOT,\n} from \"../concerns/constants.ts\";\nimport type { ProjectMetadata } from \"./project.ts\";\nimport { resolveProjectMetadata } from \"./project.ts\";\nimport {\n now,\n isoWeek,\n toStringValue,\n toNumberValue,\n toBooleanValue,\n toStringArray,\n clamp,\n normalizeState,\n parseIssueState,\n withRetryBackoff,\n} from \"../concerns/helpers.ts\";\nimport { logger } from \"../concerns/logger.ts\";\nimport {\n getCapabilityRoutingOptions,\n applyCapabilityMetadata,\n} from \"../agents/providers.ts\";\nimport { resolveTaskCapabilities } from \"../routing/capability-resolver.ts\";\nimport { parseEffortConfig } from \"./config.ts\";\nimport { computeMetrics as _computeMetrics } from \"./metrics.ts\";\n\nexport { computeMetrics, computeCapabilityCounts } from \"./metrics.ts\";\nexport { deriveConfig, applyWorkflowConfig, validateConfig } from \"./config.ts\";\n\nexport function normalizeIssue(\n raw: JsonRecord,\n): IssueEntry | null {\n const id = toStringValue(raw.id, \"\");\n if (!id) return null;\n\n const createdAt = toStringValue(raw.created_at, now());\n const updatedAt = toStringValue(raw.updated_at, createdAt);\n const issue: IssueEntry = {\n id,\n identifier: toStringValue(raw.identifier, id),\n title: toStringValue(raw.title, `Issue ${id}`),\n description: toStringValue(raw.description, \"\"),\n priority: toNumberValue(raw.priority, 1),\n state: normalizeState(raw.state, raw.plan && typeof raw.plan === \"object\" ? \"Planned\" : \"Planning\"),\n branchName: toStringValue(raw.branchName) || toStringValue(raw.branch_name),\n url: toStringValue(raw.url),\n assigneeId: toStringValue(raw.assignee_id),\n labels: toStringArray(raw.labels),\n paths: toStringArray(raw.paths),\n inferredPaths: toStringArray(raw.inferredPaths),\n capabilityCategory: toStringValue(raw.capabilityCategory),\n capabilityOverlays: toStringArray(raw.capabilityOverlays),\n capabilityRationale: toStringArray(raw.capabilityRationale),\n blockedBy: toStringArray(raw.blockedBy),\n assignedToWorker: toBooleanValue(raw.assigned_to_worker, true),\n createdAt,\n updatedAt,\n history: [],\n attempts: toNumberValue(raw.attempts, 0),\n maxAttempts: toNumberValue(raw.max_attempts, 3),\n nextRetryAt: toStringValue(raw.next_retry_at),\n planVersion: 0,\n executeAttempt: 0,\n reviewAttempt: 0,\n planHistory: [],\n };\n\n if (!issue.capabilityCategory) {\n applyCapabilityMetadata(issue, resolveTaskCapabilities({\n id: issue.id,\n identifier: issue.identifier,\n title: issue.title,\n description: issue.description,\n labels: issue.labels,\n paths: issue.paths,\n }, getCapabilityRoutingOptions()));\n }\n\n return issue;\n}\n\nexport function nextLocalIssueId(issues: IssueEntry[]): string {\n const maxId = issues.reduce((current, issue) => {\n const match = issue.identifier.match(/^#(\\d+)$/);\n if (!match) return current;\n const parsed = Number.parseInt(match[1], 10);\n return Number.isFinite(parsed) ? Math.max(current, parsed) : current;\n }, 0);\n\n return `#${maxId + 1}`;\n}\n\nexport function createIssueFromPayload(\n payload: JsonRecord,\n issues: IssueEntry[],\n defaultBranch?: string,\n): IssueEntry {\n const identifier = toStringValue(payload.identifier, nextLocalIssueId(issues));\n const id = toStringValue(payload.id, identifier.replace(/^#/, \"issue-\"));\n logger.info({ id, identifier, title: toStringValue(payload.title, \"\").slice(0, 80) }, \"[Issues] Creating new issue\");\n const createdAt = now();\n const blockedBy = toStringArray(payload.blockedBy);\n const paths = toStringArray(payload.paths);\n const images = toStringArray(payload.images);\n const initialState = parseIssueState(payload.state) ?? (payload.plan ? \"Planned\" : \"Planning\");\n\n const issue: IssueEntry = {\n id,\n identifier,\n title: toStringValue(payload.title, `Issue ${identifier}`),\n description: toStringValue(payload.description, \"\"),\n priority: clamp(toNumberValue(payload.priority, 1), 1, 10),\n state: initialState,\n branchName: toStringValue(payload.branchName),\n baseBranch: toStringValue(payload.baseBranch) || defaultBranch,\n url: toStringValue(payload.url),\n assigneeId: toStringValue(payload.assigneeId),\n labels: toStringArray(payload.labels),\n paths,\n inferredPaths: [],\n capabilityCategory: \"\",\n capabilityOverlays: [],\n capabilityRationale: [],\n blockedBy,\n assignedToWorker: true,\n createdAt,\n updatedAt: createdAt,\n history: [`[${createdAt}] Issue created via API.`],\n attempts: 0,\n maxAttempts: clamp(toNumberValue(payload.maxAttempts, 3), 1, 10),\n terminalWeek: \"\",\n images: images.length ? images : undefined,\n issueType: toStringValue(payload.issueType) || undefined,\n effort: parseEffortConfig(payload.effort),\n plan: payload.plan && typeof payload.plan === \"object\" ? payload.plan as IssueEntry[\"plan\"] : undefined,\n planVersion: payload.plan ? 1 : 0,\n executeAttempt: 0,\n reviewAttempt: 0,\n planHistory: [],\n };\n\n // If plan provides suggestions, apply them\n if (issue.plan) {\n if (issue.plan.suggestedPaths?.length && !issue.paths?.length) {\n issue.paths = issue.plan.suggestedPaths;\n }\n if (issue.plan.suggestedLabels?.length && !issue.labels?.length) {\n issue.labels = issue.plan.suggestedLabels;\n }\n if (issue.plan.suggestedEffort && !issue.effort) {\n issue.effort = issue.plan.suggestedEffort;\n }\n }\n\n applyCapabilityMetadata(issue, resolveTaskCapabilities({\n id: issue.id,\n identifier: issue.identifier,\n title: issue.title,\n description: issue.description,\n labels: issue.labels,\n paths: issue.paths,\n }, getCapabilityRoutingOptions()));\n\n return issue;\n}\n\nexport function dedupHistoryEntries(issues: IssueEntry[]): void {\n for (const issue of issues) {\n const seen = new Set<string>();\n issue.history = issue.history.filter((entry) => {\n const key = entry.toLowerCase();\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n }\n}\n\nexport function buildRuntimeState(\n previous: RuntimeState | null,\n config: RuntimeConfig,\n projectMetadata: ProjectMetadata = resolveProjectMetadata([], TARGET_ROOT),\n): RuntimeState {\n const mergedIssues = (previous?.issues ?? [])\n .map((rawIssue) => {\n if (!rawIssue || typeof rawIssue !== \"object\") return null;\n\n const existing = rawIssue as IssueEntry;\n return {\n ...existing,\n id: toStringValue(existing.id, \"\"),\n identifier: toStringValue(existing.identifier, existing.id),\n title: toStringValue(existing.title, `Issue ${toStringValue(existing.identifier, existing.id)}`),\n description: toStringValue(existing.description, \"\"),\n state: normalizeState(existing.state, existing.plan ? \"Planned\" : \"Planning\"),\n paths: toStringArray(existing.paths),\n inferredPaths: toStringArray(existing.inferredPaths),\n labels: toStringArray(existing.labels),\n capabilityOverlays: toStringArray(existing.capabilityOverlays),\n capabilityRationale: toStringArray(existing.capabilityRationale),\n blockedBy: toStringArray(existing.blockedBy).length > 0\n ? toStringArray(existing.blockedBy)\n : toStringArray(existing.blocked_by),\n history: Array.isArray(existing.history) ? existing.history : [],\n attempts: clamp(toNumberValue(existing.attempts, 0), 0, config.maxAttemptsDefault),\n maxAttempts: clamp(toNumberValue(existing.maxAttempts, config.maxAttemptsDefault), 1, config.maxAttemptsDefault),\n nextRetryAt: toStringValue(existing.nextRetryAt),\n updatedAt: toStringValue(existing.updatedAt, now()),\n createdAt: toStringValue(existing.createdAt, now()),\n planVersion: toNumberValue(existing.planVersion, existing.plan ? 1 : 0),\n executeAttempt: toNumberValue(existing.executeAttempt, toNumberValue(existing.attempts, 0)),\n reviewAttempt: toNumberValue(existing.reviewAttempt, toNumberValue(existing.attempts, 0)),\n planHistory: Array.isArray(existing.planHistory) ? existing.planHistory : [],\n };\n })\n .filter((issue): issue is IssueEntry => issue !== null)\n .filter((issue) => issue.id);\n\n // Backfill terminalWeek for existing terminal issues that don't have it\n for (const issue of mergedIssues) {\n if (TERMINAL_STATES.has(issue.state) && !issue.terminalWeek) {\n issue.terminalWeek = isoWeek(issue.completedAt || issue.updatedAt);\n } else if (!TERMINAL_STATES.has(issue.state)) {\n issue.terminalWeek = \"\";\n }\n }\n\n dedupHistoryEntries(mergedIssues);\n\n const metrics = _computeMetrics(mergedIssues);\n\n return {\n startedAt: previous?.startedAt ?? now(),\n updatedAt: now(),\n trackerKind: \"filesystem\",\n sourceRepoUrl: TARGET_ROOT,\n sourceRef: \"workspace\",\n projectName: projectMetadata.projectName,\n detectedProjectName: projectMetadata.detectedProjectName,\n projectNameSource: projectMetadata.projectNameSource,\n queueTitle: projectMetadata.queueTitle,\n config: {\n ...config,\n dashboardPort: previous?.config.dashboardPort,\n },\n issues: mergedIssues,\n events: previous?.events ?? [],\n metrics,\n notes: previous?.notes ?? [\n \"Local TypeScript runtime bootstrapped.\",\n \"Codex-only execution path enabled.\",\n \"No external tracker dependency (filesystem-backed local mode).\",\n ],\n };\n}\n\nexport function addEvent(\n state: RuntimeState,\n issueId: string | undefined,\n kind: RuntimeEventType,\n message: string,\n): void {\n const event: RuntimeEvent = {\n id: `${Date.now()}-${state.events.length + 1}`,\n issueId,\n kind,\n message,\n at: now(),\n };\n\n state.events = [event, ...state.events].slice(0, PERSIST_EVENTS_MAX);\n markEventDirty(event.id);\n\n // Track event in daily ledger for analytics sparkline\n try { recordLedgerEvent(); } catch { /* non-critical */ }\n\n // Increment per-issue event counter (tracked by EventualConsistency plugin for daily analytics)\n if (issueId) {\n const issue = state.issues.find((i) => i.id === issueId);\n if (issue) {\n issue.eventsCount = (issue.eventsCount || 0) + 1;\n markIssueDirty(issue.id);\n }\n }\n\n logger.info({ issueId, kind }, message);\n}\n\n/**\n * Transition an issue via the unified FSM. This is the single public API.\n * The plugin handles guards, entry actions, dirty tracking, events, and enqueue.\n */\nexport async function transitionIssue(\n issue: IssueEntry,\n event: string,\n context: Record<string, unknown> = {},\n): Promise<void> {\n logger.debug({ issueId: issue.id, identifier: issue.identifier, from: issue.state, event, context }, \"[State] Issue transition\");\n await executeTransition(issue, event, { ...context, issue });\n}\n\nexport function issueDependenciesResolved(issue: IssueEntry, allIssues: IssueEntry[]): boolean {\n if (issue.blockedBy.length === 0) return true;\n const map = new Map(allIssues.map((entry) => [entry.id, entry]));\n return issue.blockedBy.every((dependencyId) => {\n const dep = map.get(dependencyId);\n return dep?.state === \"Done\";\n });\n}\n\nexport function getNextRetryAt(issue: IssueEntry, baseMs: number): string {\n const nextAttempt = issue.attempts + 1;\n const nextDelay = withRetryBackoff(nextAttempt, baseMs);\n return new Date(Date.now() + nextDelay).toISOString();\n}\n\nexport async function handleStatePatch(state: RuntimeState, issue: IssueEntry, payload: JsonRecord): Promise<void> {\n const nextState = parseIssueState(payload.state);\n if (!nextState || !ALLOWED_STATES.includes(nextState)) {\n throw new Error(`Unsupported state: ${String(payload.state)}`);\n }\n\n // Find the FSM event path from current state to target\n const path = findIssueStateMachineTransitionPath(null, issue.state, nextState);\n if (!path || path.length === 0) {\n throw new Error(`No valid transition from '${issue.state}' to '${nextState}' for issue ${issue.id}.`);\n }\n\n // Execute each event in the path\n for (const event of path) {\n await transitionIssue(issue, event, { note: `Manual state update: ${nextState}`, reason: toStringValue(payload.reason) });\n }\n\n if (nextState === \"Planned\") {\n issue.nextRetryAt = undefined;\n issue.lastError = undefined;\n }\n if (nextState === \"Cancelled\") {\n issue.lastError = toStringValue(payload.reason);\n }\n\n addEvent(state, issue.id, \"manual\", `Manual state transition to ${nextState}`);\n}\n"],"mappings":"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","names":["existsSync","mkdirSync","readFileSync","writeFileSync","join","execSync","now","spawn","existsSync","mkdirSync","mkdtempSync","readdirSync","readFileSync","rmSync","writeFileSync","homedir","tmpdir","basename","dirname","join","resolve","env","existsSync","readFileSync","existsSync","readFileSync","join","agentSessionResource","record","agentPipelineResource","writeFileSync","join","join","join","existsSync","readFileSync","join","join","writeFileSync","record","existsSync","join","join","existsSync","context","existsSync","readFileSync","readdirSync","join","homedir","homedir","join","existsSync","readdirSync","now","readFileSync","existsSync","mkdirSync","writeFileSync","execSync","basename","join","existsSync","existsSync","execSync","join","mkdirSync","writeFileSync","basename","existsSync","readFileSync","record","writeFileSync","join","rmSync","mkdirSync","writeFileSync","join","join","mkdirSync","writeFileSync","resolve","join","writeFileSync","rmSync","writeFileSync","join","mkdtempSync","rmSync","tmpdir","mkdtempSync","join","tmpdir","writeFileSync","rmSync","durationMs","addEvent","persistState","env","existsSync","mkdtempSync","readFileSync","rmSync","writeFileSync","spawn","tmpdir","join","buildPrompt","context","resolve","providers","context","existsSync","mkdirSync","readFileSync","writeFileSync","join","readFileSync","join","mkdirSync","existsSync","writeFileSync","execSync","existsSync","mkdirSync","readFileSync","writeFileSync","randomUUID","extname","join","existsSync","execSync","basename","join","readFileSync","writeFileSync","randomUUID","mkdirSync","extname","stateDb","existsSync","readFileSync","record","basename","existsSync","join","readdirSync","readFileSync","record","mkdtempSync","join","tmpdir","writeFileSync","env","resolve","spawn","rmSync","homedir","readdirSync","readFileSync","dirname","basename","existsSync","name","mkdirSync","env","env","context","join","mkdirSync","writeFileSync","execSync","existsSync","readFileSync","getIssueStateResource"]}