issue-flow 0.15.0 → 0.16.0
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.
- package/dist/{agent-AT64RXTA.js → agent-PMWCDWOW.js} +12 -12
- package/dist/{analyze-O2PYDIFK.js → analyze-556KCJKZ.js} +20 -20
- package/dist/{apply-SSU6QCD4.js → apply-WVV7G7WN.js} +12 -12
- package/dist/{bench-ODFPAGW6.js → bench-UBFGKUHR.js} +18 -18
- package/dist/{chunk-KAHQ6F5C.js → chunk-2H43OVTU.js} +11 -11
- package/dist/{chunk-PCN7ZQND.js → chunk-4FUWWBTP.js} +6 -6
- package/dist/{chunk-5ZKBIXET.js → chunk-73TS2H42.js} +14 -14
- package/dist/{chunk-XLVGPXNL.js → chunk-AOAQU7PD.js} +2 -2
- package/dist/{chunk-6E2PEBFT.js → chunk-BSBJXPLC.js} +8 -8
- package/dist/chunk-C5TL7T4V.js +27 -0
- package/dist/chunk-C5TL7T4V.js.map +1 -0
- package/dist/{chunk-QRCGW2ZO.js → chunk-DBEMD34J.js} +6 -6
- package/dist/{chunk-FK4IDY6P.js → chunk-EPFC4LHT.js} +9 -9
- package/dist/{chunk-AYYMW33T.js → chunk-FKWYD44M.js} +2 -2
- package/dist/{chunk-RWEXK55D.js → chunk-G5LACAXO.js} +2 -2
- package/dist/{chunk-TBDP6QPJ.js → chunk-GPLP7EPL.js} +6 -6
- package/dist/{chunk-ARWNYXFL.js → chunk-GV2DABNZ.js} +12 -12
- package/dist/{chunk-XQHFC62U.js → chunk-GVOZ6NDO.js} +2 -2
- package/dist/{chunk-F4OK7KEP.js → chunk-H3EYBJZU.js} +7 -7
- package/dist/{chunk-3BWZO4YI.js → chunk-IAMIBZRF.js} +2 -2
- package/dist/{chunk-WM3Y7Q4A.js → chunk-J2LJB2OH.js} +10 -10
- package/dist/{chunk-MEFY4B7T.js → chunk-KV2K7MK2.js} +9 -9
- package/dist/{chunk-XG2NYDRA.js → chunk-MCLPSL6B.js} +3 -3
- package/dist/{chunk-ZXPASFHG.js → chunk-MXCOSPLJ.js} +2 -2
- package/dist/{chunk-MROS3SKL.js → chunk-NQCR3HSU.js} +3 -3
- package/dist/{chunk-2ZAM45PZ.js → chunk-OGN2NX57.js} +9 -9
- package/dist/{chunk-A35HE4V7.js → chunk-OGVWJO4S.js} +3 -3
- package/dist/{chunk-HGSYD57B.js → chunk-OLUOZLU5.js} +32 -28
- package/dist/chunk-OLUOZLU5.js.map +1 -0
- package/dist/{chunk-6SRE4KD7.js → chunk-OOX3RMD3.js} +4 -4
- package/dist/{chunk-6FXOU2KR.js → chunk-PGN2VX4Y.js} +6 -6
- package/dist/{chunk-XRLRKTQA.js → chunk-Q2TZA6AC.js} +11 -11
- package/dist/{chunk-XDKGA6UX.js → chunk-QVLIIGBU.js} +5 -2
- package/dist/chunk-QVLIIGBU.js.map +1 -0
- package/dist/{chunk-MGCOQU6N.js → chunk-QZOBR6YF.js} +4 -4
- package/dist/{chunk-UNQYMR3H.js → chunk-R42YHLDV.js} +2 -2
- package/dist/{chunk-6QYMSNVA.js → chunk-ROIIEVZH.js} +3 -2
- package/dist/chunk-ROIIEVZH.js.map +1 -0
- package/dist/{chunk-NVZMBXTE.js → chunk-SVDEWOUD.js} +4 -4
- package/dist/{chunk-ZFIXEYUJ.js → chunk-SW2MF47D.js} +26 -14
- package/dist/chunk-SW2MF47D.js.map +1 -0
- package/dist/{chunk-ZPIVCM7Q.js → chunk-VK65RNFA.js} +3 -3
- package/dist/{chunk-VR34TXHF.js → chunk-VTF4RWS5.js} +6 -6
- package/dist/{chunk-4RXYFWP7.js → chunk-WLJVL25O.js} +4 -4
- package/dist/{chunk-GSZCQUCY.js → chunk-WNROH2YE.js} +2 -2
- package/dist/{chunk-RPXDBX6R.js → chunk-X6GY3CM2.js} +3 -3
- package/dist/{chunk-BMHGRYL6.js → chunk-YA6FWFYW.js} +22 -21
- package/dist/chunk-YA6FWFYW.js.map +1 -0
- package/dist/cli.js +46 -45
- package/dist/cli.js.map +1 -1
- package/dist/{config-UMP6DBJB.js → config-UE7IP36J.js} +11 -11
- package/dist/{conventions-DKH7AE4T.js → conventions-Z3QC2NSG.js} +13 -13
- package/dist/{diagnostics-GOGCLTRS.js → diagnostics-2Z5HFQOO.js} +6 -6
- package/dist/execute-QYLJ5L4T.js +36 -0
- package/dist/{generate-AGBT7EHX.js → generate-PB4L7V5N.js} +20 -20
- package/dist/{git-AC542GU2.js → git-7MUOGVRG.js} +2 -2
- package/dist/init-XBERAZ4O.js +24 -0
- package/dist/{operations-JQYK2EMT.js → operations-QDJAFZUN.js} +13 -13
- package/dist/{permissions-6HL52K54.js → permissions-XVXXENVP.js} +3 -3
- package/dist/plan-RXOW32KY.js +34 -0
- package/dist/{policy-IMRXGG7X.js → policy-6WQZB6B2.js} +12 -12
- package/dist/pr-3WFYAVA7.js +39 -0
- package/dist/pr-review-RK63ZEMM.js +32 -0
- package/dist/prd-LRV6IW3E.js +33 -0
- package/dist/{ps-KUUZ6TUL.js → ps-CX7756QG.js} +10 -10
- package/dist/{recorder-BJ2KIAWT.js → recorder-RK6XZYF3.js} +5 -5
- package/dist/{registry-SB7XTMGE.js → registry-POSB35Q4.js} +5 -5
- package/dist/{resume-QNLQSCR5.js → resume-OQJZV3JH.js} +37 -36
- package/dist/{resume-QNLQSCR5.js.map → resume-OQJZV3JH.js.map} +1 -1
- package/dist/review-AEFISJZD.js +35 -0
- package/dist/{routing-TN7GLMGU.js → routing-EA5NJGNU.js} +12 -12
- package/dist/run-HSC7R33Y.js +55 -0
- package/dist/{session-publisher-T7EI3CIP.js → session-publisher-VVXOCJ2S.js} +2 -2
- package/dist/{state-manager-ZEPWTCA6.js → state-manager-TIC73GQY.js} +3 -3
- package/dist/{usage-QL563I7F.js → usage-WDDNSIHP.js} +10 -10
- package/dist/{web-PPSMNTQ6.js → web-IPGY52AK.js} +17 -16
- package/dist/{web-PPSMNTQ6.js.map → web-IPGY52AK.js.map} +1 -1
- package/package.json +1 -1
- package/web/AGENTS.md +5 -0
- package/web/public/app.css +13 -0
- package/web/public/app.js +48 -0
- package/web/public/index.html +6 -2
- package/dist/chunk-6QYMSNVA.js.map +0 -1
- package/dist/chunk-BMHGRYL6.js.map +0 -1
- package/dist/chunk-HGSYD57B.js.map +0 -1
- package/dist/chunk-XDKGA6UX.js.map +0 -1
- package/dist/chunk-ZFIXEYUJ.js.map +0 -1
- package/dist/execute-E3BRMDAQ.js +0 -35
- package/dist/init-LLBVJNPE.js +0 -24
- package/dist/plan-HSLWDJEZ.js +0 -34
- package/dist/pr-6TCZXG6K.js +0 -39
- package/dist/pr-review-6MWJO2NP.js +0 -32
- package/dist/prd-D6YDYAFX.js +0 -33
- package/dist/review-3KJ4BH2V.js +0 -35
- package/dist/run-5EHIFF2V.js +0 -54
- /package/dist/{agent-AT64RXTA.js.map → agent-PMWCDWOW.js.map} +0 -0
- /package/dist/{analyze-O2PYDIFK.js.map → analyze-556KCJKZ.js.map} +0 -0
- /package/dist/{apply-SSU6QCD4.js.map → apply-WVV7G7WN.js.map} +0 -0
- /package/dist/{bench-ODFPAGW6.js.map → bench-UBFGKUHR.js.map} +0 -0
- /package/dist/{chunk-KAHQ6F5C.js.map → chunk-2H43OVTU.js.map} +0 -0
- /package/dist/{chunk-PCN7ZQND.js.map → chunk-4FUWWBTP.js.map} +0 -0
- /package/dist/{chunk-5ZKBIXET.js.map → chunk-73TS2H42.js.map} +0 -0
- /package/dist/{chunk-XLVGPXNL.js.map → chunk-AOAQU7PD.js.map} +0 -0
- /package/dist/{chunk-6E2PEBFT.js.map → chunk-BSBJXPLC.js.map} +0 -0
- /package/dist/{chunk-QRCGW2ZO.js.map → chunk-DBEMD34J.js.map} +0 -0
- /package/dist/{chunk-FK4IDY6P.js.map → chunk-EPFC4LHT.js.map} +0 -0
- /package/dist/{chunk-AYYMW33T.js.map → chunk-FKWYD44M.js.map} +0 -0
- /package/dist/{chunk-RWEXK55D.js.map → chunk-G5LACAXO.js.map} +0 -0
- /package/dist/{chunk-TBDP6QPJ.js.map → chunk-GPLP7EPL.js.map} +0 -0
- /package/dist/{chunk-ARWNYXFL.js.map → chunk-GV2DABNZ.js.map} +0 -0
- /package/dist/{chunk-XQHFC62U.js.map → chunk-GVOZ6NDO.js.map} +0 -0
- /package/dist/{chunk-F4OK7KEP.js.map → chunk-H3EYBJZU.js.map} +0 -0
- /package/dist/{chunk-3BWZO4YI.js.map → chunk-IAMIBZRF.js.map} +0 -0
- /package/dist/{chunk-WM3Y7Q4A.js.map → chunk-J2LJB2OH.js.map} +0 -0
- /package/dist/{chunk-MEFY4B7T.js.map → chunk-KV2K7MK2.js.map} +0 -0
- /package/dist/{chunk-XG2NYDRA.js.map → chunk-MCLPSL6B.js.map} +0 -0
- /package/dist/{chunk-ZXPASFHG.js.map → chunk-MXCOSPLJ.js.map} +0 -0
- /package/dist/{chunk-MROS3SKL.js.map → chunk-NQCR3HSU.js.map} +0 -0
- /package/dist/{chunk-2ZAM45PZ.js.map → chunk-OGN2NX57.js.map} +0 -0
- /package/dist/{chunk-A35HE4V7.js.map → chunk-OGVWJO4S.js.map} +0 -0
- /package/dist/{chunk-6SRE4KD7.js.map → chunk-OOX3RMD3.js.map} +0 -0
- /package/dist/{chunk-6FXOU2KR.js.map → chunk-PGN2VX4Y.js.map} +0 -0
- /package/dist/{chunk-XRLRKTQA.js.map → chunk-Q2TZA6AC.js.map} +0 -0
- /package/dist/{chunk-MGCOQU6N.js.map → chunk-QZOBR6YF.js.map} +0 -0
- /package/dist/{chunk-UNQYMR3H.js.map → chunk-R42YHLDV.js.map} +0 -0
- /package/dist/{chunk-NVZMBXTE.js.map → chunk-SVDEWOUD.js.map} +0 -0
- /package/dist/{chunk-ZPIVCM7Q.js.map → chunk-VK65RNFA.js.map} +0 -0
- /package/dist/{chunk-VR34TXHF.js.map → chunk-VTF4RWS5.js.map} +0 -0
- /package/dist/{chunk-4RXYFWP7.js.map → chunk-WLJVL25O.js.map} +0 -0
- /package/dist/{chunk-GSZCQUCY.js.map → chunk-WNROH2YE.js.map} +0 -0
- /package/dist/{chunk-RPXDBX6R.js.map → chunk-X6GY3CM2.js.map} +0 -0
- /package/dist/{config-UMP6DBJB.js.map → config-UE7IP36J.js.map} +0 -0
- /package/dist/{conventions-DKH7AE4T.js.map → conventions-Z3QC2NSG.js.map} +0 -0
- /package/dist/{diagnostics-GOGCLTRS.js.map → diagnostics-2Z5HFQOO.js.map} +0 -0
- /package/dist/{execute-E3BRMDAQ.js.map → execute-QYLJ5L4T.js.map} +0 -0
- /package/dist/{generate-AGBT7EHX.js.map → generate-PB4L7V5N.js.map} +0 -0
- /package/dist/{git-AC542GU2.js.map → git-7MUOGVRG.js.map} +0 -0
- /package/dist/{init-LLBVJNPE.js.map → init-XBERAZ4O.js.map} +0 -0
- /package/dist/{operations-JQYK2EMT.js.map → operations-QDJAFZUN.js.map} +0 -0
- /package/dist/{permissions-6HL52K54.js.map → permissions-XVXXENVP.js.map} +0 -0
- /package/dist/{plan-HSLWDJEZ.js.map → plan-RXOW32KY.js.map} +0 -0
- /package/dist/{policy-IMRXGG7X.js.map → policy-6WQZB6B2.js.map} +0 -0
- /package/dist/{pr-6TCZXG6K.js.map → pr-3WFYAVA7.js.map} +0 -0
- /package/dist/{pr-review-6MWJO2NP.js.map → pr-review-RK63ZEMM.js.map} +0 -0
- /package/dist/{prd-D6YDYAFX.js.map → prd-LRV6IW3E.js.map} +0 -0
- /package/dist/{ps-KUUZ6TUL.js.map → ps-CX7756QG.js.map} +0 -0
- /package/dist/{recorder-BJ2KIAWT.js.map → recorder-RK6XZYF3.js.map} +0 -0
- /package/dist/{registry-SB7XTMGE.js.map → registry-POSB35Q4.js.map} +0 -0
- /package/dist/{review-3KJ4BH2V.js.map → review-AEFISJZD.js.map} +0 -0
- /package/dist/{routing-TN7GLMGU.js.map → routing-EA5NJGNU.js.map} +0 -0
- /package/dist/{run-5EHIFF2V.js.map → run-HSC7R33Y.js.map} +0 -0
- /package/dist/{session-publisher-T7EI3CIP.js.map → session-publisher-VVXOCJ2S.js.map} +0 -0
- /package/dist/{state-manager-ZEPWTCA6.js.map → state-manager-TIC73GQY.js.map} +0 -0
- /package/dist/{usage-QL563I7F.js.map → usage-WDDNSIHP.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/agents/types.ts","../src/policy/schemas.ts","../src/schemas.ts","../src/agents/schemas.ts","../src/storage/schemas.ts","../src/storage/lock.ts"],"sourcesContent":["/**\n * The agent layer: a swappable runner inside `runHeadless` / `executeClaude`.\n *\n * The pipeline still talks to those two facades. What changes is the binary\n * they spawn and how its stream is read. Defaults stay Claude, and an\n * unconfigured invocation produces the same argv the project has always used.\n */\n\nimport type { ClaudeUsage } from '../core/metrics.js';\n\n/** Providers the pipeline can invoke. A fifth would add a file, not a refactor. */\nexport type AgentProviderId = 'claude' | 'codex' | 'cursor' | 'antigravity';\n\n/** The eight invocations that actually call an agent. `init` is not one of them. */\nexport type AgentPhase =\n | 'analyze'\n | 'generate'\n | 'prd'\n | 'plan'\n | 'execute'\n | 'review'\n | 'pr'\n | 'pr-review';\n\nexport const AGENT_PHASES: readonly AgentPhase[] = [\n 'analyze',\n 'generate',\n 'prd',\n 'plan',\n 'execute',\n 'review',\n 'pr',\n 'pr-review',\n] as const;\n\nexport function isAgentPhase(value: string): value is AgentPhase {\n return (AGENT_PHASES as readonly string[]).includes(value);\n}\n\nexport function isAgentProviderId(value: string): value is AgentProviderId {\n return value === 'claude' || value === 'codex' || value === 'cursor' || value === 'antigravity';\n}\n\n/**\n * Semantic permission of an invocation, translated by each runner.\n *\n * read-only — phases that only inspect (analyze, review, pr-review)\n * workspace — phases that write artifacts (generate, prd, plan, pr)\n * autonomous — the execute loop\n */\nexport type AgentPermission = 'read-only' | 'workspace' | 'autonomous';\n\n/** Default permission of each phase. Analyze writes `analysis.md` via a\n * fallback when the agent cannot write, so it stays in the issue's read-only\n * set: the agent is asked not to mutate the project, and the command writes\n * the artifact itself when needed. */\nexport const DEFAULT_PHASE_PERMISSION: Record<AgentPhase, AgentPermission> = {\n analyze: 'read-only',\n generate: 'workspace',\n prd: 'workspace',\n plan: 'workspace',\n execute: 'autonomous',\n review: 'read-only',\n pr: 'workspace',\n 'pr-review': 'read-only',\n};\n\n/** Token/cost metrics. Alias of the existing Claude shape so no import breaks. */\nexport type AgentUsage = ClaudeUsage;\n\nexport type AgentEvent =\n | { kind: 'text'; text: string }\n | { kind: 'tool'; name: string; detail?: string };\n\n/**\n * What a runner needs to execute one invocation.\n *\n * `onLine` is the watchdog heartbeat: a process writing anything is a process\n * that is alive, including a malformed line. `onEvent` is the normalised\n * stream the UI already consumes.\n */\nexport interface AgentInvocation {\n prompt: string;\n phase: AgentPhase;\n workingDirectory?: string;\n addDirs?: string[];\n /** ms; 0 = no limit (the execute loop). */\n timeout: number;\n permission: AgentPermission;\n maxTurns?: number;\n allowedTools?: string[];\n onEvent?: (event: AgentEvent) => void;\n onLine?: (line: string) => void;\n /**\n * Silence tolerated before the agent is considered stuck. Absent or `0`\n * disables the watchdog — verbose headless never had one.\n */\n inactivityTimeoutMs?: number;\n /** Pin this invocation to a provider (L2 reviewer). Skips failover. */\n forceProvider?: AgentProviderId;\n /** Telemetry purpose when it is not the phase name (`verify`). */\n purpose?: 'verify';\n /** Observability context; it never changes provider behaviour or prompt contents. */\n iteration?: number;\n correctionCycle?: number;\n storyIds?: string[];\n}\n\nexport interface AgentRunResult {\n success: boolean;\n result: string;\n /** Combined raw output, for `isTransientFailure()` / `trimErrorMessage()`. */\n rawOutput: string;\n exitCode: number;\n usage: AgentUsage | null;\n error: string | null;\n /** Who actually ran — never inferred afterwards. */\n agent: { provider: AgentProviderId; model: string | null };\n sessionId?: string;\n /** Captured at invocation time and cached per process. */\n harnessVersion?: string | null;\n}\n\n/**\n * What a runner can do. Declared so a fourth provider adds a file, not a\n * refactor. The core asks \"does this invocation need extraDirectories?\",\n * never \"which provider is this?\".\n */\nexport interface AgentCapabilities {\n /** Extra directories beyond the workspace. `flag` is `--add-dir`. */\n extraDirectories: 'flag' | 'permission-file' | 'none';\n /** Convenience: `extraDirectories === 'flag'`. */\n addDirs: boolean;\n toolAllowlist: boolean;\n maxTurns: boolean;\n osSandbox: boolean;\n modelSelection: boolean;\n modelDiscovery: boolean;\n usage: 'tokens-and-cost' | 'tokens-only' | 'none';\n reportsUsage: boolean;\n reportsCost: boolean;\n sessionResume: boolean;\n /** How the auth probe is interpreted. Cursor's `status` exits 0 while logged out. */\n authProbe: 'exit-code' | 'text' | 'none';\n bareModelAliases: boolean;\n promptChannel: 'argv' | 'stdin' | 'both';\n nativeTimeout: boolean;\n contextFileName: string;\n contextFileMaxBytes: number | null;\n toolNameCase: 'CamelCase' | 'lowercase' | 'none';\n readOnlyMode: 'native' | 'sandbox' | 'tool-allowlist' | 'none';\n}\n\nexport type CodexSandbox = 'read-only' | 'workspace-write' | 'danger-full-access';\nexport type CodexReasoningEffort = 'minimal' | 'low' | 'medium' | 'high' | 'xhigh';\n\nexport interface ClaudeSettings {\n ignoreUserConfig?: boolean;\n /** Companion of `ignoreUserConfig`. Escape: `false` keeps user MCP servers. */\n strictMcpConfig?: boolean;\n}\n\nexport interface CodexSettings {\n reasoningEffort?: CodexReasoningEffort;\n sandbox?: CodexSandbox;\n ignoreUserConfig?: boolean;\n skipGitRepoCheck?: boolean;\n configOverrides?: Record<string, string | number | boolean>;\n}\n\nexport type CursorSandbox = 'enabled' | 'disabled';\nexport type CursorPermissionsFile = 'global' | 'project' | 'none';\n\nexport interface CursorSettings {\n sandbox?: CursorSandbox;\n approveMcps?: boolean;\n permissionsFile?: CursorPermissionsFile;\n minVersion?: string;\n}\n\nexport type AntigravityEffort = 'low' | 'medium' | 'high';\n\nexport interface AntigravitySettings {\n effort?: AntigravityEffort;\n sandbox?: boolean;\n /** Ceiling used when `timeout === 0`. `null` / `0` is \"no ceiling\" and is rejected. */\n executeTimeout?: number | string | null;\n maxPromptBytes?: number;\n minVersion?: string;\n}\n\n/** One layer of the agent block — default or a single phase. */\nexport interface AgentBlock {\n provider?: AgentProviderId;\n model?: string | null;\n claude?: ClaudeSettings;\n codex?: CodexSettings;\n cursor?: CursorSettings;\n antigravity?: AntigravitySettings;\n}\n\nexport interface AgentConfig {\n provider: AgentProviderId;\n model: string | null;\n claude: ClaudeSettings;\n codex: CodexSettings;\n cursor: CursorSettings;\n antigravity: AntigravitySettings;\n phases: Partial<Record<AgentPhase, AgentBlock>>;\n}\n\n/** Which rung of the ladder produced a resolved value. */\nexport type AgentOrigin = 'default' | 'global' | 'project' | 'env' | 'cli';\n\nexport interface ResolvedAgentSettings {\n provider: AgentProviderId;\n model: string | null;\n claude: ClaudeSettings;\n codex: CodexSettings;\n cursor: CursorSettings;\n antigravity: AntigravitySettings;\n origin: {\n provider: AgentOrigin;\n model: AgentOrigin;\n };\n}\n\nexport interface AgentRunner {\n readonly id: AgentProviderId;\n readonly capabilities: AgentCapabilities;\n versionCommand(): { command: string; args: string[] };\n authCommand?(): { command: string; args: string[] };\n run(invocation: AgentInvocation, settings: ResolvedAgentSettings): Promise<AgentRunResult>;\n}\n\nexport const CLAUDE_CAPABILITIES: AgentCapabilities = {\n extraDirectories: 'flag',\n addDirs: true,\n toolAllowlist: true,\n maxTurns: true,\n osSandbox: false,\n modelSelection: true,\n modelDiscovery: false,\n usage: 'tokens-and-cost',\n reportsUsage: true,\n reportsCost: true,\n sessionResume: false,\n authProbe: 'none',\n bareModelAliases: true,\n promptChannel: 'both',\n nativeTimeout: false,\n contextFileName: 'CLAUDE.md',\n contextFileMaxBytes: null,\n toolNameCase: 'CamelCase',\n readOnlyMode: 'native',\n};\n\nexport const CODEX_CAPABILITIES: AgentCapabilities = {\n extraDirectories: 'flag',\n addDirs: true,\n toolAllowlist: false,\n maxTurns: false,\n osSandbox: true,\n modelSelection: true,\n modelDiscovery: false,\n usage: 'tokens-only',\n reportsUsage: true,\n reportsCost: false,\n sessionResume: true,\n authProbe: 'exit-code',\n bareModelAliases: false,\n promptChannel: 'both',\n nativeTimeout: false,\n contextFileName: 'AGENTS.md',\n contextFileMaxBytes: 32 * 1024,\n toolNameCase: 'none',\n readOnlyMode: 'sandbox',\n};\n\nexport const CURSOR_CAPABILITIES: AgentCapabilities = {\n extraDirectories: 'permission-file',\n addDirs: false,\n toolAllowlist: false,\n maxTurns: false,\n osSandbox: true,\n modelSelection: true,\n modelDiscovery: true,\n usage: 'none',\n reportsUsage: false,\n reportsCost: false,\n sessionResume: true,\n authProbe: 'text',\n bareModelAliases: false,\n promptChannel: 'argv',\n nativeTimeout: false,\n contextFileName: 'AGENTS.md',\n contextFileMaxBytes: null,\n toolNameCase: 'lowercase',\n readOnlyMode: 'native',\n};\n\nexport const ANTIGRAVITY_CAPABILITIES: AgentCapabilities = {\n extraDirectories: 'flag',\n addDirs: true,\n toolAllowlist: false,\n maxTurns: false,\n osSandbox: true,\n modelSelection: true,\n modelDiscovery: true,\n usage: 'tokens-only',\n reportsUsage: true,\n reportsCost: false,\n sessionResume: true,\n authProbe: 'none',\n bareModelAliases: false,\n promptChannel: 'argv',\n nativeTimeout: true,\n contextFileName: 'AGENTS.md',\n contextFileMaxBytes: null,\n toolNameCase: 'CamelCase',\n readOnlyMode: 'native',\n};\n\nexport const AGENT_SCHEMA_VERSION = 1;\n\n/**\n * CLI overrides captured by `setAgentCliOverrides`.\n *\n * `forceProvider` / `forceModel` are the emergency buttons (`--agent` /\n * `--agent-model`): they overwrite every phase after the ladder has run.\n */\nexport interface AgentCliOverrides {\n provider?: AgentProviderId;\n model?: string | null;\n forceProvider?: AgentProviderId;\n forceModel?: string;\n claude?: ClaudeSettings;\n codex?: CodexSettings;\n cursor?: CursorSettings;\n antigravity?: AntigravitySettings;\n phases?: Partial<Record<AgentPhase, AgentBlock>>;\n}\n","import { z } from 'zod';\n\n/**\n * Zod schemas for the `policy` key of `.issue-flow.json`.\n *\n * Two shapes, and the difference matters:\n *\n * - {@link policyConfigInputSchema} validates what the user *wrote*, with no\n * defaults materialized. It is what the file, env and CLI layers are parsed\n * with, so an absent key stays absent and never shadows the layer below it\n * (the caveat documented on `mergeConfigLayers`).\n * - {@link policyConfigSchema} is the resolved shape, with `enabled` and the\n * discovery toggles filled in. The declarations stay optional there too:\n * materializing them as `null` would make an unset `baseBranch` override the\n * one discovery found.\n */\n\n/** Which discovery passes run. Every one defaults to on. */\nexport const policyDiscoveryConfigSchema = z.object({\n issueTemplates: z.boolean().default(true),\n pullRequestTemplate: z.boolean().default(true),\n docs: z.boolean().default(true),\n codeowners: z.boolean().default(true),\n labels: z.boolean().default(true),\n issueTypes: z.boolean().default(true),\n});\n\nconst policyIssuesDeclarationSchema = z.object({\n titleConvention: z.string().min(1).optional(),\n /**\n * Whether Issue Flow may create a label the repository does not have.\n *\n * `.optional()` rather than `.default(false)`: the resolved declarations must\n * stay \"only what was written\", or the group would always look declared and\n * `sources` would report a provenance nobody asked for. The effective default\n * — false — lives at the call site.\n *\n * That default is a deliberate change of behaviour: creating taxonomy without\n * asking is the defect this exists to stop. A repository that wants the old\n * behaviour opts back into it.\n */\n allowLabelCreation: z.boolean().optional(),\n});\n\nconst policyPullRequestsDeclarationSchema = z.object({\n baseBranch: z.string().min(1).optional(),\n titleConvention: z.string().min(1).optional(),\n});\n\nconst policyGitDeclarationSchema = z.object({\n branchConvention: z.string().min(1).optional(),\n commitConvention: z.string().min(1).optional(),\n pullRequestTitleConvention: z.string().min(1).optional(),\n issueReference: z.enum(['closes', 'refs']).optional(),\n typeMap: z.record(z.string(), z.string().min(1)).optional(),\n});\n\n/**\n * Resolved policy configuration.\n *\n * `.prefault({})` rather than `.default({})`: in zod 4 a `.default()` value is\n * substituted *without* being parsed by the inner schema, so `discovery` would\n * come back as `{}` with none of its toggles filled in.\n */\nexport const policyConfigSchema = z.object({\n enabled: z.boolean().default(true),\n /**\n * Token budget for the `__REPO_POLICY__` projection. Sections above it are\n * replaced whole by a pointer rather than truncated — see\n * `policy/placeholders.ts`.\n */\n contextBudget: z.number().int().positive().default(1500),\n discovery: policyDiscoveryConfigSchema.prefault({}),\n issues: policyIssuesDeclarationSchema.prefault({}),\n pullRequests: policyPullRequestsDeclarationSchema.prefault({}),\n git: policyGitDeclarationSchema.prefault({}),\n});\n\n/**\n * What the user may write. `.nullish()` on every declaration is deliberate:\n * `\"baseBranch\": null` is the natural way to spell \"I do not declare this\",\n * and the loader drops it instead of rejecting the whole key.\n */\nexport const policyConfigInputSchema = z.object({\n enabled: z.boolean().optional(),\n contextBudget: z.number().int().positive().optional(),\n // Spelled out rather than `policyDiscoveryConfigSchema.partial()`: in zod 4\n // a `.default()` survives `.partial()`, so every toggle would come back\n // materialized and the input layer would stop meaning \"what the user wrote\".\n discovery: z\n .object({\n issueTemplates: z.boolean().optional(),\n pullRequestTemplate: z.boolean().optional(),\n docs: z.boolean().optional(),\n codeowners: z.boolean().optional(),\n labels: z.boolean().optional(),\n issueTypes: z.boolean().optional(),\n })\n .optional(),\n issues: z\n .object({ titleConvention: z.string().nullish(), allowLabelCreation: z.boolean().optional() })\n .optional(),\n pullRequests: z\n .object({ baseBranch: z.string().nullish(), titleConvention: z.string().nullish() })\n .optional(),\n git: z\n .object({\n branchConvention: z.string().nullish(),\n commitConvention: z.string().nullish(),\n pullRequestTitleConvention: z.string().nullish(),\n issueReference: z.enum(['closes', 'refs']).nullish(),\n typeMap: z.record(z.string(), z.string().min(1)).nullish(),\n })\n .optional(),\n});\n\nexport type PolicyConfig = z.infer<typeof policyConfigSchema>;\nexport type PolicyDiscoveryConfig = z.infer<typeof policyDiscoveryConfigSchema>;\nexport type PolicyConfigInput = z.infer<typeof policyConfigInputSchema>;\n","import { z } from 'zod';\nimport type { ClaudeUsage } from './core/metrics.js';\nimport type { SessionSnapshot } from './core/session-state.js';\nimport type { IssueMetadata, IssuesConfig } from './issues/types.js';\nimport type { ExecutionRecord } from './telemetry/types.js';\n\n/**\n * Zod schemas for validating tasks.json structure, Issue metadata, headless\n * invocation outputs, the web monitoring session snapshot and the web\n * configuration.\n */\n\n/**\n * Token/cost metrics of a single `claude` invocation, mirroring ClaudeUsage in\n * src/core/metrics.ts. Every field is optional: the CLI only reports what it\n * knows, and an absent field means \"not reported\", never zero.\n */\nexport const claudeUsageSchema = z.object({\n inputTokens: z.number().optional(),\n outputTokens: z.number().optional(),\n cacheReadTokens: z.number().optional(),\n cacheCreationTokens: z.number().optional(),\n costUsd: z.number().optional(),\n}) satisfies z.ZodType<ClaudeUsage>;\n\nexport const userStoryStatusSchema = z.enum(['backlog', 'in_progress', 'in_review', 'done']);\n\n/**\n * Fine-grained execution stage — mirrors `StoryStage` in `src/types.ts`. See\n * that type's doc comment for what each value means and which pipeline event\n * produces it.\n */\nexport const storyStageSchema = z.enum([\n 'pending',\n 'executing',\n 'awaiting_review',\n 'in_review',\n 'in_correction',\n 'done',\n 'failed',\n]);\n\n/**\n * The metrics fields are additive and optional: plans written before they\n * existed keep parsing, and nothing is filled in with artificial zeros.\n *\n * `status` and `dependencies` follow the same rule and are `.optional()` rather\n * than `.default()` on purpose: a legacy plan must not gain a `'backlog'` and an\n * empty array it never declared just because `saveTaskPlan` rewrote it. `stage`\n * and friends follow the exact same treatment — nothing in the pipeline writes\n * them back onto `tasks.json`, so they stay `.optional()` too.\n */\nexport const userStorySchema = z.object({\n id: z.string(),\n title: z.string(),\n description: z.string(),\n acceptanceCriteria: z.array(z.string()),\n priority: z.number().int().positive(),\n passes: z.boolean(),\n notes: z.string(),\n ...claudeUsageSchema.shape,\n durationSeconds: z.number().optional(),\n status: userStoryStatusSchema.optional(),\n dependencies: z.array(z.string()).optional(),\n stage: storyStageSchema.optional(),\n stageSince: z.string().optional(),\n stageDetail: z.string().optional(),\n});\n\nexport const pipelineStateSchema = z.object({\n analyzeCompleted: z.boolean().optional(),\n prdCompleted: z.boolean(),\n jsonCompleted: z.boolean(),\n executionCompleted: z.boolean(),\n reviewCompleted: z.boolean(),\n prCreated: z.boolean(),\n prReviewCompleted: z.boolean().optional(),\n});\n\n/**\n * Pull Request opened by the `pr` phase. Optional on the plan: plans written\n * before the field existed (and runs with `--no-branch`) simply omit it.\n */\nexport const pullRequestRefSchema = z.object({\n number: z.number().int().positive(),\n url: z.string(),\n headBranch: z.string(),\n createdAt: z.string(),\n});\n\nexport const prReviewRecommendationSchema = z.enum([\n 'APPROVE',\n 'APPROVE_WITH_SUGGESTIONS',\n 'REQUEST_CHANGES',\n]);\n\n/**\n * State of the opt-in `pr-review` phase. `enabled` and `rounds` carry defaults\n * so a partially written object still parses instead of invalidating the plan.\n */\nexport const prReviewStateSchema = z.object({\n enabled: z.boolean().default(false),\n pullRequestNumber: z.number().int().positive().optional(),\n rounds: z.number().int().min(0).default(0),\n lastRecommendation: prReviewRecommendationSchema.optional(),\n lastReviewedAt: z.string().optional(),\n});\n\nconst lastErrorSchema = z.object({\n category: z.string(),\n message: z.string(),\n at: z.string(),\n});\n\n/**\n * Persisted metadata for an Issue stored on disk (issues/<id>/metadata.json).\n * `satisfies` keeps this schema in lockstep with the IssueMetadata interface in\n * src/issues/types.ts — changing one without the other fails the typecheck.\n */\nexport const issueMetadataSchema = z.object({\n schemaVersion: z.literal(1),\n id: z.string().min(1),\n number: z.number().int().positive().nullable(),\n source: z.enum(['github', 'local']),\n title: z.string(),\n labels: z.array(z.string()),\n state: z.enum(['open', 'closed']),\n createdAt: z.string(),\n updatedAt: z.string(),\n contentHash: z.string(),\n remote: z\n .object({\n provider: z.enum(['github', 'local']),\n ref: z.string(),\n syncedAt: z.string(),\n syncedContentHash: z.string(),\n })\n .optional(),\n}) satisfies z.ZodType<IssueMetadata>;\n\n/**\n * tasks.json structure. Deliberately permissive: plans written by older\n * versions must keep loading, so `issueUrl` is optional (Issues with no remote\n * have no URL) and `issueNumber` accepts non-numeric local identifiers.\n */\n/**\n * `TaskPlan.runState`, written by the pipeline and read on resumption.\n *\n * Optional as a whole — a plan from before it existed has none — but every\n * field inside carries a default, so a partially written object (a process\n * killed mid-write) still parses into a usable state instead of invalidating\n * the plan. That is the same discipline `prReviewStateSchema` follows.\n */\nexport const runOwnerSchema = z.object({\n pid: z.number().int().positive(),\n host: z.string(),\n startedAt: z.string(),\n});\n\nexport const issueRunStateSchema = z.object({\n status: z\n .enum(['idle', 'running', 'waiting', 'retrying', 'paused', 'blocked', 'failed'])\n .default('idle'),\n currentPhase: z.string().nullable().default(null),\n attempt: z.number().int().min(0).default(0),\n lastHeartbeatAt: z.string().nullable().default(null),\n blockedReason: z.string().nullable().default(null),\n owner: runOwnerSchema.nullable().default(null),\n});\n\nconst failureKindSchema = z.enum([\n 'network',\n 'timeout',\n 'stalled',\n 'rate_limit',\n 'provider_down',\n 'provider_crash',\n 'authentication',\n 'configuration',\n 'repository_state',\n 'task_execution',\n 'internal',\n 'unknown',\n]);\n\nconst normalizedUsageSchema = z.object({\n inputTokens: z.number().optional(),\n outputTokens: z.number().optional(),\n cacheReadTokens: z.number().optional(),\n cacheCreationTokens: z.number().optional(),\n reasoningTokens: z.number().optional(),\n details: z.record(z.string(), z.number()).optional(),\n source: z.enum(['provider', 'unavailable']),\n});\n\nconst pricingSnapshotSchema = z.object({\n tableVersion: z.string(),\n modelKey: z.string(),\n inputPerMillion: z.number(),\n outputPerMillion: z.number(),\n cacheReadPerMillion: z.number().optional(),\n cacheWritePerMillion: z.number().optional(),\n capturedAt: z.string(),\n});\n\nconst costRecordSchema = z.discriminatedUnion('status', [\n z.object({ status: z.literal('reported'), amount: z.number(), currency: z.literal('USD') }),\n z.object({\n status: z.literal('estimated'),\n amount: z.number(),\n currency: z.literal('USD'),\n pricing: pricingSnapshotSchema,\n }),\n z.object({\n status: z.literal('unknown'),\n reason: z.enum(['not_reported', 'no_pricing', 'unknown_model', 'subscription', 'zero_rated']),\n }),\n]);\n\n/**\n * One agent invocation. Optional on the plan and without a default array:\n * a plan that never recorded executions must not gain `[]` on rewrite.\n */\nexport const executionRecordSchema = z.object({\n id: z.string(),\n sessionId: z.string().nullable(),\n purpose: z.enum([\n 'analyze',\n 'generate',\n 'prd',\n 'plan',\n 'execute',\n 'review',\n 'pr',\n 'pr-review',\n 'verify',\n ]),\n attempt: z.number().int().positive(),\n trigger: z.enum(['initial', 'retry', 'fallback', 'correction', 'escalation']),\n triggerReason: failureKindSchema.nullable(),\n agent: z.object({\n harness: z.string(),\n provider: z.string().nullable(),\n harnessVersion: z.string().nullable().optional(),\n model: z.object({\n requested: z.string().nullable(),\n resolved: z.string().nullable(),\n source: z.enum(['provider', 'config', 'unavailable']),\n }),\n providerSessionId: z.string().nullable(),\n }),\n startedAt: z.string(),\n finishedAt: z.string().nullable(),\n durationMs: z.number().nullable(),\n cliDurationMs: z.number().nullable().optional(),\n harnessStartupMs: z.number().nullable().optional(),\n apiDurationMs: z.number().nullable().optional(),\n ttftMs: z.number().nullable().optional(),\n numTurns: z.number().nullable().optional(),\n usage: normalizedUsageSchema.nullable(),\n cost: costRecordSchema,\n status: z.enum(['running', 'completed', 'failed', 'timeout', 'cancelled', 'interrupted']),\n failure: z\n .object({\n kind: failureKindSchema,\n message: z.string(),\n exitCode: z.number().nullable(),\n })\n .nullable(),\n stopReason: z\n .enum([\n 'completed',\n 'failed',\n 'timeout',\n 'cancelled',\n 'max_attempts',\n 'max_cost',\n 'max_duration',\n ])\n .nullable()\n .optional(),\n iteration: z.number().int().optional(),\n correctionCycle: z.number().int().min(0).optional(),\n storyIds: z.array(z.string()).optional(),\n owner: z.object({ pid: z.number().int(), host: z.string() }).nullable().optional(),\n routingDecision: z\n .object({\n selected: z.string(),\n actual: z.string().optional(),\n candidates: z.array(z.unknown()).optional(),\n reasonCodes: z.array(z.string()).optional(),\n })\n .passthrough()\n .nullable()\n .optional(),\n verdict: z\n .object({\n status: z.enum(['passed', 'failed', 'unverified']),\n level: z.string().nullable().optional(),\n independence: z.string().nullable().optional(),\n })\n .nullable()\n .optional(),\n}) satisfies z.ZodType<ExecutionRecord>;\n\nexport const taskPlanSchema = z.object({\n project: z.string(),\n issueNumber: z.union([z.number().int().positive(), z.string().min(1)]),\n issueUrl: z.string().optional().default(''),\n branchName: z.string(),\n noBranch: z.boolean().optional().default(false),\n description: z.string(),\n issueStatus: z.enum(['pending', 'in_progress', 'completed']),\n completedAt: z.string().nullable(),\n lastAttemptAt: z.string().nullable(),\n lastError: lastErrorSchema.nullable(),\n correctionCycle: z.number().int().min(0),\n maxCorrectionCycles: z.number().int().min(0),\n /**\n * Findings from the most recent failed review, verbatim. Non-null means the\n * issue has a pending correction even if every userStories[].passes is\n * already true — the execute phase must address these before the field is\n * cleared back to null. See core/engine.ts's early-return guards.\n */\n lastReviewFindings: z.string().nullable().optional().default(null),\n pipeline: pipelineStateSchema,\n /**\n * Where the run stands right now. Purely additive: absent in every plan\n * written before it, and absent is not the same as `idle` — it means the\n * plan predates the field, which is why there is no `.default()` here.\n */\n runState: issueRunStateSchema.optional(),\n pullRequest: pullRequestRefSchema.optional(),\n prReview: prReviewStateSchema.optional(),\n userStories: z.array(userStorySchema),\n /**\n * Per-invocation history. `.optional()` and no `.default([])`: a plan that\n * predates the field must not grow an empty array just because it was saved.\n */\n executions: z.array(executionRecordSchema).optional(),\n});\n\nexport const headlessResultSchema = z.object({\n success: z.boolean(),\n result: z.string(),\n cost: claudeUsageSchema.nullable(),\n error: z.string().nullable(),\n});\n\nconst sessionLogEntrySchema = z.object({\n at: z.string(),\n level: z.enum(['info', 'warn', 'error']),\n message: z.string(),\n});\n\n/**\n * Usage counters attached to a phase or a story in the session snapshot.\n * Unlike claudeUsageSchema (a single invocation, optional fields), these are\n * always present and nullable: null means \"never reported\", not zero.\n *\n * They default to null on input so a session.json written before the metrics\n * existed still parses -- absent and null mean the same thing here, and the\n * parsed value keeps the `number | null` shape the snapshot interface declares.\n */\nconst sessionUsageShape = {\n inputTokens: z.number().nullable().default(null),\n outputTokens: z.number().nullable().default(null),\n cacheReadTokens: z.number().nullable().default(null),\n cacheCreationTokens: z.number().nullable().default(null),\n costUsd: z.number().nullable().default(null),\n};\n\nconst sessionPhaseSchema = z.object({\n name: z.string(),\n status: z.enum(['pending', 'running', 'completed', 'failed']),\n startedAt: z.string().nullable(),\n endedAt: z.string().nullable(),\n durationSeconds: z.number().nullable(),\n error: z.string().nullable(),\n harnessExecutionMs: z.number().nullable().default(null),\n orchestrationOverheadMs: z.number().nullable().default(null),\n harnessStartupMs: z.number().nullable().default(null),\n ttftMs: z.number().nullable().default(null),\n attemptCount: z.number().nullable().default(null),\n retryDurationMs: z.number().nullable().default(null),\n ...sessionUsageShape,\n});\n\nconst sessionStorySchema = z.object({\n id: z.string(),\n title: z.string(),\n priority: z.number(),\n passes: z.boolean(),\n completedAt: z.string().nullable(),\n // Also introduced with the metrics, hence the same tolerant default.\n durationSeconds: z.number().nullable().default(null),\n // Snapshot fields are always present on output and defaulted on input, so a\n // session.json written before they existed still parses. This is the mirror\n // image of userStorySchema, where the same two fields are plainly optional.\n status: userStoryStatusSchema.default('backlog'),\n dependencies: z.array(z.string()).default([]),\n // Published for the panel's story detail view. Same tolerant default as the\n // fields above: absent (older session.json) and empty resolve to the same\n // value, so the client never has to tell them apart.\n description: z.string().default(''),\n acceptanceCriteria: z.array(z.string()).default([]),\n // Additive like the rest of this schema: a session.json written before\n // `stage` existed parses into 'pending'/null, the same values a fresh\n // snapshot starts a story at.\n stage: storyStageSchema.default('pending'),\n stageSince: z.string().nullable().default(null),\n stageDetail: z.string().nullable().default(null),\n history: z\n .array(\n z.object({\n at: z.string(),\n stage: storyStageSchema,\n detail: z.string().nullable(),\n }),\n )\n .default([]),\n ...sessionUsageShape,\n});\n\nconst sessionConfigurationValueSchema = z.object({\n value: z.string().nullable(),\n source: z.enum(['default', 'global', 'project', 'env', 'cli', 'fallback']),\n});\n\nconst sessionConfigurationSchema = z.object({\n precedence: z.array(z.string()),\n defaultProvider: sessionConfigurationValueSchema,\n defaultModel: sessionConfigurationValueSchema,\n phases: z.array(\n z.object({\n phase: z.string(),\n provider: sessionConfigurationValueSchema,\n model: sessionConfigurationValueSchema,\n }),\n ),\n fallbacks: z.array(z.string()),\n overrides: z.array(z.string()),\n});\n\n/**\n * Session snapshot served by the web monitoring mode (session.json and the\n * HTTP endpoint). `satisfies` keeps this schema in lockstep with the\n * SessionSnapshot interface in src/core/session-state.ts — changing one\n * without the other fails the typecheck.\n */\nexport const sessionSnapshotSchema = z.object({\n schemaVersion: z.literal(1),\n sessionId: z.string().nullable(),\n readOnly: z.literal(true),\n capabilities: z.array(z.string()),\n issue: z.object({\n number: z.number().nullable(),\n url: z.string().nullable(),\n // Additive: a session.json written before the Issue section was enriched\n // parses into the same \"not reported\" values createInitialSnapshot() uses.\n title: z.string().nullable().default(null),\n description: z.string().nullable().default(null),\n labels: z.array(z.string()).default([]),\n state: z.string().nullable().default(null),\n }),\n status: z.enum(['idle', 'running', 'completed', 'failed']),\n startedAt: z.string().nullable(),\n updatedAt: z.string().nullable(),\n endedAt: z.string().nullable(),\n elapsedSeconds: z.number().nullable(),\n estimatedRemainingSeconds: z.number().nullable(),\n progress: z.object({\n percent: z.number(),\n phasesCompleted: z.number(),\n phasesTotal: z.number(),\n storiesCompleted: z.number(),\n storiesTotal: z.number(),\n }),\n currentPhase: z.string().nullable(),\n currentActivity: z\n .object({\n story: z.string().nullable(),\n tool: z.string().nullable(),\n detail: z.string().nullable(),\n since: z.string(),\n })\n .nullable(),\n phases: z.array(sessionPhaseSchema),\n stories: z.array(sessionStorySchema),\n // The whole aggregate is additive: a snapshot from before it existed parses\n // into the same \"nothing reported\" object the reducer starts from.\n metrics: z\n .object({\n totalInputTokens: z.number().nullable().default(null),\n totalOutputTokens: z.number().nullable().default(null),\n totalCacheReadTokens: z.number().nullable().default(null),\n totalCacheCreationTokens: z.number().nullable().default(null),\n totalCostUsd: z.number().nullable().default(null),\n })\n .default({\n totalInputTokens: null,\n totalOutputTokens: null,\n totalCacheReadTokens: null,\n totalCacheCreationTokens: null,\n totalCostUsd: null,\n }),\n execution: z.object({\n iteration: z.number(),\n retries: z.number(),\n correctionCycle: z.number(),\n maxCorrectionCycles: z.number().nullable(),\n }),\n executions: z.array(executionRecordSchema).default([]),\n processLogs: z\n .array(\n z.object({\n at: z.string(),\n phase: z.string(),\n executionId: z.string().nullable(),\n provider: z.string(),\n stream: z.enum(['stdout', 'stderr', 'combined']),\n message: z.string(),\n }),\n )\n .default([]),\n configuration: sessionConfigurationSchema.nullable().default(null),\n // Additive resilience projection. Every field defaults so session.json from\n // before provider failover/observability remains readable without a schema\n // version bump.\n resilience: z\n .object({\n attempt: z.number().int().nonnegative().default(0),\n provider: z.string().nullable().default(null),\n model: z.string().nullable().default(null),\n lastFailureKind: z\n .enum([\n 'network',\n 'timeout',\n 'stalled',\n 'rate_limit',\n 'provider_down',\n 'provider_crash',\n 'authentication',\n 'configuration',\n 'repository_state',\n 'task_execution',\n 'internal',\n 'unknown',\n ])\n .nullable()\n .default(null),\n cooldownUntil: z.string().nullable().default(null),\n lastActivityAt: z.string().nullable().default(null),\n })\n .default({\n attempt: 0,\n provider: null,\n model: null,\n lastFailureKind: null,\n cooldownUntil: null,\n lastActivityAt: null,\n }),\n git: z.object({\n branch: z.string().nullable(),\n baseBranch: z.string().nullable(),\n branchCreated: z.boolean().nullable().default(null),\n startCommit: z.string().nullable().default(null),\n commits: z.array(\n z.object({\n hash: z.string(),\n subject: z.string(),\n committedAt: z.string().nullable().default(null),\n storyId: z.string().nullable().default(null),\n }),\n ),\n }),\n // Additive like the metrics aggregate: a session.json written before the\n // repository section existed parses into the same all-null object\n // createInitialSnapshot() starts from.\n repository: z\n .object({\n name: z.string().nullable().default(null),\n remoteUrl: z.string().nullable().default(null),\n branch: z.string().nullable().default(null),\n headCommit: z.string().nullable().default(null),\n root: z.string().nullable().default(null),\n })\n .default({ name: null, remoteUrl: null, branch: null, headCommit: null, root: null }),\n pullRequests: z.array(z.object({ number: z.number(), url: z.string(), title: z.string() })),\n logs: z.array(sessionLogEntrySchema),\n errors: z.array(sessionLogEntrySchema),\n warnings: z.array(sessionLogEntrySchema),\n lastError: z.object({ message: z.string(), at: z.string() }).nullable(),\n nextSteps: z.array(z.string()),\n environment: z\n .object({\n node: z.string(),\n platform: z.string(),\n agent: z.string().nullable().default(null),\n model: z.string().nullable().default(null),\n // Additive, like agent/model: a session written before the version was\n // recorded parses as \"not reported\" instead of failing validation.\n cliVersion: z.string().nullable().default(null),\n })\n .nullable(),\n // Additive: a session.json written before the acceptance contract existed\n // parses as \"not reported\". schemaVersion stays 1.\n verification: z\n .object({\n verdict: z.enum(['passed', 'failed', 'unverified']).nullable(),\n level: z.string().nullable(),\n independence: z.string().nullable(),\n })\n .nullable()\n .default(null),\n}) satisfies z.ZodType<SessionSnapshot>;\n\n/**\n * Resolved web monitoring configuration. Every field has a default, so\n * parsing a partial object (e.g. the `web` key of .issue-flow.json) fills in\n * the documented defaults.\n */\nexport const webConfigSchema = z.object({\n enabled: z.boolean().default(false),\n port: z.number().int().min(1).max(65535).default(3737),\n host: z.string().min(1).default('0.0.0.0'),\n refreshSeconds: z.number().positive().default(5),\n logLimit: z.number().int().positive().default(200),\n includeLogs: z.boolean().default(true),\n});\n\n/**\n * Resolved Issue provider configuration. Every field has a default that keeps\n * the GitHub-only behaviour, so parsing an empty object yields the exact\n * behaviour of releases without the provider layer.\n */\nexport const issuesConfigSchema = z.object({\n defaultGenerateTarget: z.enum(['github', 'local', 'both']).default('github'),\n preferredProvider: z.enum(['github', 'local']).default('github'),\n conflictPolicy: z.enum(['ask', 'prefer-local', 'prefer-github']).default('ask'),\n requireConfirmation: z.boolean().default(true),\n}) satisfies z.ZodType<IssuesConfig>;\n\n/**\n * Resolved `pr-review` configuration (the `prReview` key of .issue-flow.json).\n *\n * `publisher` selects the implementation `createPrReviewPublisher()` builds:\n * `local` writes the artifacts under the issue directory, and `github` does\n * that **and** comments on the Pull Request, updating the comment of the same\n * round instead of stacking a new one on every republication.\n *\n * `local` stays the default, so a repository that configures nothing publishes\n * exactly where it always did and never writes to GitHub by surprise.\n */\nexport const prReviewConfigSchema = z.object({\n publisher: z.enum(['local', 'github']).default('local'),\n});\n\n/**\n * The `policy` key of .issue-flow.json — the repository policy layer. Defined\n * in `policy/schemas.ts` next to the module that consumes it, and re-exported\n * here so `schemas.ts` stays the single index of the file's keys.\n */\nexport {\n type PolicyConfig,\n type PolicyConfigInput,\n type PolicyDiscoveryConfig,\n policyConfigInputSchema,\n policyConfigSchema,\n policyDiscoveryConfigSchema,\n} from './policy/schemas.js';\n\nexport type ValidatedTaskPlan = z.infer<typeof taskPlanSchema>;\nexport type ValidatedIssueMetadata = z.infer<typeof issueMetadataSchema>;\nexport type ValidatedHeadlessResult = z.infer<typeof headlessResultSchema>;\nexport type ValidatedSessionSnapshot = z.infer<typeof sessionSnapshotSchema>;\nexport const verifyCheckSchema = z.object({\n id: z.string().min(1),\n run: z.string().optional(),\n expectFiles: z.array(z.string()).optional(),\n fatal: z.boolean().optional(),\n});\n\nexport const verifyConfigSchema = z.object({\n level: z.enum(['L0', 'L1', 'L2', 'L3', 'L5']).default('L1'),\n triggers: z.array(z.string()).default([]),\n pairings: z.record(z.string(), z.string()).default({}),\n contract: z.array(verifyCheckSchema).optional(),\n crossVerify: z.boolean().default(true),\n});\n\nexport type WebConfig = z.infer<typeof webConfigSchema>;\nexport type PrReviewConfig = z.infer<typeof prReviewConfigSchema>;\nexport const routingConfigSchema = z.object({\n mode: z.enum(['off', 'shadow', 'recommend', 'active']).default('shadow'),\n profile: z.enum(['economy', 'balanced', 'quality', 'speed']).default('balanced'),\n escalation: z\n .object({\n enabled: z.boolean().default(false),\n minAttemptsBeforeEscalation: z.number().int().positive().default(2),\n maxEscalations: z.number().int().nonnegative().default(2),\n maxRungs: z\n .array(z.enum(['effort', 'model', 'harness', 'review', 'decompose']))\n .default(['effort', 'model', 'harness']),\n })\n .default({\n enabled: false,\n minAttemptsBeforeEscalation: 2,\n maxEscalations: 2,\n maxRungs: ['effort', 'model', 'harness'],\n }),\n ceilings: z\n .object({\n maxCostUsdPerIssue: z.number().nonnegative().nullable().default(null),\n maxDurationMsPerIssue: z.number().nonnegative().nullable().default(null),\n maxExecutionsPerIssue: z.number().int().nonnegative().nullable().default(null),\n onCeiling: z.literal('block').default('block'),\n })\n .default({\n maxCostUsdPerIssue: null,\n maxDurationMsPerIssue: null,\n maxExecutionsPerIssue: null,\n onCeiling: 'block',\n }),\n});\n\nexport type VerifyConfig = z.infer<typeof verifyConfigSchema>;\nexport type RoutingConfig = z.infer<typeof routingConfigSchema>;\n","import { z } from 'zod';\nimport { AGENT_PHASES, type AgentPhase } from './types.js';\n\n/**\n * File-format schemas for the `agent` key.\n *\n * These are intermediate layers (global `config.json` and `.issue-flow.json`).\n * No field carries a `.default()`: a default materialized here would look\n * like a value the user wrote and would silently override the rung above.\n */\n\nexport const agentProviderIdSchema = z.enum(['claude', 'codex', 'cursor', 'antigravity']);\n\nexport const codexSandboxSchema = z.enum(['read-only', 'workspace-write', 'danger-full-access']);\n\nexport const codexReasoningEffortSchema = z.enum(['minimal', 'low', 'medium', 'high', 'xhigh']);\n\nexport const claudeSettingsSchema = z\n .object({\n ignoreUserConfig: z.boolean(),\n strictMcpConfig: z.boolean(),\n })\n .partial();\n\nexport const codexSettingsSchema = z\n .object({\n reasoningEffort: codexReasoningEffortSchema,\n sandbox: codexSandboxSchema,\n ignoreUserConfig: z.boolean(),\n skipGitRepoCheck: z.boolean(),\n configOverrides: z.record(z.string(), z.union([z.string(), z.number(), z.boolean()])),\n })\n .partial();\n\nexport const cursorSandboxSchema = z.enum(['enabled', 'disabled']);\n\nexport const cursorPermissionsFileSchema = z.enum(['global', 'project', 'none']);\n\nexport const cursorSettingsSchema = z\n .object({\n sandbox: cursorSandboxSchema,\n approveMcps: z.boolean(),\n permissionsFile: cursorPermissionsFileSchema,\n minVersion: z.string().min(1),\n force: z.boolean().refine((value) => value !== false, {\n message:\n 'agent.cursor.force cannot be false: without --force, Cursor finishes with exit 0 and writes nothing.',\n }),\n })\n .partial();\n\nexport const antigravityEffortSchema = z.enum(['low', 'medium', 'high']);\n\nexport const antigravitySettingsSchema = z\n .object({\n effort: antigravityEffortSchema,\n sandbox: z.boolean(),\n executeTimeout: z.union([z.number().int(), z.string().min(1), z.null()]),\n maxPromptBytes: z.number().int().positive(),\n minVersion: z.string().min(1),\n skipPermissions: z.boolean().refine((value) => value !== false, {\n message:\n 'agent.antigravity.skipPermissions cannot be false: without --dangerously-skip-permissions, Antigravity finishes SUCCESS and writes nothing.',\n }),\n })\n .partial();\n\nexport const agentBlockSchema = z\n .object({\n provider: agentProviderIdSchema,\n model: z.string().min(1).nullable(),\n claude: claudeSettingsSchema,\n codex: codexSettingsSchema,\n cursor: cursorSettingsSchema,\n antigravity: antigravitySettingsSchema,\n })\n .partial();\n\n/**\n * The `phases` map as written in a file. Unknown keys are dropped by the\n * loader (with a warning); this schema only accepts the eight real phases.\n */\nexport const agentPhasesSchema = z\n .object({\n analyze: agentBlockSchema,\n generate: agentBlockSchema,\n prd: agentBlockSchema,\n plan: agentBlockSchema,\n execute: agentBlockSchema,\n review: agentBlockSchema,\n pr: agentBlockSchema,\n 'pr-review': agentBlockSchema,\n })\n .partial();\n\n/** Input shape of the `agent` key — every field optional, no defaults. */\nexport const agentConfigInputSchema = z\n .object({\n provider: agentProviderIdSchema,\n model: z.string().min(1).nullable(),\n claude: claudeSettingsSchema,\n codex: codexSettingsSchema,\n cursor: cursorSettingsSchema,\n antigravity: antigravitySettingsSchema,\n phases: agentPhasesSchema,\n })\n .partial();\n\nexport type AgentConfigInput = z.infer<typeof agentConfigInputSchema>;\n\n/** Loose parse of a `phases` object so unknown keys can be reported. */\nexport function parsePhasesInput(\n value: unknown,\n warn: (message: string) => void,\n): Partial<Record<AgentPhase, z.infer<typeof agentBlockSchema>>> {\n if (value === undefined || value === null) return {};\n if (typeof value !== 'object' || Array.isArray(value)) {\n warn('Ignoring \"agent.phases\": expected an object.');\n return {};\n }\n\n const result: Partial<Record<AgentPhase, z.infer<typeof agentBlockSchema>>> = {};\n for (const [key, raw] of Object.entries(value as Record<string, unknown>)) {\n if (!(AGENT_PHASES as readonly string[]).includes(key)) {\n warn(`Ignoring unknown agent phase \"${key}\".`);\n continue;\n }\n const parsed = agentBlockSchema.safeParse(raw);\n if (!parsed.success) {\n warn(`Ignoring agent.phases.${key}: ${parsed.error.issues[0]?.message ?? 'invalid value'}.`);\n continue;\n }\n result[key as AgentPhase] = parsed.data;\n }\n return result;\n}\n","import { z } from 'zod';\nimport { agentConfigInputSchema } from '../agents/schemas.js';\nimport type { ExecutionPlan } from '../execution/types.js';\nimport type {\n ExhaustedAction,\n FailoverMode,\n PolicyConfig as ResiliencePolicyConfig,\n ResilienceProfile,\n RetryConfigKey,\n RetryPolicy,\n} from '../resilience/policy.js';\nimport { pullRequestRefSchema, webConfigSchema } from '../schemas.js';\n\n/**\n * Zod schemas for the files written under the global storage tree\n * (`~/.issue-flow`): the per-project `metadata.json` and the global\n * `config.json`.\n *\n * They live here rather than in `src/schemas.ts` so that file stays focused on\n * the pipeline domain (task plans, Issue metadata, session snapshots) and the\n * storage layer keeps owning its own formats.\n */\n\n/** Version stamped on files written by this release of the storage layer. */\nexport const STORAGE_SCHEMA_VERSION = 1;\n\n/**\n * Where a `plan` run's `US-NNN` numbering came from (issue #36):\n *\n * - `history`: recovered from the highest number already used anywhere in the\n * project's `tasks.json` files, automatically or via `--continue`.\n * - `start-us`: forced by the user via `--start-us <n>`, ignoring history.\n * - `none`: no history found (the project's first `plan` run) — starts at\n * `US-001`.\n */\nexport const userStoryNumberingSourceSchema = z.enum(['history', 'start-us', 'none']);\n\n/**\n * A single numbering decision, persisted for audit under\n * `metadata.json`'s `userStoryNumbering` (see below) — never used to resolve\n * the *next* decision, which always re-scans `tasks.json` from scratch.\n */\nexport const userStoryNumberingDecisionSchema = z.object({\n /** The `US-NNN` number the `plan` prompt was told to continue from. */\n nextNumber: z.number().int().positive(),\n source: userStoryNumberingSourceSchema,\n /** Issue the decision was made for. */\n issueNumber: z.string().min(1),\n decidedAt: z.string().min(1),\n /** Human-readable origin, e.g. the previous story id and issue it came from. */\n detail: z.string().optional(),\n});\n\n/**\n * `~/.issue-flow/projects/<project-id>/metadata.json`.\n *\n * Deliberately **not** `.strict()`: a newer release may add fields (dashboard\n * history, counters) and an older one must still be able to read the file\n * instead of rejecting it. Unknown keys are dropped on parse, never fatal.\n *\n * `root` is the last known local checkout — informative only. Identity lives in\n * `projectId` (see `getProjectId()` in `paths.ts`), so moving the folder of a\n * project that has a remote updates `root` without changing the id.\n */\nexport const projectMetadataSchema = z.object({\n schemaVersion: z.number().int().positive(),\n projectId: z.string().min(1),\n root: z.string().min(1),\n /** Normalized remote (`host/org/repo`), or null when the project has none. */\n remoteUrl: z.string().nullable(),\n createdAt: z.string().min(1),\n updatedAt: z.string().min(1),\n /** Null until the project is used by a pipeline run. */\n lastAttemptAt: z.string().nullable(),\n /**\n * Most recent User Story numbering decision made by `plan` (issue #36).\n * Absent on a project whose `plan` never ran through the numbering\n * resolver, or on a `metadata.json` written before the feature existed.\n */\n userStoryNumbering: userStoryNumberingDecisionSchema.optional(),\n});\n\n/**\n * Global counterpart of the `web` key of `.issue-flow.json`, restricted to the\n * settings that make sense machine-wide: `enabled` and `includeLogs` stay a\n * per-project decision.\n *\n * The validation of each field is reused from `webConfigSchema` through\n * `.unwrap()`, which strips the `.default()` and keeps the constraints. Picking\n * and calling `.partial()` would not be enough: in zod 4 an optional field\n * still materializes its default when the key is absent\n * (`z.object({ port: z.number().default(3737) }).partial().parse({})` yields\n * `{ port: 3737 }`), and a materialized default in this layer would override\n * the project layer during the merge.\n */\nconst webShape = webConfigSchema.shape;\nexport const globalWebConfigSchema = z\n .object({\n port: webShape.port.unwrap(),\n host: webShape.host.unwrap(),\n refreshSeconds: webShape.refreshSeconds.unwrap(),\n logLimit: webShape.logLimit.unwrap(),\n })\n .partial();\n\n/** Global retry preferences, mirroring `DEFAULTS` in `config.ts`. */\nexport const globalRetryConfigSchema = z\n .object({\n retryLimit: z.number().int().nonnegative(),\n retryForever: z.boolean(),\n backoffBaseSeconds: z.number().nonnegative(),\n backoffMaxSeconds: z.number().nonnegative(),\n })\n .partial();\n\n/* ── the `resilience` key ───────────────────────────────────────────────── */\n\n/**\n * The file format of the `resilience` key, shared by `.issue-flow.json` and\n * `~/.issue-flow/config.json` — the same object is accepted in both, because\n * they are two rungs of one ladder rather than two formats.\n *\n * **Every field is optional and none carries a `.default()`**, for the reason\n * stated on `globalConfigSchema` below and in `AGENTS.md`: both files are\n * intermediate precedence layers, and a default materialized in one of them is\n * indistinguishable from a value the user wrote.\n *\n * The enums are pinned to the types of `resilience/policy.ts` with `satisfies`,\n * so a value the resolver understands and the file rejects (or the reverse) is\n * a compile error rather than a silent drop at parse time.\n */\nconst resilienceProfileSchema = z.enum([\n 'default',\n 'continuous',\n]) satisfies z.ZodType<ResilienceProfile>;\nconst jitterSchema = z.enum(['none', 'full']) satisfies z.ZodType<RetryPolicy['jitter']>;\nconst failoverModeSchema = z.enum([\n 'never',\n 'after_attempts',\n 'immediate',\n]) satisfies z.ZodType<FailoverMode>;\nconst exhaustedActionSchema = z.enum(['fail', 'block']) satisfies z.ZodType<ExhaustedAction>;\n\n/** One `resilience.retry.<kind>` entry — a partial `RetryPolicy`. */\nexport const retryPolicyOverrideSchema = z\n .object({\n maxAttempts: z.number().int().nonnegative(),\n initialDelayMs: z.number().nonnegative(),\n maxDelayMs: z.number().nonnegative(),\n backoffFactor: z.number().min(1),\n jitter: jitterSchema,\n retryForever: z.boolean(),\n failover: failoverModeSchema,\n failoverAfterAttempts: z.number().int().positive(),\n onExhausted: exhaustedActionSchema,\n })\n .partial();\n\n/**\n * `resilience.retry`, one optional entry per `FailureKind`.\n *\n * Built from a `Record<RetryConfigKey, …>` on purpose: adding a `FailureKind`\n * without giving it a configuration key stops compiling here.\n */\nconst retryOverridesByKind: Record<RetryConfigKey, typeof retryPolicyOverrideSchema> = {\n network: retryPolicyOverrideSchema,\n timeout: retryPolicyOverrideSchema,\n stalled: retryPolicyOverrideSchema,\n rateLimit: retryPolicyOverrideSchema,\n providerDown: retryPolicyOverrideSchema,\n providerCrash: retryPolicyOverrideSchema,\n authentication: retryPolicyOverrideSchema,\n configuration: retryPolicyOverrideSchema,\n repositoryState: retryPolicyOverrideSchema,\n taskExecution: retryPolicyOverrideSchema,\n internal: retryPolicyOverrideSchema,\n unknown: retryPolicyOverrideSchema,\n};\n\nexport const resilienceRetryConfigSchema = z.object(retryOverridesByKind).partial();\n\n/** `resilience.providers` — agent health and failover (US-024, US-025). */\nexport const resilienceProvidersConfigSchema = z\n .object({\n failover: z.boolean(),\n chain: z.array(z.string().min(1)),\n cooldownMs: z.number().nonnegative(),\n maxCooldownMs: z.number().nonnegative(),\n failureWindowMs: z.number().positive(),\n failuresToTrip: z.number().int().positive(),\n })\n .partial();\n\nexport const providerHealthStatusSchema = z.enum([\n 'healthy',\n 'degraded',\n 'unavailable',\n 'rate_limited',\n 'auth_failed',\n 'half_open',\n]);\n\nexport const providerHealthRecordSchema = z.object({\n status: providerHealthStatusSchema.default('healthy'),\n failures: z\n .array(\n z.object({\n at: z.string(),\n kind: z.enum([\n 'network',\n 'timeout',\n 'stalled',\n 'rate_limit',\n 'provider_down',\n 'provider_crash',\n 'authentication',\n 'configuration',\n 'repository_state',\n 'task_execution',\n 'internal',\n 'unknown',\n ]),\n }),\n )\n .default([]),\n consecutiveFailures: z.number().int().nonnegative().default(0),\n cooldownLevel: z.number().int().nonnegative().default(0),\n cooldownUntil: z.string().nullable().default(null),\n lastFailureKind: z\n .enum([\n 'network',\n 'timeout',\n 'stalled',\n 'rate_limit',\n 'provider_down',\n 'provider_crash',\n 'authentication',\n 'configuration',\n 'repository_state',\n 'task_execution',\n 'internal',\n 'unknown',\n ])\n .nullable()\n .default(null),\n lastFailureAt: z.string().nullable().default(null),\n lastSuccessAt: z.string().nullable().default(null),\n probeInFlight: z.boolean().default(false),\n probeStartedAt: z.string().nullable().default(null),\n});\n\nexport const providersHealthSchema = z.object({\n schemaVersion: z.literal(1).default(1),\n providers: z.record(z.string(), providerHealthRecordSchema).default({}),\n});\n\n/** `resilience.queue` — what a failing issue does to the rest of them (US-027). */\nexport const resilienceQueueConfigSchema = z\n .object({\n onIssueFailure: z.enum(['stop', 'skip', 'block']),\n maxIssueAttempts: z.number().int().positive(),\n })\n .partial();\n\n/** `resilience.watchdog` — inactivity detection over the event stream (US-026). */\nexport const resilienceWatchdogConfigSchema = z\n .object({\n inactivityTimeoutMs: z.number().int().nonnegative(),\n })\n .partial();\n\n/** `resilience.journal` — the append-only `events.jsonl` (US-015). */\nexport const resilienceJournalConfigSchema = z\n .object({\n enabled: z.boolean(),\n maxFileBytes: z.number().int().positive(),\n })\n .partial();\n\n/** `resilience.decompose` — the \"this issue is too large\" report (US-030). */\nexport const resilienceDecomposeConfigSchema = z\n .object({\n auto: z.boolean(),\n })\n .partial();\n\nexport const resilienceConfigSchema = z\n .object({\n profile: resilienceProfileSchema,\n /** Whether a credential failure may migrate to another provider. */\n failoverOnAuth: z.boolean(),\n retry: resilienceRetryConfigSchema,\n providers: resilienceProvidersConfigSchema,\n queue: resilienceQueueConfigSchema,\n watchdog: resilienceWatchdogConfigSchema,\n journal: resilienceJournalConfigSchema,\n decompose: resilienceDecomposeConfigSchema,\n })\n .partial();\n\n/**\n * Intermediate `telemetry` key. Every field optional, no `.default()` — this\n * file is a middle rung of the config ladder.\n */\nexport const telemetryPricingOverrideSchema = z\n .object({\n inputPerMillion: z.number(),\n outputPerMillion: z.number(),\n cacheReadPerMillion: z.number(),\n cacheWritePerMillion: z.number(),\n })\n .partial();\n\nexport const telemetryConfigInputSchema = z\n .object({\n enabled: z.boolean(),\n maxExecutions: z.number().int().positive(),\n pricing: z\n .object({\n estimate: z.boolean(),\n overrides: z.record(z.string(), telemetryPricingOverrideSchema),\n })\n .partial(),\n })\n .partial();\n\n/** Global commit preferences. `signoff` is consumed by `commitMessage()`. */\nexport const globalCommitConfigSchema = z\n .object({\n signoff: z.boolean(),\n conventional: z.boolean(),\n })\n .partial();\n\n/**\n * `~/.issue-flow/config.json`.\n *\n * **Every key is optional and no key carries a `.default()`.** This is a design\n * constraint, not an omission: the global file is an intermediate precedence\n * layer (CLI > env > `.issue-flow.json` > `config.json` > defaults), so a\n * default materialized here would be indistinguishable from a value the user\n * actually wrote and would silently override the project layer during the\n * merge. Same reason `readWebConfigFile()` parses with\n * `webConfigSchema.partial()`. Defaults belong to the final layer only.\n */\nexport const globalConfigSchema = z\n .object({\n schemaVersion: z.number().int().positive(),\n /** Override for the directory holding `projects/`. */\n storageDir: z.string().min(1),\n web: globalWebConfigSchema,\n retry: globalRetryConfigSchema,\n commit: globalCommitConfigSchema,\n resilience: resilienceConfigSchema,\n agent: agentConfigInputSchema,\n telemetry: telemetryConfigInputSchema,\n })\n .partial();\n\n/**\n * `~/.issue-flow/web.lock`.\n *\n * Marks the single web monitoring server active on this machine: `pid` and\n * `port` let a new invocation tell a live instance from a stale one before\n * attempting to bind its own (see `web/lock.ts`). Not `.strict()` for the same\n * reason as the schemas above — a newer release may add fields.\n */\nexport const webLockSchema = z.object({\n pid: z.number().int().positive(),\n port: z.number().int().positive(),\n host: z.string().min(1),\n startedAt: z.string().min(1),\n /** Added in a backward-compatible way: locks from older releases remain valid. */\n instanceId: z.string().min(1).optional(),\n});\n\n/**\n * `~/.issue-flow/projects/<project-id>/run.lock`.\n *\n * Ownership of a run, so a second invocation in the same project refuses\n * instead of fighting the first one over `tasks.json` and the branch. Same\n * shape of guard as `web.lock` — a pid, a host and a timestamp — plus the\n * heartbeat that tells a dead owner from a slow one.\n *\n * No field defaults: a lock is written whole by its owner, and a half-read one\n * degrades to \"no lock\" at the reader, exactly like `readWebLock`.\n */\nexport const runLockSchema = z.object({\n pid: z.number().int().positive(),\n /** `os.hostname()`. A pid only means something on the host that wrote it. */\n host: z.string().min(1),\n /** The issue (or queue) identifier the owner is running. */\n target: z.string().min(1),\n startedAt: z.string().min(1),\n lastHeartbeatAt: z.string().min(1),\n /** Absent on a foreground run written before this field existed. */\n detached: z.boolean().optional(),\n});\n\n/**\n * `~/.issue-flow/projects/<project-id>/queues/<queue-id>/execution-plan.json`.\n *\n * The coordination state of a multi-issue run: which Issues, in which order, on\n * which shared branch, and how far the queue got. Each Issue keeps its own\n * `tasks.json` — nothing of the task plan is duplicated here.\n *\n * Written only when a queue really has more than one Issue: a single-issue run\n * creates no queue directory at all, which is what keeps the storage layout of\n * every existing user unchanged.\n *\n * Not `.strict()`, like every other file schema here, and `satisfies` keeps it\n * in lockstep with the `ExecutionPlan` interface in `src/execution/types.ts`.\n */\nexport const executionPlanIssueSchema = z.object({\n id: z.string().min(1),\n number: z.number().int().positive().nullable(),\n title: z.string(),\n url: z.string().nullable(),\n source: z.string().min(1),\n position: z.number().int().positive(),\n // `blocked` and `skipped` are additive: no plan written before them can\n // carry one, and a reader that does not know them was never given one.\n status: z.enum(['pending', 'in_progress', 'completed', 'failed', 'blocked', 'skipped']),\n origin: z.enum(['requested', 'discovered']),\n role: z.enum(['executable', 'container']).default('executable'),\n externalDependencies: z.array(z.string()).default([]),\n dependsOn: z.array(z.string()).default([]),\n parent: z.string().nullable().default(null),\n priority: z.enum(['high', 'medium', 'low']).nullable().default(null),\n heuristic: z.boolean().default(false),\n failedPhase: z.string().nullable().default(null),\n lastError: z\n .object({ category: z.string(), message: z.string(), at: z.string() })\n .nullable()\n .default(null),\n startedAt: z.string().nullable().default(null),\n completedAt: z.string().nullable().default(null),\n // Both default, so an execution-plan.json written by an earlier release\n // parses unchanged and reads as \"never attempted, not blocked\".\n attempts: z.number().int().min(0).default(0),\n blockedReason: z.string().nullable().default(null),\n});\n\nexport const executionPlanSchema = z.object({\n schemaVersion: z.literal(1),\n id: z.string().min(1),\n project: z.string().min(1),\n requested: z.array(z.string().min(1)),\n branchName: z.string().nullable().default(null),\n noBranch: z.boolean().default(false),\n prReview: z.boolean().default(false),\n status: z.enum(['pending', 'in_progress', 'completed', 'failed']),\n createdAt: z.string().min(1),\n updatedAt: z.string().min(1),\n truncated: z.boolean().default(false),\n issues: z.array(executionPlanIssueSchema),\n excluded: z\n .array(\n z.object({\n id: z.string().min(1),\n number: z.number().int().positive().nullable(),\n title: z.string(),\n url: z.string().nullable(),\n reason: z.string(),\n }),\n )\n .default([]),\n pullRequest: pullRequestRefSchema.optional(),\n}) satisfies z.ZodType<ExecutionPlan>;\n\nexport type UserStoryNumberingSource = z.infer<typeof userStoryNumberingSourceSchema>;\nexport type UserStoryNumberingDecision = z.infer<typeof userStoryNumberingDecisionSchema>;\nexport type ProjectMetadata = z.infer<typeof projectMetadataSchema>;\nexport type ValidatedExecutionPlan = z.infer<typeof executionPlanSchema>;\nexport type GlobalWebConfig = z.infer<typeof globalWebConfigSchema>;\nexport type GlobalRetryConfig = z.infer<typeof globalRetryConfigSchema>;\nexport type GlobalCommitConfig = z.infer<typeof globalCommitConfigSchema>;\nexport type ResilienceRetryConfig = z.infer<typeof resilienceRetryConfigSchema>;\nexport type ResilienceProvidersConfig = z.infer<typeof resilienceProvidersConfigSchema>;\nexport type ProviderHealthStatus = z.infer<typeof providerHealthStatusSchema>;\nexport type ProviderHealthRecord = z.infer<typeof providerHealthRecordSchema>;\nexport type ProvidersHealth = z.infer<typeof providersHealthSchema>;\nexport type ResilienceQueueConfig = z.infer<typeof resilienceQueueConfigSchema>;\nexport type ResilienceWatchdogConfig = z.infer<typeof resilienceWatchdogConfigSchema>;\nexport type ResilienceJournalConfig = z.infer<typeof resilienceJournalConfigSchema>;\nexport type ResilienceDecomposeConfig = z.infer<typeof resilienceDecomposeConfigSchema>;\nexport type ResilienceConfig = z.infer<typeof resilienceConfigSchema>;\nexport type GlobalConfig = z.infer<typeof globalConfigSchema>;\nexport type TelemetryConfigInput = z.infer<typeof telemetryConfigInputSchema>;\n\n/**\n * The file format is a *superset* of what `resolvePolicy()` reads: it also\n * carries `providers`, `queue`, `watchdog`, `journal` and `decompose`, which\n * belong to later layers. This alias is the compile-time proof of the \"superset\"\n * half — a drift between the two shapes fails to build here rather than at the\n * first call site that passes one to the other.\n */\ntype Assert<T extends true> = T;\nexport type ResilienceConfigIsPolicyConfig = Assert<\n ResilienceConfig extends ResiliencePolicyConfig ? true : false\n>;\nexport type WebLock = z.infer<typeof webLockSchema>;\nexport type RunLock = z.infer<typeof runLockSchema>;\n","import { mkdir, readFile, rm, writeFile } from 'node:fs/promises';\nimport { hostname } from 'node:os';\nimport { dirname } from 'node:path';\nimport { type RunLock, runLockSchema } from './schemas.js';\n\n/**\n * Run ownership: who is executing in this project right now.\n *\n * Generalised from `web/lock.ts`, which has guarded the monitoring server the\n * same way since it existed — atomic `wx` create, `process.kill(pid, 0)` for\n * liveness, and a read that degrades to \"no lock\" on anything malformed. What\n * this module adds is the piece a *long* run needs and a server does not: a\n * **heartbeat**. A web server proves it is alive by answering a health probe;\n * a pipeline has no port to probe, so it says so in the file instead.\n *\n * The two signals answer different questions and both are needed:\n *\n * - the **pid** catches the machine that rebooted or the process that was\n * `kill -9`ed — the lock outlives its owner, and nothing else would notice;\n * - the **heartbeat** catches the owner that is technically alive but no longer\n * running (a pid reused by an unrelated process is the same case), and it is\n * the only signal that survives being read from another host.\n *\n * Nothing here is destructive by inference: a lock is only taken over when it\n * is stale by both measures the policy states, and taking one over is reported\n * to the caller (`reclaimedFrom`) so the run can be recorded as interrupted\n * rather than silently restarted.\n */\n\n/** The lock is rewritten this often while a run holds it. */\nexport const RUN_LOCK_HEARTBEAT_MS = 10_000;\n\n/**\n * How many missed heartbeats make a lock stale.\n *\n * Three, not one: a machine under load, a suspended laptop or a slow\n * filesystem can miss a beat without the run being dead, and stealing a lock\n * from a live owner is the failure this module exists to prevent.\n */\nexport const RUN_LOCK_STALE_INTERVALS = 3;\n\n/** How many times a claim is retried after clearing a stale lock. */\nconst CLAIM_RETRIES = 3;\n\nexport interface RunLockHandle {\n readonly lock: RunLock;\n /**\n * The dead owner this lock was taken from, when it was taken from one.\n *\n * `null` on a clean acquisition. Non-null is the fact a caller records as an\n * *interrupted* run: something was executing here and never finished.\n */\n readonly reclaimedFrom: RunLock | null;\n /** Stop the heartbeat and remove the lock. Never rejects. */\n release(): Promise<void>;\n}\n\nexport type AcquireRunLockResult =\n | { ok: true; handle: RunLockHandle }\n | { ok: false; owner: RunLock };\n\nexport interface AcquireRunLockOptions {\n /** Issue (or queue) identifier this run works on. */\n target: string;\n /** Rewrite interval. Also the unit `staleIntervals` counts. */\n heartbeatMs?: number;\n staleIntervals?: number;\n /** Injectable identity, so a test can pretend to be another process. */\n pid?: number;\n host?: string;\n /** Injectable clock, so staleness is testable without waiting. */\n clock?: () => number;\n /** Called once, when a stale lock is taken over. Never throws through. */\n onTakeover?: (previous: RunLock) => void;\n /**\n * Start the rewriting timer. Default true; a test that drives the clock by\n * hand turns it off and calls `touchRunLock` itself.\n */\n heartbeat?: boolean;\n /** The owner is a process spawned by `--background`. */\n detached?: boolean;\n}\n\n/**\n * `process.kill(pid, 0)` throws `ESRCH` when the pid is gone and `EPERM` when\n * it is alive but owned by another user — **only `ESRCH` means \"not alive\"**.\n * Reading `EPERM` as death is how a lock gets stolen from a healthy run\n * started by another user.\n */\nexport function isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (err) {\n return (err as NodeJS.ErrnoException).code === 'EPERM';\n }\n}\n\n/**\n * Read a lock, degrading anything unreadable to \"no lock\".\n *\n * A partial write, a file from an incompatible release, a truncated JSON: all\n * of them mean the same thing operationally, and none of them justifies\n * failing a run. Same behaviour as `readWebLock` and `loadGlobalConfig`.\n */\nexport async function readRunLock(lockFile: string): Promise<RunLock | null> {\n let raw: string;\n try {\n raw = await readFile(lockFile, 'utf-8');\n } catch {\n return null;\n }\n try {\n const result = runLockSchema.safeParse(JSON.parse(raw));\n return result.success ? result.data : null;\n } catch {\n return null;\n }\n}\n\n/** Remove a lock file. Best effort; never rejects. */\nexport async function removeRunLock(lockFile: string): Promise<void> {\n try {\n await rm(lockFile, { force: true });\n } catch {\n /* best-effort cleanup */\n }\n}\n\nexport interface StalenessOptions {\n heartbeatMs?: number;\n staleIntervals?: number;\n clock?: () => number;\n /** Treat this pid as our own, so a re-entrant claim is not \"stale\". */\n pid?: number;\n host?: string;\n}\n\n/**\n * Whether `lock` may be taken over.\n *\n * A lock written on another host cannot be judged by pid — `process.kill` there\n * says nothing about a process here — so on a foreign host only the heartbeat\n * decides. That is the case a shared filesystem creates, and reading it wrong\n * is how two machines end up on the same branch.\n */\nexport function isRunLockStale(lock: RunLock, options: StalenessOptions = {}): boolean {\n const heartbeatMs = options.heartbeatMs ?? RUN_LOCK_HEARTBEAT_MS;\n const staleIntervals = options.staleIntervals ?? RUN_LOCK_STALE_INTERVALS;\n const now = (options.clock ?? Date.now)();\n const host = options.host ?? hostname();\n\n const beat = Date.parse(lock.lastHeartbeatAt);\n const silent = Number.isNaN(beat) || now - beat > heartbeatMs * staleIntervals;\n\n if (lock.host !== host) return silent;\n return silent || !isProcessAlive(lock.pid);\n}\n\n/** Whether this very process already owns `lock`. */\nfunction isSelf(lock: RunLock, pid: number, host: string): boolean {\n return lock.pid === pid && lock.host === host;\n}\n\n/**\n * One line naming the owner, for the message a refused invocation prints.\n *\n * The pid alone is useless to a person; the pid *plus the host plus when it\n * last said anything* is what lets them decide between waiting and killing it.\n */\nexport function describeRunLockOwner(lock: RunLock): string {\n return `pid ${lock.pid} on ${lock.host} (issue ${lock.target}, started ${lock.startedAt}, last heartbeat ${lock.lastHeartbeatAt})`;\n}\n\n/** Rewrite the lock with a fresh heartbeat. Never rejects. */\nexport async function touchRunLock(lockFile: string, lock: RunLock, at: string): Promise<RunLock> {\n const next: RunLock = { ...lock, lastHeartbeatAt: at };\n try {\n await writeFile(lockFile, `${JSON.stringify(next, null, 2)}\\n`, 'utf-8');\n } catch {\n // A heartbeat that cannot be written is not worth failing a run over: the\n // worst case is that another invocation eventually judges us stale, which\n // is the same outcome as this process having died.\n }\n return next;\n}\n\n/**\n * Atomic exclusive create. `wx` fails with `EEXIST` when someone else won the\n * race, which is what lets two concurrent invocations agree on one winner\n * without a lock for the lock.\n */\nasync function claim(lockFile: string, lock: RunLock): Promise<boolean> {\n try {\n await mkdir(dirname(lockFile), { recursive: true });\n await writeFile(lockFile, `${JSON.stringify(lock, null, 2)}\\n`, {\n encoding: 'utf-8',\n flag: 'wx',\n });\n return true;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'EEXIST') return false;\n throw err;\n }\n}\n\n/**\n * Take ownership of the run in this project, or report who already has it.\n *\n * Three outcomes, and only three:\n *\n * 1. **free** — the lock is claimed and a heartbeat starts;\n * 2. **held by a dead owner** — the stale lock is cleared, claimed, and the\n * previous owner comes back on `reclaimedFrom` so the caller can record the\n * interrupted run;\n * 3. **held by a live owner** — `{ ok: false, owner }`, and the caller refuses\n * with a message naming it. Nothing is deleted, nothing is retried into\n * submission.\n *\n * A lock this very process already holds is outcome 1 with a no-op release:\n * re-entering is not a conflict, and a nested acquisition must not remove the\n * file the outer one still owns.\n */\nexport async function acquireRunLock(\n lockFile: string,\n options: AcquireRunLockOptions,\n): Promise<AcquireRunLockResult> {\n const pid = options.pid ?? process.pid;\n const host = options.host ?? hostname();\n const heartbeatMs = options.heartbeatMs ?? RUN_LOCK_HEARTBEAT_MS;\n const clock = options.clock ?? Date.now;\n const staleness: StalenessOptions = {\n heartbeatMs,\n ...(options.staleIntervals === undefined ? {} : { staleIntervals: options.staleIntervals }),\n clock,\n pid,\n host,\n };\n\n let reclaimedFrom: RunLock | null = null;\n\n for (let attempt = 0; attempt <= CLAIM_RETRIES; attempt++) {\n const at = new Date(clock()).toISOString();\n const mine: RunLock = {\n pid,\n host,\n target: options.target,\n startedAt: at,\n lastHeartbeatAt: at,\n ...(options.detached === true ? { detached: true } : {}),\n };\n\n if (await claim(lockFile, mine)) {\n return { ok: true, handle: startHandle(lockFile, mine, reclaimedFrom, options) };\n }\n\n const existing = await readRunLock(lockFile);\n\n if (existing === null) {\n // Unreadable: a partial write, or a file from a shape we do not know.\n // Treated as absent, exactly as `readRunLock` documents.\n await removeRunLock(lockFile);\n continue;\n }\n\n if (isSelf(existing, pid, host)) {\n return { ok: true, handle: nestedHandle(existing) };\n }\n\n if (!isRunLockStale(existing, staleness)) {\n return { ok: false, owner: existing };\n }\n\n reclaimedFrom = existing;\n try {\n options.onTakeover?.(existing);\n } catch {\n // A caller's bookkeeping must not decide whether the run starts.\n }\n await removeRunLock(lockFile);\n }\n\n // Every attempt lost the race and every lock read was stale or unreadable:\n // something else is fighting for this file. Refusing is the safe answer.\n const owner = await readRunLock(lockFile);\n if (owner !== null) return { ok: false, owner };\n return {\n ok: false,\n owner: {\n pid: 0,\n host,\n target: options.target,\n startedAt: new Date(clock()).toISOString(),\n lastHeartbeatAt: new Date(clock()).toISOString(),\n },\n };\n}\n\nfunction startHandle(\n lockFile: string,\n lock: RunLock,\n reclaimedFrom: RunLock | null,\n options: AcquireRunLockOptions,\n): RunLockHandle {\n const heartbeatMs = options.heartbeatMs ?? RUN_LOCK_HEARTBEAT_MS;\n const clock = options.clock ?? Date.now;\n let current = lock;\n let timer: NodeJS.Timeout | null = null;\n\n if (options.heartbeat !== false) {\n timer = setInterval(() => {\n void touchRunLock(lockFile, current, new Date(clock()).toISOString()).then((next) => {\n current = next;\n });\n }, heartbeatMs);\n // The heartbeat must never be the reason a process stays alive.\n timer.unref();\n }\n\n return {\n lock,\n reclaimedFrom,\n release: async () => {\n if (timer !== null) {\n clearInterval(timer);\n timer = null;\n }\n await removeRunLock(lockFile);\n },\n };\n}\n\n/** A re-entrant acquisition: same owner, no timer of its own, no removal. */\nfunction nestedHandle(lock: RunLock): RunLockHandle {\n return { lock, reclaimedFrom: null, release: async () => {} };\n}\n"],"mappings":"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","names":["z","z","z","z","z"]}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
runAcceptance
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-BSBJXPLC.js";
|
|
5
5
|
import {
|
|
6
6
|
printError,
|
|
7
7
|
printSuccess,
|
|
8
8
|
printWarning
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-SVDEWOUD.js";
|
|
10
10
|
import {
|
|
11
11
|
setLastError
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-GVOZ6NDO.js";
|
|
13
13
|
|
|
14
14
|
// src/verify/present.ts
|
|
15
15
|
function formatVerificationLine(verdict, level = null) {
|
|
@@ -71,4 +71,4 @@ export {
|
|
|
71
71
|
runAcceptanceGate,
|
|
72
72
|
applyAcceptanceToPlan
|
|
73
73
|
};
|
|
74
|
-
//# sourceMappingURL=chunk-
|
|
74
|
+
//# sourceMappingURL=chunk-QZOBR6YF.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
trimErrorMessage
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-GVOZ6NDO.js";
|
|
5
5
|
|
|
6
6
|
// src/telemetry/redact.ts
|
|
7
7
|
var SECRET = /(?:sk-ant-|sk-|ghp_|gho_|github_pat_|xox[baprs]-)[A-Za-z0-9_-]{8,}/g;
|
|
@@ -22,4 +22,4 @@ export {
|
|
|
22
22
|
redactSecrets,
|
|
23
23
|
redactFailureMessage
|
|
24
24
|
};
|
|
25
|
-
//# sourceMappingURL=chunk-
|
|
25
|
+
//# sourceMappingURL=chunk-R42YHLDV.js.map
|
|
@@ -234,7 +234,8 @@ function applyEvent(snapshot, event, options) {
|
|
|
234
234
|
node: event.environment.node,
|
|
235
235
|
platform: event.environment.platform,
|
|
236
236
|
agent: event.environment.agent ?? null,
|
|
237
|
-
model: event.environment.model ?? null
|
|
237
|
+
model: event.environment.model ?? null,
|
|
238
|
+
cliVersion: event.environment.cliVersion ?? null
|
|
238
239
|
} : null
|
|
239
240
|
};
|
|
240
241
|
}
|
|
@@ -772,4 +773,4 @@ export {
|
|
|
772
773
|
setSessionPublisher,
|
|
773
774
|
getSessionPublisher
|
|
774
775
|
};
|
|
775
|
-
//# sourceMappingURL=chunk-
|
|
776
|
+
//# sourceMappingURL=chunk-ROIIEVZH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/session-state.ts","../src/core/session-publisher.ts"],"sourcesContent":["import { mkdir, rename, utimes, writeFile } from 'node:fs/promises';\nimport { dirname } from 'node:path';\nimport { stripVTControlCharacters } from 'node:util';\nimport type { FailureKind } from '../resilience/errors.js';\nimport { setTelemetrySessionId } from '../telemetry/session-id.js';\nimport type { ExecutionRecord } from '../telemetry/types.js';\nimport type { StoryStage, UserStory, UserStoryStatus } from '../types.js';\n\n/**\n * Session state publishing layer for the optional web monitoring mode.\n *\n * Instrumentation points call publish() with SessionEvents; a pure reducer\n * folds each event into an in-memory SessionSnapshot that any surface\n * (file, HTTP endpoint, future webhooks) can consume in a single format.\n *\n * Monitoring must never affect the pipeline: publish() is synchronous and\n * never throws, and all publisher I/O failures are swallowed after a\n * single warning.\n */\n\nexport type SessionLogLevel = 'info' | 'warn' | 'error';\nexport type SessionStatus = 'idle' | 'running' | 'completed' | 'failed';\nexport type SessionPhaseStatus = 'pending' | 'running' | 'completed' | 'failed';\n\n/** Default max entries retained in the logs ring buffer. */\nexport const DEFAULT_LOG_LIMIT = 200;\n\n/** Default minimum interval between FilePublisher disk writes. */\nexport const DEFAULT_THROTTLE_MS = 1000;\n\n/** Default interval for touching a live session file without rewriting it. */\nexport const DEFAULT_SESSION_HEARTBEAT_MS = 10_000;\n\nexport type SessionEvent =\n | {\n type: 'session:start';\n at: string;\n sessionId: string;\n /** `null` for local identifiers that are not numbers. */\n issueNumber: number | null;\n issueUrl?: string;\n branch?: string;\n baseBranch?: string;\n phases: string[];\n environment?: SessionEnvironment;\n configuration?: SessionConfigurationSnapshot;\n branchCreated?: boolean | null;\n startCommit?: string | null;\n }\n | {\n /**\n * Structural data of the Issue being worked on, published once the\n * provider has resolved it. Merged over the `issue` section instead of\n * replacing it, so the number and the URL that came with `session:start`\n * survive an origin that reports neither.\n */\n type: 'issue:update';\n at: string;\n number: number | null;\n url?: string;\n title: string | null;\n /** Issue body, published whole — no truncation. */\n description: string | null;\n labels: string[];\n state: string | null;\n }\n | { type: 'phase:start'; at: string; phase: string }\n | {\n type: 'phase:end';\n at: string;\n phase: string;\n success: boolean;\n error?: string;\n harnessExecutionMs?: number | null;\n orchestrationOverheadMs?: number | null;\n harnessStartupMs?: number | null;\n ttftMs?: number | null;\n attemptCount?: number | null;\n retryDurationMs?: number | null;\n }\n | {\n type: 'iteration:start';\n at: string;\n iteration: number;\n /**\n * Id of the story `execute` is about to work on, computed by\n * `core/engine.ts` with the same \"highest priority, `passes: false`\"\n * rule `prompts/execute.md` gives the agent. Optional so a caller that\n * cannot determine it (or an older build) is still a valid event —\n * `applyEvent` simply skips the `executing`/`pending` transition then.\n */\n storyId?: string;\n }\n | { type: 'iteration:end'; at: string; iteration: number }\n | {\n type: 'retry';\n at: string;\n attempt: number;\n delaySeconds?: number;\n reason?: string;\n /**\n * What the resilience layer classified the failure as. Optional so an\n * event written by an older build — or by a caller with nothing but a\n * message — stays valid; the reducer only counts retries either way.\n */\n kind?: FailureKind;\n }\n | {\n type: 'agent:attempt';\n at: string;\n attempt: number;\n provider: string;\n model?: string | null;\n primaryProvider: string;\n }\n | {\n type: 'failover';\n at: string;\n from: string;\n to: string;\n reason: FailureKind | null;\n cooldownUntil?: string | null;\n }\n | {\n type: 'agent:result';\n at: string;\n provider: string;\n success: boolean;\n failureKind?: FailureKind;\n cooldownUntil?: string | null;\n }\n | { type: 'agent:activity'; at: string; provider: string }\n | { type: 'stories:update'; at: string; stories: UserStory[] }\n | { type: 'activity'; at: string; story?: string; tool?: string; detail?: string }\n | { type: 'log'; at: string; level: SessionLogLevel; message: string }\n | {\n type: 'process:output';\n at: string;\n phase: string;\n executionId: string | null;\n provider: string;\n stream: 'stdout' | 'stderr' | 'combined';\n message: string;\n }\n | { type: 'execution:update'; at: string; execution: ExecutionRecord }\n | { type: 'correction:cycle'; at: string; cycle: number; maxCycles: number }\n | {\n type: 'metrics:update';\n at: string;\n /**\n * Where the metrics land:\n * - `phase`: the named phase plus the issue-wide aggregate;\n * - `iteration`: one execute-loop pass — same targets as `phase`;\n * - `story`: the story alone, never the phase nor the aggregate (the\n * iteration event of the same cycle already counted those tokens).\n */\n scope: 'phase' | 'iteration' | 'story';\n phase?: string;\n storyId?: string;\n iteration?: number;\n inputTokens?: number;\n outputTokens?: number;\n cacheReadTokens?: number;\n cacheCreationTokens?: number;\n costUsd?: number;\n durationSeconds?: number;\n }\n | {\n /**\n * One publication feeds both the `git` section (branch, base, commits)\n * and the `repository` section (identity and location). They come from\n * the same collection pass, so extending this event keeps `branch`\n * consistent across the two instead of racing a second event.\n *\n * Every field is optional: `undefined` means \"not collected in this\n * publication\" and leaves the snapshot untouched, while an explicit\n * `null` means \"collected and unavailable\" and is written as-is.\n */\n type: 'git:update';\n at: string;\n branch?: string;\n baseBranch?: string;\n branchCreated?: boolean | null;\n commits?: SessionCommit[];\n pullRequests?: SessionPullRequest[];\n /** `owner/repo`, derived from the origin remote. */\n repositoryName?: string | null;\n remoteUrl?: string | null;\n headCommit?: string | null;\n repositoryRoot?: string | null;\n }\n | { type: 'session:end'; at: string; status: 'completed' | 'failed'; error?: string }\n | {\n type: 'verify:end';\n at: string;\n verdict: 'passed' | 'failed' | 'unverified';\n level: string;\n independence: string | null;\n executionId: string | null;\n };\n\nexport interface SessionEnvironment {\n node: string;\n platform: string;\n /** Winning agent provider for the run. `null` on snapshots from earlier releases. */\n agent: string | null;\n /** Winning model for the run. `null` when unset or on older snapshots. */\n model: string | null;\n /**\n * Version of the `issue-flow` package that produced the run. `null` on\n * snapshots written before it was recorded. It is the version of the CLI, not\n * of the monitor serving the dashboard — the two can differ, which is exactly\n * what `--restart-web` exists to fix.\n */\n cliVersion: string | null;\n}\n\nexport interface SessionLogEntry {\n at: string;\n level: SessionLogLevel;\n message: string;\n}\n\nexport interface SessionProcessLogEntry {\n at: string;\n phase: string;\n executionId: string | null;\n provider: string;\n stream: 'stdout' | 'stderr' | 'combined';\n message: string;\n}\n\nexport interface SessionConfigurationValue {\n value: string | null;\n source: 'default' | 'global' | 'project' | 'env' | 'cli' | 'fallback';\n}\n\nexport interface SessionPhaseConfiguration {\n phase: string;\n provider: SessionConfigurationValue;\n model: SessionConfigurationValue;\n}\n\nexport interface SessionConfigurationSnapshot {\n precedence: string[];\n defaultProvider: SessionConfigurationValue;\n defaultModel: SessionConfigurationValue;\n phases: SessionPhaseConfiguration[];\n fallbacks: string[];\n overrides: string[];\n}\n\nexport interface SessionStageHistoryEntry {\n at: string;\n stage: StoryStage;\n detail: string | null;\n}\n\n/**\n * Token/cost counters attached to a phase or a story.\n *\n * `null` means \"never reported\" — the `claude` CLI does not always return\n * usage data, and a metric that was never observed must stay distinguishable\n * from an observed zero.\n */\nexport interface SessionUsageSnapshot {\n inputTokens: number | null;\n outputTokens: number | null;\n cacheReadTokens: number | null;\n cacheCreationTokens: number | null;\n costUsd: number | null;\n}\n\n/** Issue-wide totals, accumulated from phase- and iteration-scoped metrics. */\nexport interface SessionMetricsSnapshot {\n totalInputTokens: number | null;\n totalOutputTokens: number | null;\n totalCacheReadTokens: number | null;\n totalCacheCreationTokens: number | null;\n totalCostUsd: number | null;\n}\n\nexport interface SessionPhaseSnapshot extends SessionUsageSnapshot {\n name: string;\n status: SessionPhaseStatus;\n startedAt: string | null;\n endedAt: string | null;\n durationSeconds: number | null;\n error: string | null;\n /** Sum of invocation walls for this phase. */\n harnessExecutionMs: number | null;\n /** Phase wall minus harnessExecutionMs, when both are known. */\n orchestrationOverheadMs: number | null;\n /** Wall clock − CLI `duration_ms`. */\n harnessStartupMs: number | null;\n /** Time to first output, when the harness reports it. */\n ttftMs: number | null;\n attemptCount: number | null;\n retryDurationMs: number | null;\n}\n\nexport interface SessionStorySnapshot extends SessionUsageSnapshot {\n id: string;\n title: string;\n priority: number;\n passes: boolean;\n /**\n * When the story flipped to passing during this session; null for stories\n * that were already passing at session start (their duration is unknown).\n */\n completedAt: string | null;\n /** Wall-clock seconds attributed to the story, or null when unknown. */\n durationSeconds: number | null;\n /**\n * Board-style status, recomputed on every reduction by\n * {@link deriveStoryStatus}. Observational: the pipeline keeps deciding what\n * to execute from `passes`.\n */\n status: UserStoryStatus;\n /** IDs of the stories this one depends on, as declared in the plan. */\n dependencies: string[];\n /** The plan's description; empty string when the plan carries none. */\n description: string;\n /** The plan's acceptance criteria; empty when the plan carries none. */\n acceptanceCriteria: string[];\n /**\n * Fine-grained execution stage, derived only from real pipeline events —\n * see {@link StoryStage} and the `applyEvent` cases for `iteration:start`,\n * `stories:update`, `phase:start`/`phase:end` (phase `'review'`) and\n * `correction:cycle`. Unlike `status`, this is not a post-hoc derivation\n * recomputed on every reduction: it is set directly, event by event, like\n * `completedAt`.\n */\n stage: StoryStage;\n /** ISO timestamp of the event that produced the current `stage`. */\n stageSince: string | null;\n /** Short human detail for the current stage (e.g. a correction cycle). */\n stageDetail: string | null;\n /** Append-only transition history retained in the snapshot for the drawer. */\n history: SessionStageHistoryEntry[];\n}\n\nexport interface SessionActivity {\n story: string | null;\n tool: string | null;\n detail: string | null;\n since: string;\n}\n\n/** Live resilience state for the current agent invocation. */\nexport interface SessionResilienceSnapshot {\n attempt: number;\n provider: string | null;\n model: string | null;\n lastFailureKind: FailureKind | null;\n cooldownUntil: string | null;\n lastActivityAt: string | null;\n}\n\nexport interface SessionCommit {\n hash: string;\n subject: string;\n committedAt?: string | null;\n storyId?: string | null;\n}\n\nexport interface SessionPullRequest {\n number: number;\n url: string;\n title: string;\n}\n\n/**\n * The Issue under execution, as far as the session knows it.\n *\n * `number`/`url` come with `session:start`; the remaining fields arrive with\n * `issue:update`, once the provider has resolved the Issue. Everything is\n * nullable because a run may start before (or without) that resolution —\n * `null` means \"not reported\", never \"empty\".\n */\nexport interface SessionIssueSnapshot {\n number: number | null;\n url: string | null;\n title: string | null;\n /** Issue body in full; the consumer decides how to fold it. */\n description: string | null;\n labels: string[];\n /** Provider lifecycle state ('open' / 'closed' for the built-ins). */\n state: string | null;\n}\n\n/**\n * Where the run is happening: which repository, which checkout, which commit.\n *\n * Fed by `git:update` (see `publishGitState`). Every field is nullable because\n * each source is independent and failure-tolerant — no remote configured, a\n * repository with no commits yet or a missing git binary all show up as\n * `null` instead of failing the publication.\n */\nexport interface SessionRepositorySnapshot {\n /** `owner/repo`, derived from the origin remote; null without one. */\n name: string | null;\n remoteUrl: string | null;\n branch: string | null;\n /** Abbreviated hash of HEAD. */\n headCommit: string | null;\n /** Absolute path of the working directory the pipeline runs from. */\n root: string | null;\n}\n\nexport interface SessionSnapshot {\n schemaVersion: 1;\n sessionId: string | null;\n readOnly: true;\n capabilities: string[];\n issue: SessionIssueSnapshot;\n status: SessionStatus;\n startedAt: string | null;\n updatedAt: string | null;\n endedAt: string | null;\n elapsedSeconds: number | null;\n estimatedRemainingSeconds: number | null;\n progress: {\n percent: number;\n phasesCompleted: number;\n phasesTotal: number;\n storiesCompleted: number;\n storiesTotal: number;\n };\n currentPhase: string | null;\n currentActivity: SessionActivity | null;\n phases: SessionPhaseSnapshot[];\n stories: SessionStorySnapshot[];\n metrics: SessionMetricsSnapshot;\n execution: {\n iteration: number;\n retries: number;\n correctionCycle: number;\n maxCorrectionCycles: number | null;\n };\n executions: ExecutionRecord[];\n processLogs: SessionProcessLogEntry[];\n configuration: SessionConfigurationSnapshot | null;\n resilience: SessionResilienceSnapshot;\n git: {\n branch: string | null;\n baseBranch: string | null;\n branchCreated: boolean | null;\n startCommit: string | null;\n commits: SessionCommit[];\n };\n repository: SessionRepositorySnapshot;\n pullRequests: SessionPullRequest[];\n logs: SessionLogEntry[];\n errors: SessionLogEntry[];\n warnings: SessionLogEntry[];\n lastError: { message: string; at: string } | null;\n nextSteps: string[];\n environment: SessionEnvironment | null;\n /** Acceptance-contract verdict. `null` until a contract has run. */\n verification: {\n verdict: 'passed' | 'failed' | 'unverified' | null;\n level: string | null;\n independence: string | null;\n } | null;\n}\n\nexport interface SessionReducerOptions {\n /** Max entries retained in the logs ring buffer. */\n logLimit?: number;\n}\n\n/** Fresh, all-null usage counters for a new phase or story entry. */\nfunction emptyUsage(): SessionUsageSnapshot {\n return {\n inputTokens: null,\n outputTokens: null,\n cacheReadTokens: null,\n cacheCreationTokens: null,\n costUsd: null,\n };\n}\n\nfunction emptyPhaseTiming(): Pick<\n SessionPhaseSnapshot,\n | 'harnessExecutionMs'\n | 'orchestrationOverheadMs'\n | 'harnessStartupMs'\n | 'ttftMs'\n | 'attemptCount'\n | 'retryDurationMs'\n> {\n return {\n harnessExecutionMs: null,\n orchestrationOverheadMs: null,\n harnessStartupMs: null,\n ttftMs: null,\n attemptCount: null,\n retryDurationMs: null,\n };\n}\n\nfunction emptyMetrics(): SessionMetricsSnapshot {\n return {\n totalInputTokens: null,\n totalOutputTokens: null,\n totalCacheReadTokens: null,\n totalCacheCreationTokens: null,\n totalCostUsd: null,\n };\n}\n\nexport function createInitialSnapshot(): SessionSnapshot {\n return {\n schemaVersion: 1,\n sessionId: null,\n readOnly: true,\n capabilities: [],\n issue: { number: null, url: null, title: null, description: null, labels: [], state: null },\n status: 'idle',\n startedAt: null,\n updatedAt: null,\n endedAt: null,\n elapsedSeconds: null,\n estimatedRemainingSeconds: null,\n progress: {\n percent: 0,\n phasesCompleted: 0,\n phasesTotal: 0,\n storiesCompleted: 0,\n storiesTotal: 0,\n },\n currentPhase: null,\n currentActivity: null,\n phases: [],\n stories: [],\n metrics: emptyMetrics(),\n execution: { iteration: 0, retries: 0, correctionCycle: 0, maxCorrectionCycles: null },\n executions: [],\n processLogs: [],\n configuration: null,\n resilience: {\n attempt: 0,\n provider: null,\n model: null,\n lastFailureKind: null,\n cooldownUntil: null,\n lastActivityAt: null,\n },\n git: {\n branch: null,\n baseBranch: null,\n branchCreated: null,\n startCommit: null,\n commits: [],\n },\n repository: { name: null, remoteUrl: null, branch: null, headCommit: null, root: null },\n pullRequests: [],\n logs: [],\n errors: [],\n warnings: [],\n lastError: null,\n nextSteps: [],\n environment: null,\n verification: null,\n };\n}\n\ntype MetricsUpdateEvent = Extract<SessionEvent, { type: 'metrics:update' }>;\n\n/**\n * Add a reported delta to an accumulator. `undefined` means \"not reported\":\n * it leaves the accumulator untouched, so a metric the CLI never returned\n * stays null instead of collapsing to zero.\n */\nfunction accumulate(current: number | null, delta: number | undefined): number | null {\n return delta === undefined ? current : (current ?? 0) + delta;\n}\n\n/** Fold the event's token/cost fields into a phase or story entry. */\nfunction accumulateUsage<T extends SessionUsageSnapshot>(target: T, event: MetricsUpdateEvent): T {\n return {\n ...target,\n inputTokens: accumulate(target.inputTokens, event.inputTokens),\n outputTokens: accumulate(target.outputTokens, event.outputTokens),\n cacheReadTokens: accumulate(target.cacheReadTokens, event.cacheReadTokens),\n cacheCreationTokens: accumulate(target.cacheCreationTokens, event.cacheCreationTokens),\n costUsd: accumulate(target.costUsd, event.costUsd),\n };\n}\n\n/**\n * Pick between a reported value and the one already in the snapshot.\n * Unlike `??`, an explicitly reported `null` wins: only `undefined` — the\n * absence of the field on the event — keeps the previous value.\n */\nfunction reported<T>(value: T | undefined, previous: T): T {\n return value === undefined ? previous : value;\n}\n\n/**\n * Seconds between two ISO timestamps, or null when either is unparsable.\n */\nfunction secondsBetween(from: string | null, to: string): number | null {\n if (from === null) return null;\n const fromMs = Date.parse(from);\n const toMs = Date.parse(to);\n if (Number.isNaN(fromMs) || Number.isNaN(toMs)) return null;\n return Math.max(0, Math.round((toMs - fromMs) / 1000));\n}\n\nfunction computePercent(phasesCompleted: number, phasesTotal: number): number {\n if (phasesTotal === 0) return 0;\n return Math.round((phasesCompleted / phasesTotal) * 100);\n}\n\n/**\n * Estimated seconds until all stories pass: average duration of the stories\n * completed during this session × pending stories. Durations are the gaps\n * between consecutive completions (the first is measured from startedAt).\n * Published as null with fewer than two samples.\n */\nfunction estimateRemainingSeconds(snapshot: SessionSnapshot): number | null {\n const completions = snapshot.stories\n .map((story) => (story.completedAt === null ? Number.NaN : Date.parse(story.completedAt)))\n .filter((ms) => !Number.isNaN(ms))\n .sort((a, b) => a - b);\n if (completions.length < 2) return null;\n\n const startMs = snapshot.startedAt === null ? Number.NaN : Date.parse(snapshot.startedAt);\n const boundaries = Number.isNaN(startMs) ? completions : [startMs, ...completions];\n const durations: number[] = [];\n for (let i = 1; i < boundaries.length; i++) {\n durations.push(Math.max(0, boundaries[i] - boundaries[i - 1]));\n }\n if (durations.length === 0) return null;\n\n const averageMs = durations.reduce((sum, d) => sum + d, 0) / durations.length;\n const pending = snapshot.stories.filter((story) => !story.passes).length;\n return Math.round((averageMs * pending) / 1000);\n}\n\n/**\n * Remaining pipeline phases, in order. The phase list originates from the\n * session:start event, whose caller passes PIPELINE_PHASES (or\n * PIPELINE_PHASES_NO_BRANCH in --no-branch mode) from src/core/pipeline.ts.\n */\nfunction deriveNextSteps(snapshot: SessionSnapshot): string[] {\n if (snapshot.status === 'completed') return [];\n return snapshot.phases.filter((phase) => phase.status === 'pending').map((phase) => phase.name);\n}\n\n/**\n * Board status of a single story, in a fixed order that makes the derivation\n * idempotent — recomputing it over its own result yields the same value:\n *\n * 1. `passes: true` → `done` (execution is the only authority on completion);\n * 2. already `in_review` → kept, since nothing here can produce or clear it;\n * 3. the story owns the current activity → `in_progress`;\n * 4. otherwise → `backlog`.\n *\n * `in_review` is therefore never derived: it only enters through an explicit\n * `status` in tasks.json, and leaves when the story starts passing.\n */\nfunction deriveStoryStatus(\n story: SessionStorySnapshot,\n activeStory: string | null,\n): UserStoryStatus {\n if (story.passes) return 'done';\n if (story.status === 'in_review') return 'in_review';\n if (activeStory !== null && activeStory === story.id) return 'in_progress';\n return 'backlog';\n}\n\n/** Recompute every story's status; entries that do not change keep identity. */\nfunction deriveStoryStatuses(snapshot: SessionSnapshot): SessionStorySnapshot[] {\n const activeStory = snapshot.currentActivity?.story ?? null;\n return snapshot.stories.map((story) => {\n const status = deriveStoryStatus(story, activeStory);\n return status === story.status ? story : { ...story, status };\n });\n}\n\n/**\n * Fold a SessionEvent into a SessionSnapshot. Pure: never mutates the input\n * and performs no I/O. Unknown event types return the snapshot unchanged.\n *\n * errors/warnings are derived slices of the logs ring buffer, recomputed on\n * each reduction — they are never accumulated separately. The same applies\n * to estimatedRemainingSeconds, nextSteps and each story's status.\n */\nexport function reduceSessionEvent(\n snapshot: SessionSnapshot,\n event: SessionEvent,\n options?: SessionReducerOptions,\n): SessionSnapshot {\n const next = applyEvent(snapshot, event, options);\n if (next === snapshot) return snapshot;\n\n const elapsedSeconds = secondsBetween(next.startedAt, event.at) ?? next.elapsedSeconds;\n return {\n ...next,\n updatedAt: event.at,\n elapsedSeconds,\n stories: deriveStoryStatuses(next),\n estimatedRemainingSeconds: estimateRemainingSeconds(next),\n errors: next.logs.filter((entry) => entry.level === 'error'),\n warnings: next.logs.filter((entry) => entry.level === 'warn'),\n nextSteps: deriveNextSteps(next),\n };\n}\n\n/**\n * Stages that describe a finished story. A run that ends — successfully or\n * not — must never leave a story on any other stage, or the panel keeps\n * claiming it is executing long after the process is gone.\n */\nfunction isTerminalStage(stage: StoryStage): boolean {\n return stage === 'done' || stage === 'failed';\n}\n\nfunction transitionStory(\n story: SessionStorySnapshot,\n stage: StoryStage,\n at: string,\n detail: string | null,\n): SessionStorySnapshot {\n if (story.stage === stage && story.stageDetail === detail) return story;\n return {\n ...story,\n stage,\n stageSince: at,\n stageDetail: detail,\n history: [...story.history, { at, stage, detail }],\n };\n}\n\n/**\n * `stage`/`stageSince`/`stageDetail` for one story, on one `stories:update`.\n *\n * This event owns exactly one transition — `awaiting_review` the moment a\n * story flips to `passes: true` (or is first seen already passing, since its\n * real completion moment is unknown either way). Everything else is a\n * carry-over: a still-`passes: false` story keeps whatever `iteration:start`\n * last gave it (defaulting to `'pending'` the very first time it is ever\n * seen), and a story already passing before this event is left exactly as it\n * was — `phase:start`/`phase:end` (review) and `correction:cycle` own every\n * transition past `awaiting_review`.\n */\nfunction deriveStageOnStoriesUpdate(\n story: UserStory,\n before: SessionStorySnapshot | undefined,\n at: string,\n): Pick<SessionStorySnapshot, 'stage' | 'stageSince' | 'stageDetail'> {\n if (!story.passes) {\n return {\n stage: before?.stage ?? 'pending',\n stageSince: before?.stageSince ?? at,\n stageDetail: before?.stageDetail ?? null,\n };\n }\n if (before?.passes) {\n return { stage: before.stage, stageSince: before.stageSince, stageDetail: before.stageDetail };\n }\n return { stage: 'awaiting_review', stageSince: at, stageDetail: null };\n}\n\nfunction applyEvent(\n snapshot: SessionSnapshot,\n event: SessionEvent,\n options?: SessionReducerOptions,\n): SessionSnapshot {\n switch (event.type) {\n case 'session:start': {\n setTelemetrySessionId(event.sessionId);\n const initial = createInitialSnapshot();\n return {\n ...initial,\n sessionId: event.sessionId,\n issue: { ...initial.issue, number: event.issueNumber, url: event.issueUrl ?? null },\n status: 'running',\n startedAt: event.at,\n progress: {\n ...initial.progress,\n phasesTotal: event.phases.length,\n },\n phases: event.phases.map((name) => ({\n name,\n status: 'pending' as const,\n startedAt: null,\n endedAt: null,\n durationSeconds: null,\n error: null,\n ...emptyPhaseTiming(),\n ...emptyUsage(),\n })),\n git: {\n branch: event.branch ?? null,\n baseBranch: event.baseBranch ?? null,\n branchCreated: event.branchCreated ?? null,\n startCommit: event.startCommit ?? null,\n commits: [],\n },\n // The branch is the one piece of repository identity the session\n // already knows here; the rest waits for publishGitState. Seeding it\n // keeps git.branch and repository.branch consistent for a poll that\n // lands before the first git:update.\n repository: { ...initial.repository, branch: event.branch ?? null },\n configuration: event.configuration ?? null,\n environment: event.environment\n ? {\n node: event.environment.node,\n platform: event.environment.platform,\n agent: event.environment.agent ?? null,\n model: event.environment.model ?? null,\n cliVersion: event.environment.cliVersion ?? null,\n }\n : null,\n };\n }\n\n case 'issue:update':\n return {\n ...snapshot,\n issue: {\n ...snapshot.issue,\n // Merge, not replacement: the run may know a number and a URL that\n // the provider does not report (a local Issue mirroring a remote\n // one), and enriching the section must never erase them.\n number: event.number ?? snapshot.issue.number,\n url: event.url ?? snapshot.issue.url,\n title: event.title,\n description: event.description,\n labels: event.labels,\n state: event.state,\n },\n };\n\n case 'phase:start': {\n const known = snapshot.phases.some((p) => p.name === event.phase);\n const phases = known\n ? snapshot.phases.map((p) =>\n p.name === event.phase\n ? {\n ...p,\n status: 'running' as const,\n startedAt: event.at,\n endedAt: null,\n error: null,\n }\n : p,\n )\n : [\n ...snapshot.phases,\n {\n name: event.phase,\n status: 'running' as const,\n startedAt: event.at,\n endedAt: null,\n durationSeconds: null,\n error: null,\n ...emptyPhaseTiming(),\n ...emptyUsage(),\n },\n ];\n // The `execute` phase only completes (and `review` only starts) once\n // every story already passes — a pipeline invariant — so entering\n // `review` safely moves every passing story to 'in_review' in one go;\n // there is never a not-yet-passing story to skip over here.\n const stories =\n event.phase === 'review'\n ? snapshot.stories.map((story) =>\n story.passes ? transitionStory(story, 'in_review', event.at, null) : story,\n )\n : snapshot.stories;\n return {\n ...snapshot,\n currentPhase: event.phase,\n phases,\n stories,\n progress: known ? snapshot.progress : { ...snapshot.progress, phasesTotal: phases.length },\n };\n }\n\n case 'phase:end': {\n const phases = snapshot.phases.map((p) =>\n p.name === event.phase\n ? {\n ...p,\n status: event.success ? ('completed' as const) : ('failed' as const),\n endedAt: event.at,\n durationSeconds: secondsBetween(p.startedAt, event.at),\n error: event.error ? stripVTControlCharacters(event.error) : null,\n harnessExecutionMs: event.harnessExecutionMs ?? p.harnessExecutionMs,\n orchestrationOverheadMs: event.orchestrationOverheadMs ?? p.orchestrationOverheadMs,\n harnessStartupMs: event.harnessStartupMs ?? p.harnessStartupMs,\n ttftMs: event.ttftMs ?? p.ttftMs,\n attemptCount: event.attemptCount ?? p.attemptCount,\n retryDurationMs: event.retryDurationMs ?? p.retryDurationMs,\n }\n : p,\n );\n const phasesCompleted = phases.filter((p) => p.status === 'completed').length;\n // Success moves every passing story to 'done'. Failure (the correction\n // loop gave up after maxCorrectionCycles) closes every story that is not\n // already 'done' as 'failed' — including the ones that never reached\n // `passes`, which are precisely the stories the issue calls failed. A\n // phase that fails outside `review` closes the same non-terminal stages,\n // so nothing is left frozen on 'executing' after the run stops.\n const stories = !event.success\n ? snapshot.stories.map((story) =>\n isTerminalStage(story.stage) ? story : transitionStory(story, 'failed', event.at, null),\n )\n : event.phase === 'review'\n ? snapshot.stories.map((story) =>\n story.passes ? transitionStory(story, 'done', event.at, null) : story,\n )\n : snapshot.stories;\n return {\n ...snapshot,\n currentPhase: snapshot.currentPhase === event.phase ? null : snapshot.currentPhase,\n currentActivity: null,\n phases,\n stories,\n progress: {\n ...snapshot.progress,\n phasesCompleted,\n percent: computePercent(phasesCompleted, snapshot.progress.phasesTotal),\n },\n };\n }\n\n case 'iteration:start': {\n // The story matching storyId becomes 'executing'; every other\n // not-yet-passing story becomes 'pending' (a story that was already\n // 'executing' in a previous iteration but lost the turn reverts here).\n // Passing stories are untouched — this event owns only the\n // execute-loop's own pending/executing transition, never review or\n // correction. No-op branches (`return story`) avoid needless object\n // churn when the stage is already correct.\n const storyId = event.storyId;\n const stories = snapshot.stories.map((story) => {\n if (story.passes) return story;\n if (story.id === storyId) {\n return transitionStory(story, 'executing', event.at, null);\n }\n return transitionStory(story, 'pending', event.at, null);\n });\n return {\n ...snapshot,\n execution: { ...snapshot.execution, iteration: event.iteration },\n stories,\n // Finally populates the `story` field of the activity payload during\n // execute — today this phase never publishes an `activity` event at\n // all (no streaming), so `currentActivity` stays whatever an earlier\n // phase left it at. Left untouched when storyId is absent (every\n // story already passes, or the caller could not determine one).\n currentActivity:\n storyId !== undefined\n ? { story: storyId, tool: null, detail: null, since: event.at }\n : snapshot.currentActivity,\n };\n }\n\n case 'iteration:end':\n return { ...snapshot, currentActivity: null };\n\n case 'retry':\n return {\n ...snapshot,\n execution: { ...snapshot.execution, retries: snapshot.execution.retries + 1 },\n };\n\n case 'agent:attempt':\n return {\n ...snapshot,\n resilience: {\n ...snapshot.resilience,\n attempt: event.attempt,\n provider: event.provider,\n model: event.model ?? null,\n lastActivityAt: event.at,\n },\n };\n\n case 'failover':\n return {\n ...snapshot,\n resilience: {\n ...snapshot.resilience,\n provider: event.to,\n lastFailureKind: event.reason,\n cooldownUntil: event.cooldownUntil ?? null,\n lastActivityAt: event.at,\n },\n };\n\n case 'agent:result':\n return {\n ...snapshot,\n resilience: {\n ...snapshot.resilience,\n provider: event.provider,\n lastFailureKind: event.failureKind ?? snapshot.resilience.lastFailureKind,\n cooldownUntil: event.cooldownUntil ?? null,\n lastActivityAt: event.at,\n },\n };\n\n case 'agent:activity':\n return {\n ...snapshot,\n resilience: {\n ...snapshot.resilience,\n provider: event.provider,\n lastActivityAt: event.at,\n },\n };\n\n case 'stories:update': {\n const previous = new Map(snapshot.stories.map((story) => [story.id, story]));\n const stories = event.stories.map((story) => {\n const before = previous.get(story.id);\n // Stamp the flip to passing; stories already passing when first seen\n // keep null (completed before this session, duration unknown).\n const completedAt = !story.passes\n ? null\n : before && !before.passes\n ? event.at\n : (before?.completedAt ?? null);\n // stories:update rebuilds the array from the plan on every publish, so\n // metrics already attributed to a story must be carried over here or\n // the next update would wipe them.\n const stage = deriveStageOnStoriesUpdate(story, before, event.at);\n const history = before?.history ?? [];\n const stageChanged = before !== undefined && before.stage !== stage.stage;\n return {\n id: story.id,\n title: story.title,\n priority: story.priority,\n passes: story.passes,\n completedAt,\n // Seed only: deriveStoryStatus() recomputes it right after, so an\n // explicit 'done' in the plan on a story with passes: false is not\n // honoured — `passes` remains the single source of truth. The plan's\n // value survives just for 'in_review', which no derivation produces.\n status: story.status ?? before?.status ?? 'backlog',\n dependencies: story.dependencies ?? [],\n // Required on UserStory, so the plan is always the source — no\n // carry-over from `before` the way the accumulated fields need.\n description: story.description,\n acceptanceCriteria: story.acceptanceCriteria,\n durationSeconds: before?.durationSeconds ?? null,\n inputTokens: before?.inputTokens ?? null,\n outputTokens: before?.outputTokens ?? null,\n cacheReadTokens: before?.cacheReadTokens ?? null,\n cacheCreationTokens: before?.cacheCreationTokens ?? null,\n costUsd: before?.costUsd ?? null,\n ...stage,\n history: stageChanged\n ? [...history, { at: event.at, stage: stage.stage, detail: stage.stageDetail }]\n : history,\n };\n });\n return {\n ...snapshot,\n stories,\n progress: {\n ...snapshot.progress,\n storiesCompleted: stories.filter((s) => s.passes).length,\n storiesTotal: stories.length,\n },\n };\n }\n\n case 'activity': {\n const story = event.story ?? null;\n const tool = event.tool ?? null;\n const detail = event.detail ?? null;\n const current = snapshot.currentActivity;\n // Same activity repeated: keep `since` so the UI can show \"for how long\".\n const since =\n current && current.story === story && current.tool === tool && current.detail === detail\n ? current.since\n : event.at;\n return {\n ...snapshot,\n currentActivity: { story, tool, detail, since },\n resilience: { ...snapshot.resilience, lastActivityAt: event.at },\n };\n }\n\n case 'log': {\n const limit = options?.logLimit ?? DEFAULT_LOG_LIMIT;\n const entry: SessionLogEntry = {\n at: event.at,\n level: event.level,\n message: stripVTControlCharacters(event.message),\n };\n const logs = [...snapshot.logs, entry].slice(-Math.max(1, limit));\n return { ...snapshot, logs };\n }\n\n case 'process:output': {\n const limit = options?.logLimit ?? DEFAULT_LOG_LIMIT;\n const entry: SessionProcessLogEntry = {\n at: event.at,\n phase: event.phase,\n executionId: event.executionId,\n provider: event.provider,\n stream: event.stream,\n message: stripVTControlCharacters(event.message),\n };\n return {\n ...snapshot,\n processLogs: [...snapshot.processLogs, entry].slice(-Math.max(1, limit)),\n };\n }\n\n case 'execution:update': {\n const index = snapshot.executions.findIndex((entry) => entry.id === event.execution.id);\n const executions = [...snapshot.executions];\n if (index === -1) executions.push(event.execution);\n else executions[index] = event.execution;\n return { ...snapshot, executions };\n }\n\n case 'git:update':\n return {\n ...snapshot,\n git: {\n branch: event.branch ?? snapshot.git.branch,\n baseBranch: event.baseBranch ?? snapshot.git.baseBranch,\n branchCreated: reported(event.branchCreated, snapshot.git.branchCreated),\n startCommit: snapshot.git.startCommit,\n commits: event.commits ?? snapshot.git.commits,\n },\n repository: {\n // `undefined` is \"not collected\", so the previous value stands; an\n // explicit `null` is \"collected and unavailable\" and overwrites it.\n name: reported(event.repositoryName, snapshot.repository.name),\n remoteUrl: reported(event.remoteUrl, snapshot.repository.remoteUrl),\n branch: event.branch ?? snapshot.repository.branch,\n headCommit: reported(event.headCommit, snapshot.repository.headCommit),\n root: reported(event.repositoryRoot, snapshot.repository.root),\n },\n pullRequests: event.pullRequests ?? snapshot.pullRequests,\n };\n\n case 'correction:cycle': {\n // Correction is pipeline-wide, not per-story: commands/run.ts re-runs\n // the whole execute+review cycle on a review failure, with no notion\n // of which story a finding belongs to — so every passing story moves\n // to 'in_correction' together, carrying the cycle count as a readable\n // stageDetail.\n const stageDetail = `Cycle ${event.cycle}/${event.maxCycles}`;\n const stories = snapshot.stories.map((story) =>\n story.passes ? transitionStory(story, 'in_correction', event.at, stageDetail) : story,\n );\n return {\n ...snapshot,\n execution: {\n ...snapshot.execution,\n correctionCycle: event.cycle,\n maxCorrectionCycles: event.maxCycles,\n },\n stories,\n };\n }\n\n case 'metrics:update': {\n if (event.scope === 'story') {\n // Story metrics are a rateio of the iteration that completed them;\n // the iteration-scoped event already fed the phase and the aggregate,\n // so counting them again here would double the totals.\n if (event.storyId === undefined) return snapshot;\n if (!snapshot.stories.some((s) => s.id === event.storyId)) return snapshot;\n return {\n ...snapshot,\n stories: snapshot.stories.map((story) =>\n story.id === event.storyId\n ? {\n ...accumulateUsage(story, event),\n durationSeconds: accumulate(story.durationSeconds, event.durationSeconds),\n }\n : story,\n ),\n };\n }\n\n // phase and iteration scopes both land on the named phase. An event for\n // a phase the snapshot never saw is ignored rather than appended: it\n // would show up as a phantom entry in the UI.\n if (event.phase === undefined) return snapshot;\n if (!snapshot.phases.some((p) => p.name === event.phase)) return snapshot;\n return {\n ...snapshot,\n // durationSeconds is deliberately untouched here: phase:start and\n // phase:end remain the single source of a phase's wall-clock time.\n phases: snapshot.phases.map((phase) =>\n phase.name === event.phase ? accumulateUsage(phase, event) : phase,\n ),\n metrics: {\n totalInputTokens: accumulate(snapshot.metrics.totalInputTokens, event.inputTokens),\n totalOutputTokens: accumulate(snapshot.metrics.totalOutputTokens, event.outputTokens),\n totalCacheReadTokens: accumulate(\n snapshot.metrics.totalCacheReadTokens,\n event.cacheReadTokens,\n ),\n totalCacheCreationTokens: accumulate(\n snapshot.metrics.totalCacheCreationTokens,\n event.cacheCreationTokens,\n ),\n totalCostUsd: accumulate(snapshot.metrics.totalCostUsd, event.costUsd),\n },\n };\n }\n\n case 'verify:end':\n return {\n ...snapshot,\n verification: {\n verdict: event.verdict,\n level: event.level,\n independence: event.independence,\n },\n };\n\n case 'session:end':\n return {\n ...snapshot,\n status: event.status,\n endedAt: event.at,\n currentPhase: null,\n currentActivity: null,\n // Close every non-terminal stage: the run is over, so nothing can be\n // 'executing'/'in_review'/'in_correction' any more. A story that never\n // reached `passes` on a run that did not complete is exactly what the\n // 'failed' stage means; anything else settles as 'done'.\n stories: snapshot.stories.map((story) => {\n if (isTerminalStage(story.stage)) return story;\n const stage =\n event.status === 'completed' && story.passes ? ('done' as const) : ('failed' as const);\n return transitionStory(story, stage, event.at, null);\n }),\n lastError: event.error\n ? { message: stripVTControlCharacters(event.error), at: event.at }\n : snapshot.lastError,\n };\n\n default:\n return snapshot;\n }\n}\n\nexport interface SessionPublisher {\n /**\n * Publish an event. Synchronous, never throws, never returns a promise —\n * safe to call from any instrumentation point without affecting execution.\n */\n publish(event: SessionEvent): void;\n /** Current in-memory snapshot. */\n snapshot(): SessionSnapshot;\n /** Monotonic counter, bumped on every applied event (basis for ETags). */\n version(): number;\n /** Force any pending output to be written. Never rejects. */\n flush(): Promise<void>;\n /** Flush and release resources. Never rejects. */\n close(): Promise<void>;\n}\n\n/**\n * Default publisher when monitoring is off: every call is a no-op, so each\n * instrumentation point costs a method call that returns immediately.\n */\nexport class NullPublisher implements SessionPublisher {\n private readonly empty = createInitialSnapshot();\n\n publish(_event: SessionEvent): void {}\n\n snapshot(): SessionSnapshot {\n return this.empty;\n }\n\n version(): number {\n return 0;\n }\n\n async flush(): Promise<void> {}\n\n async close(): Promise<void> {}\n}\n\nexport interface MemoryPublisherOptions extends SessionReducerOptions {\n /** Called at most once, on the first internal failure. */\n onWarn?: (message: string) => void;\n /**\n * When false, log events are dropped before reaching the snapshot, so no\n * log line is ever published (session.json or HTTP). Default true.\n */\n includeLogs?: boolean;\n}\n\n/**\n * In-memory publisher: reduces events over a snapshot and tracks a monotonic\n * version. Base class for publishers with an output surface (file, HTTP).\n */\nexport class MemoryPublisher implements SessionPublisher {\n protected state: SessionSnapshot = createInitialSnapshot();\n protected versionCounter = 0;\n private warned = false;\n private readonly onWarn: (message: string) => void;\n private readonly reducerOptions: SessionReducerOptions;\n private readonly includeLogs: boolean;\n\n constructor(options: MemoryPublisherOptions = {}) {\n this.onWarn = options.onWarn ?? ((message) => process.stderr.write(`${message}\\n`));\n this.reducerOptions = { logLimit: options.logLimit };\n this.includeLogs = options.includeLogs ?? true;\n }\n\n publish(event: SessionEvent): void {\n if (event.type === 'log' && !this.includeLogs) return;\n try {\n this.state = reduceSessionEvent(this.state, event, this.reducerOptions);\n this.versionCounter++;\n this.afterPublish(event);\n } catch (err) {\n this.warnOnce(err);\n }\n }\n\n /** Hook for subclasses; runs inside publish()'s try/catch. */\n protected afterPublish(_event: SessionEvent): void {}\n\n snapshot(): SessionSnapshot {\n return this.state;\n }\n\n version(): number {\n return this.versionCounter;\n }\n\n async flush(): Promise<void> {}\n\n async close(): Promise<void> {}\n\n protected warnOnce(err: unknown): void {\n if (this.warned) return;\n this.warned = true;\n const message = err instanceof Error ? err.message : String(err);\n try {\n this.onWarn(\n `issue-flow: web monitoring hit an error (will keep retrying silently): ${message}`,\n );\n } catch {\n // Even a failing warn callback must not propagate to the pipeline.\n }\n }\n}\n\nexport interface FilePublisherOptions extends MemoryPublisherOptions {\n /** Minimum interval between disk writes (ms). Default 1000. */\n throttleMs?: number;\n /** Interval between mtime-only heartbeats (ms). Zero disables it. Default 10000. */\n heartbeatMs?: number;\n}\n\n/**\n * Publisher that mirrors the snapshot to issues/N/session.json.\n *\n * Writes are atomic (write-to-temp + rename) and throttled; terminal events\n * (phase:end, session:end) force an immediate write. All I/O failures are\n * swallowed after a single warning.\n */\nexport class FilePublisher extends MemoryPublisher {\n private readonly filePath: string;\n private readonly throttleMs: number;\n private timer: NodeJS.Timeout | null = null;\n private heartbeatTimer: NodeJS.Timeout | null = null;\n private lastWriteStartedAt = 0;\n private lastWrittenVersion = 0;\n private writeChain: Promise<void> = Promise.resolve();\n private closed = false;\n\n constructor(filePath: string, options: FilePublisherOptions = {}) {\n super(options);\n this.filePath = filePath;\n this.throttleMs = options.throttleMs ?? DEFAULT_THROTTLE_MS;\n const heartbeatMs = options.heartbeatMs ?? DEFAULT_SESSION_HEARTBEAT_MS;\n if (heartbeatMs > 0) {\n this.heartbeatTimer = setInterval(() => this.enqueueHeartbeat(), heartbeatMs);\n this.heartbeatTimer.unref();\n }\n }\n\n protected override afterPublish(event: SessionEvent): void {\n if (this.closed) return;\n const terminal =\n event.type === 'phase:end' || event.type === 'session:end' || event.type === 'verify:end';\n this.scheduleWrite(terminal);\n }\n\n private scheduleWrite(force: boolean): void {\n if (force) {\n if (this.timer !== null) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n this.enqueueWrite();\n return;\n }\n if (this.timer !== null) return;\n const wait = Math.max(0, this.throttleMs - (Date.now() - this.lastWriteStartedAt));\n if (wait === 0) {\n this.enqueueWrite();\n return;\n }\n this.timer = setTimeout(() => {\n this.timer = null;\n this.enqueueWrite();\n }, wait);\n this.timer.unref();\n }\n\n private enqueueWrite(): void {\n this.lastWriteStartedAt = Date.now();\n this.writeChain = this.writeChain.then(async () => {\n const version = this.versionCounter;\n if (version === this.lastWrittenVersion) return;\n const payload = `${JSON.stringify(this.state, null, 2)}\\n`;\n try {\n await atomicWriteFile(this.filePath, payload);\n this.lastWrittenVersion = version;\n } catch (err) {\n this.warnOnce(err);\n }\n });\n }\n\n /**\n * Keep directory-based discovery alive without changing snapshot content or\n * its content-derived ETag. The write chain serializes the touch with atomic\n * snapshot replacement, and no heartbeat is attempted before the first file\n * has been written successfully.\n */\n private enqueueHeartbeat(): void {\n if (this.closed) return;\n this.writeChain = this.writeChain.then(async () => {\n if (this.closed || this.lastWrittenVersion === 0) return;\n const now = new Date();\n try {\n await utimes(this.filePath, now, now);\n } catch (err) {\n this.warnOnce(err);\n }\n });\n }\n\n override async flush(): Promise<void> {\n if (this.timer !== null) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n if (this.versionCounter !== this.lastWrittenVersion) {\n this.enqueueWrite();\n }\n await this.writeChain;\n }\n\n override async close(): Promise<void> {\n if (this.heartbeatTimer !== null) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n this.closed = true;\n await this.flush();\n }\n}\n\n/**\n * Atomic write: write to a temp file next to the target, then rename. The\n * same-directory temp keeps the rename on a single filesystem (rename is\n * atomic; no EXDEV fallback needed, unlike an os.tmpdir() temp on Linux\n * tmpfs) and leaves nothing behind. The FilePublisher write chain is the\n * single writer, so the fixed .tmp name never races.\n *\n * The target directory (issues/N/) may not exist yet the first time a fresh\n * issue publishes — pipeline phases create it lazily, and this can be the\n * very first write. mkdir recursive is idempotent, so it's cheap to ensure\n * on every write rather than relying on call order elsewhere.\n */\nasync function atomicWriteFile(path: string, content: string): Promise<void> {\n await mkdir(dirname(path), { recursive: true });\n const tmpFile = `${path}.tmp`;\n await writeFile(tmpFile, content, 'utf-8');\n await rename(tmpFile, path);\n}\n","import { NullPublisher, type SessionPublisher } from './session-state.js';\n\n/**\n * Global slot for the active SessionPublisher, following the same pattern as\n * setVerbose in verbose.ts. Instrumentation points (logger, engine, headless)\n * read the slot via getSessionPublisher(); run.ts installs a MemoryPublisher\n * for every run and a FilePublisher on top when web monitoring is enabled.\n * The default NullPublisher makes every instrumentation point a no-op\n * before a run (or a standalone command) installs a publisher.\n */\n\nconst NULL_PUBLISHER = new NullPublisher();\n\nlet _publisher: SessionPublisher = NULL_PUBLISHER;\n\n/**\n * Install the active session publisher. Pass undefined to reset to the\n * default NullPublisher.\n */\nexport function setSessionPublisher(publisher: SessionPublisher | undefined): void {\n _publisher = publisher ?? NULL_PUBLISHER;\n}\n\nexport function getSessionPublisher(): SessionPublisher {\n return _publisher;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
getSessionPublisher
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-ROIIEVZH.js";
|
|
5
5
|
import {
|
|
6
6
|
writeDiagnostic
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-FKWYD44M.js";
|
|
8
8
|
import {
|
|
9
9
|
isoNow
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-GVOZ6NDO.js";
|
|
11
11
|
|
|
12
12
|
// src/core/verbose.ts
|
|
13
13
|
var _verbose = false;
|
|
@@ -240,4 +240,4 @@ export {
|
|
|
240
240
|
formatDuration,
|
|
241
241
|
ElapsedTimer
|
|
242
242
|
};
|
|
243
|
-
//# sourceMappingURL=chunk-
|
|
243
|
+
//# sourceMappingURL=chunk-SVDEWOUD.js.map
|