opencode-swarm 7.192.0 → 7.192.1
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/.opencode/skills/swarm-pr-review/SKILL.md +2 -2
- package/.opencode/skills/swarm-pr-review/references/lane-output-recoverability.md +18 -8
- package/binaries/win32-arm64/swarm-sandbox-runner.exe +0 -0
- package/binaries/win32-x64/swarm-sandbox-runner.exe +0 -0
- package/dist/background/pr-review-trigger-contract.d.ts +145 -0
- package/dist/cli/{auto-checkpoint-fzybxf58.js → auto-checkpoint-kkakqktp.js} +7 -7
- package/dist/cli/{checkpoint-6fr9tc3h.js → checkpoint-cefw75xe.js} +14 -14
- package/dist/cli/{coder-settlement-1t0r6q0r.js → coder-settlement-tgdjczyp.js} +10 -10
- package/dist/cli/{config-doctor-0kd6w45h.js → config-doctor-sns7gbj2.js} +13 -13
- package/dist/cli/{core-dxraa2ss.js → core-q8xvp8bw.js} +3 -3
- package/dist/cli/{curation-policy-6p6fcfjb.js → curation-policy-2q5xs0xg.js} +4 -4
- package/dist/cli/{curator-drift-6qb0c363.js → curator-drift-1n3akmda.js} +8 -8
- package/dist/cli/curator-llm-factory-tfn0cp68.js +82 -0
- package/dist/cli/{curator-hwwp7e2g.js → curator-mgdsxrpv.js} +40 -40
- package/dist/cli/{doctor-knowledge-receipt-phase-id-ay2ngn4a.js → doctor-knowledge-receipt-phase-id-33bp8fcs.js} +7 -7
- package/dist/cli/{evidence-summary-service-fyyzhbsc.js → evidence-summary-service-sb888pg8.js} +17 -17
- package/dist/cli/{gate-evidence-zt2vj631.js → gate-evidence-rmk87c6m.js} +5 -5
- package/dist/cli/guardrail-explain-n9ndp99q.js +83 -0
- package/dist/cli/{guardrail-log-ppgfsfzt.js → guardrail-log-d18dcweh.js} +6 -6
- package/dist/cli/{guardrail-reset-4psprskt.js → guardrail-reset-1xeeetk7.js} +40 -40
- package/dist/cli/{hive-promoter-vxrwvhga.js → hive-promoter-44grgbq4.js} +40 -40
- package/dist/cli/{index-qs9myayh.js → index-025wg2re.js} +1 -1
- package/dist/cli/{index-c5644p1y.js → index-0yrsvwdf.js} +6 -6
- package/dist/cli/{index-n8q43eff.js → index-28zgn6sm.js} +2 -2
- package/dist/cli/{index-3c8v05x1.js → index-2wps5fec.js} +3 -3
- package/dist/cli/{index-egkph2cs.js → index-3txrbsa1.js} +4 -4
- package/dist/cli/{index-mcv0v2dp.js → index-4cm1p2kj.js} +1 -1
- package/dist/cli/{index-sx3g9nwg.js → index-50b8f6qz.js} +4 -4
- package/dist/cli/{index-r9yvpr2m.js → index-63v3gmgr.js} +1 -1
- package/dist/cli/{index-p1z7pafk.js → index-6shk3n43.js} +2 -2
- package/dist/cli/{index-6v42d116.js → index-867d9dhf.js} +2 -2
- package/dist/cli/{index-x00ghp37.js → index-95hc7xn4.js} +3 -3
- package/dist/cli/{index-feaxsjrt.js → index-9b6bxe9b.js} +1 -1
- package/dist/cli/{index-sxw0jbyc.js → index-advcaree.js} +4 -4
- package/dist/cli/{index-ywmz75rj.js → index-af3nmk6c.js} +7 -7
- package/dist/cli/{index-d5dwf6q6.js → index-ajp4dabz.js} +4 -4
- package/dist/cli/{index-tv0m2css.js → index-b79a8pc2.js} +1 -1
- package/dist/cli/{index-3pkeqcxe.js → index-bwh9196c.js} +5 -5
- package/dist/cli/{index-aazwrwy1.js → index-cje7tt58.js} +1 -1
- package/dist/cli/{index-zk6ttjkt.js → index-d4cjbm4p.js} +1 -1
- package/dist/cli/{index-bx6x9ee7.js → index-edk2sgse.js} +2 -2
- package/dist/cli/{index-4d04qzw5.js → index-ejfmgkt0.js} +3 -3
- package/dist/cli/{index-dexj54h2.js → index-f32hs2vt.js} +3 -3
- package/dist/cli/{index-mjfpaxw3.js → index-f6e44xh2.js} +5 -5
- package/dist/cli/{index-05t8f1bj.js → index-fsm9gv1p.js} +40 -40
- package/dist/cli/{index-2fpv2wmc.js → index-ga1pcs49.js} +1 -1
- package/dist/cli/{index-ngjjwcam.js → index-jdw63xyd.js} +2 -2
- package/dist/cli/{index-z3ahy9c2.js → index-k6h66zm3.js} +1 -1
- package/dist/cli/{index-mqf06fyy.js → index-km4x7yfb.js} +10 -10
- package/dist/cli/{index-3zwhxk98.js → index-kvtwwj8b.js} +1 -1
- package/dist/cli/{index-nkgzkt7c.js → index-mhqh2dc9.js} +1 -1
- package/dist/cli/{index-mj237f76.js → index-nb1c3342.js} +7 -7
- package/dist/cli/{index-9qwmx95b.js → index-ney8qpg3.js} +1 -1
- package/dist/cli/{index-hqqfxytt.js → index-pkgbrrn7.js} +1 -1
- package/dist/cli/{index-93zvq6wn.js → index-r3gphy10.js} +5 -5
- package/dist/cli/{index-gv63kdd3.js → index-s81tvz98.js} +3 -3
- package/dist/cli/{index-b2j231jy.js → index-t0se5zwe.js} +1 -1
- package/dist/cli/{index-kfevm0n5.js → index-t433r606.js} +2 -2
- package/dist/cli/{index-646s7gp9.js → index-v3bmeqqh.js} +4 -4
- package/dist/cli/{index-1ajj6zbq.js → index-vf6pqke0.js} +42 -42
- package/dist/cli/{index-rehvfgre.js → index-vt8hk0pt.js} +89 -82
- package/dist/cli/{index-ecx8jh7s.js → index-w52xyp9v.js} +2 -2
- package/dist/cli/{index-y9v41185.js → index-xjqa26fs.js} +1 -1
- package/dist/cli/{index-sxj143a4.js → index-xw19x0t7.js} +1 -1
- package/dist/cli/{index-v9geqn2t.js → index-yfmgbhwz.js} +3 -3
- package/dist/cli/{index-zv71frp3.js → index-ysazjncb.js} +6 -6
- package/dist/cli/index.js +41 -41
- package/dist/cli/{knowledge-escalator-b45xccz8.js → knowledge-escalator-naq700x5.js} +12 -12
- package/dist/cli/{knowledge-events-rtmavbyy.js → knowledge-events-mmh5cya6.js} +10 -10
- package/dist/cli/{knowledge-link-6hw3z6wn.js → knowledge-link-76egdqc9.js} +3 -3
- package/dist/cli/{knowledge-store-0beaqdxd.js → knowledge-store-9dxr9jb9.js} +4 -4
- package/dist/cli/{knowledge-validator-r1kjxt80.js → knowledge-validator-eze3s6fn.js} +6 -6
- package/dist/cli/{mcp-gq7gy5qm.js → mcp-1x2tpk71.js} +1 -1
- package/dist/cli/{model-preflight-za9f75h1.js → model-preflight-hgb7kf5d.js} +40 -40
- package/dist/cli/{pending-delegations-ba4bbh3d.js → pending-delegations-zg4q1k5q.js} +10 -10
- package/dist/cli/{pr-subscriptions-9ge667xn.js → pr-subscriptions-zw8aev5s.js} +10 -10
- package/dist/cli/{pr-workflow-gate-p1sv3vp7.js → pr-workflow-gate-dcbpd451.js} +42 -40
- package/dist/cli/{runner-ssnsje35.js → runner-y529qa4d.js} +4 -4
- package/dist/cli/{scan-cursor-hrn48cja.js → scan-cursor-pdxmndd0.js} +5 -5
- package/dist/cli/{schema-6cwam61t.js → schema-hzz32642.js} +1 -1
- package/dist/cli/{scope-persistence-z8b0cj5e.js → scope-persistence-h4b6p951.js} +13 -13
- package/dist/cli/{server-sqxa4vjy.js → server-7gd7tqt5.js} +40 -40
- package/dist/cli/{skill-generator-6dfgb9hj.js → skill-generator-7g7sca90.js} +14 -14
- package/dist/cli/{snapshot-coordination-init-rt4xyayx.js → snapshot-coordination-init-4q5ykq22.js} +40 -40
- package/dist/cli/{speckit-checkoff-q1zqzwbw.js → speckit-checkoff-5bfxs8r7.js} +4 -4
- package/dist/cli/{workspace-snapshot-9f12p1s1.js → workspace-snapshot-nre732xt.js} +3 -3
- package/dist/cli/{worktree-collision-ownership-ge241a9e.js → worktree-collision-ownership-327d06qw.js} +11 -11
- package/dist/cli/{worktree-isolation-c9x73qrk.js → worktree-isolation-zqzs3wkk.js} +40 -40
- package/dist/hooks/pr-workflow-gate.d.ts +12 -1
- package/dist/index.js +6 -6
- package/dist/tools/write-pr-review-trigger-eval.d.ts +4 -0
- package/package.json +1 -1
- package/dist/cli/curator-llm-factory-w6hvns5a.js +0 -82
- package/dist/cli/guardrail-explain-ddtj3djc.js +0 -83
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{createRequire}from"node:module";var __create=Object.create;var{getPrototypeOf:__getProtoOf,defineProperty:__defProp,getOwnPropertyNames:__getOwnPropNames,getOwnPropertyDescriptor:__getOwnPropDesc}=Object,__hasOwnProp=Object.prototype.hasOwnProperty;function __accessProp(key){return this[key]}var __toESMCache_node,__toESMCache_esm,__toESM=(mod,isNodeMode,target)=>{var canCache=mod!=null&&typeof mod==="object";if(canCache){var cache=isNodeMode?__toESMCache_node??=new WeakMap:__toESMCache_esm??=new WeakMap,cached=cache.get(mod);if(cached)return cached}target=mod!=null?__create(__getProtoOf(mod)):{};let to=isNodeMode||!mod||!mod.__esModule?__defProp(target,"default",{value:mod,enumerable:!0}):target;for(let key of __getOwnPropNames(mod))if(!__hasOwnProp.call(to,key))__defProp(to,key,{get:__accessProp.bind(mod,key),enumerable:!0});if(canCache)cache.set(mod,to);return to},__toCommonJS=(from)=>{var entry=(__moduleCache??=new WeakMap).get(from),desc;if(entry)return entry;if(entry=__defProp({},"__esModule",{value:!0}),from&&typeof from==="object"||typeof from==="function"){for(var key of __getOwnPropNames(from))if(!__hasOwnProp.call(entry,key))__defProp(entry,key,{get:__accessProp.bind(from,key),enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable})}return __moduleCache.set(from,entry),entry},__moduleCache,__commonJS=(cb,mod)=>()=>(mod||cb((mod={exports:{}}).exports,mod),mod.exports);var __returnValue=(v)=>v;function __exportSetter(name,newValue){this[name]=__returnValue.bind(null,newValue)}var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0,configurable:!0,set:__exportSetter.bind(all,name)})};var __esm=(fn2,res)=>()=>(fn2&&(res=fn2(fn2=0)),res);var __require=createRequire(import.meta.url);var package_default;var init_package=__esm(()=>{package_default={name:"opencode-swarm",version:"7.192.0",description:"Architect-centric agentic swarm plugin for OpenCode - hub-and-spoke orchestration with SME consultation, code generation, and QA review",main:"dist/index.js",types:"dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",default:"./dist/index.js"},"./package.json":"./package.json"},bin:{"opencode-swarm":"./dist/cli/index.js"},type:"module",engines:{bun:">=1.3.13",node:">=22.13"},license:"MIT",repository:{type:"git",url:"https://github.com/ZaxbyHub/opencode-swarm.git"},publishConfig:{access:"public",registry:"https://registry.npmjs.org/"},keywords:["opencode","opencode-plugin","ai","agents","orchestration","swarm","multi-agent","llm"],files:["dist","dist/lang/grammars","binaries","evaluation-fixtures",".opencode/skills/brainstorm",".opencode/skills/specify",".opencode/skills/clarify-spec",".opencode/skills/swarm-resume",".opencode/skills/clarify",".opencode/skills/discover",".opencode/skills/consult",".opencode/skills/pre-phase-briefing",".opencode/skills/council",".opencode/skills/deep-dive",".opencode/skills/deep-research",".opencode/skills/codebase-review-swarm",".opencode/skills/swarm-implement",".opencode/skills/design-docs",".opencode/skills/swarm-pr-review",".opencode/skills/swarm",".opencode/skills/swarm-pr-feedback",".opencode/skills/swarm-pr-subscribe",".opencode/skills/swarm-ci-monitor",".opencode/skills/issue-ingest",".opencode/skills/swarm-plan",".opencode/skills/critic-gate",".opencode/skills/execute",".opencode/skills/phase-wrap",".opencode/skills/loop",".opencode/skills/writing-tests",".opencode/skills/running-tests",".opencode/skills/engineering-conventions",".opencode/skills/commit-pr",".opencode/skills/ci-failure-batching",".opencode/skills/gate-attribution",".opencode/skills/merge-queue-readiness",".opencode/skills/skill-edit-validation",".opencode/skills/worktree-retry-cleanup",".opencode/skills/test-file-split",".opencode/skills/fork-pr-operations",".opencode/skills/parallel-work-check",".opencode/skills/ci-fix-monitor",".opencode/skills/issue-tracer",".opencode/skills/orchestrating-subagents",".opencode/skills/durable-session-state","tests/fixtures/memory-recall","tests/fixtures/memory-recall-heldout","opencode-swarm.schema.json","README.md","LICENSE"],scripts:{clean:`bun -e "require('fs').rmSync('dist',{recursive:true,force:true})"`,build:"bun run clean && bun run scripts/generate-config-schema.ts && bun run scripts/copy-grammars.ts && bun build src/index.ts --outdir dist --target node --format esm --external web-tree-sitter --minify-whitespace --minify-syntax && bun build src/cli/index.ts --outdir dist/cli --target bun --format esm --external bash-parser --splitting && bun run scripts/copy-grammars.ts --to-dist && tsc --emitDeclarationOnly",typecheck:"tsc --noEmit",test:"bun test",lint:"biome lint .","lint:ci":"biome ci .","test:unit:ci":"bun scripts/ci/run-unit-tests-local.ts","validate:repo":"bun scripts/ci/repository-validation.ts","drift:check":"bun run scripts/drift-check.ts","check:pre-push":"bun run scripts/drift-check.ts --enforce --no-report && bun run check:registry-citations","schema:generate":"bun run scripts/generate-config-schema.ts","generate:commands-docs":"bun run scripts/generate-commands-docs.ts","check:runtime-src-refs":"bun run scripts/check-runtime-src-refs.ts","drift:fix":"bun run scripts/drift-check.ts --fix --confirm","skills:sync":"bun run scripts/sync-qa-gate-skills.ts",format:"biome format . --write",check:"biome check --write .",dev:"bun run build && opencode","package:smoke":"node scripts/package-smoke.mjs",prepare:"bun run build","repro:704":"node scripts/repro-704.mjs","repro:2669":"node scripts/repro-2669.mjs","repro:2670":"node scripts/repro-2670.mjs","repro:1144":"bun scripts/repro-1144.mjs","repro:1873":"bun build scripts/repro-1873-entry.ts --outdir dist-build-test/repro-1873 --target node --format esm && node scripts/repro-1873.mjs","repro:2487":"bun build scripts/repro-2487-parity-entry.ts --outdir dist-build-test/repro-2487 --target node --format esm && node scripts/repro-2487-parity.mjs","check:events":"bun run scripts/check-event-contract.ts","check:retention":"bun run scripts/check-retention-registry.ts","check:core-events":"bun run scripts/check-core-events-usage.ts","check:shell-audit":"bun run scripts/check-shell-audit-usage.ts","check:trajectory-store":"bun run scripts/check-trajectory-store-usage.ts","check:mock-cleanup":"bun run scripts/check-mock-cleanup.ts","check:invariants":"bun run scripts/check-invariants.ts","check:token-formula":"bun run scripts/check-token-formula.ts","check:cross-contamination":"bun run scripts/check-cross-contamination.ts","check:test-clock":"bun run scripts/check-test-clock.ts","check:test-file-cap":"bun run scripts/check-test-file-cap.ts","check:test-tmpdir":"bun run scripts/check-test-tmpdir.ts","check:bash-portability":"bun run scripts/check-bash-portability.ts","check:pending-fragment":"bun run scripts/check-pending-fragment.ts","check:gate-portability":"bun run scripts/check-gate-portability.ts","check:bare-spawn":"bun run scripts/check-bare-executable-spawn.ts","check:error-channel-discard":"bun run scripts/check-error-channel-discard.ts","check:path-identity":"bun run scripts/check-path-identity.ts","check:registry-citations":"bun run scripts/check-registry-citations.ts","check:memory-recall":"bun run scripts/memory-recall-regression.ts","check:retrieval-quality":"bun run scripts/retrieval-quality-regression.ts"},dependencies:{"@modelcontextprotocol/sdk":"^1.30.0","@opencode-ai/plugin":"^1.18.3","@opencode-ai/sdk":"^1.18.3","@vscode/tree-sitter-wasm":"^0.3.0","bash-parser":"^0.5.0","p-limit":"^7.3.0",picomatch:"^4.0.4","proper-lockfile":"^4.1.2","quick-lru":"^7.3.0","web-tree-sitter":"^0.25.0",zod:"4.3.6"},devDependencies:{"@biomejs/biome":"2.3.14","@types/picomatch":"^4.0.3","bun-types":"1.3.8","js-yaml":"^4.1.1",typescript:"^5.7.3"},peerDependencies:{"@xenova/transformers":"^2.17.2"},peerDependenciesMeta:{"@xenova/transformers":{optional:!0}}}});var QA_AGENTS,PIPELINE_AGENTS,ORCHESTRATOR_NAME="architect",ALL_SUBAGENT_NAMES,ALL_AGENT_NAMES;var init_agent_names=__esm(()=>{QA_AGENTS=["reviewer","critic","critic_oversight","critic_finding_validator"],PIPELINE_AGENTS=["explorer","coder","test_engineer"],ALL_SUBAGENT_NAMES=["sme","researcher","docs","docs_design","designer","critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","critic_architecture_supervisor","curator_init","curator_phase","curator_postmortem","curator_consolidation","council_generalist","council_skeptic","council_domain_expert","skill_improver","spec_writer",...QA_AGENTS,...PIPELINE_AGENTS],ALL_AGENT_NAMES=["architect",...ALL_SUBAGENT_NAMES]});function getPrWorkflowToolCapability(toolName,mode){let metadata=TOOL_METADATA[toolName];if(!metadata?.prWorkflow?.modes.includes(mode))return null;return metadata.prWorkflow.capability}var TOOL_METADATA,TOOL_NAMES,TOOL_NAME_SET,TOOL_DESCRIPTIONS,AGENT_TOOL_MAP;var init_tool_metadata=__esm(()=>{init_agent_names();TOOL_METADATA={diff:{description:"structured git diff with contract change detection",agents:["architect","reviewer","critic_finding_validator","critic_oversight","coder","test_engineer"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},diff_summary:{description:"filter classified AST changes by category, risk level, or file for reviewer drill-down",agents:["architect","reviewer","critic_finding_validator","critic_oversight"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},syntax_check:{description:"check syntax of source files using tree-sitter parsers across multiple languages, returning per-file errors",agents:["architect","coder","test_engineer"],prWorkflow:{modes:["PR_REVIEW"],capability:"validate"}},placeholder_scan:{description:"todo and FIXME comment detection",agents:["architect","reviewer","critic_finding_validator"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},imports:{description:"find all consumers that import from a given file — use before refactoring shared modules to avoid breaking unseen dependents",agents:["architect","sme","researcher","docs","docs_design","critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","reviewer","critic_finding_validator","critic","coder","test_engineer"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},lint:{description:"run project linter in check or fix mode; supports biome, eslint, ruff, clippy, and more, returns structured results",agents:["architect","reviewer","critic_finding_validator","coder"],prWorkflow:{modes:["PR_REVIEW"],capability:"validate"}},secretscan:{description:"scan for secrets (API keys, tokens, passwords) via regex and entropy; returns redacted previews, excludes common dirs",agents:["architect","reviewer","critic_finding_validator","critic_oversight"],prWorkflow:{modes:["PR_REVIEW"],capability:"validate"}},sast_scan:{description:"static analysis security scan",agents:["architect","reviewer","critic_finding_validator","critic_oversight"],prWorkflow:{modes:["PR_REVIEW"],capability:"validate"}},build_check:{description:"discover and run build, typecheck, and test commands for various project ecosystems in the working directory",agents:["architect","coder","test_engineer"]},pre_check_batch:{description:"parallel verification: lint:check + secretscan + sast_scan + quality_budget",agents:["architect","reviewer","critic_finding_validator"]},quality_budget:{description:"code quality budget check",agents:["architect"],prWorkflow:{modes:["PR_REVIEW"],capability:"validate"}},symbols:{description:"extract exported symbols (functions, classes, interfaces, types) from source files; supports TypeScript, JavaScript, Python, Rust, Go, Dart, Ruby, PHP, and Java",agents:["architect","sme","researcher","docs","docs_design","designer","critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","spec_writer","reviewer","critic_finding_validator","critic","coder","test_engineer"]},complexity_hotspots:{description:"git churn × complexity risk map",agents:["architect","sme","researcher","critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","reviewer","critic_finding_validator","critic","critic_oversight","explorer","test_engineer"]},schema_drift:{description:"OpenAPI spec vs route drift",agents:["architect","sme","researcher","docs","explorer"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},todo_extract:{description:"structured TODO/FIXME extraction; with task_id, records the high-priority count as todo_scan gate evidence",agents:["architect","researcher","docs","explorer","coder"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},evidence_check:{description:"verify task evidence completeness",agents:["architect","critic_oversight"]},check_gate_status:{description:"check the gate status of a specific task",agents:["architect","critic_oversight"]},completion_verify:{description:"verify completed tasks have required evidence",agents:["architect","critic_oversight"]},complete_pr_workflow:{description:"validate terminal PR workflow evidence and clear its durable session gate",agents:["architect"]},abort_pr_workflow:{description:"abort an unrecoverable PR_REVIEW/PR_FEEDBACK mechanical gate and clear its durable session state",agents:["architect"]},authorize_pr_review_reentry:{description:"issue a one-use, identity-bound reviewer/test_engineer re-entry authorization for the active PR_REVIEW workflow (issue #2383)",agents:["architect"]},submit_pr_review_result:{description:"submit one child-bound typed result for an active PR-review base or micro discovery lane",agents:[],prWorkflow:{modes:["PR_REVIEW"],capability:"validate"}},approve_plan_critic:{description:"record a MANUAL plan_critic_gate approval snapshot to unblock the ratchet-tighter critic_pre_plan execution gate when the critic already returned APPROVED but the mechanical recorder failed to persist it (issue #2012), or as the sanctioned recovery for a bookkeeping-grade hashed-field repair under the critic-gate PLAN FREEZE rule (the reason must state which case applies)",agents:["architect"]},approve_retry_sounding_board:{description:"record a MANUAL critic_sounding_board gate entry to unblock the coder retry circuit-breaker gate when the sounding board returned APPROVED but the mechanical recorder missed it (issue #2703)",agents:["architect"]},recover_rework_task:{description:"recover a task wedged at rework_required when the reviewer/test_engineer verdict did not require a code change: write a supervised stage_a_passed so those gates can be re-dispatched without re-running the coder (issue #2755)",agents:["architect"]},recover_stage_a_task:{description:"recover a task wedged in the settlement-backed Stage A deadlock — workflow at idle/blocked while a COMMITTED accepted coder settlement and green post-settlement pre-check proof justify Stage A: write a settlement-backed stage_a_passed so reviewer/test_engineer can be dispatched, without re-running the coder (issue #2828)",agents:["architect"]},prepare_pr_workflow_checkout:{description:"prepare an auditable PR workflow checkout or restore its exact original branch/HEAD and preserved stash after terminal cleanup",agents:["architect"]},invalidate_pr_feedback_publication:{description:"invalidate the armed PR_FEEDBACK publication generation so approved content can change, superseding every content-dependent approval and reopening the exact scoped rework + fresh-review path (issue #2108)",agents:["architect"]},record_implementation_review:{description:"record fresh-context reviewer + critic APPROVE verdicts for the implementation diff so the /swarm issue --trace workflow can satisfy its review gate before commit-pr handoff",agents:["architect"]},record_issue_publication:{description:"record a publication receipt so the /swarm issue --trace workflow reaches its terminal published state after the PR is created/updated",agents:["architect"]},record_issue_reproduction:{description:"record the reproduction outcome for the current traced issue so the /swarm issue --trace workflow can satisfy its reproduction gate and transition to PLAN",agents:["architect"]},record_recurrence_sweep:{description:"record the recurrence sweep (defect class, predicates, hit dispositions, guardrail proof, related-problems results) so the /swarm issue --trace workflow can satisfy its recurrence gate before commit-pr handoff",agents:["architect"]},record_branch_freshness:{description:"record the Phase 0 branch-freshness outcome (synced / behind:<n> / fetch-failed:<reason> plus optional user override) so the /swarm issue --trace workflow can pass its freshness gate before transitioning to PLAN (issue #2564)",agents:["architect"]},record_trace_validation:{description:"record one per-phase trace-check.sh validator outcome (phase, pass/fail, reviewedCommit, treeId) so the /swarm issue --trace workflow can satisfy its validator-receipt gate before commit-pr handoff (issue #2564)",agents:["architect"]},record_merge_approval:{description:"record the human merge approval bound to the exact PR head SHA so the /swarm issue --trace workflow reaches its terminal merge_approval_recorded state — recorded for audit only, never certified or driven by the plugin (issue #2564)",agents:["architect"]},rebind_pr_feedback_head:{description:"rebind a PR_FEEDBACK workflow to a new verified remote PR head after merge/rebase/conflict repair, invalidating ancestry-bound receipts so the mechanical ladder re-runs",agents:["architect"]},run_pr_feedback_stage_a:{description:"execute and persist mandatory PR-feedback Stage A checks on a content-bound revision",agents:["architect"]},submit_council_verdicts:{description:"submit pre-collected council member verdicts for synthesis (architect MUST dispatch critic/reviewer/sme/test_engineer/explorer as Agent tasks first; this tool synthesizes only, it does not contact members)",agents:[]},submit_phase_council_verdicts:{description:"submit pre-collected phase-level council member verdicts for holistic phase synthesis (architect MUST dispatch all 5 council members with phase-scoped context first; this tool synthesizes only, it does not contact members)",agents:[]},declare_council_criteria:{description:"pre-declare acceptance criteria for a task before the coder starts work; criteria are read back during council evaluation",agents:[]},sbom_generate:{description:"SBOM generation for dependency inventory",agents:["architect"]},checkpoint:{description:"create named git checkpoints for save, restore, and delete — use before risky operations to enable rollback; a destructive restore previews first and requires the confirm_token issued in the preview (#2946)",agents:["architect"]},pkg_audit:{description:"dependency vulnerability scan — npm/pip/cargo",agents:["architect","critic_hallucination_verifier","reviewer","critic_finding_validator","critic_oversight","test_engineer"],prWorkflow:{modes:["PR_REVIEW"],capability:"validate"}},parse_lane_candidates:{description:"Parse [CANDIDATE] rows from a dispatch_lanes or collect_lane_results artifact (by output_ref), produce structured records with provenance, optionally persist to a per-batch sidecar JSONL. Pure-parser variant exists as internal module.",agents:["architect"]},plan_conflict_check:{description:"read-only advisory check (#1656): compute a pairwise file-conflict matrix for N proposed parallel task groups using declared scopes and optional git co-change; returns a verdict (all_disjoint / conflicts_present / unknown_scopes), per-pair evidence, and a suggested serialization order. Writes nothing — the execution gate independently recomputes the verdict inline at dispatch time via the same helper. Call BEFORE attempting parallel dispatch to confirm disjointness.",agents:["architect"]},write_pr_review_trigger_eval:{description:"persist the complete PR-review trigger evaluation with exact-set validation, dispatch provenance, and live merge-base verification",agents:["architect"]},write_pr_review_artifact:{description:"persist schema-validated PR-review findings checkpoints and exact actionable feedback handoffs under the active run",agents:["architect"]},pr_review_submission:{description:"submit a settled, head-bound PR review to GitHub through the gh PR Review API after the PR_REVIEW gate clears; architect-only, refuses while a gate is active or the run was aborted after settlement",agents:["architect"]},export_pr_review_partial_results:{description:"export the validated partial results of an ABORTED PR_REVIEW run as a partial, non-authoritative artifact bound per-item to receipt-authenticated findings; architect-only, requires the gate cleared and an abort event binding session and head, never implies completion or feedback consent",agents:["architect"]},prepare_pr_feedback_scope:{description:"prepare an exact file scope for one PR-feedback coder Task after immutable feedback verification settles",agents:["architect"]},test_runner:{description:"auto-detect and run tests",agents:["architect","reviewer","critic_finding_validator","test_engineer"],prWorkflow:{modes:["PR_REVIEW"],capability:"validate"}},test_impact:{description:"identify test files impacted by changed source files via import analysis",agents:["architect","reviewer","critic_finding_validator","critic_oversight","test_engineer"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},mutation_test:{description:"executes pre-generated mutation patches against tests, evaluates kill rate against quality gate thresholds; test selection comes from explicit files (override) or source_files derived via the impact analyzer with a typed bounded fallback",agents:["architect","test_engineer"]},generate_mutants:{description:"generate LLM-based mutation testing patches for source files; returns MutationPatch[] for direct consumption by the mutation_test tool",agents:["architect"]},detect_domains:{description:"detect which SME domains are relevant for a given text",agents:["architect","sme","docs","docs_design","critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","critic","critic_oversight","explorer"]},git_blame:{description:"per-line git blame metadata: sha, author, date, summary for each line in a file",agents:["reviewer","critic_finding_validator","explorer","architect"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},gitingest:{description:"fetch a GitHub repository full content via gitingest.com",agents:["architect","docs","explorer"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},retrieve_summary:{description:"retrieve the full content of a stored tool output summary",agents:["architect","sme","docs","docs_design","designer","critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","critic_architecture_supervisor","spec_writer","reviewer","critic_finding_validator","critic","coder","test_engineer"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},retrieve_lane_output:{description:"retrieve paged full dispatch lane output by output_ref; use before consuming truncated lane previews or routing candidates from lane results",agents:["architect"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},extract_code_blocks:{description:"extract code blocks from text content and save them to files",agents:["docs","docs_design","designer","spec_writer","coder","test_engineer"]},phase_complete:{description:"preflight every applicable phase gate, report all blockers, and atomically commit a current passing snapshot",agents:["architect"]},run_phase_review:{description:"run the bounded phase-final review engine and persist complete content-addressed review evidence",agents:["architect"]},repair_gate_evidence:{description:"quarantine recoverable exact-task gate evidence, rebuild from durable requirements, recover receipt-backed legacy marker wedges or the exact sentinel-only historical reset, and refuse every other receipt-less reconstruction",agents:["architect"]},repair_knowledge_receipt_ledger:{description:"validate or repair authoritative knowledge receipts, preserve corrupt authority in bounded quarantine, require scoped re-evaluation, and backfill stable phase ids across the whole ledger (operation backfill_phase_id; phase/session_id do not scope the backfill)",agents:["architect"]},record_directive_override:{description:"record an audited architect override for identified critical-directive violations without bypassing unreadable authority",agents:["architect"]},save_plan:{description:"save a structured implementation plan",agents:["architect"]},update_task_status:{description:"mark tasks complete, track phase progress",agents:["architect"]},lint_spec:{description:"validate .swarm/spec.md format and required fields",agents:["architect","spec_writer"]},write_retro:{description:"document phase retrospectives via phase_complete workflow, capture lessons learned",agents:["architect"]},write_drift_evidence:{description:"write drift verification evidence for a completed phase",agents:["architect"]},write_hallucination_evidence:{description:"write hallucination verification evidence for a completed phase",agents:["architect"]},write_mutation_evidence:{description:"write mutation gate evidence for a completed phase; normalizes PASS/WARN/FAIL/SKIP verdicts and writes .swarm/evidence/{phase}/mutation-gate.json",agents:["architect"]},declare_scope:{description:"declare file scope for next coder delegation",agents:["architect"]},scope_validate:{description:"validate shell writes against an inline file scope",agents:["architect"]},knowledge_query:{description:"query swarm or hive knowledge with optional filters",agents:["architect","skill_improver","spec_writer"]},doc_scan:{description:"scan project documentation files and build an index manifest",agents:["architect","docs_design","skill_improver","spec_writer","explorer"]},doc_extract:{description:"extract actionable constraints from project documentation",agents:["architect","docs_design","skill_improver","spec_writer"]},curator_analyze:{description:"run curator phase analysis and optionally apply knowledge recommendations",agents:["architect"]},consensus_mine:{description:"mine cross-run consensus from existing .swarm evidence into an immutable proposals-only report; also deletes its own reports past consensus.report_retention, appends to the shared recommendation dedup ledger (in the shared cohort root, outside this project, when a knowledge link is active), and mirrors proposals into pending swarm-memory proposals when memory is enabled",agents:["architect","curator_phase","curator_postmortem"]},knowledge_add:{description:"store a new lesson in the knowledge base",agents:["architect","coder"]},knowledge_recall:{description:"search the knowledge base for relevant past decisions",agents:["architect","sme","docs","docs_design","designer","critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","critic_architecture_supervisor","curator_init","curator_phase","skill_improver","spec_writer","reviewer","critic_finding_validator","critic","critic_oversight","explorer","coder","test_engineer"]},knowledge_remove:{description:"delete an outdated swarm knowledge entry by ID (swarm tier only)",agents:["architect"]},co_change_analyzer:{description:"detect hidden couplings by analyzing git history",agents:["architect"]},context_status:{description:"report current context-window headroom for the active session — returns tokens-used, usageSource (provider|estimated), model-limit with provenance (modelLimitSource: host|override|provider_cap|native|fallback; modelLimitResolution: user_provider_model|user_model|user_default|live_model_limit|static_provider_cap|static_native|static_default; fallbackActive: true when the denominator came from a static table or the flat 128k default — treat headroom as uncertain), usage-percent, threshold-state (none/warn/critical), model name, and provider. Pure read-only: no state mutation, no warning injection. Works whether context_budget.enabled is true or false.",agents:["architect"]},search:{description:"Workspace-scoped ripgrep-style text search with structured JSON output. Supports literal and regex modes, glob filtering, and result limits. NOTE: This is text search, not structural AST search — use symbols and imports tools for structural queries.",agents:["architect","sme","docs","docs_design","designer","critic_hallucination_verifier","skill_improver","spec_writer","reviewer","critic_finding_validator","critic_oversight","explorer","coder","test_engineer","researcher"]},ast_grep:{description:"Read-only structural AST search using ast-grep patterns with optional language and glob filters. Use for syntax-aware code pattern searches; does not rewrite files.",agents:["architect","sme","docs","docs_design","critic_hallucination_verifier","spec_writer","explorer","coder","test_engineer","researcher"]},actionlint_scan:{description:"Run actionlint against GitHub Actions workflow YAML files with structured findings. Resolves actionlint lazily and does not modify files.",agents:["architect","test_engineer"],prWorkflow:{modes:["PR_REVIEW"],capability:"validate"}},osv_scan:{description:"Run OSV-Scanner against a workspace path and return structured dependency vulnerability findings. Resolves osv-scanner lazily and does not modify files.",agents:["architect","test_engineer"],prWorkflow:{modes:["PR_REVIEW"],capability:"validate"}},gh_evidence:{description:"Fetch bounded GitHub pull request or issue metadata through gh for review and CI evidence. Resolves gh lazily and is read-only.",agents:["architect","researcher"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},pr_workflow_status:{description:"Read-only architect observation of local git state (HEAD, branch, clean/dirty with a bounded changed-file list, remotes) plus a session-pinned PR workflow gate summary and the PR_FEEDBACK publication-generation section (state, attempts, invalidation reason, recovery guidance). Use to observe state under the fail-closed PR_REVIEW/PR_FEEDBACK gate. Never executes PR-controlled scripts and never reads another session gate.",agents:["architect"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},batch_symbols:{description:"Batched symbol extraction across multiple files. Returns per-file symbol summaries with isolated error handling.",agents:["architect","critic_hallucination_verifier","reviewer","critic_finding_validator","critic_oversight","explorer"]},suggest_patch:{description:"Reviewer-safe structured patch suggestion tool. Produces context-anchored patch artifacts without file modification. Returns structured diagnostics on context mismatch.",agents:["architect","reviewer","critic_finding_validator"]},req_coverage:{description:"query requirement coverage status for tracked functional requirements",agents:["critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","spec_writer","critic","critic_oversight"]},get_approved_plan:{description:"retrieve the last critic-approved immutable plan snapshot for baseline drift comparison",agents:["critic_drift_verifier","critic","critic_oversight"]},repo_map:{description:"query the repo code graph: importers, dependencies, blast radius, localization, ontology facts, package boundaries, and heuristic preflight packets before refactoring; ontology findings are advisory, not formal proofs",agents:["architect","critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","critic_architecture_supervisor","reviewer","critic_finding_validator","critic","critic_oversight","explorer","coder","test_engineer"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},get_qa_gate_profile:{description:"retrieve the QA gate profile for the current or exact future plan identity: gates (reviewer, test_engineer, sme_enabled, critic_pre_plan, sast_enabled, council_mode, hallucination_guard, mutation_test, phase_council, drift_check, final_council), lock state, profile hash, the calling session’s ratchet-tighter overrides, and the EFFECTIVE gates (profile merged with those overrides; durable across restart). Read-only and never creates state.",agents:["architect"]},set_qa_gates:{description:"configure the QA gate profile for the current plan or bootstrap an exact future plan with swarm_id and plan_title. Architect-only. The initial selection may set explicit true/false values over defaults; later changes are ratchet-tighter and rejected once locked after critic approval. Supports: reviewer, test_engineer, sme_enabled, critic_pre_plan, sast_enabled, council_mode, hallucination_guard, mutation_test, phase_council, drift_check, final_council, plus adopt_legacy_binding_only for exact-binding recovery without mutating gates.",agents:["architect"]},web_search:{description:"External web search (Tavily or Brave) for architect-driven council research, SME domain research, researcher auto-research, and skill-improver research. Returns titled results with snippets, URLs, normalized query metadata, temporal intent, freshness, and removed stale years. Config-gated on council.general.enabled in the resolved config: global ~/.config/opencode/opencode-swarm.json, then project .opencode/opencode-swarm.json overrides. Requires a search API key. Used by the architect in MODE: COUNCIL to gather a RESEARCH CONTEXT before dispatching council agents, by SME for opt-in external skill/source evaluation, and by the researcher agent for multi-source auto-research.",agents:["sme","researcher","skill_improver"]},web_fetch:{description:"Fetch the readable text of a single http(s) URL (architect-only). Returns decoded page text, document title, final URL after redirects, and an evidence reference. Reads primary sources that web_search only surfaces as snippets. Config-gated on council.general.enabled. Blocks private/loopback/link-local/metadata addresses (re-validated and re-pinned across redirects); enforces timeout and body size cap.",agents:[]},convene_general_council:{description:"Synthesize responses from a multi-model General Council. Accepts parallel member responses (Round 1, optionally Round 2), detects disagreements, and returns consensus points, persisting disagreements, and a structured synthesis. Architect-only. Config-gated on council.general.enabled in the resolved config: global ~/.config/opencode/opencode-swarm.json, then project .opencode/opencode-swarm.json overrides.",agents:[]},write_final_council_evidence:{description:"Persist project-scoped final council evidence to .swarm/evidence/final-council.json. PREREQUISITE: dispatch critic, reviewer, sme, test_engineer, and explorer as project-scoped Agent tasks and collect their CouncilMemberVerdict JSON — this tool synthesizes only. Rejects on insufficient quorum or CONCERNS with unresolved requiredFixes; normalizes verdicts to approved/concerns/rejected. Architect-only.",agents:[]},skill_generate:{description:"compile knowledge entries into a structured SKILL.md draft",agents:["skill_improver"]},skill_list:{description:"list generated skill files and their status",agents:["skill_improver"]},skill_apply:{description:"activate a draft skill proposal",agents:[]},skill_inspect:{description:"inspect the content and source entries of a skill file",agents:["skill_improver"]},run_stale_reconciliation:{description:"reconcile skills against the knowledge store: mark skills stale when source knowledge is archived or deleted, or clear stale markers",agents:["architect"]},skill_regenerate:{description:"regenerate an active skill by re-clustering its source knowledge entries and updating the SKILL.md in place",agents:[]},skill_retire:{description:"retire a generated skill by adding a retired.marker file; retired skills are excluded from scoring and injection",agents:[]},skill_improve:{description:"run the skill_improver agent to review and refine skills",agents:["skill_improver"]},spec_write:{description:"author or update .swarm/spec.md for the current project",agents:["spec_writer"]},knowledge_receipt:{description:"file a receipt for retrieved knowledge (applied/ignored/contradicted + new lessons), recorded as immutable knowledge events",agents:["architect","sme","docs","docs_design","designer","critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","critic_architecture_supervisor","curator_init","curator_phase","skill_improver","spec_writer","reviewer","critic_finding_validator","critic","coder","test_engineer"]},knowledge_receipt_status:{description:"receipt status",agents:["architect"]},knowledge_archive:{description:"archive (default), quarantine, or purge a swarm or hive knowledge entry by ID with an immutable audit tombstone; purge requires an admin flag",agents:["architect"]},swarm_memory_recall:{description:"recall scoped Swarm memory for the current repository as untrusted background",agents:[]},swarm_memory_propose:{description:"create a pending Swarm memory proposal; does not write durable memory directly",agents:[]},swarm_memory_outcome:{description:"record useful, dead-end, or corrected outcomes and, when enabled, synchronously refresh deterministic memory lessons",agents:[]},swarm_command:{description:"run supported /swarm commands through the canonical command registry",agents:["architect","sme","researcher","docs","docs_design","designer","reviewer","critic_finding_validator","critic","explorer","coder","test_engineer"]},dispatch_lanes:{description:"dispatch read-only exploration/review lanes concurrently and BLOCK until all finish; prefer dispatch_lanes_async for non-blocking dispatch, use this only when promptAsync is unavailable",agents:["architect"]},dispatch_lanes_async:{description:"launch read-only advisory lanes non-blockingly and return a batch id plus lane session handles immediately; each lane agent must be a registered generated agent name (unregistered bare roles are refused on multi-swarm hosts); launch_timeout_ms is only a promptAsync acceptance budget, not a lane runtime timeout; poll incrementally with collect_lane_results (wait omitted), or join with wait: true for all results",agents:["architect"]},collect_lane_results:{description:"collect/poll a dispatch_lanes_async batch — OBSERVATION ONLY; it can never cancel or abort a lane. A presumed-stale sweep runs on every call, settling lanes past the horizon: idle host to stale, unobservable host to a typed liveness error. The wait budget (timeout_ms) bounds this observer call only — its expiry, a missing messages client, or a degraded liveness probe never kills a lane, never proves it died, and never settles anything. If a collection returns pending lanes, poll again first; busy/retry host status is live evidence, not failure. Cancellation is a distinct, explicit, authorized, potentially destructive action: use cancel_lane_batch (confirm: true + reason), never this tool. An explicit operator cancellation settles as the distinct operator_cancelled class — not liveness. Unsettled lanes are reported in pending_lanes (batch_id, lane_id, status, output_ref) regardless of include_pending. Does not advance workflow gates. Settled-lane inline output is delivered once: later polls set output_omitted_repeat: true and omit output but keep output_ref for retrieval via retrieve_lane_output.",agents:["architect"]},cancel_lane_batch:{description:"cancel ACTIVE lanes of a dispatch_lanes_async batch — the only cancellation surface (collect_lane_results cannot cancel). Destructive and authorization-gated: requires confirm: true + a bounded reason, recorded on cancelled terminals as the distinct operator_cancelled class (never liveness; not auto-retryable, never consumes retry budget — re-dispatch explicitly). Race-safe per lane: busy/retry refused (live work is never destroyed — human force path: /swarm abort-pr-workflow); degraded/absent status probe refuses the whole batch fail-closed; idle or host-unknown sessions may be cancelled; a child completing in the race window is preserved; an abort timeout never claims cancellation.",agents:["architect"]},summarize_work:{description:"emit a short structured summary of completed work (key decisions, assumptions, risks, constraints) at task completion; rolls up per phase for architecture-supervisor review. Advisory, never blocks.",agents:["architect","sme","researcher","docs","docs_design","designer","explorer","coder","test_engineer"]},write_architecture_supervisor_evidence:{description:"persist the architecture supervisor verdict for a phase (architect MUST dispatch critic_architecture_supervisor first and collect its JSON verdict; this tool persists only, it does not contact the supervisor)",agents:["architect"]},lean_turbo_plan_lanes:{description:"partition phase tasks into parallel lanes based on file-scope conflicts for Lean Turbo execution",agents:[]},lean_turbo_acquire_locks:{description:"acquire file locks for all files in a lane (all-or-nothing) before lane execution",agents:[]},lean_turbo_runner_status:{description:"read Lean Turbo run state from .swarm/turbo-state.json",agents:[]},lean_turbo_critic:{description:"dispatch a read-only critic agent to evaluate boundary conditions for a completed Lean Turbo phase (satisfies the turbo.lean.phase_critic gate)",agents:[]},lean_turbo_review:{description:"dispatch a read-only reviewer agent to evaluate a completed Lean Turbo phase",agents:[]},lean_turbo_run_phase:{description:"Execute a phase using Lean Turbo parallel lane execution. Plans lanes, acquires file locks, and dispatches coder agents concurrently. Use when Lean Turbo is active and you want to execute all tasks in a phase in parallel lanes.",agents:[]},lean_turbo_status:{description:"returns Lean Turbo configuration and active status for the current session",agents:[]},swarm_apply_patch:{description:"Apply a unified diff patch to workspace files with exact context matching, atomic writes, and path validation. Use standard unified diff format only — does NOT support *** Begin Patch / *** Update File payloads (use native apply_patch for those).",agents:["coder","test_engineer"]},external_skill_discover:{description:"Discover external skill candidates from configured sources. Returns a disabled message when external_skills.curation_enabled is false.",agents:[]},external_skill_list:{description:"List external skill candidates in the quarantine store. Returns a disabled message when external_skills.curation_enabled is false.",agents:[]},external_skill_inspect:{description:"Inspect a specific external skill candidate by ID. Returns a disabled message when external_skills.curation_enabled is false.",agents:[]},external_skill_promote:{description:"Promote a validated external skill candidate to an active generated skill. Returns a disabled message when external_skills.curation_enabled is false.",agents:[]},external_skill_reject:{description:"Reject an external skill candidate after evaluation. Returns a disabled message when external_skills.curation_enabled is false.",agents:[]},external_skill_delete:{description:"Delete an external skill candidate from the quarantine store. Returns a disabled message when external_skills.curation_enabled is false.",agents:[]},external_skill_revoke:{description:"Revoke a previously promoted external skill. Returns a disabled message when external_skills.curation_enabled is false.",agents:[]},epic_next_wave:{description:"Epic Mode: the single, idempotent way forward while an epic is open. Closes the active wave once every task is resolved (recording per-task outcomes and declared-vs-actual divergence, which Epic learning uses to plan later waves), keeps phases in order, and issues the next wave of disjoint tasks with dispatch instructions. Returns a status: dispatch | declare-scopes | in-progress | blocked | phase-ready-for-review | epic-complete | refused. Requires `epic.mode.enabled: true` and an epic opened by `/swarm epic start`.",agents:[]},epic_phase_review:{description:"Epic Mode phase readiness: dispatch a read-only phase reviewer, then (only if it APPROVES) a read-only phase critic over the completed phase; parse both verdicts from the agents and record them to .swarm/evidence/{phase}/epic-phase-review.json. Required by phase_complete while an epic is open for the current plan; re-run after any fix (evidence is bound to the plan and phase task evidence).",agents:[]}},TOOL_NAMES=Object.keys(TOOL_METADATA),TOOL_NAME_SET=new Set(TOOL_NAMES);TOOL_DESCRIPTIONS=Object.fromEntries(Object.entries(TOOL_METADATA).map(([name,meta])=>[name,meta.description])),AGENT_TOOL_MAP=(()=>{let map=Object.fromEntries(ALL_AGENT_NAMES.map((agent)=>[agent,[]]));for(let[name,meta]of Object.entries(TOOL_METADATA))for(let agent of meta.agents)map[agent].push(name);return map})()});function scanOverrideForDangerousKeys(value,path,depth){if(depth>=10)return;if(Array.isArray(value)){for(let i=0;i<value.length;i++)scanOverrideForDangerousKeys(value[i],`${path}[${i}]`,depth+1);return}if(typeof value!=="object"||value===null)return;for(let key of Object.keys(value)){if(DANGEROUS_MERGE_KEYS.has(key))throw new DangerousMergeKeyError(key,path);scanOverrideForDangerousKeys(value[key],`${path}.${key}`,depth+1)}}function deepMergeInternal(base,override,depth,path){if(depth>=10)throw Error("deepMerge exceeded maximum depth of 10");let result={...base};for(let key of Object.keys(override)){let baseVal=base[key],overrideVal=override[key];if(typeof baseVal==="object"&&baseVal!==null&&typeof overrideVal==="object"&&overrideVal!==null&&!Array.isArray(baseVal)&&!Array.isArray(overrideVal))result[key]=deepMergeInternal(baseVal,overrideVal,depth+1,`${path}.${key}`);else result[key]=overrideVal}return result}function deepMerge(base,override){if(!base)return override;if(!override)return base;return scanOverrideForDangerousKeys(override,"$",0),deepMergeInternal(base,override,0,"$")}var MAX_MERGE_DEPTH=10,DANGEROUS_MERGE_KEYS,DangerousMergeKeyError;var init_merge=__esm(()=>{DANGEROUS_MERGE_KEYS=new Set(["__proto__","constructor","prototype"]);DangerousMergeKeyError=class DangerousMergeKeyError extends Error{key;path;constructor(key,path){super(`deepMerge refused dangerous key "${key}" at "${path}": prototype-pollution carriers (__proto__/constructor/prototype) are never merged`);this.key=key;this.path=path;this.name="DangerousMergeKeyError"}}});function freezeSet(items,name="CLAUDE_CODE_NATIVE_COMMANDS"){let set=new Set(items),proxy=new Proxy(set,{get(target,prop){if(prop==="add"||prop==="delete"||prop==="clear")return()=>{throw TypeError(`${name} is readonly`)};if(prop==="forEach")return(callback,thisArg)=>{let wrapped=(v,k)=>callback.call(thisArg??void 0,v,k,proxy);return set.forEach(wrapped)};let value=Reflect.get(target,prop);return typeof value==="function"?value.bind(target):value},set(){throw TypeError(`${name} is readonly`)},deleteProperty(){throw TypeError(`${name} is readonly`)},defineProperty(){throw TypeError(`${name} is readonly`)},setPrototypeOf(){throw TypeError(`${name} is readonly`)}});return proxy}function isQAAgent(name){return QA_AGENTS.includes(name)}function isSubagent(name){return ALL_SUBAGENT_NAMES.includes(name)}function isLowCapabilityModel(modelId){let lower=(modelId||"").toLowerCase();return LOW_CAPABILITY_MODELS.some((substr)=>lower.includes(substr))}var OPENCODE_NATIVE_AGENTS,CLAUDE_CODE_NATIVE_COMMANDS,OPENCODE_NATIVE_COMMANDS,MEMORY_AGENT_TOOL_MAP,EXTERNAL_SKILL_TOOL_NAMES,EXTERNAL_SKILL_AGENT_TOOL_MAP,COUNCIL_TOOL_NAMES,COUNCIL_AGENT_TOOL_MAP,GENERAL_COUNCIL_TOOL_NAMES,GENERAL_COUNCIL_AGENT_TOOL_MAP,TURBO_TOOL_NAMES,TURBO_AGENT_TOOL_MAP,EPIC_TOOL_NAMES,EPIC_AGENT_TOOL_MAP,SKILL_TOOL_NAMES,SKILL_AGENT_TOOL_MAP,PR_REVIEW_CHILD_TOOL_NAMES,PR_REVIEW_CHILD_AGENT_TOOL_MAP,WRITE_TOOL_NAMES,SUMMARIZER_EXEMPT_TOOL_NAMES,DEFAULT_MODELS,DEFAULT_AGENT_CONFIGS,DEFAULT_SCORING_CONFIG,LOW_CAPABILITY_MODELS,TURBO_MODE_BANNER=`## \uD83D\uDE80 TURBO MODE ACTIVE
|
|
1
|
+
import{createRequire}from"node:module";var __create=Object.create;var{getPrototypeOf:__getProtoOf,defineProperty:__defProp,getOwnPropertyNames:__getOwnPropNames,getOwnPropertyDescriptor:__getOwnPropDesc}=Object,__hasOwnProp=Object.prototype.hasOwnProperty;function __accessProp(key){return this[key]}var __toESMCache_node,__toESMCache_esm,__toESM=(mod,isNodeMode,target)=>{var canCache=mod!=null&&typeof mod==="object";if(canCache){var cache=isNodeMode?__toESMCache_node??=new WeakMap:__toESMCache_esm??=new WeakMap,cached=cache.get(mod);if(cached)return cached}target=mod!=null?__create(__getProtoOf(mod)):{};let to=isNodeMode||!mod||!mod.__esModule?__defProp(target,"default",{value:mod,enumerable:!0}):target;for(let key of __getOwnPropNames(mod))if(!__hasOwnProp.call(to,key))__defProp(to,key,{get:__accessProp.bind(mod,key),enumerable:!0});if(canCache)cache.set(mod,to);return to},__toCommonJS=(from)=>{var entry=(__moduleCache??=new WeakMap).get(from),desc;if(entry)return entry;if(entry=__defProp({},"__esModule",{value:!0}),from&&typeof from==="object"||typeof from==="function"){for(var key of __getOwnPropNames(from))if(!__hasOwnProp.call(entry,key))__defProp(entry,key,{get:__accessProp.bind(from,key),enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable})}return __moduleCache.set(from,entry),entry},__moduleCache,__commonJS=(cb,mod)=>()=>(mod||cb((mod={exports:{}}).exports,mod),mod.exports);var __returnValue=(v)=>v;function __exportSetter(name,newValue){this[name]=__returnValue.bind(null,newValue)}var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0,configurable:!0,set:__exportSetter.bind(all,name)})};var __esm=(fn2,res)=>()=>(fn2&&(res=fn2(fn2=0)),res);var __require=createRequire(import.meta.url);var package_default;var init_package=__esm(()=>{package_default={name:"opencode-swarm",version:"7.192.1",description:"Architect-centric agentic swarm plugin for OpenCode - hub-and-spoke orchestration with SME consultation, code generation, and QA review",main:"dist/index.js",types:"dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",default:"./dist/index.js"},"./package.json":"./package.json"},bin:{"opencode-swarm":"./dist/cli/index.js"},type:"module",engines:{bun:">=1.3.13",node:">=22.13"},license:"MIT",repository:{type:"git",url:"https://github.com/ZaxbyHub/opencode-swarm.git"},publishConfig:{access:"public",registry:"https://registry.npmjs.org/"},keywords:["opencode","opencode-plugin","ai","agents","orchestration","swarm","multi-agent","llm"],files:["dist","dist/lang/grammars","binaries","evaluation-fixtures",".opencode/skills/brainstorm",".opencode/skills/specify",".opencode/skills/clarify-spec",".opencode/skills/swarm-resume",".opencode/skills/clarify",".opencode/skills/discover",".opencode/skills/consult",".opencode/skills/pre-phase-briefing",".opencode/skills/council",".opencode/skills/deep-dive",".opencode/skills/deep-research",".opencode/skills/codebase-review-swarm",".opencode/skills/swarm-implement",".opencode/skills/design-docs",".opencode/skills/swarm-pr-review",".opencode/skills/swarm",".opencode/skills/swarm-pr-feedback",".opencode/skills/swarm-pr-subscribe",".opencode/skills/swarm-ci-monitor",".opencode/skills/issue-ingest",".opencode/skills/swarm-plan",".opencode/skills/critic-gate",".opencode/skills/execute",".opencode/skills/phase-wrap",".opencode/skills/loop",".opencode/skills/writing-tests",".opencode/skills/running-tests",".opencode/skills/engineering-conventions",".opencode/skills/commit-pr",".opencode/skills/ci-failure-batching",".opencode/skills/gate-attribution",".opencode/skills/merge-queue-readiness",".opencode/skills/skill-edit-validation",".opencode/skills/worktree-retry-cleanup",".opencode/skills/test-file-split",".opencode/skills/fork-pr-operations",".opencode/skills/parallel-work-check",".opencode/skills/ci-fix-monitor",".opencode/skills/issue-tracer",".opencode/skills/orchestrating-subagents",".opencode/skills/durable-session-state","tests/fixtures/memory-recall","tests/fixtures/memory-recall-heldout","opencode-swarm.schema.json","README.md","LICENSE"],scripts:{clean:`bun -e "require('fs').rmSync('dist',{recursive:true,force:true})"`,build:"bun run clean && bun run scripts/generate-config-schema.ts && bun run scripts/copy-grammars.ts && bun build src/index.ts --outdir dist --target node --format esm --external web-tree-sitter --minify-whitespace --minify-syntax && bun build src/cli/index.ts --outdir dist/cli --target bun --format esm --external bash-parser --splitting && bun run scripts/copy-grammars.ts --to-dist && tsc --emitDeclarationOnly",typecheck:"tsc --noEmit",test:"bun test",lint:"biome lint .","lint:ci":"biome ci .","test:unit:ci":"bun scripts/ci/run-unit-tests-local.ts","validate:repo":"bun scripts/ci/repository-validation.ts","drift:check":"bun run scripts/drift-check.ts","check:pre-push":"bun run scripts/drift-check.ts --enforce --no-report && bun run check:registry-citations","schema:generate":"bun run scripts/generate-config-schema.ts","generate:commands-docs":"bun run scripts/generate-commands-docs.ts","check:runtime-src-refs":"bun run scripts/check-runtime-src-refs.ts","drift:fix":"bun run scripts/drift-check.ts --fix --confirm","skills:sync":"bun run scripts/sync-qa-gate-skills.ts",format:"biome format . --write",check:"biome check --write .",dev:"bun run build && opencode","package:smoke":"node scripts/package-smoke.mjs",prepare:"bun run build","repro:704":"node scripts/repro-704.mjs","repro:2669":"node scripts/repro-2669.mjs","repro:2670":"node scripts/repro-2670.mjs","repro:1144":"bun scripts/repro-1144.mjs","repro:1873":"bun build scripts/repro-1873-entry.ts --outdir dist-build-test/repro-1873 --target node --format esm && node scripts/repro-1873.mjs","repro:2487":"bun build scripts/repro-2487-parity-entry.ts --outdir dist-build-test/repro-2487 --target node --format esm && node scripts/repro-2487-parity.mjs","check:events":"bun run scripts/check-event-contract.ts","check:retention":"bun run scripts/check-retention-registry.ts","check:core-events":"bun run scripts/check-core-events-usage.ts","check:shell-audit":"bun run scripts/check-shell-audit-usage.ts","check:trajectory-store":"bun run scripts/check-trajectory-store-usage.ts","check:mock-cleanup":"bun run scripts/check-mock-cleanup.ts","check:invariants":"bun run scripts/check-invariants.ts","check:token-formula":"bun run scripts/check-token-formula.ts","check:cross-contamination":"bun run scripts/check-cross-contamination.ts","check:test-clock":"bun run scripts/check-test-clock.ts","check:test-file-cap":"bun run scripts/check-test-file-cap.ts","check:test-tmpdir":"bun run scripts/check-test-tmpdir.ts","check:bash-portability":"bun run scripts/check-bash-portability.ts","check:pending-fragment":"bun run scripts/check-pending-fragment.ts","check:gate-portability":"bun run scripts/check-gate-portability.ts","check:bare-spawn":"bun run scripts/check-bare-executable-spawn.ts","check:error-channel-discard":"bun run scripts/check-error-channel-discard.ts","check:path-identity":"bun run scripts/check-path-identity.ts","check:registry-citations":"bun run scripts/check-registry-citations.ts","check:memory-recall":"bun run scripts/memory-recall-regression.ts","check:retrieval-quality":"bun run scripts/retrieval-quality-regression.ts"},dependencies:{"@modelcontextprotocol/sdk":"^1.30.0","@opencode-ai/plugin":"^1.18.3","@opencode-ai/sdk":"^1.18.3","@vscode/tree-sitter-wasm":"^0.3.0","bash-parser":"^0.5.0","p-limit":"^7.3.0",picomatch:"^4.0.4","proper-lockfile":"^4.1.2","quick-lru":"^7.3.0","web-tree-sitter":"^0.25.0",zod:"4.3.6"},devDependencies:{"@biomejs/biome":"2.3.14","@types/picomatch":"^4.0.3","bun-types":"1.3.8","js-yaml":"^4.1.1",typescript:"^5.7.3"},peerDependencies:{"@xenova/transformers":"^2.17.2"},peerDependenciesMeta:{"@xenova/transformers":{optional:!0}}}});var QA_AGENTS,PIPELINE_AGENTS,ORCHESTRATOR_NAME="architect",ALL_SUBAGENT_NAMES,ALL_AGENT_NAMES;var init_agent_names=__esm(()=>{QA_AGENTS=["reviewer","critic","critic_oversight","critic_finding_validator"],PIPELINE_AGENTS=["explorer","coder","test_engineer"],ALL_SUBAGENT_NAMES=["sme","researcher","docs","docs_design","designer","critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","critic_architecture_supervisor","curator_init","curator_phase","curator_postmortem","curator_consolidation","council_generalist","council_skeptic","council_domain_expert","skill_improver","spec_writer",...QA_AGENTS,...PIPELINE_AGENTS],ALL_AGENT_NAMES=["architect",...ALL_SUBAGENT_NAMES]});function getPrWorkflowToolCapability(toolName,mode){let metadata=TOOL_METADATA[toolName];if(!metadata?.prWorkflow?.modes.includes(mode))return null;return metadata.prWorkflow.capability}var TOOL_METADATA,TOOL_NAMES,TOOL_NAME_SET,TOOL_DESCRIPTIONS,AGENT_TOOL_MAP;var init_tool_metadata=__esm(()=>{init_agent_names();TOOL_METADATA={diff:{description:"structured git diff with contract change detection",agents:["architect","reviewer","critic_finding_validator","critic_oversight","coder","test_engineer"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},diff_summary:{description:"filter classified AST changes by category, risk level, or file for reviewer drill-down",agents:["architect","reviewer","critic_finding_validator","critic_oversight"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},syntax_check:{description:"check syntax of source files using tree-sitter parsers across multiple languages, returning per-file errors",agents:["architect","coder","test_engineer"],prWorkflow:{modes:["PR_REVIEW"],capability:"validate"}},placeholder_scan:{description:"todo and FIXME comment detection",agents:["architect","reviewer","critic_finding_validator"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},imports:{description:"find all consumers that import from a given file — use before refactoring shared modules to avoid breaking unseen dependents",agents:["architect","sme","researcher","docs","docs_design","critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","reviewer","critic_finding_validator","critic","coder","test_engineer"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},lint:{description:"run project linter in check or fix mode; supports biome, eslint, ruff, clippy, and more, returns structured results",agents:["architect","reviewer","critic_finding_validator","coder"],prWorkflow:{modes:["PR_REVIEW"],capability:"validate"}},secretscan:{description:"scan for secrets (API keys, tokens, passwords) via regex and entropy; returns redacted previews, excludes common dirs",agents:["architect","reviewer","critic_finding_validator","critic_oversight"],prWorkflow:{modes:["PR_REVIEW"],capability:"validate"}},sast_scan:{description:"static analysis security scan",agents:["architect","reviewer","critic_finding_validator","critic_oversight"],prWorkflow:{modes:["PR_REVIEW"],capability:"validate"}},build_check:{description:"discover and run build, typecheck, and test commands for various project ecosystems in the working directory",agents:["architect","coder","test_engineer"]},pre_check_batch:{description:"parallel verification: lint:check + secretscan + sast_scan + quality_budget",agents:["architect","reviewer","critic_finding_validator"]},quality_budget:{description:"code quality budget check",agents:["architect"],prWorkflow:{modes:["PR_REVIEW"],capability:"validate"}},symbols:{description:"extract exported symbols (functions, classes, interfaces, types) from source files; supports TypeScript, JavaScript, Python, Rust, Go, Dart, Ruby, PHP, and Java",agents:["architect","sme","researcher","docs","docs_design","designer","critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","spec_writer","reviewer","critic_finding_validator","critic","coder","test_engineer"]},complexity_hotspots:{description:"git churn × complexity risk map",agents:["architect","sme","researcher","critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","reviewer","critic_finding_validator","critic","critic_oversight","explorer","test_engineer"]},schema_drift:{description:"OpenAPI spec vs route drift",agents:["architect","sme","researcher","docs","explorer"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},todo_extract:{description:"structured TODO/FIXME extraction; with task_id, records the high-priority count as todo_scan gate evidence",agents:["architect","researcher","docs","explorer","coder"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},evidence_check:{description:"verify task evidence completeness",agents:["architect","critic_oversight"]},check_gate_status:{description:"check the gate status of a specific task",agents:["architect","critic_oversight"]},completion_verify:{description:"verify completed tasks have required evidence",agents:["architect","critic_oversight"]},complete_pr_workflow:{description:"validate terminal PR workflow evidence and clear its durable session gate",agents:["architect"]},abort_pr_workflow:{description:"abort an unrecoverable PR_REVIEW/PR_FEEDBACK mechanical gate and clear its durable session state",agents:["architect"]},authorize_pr_review_reentry:{description:"issue a one-use, identity-bound reviewer/test_engineer re-entry authorization for the active PR_REVIEW workflow (issue #2383)",agents:["architect"]},submit_pr_review_result:{description:"submit one child-bound typed result for an active PR-review base or micro discovery lane",agents:[],prWorkflow:{modes:["PR_REVIEW"],capability:"validate"}},approve_plan_critic:{description:"record a MANUAL plan_critic_gate approval snapshot to unblock the ratchet-tighter critic_pre_plan execution gate when the critic already returned APPROVED but the mechanical recorder failed to persist it (issue #2012), or as the sanctioned recovery for a bookkeeping-grade hashed-field repair under the critic-gate PLAN FREEZE rule (the reason must state which case applies)",agents:["architect"]},approve_retry_sounding_board:{description:"record a MANUAL critic_sounding_board gate entry to unblock the coder retry circuit-breaker gate when the sounding board returned APPROVED but the mechanical recorder missed it (issue #2703)",agents:["architect"]},recover_rework_task:{description:"recover a task wedged at rework_required when the reviewer/test_engineer verdict did not require a code change: write a supervised stage_a_passed so those gates can be re-dispatched without re-running the coder (issue #2755)",agents:["architect"]},recover_stage_a_task:{description:"recover a task wedged in the settlement-backed Stage A deadlock — workflow at idle/blocked while a COMMITTED accepted coder settlement and green post-settlement pre-check proof justify Stage A: write a settlement-backed stage_a_passed so reviewer/test_engineer can be dispatched, without re-running the coder (issue #2828)",agents:["architect"]},prepare_pr_workflow_checkout:{description:"prepare an auditable PR workflow checkout or restore its exact original branch/HEAD and preserved stash after terminal cleanup",agents:["architect"]},invalidate_pr_feedback_publication:{description:"invalidate the armed PR_FEEDBACK publication generation so approved content can change, superseding every content-dependent approval and reopening the exact scoped rework + fresh-review path (issue #2108)",agents:["architect"]},record_implementation_review:{description:"record fresh-context reviewer + critic APPROVE verdicts for the implementation diff so the /swarm issue --trace workflow can satisfy its review gate before commit-pr handoff",agents:["architect"]},record_issue_publication:{description:"record a publication receipt so the /swarm issue --trace workflow reaches its terminal published state after the PR is created/updated",agents:["architect"]},record_issue_reproduction:{description:"record the reproduction outcome for the current traced issue so the /swarm issue --trace workflow can satisfy its reproduction gate and transition to PLAN",agents:["architect"]},record_recurrence_sweep:{description:"record the recurrence sweep (defect class, predicates, hit dispositions, guardrail proof, related-problems results) so the /swarm issue --trace workflow can satisfy its recurrence gate before commit-pr handoff",agents:["architect"]},record_branch_freshness:{description:"record the Phase 0 branch-freshness outcome (synced / behind:<n> / fetch-failed:<reason> plus optional user override) so the /swarm issue --trace workflow can pass its freshness gate before transitioning to PLAN (issue #2564)",agents:["architect"]},record_trace_validation:{description:"record one per-phase trace-check.sh validator outcome (phase, pass/fail, reviewedCommit, treeId) so the /swarm issue --trace workflow can satisfy its validator-receipt gate before commit-pr handoff (issue #2564)",agents:["architect"]},record_merge_approval:{description:"record the human merge approval bound to the exact PR head SHA so the /swarm issue --trace workflow reaches its terminal merge_approval_recorded state — recorded for audit only, never certified or driven by the plugin (issue #2564)",agents:["architect"]},rebind_pr_feedback_head:{description:"rebind a PR_FEEDBACK workflow to a new verified remote PR head after merge/rebase/conflict repair, invalidating ancestry-bound receipts so the mechanical ladder re-runs",agents:["architect"]},run_pr_feedback_stage_a:{description:"execute and persist mandatory PR-feedback Stage A checks on a content-bound revision",agents:["architect"]},submit_council_verdicts:{description:"submit pre-collected council member verdicts for synthesis (architect MUST dispatch critic/reviewer/sme/test_engineer/explorer as Agent tasks first; this tool synthesizes only, it does not contact members)",agents:[]},submit_phase_council_verdicts:{description:"submit pre-collected phase-level council member verdicts for holistic phase synthesis (architect MUST dispatch all 5 council members with phase-scoped context first; this tool synthesizes only, it does not contact members)",agents:[]},declare_council_criteria:{description:"pre-declare acceptance criteria for a task before the coder starts work; criteria are read back during council evaluation",agents:[]},sbom_generate:{description:"SBOM generation for dependency inventory",agents:["architect"]},checkpoint:{description:"create named git checkpoints for save, restore, and delete — use before risky operations to enable rollback; a destructive restore previews first and requires the confirm_token issued in the preview (#2946)",agents:["architect"]},pkg_audit:{description:"dependency vulnerability scan — npm/pip/cargo",agents:["architect","critic_hallucination_verifier","reviewer","critic_finding_validator","critic_oversight","test_engineer"],prWorkflow:{modes:["PR_REVIEW"],capability:"validate"}},parse_lane_candidates:{description:"Parse [CANDIDATE] rows from a dispatch_lanes or collect_lane_results artifact (by output_ref), produce structured records with provenance, optionally persist to a per-batch sidecar JSONL. Pure-parser variant exists as internal module.",agents:["architect"]},plan_conflict_check:{description:"read-only advisory check (#1656): compute a pairwise file-conflict matrix for N proposed parallel task groups using declared scopes and optional git co-change; returns a verdict (all_disjoint / conflicts_present / unknown_scopes), per-pair evidence, and a suggested serialization order. Writes nothing — the execution gate independently recomputes the verdict inline at dispatch time via the same helper. Call BEFORE attempting parallel dispatch to confirm disjointness.",agents:["architect"]},write_pr_review_trigger_eval:{description:"persist the complete PR-review trigger evaluation with exact-set validation, dispatch provenance, and live merge-base verification",agents:["architect"]},write_pr_review_artifact:{description:"persist schema-validated PR-review findings checkpoints and exact actionable feedback handoffs under the active run",agents:["architect"]},pr_review_submission:{description:"submit a settled, head-bound PR review to GitHub through the gh PR Review API after the PR_REVIEW gate clears; architect-only, refuses while a gate is active or the run was aborted after settlement",agents:["architect"]},export_pr_review_partial_results:{description:"export the validated partial results of an ABORTED PR_REVIEW run as a partial, non-authoritative artifact bound per-item to receipt-authenticated findings; architect-only, requires the gate cleared and an abort event binding session and head, never implies completion or feedback consent",agents:["architect"]},prepare_pr_feedback_scope:{description:"prepare an exact file scope for one PR-feedback coder Task after immutable feedback verification settles",agents:["architect"]},test_runner:{description:"auto-detect and run tests",agents:["architect","reviewer","critic_finding_validator","test_engineer"],prWorkflow:{modes:["PR_REVIEW"],capability:"validate"}},test_impact:{description:"identify test files impacted by changed source files via import analysis",agents:["architect","reviewer","critic_finding_validator","critic_oversight","test_engineer"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},mutation_test:{description:"executes pre-generated mutation patches against tests, evaluates kill rate against quality gate thresholds; test selection comes from explicit files (override) or source_files derived via the impact analyzer with a typed bounded fallback",agents:["architect","test_engineer"]},generate_mutants:{description:"generate LLM-based mutation testing patches for source files; returns MutationPatch[] for direct consumption by the mutation_test tool",agents:["architect"]},detect_domains:{description:"detect which SME domains are relevant for a given text",agents:["architect","sme","docs","docs_design","critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","critic","critic_oversight","explorer"]},git_blame:{description:"per-line git blame metadata: sha, author, date, summary for each line in a file",agents:["reviewer","critic_finding_validator","explorer","architect"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},gitingest:{description:"fetch a GitHub repository full content via gitingest.com",agents:["architect","docs","explorer"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},retrieve_summary:{description:"retrieve the full content of a stored tool output summary",agents:["architect","sme","docs","docs_design","designer","critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","critic_architecture_supervisor","spec_writer","reviewer","critic_finding_validator","critic","coder","test_engineer"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},retrieve_lane_output:{description:"retrieve paged full dispatch lane output by output_ref; use before consuming truncated lane previews or routing candidates from lane results",agents:["architect"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},extract_code_blocks:{description:"extract code blocks from text content and save them to files",agents:["docs","docs_design","designer","spec_writer","coder","test_engineer"]},phase_complete:{description:"preflight every applicable phase gate, report all blockers, and atomically commit a current passing snapshot",agents:["architect"]},run_phase_review:{description:"run the bounded phase-final review engine and persist complete content-addressed review evidence",agents:["architect"]},repair_gate_evidence:{description:"quarantine recoverable exact-task gate evidence, rebuild from durable requirements, recover receipt-backed legacy marker wedges or the exact sentinel-only historical reset, and refuse every other receipt-less reconstruction",agents:["architect"]},repair_knowledge_receipt_ledger:{description:"validate or repair authoritative knowledge receipts, preserve corrupt authority in bounded quarantine, require scoped re-evaluation, and backfill stable phase ids across the whole ledger (operation backfill_phase_id; phase/session_id do not scope the backfill)",agents:["architect"]},record_directive_override:{description:"record an audited architect override for identified critical-directive violations without bypassing unreadable authority",agents:["architect"]},save_plan:{description:"save a structured implementation plan",agents:["architect"]},update_task_status:{description:"mark tasks complete, track phase progress",agents:["architect"]},lint_spec:{description:"validate .swarm/spec.md format and required fields",agents:["architect","spec_writer"]},write_retro:{description:"document phase retrospectives via phase_complete workflow, capture lessons learned",agents:["architect"]},write_drift_evidence:{description:"write drift verification evidence for a completed phase",agents:["architect"]},write_hallucination_evidence:{description:"write hallucination verification evidence for a completed phase",agents:["architect"]},write_mutation_evidence:{description:"write mutation gate evidence for a completed phase; normalizes PASS/WARN/FAIL/SKIP verdicts and writes .swarm/evidence/{phase}/mutation-gate.json",agents:["architect"]},declare_scope:{description:"declare file scope for next coder delegation",agents:["architect"]},scope_validate:{description:"validate shell writes against an inline file scope",agents:["architect"]},knowledge_query:{description:"query swarm or hive knowledge with optional filters",agents:["architect","skill_improver","spec_writer"]},doc_scan:{description:"scan project documentation files and build an index manifest",agents:["architect","docs_design","skill_improver","spec_writer","explorer"]},doc_extract:{description:"extract actionable constraints from project documentation",agents:["architect","docs_design","skill_improver","spec_writer"]},curator_analyze:{description:"run curator phase analysis and optionally apply knowledge recommendations",agents:["architect"]},consensus_mine:{description:"mine cross-run consensus from existing .swarm evidence into an immutable proposals-only report; also deletes its own reports past consensus.report_retention, appends to the shared recommendation dedup ledger (in the shared cohort root, outside this project, when a knowledge link is active), and mirrors proposals into pending swarm-memory proposals when memory is enabled",agents:["architect","curator_phase","curator_postmortem"]},knowledge_add:{description:"store a new lesson in the knowledge base",agents:["architect","coder"]},knowledge_recall:{description:"search the knowledge base for relevant past decisions",agents:["architect","sme","docs","docs_design","designer","critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","critic_architecture_supervisor","curator_init","curator_phase","skill_improver","spec_writer","reviewer","critic_finding_validator","critic","critic_oversight","explorer","coder","test_engineer"]},knowledge_remove:{description:"delete an outdated swarm knowledge entry by ID (swarm tier only)",agents:["architect"]},co_change_analyzer:{description:"detect hidden couplings by analyzing git history",agents:["architect"]},context_status:{description:"report current context-window headroom for the active session — returns tokens-used, usageSource (provider|estimated), model-limit with provenance (modelLimitSource: host|override|provider_cap|native|fallback; modelLimitResolution: user_provider_model|user_model|user_default|live_model_limit|static_provider_cap|static_native|static_default; fallbackActive: true when the denominator came from a static table or the flat 128k default — treat headroom as uncertain), usage-percent, threshold-state (none/warn/critical), model name, and provider. Pure read-only: no state mutation, no warning injection. Works whether context_budget.enabled is true or false.",agents:["architect"]},search:{description:"Workspace-scoped ripgrep-style text search with structured JSON output. Supports literal and regex modes, glob filtering, and result limits. NOTE: This is text search, not structural AST search — use symbols and imports tools for structural queries.",agents:["architect","sme","docs","docs_design","designer","critic_hallucination_verifier","skill_improver","spec_writer","reviewer","critic_finding_validator","critic_oversight","explorer","coder","test_engineer","researcher"]},ast_grep:{description:"Read-only structural AST search using ast-grep patterns with optional language and glob filters. Use for syntax-aware code pattern searches; does not rewrite files.",agents:["architect","sme","docs","docs_design","critic_hallucination_verifier","spec_writer","explorer","coder","test_engineer","researcher"]},actionlint_scan:{description:"Run actionlint against GitHub Actions workflow YAML files with structured findings. Resolves actionlint lazily and does not modify files.",agents:["architect","test_engineer"],prWorkflow:{modes:["PR_REVIEW"],capability:"validate"}},osv_scan:{description:"Run OSV-Scanner against a workspace path and return structured dependency vulnerability findings. Resolves osv-scanner lazily and does not modify files.",agents:["architect","test_engineer"],prWorkflow:{modes:["PR_REVIEW"],capability:"validate"}},gh_evidence:{description:"Fetch bounded GitHub pull request or issue metadata through gh for review and CI evidence. Resolves gh lazily and is read-only.",agents:["architect","researcher"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},pr_workflow_status:{description:"Read-only architect observation of local git state (HEAD, branch, clean/dirty with a bounded changed-file list, remotes) plus a session-pinned PR workflow gate summary and the PR_FEEDBACK publication-generation section (state, attempts, invalidation reason, recovery guidance). Use to observe state under the fail-closed PR_REVIEW/PR_FEEDBACK gate. Never executes PR-controlled scripts and never reads another session gate.",agents:["architect"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},batch_symbols:{description:"Batched symbol extraction across multiple files. Returns per-file symbol summaries with isolated error handling.",agents:["architect","critic_hallucination_verifier","reviewer","critic_finding_validator","critic_oversight","explorer"]},suggest_patch:{description:"Reviewer-safe structured patch suggestion tool. Produces context-anchored patch artifacts without file modification. Returns structured diagnostics on context mismatch.",agents:["architect","reviewer","critic_finding_validator"]},req_coverage:{description:"query requirement coverage status for tracked functional requirements",agents:["critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","spec_writer","critic","critic_oversight"]},get_approved_plan:{description:"retrieve the last critic-approved immutable plan snapshot for baseline drift comparison",agents:["critic_drift_verifier","critic","critic_oversight"]},repo_map:{description:"query the repo code graph: importers, dependencies, blast radius, localization, ontology facts, package boundaries, and heuristic preflight packets before refactoring; ontology findings are advisory, not formal proofs",agents:["architect","critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","critic_architecture_supervisor","reviewer","critic_finding_validator","critic","critic_oversight","explorer","coder","test_engineer"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},get_qa_gate_profile:{description:"retrieve the QA gate profile for the current or exact future plan identity: gates (reviewer, test_engineer, sme_enabled, critic_pre_plan, sast_enabled, council_mode, hallucination_guard, mutation_test, phase_council, drift_check, final_council), lock state, profile hash, the calling session’s ratchet-tighter overrides, and the EFFECTIVE gates (profile merged with those overrides; durable across restart). Read-only and never creates state.",agents:["architect"]},set_qa_gates:{description:"configure the QA gate profile for the current plan or bootstrap an exact future plan with swarm_id and plan_title. Architect-only. The initial selection may set explicit true/false values over defaults; later changes are ratchet-tighter and rejected once locked after critic approval. Supports: reviewer, test_engineer, sme_enabled, critic_pre_plan, sast_enabled, council_mode, hallucination_guard, mutation_test, phase_council, drift_check, final_council, plus adopt_legacy_binding_only for exact-binding recovery without mutating gates.",agents:["architect"]},web_search:{description:"External web search (Tavily or Brave) for architect-driven council research, SME domain research, researcher auto-research, and skill-improver research. Returns titled results with snippets, URLs, normalized query metadata, temporal intent, freshness, and removed stale years. Config-gated on council.general.enabled in the resolved config: global ~/.config/opencode/opencode-swarm.json, then project .opencode/opencode-swarm.json overrides. Requires a search API key. Used by the architect in MODE: COUNCIL to gather a RESEARCH CONTEXT before dispatching council agents, by SME for opt-in external skill/source evaluation, and by the researcher agent for multi-source auto-research.",agents:["sme","researcher","skill_improver"]},web_fetch:{description:"Fetch the readable text of a single http(s) URL (architect-only). Returns decoded page text, document title, final URL after redirects, and an evidence reference. Reads primary sources that web_search only surfaces as snippets. Config-gated on council.general.enabled. Blocks private/loopback/link-local/metadata addresses (re-validated and re-pinned across redirects); enforces timeout and body size cap.",agents:[]},convene_general_council:{description:"Synthesize responses from a multi-model General Council. Accepts parallel member responses (Round 1, optionally Round 2), detects disagreements, and returns consensus points, persisting disagreements, and a structured synthesis. Architect-only. Config-gated on council.general.enabled in the resolved config: global ~/.config/opencode/opencode-swarm.json, then project .opencode/opencode-swarm.json overrides.",agents:[]},write_final_council_evidence:{description:"Persist project-scoped final council evidence to .swarm/evidence/final-council.json. PREREQUISITE: dispatch critic, reviewer, sme, test_engineer, and explorer as project-scoped Agent tasks and collect their CouncilMemberVerdict JSON — this tool synthesizes only. Rejects on insufficient quorum or CONCERNS with unresolved requiredFixes; normalizes verdicts to approved/concerns/rejected. Architect-only.",agents:[]},skill_generate:{description:"compile knowledge entries into a structured SKILL.md draft",agents:["skill_improver"]},skill_list:{description:"list generated skill files and their status",agents:["skill_improver"]},skill_apply:{description:"activate a draft skill proposal",agents:[]},skill_inspect:{description:"inspect the content and source entries of a skill file",agents:["skill_improver"]},run_stale_reconciliation:{description:"reconcile skills against the knowledge store: mark skills stale when source knowledge is archived or deleted, or clear stale markers",agents:["architect"]},skill_regenerate:{description:"regenerate an active skill by re-clustering its source knowledge entries and updating the SKILL.md in place",agents:[]},skill_retire:{description:"retire a generated skill by adding a retired.marker file; retired skills are excluded from scoring and injection",agents:[]},skill_improve:{description:"run the skill_improver agent to review and refine skills",agents:["skill_improver"]},spec_write:{description:"author or update .swarm/spec.md for the current project",agents:["spec_writer"]},knowledge_receipt:{description:"file a receipt for retrieved knowledge (applied/ignored/contradicted + new lessons), recorded as immutable knowledge events",agents:["architect","sme","docs","docs_design","designer","critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","critic_architecture_supervisor","curator_init","curator_phase","skill_improver","spec_writer","reviewer","critic_finding_validator","critic","coder","test_engineer"]},knowledge_receipt_status:{description:"receipt status",agents:["architect"]},knowledge_archive:{description:"archive (default), quarantine, or purge a swarm or hive knowledge entry by ID with an immutable audit tombstone; purge requires an admin flag",agents:["architect"]},swarm_memory_recall:{description:"recall scoped Swarm memory for the current repository as untrusted background",agents:[]},swarm_memory_propose:{description:"create a pending Swarm memory proposal; does not write durable memory directly",agents:[]},swarm_memory_outcome:{description:"record useful, dead-end, or corrected outcomes and, when enabled, synchronously refresh deterministic memory lessons",agents:[]},swarm_command:{description:"run supported /swarm commands through the canonical command registry",agents:["architect","sme","researcher","docs","docs_design","designer","reviewer","critic_finding_validator","critic","explorer","coder","test_engineer"]},dispatch_lanes:{description:"dispatch read-only exploration/review lanes concurrently and BLOCK until all finish; prefer dispatch_lanes_async for non-blocking dispatch, use this only when promptAsync is unavailable",agents:["architect"]},dispatch_lanes_async:{description:"launch read-only advisory lanes non-blockingly and return a batch id plus lane session handles immediately; each lane agent must be a registered generated agent name (unregistered bare roles are refused on multi-swarm hosts); launch_timeout_ms is only a promptAsync acceptance budget, not a lane runtime timeout; poll incrementally with collect_lane_results (wait omitted), or join with wait: true for all results",agents:["architect"]},collect_lane_results:{description:"collect/poll a dispatch_lanes_async batch — OBSERVATION ONLY; it can never cancel or abort a lane. A presumed-stale sweep runs on every call, settling lanes past the horizon: idle host to stale, unobservable host to a typed liveness error. The wait budget (timeout_ms) bounds this observer call only — its expiry, a missing messages client, or a degraded liveness probe never kills a lane, never proves it died, and never settles anything. If a collection returns pending lanes, poll again first; busy/retry host status is live evidence, not failure. Cancellation is a distinct, explicit, authorized, potentially destructive action: use cancel_lane_batch (confirm: true + reason), never this tool. An explicit operator cancellation settles as the distinct operator_cancelled class — not liveness. Unsettled lanes are reported in pending_lanes (batch_id, lane_id, status, output_ref) regardless of include_pending. Does not advance workflow gates. Settled-lane inline output is delivered once: later polls set output_omitted_repeat: true and omit output but keep output_ref for retrieval via retrieve_lane_output.",agents:["architect"]},cancel_lane_batch:{description:"cancel ACTIVE lanes of a dispatch_lanes_async batch — the only cancellation surface (collect_lane_results cannot cancel). Destructive and authorization-gated: requires confirm: true + a bounded reason, recorded on cancelled terminals as the distinct operator_cancelled class (never liveness; not auto-retryable, never consumes retry budget — re-dispatch explicitly). Race-safe per lane: busy/retry refused (live work is never destroyed — human force path: /swarm abort-pr-workflow); degraded/absent status probe refuses the whole batch fail-closed; idle or host-unknown sessions may be cancelled; a child completing in the race window is preserved; an abort timeout never claims cancellation.",agents:["architect"]},summarize_work:{description:"emit a short structured summary of completed work (key decisions, assumptions, risks, constraints) at task completion; rolls up per phase for architecture-supervisor review. Advisory, never blocks.",agents:["architect","sme","researcher","docs","docs_design","designer","explorer","coder","test_engineer"]},write_architecture_supervisor_evidence:{description:"persist the architecture supervisor verdict for a phase (architect MUST dispatch critic_architecture_supervisor first and collect its JSON verdict; this tool persists only, it does not contact the supervisor)",agents:["architect"]},lean_turbo_plan_lanes:{description:"partition phase tasks into parallel lanes based on file-scope conflicts for Lean Turbo execution",agents:[]},lean_turbo_acquire_locks:{description:"acquire file locks for all files in a lane (all-or-nothing) before lane execution",agents:[]},lean_turbo_runner_status:{description:"read Lean Turbo run state from .swarm/turbo-state.json",agents:[]},lean_turbo_critic:{description:"dispatch a read-only critic agent to evaluate boundary conditions for a completed Lean Turbo phase (satisfies the turbo.lean.phase_critic gate)",agents:[]},lean_turbo_review:{description:"dispatch a read-only reviewer agent to evaluate a completed Lean Turbo phase",agents:[]},lean_turbo_run_phase:{description:"Execute a phase using Lean Turbo parallel lane execution. Plans lanes, acquires file locks, and dispatches coder agents concurrently. Use when Lean Turbo is active and you want to execute all tasks in a phase in parallel lanes.",agents:[]},lean_turbo_status:{description:"returns Lean Turbo configuration and active status for the current session",agents:[]},swarm_apply_patch:{description:"Apply a unified diff patch to workspace files with exact context matching, atomic writes, and path validation. Use standard unified diff format only — does NOT support *** Begin Patch / *** Update File payloads (use native apply_patch for those).",agents:["coder","test_engineer"]},external_skill_discover:{description:"Discover external skill candidates from configured sources. Returns a disabled message when external_skills.curation_enabled is false.",agents:[]},external_skill_list:{description:"List external skill candidates in the quarantine store. Returns a disabled message when external_skills.curation_enabled is false.",agents:[]},external_skill_inspect:{description:"Inspect a specific external skill candidate by ID. Returns a disabled message when external_skills.curation_enabled is false.",agents:[]},external_skill_promote:{description:"Promote a validated external skill candidate to an active generated skill. Returns a disabled message when external_skills.curation_enabled is false.",agents:[]},external_skill_reject:{description:"Reject an external skill candidate after evaluation. Returns a disabled message when external_skills.curation_enabled is false.",agents:[]},external_skill_delete:{description:"Delete an external skill candidate from the quarantine store. Returns a disabled message when external_skills.curation_enabled is false.",agents:[]},external_skill_revoke:{description:"Revoke a previously promoted external skill. Returns a disabled message when external_skills.curation_enabled is false.",agents:[]},epic_next_wave:{description:"Epic Mode: the single, idempotent way forward while an epic is open. Closes the active wave once every task is resolved (recording per-task outcomes and declared-vs-actual divergence, which Epic learning uses to plan later waves), keeps phases in order, and issues the next wave of disjoint tasks with dispatch instructions. Returns a status: dispatch | declare-scopes | in-progress | blocked | phase-ready-for-review | epic-complete | refused. Requires `epic.mode.enabled: true` and an epic opened by `/swarm epic start`.",agents:[]},epic_phase_review:{description:"Epic Mode phase readiness: dispatch a read-only phase reviewer, then (only if it APPROVES) a read-only phase critic over the completed phase; parse both verdicts from the agents and record them to .swarm/evidence/{phase}/epic-phase-review.json. Required by phase_complete while an epic is open for the current plan; re-run after any fix (evidence is bound to the plan and phase task evidence).",agents:[]}},TOOL_NAMES=Object.keys(TOOL_METADATA),TOOL_NAME_SET=new Set(TOOL_NAMES);TOOL_DESCRIPTIONS=Object.fromEntries(Object.entries(TOOL_METADATA).map(([name,meta])=>[name,meta.description])),AGENT_TOOL_MAP=(()=>{let map=Object.fromEntries(ALL_AGENT_NAMES.map((agent)=>[agent,[]]));for(let[name,meta]of Object.entries(TOOL_METADATA))for(let agent of meta.agents)map[agent].push(name);return map})()});function scanOverrideForDangerousKeys(value,path,depth){if(depth>=10)return;if(Array.isArray(value)){for(let i=0;i<value.length;i++)scanOverrideForDangerousKeys(value[i],`${path}[${i}]`,depth+1);return}if(typeof value!=="object"||value===null)return;for(let key of Object.keys(value)){if(DANGEROUS_MERGE_KEYS.has(key))throw new DangerousMergeKeyError(key,path);scanOverrideForDangerousKeys(value[key],`${path}.${key}`,depth+1)}}function deepMergeInternal(base,override,depth,path){if(depth>=10)throw Error("deepMerge exceeded maximum depth of 10");let result={...base};for(let key of Object.keys(override)){let baseVal=base[key],overrideVal=override[key];if(typeof baseVal==="object"&&baseVal!==null&&typeof overrideVal==="object"&&overrideVal!==null&&!Array.isArray(baseVal)&&!Array.isArray(overrideVal))result[key]=deepMergeInternal(baseVal,overrideVal,depth+1,`${path}.${key}`);else result[key]=overrideVal}return result}function deepMerge(base,override){if(!base)return override;if(!override)return base;return scanOverrideForDangerousKeys(override,"$",0),deepMergeInternal(base,override,0,"$")}var MAX_MERGE_DEPTH=10,DANGEROUS_MERGE_KEYS,DangerousMergeKeyError;var init_merge=__esm(()=>{DANGEROUS_MERGE_KEYS=new Set(["__proto__","constructor","prototype"]);DangerousMergeKeyError=class DangerousMergeKeyError extends Error{key;path;constructor(key,path){super(`deepMerge refused dangerous key "${key}" at "${path}": prototype-pollution carriers (__proto__/constructor/prototype) are never merged`);this.key=key;this.path=path;this.name="DangerousMergeKeyError"}}});function freezeSet(items,name="CLAUDE_CODE_NATIVE_COMMANDS"){let set=new Set(items),proxy=new Proxy(set,{get(target,prop){if(prop==="add"||prop==="delete"||prop==="clear")return()=>{throw TypeError(`${name} is readonly`)};if(prop==="forEach")return(callback,thisArg)=>{let wrapped=(v,k)=>callback.call(thisArg??void 0,v,k,proxy);return set.forEach(wrapped)};let value=Reflect.get(target,prop);return typeof value==="function"?value.bind(target):value},set(){throw TypeError(`${name} is readonly`)},deleteProperty(){throw TypeError(`${name} is readonly`)},defineProperty(){throw TypeError(`${name} is readonly`)},setPrototypeOf(){throw TypeError(`${name} is readonly`)}});return proxy}function isQAAgent(name){return QA_AGENTS.includes(name)}function isSubagent(name){return ALL_SUBAGENT_NAMES.includes(name)}function isLowCapabilityModel(modelId){let lower=(modelId||"").toLowerCase();return LOW_CAPABILITY_MODELS.some((substr)=>lower.includes(substr))}var OPENCODE_NATIVE_AGENTS,CLAUDE_CODE_NATIVE_COMMANDS,OPENCODE_NATIVE_COMMANDS,MEMORY_AGENT_TOOL_MAP,EXTERNAL_SKILL_TOOL_NAMES,EXTERNAL_SKILL_AGENT_TOOL_MAP,COUNCIL_TOOL_NAMES,COUNCIL_AGENT_TOOL_MAP,GENERAL_COUNCIL_TOOL_NAMES,GENERAL_COUNCIL_AGENT_TOOL_MAP,TURBO_TOOL_NAMES,TURBO_AGENT_TOOL_MAP,EPIC_TOOL_NAMES,EPIC_AGENT_TOOL_MAP,SKILL_TOOL_NAMES,SKILL_AGENT_TOOL_MAP,PR_REVIEW_CHILD_TOOL_NAMES,PR_REVIEW_CHILD_AGENT_TOOL_MAP,WRITE_TOOL_NAMES,SUMMARIZER_EXEMPT_TOOL_NAMES,DEFAULT_MODELS,DEFAULT_AGENT_CONFIGS,DEFAULT_SCORING_CONFIG,LOW_CAPABILITY_MODELS,TURBO_MODE_BANNER=`## \uD83D\uDE80 TURBO MODE ACTIVE
|
|
2
2
|
|
|
3
3
|
**Speed optimization enabled for this session.**
|
|
4
4
|
|
|
@@ -130,7 +130,7 @@ line break`,"required change with\rcarriage return"]),discardedReviewer=encodePr
|
|
|
130
130
|
`);return outside?`${outside}
|
|
131
131
|
${protocol}`:protocol}function declaredCanonicalFamilies(source){let families=[];for(let line of source.split(/\r?\n/)){let family=candidateHeaderFamily(splitPipeFields(line).map((field)=>field.trim()));if(family&&!families.includes(family))families.push(family)}return families}function normalizeCandidateArtifact(rawText,fallbackFamily){let repairKinds=[],summaryDrop=dropNonContractMarkerRows(rawText);if(summaryDrop.dropped)repairKinds.push("summary-row-dropped");let recoveredFence=recoverTerminalProtocolFence(summaryDrop.text,fallbackFamily);if(recoveredFence!==null)repairKinds.push("terminal-protocol-fence");let cleanRepair=repairRedundantCleanConfidence(recoveredFence??removeCandidateCodeFences(summaryDrop.text),fallbackFamily);if(cleanRepair.repaired)repairKinds.push("redundant-clean-confidence");let pipeRepair=repairCleanEvidencePipes(cleanRepair.text);if(pipeRepair.repaired)repairKinds.push("clean-evidence-pipe-tail-merge");let candidatePipeRepair=repairCandidateEvidencePipes(pipeRepair.text,fallbackFamily);if(candidatePipeRepair.repaired)repairKinds.push("candidate-evidence-pipe-recovery-lossy");let lateHeaderRepair=resynchronizeLateCanonicalHeader(candidatePipeRepair.text,fallbackFamily);if(lateHeaderRepair.repaired)repairKinds.push("late-canonical-header-resynchronized");let duplicateHeaderDrop=dropDuplicateHeaderRows(lateHeaderRepair.text);if(duplicateHeaderDrop.dropped)repairKinds.push("duplicate-header-row-dropped");let text=duplicateHeaderDrop.text,header=selectCandidateHeader(text.split(/\r?\n/));if(header?.markerBearing&&header.family!==null)return{text,synthesizedHeader:!1,repairKinds};if(declaredCanonicalFamilies(text).length>0)return{text,synthesizedHeader:!1,repairKinds};if(declaredCanonicalFamilies(summaryDrop.text).some((family)=>family!==fallbackFamily))return{text,synthesizedHeader:!1,repairKinds};let lines=text.split(/\r?\n/);if(!lines.some((line)=>{if(analyzeCandidateLine(line,fallbackFamily)?.valid===!0)return!0;let fields=splitPipeFields(line).map((field)=>field.trim());if(fields[0]!==CLEAN_MARKER)return!1;return analyzeCleanFields(fields,fallbackFamily).valid}))return{text,synthesizedHeader:!1,repairKinds};let firstSalvageableIndex=lines.findIndex((line)=>{let marker=splitPipeFields(line)[0]?.trim();return marker===CANDIDATE_MARKER||marker===CLEAN_MARKER});return repairKinds.push("synthesized-header"),{text:[...lines.slice(0,firstSalvageableIndex),CANDIDATE_HEADERS[fallbackFamily],...lines.slice(firstSalvageableIndex)].join(`
|
|
132
132
|
`),synthesizedHeader:!0,repairKinds}}function candidateArtifactCacheKey(rawText,fallbackFamily){return createHash2("sha256").update(`${rawText}\x00${fallbackFamily}`).digest("hex")}function normalizeCandidateArtifactCached(rawText,fallbackFamily){let key=candidateArtifactCacheKey(rawText,fallbackFamily),hit=candidateArtifactCache.get(key);if(hit!==void 0)return candidateArtifactCacheHits++,hit;candidateArtifactCacheMisses++;let result=normalizeCandidateArtifact(rawText,fallbackFamily);if(candidateArtifactCache.size>=CANDIDATE_ARTIFACT_CACHE_CAPACITY){let oldest=candidateArtifactCache.keys().next().value;if(oldest!==void 0)candidateArtifactCache.delete(oldest)}return candidateArtifactCache.set(key,result),result}function analyzeCandidateLaneContext(context){let issues=[],baseBound=Boolean(context.expected_lane||context.expected_lanes),microBound=Boolean(context.expected_micro_lane||context.expected_micro_lanes);if(context.expected_lanes){if(!context.expected_lane)issues.push({field:"expected_lane",message:"expected_lane is required when expected_lanes is supplied"});if(new Set(context.expected_lanes).size!==context.expected_lanes.length)issues.push({field:"expected_lanes",message:"expected_lanes must contain unique lane identities"});if(context.expected_lane&&!context.expected_lanes.includes(context.expected_lane))issues.push({field:"expected_lanes",message:"expected_lanes must contain expected_lane"})}if(context.expected_micro_lanes){if(!context.expected_micro_lane)issues.push({field:"expected_micro_lane",message:"expected_micro_lane is required when expected_micro_lanes is supplied"});if(new Set(context.expected_micro_lanes).size!==context.expected_micro_lanes.length)issues.push({field:"expected_micro_lanes",message:"expected_micro_lanes must contain unique lane identities"});if(context.expected_micro_lane&&!context.expected_micro_lanes.includes(context.expected_micro_lane))issues.push({field:"expected_micro_lanes",message:"expected_micro_lanes must contain expected_micro_lane"})}if(!context.expected_family&&baseBound&µBound)issues.push({field:"expected_family",message:"base and micro ownership fields cannot be combined without one expected_family"});else if(context.expected_family==="base_explorer"&µBound)issues.push({field:"expected_family",message:"base_explorer ownership cannot include expected_micro_lane fields"});else if(context.expected_family==="micro_lane"&&baseBound)issues.push({field:"expected_family",message:"micro_lane ownership cannot include expected_lane fields"});else if(!context.expected_family&&baseBound)issues.push({field:"expected_family",message:"base ownership fields require expected_family base_explorer"});else if(!context.expected_family&µBound)issues.push({field:"expected_family",message:"micro ownership fields require expected_family micro_lane"});return issues}function splitPipeFields(line){let fields=[],current="";for(let index=0;index<line.length;index++){let char=line[index];if(char==="\\"&&index+1<line.length&&line[index+1]==="|"){current+="|",index++;continue}if(char==="|"){fields.push(current),current="";continue}current+=char}return fields.push(current),fields}function candidateDiagnosticPreview(value){let normalized=value.replace(/[\r\n\t]+/g," ").trim();if(normalized.length<=CANDIDATE_DIAGNOSTIC_PREVIEW_CHARS)return normalized;return`${normalized.slice(0,CANDIDATE_DIAGNOSTIC_PREVIEW_CHARS)}...`}function isCandidateSeverity(value){return value!==null&&value!==void 0&&CANDIDATE_SEVERITIES.includes(value)}function isCandidateConfidence(value){return value!==null&&value!==void 0&&CANDIDATE_CONFIDENCES.includes(value)}function isCandidateLookingShortRow(fields,_context,explicitCandidateMarker=!1){if(explicitCandidateMarker||fields[0]?.trim()==="[CANDIDATE]")return!0;return fields.length>=2}function analyzeCandidateFields(fields,family){let names=CANDIDATE_FIELDS[family],trimmed=fields.map((field)=>field.trim()),values={},issues=[];if(trimmed.length!==CANDIDATE_FIELD_COUNT)issues.push({field:"row",message:`Expected exactly ${CANDIDATE_FIELD_COUNT} candidate fields, received ${trimmed.length}`});for(let index=0;index<names.length;index++){let name=names[index],value=trimmed[index]?.trim()||null;if(values[name]=value,value===null&&name!=="risk_impact"&&name!=="risk_tags")issues.push({field:name,message:`Missing required field: ${name}`})}let severity=values.severity;if(severity!==null&&!isCandidateSeverity(severity))issues.push({field:"severity",message:`Invalid severity: ${candidateDiagnosticPreview(severity)}; expected ${CANDIDATE_SEVERITIES.join("|")}`});let confidence=values.confidence;if(confidence!==null&&!isCandidateConfidence(confidence))issues.push({field:"confidence",message:`Invalid confidence: ${candidateDiagnosticPreview(confidence)}; expected ${CANDIDATE_CONFIDENCES.join("|")}`});let riskImpact=values.risk_impact;if(riskImpact!==null&&!PR_REVIEW_RISK_IMPACTS.includes(riskImpact))issues.push({field:"risk_impact",message:`Invalid risk_impact: ${candidateDiagnosticPreview(riskImpact)}; expected ${PR_REVIEW_RISK_IMPACTS.join("|")}`});let riskTags=values.risk_tags;if(riskTags!==null){let parsedTags=parsePrReviewRiskTagsField(riskTags),known=new Set(PR_REVIEW_RISK_TAGS);if(riskTags!==""&&(parsedTags.length===0||parsedTags.some((tag)=>!known.has(tag))))issues.push({field:"risk_tags",message:`Invalid risk_tags: ${candidateDiagnosticPreview(riskTags)}; expected a comma-separated subset of ${PR_REVIEW_RISK_TAGS.join("|")}, or empty`})}return{valid:issues.length===0,issues,values,candidateId:values.candidate_id,workflowLane:family==="base_explorer"?values.lane:values.micro_lane}}function analyzeCleanFields(fields,family,expectedLane){let trimmed=fields.map((field)=>field.trim()),issues=[],laneField=family==="base_explorer"?"lane":"micro_lane";if(trimmed.length!==CLEAN_FIELD_COUNT)issues.push({field:"row",message:`Expected exactly ${CLEAN_FIELD_COUNT-1} CLEAN fields after [CLEAN], received ${Math.max(0,trimmed.length-1)}`});if(trimmed[0]!=="[CLEAN]")issues.push({field:"row",message:"CLEAN row must begin with [CLEAN]"});let lane=trimmed[1]||null,coverageScope=trimmed[2]||null,evidence=trimmed[3]||null;if(lane===null)issues.push({field:laneField,message:`Missing required field: ${laneField}`});else if(expectedLane!==void 0&&lane!==expectedLane)issues.push({field:laneField,message:`Expected ${laneField} ${candidateDiagnosticPreview(expectedLane)}, received ${candidateDiagnosticPreview(lane)}`});if(coverageScope===null)issues.push({field:"coverage_scope",message:"Missing required field: coverage_scope"});else if(coverageScope.length<CLEAN_COVERAGE_SCOPE_MIN_CHARS)issues.push({field:"coverage_scope",message:`coverage_scope must contain at least ${CLEAN_COVERAGE_SCOPE_MIN_CHARS} characters`});if(evidence===null)issues.push({field:"evidence",message:"Missing required field: evidence"});else if(evidence.length<CLEAN_EVIDENCE_MIN_CHARS)issues.push({field:"evidence",message:`evidence must contain at least ${CLEAN_EVIDENCE_MIN_CHARS} characters`});return{valid:issues.length===0,issues,lane,coverageScope,evidence}}function analyzeCandidateLine(line,family){let fields=splitPipeFields(line).map((field)=>field.trim());if(fields[0]!=="[CANDIDATE]")return null;return analyzeCandidateFields(fields.slice(1),family)}var CANDIDATE_SEVERITIES,FINDINGS_SEVERITIES,CANDIDATE_CONFIDENCES,CANDIDATE_FIELD_COUNT=11,CANDIDATE_LEGACY_FIELD_COUNT=9,CLEAN_FIELD_COUNT=4,CLEAN_COVERAGE_SCOPE_MIN_CHARS=12,CLEAN_EVIDENCE_MIN_CHARS=20,CANDIDATE_DIAGNOSTIC_PREVIEW_CHARS=160,CANDIDATE_FIELDS,CANDIDATE_REQUIRED_FIELDS,CANDIDATE_MARKER="[CANDIDATE]",CLEAN_MARKER="[CLEAN]",CANDIDATE_HEADERS,CLEAN_TEMPLATES,NON_CONTRACT_MARKER_LINE,CANDIDATE_ARTIFACT_CACHE_CAPACITY=512,candidateArtifactCache,candidateArtifactCacheHits=0,candidateArtifactCacheMisses=0;var init_candidate_contract=__esm(()=>{init_pr_review_contract();init_pr_review_contract();CANDIDATE_SEVERITIES=["INFO","LOW","MEDIUM","HIGH","CRITICAL"],FINDINGS_SEVERITIES=[...CANDIDATE_SEVERITIES,"NONE"],CANDIDATE_CONFIDENCES=["HIGH","MEDIUM","LOW"],CANDIDATE_FIELDS={base_explorer:["candidate_id","lane","severity","category","file_line","claim","evidence_summary","impact_context","confidence","risk_impact","risk_tags"],micro_lane:["candidate_id","micro_lane","severity","category","file_line","claim","invariant_violated","evidence_summary","confidence","risk_impact","risk_tags"]},CANDIDATE_REQUIRED_FIELDS={base_explorer:CANDIDATE_FIELDS.base_explorer.filter((field)=>field!=="risk_impact"&&field!=="risk_tags"),micro_lane:CANDIDATE_FIELDS.micro_lane.filter((field)=>field!=="risk_impact"&&field!=="risk_tags")};CANDIDATE_HEADERS={base_explorer:formatCandidateHeader("base_explorer"),micro_lane:formatCandidateHeader("micro_lane")},CLEAN_TEMPLATES={base_explorer:formatCleanTemplate("base_explorer"),micro_lane:formatCleanTemplate("micro_lane")};NON_CONTRACT_MARKER_LINE=/^\[(?!(?:CANDIDATE|CLEAN)\])[A-Z][A-Z0-9_-]*\]/;candidateArtifactCache=new Map});var require_polyfills=__commonJS((exports,module)=>{var constants=__require("constants"),origCwd=process.cwd,cwd=null,platform=process.env.GRACEFUL_FS_PLATFORM||process.platform;process.cwd=function(){if(!cwd)cwd=origCwd.call(process);return cwd};try{process.cwd()}catch(er){}if(typeof process.chdir==="function"){if(chdir=process.chdir,process.chdir=function(d){cwd=null,chdir.call(process,d)},Object.setPrototypeOf)Object.setPrototypeOf(process.chdir,chdir)}var chdir;module.exports=patch;function patch(fs4){if(constants.hasOwnProperty("O_SYMLINK")&&process.version.match(/^v0\.6\.[0-2]|^v0\.5\./))patchLchmod(fs4);if(!fs4.lutimes)patchLutimes(fs4);if(fs4.chown=chownFix(fs4.chown),fs4.fchown=chownFix(fs4.fchown),fs4.lchown=chownFix(fs4.lchown),fs4.chmod=chmodFix(fs4.chmod),fs4.fchmod=chmodFix(fs4.fchmod),fs4.lchmod=chmodFix(fs4.lchmod),fs4.chownSync=chownFixSync(fs4.chownSync),fs4.fchownSync=chownFixSync(fs4.fchownSync),fs4.lchownSync=chownFixSync(fs4.lchownSync),fs4.chmodSync=chmodFixSync(fs4.chmodSync),fs4.fchmodSync=chmodFixSync(fs4.fchmodSync),fs4.lchmodSync=chmodFixSync(fs4.lchmodSync),fs4.stat=statFix(fs4.stat),fs4.fstat=statFix(fs4.fstat),fs4.lstat=statFix(fs4.lstat),fs4.statSync=statFixSync(fs4.statSync),fs4.fstatSync=statFixSync(fs4.fstatSync),fs4.lstatSync=statFixSync(fs4.lstatSync),fs4.chmod&&!fs4.lchmod)fs4.lchmod=function(path6,mode,cb){if(cb)process.nextTick(cb)},fs4.lchmodSync=function(){};if(fs4.chown&&!fs4.lchown)fs4.lchown=function(path6,uid,gid,cb){if(cb)process.nextTick(cb)},fs4.lchownSync=function(){};if(platform==="win32")fs4.rename=typeof fs4.rename!=="function"?fs4.rename:function(fs$rename){function rename2(from,to,cb){var start=Date.now(),backoff=0;fs$rename(from,to,function CB(er){if(er&&(er.code==="EACCES"||er.code==="EPERM"||er.code==="EBUSY")&&Date.now()-start<60000){if(setTimeout(function(){fs4.stat(to,function(stater,st){if(stater&&stater.code==="ENOENT")fs$rename(from,to,CB);else cb(er)})},backoff),backoff<100)backoff+=10;return}if(cb)cb(er)})}if(Object.setPrototypeOf)Object.setPrototypeOf(rename2,fs$rename);return rename2}(fs4.rename);fs4.read=typeof fs4.read!=="function"?fs4.read:function(fs$read){function read(fd,buffer,offset,length,position,callback_){var callback;if(callback_&&typeof callback_==="function"){var eagCounter=0;callback=function(er,_,__){if(er&&er.code==="EAGAIN"&&eagCounter<10)return eagCounter++,fs$read.call(fs4,fd,buffer,offset,length,position,callback);callback_.apply(this,arguments)}}return fs$read.call(fs4,fd,buffer,offset,length,position,callback)}if(Object.setPrototypeOf)Object.setPrototypeOf(read,fs$read);return read}(fs4.read),fs4.readSync=typeof fs4.readSync!=="function"?fs4.readSync:function(fs$readSync){return function(fd,buffer,offset,length,position){var eagCounter=0;while(!0)try{return fs$readSync.call(fs4,fd,buffer,offset,length,position)}catch(er){if(er.code==="EAGAIN"&&eagCounter<10){eagCounter++;continue}throw er}}}(fs4.readSync);function patchLchmod(fs5){fs5.lchmod=function(path6,mode,callback){fs5.open(path6,constants.O_WRONLY|constants.O_SYMLINK,mode,function(err,fd){if(err){if(callback)callback(err);return}fs5.fchmod(fd,mode,function(err2){fs5.close(fd,function(err22){if(callback)callback(err2||err22)})})})},fs5.lchmodSync=function(path6,mode){var fd=fs5.openSync(path6,constants.O_WRONLY|constants.O_SYMLINK,mode),threw=!0,ret;try{ret=fs5.fchmodSync(fd,mode),threw=!1}finally{if(threw)try{fs5.closeSync(fd)}catch(er){}else fs5.closeSync(fd)}return ret}}function patchLutimes(fs5){if(constants.hasOwnProperty("O_SYMLINK")&&fs5.futimes)fs5.lutimes=function(path6,at,mt,cb){fs5.open(path6,constants.O_SYMLINK,function(er,fd){if(er){if(cb)cb(er);return}fs5.futimes(fd,at,mt,function(er2){fs5.close(fd,function(er22){if(cb)cb(er2||er22)})})})},fs5.lutimesSync=function(path6,at,mt){var fd=fs5.openSync(path6,constants.O_SYMLINK),ret,threw=!0;try{ret=fs5.futimesSync(fd,at,mt),threw=!1}finally{if(threw)try{fs5.closeSync(fd)}catch(er){}else fs5.closeSync(fd)}return ret};else if(fs5.futimes)fs5.lutimes=function(_a2,_b,_c,cb){if(cb)process.nextTick(cb)},fs5.lutimesSync=function(){}}function chmodFix(orig){if(!orig)return orig;return function(target,mode,cb){return orig.call(fs4,target,mode,function(er){if(chownErOk(er))er=null;if(cb)cb.apply(this,arguments)})}}function chmodFixSync(orig){if(!orig)return orig;return function(target,mode){try{return orig.call(fs4,target,mode)}catch(er){if(!chownErOk(er))throw er}}}function chownFix(orig){if(!orig)return orig;return function(target,uid,gid,cb){return orig.call(fs4,target,uid,gid,function(er){if(chownErOk(er))er=null;if(cb)cb.apply(this,arguments)})}}function chownFixSync(orig){if(!orig)return orig;return function(target,uid,gid){try{return orig.call(fs4,target,uid,gid)}catch(er){if(!chownErOk(er))throw er}}}function statFix(orig){if(!orig)return orig;return function(target,options,cb){if(typeof options==="function")cb=options,options=null;function callback(er,stats2){if(stats2){if(stats2.uid<0)stats2.uid+=4294967296;if(stats2.gid<0)stats2.gid+=4294967296}if(cb)cb.apply(this,arguments)}return options?orig.call(fs4,target,options,callback):orig.call(fs4,target,callback)}}function statFixSync(orig){if(!orig)return orig;return function(target,options){var stats2=options?orig.call(fs4,target,options):orig.call(fs4,target);if(stats2){if(stats2.uid<0)stats2.uid+=4294967296;if(stats2.gid<0)stats2.gid+=4294967296}return stats2}}function chownErOk(er){if(!er)return!0;if(er.code==="ENOSYS")return!0;var nonroot=!process.getuid||process.getuid()!==0;if(nonroot){if(er.code==="EINVAL"||er.code==="EPERM")return!0}return!1}}});var require_legacy_streams=__commonJS((exports,module)=>{var Stream=__require("stream").Stream;module.exports=legacy;function legacy(fs4){return{ReadStream,WriteStream};function ReadStream(path6,options){if(!(this instanceof ReadStream))return new ReadStream(path6,options);Stream.call(this);var self=this;this.path=path6,this.fd=null,this.readable=!0,this.paused=!1,this.flags="r",this.mode=438,this.bufferSize=65536,options=options||{};var keys=Object.keys(options);for(var index=0,length=keys.length;index<length;index++){var key=keys[index];this[key]=options[key]}if(this.encoding)this.setEncoding(this.encoding);if(this.start!==void 0){if(typeof this.start!=="number")throw TypeError("start must be a Number");if(this.end===void 0)this.end=1/0;else if(typeof this.end!=="number")throw TypeError("end must be a Number");if(this.start>this.end)throw Error("start must be <= end");this.pos=this.start}if(this.fd!==null){process.nextTick(function(){self._read()});return}fs4.open(this.path,this.flags,this.mode,function(err,fd){if(err){self.emit("error",err),self.readable=!1;return}self.fd=fd,self.emit("open",fd),self._read()})}function WriteStream(path6,options){if(!(this instanceof WriteStream))return new WriteStream(path6,options);Stream.call(this),this.path=path6,this.fd=null,this.writable=!0,this.flags="w",this.encoding="binary",this.mode=438,this.bytesWritten=0,options=options||{};var keys=Object.keys(options);for(var index=0,length=keys.length;index<length;index++){var key=keys[index];this[key]=options[key]}if(this.start!==void 0){if(typeof this.start!=="number")throw TypeError("start must be a Number");if(this.start<0)throw Error("start must be >= zero");this.pos=this.start}if(this.busy=!1,this._queue=[],this.fd===null)this._open=fs4.open,this._queue.push([this._open,this.path,this.flags,this.mode,void 0]),this.flush()}}});var require_clone=__commonJS((exports,module)=>{module.exports=clone2;var getPrototypeOf=Object.getPrototypeOf||function(obj){return obj.__proto__};function clone2(obj){if(obj===null||typeof obj!=="object")return obj;if(obj instanceof Object)var copy={__proto__:getPrototypeOf(obj)};else var copy=Object.create(null);return Object.getOwnPropertyNames(obj).forEach(function(key){Object.defineProperty(copy,key,Object.getOwnPropertyDescriptor(obj,key))}),copy}});var require_graceful_fs=__commonJS((exports,module)=>{var fs4=__require("fs"),polyfills=require_polyfills(),legacy=require_legacy_streams(),clone2=require_clone(),util=__require("util"),gracefulQueue,previousSymbol;if(typeof Symbol==="function"&&typeof Symbol.for==="function")gracefulQueue=Symbol.for("graceful-fs.queue"),previousSymbol=Symbol.for("graceful-fs.previous");else gracefulQueue="___graceful-fs.queue",previousSymbol="___graceful-fs.previous";function noop(){}function publishQueue(context,queue2){Object.defineProperty(context,gracefulQueue,{get:function(){return queue2}})}var debug=noop;if(util.debuglog)debug=util.debuglog("gfs4");else if(/\bgfs4\b/i.test(process.env.NODE_DEBUG||""))debug=function(){var m=util.format.apply(util,arguments);m="GFS4: "+m.split(/\n/).join(`
|
|
133
|
-
GFS4: `),console.error(m)};if(!fs4[gracefulQueue]){if(queue=global[gracefulQueue]||[],publishQueue(fs4,queue),fs4.close=function(fs$close){function close(fd,cb){return fs$close.call(fs4,fd,function(err){if(!err)resetQueue();if(typeof cb==="function")cb.apply(this,arguments)})}return Object.defineProperty(close,previousSymbol,{value:fs$close}),close}(fs4.close),fs4.closeSync=function(fs$closeSync){function closeSync(fd){fs$closeSync.apply(fs4,arguments),resetQueue()}return Object.defineProperty(closeSync,previousSymbol,{value:fs$closeSync}),closeSync}(fs4.closeSync),/\bgfs4\b/i.test(process.env.NODE_DEBUG||""))process.on("exit",function(){debug(fs4[gracefulQueue]),__require("assert").equal(fs4[gracefulQueue].length,0)})}var queue;if(!global[gracefulQueue])publishQueue(global,fs4[gracefulQueue]);module.exports=patch(clone2(fs4));if(process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH&&!fs4.__patched)module.exports=patch(fs4),fs4.__patched=!0;function patch(fs5){polyfills(fs5),fs5.gracefulify=patch,fs5.createReadStream=createReadStream,fs5.createWriteStream=createWriteStream;var fs$readFile=fs5.readFile;fs5.readFile=readFile3;function readFile3(path6,options,cb){if(typeof options==="function")cb=options,options=null;return go$readFile(path6,options,cb);function go$readFile(path7,options2,cb2,startTime){return fs$readFile(path7,options2,function(err){if(err&&(err.code==="EMFILE"||err.code==="ENFILE"))enqueue([go$readFile,[path7,options2,cb2],err,startTime||Date.now(),Date.now()]);else if(typeof cb2==="function")cb2.apply(this,arguments)})}}var fs$writeFile=fs5.writeFile;fs5.writeFile=writeFile2;function writeFile2(path6,data,options,cb){if(typeof options==="function")cb=options,options=null;return go$writeFile(path6,data,options,cb);function go$writeFile(path7,data2,options2,cb2,startTime){return fs$writeFile(path7,data2,options2,function(err){if(err&&(err.code==="EMFILE"||err.code==="ENFILE"))enqueue([go$writeFile,[path7,data2,options2,cb2],err,startTime||Date.now(),Date.now()]);else if(typeof cb2==="function")cb2.apply(this,arguments)})}}var fs$appendFile=fs5.appendFile;if(fs$appendFile)fs5.appendFile=appendFile;function appendFile(path6,data,options,cb){if(typeof options==="function")cb=options,options=null;return go$appendFile(path6,data,options,cb);function go$appendFile(path7,data2,options2,cb2,startTime){return fs$appendFile(path7,data2,options2,function(err){if(err&&(err.code==="EMFILE"||err.code==="ENFILE"))enqueue([go$appendFile,[path7,data2,options2,cb2],err,startTime||Date.now(),Date.now()]);else if(typeof cb2==="function")cb2.apply(this,arguments)})}}var fs$copyFile=fs5.copyFile;if(fs$copyFile)fs5.copyFile=copyFile2;function copyFile2(src,dest,flags,cb){if(typeof flags==="function")cb=flags,flags=0;return go$copyFile(src,dest,flags,cb);function go$copyFile(src2,dest2,flags2,cb2,startTime){return fs$copyFile(src2,dest2,flags2,function(err){if(err&&(err.code==="EMFILE"||err.code==="ENFILE"))enqueue([go$copyFile,[src2,dest2,flags2,cb2],err,startTime||Date.now(),Date.now()]);else if(typeof cb2==="function")cb2.apply(this,arguments)})}}var fs$readdir=fs5.readdir;fs5.readdir=readdir2;var noReaddirOptionVersions=/^v[0-5]\./;function readdir2(path6,options,cb){if(typeof options==="function")cb=options,options=null;var go$readdir=noReaddirOptionVersions.test(process.version)?function(path7,options2,cb2,startTime){return fs$readdir(path7,fs$readdirCallback(path7,options2,cb2,startTime))}:function(path7,options2,cb2,startTime){return fs$readdir(path7,options2,fs$readdirCallback(path7,options2,cb2,startTime))};return go$readdir(path6,options,cb);function fs$readdirCallback(path7,options2,cb2,startTime){return function(err,files){if(err&&(err.code==="EMFILE"||err.code==="ENFILE"))enqueue([go$readdir,[path7,options2,cb2],err,startTime||Date.now(),Date.now()]);else{if(files&&files.sort)files.sort();if(typeof cb2==="function")cb2.call(this,err,files)}}}}if(process.version.substr(0,4)==="v0.8"){var legStreams=legacy(fs5);ReadStream=legStreams.ReadStream,WriteStream=legStreams.WriteStream}var fs$ReadStream=fs5.ReadStream;if(fs$ReadStream)ReadStream.prototype=Object.create(fs$ReadStream.prototype),ReadStream.prototype.open=ReadStream$open;var fs$WriteStream=fs5.WriteStream;if(fs$WriteStream)WriteStream.prototype=Object.create(fs$WriteStream.prototype),WriteStream.prototype.open=WriteStream$open;Object.defineProperty(fs5,"ReadStream",{get:function(){return ReadStream},set:function(val){ReadStream=val},enumerable:!0,configurable:!0}),Object.defineProperty(fs5,"WriteStream",{get:function(){return WriteStream},set:function(val){WriteStream=val},enumerable:!0,configurable:!0});var FileReadStream=ReadStream;Object.defineProperty(fs5,"FileReadStream",{get:function(){return FileReadStream},set:function(val){FileReadStream=val},enumerable:!0,configurable:!0});var FileWriteStream=WriteStream;Object.defineProperty(fs5,"FileWriteStream",{get:function(){return FileWriteStream},set:function(val){FileWriteStream=val},enumerable:!0,configurable:!0});function ReadStream(path6,options){if(this instanceof ReadStream)return fs$ReadStream.apply(this,arguments),this;else return ReadStream.apply(Object.create(ReadStream.prototype),arguments)}function ReadStream$open(){var that=this;open(that.path,that.flags,that.mode,function(err,fd){if(err){if(that.autoClose)that.destroy();that.emit("error",err)}else that.fd=fd,that.emit("open",fd),that.read()})}function WriteStream(path6,options){if(this instanceof WriteStream)return fs$WriteStream.apply(this,arguments),this;else return WriteStream.apply(Object.create(WriteStream.prototype),arguments)}function WriteStream$open(){var that=this;open(that.path,that.flags,that.mode,function(err,fd){if(err)that.destroy(),that.emit("error",err);else that.fd=fd,that.emit("open",fd)})}function createReadStream(path6,options){return new fs5.ReadStream(path6,options)}function createWriteStream(path6,options){return new fs5.WriteStream(path6,options)}var fs$open=fs5.open;fs5.open=open;function open(path6,flags,mode,cb){if(typeof mode==="function")cb=mode,mode=null;return go$open(path6,flags,mode,cb);function go$open(path7,flags2,mode2,cb2,startTime){return fs$open(path7,flags2,mode2,function(err,fd){if(err&&(err.code==="EMFILE"||err.code==="ENFILE"))enqueue([go$open,[path7,flags2,mode2,cb2],err,startTime||Date.now(),Date.now()]);else if(typeof cb2==="function")cb2.apply(this,arguments)})}}return fs5}function enqueue(elem){debug("ENQUEUE",elem[0].name,elem[1]),fs4[gracefulQueue].push(elem),retry()}var retryTimer;function resetQueue(){var now=Date.now();for(var i=0;i<fs4[gracefulQueue].length;++i)if(fs4[gracefulQueue][i].length>2)fs4[gracefulQueue][i][3]=now,fs4[gracefulQueue][i][4]=now;retry()}function retry(){if(clearTimeout(retryTimer),retryTimer=void 0,fs4[gracefulQueue].length===0)return;var elem=fs4[gracefulQueue].shift(),fn2=elem[0],args2=elem[1],err=elem[2],startTime=elem[3],lastTime=elem[4];if(startTime===void 0)debug("RETRY",fn2.name,args2),fn2.apply(null,args2);else if(Date.now()-startTime>=60000){debug("TIMEOUT",fn2.name,args2);var cb=args2.pop();if(typeof cb==="function")cb.call(null,err)}else{var sinceAttempt=Date.now()-lastTime,sinceStart=Math.max(lastTime-startTime,1),desiredDelay=Math.min(sinceStart*1.2,100);if(sinceAttempt>=desiredDelay)debug("RETRY",fn2.name,args2),fn2.apply(null,args2.concat([startTime]));else fs4[gracefulQueue].push(elem)}if(retryTimer===void 0)retryTimer=setTimeout(retry,0)}});var require_retry_operation=__commonJS((exports,module)=>{function RetryOperation(timeouts,options){if(typeof options==="boolean")options={forever:options};if(this._originalTimeouts=JSON.parse(JSON.stringify(timeouts)),this._timeouts=timeouts,this._options=options||{},this._maxRetryTime=options&&options.maxRetryTime||1/0,this._fn=null,this._errors=[],this._attempts=1,this._operationTimeout=null,this._operationTimeoutCb=null,this._timeout=null,this._operationStart=null,this._options.forever)this._cachedTimeouts=this._timeouts.slice(0)}module.exports=RetryOperation;RetryOperation.prototype.reset=function(){this._attempts=1,this._timeouts=this._originalTimeouts};RetryOperation.prototype.stop=function(){if(this._timeout)clearTimeout(this._timeout);this._timeouts=[],this._cachedTimeouts=null};RetryOperation.prototype.retry=function(err){if(this._timeout)clearTimeout(this._timeout);if(!err)return!1;var currentTime=new Date().getTime();if(err&¤tTime-this._operationStart>=this._maxRetryTime)return this._errors.unshift(Error("RetryOperation timeout occurred")),!1;this._errors.push(err);var timeout=this._timeouts.shift();if(timeout===void 0)if(this._cachedTimeouts)this._errors.splice(this._errors.length-1,this._errors.length),this._timeouts=this._cachedTimeouts.slice(0),timeout=this._timeouts.shift();else return!1;var self=this,timer=setTimeout(function(){if(self._attempts++,self._operationTimeoutCb){if(self._timeout=setTimeout(function(){self._operationTimeoutCb(self._attempts)},self._operationTimeout),self._options.unref)self._timeout.unref()}self._fn(self._attempts)},timeout);if(this._options.unref)timer.unref();return!0};RetryOperation.prototype.attempt=function(fn2,timeoutOps){if(this._fn=fn2,timeoutOps){if(timeoutOps.timeout)this._operationTimeout=timeoutOps.timeout;if(timeoutOps.cb)this._operationTimeoutCb=timeoutOps.cb}var self=this;if(this._operationTimeoutCb)this._timeout=setTimeout(function(){self._operationTimeoutCb()},self._operationTimeout);this._operationStart=new Date().getTime(),this._fn(this._attempts)};RetryOperation.prototype.try=function(fn2){console.log("Using RetryOperation.try() is deprecated"),this.attempt(fn2)};RetryOperation.prototype.start=function(fn2){console.log("Using RetryOperation.start() is deprecated"),this.attempt(fn2)};RetryOperation.prototype.start=RetryOperation.prototype.try;RetryOperation.prototype.errors=function(){return this._errors};RetryOperation.prototype.attempts=function(){return this._attempts};RetryOperation.prototype.mainError=function(){if(this._errors.length===0)return null;var counts={},mainError=null,mainErrorCount=0;for(var i=0;i<this._errors.length;i++){var error49=this._errors[i],message=error49.message,count=(counts[message]||0)+1;if(counts[message]=count,count>=mainErrorCount)mainError=error49,mainErrorCount=count}return mainError}});var require_retry=__commonJS((exports)=>{var RetryOperation=require_retry_operation();exports.operation=function(options){var timeouts=exports.timeouts(options);return new RetryOperation(timeouts,{forever:options&&options.forever,unref:options&&options.unref,maxRetryTime:options&&options.maxRetryTime})};exports.timeouts=function(options){if(options instanceof Array)return[].concat(options);var opts={retries:10,factor:2,minTimeout:1000,maxTimeout:1/0,randomize:!1};for(var key in options)opts[key]=options[key];if(opts.minTimeout>opts.maxTimeout)throw Error("minTimeout is greater than maxTimeout");var timeouts=[];for(var i=0;i<opts.retries;i++)timeouts.push(this.createTimeout(i,opts));if(options&&options.forever&&!timeouts.length)timeouts.push(this.createTimeout(i,opts));return timeouts.sort(function(a,b){return a-b}),timeouts};exports.createTimeout=function(attempt,opts){var random=opts.randomize?Math.random()+1:1,timeout=Math.round(random*opts.minTimeout*Math.pow(opts.factor,attempt));return timeout=Math.min(timeout,opts.maxTimeout),timeout};exports.wrap=function(obj,options,methods){if(options instanceof Array)methods=options,options=null;if(!methods){methods=[];for(var key in obj)if(typeof obj[key]==="function")methods.push(key)}for(var i=0;i<methods.length;i++){var method=methods[i],original=obj[method];obj[method]=function(original2){var op=exports.operation(options),args2=Array.prototype.slice.call(arguments,1),callback=args2.pop();args2.push(function(err){if(op.retry(err))return;if(err)arguments[0]=op.mainError();callback.apply(this,arguments)}),op.attempt(function(){original2.apply(obj,args2)})}.bind(obj,original),obj[method].options=options}}});var require_signals=__commonJS((exports,module)=>{module.exports=["SIGABRT","SIGALRM","SIGHUP","SIGINT","SIGTERM"];if(process.platform!=="win32")module.exports.push("SIGVTALRM","SIGXCPU","SIGXFSZ","SIGUSR2","SIGTRAP","SIGSYS","SIGQUIT","SIGIOT");if(process.platform==="linux")module.exports.push("SIGIO","SIGPOLL","SIGPWR","SIGSTKFLT","SIGUNUSED")});var require_signal_exit=__commonJS((exports,module)=>{var process3=global.process,processOk=function(process4){return process4&&typeof process4==="object"&&typeof process4.removeListener==="function"&&typeof process4.emit==="function"&&typeof process4.reallyExit==="function"&&typeof process4.listeners==="function"&&typeof process4.kill==="function"&&typeof process4.pid==="number"&&typeof process4.on==="function"};if(!processOk(process3))module.exports=function(){return function(){}};else{if(assert2=__require("assert"),signals=require_signals(),isWin=/^win/i.test(process3.platform),EE=__require("events"),typeof EE!=="function")EE=EE.EventEmitter;if(process3.__signal_exit_emitter__)emitter=process3.__signal_exit_emitter__;else emitter=process3.__signal_exit_emitter__=new EE,emitter.count=0,emitter.emitted={};if(!emitter.infinite)emitter.setMaxListeners(1/0),emitter.infinite=!0;module.exports=function(cb,opts){if(!processOk(global.process))return function(){};if(assert2.equal(typeof cb,"function","a callback must be provided for exit handler"),loaded===!1)load();var ev="exit";if(opts&&opts.alwaysLast)ev="afterexit";var remove=function(){if(emitter.removeListener(ev,cb),emitter.listeners("exit").length===0&&emitter.listeners("afterexit").length===0)unload()};return emitter.on(ev,cb),remove},unload=function(){if(!loaded||!processOk(global.process))return;loaded=!1,signals.forEach(function(sig){try{process3.removeListener(sig,sigListeners[sig])}catch(er){}}),process3.emit=originalProcessEmit,process3.reallyExit=originalProcessReallyExit,emitter.count-=1},module.exports.unload=unload,emit=function(event,code,signal){if(emitter.emitted[event])return;emitter.emitted[event]=!0,emitter.emit(event,code,signal)},sigListeners={},signals.forEach(function(sig){sigListeners[sig]=function(){if(!processOk(global.process))return;var listeners=process3.listeners(sig);if(listeners.length===emitter.count){if(unload(),emit("exit",null,sig),emit("afterexit",null,sig),isWin&&sig==="SIGHUP")sig="SIGINT";process3.kill(process3.pid,sig)}}}),module.exports.signals=function(){return signals},loaded=!1,load=function(){if(loaded||!processOk(global.process))return;loaded=!0,emitter.count+=1,signals=signals.filter(function(sig){try{return process3.on(sig,sigListeners[sig]),!0}catch(er){return!1}}),process3.emit=processEmit,process3.reallyExit=processReallyExit},module.exports.load=load,originalProcessReallyExit=process3.reallyExit,processReallyExit=function(code){if(!processOk(global.process))return;process3.exitCode=code||0,emit("exit",process3.exitCode,null),emit("afterexit",process3.exitCode,null),originalProcessReallyExit.call(process3,process3.exitCode)},originalProcessEmit=process3.emit,processEmit=function(ev,arg){if(ev==="exit"&&processOk(global.process)){if(arg!==void 0)process3.exitCode=arg;var ret=originalProcessEmit.apply(this,arguments);return emit("exit",process3.exitCode,null),emit("afterexit",process3.exitCode,null),ret}else return originalProcessEmit.apply(this,arguments)}}var assert2,signals,isWin,EE,emitter,unload,emit,sigListeners,loaded,load,originalProcessReallyExit,processReallyExit,originalProcessEmit,processEmit});var require_mtime_precision=__commonJS((exports,module)=>{var cacheSymbol=Symbol();function probe(file2,fs4,callback){let cachedPrecision=fs4[cacheSymbol];if(cachedPrecision)return fs4.stat(file2,(err,stat4)=>{if(err)return callback(err);callback(null,stat4.mtime,cachedPrecision)});let mtime=new Date(Math.ceil(Date.now()/1000)*1000+5);fs4.utimes(file2,mtime,mtime,(err)=>{if(err)return callback(err);fs4.stat(file2,(err2,stat4)=>{if(err2)return callback(err2);let precision=stat4.mtime.getTime()%1000===0?"s":"ms";Object.defineProperty(fs4,cacheSymbol,{value:precision}),callback(null,stat4.mtime,precision)})})}function getMtime(precision){let now=Date.now();if(precision==="s")now=Math.ceil(now/1000)*1000;return new Date(now)}exports.probe=probe;exports.getMtime=getMtime});var require_lockfile=__commonJS((exports,module)=>{var path6=__require("path"),fs4=require_graceful_fs(),retry=require_retry(),onExit=require_signal_exit(),mtimePrecision=require_mtime_precision(),locks={};function getLockFile(file2,options){return options.lockfilePath||`${file2}.lock`}function resolveCanonicalPath(file2,options,callback){if(!options.realpath)return callback(null,path6.resolve(file2));options.fs.realpath(file2,callback)}function acquireLock(file2,options,callback){let lockfilePath=getLockFile(file2,options);options.fs.mkdir(lockfilePath,(err)=>{if(!err)return mtimePrecision.probe(lockfilePath,options.fs,(err2,mtime,mtimePrecision2)=>{if(err2)return options.fs.rmdir(lockfilePath,()=>{}),callback(err2);callback(null,mtime,mtimePrecision2)});if(err.code!=="EEXIST")return callback(err);if(options.stale<=0)return callback(Object.assign(Error("Lock file is already being held"),{code:"ELOCKED",file:file2}));options.fs.stat(lockfilePath,(err2,stat4)=>{if(err2){if(err2.code==="ENOENT")return acquireLock(file2,{...options,stale:0},callback);return callback(err2)}if(!isLockStale(stat4,options))return callback(Object.assign(Error("Lock file is already being held"),{code:"ELOCKED",file:file2}));removeLock(file2,options,(err3)=>{if(err3)return callback(err3);acquireLock(file2,{...options,stale:0},callback)})})})}function isLockStale(stat4,options){return stat4.mtime.getTime()<Date.now()-options.stale}function removeLock(file2,options,callback){options.fs.rmdir(getLockFile(file2,options),(err)=>{if(err&&err.code!=="ENOENT")return callback(err);callback()})}function updateLock(file2,options){let lock2=locks[file2];if(lock2.updateTimeout)return;if(lock2.updateDelay=lock2.updateDelay||options.update,lock2.updateTimeout=setTimeout(()=>{lock2.updateTimeout=null,options.fs.stat(lock2.lockfilePath,(err,stat4)=>{let isOverThreshold=lock2.lastUpdate+options.stale<Date.now();if(err){if(err.code==="ENOENT"||isOverThreshold)return setLockAsCompromised(file2,lock2,Object.assign(err,{code:"ECOMPROMISED"}));return lock2.updateDelay=1000,updateLock(file2,options)}if(lock2.mtime.getTime()!==stat4.mtime.getTime())return setLockAsCompromised(file2,lock2,Object.assign(Error("Unable to update lock within the stale threshold"),{code:"ECOMPROMISED"}));let mtime=mtimePrecision.getMtime(lock2.mtimePrecision);options.fs.utimes(lock2.lockfilePath,mtime,mtime,(err2)=>{let isOverThreshold2=lock2.lastUpdate+options.stale<Date.now();if(lock2.released)return;if(err2){if(err2.code==="ENOENT"||isOverThreshold2)return setLockAsCompromised(file2,lock2,Object.assign(err2,{code:"ECOMPROMISED"}));return lock2.updateDelay=1000,updateLock(file2,options)}lock2.mtime=mtime,lock2.lastUpdate=Date.now(),lock2.updateDelay=null,updateLock(file2,options)})})},lock2.updateDelay),lock2.updateTimeout.unref)lock2.updateTimeout.unref()}function setLockAsCompromised(file2,lock2,err){if(lock2.released=!0,lock2.updateTimeout)clearTimeout(lock2.updateTimeout);if(locks[file2]===lock2)delete locks[file2];lock2.options.onCompromised(err)}function lock(file2,options,callback){options={stale:1e4,update:null,realpath:!0,retries:0,fs:fs4,onCompromised:(err)=>{throw err},...options},options.retries=options.retries||0,options.retries=typeof options.retries==="number"?{retries:options.retries}:options.retries,options.stale=Math.max(options.stale||0,2000),options.update=options.update==null?options.stale/2:options.update||0,options.update=Math.max(Math.min(options.update,options.stale/2),1000),resolveCanonicalPath(file2,options,(err,file3)=>{if(err)return callback(err);let operation=retry.operation(options.retries);operation.attempt(()=>{acquireLock(file3,options,(err2,mtime,mtimePrecision2)=>{if(operation.retry(err2))return;if(err2)return callback(operation.mainError());let lock2=locks[file3]={lockfilePath:getLockFile(file3,options),mtime,mtimePrecision:mtimePrecision2,options,lastUpdate:Date.now()};updateLock(file3,options),callback(null,(releasedCallback)=>{if(lock2.released)return releasedCallback&&releasedCallback(Object.assign(Error("Lock is already released"),{code:"ERELEASED"}));unlock(file3,{...options,realpath:!1},releasedCallback)})})})})}function unlock(file2,options,callback){options={fs:fs4,realpath:!0,...options},resolveCanonicalPath(file2,options,(err,file3)=>{if(err)return callback(err);let lock2=locks[file3];if(!lock2)return callback(Object.assign(Error("Lock is not acquired/owned by you"),{code:"ENOTACQUIRED"}));lock2.updateTimeout&&clearTimeout(lock2.updateTimeout),lock2.released=!0,delete locks[file3],removeLock(file3,options,callback)})}function check2(file2,options,callback){options={stale:1e4,realpath:!0,fs:fs4,...options},options.stale=Math.max(options.stale||0,2000),resolveCanonicalPath(file2,options,(err,file3)=>{if(err)return callback(err);options.fs.stat(getLockFile(file3,options),(err2,stat4)=>{if(err2)return err2.code==="ENOENT"?callback(null,!1):callback(err2);return callback(null,!isLockStale(stat4,options))})})}function getLocks(){return locks}onExit(()=>{for(let file2 in locks){let options=locks[file2].options;try{options.fs.rmdirSync(getLockFile(file2,options))}catch(e){}}});exports.lock=lock;exports.unlock=unlock;exports.check=check2;exports.getLocks=getLocks});var require_adapter=__commonJS((exports,module)=>{var fs4=require_graceful_fs();function createSyncFs(fs5){let methods=["mkdir","realpath","stat","rmdir","utimes"],newFs={...fs5};return methods.forEach((method)=>{newFs[method]=(...args2)=>{let callback=args2.pop(),ret;try{ret=fs5[`${method}Sync`](...args2)}catch(err){return callback(err)}callback(null,ret)}}),newFs}function toPromise(method){return(...args2)=>new Promise((resolve4,reject)=>{args2.push((err,result)=>{if(err)reject(err);else resolve4(result)}),method(...args2)})}function toSync(method){return(...args2)=>{let err,result;if(args2.push((_err,_result)=>{err=_err,result=_result}),method(...args2),err)throw err;return result}}function toSyncOptions(options){if(options={...options},options.fs=createSyncFs(options.fs||fs4),typeof options.retries==="number"&&options.retries>0||options.retries&&typeof options.retries.retries==="number"&&options.retries.retries>0)throw Object.assign(Error("Cannot use retries with the sync api"),{code:"ESYNC"});return options}module.exports={toPromise,toSync,toSyncOptions}});var require_proper_lockfile=__commonJS((exports,module)=>{var lockfile=require_lockfile(),{toPromise,toSync,toSyncOptions}=require_adapter();async function lock(file2,options){let release=await toPromise(lockfile.lock)(file2,options);return toPromise(release)}function lockSync(file2,options){let release=toSync(lockfile.lock)(file2,toSyncOptions(options));return toSync(release)}function unlock(file2,options){return toPromise(lockfile.unlock)(file2,options)}function unlockSync(file2,options){return toSync(lockfile.unlock)(file2,toSyncOptions(options))}function check2(file2,options){return toPromise(lockfile.check)(file2,options)}function checkSync(file2,options){return toSync(lockfile.check)(file2,toSyncOptions(options))}module.exports=lock;module.exports.lock=lock;module.exports.unlock=unlock;module.exports.lockSync=lockSync;module.exports.unlockSync=unlockSync;module.exports.check=check2;module.exports.checkSync=checkSync});var SwarmError;var init_errors3=__esm(()=>{SwarmError=class SwarmError extends Error{code;guidance;constructor(message,code,guidance){super(message);this.name="SwarmError",this.code=code,this.guidance=guidance}}});function escapeRegex2(s){return s.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function simpleGlobToRegex(pattern,flags="i"){let escaped=pattern.split("*").map((starSegment)=>starSegment.split("?").map(escapeRegex2).join(".")).join(".*");return new RegExp(`^${escaped}$`,flags)}var init_utils=__esm(()=>{init_errors3();init_logger();init_merge()});import{randomBytes}from"node:crypto";import*as fs4 from"node:fs";import*as path6 from"node:path";function matchTempGrammar(basename2){return SWARM_TEMP_GRAMMARS.find((g)=>g.match.test(basename2))}function parseTargetBasename(basename2){for(let g of SWARM_TEMP_GRAMMARS){if(!g.parsesTarget)continue;let m=g.match.exec(basename2);if(m?.[1])return m[1]}return null}function assertWellFormedTargetPath(targetPath){if(!path6.isAbsolute(targetPath))throw Error(`atomic-write target must be absolute: ${targetPath}`);if(/[\0-\x1f\x7f]/.test(targetPath))throw Error("atomic-write target contains control characters");if(/[*?]/.test(targetPath)||/(^|[/\\])\{[^}]*\}([/\\]|$)/.test(targetPath))throw Error(`atomic-write target contains glob metacharacters: ${targetPath}`);if(/(^|[/\\])~([/\\]|$)/.test(targetPath))throw Error("atomic-write target contains unresolved home-dir marker (~)");if(/\$\{?[A-Za-z_][A-Za-z0-9_]*\}?/.test(targetPath)||/%[^/\\%]+%/.test(targetPath))throw Error("atomic-write target contains unresolved environment-variable form")}function lstatNotSymlink(p,what){if(fs4.lstatSync(p).isSymbolicLink())throw Error(`${what} is a symlink/reparse point: ${p}`)}function assertSwarmContainedTarget(targetPath){assertWellFormedTargetPath(targetPath);let resolved=path6.normalize(path6.resolve(targetPath)),segments=resolved.split(path6.sep),swarmIdx=-1;for(let i=segments.length-2;i>=1;i--)if(segments[i]===".swarm"){swarmIdx=i;break}if(swarmIdx===-1)throw Error(`atomic-write target is not under a project .swarm root: ${targetPath}`);let swarmRoot=segments.slice(0,swarmIdx+1).join(path6.sep);try{let st=fs4.lstatSync(swarmRoot);if(!st.isDirectory()||st.isSymbolicLink())throw Error(`.swarm root is not a real directory (symlink/reparse or non-dir): ${swarmRoot}`)}catch(err){if(err?.code!=="ENOENT")throw err}let rel=path6.relative(swarmRoot,resolved);if(!rel||rel.startsWith("..")||path6.isAbsolute(rel))throw Error(`atomic-write target escapes .swarm root: ${targetPath}`);let probe=swarmRoot;for(let seg of rel.split(path6.sep)){if(probe=path6.join(probe,seg),!fs4.existsSync(probe))break;lstatNotSymlink(probe,"path segment under .swarm")}return{projectRoot:path6.dirname(swarmRoot),swarmRoot}}function noteRecentWriteActivity(resolvedTarget){recentWriteActivity.delete(resolvedTarget),recentWriteActivity.set(resolvedTarget,Date.now());while(recentWriteActivity.size>MAX_RECENT_WRITE_TRACKED_PATHS){let oldest=recentWriteActivity.keys().next().value;if(oldest===void 0)break;recentWriteActivity.delete(oldest)}}function clearRecentWriteActivity(targetPath){return recentWriteActivity.delete(path6.resolve(targetPath))}function wasRecentlyWrittenByThisProcess(targetPath,withinMs=RECENT_WRITE_WINDOW_MS){let last=recentWriteActivity.get(path6.resolve(targetPath));if(last===void 0)return!1;return Date.now()-last<=withinMs}function toBuffer(content){if(typeof content==="string")return Buffer.from(content,"utf-8");return content}function syncSleep(ms){try{Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,ms)}catch{let start=Date.now();while(Date.now()-start<ms);}}function renameWithRetry(tempPath,targetPath){let lastError;for(let attempt=0;attempt<=RENAME_RETRY_DELAYS_MS.length;attempt++)try{_internals8.renameSync(tempPath,targetPath);return}catch(err){lastError=err;let code=err?.code;if(!code||!RETRYABLE_RENAME_CODES.has(code))throw err;if(attempt<RENAME_RETRY_DELAYS_MS.length)syncSleep(RENAME_RETRY_DELAYS_MS[attempt])}throw lastError}function writeAtomicSync(targetPath,content,options){if(options?.contained!==!1)assertSwarmContainedTarget(targetPath);else assertWellFormedTargetPath(targetPath);let resolvedTarget=path6.resolve(targetPath);noteRecentWriteActivity(resolvedTarget);let buffer=toBuffer(content),maxBytes=options?.maxBytes??MAX_ATOMIC_WRITE_BYTES;if(buffer.byteLength>maxBytes)throw Error(`atomic write exceeds ${maxBytes} byte bound: ${buffer.byteLength}`);let tempPath=`${resolvedTarget}.${_internals8.randomSuffix()}.tmp`;fs4.mkdirSync(path6.dirname(tempPath),{recursive:!0});try{try{let fd=fs4.openSync(tempPath,"wx",options?.mode);try{let written=0;while(written<buffer.byteLength)written+=_internals8.writeSync(fd,buffer,written,buffer.byteLength-written);if(options?.skipFsync!==!0)try{_internals8.fsyncSync(fd)}catch{}}finally{fs4.closeSync(fd)}renameWithRetry(tempPath,resolvedTarget)}finally{try{_internals8.unlinkSync(tempPath)}catch{}}}catch(error49){throw clearRecentWriteActivity(resolvedTarget),error49}try{let dirFd=fs4.openSync(path6.dirname(resolvedTarget),"r");try{fs4.fsyncSync(dirFd)}finally{fs4.closeSync(dirFd)}}catch{}invalidateCachedArtifact(resolvedTarget),noteRecentWriteActivity(resolvedTarget)}async function atomicWriteSwarmFile(targetPath,content,options){await new Promise((resolve5)=>setImmediate(resolve5)),writeAtomicSync(targetPath,content,options)}function atomicWriteSwarmFileSync(targetPath,content,options){writeAtomicSync(targetPath,content,options)}async function atomicWriteFileAnyRoot(targetPath,content,options){await new Promise((resolve5)=>setImmediate(resolve5)),writeAtomicSync(targetPath,content,{...options,contained:!1})}var UUID_RE="[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}",SWARM_TEMP_GRAMMARS,WRITER_CLASSIFICATION,MAX_ATOMIC_WRITE_BYTES=268435456,RENAME_RETRY_DELAYS_MS,RETRYABLE_RENAME_CODES,MAX_RECENT_WRITE_TRACKED_PATHS=256,RECENT_WRITE_WINDOW_MS=500,recentWriteActivity,_internals8;var init_atomic_write=__esm(()=>{init_swarm_artifact_cache();SWARM_TEMP_GRAMMARS=[{id:"canonical-v1",era:"canonical",match:/^(.+)\.[0-9a-f]{32}\.tmp$/,token:"instance",quarantineEligible:!0,parsesTarget:!0,producers:["src/utils/atomic-write.ts:atomicWriteSwarmFile","src/utils/atomic-write.ts:atomicWriteFileAnyRoot"]},{id:"target-suffix-tmp-uuid",era:"current",match:new RegExp(`^(.+)\\.tmp\\.${UUID_RE}$`),token:"instance",quarantineEligible:!0,parsesTarget:!0,producers:["src/commands/handoff.ts (pre-#2035; site=handoff.md; migrated-to=src/commands/handoff.ts:handleHandoffCommand)","src/commands/handoff.ts (pre-#2035; site=handoff-prompt.md; migrated-to=src/commands/handoff.ts:handleHandoffCommand)","src/memory/local-jsonl-provider.ts:1288","src/config/bundled-skills.ts:259"]},{id:"target-suffix-tmp-pid-uuid",era:"current",match:new RegExp(`^(.+)\\.tmp\\.\\d+\\.${UUID_RE}$`),token:"instance",quarantineEligible:!0,parsesTarget:!0,producers:["src/hooks/pr-workflow-gate.ts (pre-#2385; migrated-to=src/pr-review/persistence.ts:writeAtomicJson)"],note:"pre/post-rename file-identity verification (assertOpened/ClosedSwarmFileIdentity, pr-workflow-gate.ts:17880-17980) is writer-specific and load-bearing"},{id:"target-suffix-tmp-num-num-json",era:"current",match:/^(.+)\.tmp\.\d+\.\d+\.json$/,token:"instance",quarantineEligible:!0,parsesTarget:!0,producers:["src/hooks/issue-trace-state.ts:466"],note:"the .json terminator keeps this shape distinct from the bare two-token family — declared before it so first-match wins"},{id:"target-suffix-tmp-num-alnum",era:"current",match:/^(.+)\.tmp\.\d+\.[0-9a-z]+$/,token:"instance",quarantineEligible:!0,parsesTarget:!0,producers:["src/evidence/task-file.ts (pre-#2035; migrated-to=src/evidence/task-file.ts:atomicWriteFile)","src/scope/scope-persistence.ts (pre-#2035; migrated-to=src/scope/scope-persistence.ts:atomicWrite)","src/scope/scope-persistence.ts (pre-#2035; migrated-to=src/scope/scope-persistence.ts:atomicWriteSync)","src/plan/manager.ts:688","src/plan/manager.ts:2115","src/plan/manager.ts:2175","src/review/evidence.ts:179","src/turbo/lean/evidence.ts:182","src/summaries/manager.ts:163","src/evidence/manager.ts:288","src/evidence/manager.ts:456","src/tools/sast-baseline.ts:199","src/tools/repo-graph/storage.ts:543","src/memory/reflection-service.ts (pre-#2035; migrated-to=src/memory/reflection-service.ts:atomicWrite)","src/hooks/review-receipt.ts:609","src/hooks/review-receipt.ts:675","src/hooks/review-receipt.ts:894","src/knowledge/identity.ts:234","src/evidence/phase-participation.ts (pre-#2035; migrated-to=src/evidence/phase-participation.ts:atomicWriteBytes)","src/turbo/lean/integration.ts:428","src/turbo/lean/reviewer.ts:403","src/plan/ledger.ts:1471","src/services/synonym-map.ts:389","src/services/skill-optimizer/store.ts:340","src/services/skill-optimizer/store.ts:503","src/commands/archive-sqlite.ts:318","src/memory/jsonl-migration.ts:161"],note:"fsync-discipline / lock-scoped fd writers whose temp naming is pinned by their own durability test suites (plan-durability invariant 5, #2034 crash matrix); grammars registered here so their residue stays discoverable"},{id:"target-suffix-tmp-token",era:"current",match:/^(.+)\.tmp\.[0-9a-z-]{6,}$/,token:"instance",quarantineEligible:!0,parsesTarget:!0,producers:["src/turbo/lean/state.ts:129","src/turbo/lean/recovery.ts:175","src/hooks/delegation-gate/worktree-merge-status.ts:110","src/plan/ledger.ts:606"]},{id:"target-suffix-tmp-dash",era:"current",match:/^(.+)\.tmp-\d+-[0-9a-z-]+$/,token:"instance",quarantineEligible:!0,parsesTarget:!0,producers:["src/services/skill-evaluator.ts (pre-#2035; migrated-to=src/services/skill-evaluator.ts:atomicWrite)","src/services/skill-improver.ts (pre-#2035; migrated-to=src/services/skill-improver.ts:atomicWrite)","src/services/skill-consolidation.ts (pre-#2035; migrated-to=src/services/skill-consolidation.ts:atomicWrite)","src/services/skill-generator.ts (pre-#2035; migrated-to=src/services/skill-generator.ts:atomicWrite)","src/tools/spec-write.ts:98","src/sdd/effective-spec.ts:1377","src/background/lane-output-store.ts:353","src/background/pending-delegations.ts:1520","src/background/delegation-health.ts:391","src/tools/submit-phase-council-verdicts.ts:458","src/summaries/store.ts (pre-#2035; migrated-to=src/summaries/store.ts:writeRawSidecar)","src/retention/jsonl-cap.ts:213","src/services/skill-changelog.ts:58"],note:"background lane/delegation stores keep bounded-retry rename semantics wired into their callers (#2034/#2276 delivery contracts); migration candidates for a follow-up but grammars registered"},{id:"target-suffix-tmp-dash-num",era:"current",match:/^(.+)\.tmp-\d+$/,token:"instance",quarantineEligible:!0,parsesTarget:!0,producers:["src/services/skill-improver-quota.ts:114"]},{id:"target-dot-pid-uuid-tmp",era:"current",match:new RegExp(`^(.+)\\.\\d+\\.${UUID_RE}\\.tmp$`),token:"instance",quarantineEligible:!0,parsesTarget:!0,producers:["src/hooks/knowledge-receipt-ledger-storage.ts:591"],note:"pre/post-rename file-identity verification (existingFileIdentity checks, knowledge-receipt-ledger-storage.ts:544-591) is writer-specific and load-bearing"},{id:"dot-numeric-instance-tmp",era:"current",match:/^\..+(?:\.\d+){2,4}\.[0-9a-z]+\.tmp$/,token:"instance",quarantineEligible:!0,parsesTarget:!1,producers:["src/utils/bun-compat.ts:138","src/tools/repo-graph/freshness.ts:171"],note:"bunWrite Node-fallback internal temp and the repo-graph fingerprint temp (2-4 numeric token groups); leading-dot temps are standalone, target not parsed"},{id:"dot-uuid-instance-tmp",era:"current",match:new RegExp(`^\\..+\\.${UUID_RE}\\.tmp$`),token:"instance",quarantineEligible:!0,parsesTarget:!0,producers:["src/tools/write-pr-review-artifact.ts:154","src/tools/write-pr-review-artifact.ts:174","src/tools/write-pr-review-trigger-eval.ts:105"],note:"bundled-skills writes outside .swarm (project skill roots) and keeps its own contained-directory logic (invariant 4 bundled-skill ownership)"},{id:"tmp-prefix-named",era:"legacy",match:/^\.tmp-.+-\d+-\d+$/,token:"instance",quarantineEligible:!0,parsesTarget:!1,producers:["src/commands/issue.ts (pre-#2035; migrated-to=src/commands/issue.ts:atomicWriteFileSync)"],note:"prefix form embeds the filename; target not reliably parseable (dashes), so eligibility relies on the age/tracked/symlink/lock gates"},{id:"target-rebuild-close",era:"current",match:/^(.+)\.(?:rebuild|close)\.\d+\.[0-9a-z]+$/,token:"instance",quarantineEligible:!0,parsesTarget:!0,producers:["src/plan/manager.ts:2374","src/plan/manager.ts:2436"],note:"plan-durability (invariant 5) fd-write paths; grammars registered, writers unchanged in this PR"},{id:"target-migration-pid",era:"current",match:/^(.+)\.migration-\d+$/,token:"instance",quarantineEligible:!0,parsesTarget:!0,producers:["src/scope/scope-persistence.ts (pre-#2035; migrated-to=src/scope/scope-persistence.ts:atomicWriteSync)"]},{id:"dot-tmp-prefix-legacy",era:"legacy",match:/^\.tmp\..+$/,token:"constant",quarantineEligible:!0,parsesTarget:!1,producers:["pre-7.x writers (pre-#2035; scanner=src/services/swarm-residue.ts:collectCandidates)"],note:"legacy prefix grammar: issue #2035 req 7 preserves its handling — stale instances are quarantined (formerly unlinked) under the same eligibility gates"},{id:"dot-constant-tmp",era:"current",match:/^\..+\.tmp$/,token:"constant",quarantineEligible:!1,parsesTarget:!1,producers:["src/tools/write-drift-evidence.ts:275","src/tools/write-mutation-evidence.ts:169","src/tools/write-hallucination-evidence.ts:121","src/tools/write-final-council-evidence.ts:403"],note:"constant-name temps: no per-invocation token — reported when stale, never auto-quarantined (may be an in-flight writer of any process)"},{id:"target-constant-tmp",era:"current",match:/^(.+)\.tmp$/,token:"constant",quarantineEligible:!1,parsesTarget:!1,producers:["src/tools/checkpoint.ts:205","src/full-auto/state.ts:637","src/context-map/persistence.ts:135","src/context-map/capsule-persistence.ts:111","src/test-impact/history-store.ts:297","src/test-impact/history-store.ts:302","src/test-impact/history-store.ts:429","src/test-impact/history-store.ts:435","src/hooks/promotion-evidence-store.ts:112","src/hooks/skill-usage-log.ts:1165","src/hooks/skill-usage-log.ts:1675","src/hooks/skill-usage-pending.ts:817","src/parallel/file-locks.ts:113","src/plan/ledger.ts:607","src/plan/ledger.ts:1793"],note:"constant-name temps: reported when stale, never auto-quarantined. file-locks meta sidecars live under the scanner-skipped .swarm/locks/ subtree; the ledger reconcile temp embeds instance tokens but its .tmp-suffix shape maps here (conservatively report-only)"}];WRITER_CLASSIFICATION=Object.freeze({"src/commands/close.ts":"migrated","src/commands/close/context.ts":"reader-only","src/commands/close/clean-stage.ts":"reader-only","src/commands/handoff.ts":"migrated","src/commands/simulate.ts":"migrated","src/commands/coupling.ts":"migrated","src/commands/issue.ts":"migrated","src/evidence/task-file.ts":"migrated","src/evidence/phase-participation.ts":"migrated","src/memory/reflection-service.ts":"migrated","src/scope/scope-persistence.ts":"migrated","src/background/stage-b-dispatch-binding-store.ts":"migrated","src/services/skill-consolidation.ts":"migrated","src/services/skill-evaluator.ts":"migrated","src/services/skill-generator.ts":"migrated","src/services/skill-improver.ts":"migrated","src/summaries/store.ts":"migrated","src/prm/trajectory-store.ts":"migrated","src/observability/otlp-exporter.ts":"registered-bespoke","src/retention/jsonl-cap.ts":"registered-bespoke","src/services/skill-changelog.ts":"registered-bespoke","src/background/delegation-health.ts":"registered-bespoke","src/background/lane-output-store.ts":"registered-bespoke","src/background/pending-delegations.ts":"registered-bespoke","src/commands/archive-sqlite.ts":"registered-bespoke","src/context-map/capsule-persistence.ts":"registered-bespoke","src/context-map/persistence.ts":"registered-bespoke","src/context-map/telemetry.ts":"registered-bespoke","src/events/core-events.ts":"registered-bespoke","src/hooks/guardrails/shell-audit-store.ts":"registered-bespoke","src/evidence/documents-retention.ts":"registered-bespoke","src/evidence/manager.ts":"registered-bespoke","src/full-auto/state.ts":"registered-bespoke","src/hooks/delegation-gate/worktree-merge-status.ts":"registered-bespoke","src/hooks/delegation-gate/worktree-provisioning-owner.ts":"migrated","src/hooks/issue-trace-state.ts":"registered-bespoke","src/hooks/knowledge-receipt-ledger-storage.ts":"registered-bespoke","src/hooks/pr-workflow-gate.ts":"registered-bespoke","src/pr-review/authorization.ts":"registered-bespoke","src/pr-review/persistence.ts":"registered-bespoke","src/hooks/promotion-evidence-store.ts":"registered-bespoke","src/hooks/review-receipt.ts":"registered-bespoke","src/hooks/skill-usage-log.ts":"registered-bespoke","src/hooks/skill-usage-pending.ts":"registered-bespoke","src/knowledge/identity.ts":"registered-bespoke","src/memory/jsonl-migration.ts":"external","src/memory/local-jsonl-provider.ts":"registered-bespoke","src/plan/ledger.ts":"registered-bespoke","src/plan/manager.ts":"registered-bespoke","src/review/evidence.ts":"registered-bespoke","src/sdd/effective-spec.ts":"registered-bespoke","src/services/skill-improver-quota.ts":"registered-bespoke","src/services/skill-optimizer/activation.ts":"external","src/services/skill-optimizer/store.ts":"registered-bespoke","src/services/skill-reviser.ts":"external","src/services/synonym-map.ts":"registered-bespoke","src/session/snapshot-writer.ts":"registered-bespoke","src/summaries/manager.ts":"registered-bespoke","src/test-impact/history-store.ts":"registered-bespoke","src/turbo/lean/evidence.ts":"registered-bespoke","src/turbo/lean/integration.ts":"registered-bespoke","src/turbo/lean/recovery.ts":"registered-bespoke","src/turbo/lean/reviewer.ts":"registered-bespoke","src/turbo/lean/state.ts":"registered-bespoke","src/tools/apply-patch.ts":"external","src/tools/checkpoint.ts":"registered-bespoke","src/tools/record-implementation-review.ts":"migrated","src/tools/record-issue-publication.ts":"migrated","src/tools/record-issue-reproduction.ts":"migrated","src/tools/record-recurrence-sweep.ts":"migrated","src/tools/record-branch-freshness.ts":"migrated","src/tools/record-trace-validation.ts":"migrated","src/tools/record-merge-approval.ts":"migrated","src/tools/repo-graph/freshness.ts":"registered-bespoke","src/tools/repo-graph/storage.ts":"registered-bespoke","src/tools/sast-baseline.ts":"registered-bespoke","src/tools/spec-write.ts":"registered-bespoke","src/tools/submit-phase-council-verdicts.ts":"registered-bespoke","src/tools/write-drift-evidence.ts":"registered-bespoke","src/tools/write-final-council-evidence.ts":"registered-bespoke","src/tools/write-hallucination-evidence.ts":"registered-bespoke","src/tools/write-mutation-evidence.ts":"registered-bespoke","src/tools/write-pr-review-artifact.ts":"registered-bespoke","src/tools/write-pr-review-trigger-eval.ts":"registered-bespoke","src/config/bundled-skills.ts":"external","src/services/config-doctor.ts":"external","src/parallel/file-locks.ts":"registered-bespoke","src/utils/bun-compat.ts":"registered-bespoke","src/background/plan-sync-worker.ts":"reader-only","src/config/lane-permissions.ts":"reader-only","src/environment/profile.ts":"reader-only","src/worktree/core.ts":"reader-only"});RENAME_RETRY_DELAYS_MS=[10,25,50,100,200],RETRYABLE_RENAME_CODES=new Set(["EPERM","EBUSY","EACCES","EEXIST"]),recentWriteActivity=new Map;_internals8={randomSuffix:()=>randomBytes(16).toString("hex"),writeSync:(fd,buffer,offset,length)=>fs4.writeSync(fd,buffer,offset,length),renameSync:(from,to)=>fs4.renameSync(from,to),unlinkSync:(p)=>fs4.unlinkSync(p),fsyncSync:(fd)=>fs4.fsyncSync(fd)}});import{spawn as nodeSpawn,spawnSync as nodeSpawnSync}from"node:child_process";import*as fsSync3 from"node:fs";import*as fsPromises2 from"node:fs/promises";import*as path7 from"node:path";function getBun(){return globalThis.Bun}function bunFile(filePath){let bun=getBun();if(bun?.file)return bun.file(filePath);let cachedSize;return{async text(){return fsPromises2.readFile(filePath,"utf-8")},async arrayBuffer(){let buf=await fsPromises2.readFile(filePath),ab=new ArrayBuffer(buf.byteLength);return new Uint8Array(ab).set(buf),ab},async exists(){try{return await fsPromises2.access(filePath,fsSync3.constants.F_OK),!0}catch{return!1}},get size(){if(cachedSize!==void 0)return cachedSize;try{cachedSize=fsSync3.statSync(filePath).size}catch{cachedSize=0}return cachedSize}}}async function bunWrite(filePath,data){let bun=getBun();if(bun?.write)return bun.write(filePath,data);let dir=path7.dirname(filePath),tempName=`.${path7.basename(filePath)}.${process.pid}.${Date.now()}.${tempCounter++}.${Math.random().toString(36).slice(2,10)}.tmp`,tempPath=path7.join(dir,tempName),buffer;if(typeof data==="string")buffer=data;else if(data instanceof ArrayBuffer)buffer=new Uint8Array(data);else if(ArrayBuffer.isView(data))buffer=new Uint8Array(data.buffer,data.byteOffset,data.byteLength);else buffer=new Uint8Array(0);try{await fsPromises2.mkdir(dir,{recursive:!0})}catch{}await fsPromises2.writeFile(tempPath,buffer);let lastError;for(let attempt=0;attempt<WINDOWS_RENAME_MAX_RETRIES;attempt++)try{await fsPromises2.rename(tempPath,filePath),lastError=void 0;break}catch(err){lastError=err;let code=err.code;if(code!=="EEXIST"&&code!=="EBUSY"&&code!=="EPERM")break;await new Promise((r)=>setTimeout(r,WINDOWS_RENAME_RETRY_DELAY_MS))}if(lastError){try{await fsPromises2.unlink(tempPath)}catch{}throw lastError}try{let dirFd=await fsPromises2.open(dir,"r");try{await dirFd.sync()}finally{await dirFd.close()}}catch{}return(await fsPromises2.stat(filePath)).size}function sleep(ms){let bun=getBun();if(bun?.sleep)return bun.sleep(ms);return new Promise((resolve5)=>setTimeout(resolve5,ms))}function collectGarbageBestEffort(){let bun=getBun();try{bun?.gc?.(!0)}catch{}}function bunHash(input){let bun=getBun();if(bun?.hash){let r=bun.hash(input);return typeof r==="bigint"?r:BigInt(r)}let bytes;if(typeof input==="string")bytes=new TextEncoder().encode(input);else if(input instanceof ArrayBuffer)bytes=new Uint8Array(input);else bytes=new Uint8Array(input.buffer,input.byteOffset,input.byteLength);let hash2=5381n;for(let b of bytes)hash2=hash2*33n+BigInt(b)&0xffffffffffffffffn;return hash2}async function killProcessTreeImpl(pid,signal,directKill,wasDetached){if(typeof pid!=="number"||pid<=0){directKill(signal);return}if(_internals9.platform()==="win32"){let taskkill;try{if(taskkill=_internals9.spawnTaskkill(["/PID",String(pid),"/T","/F"],{cwd:_internals9.cwd(),stdio:["ignore","ignore","ignore"],timeout:5000,killSignal:"SIGKILL",windowsHide:!0}),await new Promise((resolve5)=>{let settled=!1,finish=(value)=>{if(settled)return;settled=!0,resolve5(value)};taskkill?.once("error",()=>finish(!1)),taskkill?.once("exit",(code)=>finish(code===0))}))return}catch{}finally{try{taskkill?.kill("SIGKILL")}catch{}}throw directKill(signal),Error("Windows process-tree termination could not be confirmed")}if(wasDetached)try{process.kill(-pid,signal??"SIGKILL");return}catch{}directKill(signal)}function createProcessTreeKiller(pid,directKill,wasDetached){return(signal)=>killProcessTreeImpl(pid,signal,directKill,wasDetached)}function inspectSpawnCwd(cwd){try{return _internals9.statSync(cwd).isDirectory()?"directory":"not-directory"}catch(err){let code=typeof err==="object"&&err!==null&&"code"in err?err.code:void 0;if(code==="ENOENT"||code==="ENOTDIR")return"missing";if(code==="EACCES"||code==="EPERM")return"unreadable";return"unknown"}}function describeSpawnCwdFailure(cwd,executable,cause){let state2=inspectSpawnCwd(cwd);if(state2==="missing")return new SpawnCwdMissingError(cwd,"missing",executable,{cause});if(state2==="not-directory")return new SpawnCwdMissingError(cwd,"not-directory",executable,{cause});return null}function spawnErrorCode(err){if(typeof err!=="object"||err===null||!("code"in err))return;let code=err.code;return typeof code==="string"?code:void 0}function classifySpawnFailure(err,cwd){if(err instanceof SpawnCwdMissingError)return"cwd-missing";let code=spawnErrorCode(err);if(code===void 0||!AMBIGUOUS_SPAWN_CODES.has(code))return"other";if(cwd===void 0||cwd==="")return code==="ENOENT"?"binary-missing":"other";switch(inspectSpawnCwd(cwd)){case"missing":case"not-directory":return"cwd-missing";case"unreadable":case"unknown":return"cwd-unreadable";default:return code==="ENOENT"?"binary-missing":"other"}}function wrapSpawnFailure(error49,cwd,executable){let err=asError(error49);if(err instanceof SpawnCwdMissingError)return err;if(cwd===void 0||cwd==="")return err;if(classifySpawnFailure(err,cwd)!=="cwd-missing")return err;return describeSpawnCwdFailure(cwd,executable,err)??err}function normalizedMaxBuffer(value){return typeof value==="number"&&Number.isSafeInteger(value)&&value>0?value:DEFAULT_BUN_SPAWN_MAX_BUFFER_BYTES}function createOutputOverflowController(limit,requestKill){let error49,killRequested=!1,resolveCompleted,completed=new Promise((resolve5)=>{resolveCompleted=resolve5});return{get error(){return error49},completed,overflow(captured,total){if(error49)return;if(error49=new BunCompatOutputLimitError(limit,captured,total),killRequested)return;killRequested=!0;try{requestKill()}catch{}},complete(){resolveCompleted()}}}function streamFromNode(pipe2,limit,controller){if(!pipe2)return staticStream("");let mode,collected,collect=()=>{if(mode==="reader")return Promise.reject(TypeError("Subprocess output is already consumed by a reader"));if(mode="buffered",collected)return collected;return collected=new Promise((resolve5)=>{if(!pipe2){resolve5(Buffer.alloc(0));return}let chunks=[],captured=0,total=0,finished=!1,finish=()=>{if(finished)return;finished=!0,resolve5(Buffer.concat(chunks))};pipe2.on("data",(chunk)=>{let bytes=typeof chunk==="string"?Buffer.from(chunk):chunk;if(total+=bytes.byteLength,controller?.error||limit===void 0)return;let remaining=limit-captured;if(remaining>0){let retained=Buffer.from(bytes.subarray(0,remaining));chunks.push(retained),captured+=retained.byteLength}if(bytes.byteLength>remaining)controller?.overflow(captured,total)}),pipe2.on("end",finish),pipe2.on("close",finish),pipe2.on("error",finish)}).then(async(bytes)=>{if(await controller?.completed,controller?.error)throw controller.error;return bytes}),collected},toWebReadable=()=>{if(!pipe2)return new ReadableStream({start(controller2){controller2.close()}});let r=pipe2;if(typeof r.toWeb==="function")return r.toWeb();return new ReadableStream({start(controller2){pipe2.on("data",(chunk)=>{controller2.enqueue(typeof chunk==="string"?new TextEncoder().encode(chunk):new Uint8Array(chunk.buffer,chunk.byteOffset,chunk.byteLength))}),pipe2.on("end",()=>controller2.close()),pipe2.on("error",(err)=>controller2.error(err))},cancel(){let destroyable=pipe2;if(typeof destroyable.destroy==="function")try{destroyable.destroy()}catch{}}})},result={async text(){return(await collect()).toString("utf-8")},async bytes(){let b=await collect();return new Uint8Array(b.buffer,b.byteOffset,b.byteLength)},getReader(){if(mode!==void 0)throw TypeError("Subprocess output is already consumed");return mode="reader",toWebReadable().getReader()}};if(pipe2&&controller&&limit!==void 0)queueMicrotask(()=>{if(mode===void 0)collect().catch(()=>{return})});return result}function mapStdio(v){return v??"pipe"}function streamFromBun(stream,limit,controller){if(!stream||typeof stream!=="object")return{async text(){return""},async bytes(){return new Uint8Array(0)},getReader(){return new ReadableStream({start(controller2){controller2.close()}}).getReader()}};let candidate=stream,mode,collected,collect=()=>{if(mode==="reader")return Promise.reject(TypeError("Subprocess output is already consumed by a reader"));return mode="buffered",collected??=(async()=>{if(typeof candidate.getReader!=="function")return new Uint8Array(0);let reader=candidate.getReader(),chunks=[],captured=0,total=0;try{for(;;){let{done,value}=await reader.read();if(done)break;if(!value)continue;if(total+=value.byteLength,controller?.error||limit===void 0)continue;let remaining=limit-captured;if(remaining>0){let retained=value.slice(0,remaining);chunks.push(retained),captured+=retained.byteLength}if(value.byteLength>remaining)controller?.overflow(captured,total)}}finally{reader.releaseLock()}if(await controller?.completed,controller?.error)throw controller.error;let out=new Uint8Array(captured),offset=0;for(let chunk of chunks)out.set(chunk,offset),offset+=chunk.byteLength;return out})(),collected},result={async text(){return new TextDecoder().decode(await collect())},bytes:collect,getReader(){if(mode!==void 0)throw TypeError("Subprocess output is already consumed");return mode="reader",typeof candidate.getReader==="function"?candidate.getReader():new ReadableStream({start(streamController){streamController.close()}}).getReader()}};if(typeof candidate.getReader==="function"&&controller&&limit!==void 0)queueMicrotask(()=>{if(mode===void 0)collect().catch(()=>{return})});return result}function mergeEnvForChild(baseEnv,envOverrides){let hasExplicitBaseEnv=baseEnv!==void 0,baseSource=baseEnv??process.env,merged={};for(let[key,value]of Object.entries(baseSource))if(typeof value==="string")merged[key]=value;if(envOverrides)for(let[key,value]of Object.entries(envOverrides))if(value===null)delete merged[key];else merged[key]=value;if(Object.keys(merged).length===0)return hasExplicitBaseEnv?{}:void 0;return merged}function asError(value){return value instanceof Error?value:Error(String(value))}function staticStream(text){let bytes=new TextEncoder().encode(text);return{async text(){return text},async bytes(){return bytes},getReader(){return new ReadableStream({start(controller){if(bytes.byteLength>0)controller.enqueue(bytes);controller.close()}}).getReader()}}}function spawnCreationFailure(error49){return{stdout:streamFromBun(void 0),stderr:staticStream(error49.message),exited:Promise.resolve(SPAWN_CREATION_FAILURE_EXIT_CODE),exitCode:null,signalCode:null,spawnError:error49,kill(){},killTree:()=>Promise.resolve()}}function bunSpawn(cmd,options){let maxBuffer=normalizedMaxBuffer(options?.maxBuffer),bun=getBun();if(bun?.spawn){let mergedEnv2=mergeEnvForChild(options?.env,options?.envOverrides),spawnOpts={...options};if(delete spawnOpts.killProcessTree,delete spawnOpts.maxBuffer,mergedEnv2!==void 0)spawnOpts.env=mergedEnv2;if(options?.timeout&&options.timeout>0&&options.killProcessTree!==!0)spawnOpts.killSignal="SIGKILL";if(options?.killProcessTree===!0)delete spawnOpts.timeout,delete spawnOpts.killSignal,spawnOpts.detached=!0;let spawned;try{spawned=bun.spawn(cmd,spawnOpts)}catch(error49){return spawnCreationFailure(wrapSpawnFailure(error49,options?.cwd,cmd[0]??""))}let proc2=spawned,killBunTree=createProcessTreeKiller(proc2.pid,(sig)=>proc2.kill(sig),!0),killBunProcess=(sig)=>options?.killProcessTree?killBunTree(sig):Promise.resolve(proc2.kill(sig)),outputController2=createOutputOverflowController(maxBuffer,()=>{killBunProcess("SIGKILL").catch(()=>{return})}),timeoutHandle2;if(options?.killProcessTree===!0&&options.timeout&&options.timeout>0){if(timeoutHandle2=setTimeout(()=>{try{killBunProcess("SIGKILL").catch(()=>{return})}catch{}},options.timeout),typeof timeoutHandle2.unref==="function")timeoutHandle2.unref()}let exited2=proc2.exited.finally(()=>{if(timeoutHandle2!==void 0)clearTimeout(timeoutHandle2);outputController2.complete()});return{stdout:streamFromBun(proc2.stdout,maxBuffer,outputController2),stderr:streamFromBun(proc2.stderr,maxBuffer,outputController2),exited:exited2,get exitCode(){return proc2.exitCode},get signalCode(){return proc2.signalCode},kill(sig){killBunProcess(sig).catch(()=>{return})},killTree:killBunProcess}}let[file2,...args2]=cmd,detached=options?.killProcessTree===!0,mergedEnv=mergeEnvForChild(options?.env,options?.envOverrides),proc;try{proc=nodeSpawn(file2,args2,{cwd:options?.cwd,env:mergedEnv,detached,windowsHide:!0,windowsVerbatimArguments:options?.windowsVerbatimArguments,stdio:[mapStdio(options?.stdin),mapStdio(options?.stdout),mapStdio(options?.stderr)]})}catch(error49){return spawnCreationFailure(wrapSpawnFailure(error49,options?.cwd,file2))}let killChildTree=createProcessTreeKiller(proc.pid,(signal)=>proc.kill(signal),!0),killChild=(signal)=>{if(detached)return killChildTree(signal);return proc.kill(signal),Promise.resolve()},outputController=createOutputOverflowController(maxBuffer,()=>{killChild("SIGKILL").catch(()=>{return})}),timeoutHandle,observedSignal=null,observedSpawnError=null,exited=new Promise((resolve5)=>{if(proc.on("exit",(code,signal)=>{observedSignal=signal,resolve5(code??-1)}),proc.on("error",(error49)=>{observedSpawnError=wrapSpawnFailure(error49,options?.cwd,file2),resolve5(1)}),options?.timeout&&options.timeout>0){if(timeoutHandle=setTimeout(()=>{try{killChild("SIGKILL").catch(()=>{return})}catch{}},options.timeout),typeof timeoutHandle.unref==="function")timeoutHandle.unref()}}).finally(()=>{if(timeoutHandle!==void 0)clearTimeout(timeoutHandle);outputController.complete()});return{stdout:streamFromNode(proc.stdout,maxBuffer,outputController),stderr:streamFromNode(proc.stderr,maxBuffer,outputController),exited,get exitCode(){return observedSpawnError?null:proc.exitCode},get signalCode(){return observedSignal??proc.signalCode},get spawnError(){return observedSpawnError},kill(signal){killChild(signal).catch(()=>{return})},killTree:killChild}}function syncSpawnCreationFailure(error49){return{stdout:new Uint8Array(0),stderr:new TextEncoder().encode(error49.message),exitCode:SPAWN_CREATION_FAILURE_EXIT_CODE,success:!1}}function bunSpawnSync(cmd,options){let requestedCwd=Array.isArray(cmd)?options?.cwd:options?.cwd??cmd.cwd,executable=(Array.isArray(cmd)?cmd[0]:cmd.cmd[0])??"",bun=getBun();if(bun?.spawnSync){let mergedEnv2=mergeEnvForChild(options?.env,options?.envOverrides),spawnOpts={...options};if(delete spawnOpts.maxBuffer,mergedEnv2!==void 0)spawnOpts.env=mergedEnv2;try{return bun.spawnSync(cmd,spawnOpts)}catch(error49){return syncSpawnCreationFailure(wrapSpawnFailure(error49,requestedCwd,executable))}}let argv,mergedOptions;if(Array.isArray(cmd))argv=cmd,mergedOptions={...options??{}};else if(argv=cmd.cmd,mergedOptions={cwd:cmd.cwd,env:cmd.env,stdin:"pipe",timeout:cmd.timeout,...options??{}},cmd.stdin!==void 0)mergedOptions.stdin=cmd.stdin;let[file2,...args2]=argv,mergedEnv=mergeEnvForChild(mergedOptions.env,options?.envOverrides),result;try{result=nodeSpawnSync(file2,args2,{cwd:mergedOptions.cwd,env:mergedEnv,input:mergedOptions.stdin instanceof Uint8Array||typeof mergedOptions.stdin==="string"?mergedOptions.stdin:void 0,timeout:mergedOptions.timeout,windowsHide:!0})}catch(error49){return syncSpawnCreationFailure(wrapSpawnFailure(error49,mergedOptions.cwd,file2))}if(result.error){let wrapped=wrapSpawnFailure(result.error,mergedOptions.cwd,file2);if(wrapped instanceof SpawnCwdMissingError)return syncSpawnCreationFailure(wrapped)}let stdout=result.stdout instanceof Buffer?new Uint8Array(result.stdout.buffer,result.stdout.byteOffset,result.stdout.byteLength):typeof result.stdout==="string"?new TextEncoder().encode(result.stdout):new Uint8Array(0),stderr=result.stderr instanceof Buffer?new Uint8Array(result.stderr.buffer,result.stderr.byteOffset,result.stderr.byteLength):typeof result.stderr==="string"?new TextEncoder().encode(result.stderr):new Uint8Array(0),exitCode=result.status??(result.signal?128:1);return{stdout,stderr,exitCode,success:exitCode===0&&!result.error}}var WINDOWS_RENAME_MAX_RETRIES=3,WINDOWS_RENAME_RETRY_DELAY_MS=50,tempCounter=0,DEFAULT_BUN_SPAWN_MAX_BUFFER_BYTES=5242880,BunCompatOutputLimitError,_internals9,SpawnCwdMissingError,AMBIGUOUS_SPAWN_CODES,SPAWN_CREATION_FAILURE_EXIT_CODE=1;var init_bun_compat=__esm(()=>{BunCompatOutputLimitError=class BunCompatOutputLimitError extends Error{limit;captured;total;constructor(limit,captured,total){super(`Subprocess output exceeded the ${limit}-byte buffer limit after capturing ${captured} bytes (${total} bytes observed)`);this.name="BunCompatOutputLimitError",this.limit=limit,this.captured=captured,this.total=total}};_internals9={platform:()=>process.platform,cwd:()=>process.cwd(),spawnTaskkill:(args2,options)=>nodeSpawn("taskkill",args2,options),createProcessTreeKiller,statSync:(target)=>fsSync3.statSync(target)};SpawnCwdMissingError=class SpawnCwdMissingError extends Error{name="SpawnCwdMissingError";code="ENOENT";cwd;reason;executable;constructor(cwd,reason,executable,options){super(reason==="missing"?`cannot start "${executable}": working directory no longer exists: ${cwd}`:`cannot start "${executable}": working directory is not a directory: ${cwd}`,options);this.cwd=cwd,this.reason=reason,this.executable=executable}};AMBIGUOUS_SPAWN_CODES=new Set(["ENOENT","ENOTDIR","EACCES","EPERM"])});import*as fs5 from"node:fs";import*as path8 from"node:path";function isFailClosedHandler(value){return typeof value==="function"&&Object.hasOwn(value,"__failClosed")&&value.__failClosed===!0}function safeHook(fn2){return async(input,output)=>{try{await fn2(input,output)}catch(_error){let functionName=fn2.name||"unknown";if(_error instanceof SwarmError)warn(`Hook '${functionName}' failed: ${_error.message}
|
|
133
|
+
GFS4: `),console.error(m)};if(!fs4[gracefulQueue]){if(queue=global[gracefulQueue]||[],publishQueue(fs4,queue),fs4.close=function(fs$close){function close(fd,cb){return fs$close.call(fs4,fd,function(err){if(!err)resetQueue();if(typeof cb==="function")cb.apply(this,arguments)})}return Object.defineProperty(close,previousSymbol,{value:fs$close}),close}(fs4.close),fs4.closeSync=function(fs$closeSync){function closeSync(fd){fs$closeSync.apply(fs4,arguments),resetQueue()}return Object.defineProperty(closeSync,previousSymbol,{value:fs$closeSync}),closeSync}(fs4.closeSync),/\bgfs4\b/i.test(process.env.NODE_DEBUG||""))process.on("exit",function(){debug(fs4[gracefulQueue]),__require("assert").equal(fs4[gracefulQueue].length,0)})}var queue;if(!global[gracefulQueue])publishQueue(global,fs4[gracefulQueue]);module.exports=patch(clone2(fs4));if(process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH&&!fs4.__patched)module.exports=patch(fs4),fs4.__patched=!0;function patch(fs5){polyfills(fs5),fs5.gracefulify=patch,fs5.createReadStream=createReadStream,fs5.createWriteStream=createWriteStream;var fs$readFile=fs5.readFile;fs5.readFile=readFile3;function readFile3(path6,options,cb){if(typeof options==="function")cb=options,options=null;return go$readFile(path6,options,cb);function go$readFile(path7,options2,cb2,startTime){return fs$readFile(path7,options2,function(err){if(err&&(err.code==="EMFILE"||err.code==="ENFILE"))enqueue([go$readFile,[path7,options2,cb2],err,startTime||Date.now(),Date.now()]);else if(typeof cb2==="function")cb2.apply(this,arguments)})}}var fs$writeFile=fs5.writeFile;fs5.writeFile=writeFile2;function writeFile2(path6,data,options,cb){if(typeof options==="function")cb=options,options=null;return go$writeFile(path6,data,options,cb);function go$writeFile(path7,data2,options2,cb2,startTime){return fs$writeFile(path7,data2,options2,function(err){if(err&&(err.code==="EMFILE"||err.code==="ENFILE"))enqueue([go$writeFile,[path7,data2,options2,cb2],err,startTime||Date.now(),Date.now()]);else if(typeof cb2==="function")cb2.apply(this,arguments)})}}var fs$appendFile=fs5.appendFile;if(fs$appendFile)fs5.appendFile=appendFile;function appendFile(path6,data,options,cb){if(typeof options==="function")cb=options,options=null;return go$appendFile(path6,data,options,cb);function go$appendFile(path7,data2,options2,cb2,startTime){return fs$appendFile(path7,data2,options2,function(err){if(err&&(err.code==="EMFILE"||err.code==="ENFILE"))enqueue([go$appendFile,[path7,data2,options2,cb2],err,startTime||Date.now(),Date.now()]);else if(typeof cb2==="function")cb2.apply(this,arguments)})}}var fs$copyFile=fs5.copyFile;if(fs$copyFile)fs5.copyFile=copyFile2;function copyFile2(src,dest,flags,cb){if(typeof flags==="function")cb=flags,flags=0;return go$copyFile(src,dest,flags,cb);function go$copyFile(src2,dest2,flags2,cb2,startTime){return fs$copyFile(src2,dest2,flags2,function(err){if(err&&(err.code==="EMFILE"||err.code==="ENFILE"))enqueue([go$copyFile,[src2,dest2,flags2,cb2],err,startTime||Date.now(),Date.now()]);else if(typeof cb2==="function")cb2.apply(this,arguments)})}}var fs$readdir=fs5.readdir;fs5.readdir=readdir2;var noReaddirOptionVersions=/^v[0-5]\./;function readdir2(path6,options,cb){if(typeof options==="function")cb=options,options=null;var go$readdir=noReaddirOptionVersions.test(process.version)?function(path7,options2,cb2,startTime){return fs$readdir(path7,fs$readdirCallback(path7,options2,cb2,startTime))}:function(path7,options2,cb2,startTime){return fs$readdir(path7,options2,fs$readdirCallback(path7,options2,cb2,startTime))};return go$readdir(path6,options,cb);function fs$readdirCallback(path7,options2,cb2,startTime){return function(err,files){if(err&&(err.code==="EMFILE"||err.code==="ENFILE"))enqueue([go$readdir,[path7,options2,cb2],err,startTime||Date.now(),Date.now()]);else{if(files&&files.sort)files.sort();if(typeof cb2==="function")cb2.call(this,err,files)}}}}if(process.version.substr(0,4)==="v0.8"){var legStreams=legacy(fs5);ReadStream=legStreams.ReadStream,WriteStream=legStreams.WriteStream}var fs$ReadStream=fs5.ReadStream;if(fs$ReadStream)ReadStream.prototype=Object.create(fs$ReadStream.prototype),ReadStream.prototype.open=ReadStream$open;var fs$WriteStream=fs5.WriteStream;if(fs$WriteStream)WriteStream.prototype=Object.create(fs$WriteStream.prototype),WriteStream.prototype.open=WriteStream$open;Object.defineProperty(fs5,"ReadStream",{get:function(){return ReadStream},set:function(val){ReadStream=val},enumerable:!0,configurable:!0}),Object.defineProperty(fs5,"WriteStream",{get:function(){return WriteStream},set:function(val){WriteStream=val},enumerable:!0,configurable:!0});var FileReadStream=ReadStream;Object.defineProperty(fs5,"FileReadStream",{get:function(){return FileReadStream},set:function(val){FileReadStream=val},enumerable:!0,configurable:!0});var FileWriteStream=WriteStream;Object.defineProperty(fs5,"FileWriteStream",{get:function(){return FileWriteStream},set:function(val){FileWriteStream=val},enumerable:!0,configurable:!0});function ReadStream(path6,options){if(this instanceof ReadStream)return fs$ReadStream.apply(this,arguments),this;else return ReadStream.apply(Object.create(ReadStream.prototype),arguments)}function ReadStream$open(){var that=this;open(that.path,that.flags,that.mode,function(err,fd){if(err){if(that.autoClose)that.destroy();that.emit("error",err)}else that.fd=fd,that.emit("open",fd),that.read()})}function WriteStream(path6,options){if(this instanceof WriteStream)return fs$WriteStream.apply(this,arguments),this;else return WriteStream.apply(Object.create(WriteStream.prototype),arguments)}function WriteStream$open(){var that=this;open(that.path,that.flags,that.mode,function(err,fd){if(err)that.destroy(),that.emit("error",err);else that.fd=fd,that.emit("open",fd)})}function createReadStream(path6,options){return new fs5.ReadStream(path6,options)}function createWriteStream(path6,options){return new fs5.WriteStream(path6,options)}var fs$open=fs5.open;fs5.open=open;function open(path6,flags,mode,cb){if(typeof mode==="function")cb=mode,mode=null;return go$open(path6,flags,mode,cb);function go$open(path7,flags2,mode2,cb2,startTime){return fs$open(path7,flags2,mode2,function(err,fd){if(err&&(err.code==="EMFILE"||err.code==="ENFILE"))enqueue([go$open,[path7,flags2,mode2,cb2],err,startTime||Date.now(),Date.now()]);else if(typeof cb2==="function")cb2.apply(this,arguments)})}}return fs5}function enqueue(elem){debug("ENQUEUE",elem[0].name,elem[1]),fs4[gracefulQueue].push(elem),retry()}var retryTimer;function resetQueue(){var now=Date.now();for(var i=0;i<fs4[gracefulQueue].length;++i)if(fs4[gracefulQueue][i].length>2)fs4[gracefulQueue][i][3]=now,fs4[gracefulQueue][i][4]=now;retry()}function retry(){if(clearTimeout(retryTimer),retryTimer=void 0,fs4[gracefulQueue].length===0)return;var elem=fs4[gracefulQueue].shift(),fn2=elem[0],args2=elem[1],err=elem[2],startTime=elem[3],lastTime=elem[4];if(startTime===void 0)debug("RETRY",fn2.name,args2),fn2.apply(null,args2);else if(Date.now()-startTime>=60000){debug("TIMEOUT",fn2.name,args2);var cb=args2.pop();if(typeof cb==="function")cb.call(null,err)}else{var sinceAttempt=Date.now()-lastTime,sinceStart=Math.max(lastTime-startTime,1),desiredDelay=Math.min(sinceStart*1.2,100);if(sinceAttempt>=desiredDelay)debug("RETRY",fn2.name,args2),fn2.apply(null,args2.concat([startTime]));else fs4[gracefulQueue].push(elem)}if(retryTimer===void 0)retryTimer=setTimeout(retry,0)}});var require_retry_operation=__commonJS((exports,module)=>{function RetryOperation(timeouts,options){if(typeof options==="boolean")options={forever:options};if(this._originalTimeouts=JSON.parse(JSON.stringify(timeouts)),this._timeouts=timeouts,this._options=options||{},this._maxRetryTime=options&&options.maxRetryTime||1/0,this._fn=null,this._errors=[],this._attempts=1,this._operationTimeout=null,this._operationTimeoutCb=null,this._timeout=null,this._operationStart=null,this._options.forever)this._cachedTimeouts=this._timeouts.slice(0)}module.exports=RetryOperation;RetryOperation.prototype.reset=function(){this._attempts=1,this._timeouts=this._originalTimeouts};RetryOperation.prototype.stop=function(){if(this._timeout)clearTimeout(this._timeout);this._timeouts=[],this._cachedTimeouts=null};RetryOperation.prototype.retry=function(err){if(this._timeout)clearTimeout(this._timeout);if(!err)return!1;var currentTime=new Date().getTime();if(err&¤tTime-this._operationStart>=this._maxRetryTime)return this._errors.unshift(Error("RetryOperation timeout occurred")),!1;this._errors.push(err);var timeout=this._timeouts.shift();if(timeout===void 0)if(this._cachedTimeouts)this._errors.splice(this._errors.length-1,this._errors.length),this._timeouts=this._cachedTimeouts.slice(0),timeout=this._timeouts.shift();else return!1;var self=this,timer=setTimeout(function(){if(self._attempts++,self._operationTimeoutCb){if(self._timeout=setTimeout(function(){self._operationTimeoutCb(self._attempts)},self._operationTimeout),self._options.unref)self._timeout.unref()}self._fn(self._attempts)},timeout);if(this._options.unref)timer.unref();return!0};RetryOperation.prototype.attempt=function(fn2,timeoutOps){if(this._fn=fn2,timeoutOps){if(timeoutOps.timeout)this._operationTimeout=timeoutOps.timeout;if(timeoutOps.cb)this._operationTimeoutCb=timeoutOps.cb}var self=this;if(this._operationTimeoutCb)this._timeout=setTimeout(function(){self._operationTimeoutCb()},self._operationTimeout);this._operationStart=new Date().getTime(),this._fn(this._attempts)};RetryOperation.prototype.try=function(fn2){console.log("Using RetryOperation.try() is deprecated"),this.attempt(fn2)};RetryOperation.prototype.start=function(fn2){console.log("Using RetryOperation.start() is deprecated"),this.attempt(fn2)};RetryOperation.prototype.start=RetryOperation.prototype.try;RetryOperation.prototype.errors=function(){return this._errors};RetryOperation.prototype.attempts=function(){return this._attempts};RetryOperation.prototype.mainError=function(){if(this._errors.length===0)return null;var counts={},mainError=null,mainErrorCount=0;for(var i=0;i<this._errors.length;i++){var error49=this._errors[i],message=error49.message,count=(counts[message]||0)+1;if(counts[message]=count,count>=mainErrorCount)mainError=error49,mainErrorCount=count}return mainError}});var require_retry=__commonJS((exports)=>{var RetryOperation=require_retry_operation();exports.operation=function(options){var timeouts=exports.timeouts(options);return new RetryOperation(timeouts,{forever:options&&options.forever,unref:options&&options.unref,maxRetryTime:options&&options.maxRetryTime})};exports.timeouts=function(options){if(options instanceof Array)return[].concat(options);var opts={retries:10,factor:2,minTimeout:1000,maxTimeout:1/0,randomize:!1};for(var key in options)opts[key]=options[key];if(opts.minTimeout>opts.maxTimeout)throw Error("minTimeout is greater than maxTimeout");var timeouts=[];for(var i=0;i<opts.retries;i++)timeouts.push(this.createTimeout(i,opts));if(options&&options.forever&&!timeouts.length)timeouts.push(this.createTimeout(i,opts));return timeouts.sort(function(a,b){return a-b}),timeouts};exports.createTimeout=function(attempt,opts){var random=opts.randomize?Math.random()+1:1,timeout=Math.round(random*opts.minTimeout*Math.pow(opts.factor,attempt));return timeout=Math.min(timeout,opts.maxTimeout),timeout};exports.wrap=function(obj,options,methods){if(options instanceof Array)methods=options,options=null;if(!methods){methods=[];for(var key in obj)if(typeof obj[key]==="function")methods.push(key)}for(var i=0;i<methods.length;i++){var method=methods[i],original=obj[method];obj[method]=function(original2){var op=exports.operation(options),args2=Array.prototype.slice.call(arguments,1),callback=args2.pop();args2.push(function(err){if(op.retry(err))return;if(err)arguments[0]=op.mainError();callback.apply(this,arguments)}),op.attempt(function(){original2.apply(obj,args2)})}.bind(obj,original),obj[method].options=options}}});var require_signals=__commonJS((exports,module)=>{module.exports=["SIGABRT","SIGALRM","SIGHUP","SIGINT","SIGTERM"];if(process.platform!=="win32")module.exports.push("SIGVTALRM","SIGXCPU","SIGXFSZ","SIGUSR2","SIGTRAP","SIGSYS","SIGQUIT","SIGIOT");if(process.platform==="linux")module.exports.push("SIGIO","SIGPOLL","SIGPWR","SIGSTKFLT","SIGUNUSED")});var require_signal_exit=__commonJS((exports,module)=>{var process3=global.process,processOk=function(process4){return process4&&typeof process4==="object"&&typeof process4.removeListener==="function"&&typeof process4.emit==="function"&&typeof process4.reallyExit==="function"&&typeof process4.listeners==="function"&&typeof process4.kill==="function"&&typeof process4.pid==="number"&&typeof process4.on==="function"};if(!processOk(process3))module.exports=function(){return function(){}};else{if(assert2=__require("assert"),signals=require_signals(),isWin=/^win/i.test(process3.platform),EE=__require("events"),typeof EE!=="function")EE=EE.EventEmitter;if(process3.__signal_exit_emitter__)emitter=process3.__signal_exit_emitter__;else emitter=process3.__signal_exit_emitter__=new EE,emitter.count=0,emitter.emitted={};if(!emitter.infinite)emitter.setMaxListeners(1/0),emitter.infinite=!0;module.exports=function(cb,opts){if(!processOk(global.process))return function(){};if(assert2.equal(typeof cb,"function","a callback must be provided for exit handler"),loaded===!1)load();var ev="exit";if(opts&&opts.alwaysLast)ev="afterexit";var remove=function(){if(emitter.removeListener(ev,cb),emitter.listeners("exit").length===0&&emitter.listeners("afterexit").length===0)unload()};return emitter.on(ev,cb),remove},unload=function(){if(!loaded||!processOk(global.process))return;loaded=!1,signals.forEach(function(sig){try{process3.removeListener(sig,sigListeners[sig])}catch(er){}}),process3.emit=originalProcessEmit,process3.reallyExit=originalProcessReallyExit,emitter.count-=1},module.exports.unload=unload,emit=function(event,code,signal){if(emitter.emitted[event])return;emitter.emitted[event]=!0,emitter.emit(event,code,signal)},sigListeners={},signals.forEach(function(sig){sigListeners[sig]=function(){if(!processOk(global.process))return;var listeners=process3.listeners(sig);if(listeners.length===emitter.count){if(unload(),emit("exit",null,sig),emit("afterexit",null,sig),isWin&&sig==="SIGHUP")sig="SIGINT";process3.kill(process3.pid,sig)}}}),module.exports.signals=function(){return signals},loaded=!1,load=function(){if(loaded||!processOk(global.process))return;loaded=!0,emitter.count+=1,signals=signals.filter(function(sig){try{return process3.on(sig,sigListeners[sig]),!0}catch(er){return!1}}),process3.emit=processEmit,process3.reallyExit=processReallyExit},module.exports.load=load,originalProcessReallyExit=process3.reallyExit,processReallyExit=function(code){if(!processOk(global.process))return;process3.exitCode=code||0,emit("exit",process3.exitCode,null),emit("afterexit",process3.exitCode,null),originalProcessReallyExit.call(process3,process3.exitCode)},originalProcessEmit=process3.emit,processEmit=function(ev,arg){if(ev==="exit"&&processOk(global.process)){if(arg!==void 0)process3.exitCode=arg;var ret=originalProcessEmit.apply(this,arguments);return emit("exit",process3.exitCode,null),emit("afterexit",process3.exitCode,null),ret}else return originalProcessEmit.apply(this,arguments)}}var assert2,signals,isWin,EE,emitter,unload,emit,sigListeners,loaded,load,originalProcessReallyExit,processReallyExit,originalProcessEmit,processEmit});var require_mtime_precision=__commonJS((exports,module)=>{var cacheSymbol=Symbol();function probe(file2,fs4,callback){let cachedPrecision=fs4[cacheSymbol];if(cachedPrecision)return fs4.stat(file2,(err,stat4)=>{if(err)return callback(err);callback(null,stat4.mtime,cachedPrecision)});let mtime=new Date(Math.ceil(Date.now()/1000)*1000+5);fs4.utimes(file2,mtime,mtime,(err)=>{if(err)return callback(err);fs4.stat(file2,(err2,stat4)=>{if(err2)return callback(err2);let precision=stat4.mtime.getTime()%1000===0?"s":"ms";Object.defineProperty(fs4,cacheSymbol,{value:precision}),callback(null,stat4.mtime,precision)})})}function getMtime(precision){let now=Date.now();if(precision==="s")now=Math.ceil(now/1000)*1000;return new Date(now)}exports.probe=probe;exports.getMtime=getMtime});var require_lockfile=__commonJS((exports,module)=>{var path6=__require("path"),fs4=require_graceful_fs(),retry=require_retry(),onExit=require_signal_exit(),mtimePrecision=require_mtime_precision(),locks={};function getLockFile(file2,options){return options.lockfilePath||`${file2}.lock`}function resolveCanonicalPath(file2,options,callback){if(!options.realpath)return callback(null,path6.resolve(file2));options.fs.realpath(file2,callback)}function acquireLock(file2,options,callback){let lockfilePath=getLockFile(file2,options);options.fs.mkdir(lockfilePath,(err)=>{if(!err)return mtimePrecision.probe(lockfilePath,options.fs,(err2,mtime,mtimePrecision2)=>{if(err2)return options.fs.rmdir(lockfilePath,()=>{}),callback(err2);callback(null,mtime,mtimePrecision2)});if(err.code!=="EEXIST")return callback(err);if(options.stale<=0)return callback(Object.assign(Error("Lock file is already being held"),{code:"ELOCKED",file:file2}));options.fs.stat(lockfilePath,(err2,stat4)=>{if(err2){if(err2.code==="ENOENT")return acquireLock(file2,{...options,stale:0},callback);return callback(err2)}if(!isLockStale(stat4,options))return callback(Object.assign(Error("Lock file is already being held"),{code:"ELOCKED",file:file2}));removeLock(file2,options,(err3)=>{if(err3)return callback(err3);acquireLock(file2,{...options,stale:0},callback)})})})}function isLockStale(stat4,options){return stat4.mtime.getTime()<Date.now()-options.stale}function removeLock(file2,options,callback){options.fs.rmdir(getLockFile(file2,options),(err)=>{if(err&&err.code!=="ENOENT")return callback(err);callback()})}function updateLock(file2,options){let lock2=locks[file2];if(lock2.updateTimeout)return;if(lock2.updateDelay=lock2.updateDelay||options.update,lock2.updateTimeout=setTimeout(()=>{lock2.updateTimeout=null,options.fs.stat(lock2.lockfilePath,(err,stat4)=>{let isOverThreshold=lock2.lastUpdate+options.stale<Date.now();if(err){if(err.code==="ENOENT"||isOverThreshold)return setLockAsCompromised(file2,lock2,Object.assign(err,{code:"ECOMPROMISED"}));return lock2.updateDelay=1000,updateLock(file2,options)}if(lock2.mtime.getTime()!==stat4.mtime.getTime())return setLockAsCompromised(file2,lock2,Object.assign(Error("Unable to update lock within the stale threshold"),{code:"ECOMPROMISED"}));let mtime=mtimePrecision.getMtime(lock2.mtimePrecision);options.fs.utimes(lock2.lockfilePath,mtime,mtime,(err2)=>{let isOverThreshold2=lock2.lastUpdate+options.stale<Date.now();if(lock2.released)return;if(err2){if(err2.code==="ENOENT"||isOverThreshold2)return setLockAsCompromised(file2,lock2,Object.assign(err2,{code:"ECOMPROMISED"}));return lock2.updateDelay=1000,updateLock(file2,options)}lock2.mtime=mtime,lock2.lastUpdate=Date.now(),lock2.updateDelay=null,updateLock(file2,options)})})},lock2.updateDelay),lock2.updateTimeout.unref)lock2.updateTimeout.unref()}function setLockAsCompromised(file2,lock2,err){if(lock2.released=!0,lock2.updateTimeout)clearTimeout(lock2.updateTimeout);if(locks[file2]===lock2)delete locks[file2];lock2.options.onCompromised(err)}function lock(file2,options,callback){options={stale:1e4,update:null,realpath:!0,retries:0,fs:fs4,onCompromised:(err)=>{throw err},...options},options.retries=options.retries||0,options.retries=typeof options.retries==="number"?{retries:options.retries}:options.retries,options.stale=Math.max(options.stale||0,2000),options.update=options.update==null?options.stale/2:options.update||0,options.update=Math.max(Math.min(options.update,options.stale/2),1000),resolveCanonicalPath(file2,options,(err,file3)=>{if(err)return callback(err);let operation=retry.operation(options.retries);operation.attempt(()=>{acquireLock(file3,options,(err2,mtime,mtimePrecision2)=>{if(operation.retry(err2))return;if(err2)return callback(operation.mainError());let lock2=locks[file3]={lockfilePath:getLockFile(file3,options),mtime,mtimePrecision:mtimePrecision2,options,lastUpdate:Date.now()};updateLock(file3,options),callback(null,(releasedCallback)=>{if(lock2.released)return releasedCallback&&releasedCallback(Object.assign(Error("Lock is already released"),{code:"ERELEASED"}));unlock(file3,{...options,realpath:!1},releasedCallback)})})})})}function unlock(file2,options,callback){options={fs:fs4,realpath:!0,...options},resolveCanonicalPath(file2,options,(err,file3)=>{if(err)return callback(err);let lock2=locks[file3];if(!lock2)return callback(Object.assign(Error("Lock is not acquired/owned by you"),{code:"ENOTACQUIRED"}));lock2.updateTimeout&&clearTimeout(lock2.updateTimeout),lock2.released=!0,delete locks[file3],removeLock(file3,options,callback)})}function check2(file2,options,callback){options={stale:1e4,realpath:!0,fs:fs4,...options},options.stale=Math.max(options.stale||0,2000),resolveCanonicalPath(file2,options,(err,file3)=>{if(err)return callback(err);options.fs.stat(getLockFile(file3,options),(err2,stat4)=>{if(err2)return err2.code==="ENOENT"?callback(null,!1):callback(err2);return callback(null,!isLockStale(stat4,options))})})}function getLocks(){return locks}onExit(()=>{for(let file2 in locks){let options=locks[file2].options;try{options.fs.rmdirSync(getLockFile(file2,options))}catch(e){}}});exports.lock=lock;exports.unlock=unlock;exports.check=check2;exports.getLocks=getLocks});var require_adapter=__commonJS((exports,module)=>{var fs4=require_graceful_fs();function createSyncFs(fs5){let methods=["mkdir","realpath","stat","rmdir","utimes"],newFs={...fs5};return methods.forEach((method)=>{newFs[method]=(...args2)=>{let callback=args2.pop(),ret;try{ret=fs5[`${method}Sync`](...args2)}catch(err){return callback(err)}callback(null,ret)}}),newFs}function toPromise(method){return(...args2)=>new Promise((resolve4,reject)=>{args2.push((err,result)=>{if(err)reject(err);else resolve4(result)}),method(...args2)})}function toSync(method){return(...args2)=>{let err,result;if(args2.push((_err,_result)=>{err=_err,result=_result}),method(...args2),err)throw err;return result}}function toSyncOptions(options){if(options={...options},options.fs=createSyncFs(options.fs||fs4),typeof options.retries==="number"&&options.retries>0||options.retries&&typeof options.retries.retries==="number"&&options.retries.retries>0)throw Object.assign(Error("Cannot use retries with the sync api"),{code:"ESYNC"});return options}module.exports={toPromise,toSync,toSyncOptions}});var require_proper_lockfile=__commonJS((exports,module)=>{var lockfile=require_lockfile(),{toPromise,toSync,toSyncOptions}=require_adapter();async function lock(file2,options){let release=await toPromise(lockfile.lock)(file2,options);return toPromise(release)}function lockSync(file2,options){let release=toSync(lockfile.lock)(file2,toSyncOptions(options));return toSync(release)}function unlock(file2,options){return toPromise(lockfile.unlock)(file2,options)}function unlockSync(file2,options){return toSync(lockfile.unlock)(file2,toSyncOptions(options))}function check2(file2,options){return toPromise(lockfile.check)(file2,options)}function checkSync(file2,options){return toSync(lockfile.check)(file2,toSyncOptions(options))}module.exports=lock;module.exports.lock=lock;module.exports.unlock=unlock;module.exports.lockSync=lockSync;module.exports.unlockSync=unlockSync;module.exports.check=check2;module.exports.checkSync=checkSync});var SwarmError;var init_errors3=__esm(()=>{SwarmError=class SwarmError extends Error{code;guidance;constructor(message,code,guidance){super(message);this.name="SwarmError",this.code=code,this.guidance=guidance}}});function escapeRegex2(s){return s.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function simpleGlobToRegex(pattern,flags="i"){let escaped=pattern.split("*").map((starSegment)=>starSegment.split("?").map(escapeRegex2).join(".")).join(".*");return new RegExp(`^${escaped}$`,flags)}var init_utils=__esm(()=>{init_errors3();init_logger();init_merge()});import{randomBytes}from"node:crypto";import*as fs4 from"node:fs";import*as path6 from"node:path";function matchTempGrammar(basename2){return SWARM_TEMP_GRAMMARS.find((g)=>g.match.test(basename2))}function parseTargetBasename(basename2){for(let g of SWARM_TEMP_GRAMMARS){if(!g.parsesTarget)continue;let m=g.match.exec(basename2);if(m?.[1])return m[1]}return null}function assertWellFormedTargetPath(targetPath){if(!path6.isAbsolute(targetPath))throw Error(`atomic-write target must be absolute: ${targetPath}`);if(/[\0-\x1f\x7f]/.test(targetPath))throw Error("atomic-write target contains control characters");if(/[*?]/.test(targetPath)||/(^|[/\\])\{[^}]*\}([/\\]|$)/.test(targetPath))throw Error(`atomic-write target contains glob metacharacters: ${targetPath}`);if(/(^|[/\\])~([/\\]|$)/.test(targetPath))throw Error("atomic-write target contains unresolved home-dir marker (~)");if(/\$\{?[A-Za-z_][A-Za-z0-9_]*\}?/.test(targetPath)||/%[^/\\%]+%/.test(targetPath))throw Error("atomic-write target contains unresolved environment-variable form")}function lstatNotSymlink(p,what){if(fs4.lstatSync(p).isSymbolicLink())throw Error(`${what} is a symlink/reparse point: ${p}`)}function assertSwarmContainedTarget(targetPath){assertWellFormedTargetPath(targetPath);let resolved=path6.normalize(path6.resolve(targetPath)),segments=resolved.split(path6.sep),swarmIdx=-1;for(let i=segments.length-2;i>=1;i--)if(segments[i]===".swarm"){swarmIdx=i;break}if(swarmIdx===-1)throw Error(`atomic-write target is not under a project .swarm root: ${targetPath}`);let swarmRoot=segments.slice(0,swarmIdx+1).join(path6.sep);try{let st=fs4.lstatSync(swarmRoot);if(!st.isDirectory()||st.isSymbolicLink())throw Error(`.swarm root is not a real directory (symlink/reparse or non-dir): ${swarmRoot}`)}catch(err){if(err?.code!=="ENOENT")throw err}let rel=path6.relative(swarmRoot,resolved);if(!rel||rel.startsWith("..")||path6.isAbsolute(rel))throw Error(`atomic-write target escapes .swarm root: ${targetPath}`);let probe=swarmRoot;for(let seg of rel.split(path6.sep)){if(probe=path6.join(probe,seg),!fs4.existsSync(probe))break;lstatNotSymlink(probe,"path segment under .swarm")}return{projectRoot:path6.dirname(swarmRoot),swarmRoot}}function noteRecentWriteActivity(resolvedTarget){recentWriteActivity.delete(resolvedTarget),recentWriteActivity.set(resolvedTarget,Date.now());while(recentWriteActivity.size>MAX_RECENT_WRITE_TRACKED_PATHS){let oldest=recentWriteActivity.keys().next().value;if(oldest===void 0)break;recentWriteActivity.delete(oldest)}}function clearRecentWriteActivity(targetPath){return recentWriteActivity.delete(path6.resolve(targetPath))}function wasRecentlyWrittenByThisProcess(targetPath,withinMs=RECENT_WRITE_WINDOW_MS){let last=recentWriteActivity.get(path6.resolve(targetPath));if(last===void 0)return!1;return Date.now()-last<=withinMs}function toBuffer(content){if(typeof content==="string")return Buffer.from(content,"utf-8");return content}function syncSleep(ms){try{Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,ms)}catch{let start=Date.now();while(Date.now()-start<ms);}}function renameWithRetry(tempPath,targetPath){let lastError;for(let attempt=0;attempt<=RENAME_RETRY_DELAYS_MS.length;attempt++)try{_internals8.renameSync(tempPath,targetPath);return}catch(err){lastError=err;let code=err?.code;if(!code||!RETRYABLE_RENAME_CODES.has(code))throw err;if(attempt<RENAME_RETRY_DELAYS_MS.length)syncSleep(RENAME_RETRY_DELAYS_MS[attempt])}throw lastError}function writeAtomicSync(targetPath,content,options){if(options?.contained!==!1)assertSwarmContainedTarget(targetPath);else assertWellFormedTargetPath(targetPath);let resolvedTarget=path6.resolve(targetPath);noteRecentWriteActivity(resolvedTarget);let buffer=toBuffer(content),maxBytes=options?.maxBytes??MAX_ATOMIC_WRITE_BYTES;if(buffer.byteLength>maxBytes)throw Error(`atomic write exceeds ${maxBytes} byte bound: ${buffer.byteLength}`);let tempPath=`${resolvedTarget}.${_internals8.randomSuffix()}.tmp`;fs4.mkdirSync(path6.dirname(tempPath),{recursive:!0});try{try{let fd=fs4.openSync(tempPath,"wx",options?.mode);try{let written=0;while(written<buffer.byteLength)written+=_internals8.writeSync(fd,buffer,written,buffer.byteLength-written);if(options?.skipFsync!==!0)try{_internals8.fsyncSync(fd)}catch{}}finally{fs4.closeSync(fd)}renameWithRetry(tempPath,resolvedTarget)}finally{try{_internals8.unlinkSync(tempPath)}catch{}}}catch(error49){throw clearRecentWriteActivity(resolvedTarget),error49}try{let dirFd=fs4.openSync(path6.dirname(resolvedTarget),"r");try{fs4.fsyncSync(dirFd)}finally{fs4.closeSync(dirFd)}}catch{}invalidateCachedArtifact(resolvedTarget),noteRecentWriteActivity(resolvedTarget)}async function atomicWriteSwarmFile(targetPath,content,options){await new Promise((resolve5)=>setImmediate(resolve5)),writeAtomicSync(targetPath,content,options)}function atomicWriteSwarmFileSync(targetPath,content,options){writeAtomicSync(targetPath,content,options)}async function atomicWriteFileAnyRoot(targetPath,content,options){await new Promise((resolve5)=>setImmediate(resolve5)),writeAtomicSync(targetPath,content,{...options,contained:!1})}var UUID_RE="[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}",SWARM_TEMP_GRAMMARS,WRITER_CLASSIFICATION,MAX_ATOMIC_WRITE_BYTES=268435456,RENAME_RETRY_DELAYS_MS,RETRYABLE_RENAME_CODES,MAX_RECENT_WRITE_TRACKED_PATHS=256,RECENT_WRITE_WINDOW_MS=500,recentWriteActivity,_internals8;var init_atomic_write=__esm(()=>{init_swarm_artifact_cache();SWARM_TEMP_GRAMMARS=[{id:"canonical-v1",era:"canonical",match:/^(.+)\.[0-9a-f]{32}\.tmp$/,token:"instance",quarantineEligible:!0,parsesTarget:!0,producers:["src/utils/atomic-write.ts:atomicWriteSwarmFile","src/utils/atomic-write.ts:atomicWriteFileAnyRoot"]},{id:"target-suffix-tmp-uuid",era:"current",match:new RegExp(`^(.+)\\.tmp\\.${UUID_RE}$`),token:"instance",quarantineEligible:!0,parsesTarget:!0,producers:["src/commands/handoff.ts (pre-#2035; site=handoff.md; migrated-to=src/commands/handoff.ts:handleHandoffCommand)","src/commands/handoff.ts (pre-#2035; site=handoff-prompt.md; migrated-to=src/commands/handoff.ts:handleHandoffCommand)","src/memory/local-jsonl-provider.ts:1288","src/config/bundled-skills.ts:259"]},{id:"target-suffix-tmp-pid-uuid",era:"current",match:new RegExp(`^(.+)\\.tmp\\.\\d+\\.${UUID_RE}$`),token:"instance",quarantineEligible:!0,parsesTarget:!0,producers:["src/hooks/pr-workflow-gate.ts (pre-#2385; migrated-to=src/pr-review/persistence.ts:writeAtomicJson)"],note:"pre/post-rename file-identity verification (assertOpened/ClosedSwarmFileIdentity, pr-workflow-gate.ts:17880-17980) is writer-specific and load-bearing"},{id:"target-suffix-tmp-num-num-json",era:"current",match:/^(.+)\.tmp\.\d+\.\d+\.json$/,token:"instance",quarantineEligible:!0,parsesTarget:!0,producers:["src/hooks/issue-trace-state.ts:466"],note:"the .json terminator keeps this shape distinct from the bare two-token family — declared before it so first-match wins"},{id:"target-suffix-tmp-num-alnum",era:"current",match:/^(.+)\.tmp\.\d+\.[0-9a-z]+$/,token:"instance",quarantineEligible:!0,parsesTarget:!0,producers:["src/evidence/task-file.ts (pre-#2035; migrated-to=src/evidence/task-file.ts:atomicWriteFile)","src/scope/scope-persistence.ts (pre-#2035; migrated-to=src/scope/scope-persistence.ts:atomicWrite)","src/scope/scope-persistence.ts (pre-#2035; migrated-to=src/scope/scope-persistence.ts:atomicWriteSync)","src/plan/manager.ts:688","src/plan/manager.ts:2115","src/plan/manager.ts:2175","src/review/evidence.ts:179","src/turbo/lean/evidence.ts:182","src/summaries/manager.ts:163","src/evidence/manager.ts:288","src/evidence/manager.ts:456","src/tools/sast-baseline.ts:199","src/tools/repo-graph/storage.ts:543","src/memory/reflection-service.ts (pre-#2035; migrated-to=src/memory/reflection-service.ts:atomicWrite)","src/hooks/review-receipt.ts:609","src/hooks/review-receipt.ts:675","src/hooks/review-receipt.ts:894","src/knowledge/identity.ts:234","src/evidence/phase-participation.ts (pre-#2035; migrated-to=src/evidence/phase-participation.ts:atomicWriteBytes)","src/turbo/lean/integration.ts:428","src/turbo/lean/reviewer.ts:403","src/plan/ledger.ts:1471","src/services/synonym-map.ts:389","src/services/skill-optimizer/store.ts:340","src/services/skill-optimizer/store.ts:503","src/commands/archive-sqlite.ts:318","src/memory/jsonl-migration.ts:161"],note:"fsync-discipline / lock-scoped fd writers whose temp naming is pinned by their own durability test suites (plan-durability invariant 5, #2034 crash matrix); grammars registered here so their residue stays discoverable"},{id:"target-suffix-tmp-token",era:"current",match:/^(.+)\.tmp\.[0-9a-z-]{6,}$/,token:"instance",quarantineEligible:!0,parsesTarget:!0,producers:["src/turbo/lean/state.ts:129","src/turbo/lean/recovery.ts:175","src/hooks/delegation-gate/worktree-merge-status.ts:110","src/plan/ledger.ts:606"]},{id:"target-suffix-tmp-dash",era:"current",match:/^(.+)\.tmp-\d+-[0-9a-z-]+$/,token:"instance",quarantineEligible:!0,parsesTarget:!0,producers:["src/services/skill-evaluator.ts (pre-#2035; migrated-to=src/services/skill-evaluator.ts:atomicWrite)","src/services/skill-improver.ts (pre-#2035; migrated-to=src/services/skill-improver.ts:atomicWrite)","src/services/skill-consolidation.ts (pre-#2035; migrated-to=src/services/skill-consolidation.ts:atomicWrite)","src/services/skill-generator.ts (pre-#2035; migrated-to=src/services/skill-generator.ts:atomicWrite)","src/tools/spec-write.ts:98","src/sdd/effective-spec.ts:1377","src/background/lane-output-store.ts:353","src/background/pending-delegations.ts:1520","src/background/delegation-health.ts:391","src/tools/submit-phase-council-verdicts.ts:458","src/summaries/store.ts (pre-#2035; migrated-to=src/summaries/store.ts:writeRawSidecar)","src/retention/jsonl-cap.ts:213","src/services/skill-changelog.ts:58"],note:"background lane/delegation stores keep bounded-retry rename semantics wired into their callers (#2034/#2276 delivery contracts); migration candidates for a follow-up but grammars registered"},{id:"target-suffix-tmp-dash-num",era:"current",match:/^(.+)\.tmp-\d+$/,token:"instance",quarantineEligible:!0,parsesTarget:!0,producers:["src/services/skill-improver-quota.ts:114"]},{id:"target-dot-pid-uuid-tmp",era:"current",match:new RegExp(`^(.+)\\.\\d+\\.${UUID_RE}\\.tmp$`),token:"instance",quarantineEligible:!0,parsesTarget:!0,producers:["src/hooks/knowledge-receipt-ledger-storage.ts:591"],note:"pre/post-rename file-identity verification (existingFileIdentity checks, knowledge-receipt-ledger-storage.ts:544-591) is writer-specific and load-bearing"},{id:"dot-numeric-instance-tmp",era:"current",match:/^\..+(?:\.\d+){2,4}\.[0-9a-z]+\.tmp$/,token:"instance",quarantineEligible:!0,parsesTarget:!1,producers:["src/utils/bun-compat.ts:138","src/tools/repo-graph/freshness.ts:171"],note:"bunWrite Node-fallback internal temp and the repo-graph fingerprint temp (2-4 numeric token groups); leading-dot temps are standalone, target not parsed"},{id:"dot-uuid-instance-tmp",era:"current",match:new RegExp(`^\\..+\\.${UUID_RE}\\.tmp$`),token:"instance",quarantineEligible:!0,parsesTarget:!0,producers:["src/tools/write-pr-review-artifact.ts:154","src/tools/write-pr-review-artifact.ts:174","src/tools/write-pr-review-trigger-eval.ts:createTriggerReceipt"],note:"bundled-skills writes outside .swarm (project skill roots) and keeps its own contained-directory logic (invariant 4 bundled-skill ownership)"},{id:"tmp-prefix-named",era:"legacy",match:/^\.tmp-.+-\d+-\d+$/,token:"instance",quarantineEligible:!0,parsesTarget:!1,producers:["src/commands/issue.ts (pre-#2035; migrated-to=src/commands/issue.ts:atomicWriteFileSync)"],note:"prefix form embeds the filename; target not reliably parseable (dashes), so eligibility relies on the age/tracked/symlink/lock gates"},{id:"target-rebuild-close",era:"current",match:/^(.+)\.(?:rebuild|close)\.\d+\.[0-9a-z]+$/,token:"instance",quarantineEligible:!0,parsesTarget:!0,producers:["src/plan/manager.ts:2374","src/plan/manager.ts:2436"],note:"plan-durability (invariant 5) fd-write paths; grammars registered, writers unchanged in this PR"},{id:"target-migration-pid",era:"current",match:/^(.+)\.migration-\d+$/,token:"instance",quarantineEligible:!0,parsesTarget:!0,producers:["src/scope/scope-persistence.ts (pre-#2035; migrated-to=src/scope/scope-persistence.ts:atomicWriteSync)"]},{id:"dot-tmp-prefix-legacy",era:"legacy",match:/^\.tmp\..+$/,token:"constant",quarantineEligible:!0,parsesTarget:!1,producers:["pre-7.x writers (pre-#2035; scanner=src/services/swarm-residue.ts:collectCandidates)"],note:"legacy prefix grammar: issue #2035 req 7 preserves its handling — stale instances are quarantined (formerly unlinked) under the same eligibility gates"},{id:"dot-constant-tmp",era:"current",match:/^\..+\.tmp$/,token:"constant",quarantineEligible:!1,parsesTarget:!1,producers:["src/tools/write-drift-evidence.ts:275","src/tools/write-mutation-evidence.ts:169","src/tools/write-hallucination-evidence.ts:121","src/tools/write-final-council-evidence.ts:403"],note:"constant-name temps: no per-invocation token — reported when stale, never auto-quarantined (may be an in-flight writer of any process)"},{id:"target-constant-tmp",era:"current",match:/^(.+)\.tmp$/,token:"constant",quarantineEligible:!1,parsesTarget:!1,producers:["src/tools/checkpoint.ts:205","src/full-auto/state.ts:637","src/context-map/persistence.ts:135","src/context-map/capsule-persistence.ts:111","src/test-impact/history-store.ts:297","src/test-impact/history-store.ts:302","src/test-impact/history-store.ts:429","src/test-impact/history-store.ts:435","src/hooks/promotion-evidence-store.ts:112","src/hooks/skill-usage-log.ts:1165","src/hooks/skill-usage-log.ts:1675","src/hooks/skill-usage-pending.ts:817","src/parallel/file-locks.ts:113","src/plan/ledger.ts:607","src/plan/ledger.ts:1793"],note:"constant-name temps: reported when stale, never auto-quarantined. file-locks meta sidecars live under the scanner-skipped .swarm/locks/ subtree; the ledger reconcile temp embeds instance tokens but its .tmp-suffix shape maps here (conservatively report-only)"}];WRITER_CLASSIFICATION=Object.freeze({"src/commands/close.ts":"migrated","src/commands/close/context.ts":"reader-only","src/commands/close/clean-stage.ts":"reader-only","src/commands/handoff.ts":"migrated","src/commands/simulate.ts":"migrated","src/commands/coupling.ts":"migrated","src/commands/issue.ts":"migrated","src/evidence/task-file.ts":"migrated","src/evidence/phase-participation.ts":"migrated","src/memory/reflection-service.ts":"migrated","src/scope/scope-persistence.ts":"migrated","src/background/stage-b-dispatch-binding-store.ts":"migrated","src/services/skill-consolidation.ts":"migrated","src/services/skill-evaluator.ts":"migrated","src/services/skill-generator.ts":"migrated","src/services/skill-improver.ts":"migrated","src/summaries/store.ts":"migrated","src/prm/trajectory-store.ts":"migrated","src/observability/otlp-exporter.ts":"registered-bespoke","src/retention/jsonl-cap.ts":"registered-bespoke","src/services/skill-changelog.ts":"registered-bespoke","src/background/delegation-health.ts":"registered-bespoke","src/background/lane-output-store.ts":"registered-bespoke","src/background/pending-delegations.ts":"registered-bespoke","src/commands/archive-sqlite.ts":"registered-bespoke","src/context-map/capsule-persistence.ts":"registered-bespoke","src/context-map/persistence.ts":"registered-bespoke","src/context-map/telemetry.ts":"registered-bespoke","src/events/core-events.ts":"registered-bespoke","src/hooks/guardrails/shell-audit-store.ts":"registered-bespoke","src/evidence/documents-retention.ts":"registered-bespoke","src/evidence/manager.ts":"registered-bespoke","src/full-auto/state.ts":"registered-bespoke","src/hooks/delegation-gate/worktree-merge-status.ts":"registered-bespoke","src/hooks/delegation-gate/worktree-provisioning-owner.ts":"migrated","src/hooks/issue-trace-state.ts":"registered-bespoke","src/hooks/knowledge-receipt-ledger-storage.ts":"registered-bespoke","src/hooks/pr-workflow-gate.ts":"registered-bespoke","src/pr-review/authorization.ts":"registered-bespoke","src/pr-review/persistence.ts":"registered-bespoke","src/hooks/promotion-evidence-store.ts":"registered-bespoke","src/hooks/review-receipt.ts":"registered-bespoke","src/hooks/skill-usage-log.ts":"registered-bespoke","src/hooks/skill-usage-pending.ts":"registered-bespoke","src/knowledge/identity.ts":"registered-bespoke","src/memory/jsonl-migration.ts":"external","src/memory/local-jsonl-provider.ts":"registered-bespoke","src/plan/ledger.ts":"registered-bespoke","src/plan/manager.ts":"registered-bespoke","src/review/evidence.ts":"registered-bespoke","src/sdd/effective-spec.ts":"registered-bespoke","src/services/skill-improver-quota.ts":"registered-bespoke","src/services/skill-optimizer/activation.ts":"external","src/services/skill-optimizer/store.ts":"registered-bespoke","src/services/skill-reviser.ts":"external","src/services/synonym-map.ts":"registered-bespoke","src/session/snapshot-writer.ts":"registered-bespoke","src/summaries/manager.ts":"registered-bespoke","src/test-impact/history-store.ts":"registered-bespoke","src/turbo/lean/evidence.ts":"registered-bespoke","src/turbo/lean/integration.ts":"registered-bespoke","src/turbo/lean/recovery.ts":"registered-bespoke","src/turbo/lean/reviewer.ts":"registered-bespoke","src/turbo/lean/state.ts":"registered-bespoke","src/tools/apply-patch.ts":"external","src/tools/checkpoint.ts":"registered-bespoke","src/tools/record-implementation-review.ts":"migrated","src/tools/record-issue-publication.ts":"migrated","src/tools/record-issue-reproduction.ts":"migrated","src/tools/record-recurrence-sweep.ts":"migrated","src/tools/record-branch-freshness.ts":"migrated","src/tools/record-trace-validation.ts":"migrated","src/tools/record-merge-approval.ts":"migrated","src/tools/repo-graph/freshness.ts":"registered-bespoke","src/tools/repo-graph/storage.ts":"registered-bespoke","src/tools/sast-baseline.ts":"registered-bespoke","src/tools/spec-write.ts":"registered-bespoke","src/tools/submit-phase-council-verdicts.ts":"registered-bespoke","src/tools/write-drift-evidence.ts":"registered-bespoke","src/tools/write-final-council-evidence.ts":"registered-bespoke","src/tools/write-hallucination-evidence.ts":"registered-bespoke","src/tools/write-mutation-evidence.ts":"registered-bespoke","src/tools/write-pr-review-artifact.ts":"registered-bespoke","src/tools/write-pr-review-trigger-eval.ts":"registered-bespoke","src/config/bundled-skills.ts":"external","src/services/config-doctor.ts":"external","src/parallel/file-locks.ts":"registered-bespoke","src/utils/bun-compat.ts":"registered-bespoke","src/background/plan-sync-worker.ts":"reader-only","src/config/lane-permissions.ts":"reader-only","src/environment/profile.ts":"reader-only","src/worktree/core.ts":"reader-only"});RENAME_RETRY_DELAYS_MS=[10,25,50,100,200],RETRYABLE_RENAME_CODES=new Set(["EPERM","EBUSY","EACCES","EEXIST"]),recentWriteActivity=new Map;_internals8={randomSuffix:()=>randomBytes(16).toString("hex"),writeSync:(fd,buffer,offset,length)=>fs4.writeSync(fd,buffer,offset,length),renameSync:(from,to)=>fs4.renameSync(from,to),unlinkSync:(p)=>fs4.unlinkSync(p),fsyncSync:(fd)=>fs4.fsyncSync(fd)}});import{spawn as nodeSpawn,spawnSync as nodeSpawnSync}from"node:child_process";import*as fsSync3 from"node:fs";import*as fsPromises2 from"node:fs/promises";import*as path7 from"node:path";function getBun(){return globalThis.Bun}function bunFile(filePath){let bun=getBun();if(bun?.file)return bun.file(filePath);let cachedSize;return{async text(){return fsPromises2.readFile(filePath,"utf-8")},async arrayBuffer(){let buf=await fsPromises2.readFile(filePath),ab=new ArrayBuffer(buf.byteLength);return new Uint8Array(ab).set(buf),ab},async exists(){try{return await fsPromises2.access(filePath,fsSync3.constants.F_OK),!0}catch{return!1}},get size(){if(cachedSize!==void 0)return cachedSize;try{cachedSize=fsSync3.statSync(filePath).size}catch{cachedSize=0}return cachedSize}}}async function bunWrite(filePath,data){let bun=getBun();if(bun?.write)return bun.write(filePath,data);let dir=path7.dirname(filePath),tempName=`.${path7.basename(filePath)}.${process.pid}.${Date.now()}.${tempCounter++}.${Math.random().toString(36).slice(2,10)}.tmp`,tempPath=path7.join(dir,tempName),buffer;if(typeof data==="string")buffer=data;else if(data instanceof ArrayBuffer)buffer=new Uint8Array(data);else if(ArrayBuffer.isView(data))buffer=new Uint8Array(data.buffer,data.byteOffset,data.byteLength);else buffer=new Uint8Array(0);try{await fsPromises2.mkdir(dir,{recursive:!0})}catch{}await fsPromises2.writeFile(tempPath,buffer);let lastError;for(let attempt=0;attempt<WINDOWS_RENAME_MAX_RETRIES;attempt++)try{await fsPromises2.rename(tempPath,filePath),lastError=void 0;break}catch(err){lastError=err;let code=err.code;if(code!=="EEXIST"&&code!=="EBUSY"&&code!=="EPERM")break;await new Promise((r)=>setTimeout(r,WINDOWS_RENAME_RETRY_DELAY_MS))}if(lastError){try{await fsPromises2.unlink(tempPath)}catch{}throw lastError}try{let dirFd=await fsPromises2.open(dir,"r");try{await dirFd.sync()}finally{await dirFd.close()}}catch{}return(await fsPromises2.stat(filePath)).size}function sleep(ms){let bun=getBun();if(bun?.sleep)return bun.sleep(ms);return new Promise((resolve5)=>setTimeout(resolve5,ms))}function collectGarbageBestEffort(){let bun=getBun();try{bun?.gc?.(!0)}catch{}}function bunHash(input){let bun=getBun();if(bun?.hash){let r=bun.hash(input);return typeof r==="bigint"?r:BigInt(r)}let bytes;if(typeof input==="string")bytes=new TextEncoder().encode(input);else if(input instanceof ArrayBuffer)bytes=new Uint8Array(input);else bytes=new Uint8Array(input.buffer,input.byteOffset,input.byteLength);let hash2=5381n;for(let b of bytes)hash2=hash2*33n+BigInt(b)&0xffffffffffffffffn;return hash2}async function killProcessTreeImpl(pid,signal,directKill,wasDetached){if(typeof pid!=="number"||pid<=0){directKill(signal);return}if(_internals9.platform()==="win32"){let taskkill;try{if(taskkill=_internals9.spawnTaskkill(["/PID",String(pid),"/T","/F"],{cwd:_internals9.cwd(),stdio:["ignore","ignore","ignore"],timeout:5000,killSignal:"SIGKILL",windowsHide:!0}),await new Promise((resolve5)=>{let settled=!1,finish=(value)=>{if(settled)return;settled=!0,resolve5(value)};taskkill?.once("error",()=>finish(!1)),taskkill?.once("exit",(code)=>finish(code===0))}))return}catch{}finally{try{taskkill?.kill("SIGKILL")}catch{}}throw directKill(signal),Error("Windows process-tree termination could not be confirmed")}if(wasDetached)try{process.kill(-pid,signal??"SIGKILL");return}catch{}directKill(signal)}function createProcessTreeKiller(pid,directKill,wasDetached){return(signal)=>killProcessTreeImpl(pid,signal,directKill,wasDetached)}function inspectSpawnCwd(cwd){try{return _internals9.statSync(cwd).isDirectory()?"directory":"not-directory"}catch(err){let code=typeof err==="object"&&err!==null&&"code"in err?err.code:void 0;if(code==="ENOENT"||code==="ENOTDIR")return"missing";if(code==="EACCES"||code==="EPERM")return"unreadable";return"unknown"}}function describeSpawnCwdFailure(cwd,executable,cause){let state2=inspectSpawnCwd(cwd);if(state2==="missing")return new SpawnCwdMissingError(cwd,"missing",executable,{cause});if(state2==="not-directory")return new SpawnCwdMissingError(cwd,"not-directory",executable,{cause});return null}function spawnErrorCode(err){if(typeof err!=="object"||err===null||!("code"in err))return;let code=err.code;return typeof code==="string"?code:void 0}function classifySpawnFailure(err,cwd){if(err instanceof SpawnCwdMissingError)return"cwd-missing";let code=spawnErrorCode(err);if(code===void 0||!AMBIGUOUS_SPAWN_CODES.has(code))return"other";if(cwd===void 0||cwd==="")return code==="ENOENT"?"binary-missing":"other";switch(inspectSpawnCwd(cwd)){case"missing":case"not-directory":return"cwd-missing";case"unreadable":case"unknown":return"cwd-unreadable";default:return code==="ENOENT"?"binary-missing":"other"}}function wrapSpawnFailure(error49,cwd,executable){let err=asError(error49);if(err instanceof SpawnCwdMissingError)return err;if(cwd===void 0||cwd==="")return err;if(classifySpawnFailure(err,cwd)!=="cwd-missing")return err;return describeSpawnCwdFailure(cwd,executable,err)??err}function normalizedMaxBuffer(value){return typeof value==="number"&&Number.isSafeInteger(value)&&value>0?value:DEFAULT_BUN_SPAWN_MAX_BUFFER_BYTES}function createOutputOverflowController(limit,requestKill){let error49,killRequested=!1,resolveCompleted,completed=new Promise((resolve5)=>{resolveCompleted=resolve5});return{get error(){return error49},completed,overflow(captured,total){if(error49)return;if(error49=new BunCompatOutputLimitError(limit,captured,total),killRequested)return;killRequested=!0;try{requestKill()}catch{}},complete(){resolveCompleted()}}}function streamFromNode(pipe2,limit,controller){if(!pipe2)return staticStream("");let mode,collected,collect=()=>{if(mode==="reader")return Promise.reject(TypeError("Subprocess output is already consumed by a reader"));if(mode="buffered",collected)return collected;return collected=new Promise((resolve5)=>{if(!pipe2){resolve5(Buffer.alloc(0));return}let chunks=[],captured=0,total=0,finished=!1,finish=()=>{if(finished)return;finished=!0,resolve5(Buffer.concat(chunks))};pipe2.on("data",(chunk)=>{let bytes=typeof chunk==="string"?Buffer.from(chunk):chunk;if(total+=bytes.byteLength,controller?.error||limit===void 0)return;let remaining=limit-captured;if(remaining>0){let retained=Buffer.from(bytes.subarray(0,remaining));chunks.push(retained),captured+=retained.byteLength}if(bytes.byteLength>remaining)controller?.overflow(captured,total)}),pipe2.on("end",finish),pipe2.on("close",finish),pipe2.on("error",finish)}).then(async(bytes)=>{if(await controller?.completed,controller?.error)throw controller.error;return bytes}),collected},toWebReadable=()=>{if(!pipe2)return new ReadableStream({start(controller2){controller2.close()}});let r=pipe2;if(typeof r.toWeb==="function")return r.toWeb();return new ReadableStream({start(controller2){pipe2.on("data",(chunk)=>{controller2.enqueue(typeof chunk==="string"?new TextEncoder().encode(chunk):new Uint8Array(chunk.buffer,chunk.byteOffset,chunk.byteLength))}),pipe2.on("end",()=>controller2.close()),pipe2.on("error",(err)=>controller2.error(err))},cancel(){let destroyable=pipe2;if(typeof destroyable.destroy==="function")try{destroyable.destroy()}catch{}}})},result={async text(){return(await collect()).toString("utf-8")},async bytes(){let b=await collect();return new Uint8Array(b.buffer,b.byteOffset,b.byteLength)},getReader(){if(mode!==void 0)throw TypeError("Subprocess output is already consumed");return mode="reader",toWebReadable().getReader()}};if(pipe2&&controller&&limit!==void 0)queueMicrotask(()=>{if(mode===void 0)collect().catch(()=>{return})});return result}function mapStdio(v){return v??"pipe"}function streamFromBun(stream,limit,controller){if(!stream||typeof stream!=="object")return{async text(){return""},async bytes(){return new Uint8Array(0)},getReader(){return new ReadableStream({start(controller2){controller2.close()}}).getReader()}};let candidate=stream,mode,collected,collect=()=>{if(mode==="reader")return Promise.reject(TypeError("Subprocess output is already consumed by a reader"));return mode="buffered",collected??=(async()=>{if(typeof candidate.getReader!=="function")return new Uint8Array(0);let reader=candidate.getReader(),chunks=[],captured=0,total=0;try{for(;;){let{done,value}=await reader.read();if(done)break;if(!value)continue;if(total+=value.byteLength,controller?.error||limit===void 0)continue;let remaining=limit-captured;if(remaining>0){let retained=value.slice(0,remaining);chunks.push(retained),captured+=retained.byteLength}if(value.byteLength>remaining)controller?.overflow(captured,total)}}finally{reader.releaseLock()}if(await controller?.completed,controller?.error)throw controller.error;let out=new Uint8Array(captured),offset=0;for(let chunk of chunks)out.set(chunk,offset),offset+=chunk.byteLength;return out})(),collected},result={async text(){return new TextDecoder().decode(await collect())},bytes:collect,getReader(){if(mode!==void 0)throw TypeError("Subprocess output is already consumed");return mode="reader",typeof candidate.getReader==="function"?candidate.getReader():new ReadableStream({start(streamController){streamController.close()}}).getReader()}};if(typeof candidate.getReader==="function"&&controller&&limit!==void 0)queueMicrotask(()=>{if(mode===void 0)collect().catch(()=>{return})});return result}function mergeEnvForChild(baseEnv,envOverrides){let hasExplicitBaseEnv=baseEnv!==void 0,baseSource=baseEnv??process.env,merged={};for(let[key,value]of Object.entries(baseSource))if(typeof value==="string")merged[key]=value;if(envOverrides)for(let[key,value]of Object.entries(envOverrides))if(value===null)delete merged[key];else merged[key]=value;if(Object.keys(merged).length===0)return hasExplicitBaseEnv?{}:void 0;return merged}function asError(value){return value instanceof Error?value:Error(String(value))}function staticStream(text){let bytes=new TextEncoder().encode(text);return{async text(){return text},async bytes(){return bytes},getReader(){return new ReadableStream({start(controller){if(bytes.byteLength>0)controller.enqueue(bytes);controller.close()}}).getReader()}}}function spawnCreationFailure(error49){return{stdout:streamFromBun(void 0),stderr:staticStream(error49.message),exited:Promise.resolve(SPAWN_CREATION_FAILURE_EXIT_CODE),exitCode:null,signalCode:null,spawnError:error49,kill(){},killTree:()=>Promise.resolve()}}function bunSpawn(cmd,options){let maxBuffer=normalizedMaxBuffer(options?.maxBuffer),bun=getBun();if(bun?.spawn){let mergedEnv2=mergeEnvForChild(options?.env,options?.envOverrides),spawnOpts={...options};if(delete spawnOpts.killProcessTree,delete spawnOpts.maxBuffer,mergedEnv2!==void 0)spawnOpts.env=mergedEnv2;if(options?.timeout&&options.timeout>0&&options.killProcessTree!==!0)spawnOpts.killSignal="SIGKILL";if(options?.killProcessTree===!0)delete spawnOpts.timeout,delete spawnOpts.killSignal,spawnOpts.detached=!0;let spawned;try{spawned=bun.spawn(cmd,spawnOpts)}catch(error49){return spawnCreationFailure(wrapSpawnFailure(error49,options?.cwd,cmd[0]??""))}let proc2=spawned,killBunTree=createProcessTreeKiller(proc2.pid,(sig)=>proc2.kill(sig),!0),killBunProcess=(sig)=>options?.killProcessTree?killBunTree(sig):Promise.resolve(proc2.kill(sig)),outputController2=createOutputOverflowController(maxBuffer,()=>{killBunProcess("SIGKILL").catch(()=>{return})}),timeoutHandle2;if(options?.killProcessTree===!0&&options.timeout&&options.timeout>0){if(timeoutHandle2=setTimeout(()=>{try{killBunProcess("SIGKILL").catch(()=>{return})}catch{}},options.timeout),typeof timeoutHandle2.unref==="function")timeoutHandle2.unref()}let exited2=proc2.exited.finally(()=>{if(timeoutHandle2!==void 0)clearTimeout(timeoutHandle2);outputController2.complete()});return{stdout:streamFromBun(proc2.stdout,maxBuffer,outputController2),stderr:streamFromBun(proc2.stderr,maxBuffer,outputController2),exited:exited2,get exitCode(){return proc2.exitCode},get signalCode(){return proc2.signalCode},kill(sig){killBunProcess(sig).catch(()=>{return})},killTree:killBunProcess}}let[file2,...args2]=cmd,detached=options?.killProcessTree===!0,mergedEnv=mergeEnvForChild(options?.env,options?.envOverrides),proc;try{proc=nodeSpawn(file2,args2,{cwd:options?.cwd,env:mergedEnv,detached,windowsHide:!0,windowsVerbatimArguments:options?.windowsVerbatimArguments,stdio:[mapStdio(options?.stdin),mapStdio(options?.stdout),mapStdio(options?.stderr)]})}catch(error49){return spawnCreationFailure(wrapSpawnFailure(error49,options?.cwd,file2))}let killChildTree=createProcessTreeKiller(proc.pid,(signal)=>proc.kill(signal),!0),killChild=(signal)=>{if(detached)return killChildTree(signal);return proc.kill(signal),Promise.resolve()},outputController=createOutputOverflowController(maxBuffer,()=>{killChild("SIGKILL").catch(()=>{return})}),timeoutHandle,observedSignal=null,observedSpawnError=null,exited=new Promise((resolve5)=>{if(proc.on("exit",(code,signal)=>{observedSignal=signal,resolve5(code??-1)}),proc.on("error",(error49)=>{observedSpawnError=wrapSpawnFailure(error49,options?.cwd,file2),resolve5(1)}),options?.timeout&&options.timeout>0){if(timeoutHandle=setTimeout(()=>{try{killChild("SIGKILL").catch(()=>{return})}catch{}},options.timeout),typeof timeoutHandle.unref==="function")timeoutHandle.unref()}}).finally(()=>{if(timeoutHandle!==void 0)clearTimeout(timeoutHandle);outputController.complete()});return{stdout:streamFromNode(proc.stdout,maxBuffer,outputController),stderr:streamFromNode(proc.stderr,maxBuffer,outputController),exited,get exitCode(){return observedSpawnError?null:proc.exitCode},get signalCode(){return observedSignal??proc.signalCode},get spawnError(){return observedSpawnError},kill(signal){killChild(signal).catch(()=>{return})},killTree:killChild}}function syncSpawnCreationFailure(error49){return{stdout:new Uint8Array(0),stderr:new TextEncoder().encode(error49.message),exitCode:SPAWN_CREATION_FAILURE_EXIT_CODE,success:!1}}function bunSpawnSync(cmd,options){let requestedCwd=Array.isArray(cmd)?options?.cwd:options?.cwd??cmd.cwd,executable=(Array.isArray(cmd)?cmd[0]:cmd.cmd[0])??"",bun=getBun();if(bun?.spawnSync){let mergedEnv2=mergeEnvForChild(options?.env,options?.envOverrides),spawnOpts={...options};if(delete spawnOpts.maxBuffer,mergedEnv2!==void 0)spawnOpts.env=mergedEnv2;try{return bun.spawnSync(cmd,spawnOpts)}catch(error49){return syncSpawnCreationFailure(wrapSpawnFailure(error49,requestedCwd,executable))}}let argv,mergedOptions;if(Array.isArray(cmd))argv=cmd,mergedOptions={...options??{}};else if(argv=cmd.cmd,mergedOptions={cwd:cmd.cwd,env:cmd.env,stdin:"pipe",timeout:cmd.timeout,...options??{}},cmd.stdin!==void 0)mergedOptions.stdin=cmd.stdin;let[file2,...args2]=argv,mergedEnv=mergeEnvForChild(mergedOptions.env,options?.envOverrides),result;try{result=nodeSpawnSync(file2,args2,{cwd:mergedOptions.cwd,env:mergedEnv,input:mergedOptions.stdin instanceof Uint8Array||typeof mergedOptions.stdin==="string"?mergedOptions.stdin:void 0,timeout:mergedOptions.timeout,windowsHide:!0})}catch(error49){return syncSpawnCreationFailure(wrapSpawnFailure(error49,mergedOptions.cwd,file2))}if(result.error){let wrapped=wrapSpawnFailure(result.error,mergedOptions.cwd,file2);if(wrapped instanceof SpawnCwdMissingError)return syncSpawnCreationFailure(wrapped)}let stdout=result.stdout instanceof Buffer?new Uint8Array(result.stdout.buffer,result.stdout.byteOffset,result.stdout.byteLength):typeof result.stdout==="string"?new TextEncoder().encode(result.stdout):new Uint8Array(0),stderr=result.stderr instanceof Buffer?new Uint8Array(result.stderr.buffer,result.stderr.byteOffset,result.stderr.byteLength):typeof result.stderr==="string"?new TextEncoder().encode(result.stderr):new Uint8Array(0),exitCode=result.status??(result.signal?128:1);return{stdout,stderr,exitCode,success:exitCode===0&&!result.error}}var WINDOWS_RENAME_MAX_RETRIES=3,WINDOWS_RENAME_RETRY_DELAY_MS=50,tempCounter=0,DEFAULT_BUN_SPAWN_MAX_BUFFER_BYTES=5242880,BunCompatOutputLimitError,_internals9,SpawnCwdMissingError,AMBIGUOUS_SPAWN_CODES,SPAWN_CREATION_FAILURE_EXIT_CODE=1;var init_bun_compat=__esm(()=>{BunCompatOutputLimitError=class BunCompatOutputLimitError extends Error{limit;captured;total;constructor(limit,captured,total){super(`Subprocess output exceeded the ${limit}-byte buffer limit after capturing ${captured} bytes (${total} bytes observed)`);this.name="BunCompatOutputLimitError",this.limit=limit,this.captured=captured,this.total=total}};_internals9={platform:()=>process.platform,cwd:()=>process.cwd(),spawnTaskkill:(args2,options)=>nodeSpawn("taskkill",args2,options),createProcessTreeKiller,statSync:(target)=>fsSync3.statSync(target)};SpawnCwdMissingError=class SpawnCwdMissingError extends Error{name="SpawnCwdMissingError";code="ENOENT";cwd;reason;executable;constructor(cwd,reason,executable,options){super(reason==="missing"?`cannot start "${executable}": working directory no longer exists: ${cwd}`:`cannot start "${executable}": working directory is not a directory: ${cwd}`,options);this.cwd=cwd,this.reason=reason,this.executable=executable}};AMBIGUOUS_SPAWN_CODES=new Set(["ENOENT","ENOTDIR","EACCES","EPERM"])});import*as fs5 from"node:fs";import*as path8 from"node:path";function isFailClosedHandler(value){return typeof value==="function"&&Object.hasOwn(value,"__failClosed")&&value.__failClosed===!0}function safeHook(fn2){return async(input,output)=>{try{await fn2(input,output)}catch(_error){let functionName=fn2.name||"unknown";if(_error instanceof SwarmError)warn(`Hook '${functionName}' failed: ${_error.message}
|
|
134
134
|
→ ${_error.guidance}`);else warn(`Hook function '${functionName}' failed:`,_error)}}}function composeHandlers(...fns){if(fns.length===0)return async()=>{};for(let fn2 of fns)if(isFailClosedHandler(fn2))throw Error("composeHandlers cannot wrap fail-closed handlers; use composeBlockingHandlers or await them directly");return async(input,output)=>{for(let fn2 of fns)await _internals10.safeHook(fn2)(input,output)}}function validateSwarmPath(directory,filename){if(/[\0]/.test(filename))throw Error("Invalid filename: contains null bytes");if(/\.\.[/\\]/.test(filename))throw Error("Invalid filename: path traversal detected");if(/^[A-Za-z]:[\\/]/.test(filename))throw Error("Invalid filename: path escapes .swarm directory");if(filename.startsWith("/"))throw Error("Invalid filename: path escapes .swarm directory");let baseDir=path8.normalize(path8.resolve(directory,".swarm")),resolved=path8.normalize(path8.resolve(baseDir,filename));if(process.platform==="win32"){if(!resolved.toLowerCase().startsWith((baseDir+path8.sep).toLowerCase()))throw Error("Invalid filename: path escapes .swarm directory")}else if(!resolved.startsWith(baseDir+path8.sep))throw Error("Invalid filename: path escapes .swarm directory");let realBaseDir;try{if(fs5.lstatSync(baseDir).isSymbolicLink())throw Error("Invalid filename: path escapes .swarm directory");realBaseDir=fs5.realpathSync(baseDir)}catch(error49){if(error49 instanceof Error&&error49.message==="Invalid filename: path escapes .swarm directory")throw error49;if(error49.code==="ENOENT")return resolved;throw Error("Invalid filename: failed to resolve .swarm directory")}let existingPath=resolved;while(!fs5.existsSync(existingPath)){let parent=path8.dirname(existingPath);if(parent===existingPath||!isPathWithin(parent,baseDir)){existingPath=baseDir;break}existingPath=parent}let realExistingPath;try{realExistingPath=fs5.realpathSync(existingPath)}catch(error49){if(error49.code==="ENOENT")realExistingPath=realBaseDir;else throw Error("Invalid filename: failed to resolve path")}if(!isPathWithin(realExistingPath,realBaseDir))throw Error("Invalid filename: path escapes .swarm directory");return resolved}function isPathWithin(candidate,base){let normalizedCandidate=path8.normalize(candidate),normalizedBase=path8.normalize(base);if(process.platform==="win32"){let candidateLower=normalizedCandidate.toLowerCase(),baseLower=normalizedBase.toLowerCase();return candidateLower===baseLower||candidateLower.startsWith(`${baseLower}${path8.sep}`)}return normalizedCandidate===normalizedBase||normalizedCandidate.startsWith(`${normalizedBase}${path8.sep}`)}async function readSwarmFileAsync(directory,filename,cache2,reader,useArtifactCache=!0){if(cache2!==void 0&&useArtifactCache){let key=`${directory}::${filename}`,cached2=cache2.get(key);if(cached2!==void 0)return cached2;let promise2=readSwarmFileAsync(directory,filename,void 0,reader,useArtifactCache);return cache2.set(key,promise2),promise2}let ENOENT_MAX_ATTEMPTS=5,ENOENT_RETRY_DELAY_MS=10,maxAttempts=6;for(let attempt=0;attempt<maxAttempts;attempt++){let resolvedPath="";try{resolvedPath=_internals10.validateSwarmPath(directory,filename);let read=async()=>{if(reader!==void 0)return reader(resolvedPath);return await bunFile(resolvedPath).text()};return useArtifactCache?await _internals10.readCachedTextFile(resolvedPath,read):await read()}catch(err){let code=err?.code;if(reader!==void 0&&(code===void 0||code==="ERR_ENCODING_INVALID_ENCODED_DATA"))throw err;if(code==="ENOENT"){if(!(resolvedPath!==""&&(wasRecentlyWrittenByThisProcess(resolvedPath,RECENT_WRITE_WINDOW_MS)||wasObservedToExist(resolvedPath))))return null;if(attempt>=ENOENT_MAX_ATTEMPTS-1)return null;await new Promise((resolve6)=>setTimeout(resolve6,ENOENT_RETRY_DELAY_MS));continue}if(!(code==="EBUSY"||code==="EPERM"||code==="EACCES")||attempt===maxAttempts-1)return null;let retryDelayMs=10*2**attempt;await new Promise((resolve6)=>setTimeout(resolve6,retryDelayMs))}}return null}function estimateTokensFromCharCount(chars){if(chars<=0)return 0;return Math.ceil(chars*TOKENS_PER_CHAR)}function estimateCharsForTokens(tokens){if(tokens<=0)return 0;return Math.floor(tokens/TOKENS_PER_CHAR)}function estimateTokens(text){if(!text)return 0;return estimateTokensFromCharCount(text.length)}var _internals10,TOKENS_PER_CHAR=0.33;var init_utils2=__esm(()=>{init_utils();init_atomic_write();init_bun_compat();init_swarm_artifact_cache();_internals10={safeHook,composeHandlers,validateSwarmPath,readSwarmFileAsync,readCachedTextFile}});import{createHash as createHash3}from"node:crypto";import{appendFileSync,mkdirSync as mkdirSync2}from"node:fs";import*as path9 from"node:path";function isBidiCodePoint(code){for(let i=0;i<BIDI_RANGES.length;i++){let[lo,hi]=BIDI_RANGES[i];if(code>=lo&&code<=hi)return!0}return!1}function sanitizeString(value){let result="";for(let i=0;i<value.length;i++){let code=value.codePointAt(i)??0;if(code>65535)result+=value[i],i++,result+=value[i];else if(code===0)result+="\\u0000";else if(code===27){if(i+1<value.length&&value[i+1]==="["){i++;while(i+1<value.length){let next=value.charCodeAt(i+1);if(next>=48&&next<=63)i++;else if(next>=32&&next<=47)i++;else if(next>=64&&next<=126){i++;break}else break}}else if(i+1<value.length&&value[i+1]==="]"){i++;while(i+1<value.length){let next=value.charCodeAt(i+1);if(next===7){i++;break}else if(next===27&&i+2<value.length&&value[i+2]==="\\"){i+=2;break}else i++}}else if(i+1<value.length){let next=value.charCodeAt(i+1);if(next>=32&&next<=47){i++;while(i+1<value.length){let b=value.charCodeAt(i+1);if(b>=48&&b<=126){i++;break}else if(b>=32&&b<=47)i++;else break}}else if(next>=48&&next<=126)i++}}else if(isBidiCodePoint(code));else result+=value[i]}return result}function sanitizeRecord(record2){for(let key of Object.keys(record2)){let value=record2[key];if(typeof value==="string")record2[key]=sanitizeString(value);else if(value!==null&&typeof value==="object")if(Array.isArray(value))for(let i=0;i<value.length;i++){let element=value[i];if(typeof element==="string")value[i]=sanitizeString(element);else if(element!==null&&typeof element==="object")sanitizeRecord(element)}else sanitizeRecord(value)}return record2}function computeBatchDigest(batchId){return createHash3(BATCH_DIGEST_ALGORITHM).update(batchId).digest("hex")}function sidecarRelativePath(batchDigest){return path9.join("lane-results",batchDigest,"candidates.jsonl")}function validateRecord(record2,schema,label){let result=schema.safeParse(record2);if(!result.success)throw Error(`Sidecar ${label} schema validation failed: ${result.error.issues.map((i)=>`${i.path.join(".")}: ${i.message}`).join("; ")}`)}function withLockfile(lockDir,write){let lockPath=path9.join(lockDir,".lock"),release=import_proper_lockfile.default.lockSync(lockPath,{realpath:!1});try{return write()}finally{release()}}function appendToSidecar(options,batchId,envelope,candidates,cleanAttestation){let batchDigest=options.batchDigest??computeBatchDigest(batchId),relPath=sidecarRelativePath(batchDigest),absPath=validateSwarmPath(options.projectRoot,relPath);validateRecord(envelope,SidecarEnvelopeSchema,"envelope");for(let i=0;i<candidates.length;i++)validateRecord(candidates[i],SidecarCandidateSchema,`candidate[${i}]`);if(cleanAttestation!==void 0)validateRecord(cleanAttestation,SidecarCleanAttestationSchema,"clean_attestation");mkdirSync2(path9.dirname(absPath),{recursive:!0});let sanitizedEnvelope=sanitizeRecord(structuredClone(envelope)),sanitizedCandidates=candidates.map((c)=>sanitizeRecord(structuredClone(c))),sanitizedCleanAttestation=cleanAttestation===void 0?void 0:sanitizeRecord(structuredClone(cleanAttestation)),lines=[JSON.stringify(sanitizedEnvelope)];if(sanitizedCleanAttestation)lines.push(JSON.stringify(sanitizedCleanAttestation));for(let candidate of sanitizedCandidates)lines.push(JSON.stringify(candidate));let payload=`${lines.join(`
|
|
135
135
|
`)}
|
|
136
136
|
`,doWrite=()=>{appendFileSync(absPath,payload,"utf-8")};if(options.useLockfile)withLockfile(path9.dirname(absPath),doWrite);else doWrite()}var import_proper_lockfile,BATCH_DIGEST_ALGORITHM="sha256",SidecarEnvelopeSchema,SidecarCleanAttestationSchema,SidecarCandidateCommon,SidecarCandidateSchema,BIDI_RANGES;var init_candidate_sidecar_store=__esm(()=>{init_zod();init_utils2();init_candidate_contract();import_proper_lockfile=__toESM(require_proper_lockfile(),1),SidecarEnvelopeSchema=exports_external.object({record_type:exports_external.literal("invocation"),source_output_ref:exports_external.string().min(1),source_batch_id:exports_external.string().min(1),source_lane_id:exports_external.string().min(1),source_agent:exports_external.string().min(1),source_digest:exports_external.string().regex(/^[a-f0-9]{64}$/),row_format_version:exports_external.number().int().nonnegative(),producer:exports_external.string().optional(),produced_at:exports_external.string().min(1),record_version:exports_external.object({major:exports_external.number().int().nonnegative(),minor:exports_external.number().int().nonnegative()}),sessionId:exports_external.string().min(1).optional(),parentSessionId:exports_external.string().min(1).optional(),format_families_detected:exports_external.array(exports_external.string()),candidate_count:exports_external.number().int().nonnegative(),parse_errors:exports_external.number().int().nonnegative(),malformed_rows:exports_external.number().int().nonnegative(),clean_attestation_count:exports_external.number().int().nonnegative().optional()}).strict(),SidecarCleanAttestationSchema=exports_external.discriminatedUnion("row_format_family",[exports_external.object({record_type:exports_external.literal("clean_attestation"),row_format_family:exports_external.literal("base_explorer"),row_format_version:exports_external.number().int().nonnegative(),record_version:exports_external.object({major:exports_external.number().int().nonnegative(),minor:exports_external.number().int().nonnegative()}),source_output_ref:exports_external.string().min(1),source_batch_id:exports_external.string().min(1),source_lane_id:exports_external.string().min(1),source_agent:exports_external.string().min(1),source_digest:exports_external.string().regex(/^[a-f0-9]{64}$/),extracted_from_partial_source:exports_external.literal(!1),sessionId:exports_external.string().min(1).optional(),parentSessionId:exports_external.string().min(1).optional(),producer:exports_external.string().optional(),lane:exports_external.string().min(1),coverage_scope:exports_external.string().min(CLEAN_COVERAGE_SCOPE_MIN_CHARS),evidence:exports_external.string().min(CLEAN_EVIDENCE_MIN_CHARS)}).strict(),exports_external.object({record_type:exports_external.literal("clean_attestation"),row_format_family:exports_external.literal("micro_lane"),row_format_version:exports_external.number().int().nonnegative(),record_version:exports_external.object({major:exports_external.number().int().nonnegative(),minor:exports_external.number().int().nonnegative()}),source_output_ref:exports_external.string().min(1),source_batch_id:exports_external.string().min(1),source_lane_id:exports_external.string().min(1),source_agent:exports_external.string().min(1),source_digest:exports_external.string().regex(/^[a-f0-9]{64}$/),extracted_from_partial_source:exports_external.literal(!1),sessionId:exports_external.string().min(1).optional(),parentSessionId:exports_external.string().min(1).optional(),producer:exports_external.string().optional(),micro_lane:exports_external.string().min(1),coverage_scope:exports_external.string().min(CLEAN_COVERAGE_SCOPE_MIN_CHARS),evidence:exports_external.string().min(CLEAN_EVIDENCE_MIN_CHARS)}).strict()]),SidecarCandidateCommon={record_type:exports_external.literal("candidate"),row_format_version:exports_external.number().int().nonnegative(),record_version:exports_external.object({major:exports_external.number().int().nonnegative(),minor:exports_external.number().int().nonnegative()}),source_output_ref:exports_external.string().min(1),source_batch_id:exports_external.string().min(1),source_lane_id:exports_external.string().min(1),source_agent:exports_external.string().min(1),source_digest:exports_external.string().regex(/^[a-f0-9]{64}$/),sessionId:exports_external.string().min(1).optional(),parentSessionId:exports_external.string().min(1).optional(),producer:exports_external.string().optional(),extracted_from_partial_source:exports_external.boolean(),candidate_id:exports_external.string().min(1),severity:exports_external.enum(CANDIDATE_SEVERITIES),category:exports_external.string().min(1),file_line:exports_external.string().min(1),claim:exports_external.string().min(1),evidence_summary:exports_external.string().min(1),confidence:exports_external.enum(CANDIDATE_CONFIDENCES),risk_impact:exports_external.enum(PR_REVIEW_RISK_IMPACTS).optional(),risk_tags:exports_external.array(exports_external.enum(PR_REVIEW_RISK_TAGS)).optional()},SidecarCandidateSchema=exports_external.discriminatedUnion("row_format_family",[exports_external.object({...SidecarCandidateCommon,row_format_family:exports_external.literal("base_explorer"),lane:exports_external.string().min(1),micro_lane:exports_external.null(),impact_context:exports_external.string().min(1),invariant_violated:exports_external.null()}).strict(),exports_external.object({...SidecarCandidateCommon,row_format_family:exports_external.literal("micro_lane"),lane:exports_external.null(),micro_lane:exports_external.string().min(1),impact_context:exports_external.null(),invariant_violated:exports_external.string().min(1)}).strict()]),BIDI_RANGES=[[8234,8238],[8294,8297]]});function detectRowFormatFamily(rowFields){let trimmed=rowFields.map((f)=>f.trim()),hasImpactContext=trimmed.length>7&&trimmed[7]!=="",hasInvariantViolated=trimmed.length>6&&trimmed[6]!=="";if(hasImpactContext&&!hasInvariantViolated)return"base_explorer";if(hasInvariantViolated&&!hasImpactContext)return"micro_lane";if(hasImpactContext&&hasInvariantViolated)return"base_explorer";throw new UnknownFormatFamilyError}function mapFields(fields,family){let trimmed=fields.map((f)=>f.trim()),names=CANDIDATE_FIELDS[family],result={};for(let i=0;i<names.length;i++)result[names[i]]=i<trimmed.length&&trimmed[i]!==""?trimmed[i]:null;if(family==="base_explorer")result.micro_lane=null,result.invariant_violated=null;else result.lane=null,result.impact_context=null;return result}function getRequiredFields(family){return CANDIDATE_REQUIRED_FIELDS[family]}function assertNonNullCandidateId(value){if(value===null||value==="")throw Error("Invariant violation: null/empty candidate_id reached candidate builder")}function buildInvocationEnvelope(input,flags,formatFamiliesDetected,candidateCount,parseErrors,malformedRows,cleanAttestationCount=0){return{record_type:"invocation",source_output_ref:input.output_ref,source_batch_id:input.batchId,source_lane_id:input.laneId,source_agent:input.agent,source_digest:input.digest,row_format_version:flags.row_format_version,sessionId:input.sessionId,parentSessionId:input.parentSessionId,...flags.producer?{producer:flags.producer}:{},produced_at:input.produced_at,record_version:RECORD_VERSION,format_families_detected:formatFamiliesDetected,candidate_count:candidateCount,parse_errors:parseErrors,malformed_rows:malformedRows,clean_attestation_count:cleanAttestationCount}}function buildEmptyDiagnostics(input,flags){return{candidate_count:0,parse_errors:0,parse_error_details:[],malformed_rows:0,duplicate_id_count:0,duplicate_id_warnings:[],degraded_source_count:flags.degraded?1:0,incomplete_source_count:input.transcriptIncomplete?1:0,format_families_detected:[],clean_attestation_count:0}}function refusalResult(errorCode,errorMessage,input,flags){let envelope=buildInvocationEnvelope(input,flags,[],0,0,0);return{error:errorMessage,error_code:errorCode,candidates:[],invocation_envelope:envelope,diagnostics:buildEmptyDiagnostics(input,flags)}}function detectFormatMismatchHint(text){if(text.trim()==="")return;let severityPattern=/\b(CRITICAL|HIGH|MEDIUM|LOW|INFO)\b/,fileLinePattern=/\b\S+\.[a-z]{1,4}:\d+\b/,hasSeverity=severityPattern.test(text),textForFileLine=text.replace(/\b\w+:\/\/\S*/g,""),hasFileLine=fileLinePattern.test(textForFileLine);if(hasSeverity&&hasFileLine)return"Lane output contains severity keywords and file:line references but no parseable [CANDIDATE] rows. The explorer may have emitted findings in prose format instead of pipe-delimited candidate rows.";if(hasSeverity)return"Lane output contains severity keywords but no parseable [CANDIDATE] rows. The explorer may have emitted findings in an unstructured format.";return}function emptyTextResult(input,flags){let envelope=buildInvocationEnvelope(input,flags,[],0,0,0),diagnostics=buildEmptyDiagnostics(input,flags),hint=detectFormatMismatchHint(input.text);if(hint)diagnostics.format_mismatch_hint=hint;return{candidates:[],invocation_envelope:envelope,diagnostics}}function parseCandidates(input,flags){let inputParse=ArtifactInputSchema.safeParse(input);if(!inputParse.success)throw Error(`Invalid ArtifactInput: ${inputParse.error.issues.map((issue2)=>issue2.message).join(", ")}`);let flagsParse=ParseFlagsSchema.safeParse(flags);if(!flagsParse.success)throw Error(`Invalid ParseFlags: ${flagsParse.error.issues.map((issue2)=>issue2.message).join(", ")}`);let validatedInput=inputParse.data,validatedFlags=flagsParse.data;if(validatedInput.artifact_status==="ref-not-found")return refusalResult("ref-not-found","Artifact reference not found in store",validatedInput,validatedFlags);if(validatedInput.artifact_status==="artifact-corrupted")return refusalResult("artifact-corrupted","Artifact data is corrupted",validatedInput,validatedFlags);if(validatedFlags.degraded&&!validatedFlags.accept_degraded)return refusalResult("degraded-source-refused","Degraded source refused by caller",validatedInput,validatedFlags);if(validatedInput.transcriptIncomplete===!0&&!validatedFlags.accept_partial)return refusalResult("partial-source-refused","Partial transcript refused by caller",validatedInput,validatedFlags);if(validatedInput.text.trim()==="")return emptyTextResult(validatedInput,validatedFlags);return parseText(validatedInput,validatedFlags)}function parseText(input,flags){let lines=removeCandidateCodeFences(input.text).split(`
|
|
@@ -1270,7 +1270,7 @@ ${warnings.map((w)=>`Detected signal: ${w}`).join(`
|
|
|
1270
1270
|
`).some((entry)=>entry.trim()===advisory.message);return text.includes(advisory.message)}))continue;let next={...current,schemaVersion:current.schemaVersion===4?4:3,advisoryInbox:{...advisory,state:"delivered",deliveredAt:now,preparation:void 0},updatedAt:now};appendRecord2(directory,next),acknowledged+=1}if(acknowledged>0)maybeCompactDelegationsLocked(directory)}),acknowledged}catch(err){return warn(`[background] acknowledgeObservedBackgroundAdvisories failed: ${err instanceof Error?err.message:String(err)}`),0}}async function releasePreparedBackgroundAdvisories(directory,parentSessionId,preparationId,eventIds){return releaseBackgroundAdvisoryPreparation(directory,parentSessionId,preparationId,eventIds)}function findByBatchIdDetailed(directory,batchId,opts){if(!batchId)return{status:"ok",value:[]};let read=readDelegationsDetailed(directory);if(read.status==="uncertain")return read;return{status:"ok",value:read.records.filter((record3)=>record3.batchId===batchId&&(opts?.parentSessionId===void 0||record3.parentSessionId===opts.parentSessionId))}}function findByBatchId(directory,batchId,opts){let outcome=findByBatchIdDetailed(directory,batchId,opts);return outcome.status==="ok"?outcome.value:[]}function findOpenAsyncLaneBatches(directory){return readDelegations(directory).filter((record3)=>record3.batchId!==void 0&&(record3.status==="pending"||record3.status==="running"))}function isTerminal(status){return status==="completed"||status==="error"||status==="cancelled"||status==="stale"||status==="consumed"}function isTerminalDelegationStatus(status){return isTerminal(status)}function registerStaleSweepObserver(observer){_staleSweepObserver=observer}function sweepStaleLocked(directory,timeoutMs,now,statuses=DEFAULT_SWEEPABLE_DELEGATION_STATUSES,filters={},limits={}){let swept=0,{excludeCorrelationIds,includeCorrelationIds}=filters,records=loadRecordsForWrite(directory);if(records===null)return 0;for(let record3 of records){if(limits.maxSweep!==void 0&&swept>=limits.maxSweep)break;if(includeCorrelationIds!==void 0&&!includeCorrelationIds.has(record3.correlationId))continue;if(excludeCorrelationIds?.has(record3.correlationId))continue;if(!statuses.has(record3.status))continue;if(now-record3.updatedAt<=timeoutMs)continue;let staleReason=limits.reasonPrefix?`${limits.reasonPrefix} (lane finalized after ${timeoutMs}ms without a terminal event)`:`lane presumed stale after ${timeoutMs}ms without a terminal event`,failureClass=limits.failureClass??"liveness",livenessResult=record3.result?{...record3.result,workflowLaneFailureClass:failureClass}:{error:staleReason,chars:staleReason.length,truncated:!1,digest:createHash49("sha256").update(staleReason).digest("hex"),workflowLaneFailureClass:failureClass},staleTerminal=buildTypedDelegationTerminal(record3,"stale",livenessResult,now);appendRecord2(directory,{...record3,schemaVersion:record3.schemaVersion===4?4:3,status:"stale",updatedAt:Math.max(staleTerminal.recordedAt,record3.updatedAt),completedAt:staleTerminal.recordedAt,result:livenessResult,terminalResult:staleTerminal});try{_staleSweepObserver?.(record3,"stale")}catch{}swept+=1}if(swept>0)maybeCompactDelegationsLocked(directory);return swept}async function sweepStaleDelegations(directory,timeoutMs,options={}){if(!timeoutMs||timeoutMs<=0)return 0;let statuses=options.statuses??DEFAULT_SWEEPABLE_DELEGATION_STATUSES,filters={excludeCorrelationIds:options.excludeCorrelationIds,includeCorrelationIds:options.includeCorrelationIds},limits={...options.failureClass?{failureClass:options.failureClass}:{},...options.reasonPrefix?{reasonPrefix:options.reasonPrefix}:{}};try{return await withEvidenceLock(directory,BACKGROUND_DELEGATIONS_FILE,STORE_LOCK_AGENT2,STORE_LOCK_TASK2,async()=>sweepStaleLocked(directory,timeoutMs,Date.now(),statuses,filters,limits))}catch(err){return warn(`[background] sweepStaleDelegations failed: ${err instanceof Error?err.message:String(err)}`),0}}function fallbackRelativePath(correlationId){let digest3=createHash49("sha256").update(correlationId).digest("hex");return path108.join(BACKGROUND_DELEGATION_FALLBACK_DIR,`${digest3}.json`)}function fallbackPath(directory,correlationId){return validateSwarmPath(directory,fallbackRelativePath(correlationId))}function fallbackDirectoryPath(directory){return path108.dirname(validateSwarmPath(directory,path108.join(BACKGROUND_DELEGATION_FALLBACK_DIR,".containment-anchor")))}function readFallbackDirectory(directory){return fs70.readdirSync(fallbackDirectoryPath(directory),{withFileTypes:!0})}async function readFallbackFile(directory,correlationId){for(let attempt=0;attempt<5;attempt++)try{let raw=await fs70.promises.readFile(fallbackPath(directory,correlationId),"utf-8"),parsedJson=JSON.parse(raw),parsed=FallbackArtifactSchema.safeParse(parsedJson);if(!parsed.success||parsed.data.correlationId!==correlationId)return null;return parsed.data}catch(err){if(err.code==="ENOENT"&&attempt<4){await new Promise((resolve54)=>setTimeout(resolve54,10));continue}return null}return null}async function readDelegationFallback(directory,correlationId){if(!correlationId)return null;return readFallbackFile(directory,correlationId)}async function listDelegationFallbacks(directory){let entries;try{entries=_internals101.readFallbackDirectory(directory).sort((a,b)=>compareCodeUnits2(a.name,b.name)).filter((entry)=>entry.isFile()&&entry.name.endsWith(".json")).slice(0,MAX_LIVE_BACKGROUND_FALLBACKS)}catch{return[]}let artifacts=[];for(let entry of entries)try{let raw=await fs70.promises.readFile(path108.join(fallbackDirectoryPath(directory),entry.name),"utf-8"),parsed=FallbackArtifactSchema.safeParse(JSON.parse(raw));if(parsed.success)artifacts.push(parsed.data)}catch{}return artifacts}async function scanDelegationFallbacksForRecovery(directory){let fallbackDir,entries;try{fallbackDir=fallbackDirectoryPath(directory),entries=_internals101.readFallbackDirectory(directory).sort((a,b)=>compareCodeUnits2(a.name,b.name)).filter((entry)=>entry.isFile()&&entry.name.endsWith(".json"))}catch(error93){if(error93.code==="ENOENT")return{status:"ok",owners:[]};return{status:"uncertain",reason:`background fallback directory is unreadable: ${error93 instanceof Error?error93.message:String(error93)}`}}if(entries.length>MAX_LIVE_BACKGROUND_FALLBACKS)return{status:"uncertain",reason:`background fallback owner count exceeds the ${MAX_LIVE_BACKGROUND_FALLBACKS}-artifact safety bound`};let artifacts=[];for(let entry of entries){let artifactPath=path108.join(fallbackDir,entry.name),raw;try{if(fs70.statSync(artifactPath).size>MAX_RECOVERY_FALLBACK_BYTES)return{status:"uncertain",reason:`background fallback artifact "${entry.name}" exceeds the recovery size bound`};raw=await fs70.promises.readFile(artifactPath,"utf-8")}catch(error93){return{status:"uncertain",reason:`background fallback artifact "${entry.name}" is unreadable: ${error93 instanceof Error?error93.message:String(error93)}`}}if(Buffer.byteLength(raw,"utf8")>MAX_RECOVERY_FALLBACK_BYTES)return{status:"uncertain",reason:`background fallback artifact "${entry.name}" changed beyond the recovery size bound`};let parsedJson;try{parsedJson=JSON.parse(raw)}catch{return{status:"uncertain",reason:`background fallback artifact "${entry.name}" has malformed JSON`}}let parsed=FallbackArtifactSchema.safeParse(parsedJson);if(!parsed.success)return{status:"uncertain",reason:`background fallback artifact "${entry.name}" has an invalid owner record`};artifacts.push(parsed.data)}return{status:"ok",owners:artifacts}}function countFallbackFiles(directory){try{return fs70.readdirSync(fallbackDirectoryPath(directory),{withFileTypes:!0}).filter((entry)=>entry.isFile()&&entry.name.endsWith(".json")).length}catch(err){if(err.code==="ENOENT")return 0;return MAX_LIVE_BACKGROUND_FALLBACKS}}async function writeDelegationFallback(directory,input,options={}){let now=Date.now(),record3={...buildPendingRecord(input,now),schemaVersion:3},artifact={schemaVersion:1,correlationId:input.correlationId,createdAt:now,record:record3},parsed=FallbackArtifactSchema.safeParse(artifact);if(!parsed.success)return null;let requestedCap=Math.floor(Math.max(1,options.maxLive??MAX_LIVE_BACKGROUND_FALLBACKS)),maxLive=Math.min(requestedCap,MAX_LIVE_BACKGROUND_FALLBACKS);try{return await withEvidenceLock(directory,BACKGROUND_DELEGATION_FALLBACK_DIR,STORE_LOCK_AGENT2,FALLBACK_LOCK_TASK,async()=>{let existing=await readFallbackFile(directory,input.correlationId);if(existing)return samePendingRecord(existing.record,parsed.data.record)?existing:null;if(countFallbackFiles(directory)>=maxLive)return null;let absPath=fallbackPath(directory,input.correlationId);return fs70.mkdirSync(path108.dirname(absPath),{recursive:!0}),await bunWrite(absPath,`${JSON.stringify(parsed.data)}
|
|
1271
1271
|
`),parsed.data})}catch(err){return warn(`[background] writeDelegationFallback failed: ${err instanceof Error?err.message:String(err)}`),null}}async function removeDelegationFallback(directory,correlationId){if(!correlationId)return!1;try{return await withEvidenceLock(directory,BACKGROUND_DELEGATION_FALLBACK_DIR,STORE_LOCK_AGENT2,FALLBACK_LOCK_TASK,async()=>{try{return await fs70.promises.unlink(fallbackPath(directory,correlationId)),!0}catch(err){return err.code==="ENOENT"}})}catch(err){return warn(`[background] removeDelegationFallback failed: ${err instanceof Error?err.message:String(err)}`),!1}}async function findDelegationForCompletion(directory,correlationId){if(!correlationId)return null;let primary=findByCorrelationIdDetailed(directory,correlationId);if(primary.status==="uncertain")return{source:"uncertain",record:null,uncertain:`delegation store unreadable after ${primary.attempts} attempts (${primary.reason})`};if(primary.value)return{source:"primary",record:primary.value};let fallback=await readDelegationFallback(directory,correlationId);return fallback?{source:"fallback",record:fallback.record,fallback}:null}function samePromotionIdentity(primary,fallback){return primary.correlationId===fallback.correlationId&&primary.subagentSessionId===fallback.subagentSessionId&&primary.parentSessionId===fallback.parentSessionId&&primary.callID===fallback.callID&&primary.planTaskId===fallback.planTaskId&&primary.coderReservationId===fallback.coderReservationId&&sameJson(primary.worktree??null,fallback.worktree??null)&&sameJson(primary.taskChangeContext??null,fallback.taskChangeContext??null)}function samePendingRecord(left,right){let{createdAt:_leftCreatedAt,updatedAt:_leftUpdatedAt,...leftIdentity}=left,{createdAt:_rightCreatedAt,updatedAt:_rightUpdatedAt,...rightIdentity}=right;return sameJson(leftIdentity,rightIdentity)}async function promoteDelegationFallback(directory,correlationId){if(!correlationId)return null;try{return await withEvidenceLock(directory,BACKGROUND_DELEGATION_FALLBACK_DIR,STORE_LOCK_AGENT2,FALLBACK_LOCK_TASK,async()=>{let fallback=await readFallbackFile(directory,correlationId);if(!fallback){let primary=findByCorrelationId(directory,correlationId);return primary?{source:"primary",record:primary}:null}let promoted=null;if(await withEvidenceLock(directory,BACKGROUND_DELEGATIONS_FILE,STORE_LOCK_AGENT2,STORE_LOCK_TASK2,async()=>{let records=loadRecordsForWrite(directory);if(records===null)return;let current=findRecordForWrite(records,correlationId);if(current){if(samePromotionIdentity(current,fallback.record))promoted=current;return}appendRecord2(directory,fallback.record),maybeCompactDelegationsLocked(directory),promoted=fallback.record}),!promoted)return null;try{await fs70.promises.unlink(fallbackPath(directory,correlationId))}catch(err){if(err.code!=="ENOENT")return null}return{source:"primary",record:promoted}})}catch(err){return warn(`[background] promoteDelegationFallback failed: ${err instanceof Error?err.message:String(err)}`),null}}function reservationStorePath(directory){return validateSwarmPath(directory,BACKGROUND_CODER_RESERVATIONS_FILE)}function reservationShadowDigest(directory,reservations){let hash4=createHash49("sha256");hash4.update(JSON.stringify(reservations));let filePath=reservationStorePath(directory);if(fs70.existsSync(filePath))hash4.update(fs70.readFileSync(filePath));return hash4.digest("hex")}function writeReservationShadowProjection(directory,reservations){let parsed=BackgroundCoderReservationStoreSchema.parse({schemaVersion:1,reservations});fs70.writeFileSync(reservationStorePath(directory),`${JSON.stringify(parsed)}
|
|
1272
1272
|
`,"utf-8"),fs70.writeFileSync(projectionMarkerPath2(reservationStorePath(directory)),"","utf-8")}function coordinationRowsToReservations(directory){if(!projectDbExists(directory))return null;try{let rows=listCoordinationStates(directory,RESERVATION_COORDINATION_NAMESPACE,MAX_COORDINATION_STATE_LIST_ROWS);if(rows.length>=MAX_COORDINATION_STATE_LIST_ROWS)throw Error(`reservation coordination read reached its ${MAX_COORDINATION_STATE_LIST_ROWS}-row safety bound`);return rows.map((row)=>{let parsed=BackgroundCoderReservationSchema.safeParse(JSON.parse(row.payload));if(!parsed.success||parsed.data.reservationId!==row.entityKey||(parsed.data.generation??1)!==row.generation||parsed.data.state!==row.status)throw Error(`reservation coordination row failed schema or authority binding validation for ${row.entityKey}`);return parsed.data}).sort((left,right)=>left.createdAt===right.createdAt?left.reservationId.localeCompare(right.reservationId):left.createdAt-right.createdAt)}catch(error93){return recordLedgerUncertainty(directory,error93 instanceof Error?error93.message:String(error93),"reservation-coordination-read"),null}}function scanLegacyBackgroundCoderReservationsForAdmission(directory){let absolutePath,raw;try{if(absolutePath=reservationStorePath(directory),fs70.statSync(absolutePath).size>MAX_BACKGROUND_CODER_RESERVATION_STORE_BYTES)return{status:"uncertain",reason:`background coder reservation store exceeds the ${MAX_BACKGROUND_CODER_RESERVATION_STORE_BYTES}-byte safety bound`};raw=fs70.readFileSync(absolutePath,"utf-8")}catch(error93){if(error93.code==="ENOENT")return{status:"ok",reservations:[]};return{status:"uncertain",reason:`background coder reservation store is unreadable: ${error93 instanceof Error?error93.message:String(error93)}`}}if(Buffer.byteLength(raw,"utf8")>MAX_BACKGROUND_CODER_RESERVATION_STORE_BYTES)return{status:"uncertain",reason:"background coder reservation store changed beyond its safety bound"};let parsedJson;try{parsedJson=JSON.parse(raw)}catch{return{status:"uncertain",reason:"background coder reservation store contains malformed JSON"}}let parsed=BackgroundCoderReservationStoreSchema.safeParse(parsedJson);if(!parsed.success)return{status:"uncertain",reason:"background coder reservation store failed strict schema validation"};return{status:"ok",reservations:parsed.data.reservations}}function ensureReservationCoordinationImported(directory,createIfNeeded){let dbExists=projectDbExists(directory);if(!createIfNeeded&&!dbExists)return"absent";let existing=dbExists?coordinationRowsToReservations(directory):null;if(dbExists&&existing===null)return"uncertain";if(existing&&existing.length>0){let legacy2=scanLegacyBackgroundCoderReservationsForAdmission(directory);if(!fs70.existsSync(projectionMarkerPath2(reservationStorePath(directory)))||legacy2.status!=="ok"||!isDeepStrictEqual(legacy2.reservations.sort((left,right)=>left.reservationId.localeCompare(right.reservationId)),[...existing].sort((left,right)=>left.reservationId.localeCompare(right.reservationId))))archiveShadowFileBestEffort2(reservationStorePath(directory));return writeReservationShadowProjection(directory,existing),"ready"}let legacy=scanLegacyBackgroundCoderReservationsForAdmission(directory);if(legacy.status==="uncertain")return recordLedgerUncertainty(directory,legacy.reason,"reservation-legacy-import"),"uncertain";if(legacy.reservations.length===0&&!fs70.existsSync(reservationStorePath(directory))){if(!createIfNeeded)return"absent";return withCoordinationTransaction(directory,()=>{return}),"ready"}if(importCoordinationOnce(directory,{source:BACKGROUND_CODER_RESERVATIONS_FILE,sourceDigest:reservationShadowDigest(directory,legacy.reservations),rowCount:legacy.reservations.length,emptyNamespace:RESERVATION_COORDINATION_NAMESPACE},()=>{for(let reservation of legacy.reservations){let result=transitionCoordinationState(directory,{namespace:RESERVATION_COORDINATION_NAMESPACE,entityKey:reservation.reservationId,expectedRevision:null,generation:reservation.generation??1,status:reservation.state,payload:JSON.stringify(reservation)});if(result.outcome!=="applied")throw Error(`reservation import failed for ${reservation.reservationId}: ${result.outcome}`);if(reservation.leaseExpiresAt!==void 0){let lease=acquireCoordinationLease(directory,{...coordinationReservationLeaseKey(reservation),leaseExpiresAt:new Date(reservation.leaseExpiresAt).toISOString(),payload:JSON.stringify({parentSessionId:reservation.parentSessionId,correlationId:reservation.correlationId})});if(lease.outcome==="held"||lease.outcome==="stale_generation")throw Error(`reservation lease import failed for ${reservation.reservationId}: ${lease.outcome}`)}}})==="imported")archiveShadowFileBestEffort2(reservationStorePath(directory)),writeReservationShadowProjection(directory,legacy.reservations);return"ready"}function buildBackgroundCoderReservationId(input){let ownerIdentity=input.planTaskId===null?["call",input.parentSessionId,input.callID]:["task",input.parentSessionId,input.planTaskId];return`bgcr1:${createHash49("sha256").update(JSON.stringify(ownerIdentity)).digest("hex")}`}function scanBackgroundCoderReservationsForAdmission(directory){let importState=ensureReservationCoordinationImported(directory,!1);if(importState==="uncertain")return{status:"uncertain",reason:"background coder reservation coordination state is uncertain"};if(importState==="ready"){let reservations=coordinationRowsToReservations(directory);if(reservations!==null)return{status:"ok",reservations};return{status:"uncertain",reason:"background coder reservation coordination state is unreadable or over-bound"}}return scanLegacyBackgroundCoderReservationsForAdmission(directory)}async function writeBackgroundCoderReservations(directory,reservations){let parsed=BackgroundCoderReservationStoreSchema.safeParse({schemaVersion:1,reservations});if(!parsed.success)return!1;let importState=ensureReservationCoordinationImported(directory,!0);if(importState==="uncertain")return!1;if(importState==="ready")try{return withCoordinationTransaction(directory,()=>{let safetyBound=_internals101.reservationCoordinationRowLimit,authoritativeCount=countCoordinationStates(directory,RESERVATION_COORDINATION_NAMESPACE);if(authoritativeCount>safetyBound)throw Error(`reservation coordination write exceeded its ${safetyBound}-row safety bound`);let currentRows=listCoordinationStates(directory,RESERVATION_COORDINATION_NAMESPACE,safetyBound);if(currentRows.length!==authoritativeCount)throw Error("reservation coordination state changed during bounded reconciliation");let current=new Map(currentRows.map((row)=>[row.entityKey,row])),nextIds=new Set(parsed.data.reservations.map((entry)=>entry.reservationId));for(let[reservationId,row]of current){if(nextIds.has(reservationId))continue;let currentReservation=BackgroundCoderReservationSchema.parse(JSON.parse(row.payload));if(!deleteCoordinationState(directory,RESERVATION_COORDINATION_NAMESPACE,reservationId,row.revision))throw Error(`reservation delete conflict for ${reservationId}`);releaseReservationLeaseIfPresent(directory,currentReservation)}for(let reservation of parsed.data.reservations){let row=current.get(reservation.reservationId),result=transitionCoordinationState(directory,{namespace:RESERVATION_COORDINATION_NAMESPACE,entityKey:reservation.reservationId,expectedRevision:row?.revision??null,generation:reservation.generation??1,status:reservation.state,payload:JSON.stringify(reservation),event:{streamId:reservation.reservationId,idempotencyKey:createHash49("sha256").update(JSON.stringify(reservation)).digest("hex"),eventType:reservation.state,payload:JSON.stringify(reservation)}});if(result.outcome!=="applied"&&result.outcome!=="duplicate")throw Error(`reservation write failed for ${reservation.reservationId}: ${result.outcome}`);let leaseKey=coordinationReservationLeaseKey(reservation);if(reservation.leaseExpiresAt!==void 0){let lease=acquireCoordinationLease(directory,{...leaseKey,leaseExpiresAt:new Date(reservation.leaseExpiresAt).toISOString(),payload:JSON.stringify({parentSessionId:reservation.parentSessionId,correlationId:reservation.correlationId})});if(lease.outcome==="held"||lease.outcome==="stale_generation")throw Error(`reservation lease write failed for ${reservation.reservationId}: ${lease.outcome}`)}else releaseReservationLeaseIfPresent(directory,reservation)}}),writeReservationShadowProjection(directory,parsed.data.reservations),!0}catch(error93){return warn(`[background] reservation coordination write failed: ${error93 instanceof Error?error93.message:String(error93)}`),!1}try{return await bunWrite(reservationStorePath(directory),`${JSON.stringify(parsed.data)}
|
|
1273
|
-
`),!0}catch(error93){return warn(`[background] reservation write failed: ${error93 instanceof Error?error93.message:String(error93)}`),!1}}function reservationOwnerKey(input){return input.planTaskId===null?`call:${input.parentSessionId}:${input.callID}`:`task:${input.parentSessionId}:${input.planTaskId}`}function isActiveCoderOwner(record3){if(record3.normalizedAgent!=="coder"||record3.status==="consumed")return!1;if(record3.status==="pending"||record3.status==="running"||record3.status==="completed"||record3.status==="ingestion_error")return!0;if(record3.coderSettlement?.state==="preserved")return!0;return record3.worktree!==void 0}async function scanDurableCoderOwners(directory){let fallbackScan=await scanDelegationFallbacksForRecovery(directory);if(fallbackScan.status==="uncertain")return fallbackScan;let primaryScan=scanDelegationsForRecovery(directory);if(primaryScan.status==="uncertain")return primaryScan;let recordsByCorrelation=new Map;for(let artifact of fallbackScan.owners)recordsByCorrelation.set(artifact.correlationId,artifact.record);let primaryByCorrelation=new Map,primaryByReservationId=new Map;for(let record3 of primaryScan.owners){if(primaryByCorrelation.set(record3.correlationId,record3),record3.coderReservationId){let owners=primaryByReservationId.get(record3.coderReservationId)??[];owners.push(record3),primaryByReservationId.set(record3.coderReservationId,owners)}recordsByCorrelation.set(record3.correlationId,record3)}return{status:"ok",recordsByCorrelation,primaryByCorrelation,primaryByReservationId}}function exactReservationOwnerCoordinates(reservation,record3){return record3.coderReservationId===reservation.reservationId&&record3.parentSessionId===reservation.parentSessionId&&record3.planTaskId===reservation.planTaskId&&record3.callID===reservation.callID}function exactReservationRecordMatch(reservation,record3){return exactReservationOwnerCoordinates(reservation,record3)&&record3.correlationId===reservation.correlationId}function findExactPrimaryReservationOwner(reservation,ownerScan){if(reservation.correlationId!==null){let primary=ownerScan.primaryByCorrelation.get(reservation.correlationId);return primary&&exactReservationRecordMatch(reservation,primary)?primary:null}let exactOwners=(ownerScan.primaryByReservationId.get(reservation.reservationId)??[]).filter((record3)=>exactReservationOwnerCoordinates(reservation,record3));return exactOwners.length===1?exactOwners[0]:null}function hasProvenReleasedReservationOwner(record3){if(record3.status==="consumed")return!0;return record3.worktree===void 0&&(record3.status==="error"||record3.status==="cancelled")&&record3.terminalResult?.status===record3.status}function validateReservationIdentity(input){return typeof input.parentSessionId==="string"&&input.parentSessionId.length>0&&input.parentSessionId.length<=256&&input.parentSessionId.trim()===input.parentSessionId&&typeof input.callID==="string"&&input.callID.length>0&&input.callID.length<=256&&input.callID.trim()===input.callID&&(input.planTaskId===null||typeof input.planTaskId==="string"&&input.planTaskId.length>0&&input.planTaskId.length<=256&&input.planTaskId.trim()===input.planTaskId)}async function reserveBackgroundCoderSlot(directory,input){if(!validateReservationIdentity(input)||!Number.isInteger(input.maxConcurrent)||input.maxConcurrent<1||input.maxConcurrent>64||(input.occupiedTaskIds?.length??0)>64||!isValidReservationGeneration(input.generation))return{ok:!1,reason:"invalid"};let occupiedTaskIds=new Set;for(let taskId of input.occupiedTaskIds??[]){if(typeof taskId!=="string"||taskId.length===0||taskId.length>256||taskId.trim()!==taskId)return{ok:!1,reason:"invalid"};occupiedTaskIds.add(taskId)}try{return await withEvidenceLock(directory,BACKGROUND_CODER_RESERVATIONS_FILE,STORE_LOCK_AGENT2,RESERVATION_LOCK_TASK,async()=>{let reservationScan=scanBackgroundCoderReservationsForAdmission(directory);if(reservationScan.status==="uncertain")return{ok:!1,reason:"uncertain",detail:reservationScan.reason};let ownerScan=await scanDurableCoderOwners(directory);if(ownerScan.status==="uncertain")return{ok:!1,reason:"uncertain",detail:ownerScan.reason};let reservations=reservationScan.reservations.filter((reservation2)=>{let primary=findExactPrimaryReservationOwner(reservation2,ownerScan);return!(primary&&hasProvenReleasedReservationOwner(primary))});if(reservations.length!==reservationScan.reservations.length&&!await writeBackgroundCoderReservations(directory,reservations))return{ok:!1,reason:"uncertain",detail:"finished reservation reconciliation could not be persisted"};let activeOwnerKeys=new Set;for(let taskId of occupiedTaskIds)activeOwnerKeys.add(reservationOwnerKey({parentSessionId:input.parentSessionId,planTaskId:taskId,callID:""}));for(let reservation2 of reservations)if(reservation2.parentSessionId===input.parentSessionId)activeOwnerKeys.add(reservationOwnerKey(reservation2));for(let record3 of ownerScan.recordsByCorrelation.values())if(record3.parentSessionId===input.parentSessionId&&isActiveCoderOwner(record3))activeOwnerKeys.add(reservationOwnerKey({parentSessionId:record3.parentSessionId,planTaskId:record3.planTaskId,callID:record3.callID}));let reservationId=buildBackgroundCoderReservationId(input),existing=reservations.find((reservation2)=>reservation2.reservationId===reservationId);if(existing)return{ok:!1,reason:input.planTaskId===null?"duplicate_call":"duplicate_task",activeCount:activeOwnerKeys.size,existing};let incomingOwnerKey=reservationOwnerKey(input);if(input.planTaskId!==null&&activeOwnerKeys.has(incomingOwnerKey))return{ok:!1,reason:"duplicate_task",activeCount:activeOwnerKeys.size};if(activeOwnerKeys.size>=input.maxConcurrent)return{ok:!1,reason:"capacity",activeCount:activeOwnerKeys.size};if(reservations.length>=MAX_LIVE_BACKGROUND_CODER_RESERVATIONS)return{ok:!1,reason:"capacity",activeCount:activeOwnerKeys.size,detail:"durable reservation store is at its hard safety cap"};let now=input.now??Date.now(),leaseMs=clampReservationLeaseMs(input.leaseMs),reservation={reservationId,parentSessionId:input.parentSessionId,planTaskId:input.planTaskId,callID:input.callID,state:"reserved",correlationId:null,generation:input.generation??1,leaseExpiresAt:now+leaseMs,createdAt:now,updatedAt:now};if(!await writeBackgroundCoderReservations(directory,[...reservations,reservation]))return{ok:!1,reason:"uncertain",detail:"durable reservation claim could not be persisted"};return{ok:!0,reservation,activeCount:activeOwnerKeys.size+1}})}catch(error93){return{ok:!1,reason:"uncertain",detail:`background coder reservation lock failed: ${error93 instanceof Error?error93.message:String(error93)}`}}}async function bindBackgroundCoderReservation(directory,input){if(!validateReservationIdentity(input)||!input.reservationId||!input.correlationId||input.correlationId.length>256||input.correlationId.trim()!==input.correlationId||input.reservationId!==buildBackgroundCoderReservationId(input)||!isValidReservationGeneration(input.generation))return null;try{return await withEvidenceLock(directory,BACKGROUND_CODER_RESERVATIONS_FILE,STORE_LOCK_AGENT2,RESERVATION_LOCK_TASK,async()=>{let scan=scanBackgroundCoderReservationsForAdmission(directory);if(scan.status==="uncertain")return null;let index=scan.reservations.findIndex((reservation)=>reservation.reservationId===input.reservationId);if(index<0)return null;let current=scan.reservations[index];if(current.parentSessionId!==input.parentSessionId||current.planTaskId!==input.planTaskId||current.callID!==input.callID)return null;if(current.state==="bound"){if(current.correlationId!==input.correlationId)return null;let now2=input.now??Date.now(),leaseMs2=clampReservationLeaseMs(input.leaseMs),next2={...current,leaseExpiresAt:now2+leaseMs2,updatedAt:now2},reservations2=[...scan.reservations];return reservations2[index]=next2,await writeBackgroundCoderReservations(directory,reservations2)?next2:current}let currentGeneration=current.generation??1;if(input.generation!==void 0&&input.generation<currentGeneration)return null;let now=input.now??Date.now(),leaseMs=clampReservationLeaseMs(input.leaseMs),next={...current,state:"bound",correlationId:input.correlationId,...input.generation!==void 0||current.generation===void 0?{generation:input.generation??currentGeneration}:{},leaseExpiresAt:now+leaseMs,updatedAt:now},reservations=[...scan.reservations];return reservations[index]=next,await writeBackgroundCoderReservations(directory,reservations)?next:null})}catch{return null}}async function releaseBackgroundCoderReservation(directory,input){if(!validateReservationIdentity(input)||!input.reservationId||input.reservationId!==buildBackgroundCoderReservationId(input)||input.correlationId!==null&&(input.correlationId.length===0||input.correlationId.length>256||input.correlationId.trim()!==input.correlationId)||!isValidReservationGeneration(input.generation))return!1;try{return await withEvidenceLock(directory,BACKGROUND_CODER_RESERVATIONS_FILE,STORE_LOCK_AGENT2,RESERVATION_LOCK_TASK,async()=>{let scan=scanBackgroundCoderReservationsForAdmission(directory);if(scan.status==="uncertain")return!1;let index=scan.reservations.findIndex((reservation)=>reservation.reservationId===input.reservationId);if(index<0)return!1;let current=scan.reservations[index];if(current.parentSessionId!==input.parentSessionId||current.planTaskId!==input.planTaskId||current.callID!==input.callID||current.correlationId!==input.correlationId)return!1;if(input.generation!==void 0&¤t.generation!==void 0&&input.generation!==current.generation)return warn(`[background] refusing reservation release: terminal generation ${input.generation} does not match owned generation ${current.generation} for ${input.reservationId}`),!1;if(input.reason==="consumed"){if(current.state!=="bound"||!current.correlationId)return!1;let ownerScan=await scanDurableCoderOwners(directory);if(ownerScan.status==="uncertain")return!1;let primary=ownerScan.primaryByCorrelation.get(current.correlationId);if(!primary||primary.status!=="consumed"||!exactReservationRecordMatch(current,primary))return!1}let reservations=scan.reservations.filter((_,reservationIndex)=>reservationIndex!==index);return writeBackgroundCoderReservations(directory,reservations)})}catch{return!1}}async function reconcileLegacyCoderSettlements(directory,maxRecords,onReconciled,onAdvisoryReplaced){let reconciler=onReconciled??getLegacyCoderSettlementReconciler(directory),candidates=readDelegations(directory).filter((record3)=>record3.normalizedAgent==="coder"&&Boolean(record3.legacyCoderSettlementTransfer)&&Boolean(record3.terminalResult)).slice(0,maxRecords);if(candidates.length===0)return 0;let{transferCoderSettlementToBackground:transferCoderSettlementToBackground2}=await Promise.resolve().then(() => (init_coder_settlement(),exports_coder_settlement)),transferred=0;for(let record3 of candidates)try{let outcome=await transferCoderSettlementToBackground2({directory,taskId:record3.legacyCoderSettlementTransfer.taskId,transitionId:record3.legacyCoderSettlementTransfer.transitionId});if((outcome==="transferred"||outcome==="already-terminal"||outcome==="missing")&&reconciler){if(await reconciler(record3))await clearLegacyCoderSettlementTransferPending(directory,record3.correlationId)}if(outcome==="transferred")transferred+=1}catch(error93){let code=legacySettlementErrorCode(error93);if(!RETRYABLE_LEGACY_SETTLEMENT_ERROR_CODES.has(code??"")){let advisory=record3.advisoryInbox,manualMessage=`[BACKGROUND COMPLETION ${record3.terminalResult?.eventId??record3.correlationId}] coder task ${record3.evidenceTaskId??record3.planTaskId??"unknown"} legacy coder settlement requires manual recovery; run /swarm recover for this task (or /swarm reset-session).`,advisoryRecorded=!1;if(advisory?.state==="pending"){let replaced=await replacePendingBackgroundAdvisory(directory,record3.correlationId,{eventId:advisory.eventId,parentSessionId:advisory.parentSessionId,message:manualMessage});if(advisoryRecorded=replaced!==null,replaced)try{await onAdvisoryReplaced?.(record3,replaced)}catch(callbackError){warn(`[background] legacy coder settlement advisory replacement notification failed for ${record3.correlationId}: ${callbackError instanceof Error?callbackError.message:String(callbackError)}`)}}else if(record3.terminalResult)advisoryRecorded=await putPendingBackgroundAdvisory(directory,record3.correlationId,{eventId:record3.terminalResult.eventId,parentSessionId:record3.parentSessionId,message:manualMessage})!==null;if(advisoryRecorded)await clearLegacyCoderSettlementTransferPending(directory,record3.correlationId);warn(`[background] legacy coder settlement reconciliation requires manual recovery for ${record3.correlationId}: ${code??"unknown transfer failure"}`);continue}warn(`[background] legacy coder settlement reconciliation deferred for ${record3.correlationId}: ${error93 instanceof Error?error93.message:String(error93)}`)}return transferred}function legacySettlementErrorCode(error93){if(error93&&typeof error93==="object"&&"code"in error93&&typeof error93.code==="string")return error93.code??null;let detail=error93 instanceof Error?error93.message:String(error93);return/^([A-Z][A-Z0-9_]*)(?::|$)/.exec(detail.trim())?.[1]??null}async function maintainBackgroundDelegations(directory,options={}){let now=options.now??Date.now(),staleTimeoutMs=options.staleTimeoutMs??DEFAULT_STALE_DELEGATION_TIMEOUT_MS,maxRecords=options.maxRecords??DEFAULT_MAINTENANCE_BATCH,lockTimeoutMs=options.lockTimeoutMs??DEFAULT_MAINTENANCE_LOCK_TIMEOUT_MS,reason=options.reason??"manual",result={status:"ok",sweptStale:0,released:[],renewed:[],retained:[],examinedReservations:0},facts=[],emitObservation=(status,failureReason)=>{return appendDelegationMaintenanceObservation(directory,{at:now,status,reason:failureReason,summary:status==="ok"?{sweptStale:result.sweptStale,released:result.released.length,renewed:result.renewed.length,retained:result.retained.length}:void 0,facts}),{...result,status,...failureReason?{reason:failureReason}:{}}};try{result.sweptStale=await withEvidenceLock(directory,BACKGROUND_DELEGATIONS_FILE,STORE_LOCK_AGENT2,STORE_LOCK_TASK2,async()=>sweepStaleLocked(directory,staleTimeoutMs,now,DEFAULT_SWEEPABLE_DELEGATION_STATUSES,{},{maxSweep:maxRecords}),lockTimeoutMs)}catch(error93){if(error93 instanceof EvidenceLockTimeoutError)return facts.push({at:now,kind:"lock-contention",reason:`maintenance point '${reason}' skipped: delegations store lock contended`}),emitObservation("contention",error93.message);return facts.push({at:now,kind:"maintenance-failure",reason:`maintenance point '${reason}' sweep failed: ${error93 instanceof Error?error93.message:String(error93)}`}),emitObservation("failure",error93 instanceof Error?error93.message:String(error93))}try{await withEvidenceLock(directory,BACKGROUND_CODER_RESERVATIONS_FILE,STORE_LOCK_AGENT2,RESERVATION_LOCK_TASK,async()=>{let reservationScan=scanBackgroundCoderReservationsForAdmission(directory);if(reservationScan.status==="uncertain"){result.status="failure",result.reason=reservationScan.reason,facts.push({at:now,kind:"maintenance-failure",reason:`reservation store uncertain: ${reservationScan.reason}`});return}let ownerScan=await scanDurableCoderOwners(directory);if(ownerScan.status==="uncertain"){result.status="failure",result.reason=ownerScan.reason,facts.push({at:now,kind:"maintenance-failure",reason:`owner evidence uncertain; all reservations retained: ${ownerScan.reason}`});return}let batch=reservationScan.reservations.slice(0,maxRecords);result.examinedReservations=batch.length;let next=[],mutated=!1;for(let reservation of batch){let generation=reservation.generation??1,primary=findExactPrimaryReservationOwner(reservation,ownerScan);if(primary&&hasProvenReleasedReservationOwner(primary)){if((primary.generation??1)!==generation){result.retained.push({reservationId:reservation.reservationId,reason:"owner-terminal-older-generation"}),facts.push({at:now,kind:"retained-ambiguity",reservationId:reservation.reservationId,correlationId:reservation.correlationId??void 0,generation,reason:`proven-terminal owner is generation ${primary.generation??1}, reservation owns ${generation}`}),next.push(reservation);continue}mutated=!0,result.released.push({reservationId:reservation.reservationId,generation,reason:"proven-terminal-owner"}),facts.push({at:now,kind:"release",reservationId:reservation.reservationId,correlationId:reservation.correlationId??void 0,generation,reason:"proven-terminal-owner"});continue}if(reservation.leaseExpiresAt===void 0){result.retained.push({reservationId:reservation.reservationId,reason:"protected-legacy-no-lease"}),facts.push({at:now,kind:"retained-protected-legacy",reservationId:reservation.reservationId,generation,reason:"legacy reservation without leaseExpiresAt"}),next.push(reservation);continue}if(!(reservation.leaseExpiresAt<=now)){next.push(reservation);continue}if(primary){if((primary.generation??1)!==generation){result.retained.push({reservationId:reservation.reservationId,reason:"owner-older-generation"}),facts.push({at:now,kind:"retained-ambiguity",reservationId:reservation.reservationId,correlationId:reservation.correlationId??void 0,generation,reason:`owner record is generation ${primary.generation??1}, reservation owns ${generation}`}),next.push(reservation);continue}if(primary.status==="stale"){mutated=!0,result.released.push({reservationId:reservation.reservationId,generation,reason:"owner-swept-stale"}),facts.push({at:now,kind:"release",reservationId:reservation.reservationId,correlationId:reservation.correlationId??void 0,generation,reason:"owner record durably stale"});continue}if(isActiveCoderOwner(primary)){mutated=!0,result.renewed.push({reservationId:reservation.reservationId,generation}),facts.push({at:now,kind:"lease-renewed",reservationId:reservation.reservationId,correlationId:reservation.correlationId??void 0,generation,reason:"exact owner record still active"}),next.push({...reservation,leaseExpiresAt:now+BACKGROUND_CODER_RESERVATION_LEASE_MS,updatedAt:now});continue}result.retained.push({reservationId:reservation.reservationId,reason:"owner-terminal-unproven"}),facts.push({at:now,kind:"retained-ambiguity",reservationId:reservation.reservationId,correlationId:reservation.correlationId??void 0,generation,reason:`owner status '${primary.status}' does not prove release`}),next.push(reservation);continue}if(reservation.correlationId!==null&&ownerScan.recordsByCorrelation.has(reservation.correlationId)){result.retained.push({reservationId:reservation.reservationId,reason:"owner-identity-mismatch"}),facts.push({at:now,kind:"retained-ambiguity",reservationId:reservation.reservationId,correlationId:reservation.correlationId??void 0,generation,reason:"correlation exists under a different owner identity"}),next.push(reservation);continue}if(now-reservation.createdAt>staleTimeoutMs){mutated=!0,result.released.push({reservationId:reservation.reservationId,generation,reason:"unbound-orphan"}),facts.push({at:now,kind:"release",reservationId:reservation.reservationId,generation,reason:"no durable owner anywhere and pre-launch window exceeded"});continue}result.retained.push({reservationId:reservation.reservationId,reason:"unbound-within-stale-window"}),facts.push({at:now,kind:"retained-ambiguity",reservationId:reservation.reservationId,generation,reason:"no owner record yet; still inside the pre-launch stale window"}),next.push(reservation)}if(next.push(...reservationScan.reservations.slice(maxRecords)),mutated){if(!await writeBackgroundCoderReservations(directory,next))result.status="failure",result.reason="reservation reconciliation could not be persisted",facts.push({at:now,kind:"maintenance-failure",reason:"reservation store write failed during reconciliation"})}},lockTimeoutMs)}catch(error93){if(error93 instanceof EvidenceLockTimeoutError)return facts.push({at:now,kind:"lock-contention",reason:`maintenance point '${reason}' skipped: reservation store lock contended`}),emitObservation("contention",error93.message);return facts.push({at:now,kind:"maintenance-failure",reason:`maintenance point '${reason}' reconciliation failed: ${error93 instanceof Error?error93.message:String(error93)}`}),emitObservation("failure",error93 instanceof Error?error93.message:String(error93))}if(!options.skipLegacyCoderSettlementReconciliation)try{await reconcileLegacyCoderSettlements(directory,maxRecords,options.onLegacyCoderSettlementReconciled??getLegacyCoderSettlementReconciler(directory),options.onLegacyCoderSettlementAdvisoryReplaced)}catch(error93){warn(`[background] legacy coder settlement reconciliation pass failed: ${error93 instanceof Error?error93.message:String(error93)}`)}if(result.status==="failure")return emitObservation("failure",result.reason);return emitObservation("ok")}var BACKGROUND_DELEGATIONS_FILE="background-delegations.jsonl",BACKGROUND_DELEGATION_FALLBACK_DIR="background-delegation-fallback",BACKGROUND_CODER_RESERVATIONS_FILE="background-coder-reservations.json",BACKGROUND_DELEGATIONS_CHECKPOINT_FILE="background-delegations.checkpoint.json",BACKGROUND_DELEGATIONS_MANIFEST_FILE="background-delegations.manifest.json",MAX_LIVE_BACKGROUND_FALLBACKS=256,MAX_LIVE_BACKGROUND_CODER_RESERVATIONS=256,MAX_BACKGROUND_OBSERVED_FILES=5000,MAX_BACKGROUND_ADVISORY_CHARS=4000,LEGACY_CODER_SETTLEMENT_PENDING_ADVISORY_MARKER="legacy coder settlement transfer is pending",MAX_BACKGROUND_DELEGATION_GENERATION=1e6,DELEGATION_COORDINATION_NAMESPACE="background.pending-delegation",RESERVATION_COORDINATION_NAMESPACE="background.coder-reservation",RESERVATION_LEASE_NAMESPACE="background.coder-reservation.lease",MAX_RECOVERY_FALLBACK_BYTES=1048576,MAX_TRACKED_LENIENT_LEDGER_SIGNALS=32,LENIENT_LEDGER_SIGNAL_SOURCE="lenient-read",DELEGATION_COMPACTION_LOW_WATER_BYTES=262144,DELEGATION_COMPACTION_HIGH_WATER_BYTES=1048576,MAX_CHECKPOINT_BYTES=2097152,CHECKPOINT_SELECTION_RESERVE_BYTES=65536,MAX_CHECKPOINT_RECORDS=2048,MAX_COORDINATION_DELEGATION_ROWS,MAX_COORDINATION_TERMINAL_ROWS,TOMBSTONE_MIN_AGE_MS=259200000,STORE_LOCK_AGENT2="background",STORE_LOCK_TASK2="background-delegations",FALLBACK_LOCK_TASK="background-delegation-fallback",RESERVATION_LOCK_TASK="background-coder-reservations",ADVISORY_PREPARE_LEASE_MS=30000,INGESTION_CLAIM_LEASE_MS=30000,BACKGROUND_INGESTION_LEASE_MS=30000,BACKGROUND_CODER_RESERVATION_LEASE_MS=900000,BACKGROUND_CODER_RESERVATION_LEASE_MAX_MS=3600000,BACKGROUND_CODER_RESERVATION_LEASE_MIN_MS=60000,DEFAULT_STALE_DELEGATION_TIMEOUT_MS=1800000,DEFAULT_SWEEPABLE_DELEGATION_STATUSES,WorkflowLaneRecoverySchema,ResultSchema,WorkspaceSchema,TaskChangeContextSchema,WorktreeDescriptorSchema,TerminalResultSchema,NormalizedObservedFileSchema,SettlementProvenanceSchema,SettlementOutcomeSchema,CoderSettlementSchema,AdvisoryPreparationSchema,AdvisoryInboxSchema,DelegationIngestionSchema,BackgroundCoderReservationSchema,BackgroundCoderReservationStoreSchema,PromptSchema,RecordSchema2,FallbackArtifactSchema,SHA256_HEX,CheckpointSchema2,ManifestSchema,WRITER_ID,_checkpointInternals,CHECKPOINT_REBIND_HINT="remove .swarm/background-delegations.manifest.json (manifest only) after verifying no in-flight background delegations; recovery then falls back to the full-ledger read. Only if you also want to discard pre-cut closed summaries and audit history — which for a compacted (rolled) ledger exist ONLY in .swarm/background-delegations.checkpoint.json — remove the checkpoint too or use the full reset below",CHECKPOINT_RESET_HINT="the rolled tail no longer carries pre-checkpoint state: stop swarm processes, verify no in-flight background delegations, and remove .swarm/background-delegations.manifest.json, .swarm/background-delegations.checkpoint.json, and .swarm/background-delegations.jsonl to reset the store (or restore them from backup)",lenientLedgerSignalByRoot,lenientLedgerSignalOrder,DELEGATION_READ_RETRY_DELAY_MS=25,MAX_TRACKED_DELEGATION_READ_UNCERTAIN_ROOTS=32,DELEGATION_READ_UNCERTAIN_EMIT_COOLDOWN_MS=60000,delegationReadUncertainEmitAtByRoot,delegationReadUncertainEmitOrder,DELEGATION_READ_REASON_MAX_CHARS=200,MAX_LEGACY_CODER_SETTLEMENT_RECONCILERS=32,RETRYABLE_LEGACY_SETTLEMENT_ERROR_CODES,legacyCoderSettlementReconcilers,legacyCoderSettlementReconcilerOrder,_internals101,_staleSweepObserver=null,MAX_BACKGROUND_CODER_RESERVATION_STORE_BYTES=2097152,DEFAULT_MAINTENANCE_LOCK_TIMEOUT_MS=5000,DEFAULT_MAINTENANCE_BATCH=256;var init_pending_delegations=__esm(()=>{init_zod();init_db();init_lock();init_utils2();init_telemetry();init_bun_compat();init_canonical_root();init_logger();init_delegation_health();init_pr_review_collection_receipt();init_pr_review_contract();init_delegation_health();init_delegation_health();MAX_COORDINATION_DELEGATION_ROWS=MAX_CHECKPOINT_RECORDS*2,MAX_COORDINATION_TERMINAL_ROWS=MAX_CHECKPOINT_RECORDS;DEFAULT_SWEEPABLE_DELEGATION_STATUSES=new Set(["pending","running","ingestion_error"]),WorkflowLaneRecoverySchema=exports_external.object({workflowLane:exports_external.string(),kind:exports_external.enum(["legacy-verdict-row-recovery","parser-normalization","parser-row-recovery","truncated-preview-durable-artifact","transcript-incomplete-terminal-candidate","clean-attestation-salvaged"]),reason:exports_external.string()}).strict(),ResultSchema=exports_external.object({text:exports_external.string().optional(),error:exports_external.string().optional(),chars:exports_external.number(),truncated:exports_external.boolean(),digest:exports_external.string(),outputRef:exports_external.string().optional(),outputPreviewChars:exports_external.number().optional(),outputDegraded:exports_external.boolean().optional(),outputArtifactError:exports_external.string().optional(),transcriptIncomplete:exports_external.boolean().optional(),messageCount:exports_external.number().optional(),prReviewResultReceipt:PrReviewResultReceiptSchema.optional(),workflowLaneFailureClass:exports_external.enum(["contract","resource","liveness","operator_cancelled","deadline"]).optional(),terminalErrorClass:exports_external.object({kind:exports_external.enum(["provider","aborted","output_length","unknown"]),category:exports_external.string().min(1).max(128),statusCode:exports_external.number().int().optional(),hostRetryable:exports_external.boolean().optional()}).strict().optional(),salvagedWorkflowLanes:exports_external.array(exports_external.string()).optional(),salvagedWorkflowLaneRecoveries:exports_external.array(WorkflowLaneRecoverySchema).optional()}).strict(),WorkspaceSchema=exports_external.object({directory:exports_external.string(),gitHead:exports_external.string().nullable(),dirtyHash:exports_external.string().nullable(),changedFiles:exports_external.array(exports_external.string()).nullable().optional(),prHeadSha:exports_external.string().nullable(),scope:exports_external.string().nullable()}).strict(),TaskChangeContextSchema=exports_external.object({declaredFiles:exports_external.array(exports_external.string()).nullable(),baseline:WorkspaceSchema,workflowGeneration:exports_external.number().int().nonnegative().optional()}).strict(),WorktreeDescriptorSchema=exports_external.object({callID:exports_external.string().min(1).max(256),parentSessionId:exports_external.string().min(1).max(256),taskId:exports_external.string().min(1).max(256),planTaskId:exports_external.string().min(1).max(256).nullable(),worktreePath:exports_external.string().min(1).max(4096),branchName:exports_external.string().min(1).max(1024),worktreeId:exports_external.string().min(1).max(256),worktreeSessionId:exports_external.string().min(1).max(256),mergeStrategy:exports_external.enum(["merge","rebase","cherry-pick"]),landedUnstaged:exports_external.boolean().optional(),laneIndex:exports_external.number().int().nonnegative().max(255),worktreeDir:exports_external.string().min(1).max(4096).nullable(),reservationId:exports_external.string().min(1).max(512).optional(),generation:exports_external.number().int().min(1).optional(),provisioningOwner:exports_external.object({reservationId:exports_external.string().min(1).max(512),generation:exports_external.number().int().min(1),branchName:exports_external.string().min(1).max(1024)}).strict().optional()}).strict(),TerminalResultSchema=exports_external.object({eventId:exports_external.string().min(1).max(256),status:exports_external.enum(["completed","error","cancelled","rejected","stale"]),recordedAt:exports_external.number().int().nonnegative(),result:ResultSchema}).strict(),NormalizedObservedFileSchema=exports_external.string().min(1).max(4096).refine((value)=>normalizeObservedFile(value)===value),SettlementProvenanceSchema=exports_external.object({correlationId:exports_external.string().min(1).max(256),parentSessionId:exports_external.string().min(1).max(256),callID:exports_external.string().max(256),planTaskId:exports_external.string().min(1).max(256).nullable(),baseline:WorkspaceSchema,worktree:WorktreeDescriptorSchema.nullable()}).strict(),SettlementOutcomeSchema=exports_external.object({kind:exports_external.enum(["shared-root","standard-worktree"]),result:exports_external.enum(["ready","merged","unchanged","partial","failed"]),reason:exports_external.string().min(1).max(2000).optional(),sourceHeadAfterCommit:exports_external.string().min(1).max(256).nullable().optional(),targetHeadBeforeMerge:exports_external.string().min(1).max(256).nullable().optional(),targetHeadAfterMerge:exports_external.string().min(1).max(256).nullable().optional()}).strict(),CoderSettlementSchema=exports_external.object({state:exports_external.enum(["pending","settling","settled","preserved"]),provenance:SettlementProvenanceSchema,operationId:exports_external.string().min(1).max(256).optional(),sourceHeadAfterCommit:exports_external.string().min(1).max(256).nullable().optional(),targetHeadBeforeMerge:exports_external.string().min(1).max(256).nullable().optional(),observedFiles:exports_external.array(NormalizedObservedFileSchema).max(MAX_BACKGROUND_OBSERVED_FILES).nullable(),outcome:SettlementOutcomeSchema.optional(),updatedAt:exports_external.number().int().nonnegative()}).strict().superRefine((value,context)=>{if(value.state!=="pending"&&!value.operationId)context.addIssue({code:exports_external.ZodIssueCode.custom,message:"settling, settled, and preserved states require operationId"});if((value.state==="settled"||value.state==="preserved")&&!value.outcome)context.addIssue({code:exports_external.ZodIssueCode.custom,message:"terminal settlement state requires outcome"})}),AdvisoryPreparationSchema=exports_external.object({id:exports_external.string().min(1).max(256),preparedAt:exports_external.number().int().nonnegative(),leaseExpiresAt:exports_external.number().int().nonnegative()}).strict(),AdvisoryInboxSchema=exports_external.object({eventId:exports_external.string().min(1).max(256),parentSessionId:exports_external.string().min(1).max(256),state:exports_external.enum(["pending","delivered"]),message:exports_external.string().min(1).max(MAX_BACKGROUND_ADVISORY_CHARS),createdAt:exports_external.number().int().nonnegative(),preparation:AdvisoryPreparationSchema.optional(),deliveredAt:exports_external.number().int().nonnegative().optional()}).strict().superRefine((value,context)=>{if(value.state==="delivered"&&value.deliveredAt===void 0)context.addIssue({code:exports_external.ZodIssueCode.custom,message:"delivered advisory requires deliveredAt"});if(value.state==="delivered"&&value.preparation!==void 0)context.addIssue({code:exports_external.ZodIssueCode.custom,message:"delivered advisory cannot retain a preparation lease"})}),DelegationIngestionSchema=exports_external.object({state:exports_external.enum(["claimed","retryable","consumed"]),attempt:exports_external.number().int().positive(),updatedAt:exports_external.number().int().nonnegative(),claimToken:exports_external.string().min(1).max(256),leaseExpiresAt:exports_external.number().int().nonnegative().optional()}).strict().superRefine((value,context)=>{if(value.state==="claimed"&&value.leaseExpiresAt===void 0)context.addIssue({code:exports_external.ZodIssueCode.custom,message:"claimed ingestion requires a lease expiry"});if(value.state!=="claimed"&&value.leaseExpiresAt!==void 0)context.addIssue({code:exports_external.ZodIssueCode.custom,message:"completed ingestion cannot retain a claim lease"})}),BackgroundCoderReservationSchema=exports_external.object({reservationId:exports_external.string().min(1).max(256),parentSessionId:exports_external.string().min(1).max(256),planTaskId:exports_external.string().min(1).max(256).nullable(),callID:exports_external.string().min(1).max(256),state:exports_external.enum(["reserved","bound"]),correlationId:exports_external.string().min(1).max(256).nullable(),generation:exports_external.number().int().min(1).max(MAX_BACKGROUND_DELEGATION_GENERATION).optional(),leaseExpiresAt:exports_external.number().int().nonnegative().optional(),createdAt:exports_external.number().int().nonnegative(),updatedAt:exports_external.number().int().nonnegative()}).strict().superRefine((value,context)=>{if(value.state==="reserved"&&value.correlationId!==null)context.addIssue({code:exports_external.ZodIssueCode.custom,message:"unbound reservation cannot have a correlationId"});if(value.state==="bound"&&value.correlationId===null)context.addIssue({code:exports_external.ZodIssueCode.custom,message:"bound reservation requires a correlationId"})}),BackgroundCoderReservationStoreSchema=exports_external.object({schemaVersion:exports_external.literal(1),reservations:exports_external.array(BackgroundCoderReservationSchema).max(MAX_LIVE_BACKGROUND_CODER_RESERVATIONS)}).strict().superRefine((value,context)=>{let ids=new Set;for(let reservation of value.reservations){if(ids.has(reservation.reservationId)){context.addIssue({code:exports_external.ZodIssueCode.custom,message:"duplicate reservationId"});return}if(reservation.reservationId!==buildBackgroundCoderReservationId({parentSessionId:reservation.parentSessionId,planTaskId:reservation.planTaskId,callID:reservation.callID})){context.addIssue({code:exports_external.ZodIssueCode.custom,message:"reservationId does not match owner identity"});return}ids.add(reservation.reservationId)}}),PromptSchema=exports_external.object({text:exports_external.string(),chars:exports_external.number(),truncated:exports_external.boolean(),digest:exports_external.string()}).strict(),RecordSchema2=exports_external.object({schemaVersion:exports_external.union([exports_external.literal(1),exports_external.literal(2),exports_external.literal(3),exports_external.literal(4)]),correlationId:exports_external.string().min(1),jobId:exports_external.string().nullable(),subagentSessionId:exports_external.string().min(1),parentSessionId:exports_external.string().min(1),callID:exports_external.string(),normalizedAgent:exports_external.string(),swarmPrefixedAgent:exports_external.string(),planTaskId:exports_external.string().nullable(),evidenceTaskId:exports_external.string().nullable(),status:exports_external.enum(["pending","running","ingestion_error","rejected","completed","error","cancelled","stale","consumed"]),createdAt:exports_external.number(),updatedAt:exports_external.number(),batchId:exports_external.string().optional(),laneId:exports_external.string().optional(),mode:exports_external.string().optional(),workflowLane:exports_external.string().optional(),ownedWorkflowLanes:exports_external.array(exports_external.string().min(1).max(120)).min(1).max(11).optional(),prReviewLegacyTranscriptCompatibility:exports_external.boolean().optional(),promptHash:exports_external.string().optional(),workspace:WorkspaceSchema.optional(),taskChangeContext:TaskChangeContextSchema.optional(),workflowGeneration:exports_external.number().int().nonnegative().optional(),worktree:WorktreeDescriptorSchema.optional(),coderReservationId:exports_external.string().min(1).max(256).optional(),prompt:PromptSchema.optional(),generation:exports_external.number().int().positive().max(MAX_BACKGROUND_DELEGATION_GENERATION).optional(),terminalResult:TerminalResultSchema.optional(),coderSettlement:CoderSettlementSchema.optional(),advisoryInbox:AdvisoryInboxSchema.optional(),legacyCoderSettlementTransfer:exports_external.object({taskId:exports_external.string().min(1).max(256),transitionId:exports_external.string().min(1).max(256),updatedAt:exports_external.number().nonnegative()}).strict().optional(),ingestion:DelegationIngestionSchema.optional(),result:ResultSchema.optional(),completedAt:exports_external.number().optional()}).strict().superRefine((value,context)=>{if(value.mode?.startsWith("swarm-pr-review:")&&value.correlationId!==value.subagentSessionId)context.addIssue({code:exports_external.ZodIssueCode.custom,message:"PR-review delegation identity requires correlationId to equal subagentSessionId"})}),FallbackArtifactSchema=exports_external.object({schemaVersion:exports_external.literal(1),correlationId:exports_external.string().min(1).max(256),createdAt:exports_external.number().int().nonnegative(),record:RecordSchema2}).strict().superRefine((value,context)=>{if(value.record.correlationId!==value.correlationId||value.record.subagentSessionId!==value.correlationId||value.record.status!=="pending")context.addIssue({code:exports_external.ZodIssueCode.custom,message:"fallback identity/status does not match its pending record"})});SHA256_HEX=/^[0-9a-f]{64}$/,CheckpointSchema2=exports_external.object({schemaVersion:exports_external.literal(1),sequence:exports_external.number().int().positive(),writerId:exports_external.string().min(1).max(128),rootPath:exports_external.string().min(1).max(4096),createdAt:exports_external.number().int().nonnegative(),cutLedgerBytes:exports_external.number().int().nonnegative(),cutLedgerDigest:exports_external.string().regex(SHA256_HEX),records:exports_external.array(RecordSchema2).max(MAX_CHECKPOINT_RECORDS),closed:exports_external.array(RecordSchema2),audit:DelegationCheckpointAuditSchema,payloadChecksum:exports_external.string().regex(SHA256_HEX)}).strict(),ManifestSchema=exports_external.object({schemaVersion:exports_external.literal(1),sequence:exports_external.number().int().positive(),checkpointChecksum:exports_external.string().regex(SHA256_HEX),writerId:exports_external.string().min(1).max(128),rootPath:exports_external.string().min(1).max(4096),updatedAt:exports_external.number().int().nonnegative()}).strict(),WRITER_ID=`w-${process.pid}-${Math.random().toString(36).slice(2,10)}`;_checkpointInternals={renameWithRetry:(from,to)=>{let lastError;for(let attempt=0;attempt<5;attempt++)try{_checkpointInternals.renameOnce(from,to);return}catch(err){lastError=err;let code=err.code;if(code!=="EEXIST"&&code!=="EBUSY"&&code!=="EPERM")throw err;_checkpointInternals.syncSleep(15)}throw lastError},renameOnce:(from,to)=>{fs70.renameSync(from,to)},syncSleep:portableSyncSleep};lenientLedgerSignalByRoot=new Map,lenientLedgerSignalOrder=[];delegationReadUncertainEmitAtByRoot=new Map,delegationReadUncertainEmitOrder=[];RETRYABLE_LEGACY_SETTLEMENT_ERROR_CODES=new Set(["CODER_SETTLEMENT_LOCKED","EACCES","EBUSY","EIO","EPERM","ETIMEDOUT"]),legacyCoderSettlementReconcilers=new Map,legacyCoderSettlementReconcilerOrder=[];_internals101={readRetryDelayMs:DELEGATION_READ_RETRY_DELAY_MS,delegationReadUncertainEmitCooldownMs:DELEGATION_READ_UNCERTAIN_EMIT_COOLDOWN_MS,resetDelegationReadUncertainRegistry:()=>{delegationReadUncertainEmitAtByRoot.clear(),delegationReadUncertainEmitOrder.length=0},delegationReadUncertainEmitOrderSnapshot:()=>[...delegationReadUncertainEmitOrder],delegationReadUncertainCooldownsSnapshot:()=>new Map(delegationReadUncertainEmitAtByRoot),getLegacyCoderSettlementReconciler,readFallbackDirectory,getLegacyCoderSettlementReconcilerOrder:()=>[...legacyCoderSettlementReconcilerOrder],resetLegacyCoderSettlementReconcilers:()=>{legacyCoderSettlementReconcilers.clear(),legacyCoderSettlementReconcilerOrder.length=0},reservationCoordinationRowLimit:MAX_COORDINATION_STATE_LIST_ROWS,writeBackgroundCoderReservations}});import{createHash as createHash50}from"node:crypto";function rawTriggerIds(input){if(!Array.isArray(input))return null;let ids=[];for(let row of input){if(typeof row!=="object"||row===null)return null;let triggerId=row.trigger_id;if(typeof triggerId!=="string"||!triggerId.trim())return null;ids.push(triggerId.trim())}return ids}function assertExactTriggerIdSet(input){let ids=rawTriggerIds(input);if(!ids)return;let expected=new Set(PR_REVIEW_REQUIRED_TRIGGER_IDS),seen=new Set,duplicate=new Set;for(let id of ids){if(seen.has(id))duplicate.add(id);seen.add(id)}if(duplicate.size>0)throw Error(`duplicate trigger IDs: ${[...duplicate].join(", ")}`);let unknown3=[...seen].filter((id)=>!expected.has(id));if(unknown3.length>0)throw Error(`unknown trigger IDs: ${unknown3.join(", ")}. trigger_id must be one of the 11 mandatory micro-lane IDs: ${[...expected].join(", ")}. Base-lane IDs and mode strings (e.g. swarm-pr-review:base) are NOT trigger IDs.`);let missing=[...expected].filter((id)=>!seen.has(id));if(missing.length>0)throw Error(`missing trigger IDs: ${missing.join(", ")}`)}function assertMatchedRowsHaveProvenance(input){if(!Array.isArray(input))return;for(let row of input){if(typeof row!=="object"||row===null)continue;let value=row;if(value.result!=="MATCHED")continue;if(typeof value.source_batch_id!=="string"||!value.source_batch_id.trim()||typeof value.source_lane_id!=="string"||!value.source_lane_id.trim())throw Error(`MATCHED rows require source_batch_id and source_lane_id: ${String(value.trigger_id??"(missing trigger_id)")}`)}}function assertNoLegacyNoMatchResult(input){if(!Array.isArray(input))return;for(let row of input){if(typeof row!=="object"||row===null)continue;if(row.result==="NO-MATCH")throw Error("NO-MATCH is not a valid PR_REVIEW trigger result; use MATCHED or NOT_TRIGGERED with concrete evidence")}}function exactTriggerRows(rows){let expected=new Set(PR_REVIEW_REQUIRED_TRIGGER_IDS),seen=new Set,duplicate=new Set;for(let row of rows){if(seen.has(row.trigger_id))duplicate.add(row.trigger_id);seen.add(row.trigger_id)}let unknown3=[...seen].filter((id)=>!expected.has(id)),missing=[...expected].filter((id)=>!seen.has(id));if(duplicate.size>0||unknown3.length>0||missing.length>0)throw Error(`PR_REVIEW trigger ledger must be exact; missing: ${missing.join(", ")||"(none)"}; duplicate: ${[...duplicate].join(", ")||"(none)"}; unknown: ${unknown3.join(", ")||"(none)"}`);let byId=new Map(rows.map((row)=>[row.trigger_id,row]));return PR_REVIEW_REQUIRED_TRIGGER_IDS.map((id)=>{let row=byId.get(id);if(!row)throw Error(`missing trigger row: ${id}`);return row})}function summarizeTriggerRows(rows){let orderedRows=exactTriggerRows(rows);if(orderedRows.find((row)=>row.trigger_id==="unclassified-risk")?.result!=="MATCHED")throw Error("PR_REVIEW trigger ledger requires unclassified-risk to remain MATCHED as the fallback family");return{rows:orderedRows,matchedIds:orderedRows.filter((row)=>row.result==="MATCHED").map((row)=>row.trigger_id),notTriggeredIds:orderedRows.filter((row)=>row.result==="NOT_TRIGGERED").map((row)=>row.trigger_id)}}function parseRows(input,schema,label){let parsed=exports_external.array(schema).safeParse(input);if(!parsed.success)throw Error(`${label}: ${parsed.error.issues.map((issue3)=>`${issue3.path.join(".")}: ${issue3.message}`).join("; ")}`);return parsed.data}function validatePrReviewInlineTriggerLedger(input){return assertExactTriggerIdSet(input),assertNoLegacyNoMatchResult(input),summarizeTriggerRows(parseRows(input,PrReviewInlineTriggerRowSchema,"Invalid trigger ledger"))}function validatePrReviewPersistedInputLedger(input){return assertExactTriggerIdSet(input),assertNoLegacyNoMatchResult(input),assertMatchedRowsHaveProvenance(input),summarizeTriggerRows(parseRows(input,PrReviewPersistedInputRowSchema,"Invalid persisted trigger ledger"))}function validatePrReviewWriterInputLedger(input){return assertExactTriggerIdSet(input),assertNoLegacyNoMatchResult(input),assertMatchedRowsHaveProvenance(input),summarizeTriggerRows(parseRows(input,PrReviewWriterInputRowSchema,"Invalid final-writer trigger ledger"))}function assertCanonicalDefinitionFields(rows){let definitions=new Map(PR_REVIEW_TRIGGER_DEFINITIONS.map((definition)=>[definition.id,definition]));for(let row of rows){let definition=definitions.get(row.trigger_id);if(!definition||row.scope!==definition.scope||row.trigger_row!==definition.trigger_row||row.micro_lane!==definition.micro_lane)throw Error(`PR_REVIEW trigger definition drift for ${row.trigger_id}: scope, trigger_row, and micro_lane must match the canonical definition`)}}function dispatchedMicroLaneCount(rows){return new Set(rows.filter((row)=>row.result==="MATCHED").map((row)=>`${row.source_batch_id}\x00${row.source_lane_id}`)).size}function buildPrReviewTriggerReceiptV2(input){let envelope=ReceiptEnvelopeSchema.parse(input),validated=validatePrReviewPersistedInputLedger(input.rows),dispatchedCount=dispatchedMicroLaneCount(validated.rows);if(envelope.dispatched_micro_lane_count!==dispatchedCount)throw Error(`PR_REVIEW trigger receipt dispatched_micro_lane_count is inconsistent: expected ${dispatchedCount}`);let rows=validated.rows.map((row)=>{let definition=PR_REVIEW_TRIGGER_DEFINITIONS.find((candidate)=>candidate.id===row.trigger_id);if(!definition)throw Error(`unknown trigger definition: ${row.trigger_id}`);return{trigger_id:row.trigger_id,scope:definition.scope,trigger_row:definition.trigger_row,micro_lane:definition.micro_lane,result:row.result,evidence:row.evidence,...row.result==="MATCHED"?{source_batch_id:row.source_batch_id,source_lane_id:row.source_lane_id}:{}}});return V2ReceiptSchema.parse({...envelope,schema_version:2,trigger_count:rows.length,matched_count:validated.matchedIds.length,not_triggered_count:validated.notTriggeredIds.length,no_match_count:0,rows,coverage_degradations:input.coverage_degradations??[],...input.base_verification?{base_verification:input.base_verification}:{}})}function prReviewTriggerLedgerDigest(rows){let canonical=rows.map((row)=>[row.trigger_id,row.result,row.evidence]);return createHash50("sha256").update(JSON.stringify(canonical)).digest("hex")}function parsedReceipt(schemaVersion,rows,coverageDegradations=[],baseVerification){return{schemaVersion,rows,matchedRows:rows.filter((row)=>row.result==="MATCHED"),notTriggeredRows:rows.filter((row)=>row.result==="NOT_TRIGGERED"),coverageDegradations,...baseVerification?{baseVerification}:{}}}function parsePrReviewTriggerReceipt(input){if(typeof input!=="object"||input===null)throw Error("PR_REVIEW trigger receipt must be an object");let schemaVersion=input.schema_version;if(schemaVersion===2){let receipt=V2ReceiptSchema.parse(input);assertCanonicalDefinitionFields(receipt.rows);let normalizedRows=receipt.rows.map((row)=>({trigger_id:row.trigger_id,result:row.result,evidence:row.evidence,...row.result==="MATCHED"?{source_batch_id:row.source_batch_id,source_lane_id:row.source_lane_id}:{}})),validated2=validatePrReviewPersistedInputLedger(normalizedRows),counts={trigger_count:validated2.rows.length,matched_count:validated2.matchedIds.length,not_triggered_count:validated2.notTriggeredIds.length,no_match_count:0,dispatched_micro_lane_count:dispatchedMicroLaneCount(validated2.rows)};for(let[field,expected]of Object.entries(counts))if(receipt[field]!==expected)throw Error(`PR_REVIEW trigger receipt ${field} is inconsistent: expected ${expected}`);return parsedReceipt(2,validated2.rows,receipt.coverage_degradations,receipt.base_verification)}if(schemaVersion!==void 0&&schemaVersion!==1)throw Error(`Unsupported PR_REVIEW trigger schema_version: ${schemaVersion}`);let legacyEnvelope=schemaVersion===1?V1ReceiptSchema.parse(input):UnversionedRowOnlyReceiptSchema.parse(input),rowsInput=legacyEnvelope.rows,parsedLegacyRows=parseRows(rowsInput,LegacyRowSchema,"Invalid legacy trigger ledger; all rows must be MATCHED with complete source provenance");assertCanonicalDefinitionFields(parsedLegacyRows.filter((row)=>("scope"in row)));let legacyRows=parsedLegacyRows.map((row)=>({trigger_id:row.trigger_id,result:row.result,evidence:row.evidence,source_batch_id:row.source_batch_id,source_lane_id:row.source_lane_id})),validated=summarizeTriggerRows(legacyRows);if(schemaVersion===1){let receipt=legacyEnvelope,countFields={trigger_count:validated.rows.length,matched_count:validated.rows.length,no_match_count:0,dispatched_micro_lane_count:dispatchedMicroLaneCount(validated.rows)};for(let[field,expected]of Object.entries(countFields))if(receipt[field]!==expected)throw Error(`Historical PR_REVIEW trigger receipt ${field} is inconsistent: expected ${expected}`)}return parsedReceipt(schemaVersion===1?1:0,validated.rows)}var PR_REVIEW_MICRO_FAMILY_RETRY_BUDGET=2,PR_REVIEW_TRIGGER_DEFINITIONS,PR_REVIEW_REQUIRED_TRIGGER_IDS,PR_REVIEW_TRIGGER_RECEIPT_MAX_BYTES=2097152,TriggerIdSchema,TriggerEvidenceSchema,PrReviewInlineTriggerRowSchema,PrReviewPersistedInputRowSchema,PrReviewWriterInputRowSchema,TriggerDefinitionFieldShape,V2MatchedRowSchema,V2NotTriggeredRowSchema,V2RowSchema,TriggerCoverageDegradationSchema,ReceiptEnvelopeSchema,V2ReceiptSchema,LegacyRowFieldShape,LegacyBasicRowSchema,LegacyFullRowSchema,LegacyRowSchema,V1ReceiptSchema,UnversionedRowOnlyReceiptSchema;var init_pr_review_trigger_contract=__esm(()=>{init_zod();PR_REVIEW_TRIGGER_DEFINITIONS=[{id:"auth-identity-secrets",scope:"universal",trigger_row:"authentication, authorization, identity, sessions, permissions, secrets, cryptography",micro_lane:"Identity and secret boundaries"},{id:"untrusted-input-boundaries",scope:"universal",trigger_row:"parsing, serialization, queries, templates/rendering, file or network input/output",micro_lane:"Untrusted input and sink analysis"},{id:"subprocess-platform",scope:"universal",trigger_row:"subprocesses, shell commands, filesystem operations, OS/runtime-specific code",micro_lane:"Subprocess and platform safety"},{id:"concurrency-state",scope:"universal",trigger_row:"queues, caches, retries, transactions, locks, state machines, async coordination",micro_lane:"Concurrency and state transitions"},{id:"dependencies-build-release",scope:"universal",trigger_row:"dependency manifests, lockfiles, installers, build scripts, CI, packaging, deployment",micro_lane:"Dependency and delivery integrity"},{id:"api-schema-migrations",scope:"universal",trigger_row:"public API, wire/schema/config/storage formats, migrations, feature flags",micro_lane:"Compatibility and migration safety"},{id:"test-infrastructure",scope:"universal",trigger_row:"tests, mocks, fixtures, harnesses, coverage, CI matrices",micro_lane:"Test validity and isolation"},{id:"ui-accessibility-i18n",scope:"universal",trigger_row:"user interfaces, interaction flows, rendering, accessibility, localization",micro_lane:"UI and human-interface quality"},{id:"privacy-observability",scope:"universal",trigger_row:"telemetry, logs, analytics, traces, retention, diagnostics",micro_lane:"Privacy and observability safety"},{id:"generated-provenance",scope:"universal",trigger_row:"generated, vendored, binary, model-produced, codegen or checked-in build artifacts",micro_lane:"Generated artifact provenance"},{id:"unclassified-risk",scope:"universal",trigger_row:"any changed artifact or behavior not confidently classified by the rows above",micro_lane:"Unclassified high-risk fallback"}],PR_REVIEW_REQUIRED_TRIGGER_IDS=PR_REVIEW_TRIGGER_DEFINITIONS.map((definition)=>definition.id),TriggerIdSchema=exports_external.enum(PR_REVIEW_REQUIRED_TRIGGER_IDS,{error:"unknown PR_REVIEW trigger_id"}),TriggerEvidenceSchema=exports_external.string().trim().min(1).max(4000),PrReviewInlineTriggerRowSchema=exports_external.discriminatedUnion("result",[exports_external.object({trigger_id:TriggerIdSchema,result:exports_external.literal("MATCHED"),evidence:TriggerEvidenceSchema}).strict(),exports_external.object({trigger_id:TriggerIdSchema,result:exports_external.literal("NOT_TRIGGERED"),evidence:TriggerEvidenceSchema}).strict()]),PrReviewPersistedInputRowSchema=exports_external.discriminatedUnion("result",[exports_external.object({trigger_id:TriggerIdSchema,result:exports_external.literal("MATCHED"),evidence:TriggerEvidenceSchema,source_batch_id:exports_external.string().trim().min(1),source_lane_id:exports_external.string().trim().min(1)}).strict(),exports_external.object({trigger_id:TriggerIdSchema,result:exports_external.literal("NOT_TRIGGERED"),evidence:TriggerEvidenceSchema}).strict()]),PrReviewWriterInputRowSchema=exports_external.discriminatedUnion("result",[exports_external.object({trigger_id:TriggerIdSchema,result:exports_external.literal("MATCHED"),evidence:TriggerEvidenceSchema.optional(),source_batch_id:exports_external.string().trim().min(1),source_lane_id:exports_external.string().trim().min(1)}).strict(),exports_external.object({trigger_id:TriggerIdSchema,result:exports_external.literal("NOT_TRIGGERED"),evidence:TriggerEvidenceSchema.optional()}).strict()]);TriggerDefinitionFieldShape={scope:exports_external.literal("universal"),trigger_row:exports_external.string().trim().min(1),micro_lane:exports_external.string().trim().min(1)},V2MatchedRowSchema=exports_external.object({trigger_id:TriggerIdSchema,...TriggerDefinitionFieldShape,result:exports_external.literal("MATCHED"),evidence:TriggerEvidenceSchema,source_batch_id:exports_external.string().trim().min(1),source_lane_id:exports_external.string().trim().min(1)}).strict(),V2NotTriggeredRowSchema=exports_external.object({trigger_id:TriggerIdSchema,...TriggerDefinitionFieldShape,result:exports_external.literal("NOT_TRIGGERED"),evidence:TriggerEvidenceSchema}).strict(),V2RowSchema=exports_external.union([V2MatchedRowSchema,V2NotTriggeredRowSchema]),TriggerCoverageDegradationSchema=exports_external.object({trigger_id:TriggerIdSchema,source_batch_id:exports_external.string().trim().min(1),source_lane_id:exports_external.string().trim().min(1),reason:exports_external.string().trim().min(1)}).strict(),ReceiptEnvelopeSchema=exports_external.object({run_id:exports_external.string().regex(/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/),pr_head_sha:exports_external.string().trim().regex(/^[0-9a-f]{6,64}$/i),base_ref:exports_external.string().trim().regex(/^(?!-)[A-Za-z0-9][A-Za-z0-9._/-]{0,255}$/),base_sha:exports_external.string().trim().regex(/^[0-9a-f]{6,64}$/i),evaluated_at:exports_external.string().datetime(),dispatched_micro_lane_count:exports_external.number().int().min(1)}),V2ReceiptSchema=ReceiptEnvelopeSchema.extend({schema_version:exports_external.literal(2),trigger_count:exports_external.number().int().min(0),matched_count:exports_external.number().int().min(0),not_triggered_count:exports_external.number().int().min(0),no_match_count:exports_external.number().int().min(0),rows:exports_external.array(V2RowSchema),coverage_degradations:exports_external.array(TriggerCoverageDegradationSchema).default([]),base_verification:exports_external.enum(["live","bound_fallback"]).optional()}).strict();LegacyRowFieldShape={trigger_id:TriggerIdSchema,result:exports_external.literal("MATCHED"),evidence:TriggerEvidenceSchema,source_batch_id:exports_external.string().trim().min(1),source_lane_id:exports_external.string().trim().min(1)},LegacyBasicRowSchema=exports_external.object(LegacyRowFieldShape).strict(),LegacyFullRowSchema=exports_external.object({trigger_id:TriggerIdSchema,...TriggerDefinitionFieldShape,result:exports_external.literal("MATCHED"),evidence:TriggerEvidenceSchema,source_batch_id:exports_external.string().trim().min(1),source_lane_id:exports_external.string().trim().min(1)}).strict(),LegacyRowSchema=exports_external.union([LegacyBasicRowSchema,LegacyFullRowSchema]),V1ReceiptSchema=ReceiptEnvelopeSchema.extend({schema_version:exports_external.literal(1),trigger_count:exports_external.number().int().min(0),matched_count:exports_external.number().int().min(0),no_match_count:exports_external.number().int().min(0),rows:exports_external.array(LegacyRowSchema)}).strict(),UnversionedRowOnlyReceiptSchema=exports_external.object({rows:exports_external.array(exports_external.unknown())}).strict()});import{readFileSync as readFileSync43,statSync as statSync42}from"node:fs";function readPrReviewTriggerReceiptForGate(directory,triggerEvalPath){if(!triggerEvalPath)return{noReceipt:!0};let triggerPath=validateSwarmPath(directory,triggerEvalPath),triggerArtifact;try{let triggerStat=statSync42(triggerPath);if(!triggerStat.isFile()||triggerStat.size>PR_REVIEW_TRIGGER_RECEIPT_MAX_BYTES)throw Error("trigger evaluation artifact exceeds its read bound");triggerArtifact=JSON.parse(readFileSync43(triggerPath,"utf-8"))}catch{throw Error("BLOCKED: PR_REVIEW trigger evaluation artifact is missing or invalid")}try{return{receipt:parsePrReviewTriggerReceipt(triggerArtifact)}}catch(error93){throw Error(`BLOCKED: PR_REVIEW trigger evaluation is invalid: ${error93 instanceof Error?error93.message:String(error93)}`)}}function prReviewReceiptHasCoverageDegradations(directory,triggerEvalPath){let read=readPrReviewTriggerReceiptForGate(directory,triggerEvalPath);return"noReceipt"in read?!1:read.receipt.coverageDegradations.length>0}var init_pr_review_trigger_receipt_reader=__esm(()=>{init_utils2();init_pr_review_trigger_contract()});import*as fs71 from"node:fs";import*as path109 from"node:path";function decodeCompleteUtf8Prefix(bytes){let fatalDecoder=new TextDecoder("utf-8",{fatal:!0});try{return fatalDecoder.decode(bytes)}catch{for(let trim=1;trim<=3&&trim<=bytes.byteLength;trim+=1)try{return fatalDecoder.decode(bytes.subarray(0,bytes.byteLength-trim))}catch{}return new TextDecoder().decode(bytes).replace(/\uFFFD+$/u,"")}}function isExecutableFile(candidate){try{return fs71.statSync(candidate).isFile()}catch{return!1}}function resolveExecutableFromPath(names,envPath=process.env.PATH??"",platform=process.platform){let pathEntries=envPath.split(path109.delimiter).filter(Boolean),isWindows=platform==="win32";for(let rawName of names){if(!rawName)continue;if(path109.isAbsolute(rawName)&&isExecutableFile(rawName))return rawName;let extensions=isWindows&&path109.extname(rawName)===""?DEFAULT_WINDOWS_EXTENSIONS:[""];for(let dir of pathEntries)for(let ext of extensions){let candidate=path109.join(dir,`${rawName}${ext}`);if(isExecutableFile(candidate))return candidate}}return null}function clampTimeoutMs(timeoutMs){if(!Number.isFinite(timeoutMs))return MAX_RUNNER_TIMEOUT_MS;return Math.min(Math.max(1,Math.floor(timeoutMs)),MAX_RUNNER_TIMEOUT_MS)}function addTimeoutMs(baseMs,deltaMs){if(baseMs>=MAX_TIMEOUT_MS2)return MAX_TIMEOUT_MS2;return Math.min(MAX_TIMEOUT_MS2,baseMs+deltaMs)}function computeSpawnTimeoutMs(timeoutMs){let total=clampTimeoutMs(timeoutMs);for(let windowMs of[TERMINATION_GRACE_MS,TERMINATION_FORCE_MS,TERMINATION_CONFIRM_MS,TREE_TERMINATION_CONFIRM_MS,TERMINATION_FALLBACK_BUFFER_MS])total=addTimeoutMs(total,windowMs);return total}function startBoundedStreamRead(stream,maxBytes,onLimitExceeded){let reader=stream.getReader(),lockReleased=!1,cancelPromise,releaseLock=()=>{if(lockReleased)return;lockReleased=!0;try{reader.releaseLock()}catch{}},cancel=async()=>{return cancelPromise??=(async()=>{try{await reader.cancel()}catch{}finally{releaseLock()}})(),cancelPromise};if(maxBytes<=0)return onLimitExceeded?.(),{cancel,promise:(async()=>{return await cancel(),{text:"",truncated:!0}})()};return{promise:(async()=>{let chunks=[],total=0,truncated=!1;try{for(;;){let{done,value}=await reader.read();if(done)break;if(!value)continue;let remaining=maxBytes-total;if(value.byteLength>remaining){if(remaining>0)chunks.push(value.slice(0,remaining)),total+=remaining;truncated=!0,onLimitExceeded?.(),cancel();break}chunks.push(value),total+=value.byteLength}}finally{releaseLock()}let out=new Uint8Array(total),offset=0;for(let chunk of chunks)out.set(chunk,offset),offset+=chunk.byteLength;return{text:decodeCompleteUtf8Prefix(out),truncated}})(),cancel}}function timeoutKillSignal(platform){return platform==="win32"?"SIGTERM":"SIGKILL"}function reportKillFailure(error93,signal){if(error93?.code==="ESRCH")return;_internals102.warn(`external tool process kill failed for ${signal}`,error93)}function killProcess(proc){let signal=timeoutKillSignal(_internals102.platform());try{proc?.kill(signal)}catch(error93){reportKillFailure(error93,signal)}}function requestTermination(proc,signal){try{if(proc?.killTree)return proc.killTree(signal).then(()=>!0,(error93)=>{return reportKillFailure(error93,signal),!1});else return proc?.kill(signal),Promise.resolve(proc!==void 0)}catch(error93){return reportKillFailure(error93,signal),Promise.resolve(!1)}}async function waitForExitWithin(exitPromise,waitMs){if(waitMs<=0)return Promise.resolve(null);let timeoutHandle;try{return await Promise.race([exitPromise,new Promise((resolve54)=>{timeoutHandle=_internals102.setTimeout(()=>resolve54(null),waitMs)})])}finally{if(timeoutHandle!==void 0)_internals102.clearTimeout(timeoutHandle)}}async function waitForValueWithin(promise3,waitMs){let timeoutHandle;try{return await Promise.race([promise3.then((value)=>({completed:!0,value})),new Promise((resolve54)=>{timeoutHandle=_internals102.setTimeout(()=>resolve54({completed:!1}),waitMs)})])}finally{if(timeoutHandle!==void 0)_internals102.clearTimeout(timeoutHandle)}}async function collectBoundedStreams(stdoutRead,stderrRead,proc,treeAlreadyConfirmed=!1){let reads=Promise.all([stdoutRead.promise,stderrRead.promise]),collected=await waitForValueWithin(reads,STREAM_DRAIN_MS);if(!collected.completed){let treeTermination=waitForValueWithin(requestTermination(proc,"SIGKILL"),TREE_TERMINATION_CONFIRM_MS);Promise.allSettled([stdoutRead.cancel(),stderrRead.cancel()]),collected=await waitForValueWithin(reads,STREAM_CANCEL_MS);let terminationResult=await treeTermination;if(!treeAlreadyConfirmed&&(!terminationResult.completed||!terminationResult.value))return{kind:"unconfirmed-termination"}}if(!collected.completed)return{kind:"cleanup-failed"};return{kind:"collected",stdout:collected.value[0],stderr:collected.value[1]}}async function runExternalTool(options){if(!path109.isAbsolute(options.cwd))return{status:"spawn-error",exitCode:null,stdout:"",stderr:"",stdoutTruncated:!1,stderrTruncated:!1,message:"external tool cwd must be absolute"};if(options.abortSignal?.aborted)return{status:"cancelled",exitCode:null,stdout:"",stderr:"",stdoutTruncated:!1,stderrTruncated:!1,message:"external tool execution cancelled before spawn"};let proc,timeoutHandle,abortListener,overflowTreeTermination,exitSettled=!1,settledExitCode=null,runnerTimeoutMs=clampTimeoutMs(options.timeoutMs),spawnTimeoutMs=computeSpawnTimeoutMs(runnerTimeoutMs);try{proc=_internals102.bunSpawn([options.executable,...options.args],{cwd:options.cwd,env:options.env,stdin:"ignore",stdout:"pipe",stderr:"pipe",timeout:spawnTimeoutMs,killProcessTree:!0,windowsVerbatimArguments:options.windowsVerbatimArguments});let exitPromise=proc.exited.then((exitCode)=>{return exitSettled=!0,settledExitCode=exitCode,exitCode}),exitRacePromise=exitPromise.then((exitCode)=>({kind:"exit",exitCode})),timeout=new Promise((resolve54)=>{timeoutHandle=_internals102.setTimeout(()=>{if(exitSettled){resolve54({kind:"exit",exitCode:settledExitCode??proc?.exitCode??0});return}resolve54({kind:"timeout"})},runnerTimeoutMs)}),cancelled=new Promise((resolve54)=>{if(!options.abortSignal)return;let handled=!1;if(abortListener=()=>{if(handled)return;handled=!0,resolve54({kind:"cancelled"})},options.abortSignal.addEventListener("abort",abortListener,{once:!0}),options.abortSignal.aborted)abortListener()}),terminateOnOverflow=()=>{overflowTreeTermination??=requestTermination(proc,"SIGKILL")},stdoutRead=startBoundedStreamRead(proc.stdout,options.maxStdoutBytes,terminateOnOverflow),stderrRead=startBoundedStreamRead(proc.stderr,options.maxStderrBytes,terminateOnOverflow),exitResult=await Promise.race([exitRacePromise,timeout,cancelled]);if(exitResult.kind==="timeout"||exitResult.kind==="cancelled"){let gracefulTreeTermination=requestTermination(proc,"SIGTERM"),confirmedExitCode=await waitForExitWithin(exitPromise,TERMINATION_GRACE_MS);if(!overflowTreeTermination)overflowTreeTermination=requestTermination(proc,"SIGKILL");let treeTerminationResult=waitForValueWithin(Promise.all([gracefulTreeTermination,overflowTreeTermination]),TREE_TERMINATION_CONFIRM_MS);if(confirmedExitCode===null)confirmedExitCode=await waitForExitWithin(exitPromise,TERMINATION_FORCE_MS);if(confirmedExitCode===null)confirmedExitCode=await waitForExitWithin(exitPromise,TERMINATION_CONFIRM_MS);let treeTermination=await treeTerminationResult,treeTerminationConfirmed=treeTermination.completed&&treeTermination.value.some(Boolean);Promise.allSettled([stdoutRead.cancel(),stderrRead.cancel()]);let streams2=await collectBoundedStreams(stdoutRead,stderrRead,proc,treeTerminationConfirmed);if(streams2.kind!=="collected")return{status:"spawn-error",exitCode:confirmedExitCode??proc.exitCode,stdout:"",stderr:"",stdoutTruncated:!0,stderrTruncated:!0,message:streams2.kind==="unconfirmed-termination"?UNCONFIRMED_TERMINATION_MESSAGE:"external tool output cleanup did not complete"};let{stdout:stdout2,stderr:stderr2}=streams2;if(confirmedExitCode===null||!treeTerminationConfirmed)return{status:"spawn-error",exitCode:proc.exitCode,stdout:stdout2.text,stderr:stderr2.text,stdoutTruncated:stdout2.truncated,stderrTruncated:stderr2.truncated,message:UNCONFIRMED_TERMINATION_MESSAGE};if(exitResult.kind==="timeout")return{status:"timeout",exitCode:confirmedExitCode,stdout:stdout2.text,stderr:stderr2.text,stdoutTruncated:stdout2.truncated,stderrTruncated:stderr2.truncated};return{status:"cancelled",exitCode:confirmedExitCode,stdout:stdout2.text,stderr:stderr2.text,stdoutTruncated:stdout2.truncated,stderrTruncated:stderr2.truncated,message:"external tool execution cancelled"}}let streams=await collectBoundedStreams(stdoutRead,stderrRead,proc);if(streams.kind!=="collected")return{status:"spawn-error",exitCode:exitResult.exitCode,stdout:"",stderr:"",stdoutTruncated:!0,stderrTruncated:!0,message:streams.kind==="unconfirmed-termination"?UNCONFIRMED_TERMINATION_MESSAGE:"external tool output cleanup did not complete"};let{stdout,stderr}=streams;if(overflowTreeTermination){let overflowTermination=await waitForValueWithin(overflowTreeTermination,TREE_TERMINATION_CONFIRM_MS);if(!overflowTermination.completed||!overflowTermination.value)return{status:"spawn-error",exitCode:exitResult.exitCode,stdout:stdout.text,stderr:stderr.text,stdoutTruncated:stdout.truncated,stderrTruncated:stderr.truncated,message:UNCONFIRMED_TERMINATION_MESSAGE}}if(proc.spawnError)return{status:"spawn-error",exitCode:proc.exitCode,stdout:stdout.text,stderr:stderr.text,stdoutTruncated:stdout.truncated,stderrTruncated:stderr.truncated,message:proc.spawnError.message};if(proc.signalCode)return{status:"spawn-error",exitCode:exitResult.exitCode,stdout:stdout.text,stderr:stderr.text,stdoutTruncated:stdout.truncated,stderrTruncated:stderr.truncated,message:`external tool terminated by signal ${proc.signalCode}`};return{status:"completed",exitCode:exitResult.exitCode,stdout:stdout.text,stderr:stderr.text,stdoutTruncated:stdout.truncated,stderrTruncated:stderr.truncated}}catch(err){return{status:"spawn-error",exitCode:proc?.exitCode??null,stdout:"",stderr:"",stdoutTruncated:!1,stderrTruncated:!1,message:err instanceof Error?err.message:String(err)}}finally{if(timeoutHandle!==void 0)_internals102.clearTimeout(timeoutHandle);if(abortListener&&options.abortSignal)options.abortSignal.removeEventListener("abort",abortListener);if(!exitSettled)killProcess(proc)}}var DEFAULT_WINDOWS_EXTENSIONS,TERMINATION_GRACE_MS=20,TERMINATION_FORCE_MS=20,TERMINATION_CONFIRM_MS=20,TREE_TERMINATION_CONFIRM_MS=5100,TERMINATION_FALLBACK_BUFFER_MS=1,STREAM_DRAIN_MS=50,STREAM_CANCEL_MS=50,MAX_TIMEOUT_MS2=2147483647,TERMINATION_WINDOWS_MS,MAX_RUNNER_TIMEOUT_MS,UNCONFIRMED_TERMINATION_MESSAGE="external tool process termination could not be confirmed",_internals102;var init_external_tool_runner=__esm(()=>{init_bun_compat();init_logger();DEFAULT_WINDOWS_EXTENSIONS=[".exe",".cmd",".bat"],TERMINATION_WINDOWS_MS=TERMINATION_GRACE_MS+TERMINATION_FORCE_MS+TERMINATION_CONFIRM_MS+TREE_TERMINATION_CONFIRM_MS+TERMINATION_FALLBACK_BUFFER_MS,MAX_RUNNER_TIMEOUT_MS=MAX_TIMEOUT_MS2-TERMINATION_WINDOWS_MS;_internals102={bunSpawn,platform:()=>process.platform,now:()=>Date.now(),setTimeout,clearTimeout,clampTimeoutMs,computeSpawnTimeoutMs,warn}});import*as fsp4 from"node:fs/promises";import*as path110 from"node:path";function boundPath(value){let cleaned=value.replace(/[\p{Cc}]/gu," ").replace(/[`<>]/g," ").replace(/\s+/g," ").trim();return cleaned.length>MAX_EVIDENCE_PATH_LENGTH?`${cleaned.slice(0,MAX_EVIDENCE_PATH_LENGTH)}...`:cleaned}function evidence(parsed,worktreeRoot,gitDir,operations,detail){let allPaths=parsed?[...parsed.unmergedPaths,...parsed.dirtySubmodulePaths,...parsed.dirtyTrackedPaths,...parsed.untrackedPaths]:[],uniquePaths=[...new Set(allPaths)].map(boundPath);return{worktreeRoot:worktreeRoot?boundPath(worktreeRoot):null,gitDir:gitDir?boundPath(gitDir):null,operations,unmergedCodes:parsed?[...new Set(parsed.unmergedCodes)].sort():[],paths:uniquePaths.slice(0,MAX_EVIDENCE_PATHS),trackedCount:parsed?.dirtyTrackedPaths.length??0,untrackedCount:parsed?.untrackedPaths.length??0,pathsTruncated:uniquePaths.length>MAX_EVIDENCE_PATHS,...detail?{detail}:{}}}async function runGitCapture(directory,args2){let result=await runExternalTool({executable:resolveGitExecutable(),args:[...args2],cwd:path110.resolve(directory),timeoutMs:GIT_TIMEOUT_MS4,maxStdoutBytes:MAX_GIT_OUTPUT_BYTES,maxStderrBytes:65536});return{ok:result.status==="completed"&&result.exitCode===0&&!result.stdoutTruncated&&!result.stderrTruncated,stdout:result.stdout}}async function activeOperations(gitDir){return(await Promise.all(OPERATION_MARKERS.map(async([name,marker])=>{try{return await fsp4.lstat(path110.join(gitDir,marker)),name}catch(error93){if(error93.code==="ENOENT")return null;throw error93}}))).filter((value)=>value!==null)}async function classifyPrWorkflowGitState(directory,options={}){let[statusResult,rootResult,gitDirResult]=await Promise.all([_internals103.runGitCapture(directory,["status","--porcelain=v2","--branch","-z","--untracked-files=all"]),_internals103.runGitCapture(directory,["rev-parse","--show-toplevel"]),_internals103.runGitCapture(directory,["rev-parse","--absolute-git-dir"])]);if(!statusResult.ok||!rootResult.ok||!gitDirResult.ok)return{kind:"indeterminate",code:"GIT_STATE_INDETERMINATE",retryable:!1,requiredAction:"Confirm this is a readable Git worktree and resolve filesystem or Git errors before starting the PR workflow.",evidence:evidence(null,null,null,[],"required Git inspection failed")};let worktreeRoot=rootResult.stdout.trim(),gitDir=gitDirResult.stdout.trim(),parsedRaw=parsePorcelainV2Snapshot(statusResult.stdout);if(!worktreeRoot||!gitDir||!parsedRaw)return{kind:"indeterminate",code:"GIT_STATE_INDETERMINATE",retryable:!1,requiredAction:"Resolve the malformed or incomplete Git status before starting the PR workflow.",evidence:evidence(parsedRaw,worktreeRoot||null,gitDir||null,[],"Git returned an incomplete status snapshot")};let ignoredPaths=new Set((options.ignoredPaths??[]).map((value)=>value.replace(/\\/g,"/"))),keepPath=(value)=>!ignoredPaths.has(value.replace(/\\/g,"/")),parsed={...parsedRaw,dirtyTrackedPaths:parsedRaw.dirtyTrackedPaths.filter(keepPath),untrackedPaths:parsedRaw.untrackedPaths.filter(keepPath),unmergedPaths:parsedRaw.unmergedPaths.filter(keepPath),dirtySubmodulePaths:parsedRaw.dirtySubmodulePaths.filter(keepPath)},operations;try{operations=await _internals103.activeOperations(path110.resolve(gitDir))}catch{return{kind:"indeterminate",code:"GIT_STATE_INDETERMINATE",retryable:!1,requiredAction:"Resolve the unreadable Git operation state before starting the PR workflow.",evidence:evidence(parsed,worktreeRoot,gitDir,[],"Git operation markers could not be inspected")}}let stateEvidence=evidence(parsed,worktreeRoot,gitDir,operations);if(parsed.unmergedCodes.length>0)return{kind:"recovery-required",code:"UNMERGED_INDEX",retryable:!1,requiredAction:"Resolve or abort the current merge/rebase/cherry-pick/revert operation manually; conflicted index entries must never be stashed by PR workflow startup.",evidence:stateEvidence};if(operations.length>0)return{kind:"recovery-required",code:"GIT_OPERATION_IN_PROGRESS",retryable:!1,requiredAction:"Complete or abort the active Git operation manually before starting the PR workflow.",evidence:stateEvidence};if(parsed.dirtySubmodulePaths.length>0)return{kind:"recovery-required",code:"DIRTY_SUBMODULE",retryable:!1,requiredAction:"Resolve or preserve dirty submodule worktrees manually; the checkout-preparation stash cannot safely preserve them.",evidence:stateEvidence};if([...parsed.dirtyTrackedPaths,...parsed.untrackedPaths].find((candidate)=>candidate===".swarm"||candidate.startsWith(".swarm/")||candidate.startsWith(".swarm\\")))return{kind:"recovery-required",code:"SWARM_STATE_TRACKING_ERROR",retryable:!1,requiredAction:"Restore .swarm/ so it is git-excluded before starting the PR workflow; runtime state must not be treated as checkout dirt.",evidence:stateEvidence};if(parsed.dirtyTrackedPaths.length===0&&parsed.untrackedPaths.length===0)return{kind:"clean",code:"CLEAN",retryable:!0,requiredAction:"No checkout recovery is required.",evidence:stateEvidence};return{kind:"stashable",code:"STASHABLE_CHANGES",retryable:!0,requiredAction:"Run prepare_pr_workflow_checkout once to preserve the ordinary working-tree changes before checkout.",evidence:stateEvidence}}var GIT_TIMEOUT_MS4=5000,MAX_GIT_OUTPUT_BYTES=524288,MAX_EVIDENCE_PATHS=20,MAX_EVIDENCE_PATH_LENGTH=240,OPERATION_MARKERS,_internals103;var init_pr_workflow_state=__esm(()=>{init_workspace_snapshot();init_external_tool_runner();init_git_executable();OPERATION_MARKERS=[["merge","MERGE_HEAD"],["rebase-merge","rebase-merge"],["rebase-apply-or-am","rebase-apply"],["cherry-pick","CHERRY_PICK_HEAD"],["revert","REVERT_HEAD"],["bisect","BISECT_START"],["sequencer","sequencer"]];_internals103={runGitCapture,activeOperations,parsePorcelainV2:parsePorcelainV2Snapshot}});import{createHash as createHash51}from"node:crypto";function computeRedactionPolicyVersion(policy){return 2000000+SECRET_PATTERNS.length*2+(policy.rejectDurableSecrets?1:0)+(policy.detectPii?4:0)+(policy.rejectDurablePii?8:0)+(policy.piiDetector==="ner"?16:0)}function classifyStoredFingerprintAlgorithmVersion(rawStoredVersion,currentVersion=_internals104.currentAlgorithmVersion){let storedVersion=rawStoredVersion===void 0?LEGACY_FINGERPRINT_ALGORITHM_VERSION:rawStoredVersion;if(typeof storedVersion!=="number"||!Number.isFinite(storedVersion))return{status:"unknown"};return storedVersion===currentVersion?{status:"comparable"}:{status:"mismatch",storedVersion,currentVersion}}function computeMemoryCohortFingerprint(input){let canonical=stableCanonicalStringify(input);return createHash51("sha256").update(canonical).digest("hex").slice(0,12)}function buildMemoryCohortFingerprintInput(config3){return{provider:config3.provider,redaction_policy_version:computeRedactionPolicyVersion({rejectDurableSecrets:config3.redaction.rejectDurableSecrets,detectPii:config3.redaction.detectPii,rejectDurablePii:config3.redaction.rejectDurablePii,piiDetector:config3.redaction.piiDetector}),embedding_model:config3.embeddings.model,embedding_dimension:config3.embeddings.dimension,embedding_version:config3.embeddings.version??"default"}}function findSecrets(text){let findings=[];for(let{type,pattern}of SECRET_PATTERNS){pattern.lastIndex=0;for(let match of text.matchAll(pattern))if(match[0])findings.push({type,match:match[0]})}return findings}function containsSecret(text){return findSecrets(text).length>0}function redactSecrets(text){let redacted=text;for(let{type,pattern}of SECRET_PATTERNS)pattern.lastIndex=0,redacted=redacted.replace(pattern,`[REDACTED:${type}]`);return redacted}var SECRET_PATTERNS,FINGERPRINT_ALGORITHM_VERSION=2,LEGACY_FINGERPRINT_ALGORITHM_VERSION=1,_internals104;var init_redaction=__esm(()=>{SECRET_PATTERNS=[{type:"openai_api_key",pattern:/\bsk-[A-Za-z0-9_-]{20,}\b/g},{type:"github_token",pattern:/\b(?:ghp|gho|ghu|ghs|ghr|github_pat)_[A-Za-z0-9_]{20,}\b/g},{type:"aws_access_key_id",pattern:/\bAKIA[0-9A-Z]{16}\b/g},{type:"private_key_block",pattern:/-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/g},{type:"authorization_bearer",pattern:/\bAuthorization\s*:\s*Bearer\s+[A-Za-z0-9._~+/=-]{12,}/gi},{type:"env_secret",pattern:/\b(?:[A-Z][A-Z0-9]+_)+(?:KEY|TOKEN|SECRET|PASSWORD)\b\s*=\s*["']?[^\s"'`]{8,}["']?/gi},{type:"gitlab_token",pattern:/\bgl(?:pat|ptt)-[A-Za-z0-9_-]{15,}\b/g},{type:"slack_token",pattern:/\bxox[abprs]-[A-Za-z0-9-]{10,}\b/g},{type:"jwt_token",pattern:/\beyJ[A-Za-z0-9_-]+\.eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/g},{type:"aws_secret_access_key",pattern:/\b(?:aws_secret_access_key|AWS_SECRET_ACCESS_KEY|secret_access_key|SecretAccessKey)"?\s*[=:]\s*["']?[A-Za-z0-9/+=]{40}\b/g},{type:"aws_secret_access_key_context",pattern:/\bAKIA[0-9A-Z]{16}\b[^\n]{0,200}?\b[A-Za-z0-9/+=]{40}\b/g},{type:"stripe_secret_key",pattern:/\b(?:sk|rk)_(?:live|test)_[A-Za-z0-9]{24,}\b/g},{type:"google_api_key",pattern:/\bAIza[0-9A-Za-z_-]{35}\b/g},{type:"openssh_private_key_block",pattern:/-----BEGIN[ ]OPENSSH[ ]PRIVATE[ ]KEY-----[\s\S]*?-----END[ ]OPENSSH[ ]PRIVATE[ ]KEY-----/g}];_internals104={currentAlgorithmVersion:FINGERPRINT_ALGORITHM_VERSION}});import{createHash as createHash52,randomUUID as randomUUID15}from"node:crypto";import*as fsp5 from"node:fs/promises";import*as path111 from"node:path";function normalizeSessionID(sessionID){let normalized=sessionID.trim();if(!normalized)throw Error("BLOCKED: PR workflow gate requires a non-empty sessionID");return normalized}function prWorkflowSessionFileStem(sessionID){let normalized=normalizeSessionID(sessionID),slug=normalized.replace(/[^A-Za-z0-9_.-]/g,"_").slice(0,80)||"session",digest3=createHash52("sha256").update(normalized).digest("hex").slice(0,12);return`${slug}-${digest3}`}function workflowGateStateRelativePath(sessionID){return path111.join(WORKFLOW_GATE_DIR,`${prWorkflowSessionFileStem(sessionID)}.json`)}function workflowGateStateLockRelativePath(sessionID){return path111.join(WORKFLOW_GATE_DIR,`${prWorkflowSessionFileStem(sessionID)}.lock`)}function workflowCheckoutMutationLockRelativePath(){return path111.join(WORKFLOW_GATE_DIR,"checkout.lock")}function workflowGateStatePath(directory,sessionID){return validateSwarmPath(directory,workflowGateStateRelativePath(sessionID))}function workflowGateStateImportedPath(directory,sessionID){return`${workflowGateStatePath(directory,sessionID)}.imported`}function workflowGateStateProjectionMarkerPath(directory,sessionID){return`${workflowGateStatePath(directory,sessionID)}.sqlite-projection`}function workflowGateStateCoordinationNamespace(sessionID){return`${WORKFLOW_STATE_COORDINATION_PREFIX}:${prWorkflowSessionFileStem(sessionID)}`}function workflowGateStateLockPath(directory,sessionID){return validateSwarmPath(directory,workflowGateStateLockRelativePath(sessionID))}function workflowCheckoutMutationLockPath(directory){return validateSwarmPath(directory,workflowCheckoutMutationLockRelativePath())}function isoNow(){return new Date().toISOString()}function delay(ms){return new Promise((resolve56)=>setTimeout(resolve56,ms))}function sameBigIntFileIdentity(left,right){return left.dev===right.dev&&left.ino===right.ino}function normalizeComparableFsPath(value){let normalized=path111.normalize(path111.resolve(value));return process.platform==="win32"?normalized.toLowerCase():normalized}function stateCacheKey(directory,sessionID){return`${canonicalRootKeyFresh(directory)}\x00${normalizeSessionID(sessionID)}`}function rememberState(directory,state2){let cacheKey=stateCacheKey(directory,state2.sessionID);trackedStatesByProjectSession.delete(cacheKey),trackedStatesByProjectSession.set(cacheKey,state2);while(trackedStatesByProjectSession.size>MAX_TRACKED_SESSIONS2){let oldestKey=trackedStatesByProjectSession.keys().next().value;if(!oldestKey)break;trackedStatesByProjectSession.delete(oldestKey)}}function forgetTrackedPrWorkflowState(directory,sessionID){trackedStatesByProjectSession.delete(stateCacheKey(directory,sessionID))}function resetPrReviewPersistenceCaches(){trackedStatesByProjectSession.clear(),pendingStateMutationsByProjectSession.clear(),pendingCheckoutMutationsByProject.clear(),completedCheckoutLockOwners.clear()}function defaultIsProcessAlive(pid){try{return process.kill(pid,0),!0}catch(error93){return error93.code!=="ESRCH"}}function bindPrReviewPersistenceHooks(nextHooks){hooks=nextHooks}function bindPrReviewStateCodec(nextCodec){codec3=nextCodec}function requireCodec(){if(!codec3)throw Error("BLOCKED: PR workflow persistence codec is not bound (the gate must bind it at module init)");return codec3}async function ensurePrWorkflowSafeParentDirectory(directory,filePath){let swarmRoot=path111.resolve(directory,".swarm"),parentPath=path111.dirname(path111.resolve(filePath)),relativeParent=path111.relative(swarmRoot,parentPath);if(relativeParent===".."||relativeParent.startsWith(`..${path111.sep}`)||path111.isAbsolute(relativeParent))throw Error("BLOCKED: PR workflow atomic destination escapes the project .swarm directory");await fsp5.mkdir(swarmRoot,{recursive:!0});let currentPath=swarmRoot,currentIdentity=await assertSafeDirectory(currentPath,void 0);for(let segment of relativeParent.split(path111.sep).filter(Boolean)){let nextPath=path111.join(currentPath,segment);await hooks.beforeSafeDirectoryCreate?.(currentPath,nextPath),await assertSafeDirectory(currentPath,currentIdentity);try{await fsp5.mkdir(nextPath)}catch(error93){if(error93.code!=="EEXIST")throw error93}await assertSafeDirectory(currentPath,currentIdentity);let nextIdentity=await assertSafeDirectory(nextPath,void 0),[realCurrent,realNext]=await Promise.all([fsp5.realpath(currentPath),fsp5.realpath(nextPath)]);if(normalizeComparableFsPath(path111.dirname(realNext))!==normalizeComparableFsPath(realCurrent))throw Error("BLOCKED: PR workflow directory creation escaped the project .swarm tree");currentPath=nextPath,currentIdentity=nextIdentity}let realRoot=await fsp5.realpath(swarmRoot),realParent=await fsp5.realpath(parentPath),relativeRealParent=path111.relative(realRoot,realParent);if(relativeRealParent===".."||relativeRealParent.startsWith(`..${path111.sep}`)||path111.isAbsolute(relativeRealParent))throw Error("BLOCKED: PR workflow atomic parent escapes the project .swarm directory");return realParent}async function assertSafeDirectory(directoryPath,expectedIdentity){let stat11=await fsp5.lstat(directoryPath,{bigint:!0});if(stat11.isSymbolicLink()||!stat11.isDirectory()||expectedIdentity&&!sameBigIntFileIdentity(stat11,expectedIdentity))throw Error("BLOCKED: PR workflow .swarm path must be a real directory and must not change during the operation");return{dev:stat11.dev,ino:stat11.ino}}async function assertOpenedSwarmFileIdentity(directory,filePath,handle,expectedParent,label){let openedStat=await handle.stat({bigint:!0});if(!openedStat.isFile())throw Error(`BLOCKED: ${label} is not a file`);return await assertClosedSwarmFileIdentity(directory,filePath,openedStat,expectedParent,label),{dev:openedStat.dev,ino:openedStat.ino}}async function assertClosedSwarmFileIdentity(directory,filePath,expectedIdentity,expectedParent,label){if(!expectedIdentity)throw Error(`BLOCKED: ${label} has no identity`);let[stat11,realRoot,realFile,realParent]=await Promise.all([fsp5.lstat(filePath,{bigint:!0}),fsp5.realpath(path111.resolve(directory,".swarm")),fsp5.realpath(filePath),fsp5.realpath(path111.dirname(filePath))]),relativeFile=path111.relative(realRoot,realFile);if(stat11.isSymbolicLink()||!stat11.isFile()||!sameBigIntFileIdentity(stat11,expectedIdentity)||normalizeComparableFsPath(realParent)!==normalizeComparableFsPath(expectedParent)||relativeFile===""||relativeFile===".."||relativeFile.startsWith(`..${path111.sep}`)||path111.isAbsolute(relativeFile))throw Error(`BLOCKED: ${label} changed or escaped .swarm`)}async function writeAtomicJson2(directory,filePath,value){let safeParent=await ensurePrWorkflowSafeParentDirectory(directory,filePath),tempPath=`${filePath}.tmp.${process.pid}.${randomUUID15()}`,tempIdentity,lastError;try{let handle=await fsp5.open(tempPath,"wx");try{await hooks.beforeAtomicTempWrite?.(),tempIdentity=await assertOpenedSwarmFileIdentity(directory,tempPath,handle,safeParent,"PR workflow atomic temporary file"),await handle.writeFile(JSON.stringify(value,null,2),"utf-8"),await handle.sync()}finally{await handle.close()}await hooks.beforeAtomicRename?.(),await assertClosedSwarmFileIdentity(directory,tempPath,tempIdentity,safeParent,"PR workflow atomic temporary file");for(let attempt=0;attempt<WINDOWS_RENAME_MAX_RETRIES3;attempt++)try{await hooks.rename(tempPath,filePath),lastError=void 0;break}catch(error93){lastError=error93;let code=error93.code;if(code!=="EEXIST"&&code!=="EPERM"&&code!=="EBUSY")break;if(attempt<WINDOWS_RENAME_MAX_RETRIES3-1)await delay(RENAME_RETRY_DELAY_MS3)}if(lastError)throw lastError;await assertClosedSwarmFileIdentity(directory,filePath,tempIdentity,safeParent,"PR workflow atomic destination file")}finally{try{await fsp5.rm(tempPath,{force:!0})}catch{}}}async function writePrWorkflowAtomicJson(directory,filePath,value){await writeAtomicJson2(directory,filePath,value)}async function readPrWorkflowGateStateFromDisk(directory,sessionID,options={}){let authoritative=await readPrWorkflowGateStateFromCoordination(directory,sessionID);if(authoritative)return await repairImportedWorkflowGateShadow(directory,sessionID,authoritative),authoritative;return importLegacyPrWorkflowGateStateIfNeeded(directory,sessionID,options.allowSalvagedImport===!0)}async function readPrWorkflowGateStateFileRawFromDisk(filePath,stateLabel){let raw;try{raw=await fsp5.readFile(filePath,"utf-8")}catch(error93){if(error93.code==="ENOENT")return null;throw error93}let parsedJson;try{parsedJson=JSON.parse(raw)}catch{throw Error(`BLOCKED: PR workflow gate state for session "${stateLabel}" is not valid JSON`)}let parsed=requireCodec().safeParse(parsedJson);if(!parsed.success)throw Error(`BLOCKED: PR workflow gate state for session "${stateLabel}" is invalid`);return parsed.data}async function readPrWorkflowGateStateFileFromDisk(filePath,stateLabel){return readPrWorkflowGateStateFileRawFromDisk(filePath,stateLabel)}async function readPrWorkflowGateStateFromCoordination(directory,sessionID){return readPrWorkflowGateStateCoordinationRow(directory,sessionID)?.state??null}function readPrWorkflowGateStateCoordinationForRecovery(directory,sessionID){let normalizedSessionID=normalizeSessionID(sessionID),row=getCoordinationStateRaw(directory,workflowGateStateCoordinationNamespace(normalizedSessionID),WORKFLOW_STATE_ENTITY_KEY);if(!row)return{kind:"absent"};if(row.payload.length>MAX_COORDINATION_PAYLOAD_CHARS)return{kind:"corrupt",rowRevision:row.revision,generation:row.generation,reason:"coordination payload exceeds the maximum size"};let parsedJson;try{parsedJson=JSON.parse(row.payload)}catch{return{kind:"corrupt",rowRevision:row.revision,generation:row.generation,reason:"coordination payload is not valid JSON"}}let parsed=requireCodec().safeParse(parsedJson);if(!parsed.success)return{kind:"corrupt",rowRevision:row.revision,generation:row.generation,reason:"coordination payload failed the workflow state schema"};if(parsed.data.sessionID!==normalizedSessionID)return{kind:"invalid",reason:"coordination payload session identity does not match the requested session"};if(parsed.data.revision!==row.generation)return{kind:"corrupt",rowRevision:row.revision,generation:row.generation,reason:"coordination payload revision does not match its generation"};return{kind:"valid",rowRevision:row.revision,generation:row.generation,state:parsed.data}}function readPrWorkflowGateStateCoordinationRow(directory,sessionID){let row=getCoordinationState(directory,workflowGateStateCoordinationNamespace(sessionID),WORKFLOW_STATE_ENTITY_KEY);if(!row)return null;let parsedJson;try{parsedJson=JSON.parse(row.payload)}catch{throw Error(`BLOCKED: PR workflow gate state for session "${sessionID}" is not valid JSON`)}let parsed=requireCodec().safeParse(parsedJson);if(!parsed.success||parsed.data.sessionID!==normalizeSessionID(sessionID)||parsed.data.revision!==row.generation)throw Error(`BLOCKED: PR workflow gate state for session "${sessionID}" is invalid`);return{rowRevision:row.revision,state:parsed.data}}function workflowStateStatus(state2){let mode=state2.mode;return typeof mode==="string"&&mode.trim().length>0?mode:"active"}async function fileExists(filePath){try{return await fsp5.stat(filePath),!0}catch(error93){if(error93.code==="ENOENT")return!1;throw error93}}function serializeWorkflowGateState(state2){return JSON.stringify(state2,null,2)}async function readTextFileIfExists(filePath){try{return await fsp5.readFile(filePath,"utf8")}catch(error93){if(error93.code==="ENOENT")return null;throw error93}}async function writeProjectionMarker(directory,filePath){await ensurePrWorkflowSafeParentDirectory(directory,filePath),await fsp5.writeFile(filePath,`sqlite-projection
|
|
1273
|
+
`),!0}catch(error93){return warn(`[background] reservation write failed: ${error93 instanceof Error?error93.message:String(error93)}`),!1}}function reservationOwnerKey(input){return input.planTaskId===null?`call:${input.parentSessionId}:${input.callID}`:`task:${input.parentSessionId}:${input.planTaskId}`}function isActiveCoderOwner(record3){if(record3.normalizedAgent!=="coder"||record3.status==="consumed")return!1;if(record3.status==="pending"||record3.status==="running"||record3.status==="completed"||record3.status==="ingestion_error")return!0;if(record3.coderSettlement?.state==="preserved")return!0;return record3.worktree!==void 0}async function scanDurableCoderOwners(directory){let fallbackScan=await scanDelegationFallbacksForRecovery(directory);if(fallbackScan.status==="uncertain")return fallbackScan;let primaryScan=scanDelegationsForRecovery(directory);if(primaryScan.status==="uncertain")return primaryScan;let recordsByCorrelation=new Map;for(let artifact of fallbackScan.owners)recordsByCorrelation.set(artifact.correlationId,artifact.record);let primaryByCorrelation=new Map,primaryByReservationId=new Map;for(let record3 of primaryScan.owners){if(primaryByCorrelation.set(record3.correlationId,record3),record3.coderReservationId){let owners=primaryByReservationId.get(record3.coderReservationId)??[];owners.push(record3),primaryByReservationId.set(record3.coderReservationId,owners)}recordsByCorrelation.set(record3.correlationId,record3)}return{status:"ok",recordsByCorrelation,primaryByCorrelation,primaryByReservationId}}function exactReservationOwnerCoordinates(reservation,record3){return record3.coderReservationId===reservation.reservationId&&record3.parentSessionId===reservation.parentSessionId&&record3.planTaskId===reservation.planTaskId&&record3.callID===reservation.callID}function exactReservationRecordMatch(reservation,record3){return exactReservationOwnerCoordinates(reservation,record3)&&record3.correlationId===reservation.correlationId}function findExactPrimaryReservationOwner(reservation,ownerScan){if(reservation.correlationId!==null){let primary=ownerScan.primaryByCorrelation.get(reservation.correlationId);return primary&&exactReservationRecordMatch(reservation,primary)?primary:null}let exactOwners=(ownerScan.primaryByReservationId.get(reservation.reservationId)??[]).filter((record3)=>exactReservationOwnerCoordinates(reservation,record3));return exactOwners.length===1?exactOwners[0]:null}function hasProvenReleasedReservationOwner(record3){if(record3.status==="consumed")return!0;return record3.worktree===void 0&&(record3.status==="error"||record3.status==="cancelled")&&record3.terminalResult?.status===record3.status}function validateReservationIdentity(input){return typeof input.parentSessionId==="string"&&input.parentSessionId.length>0&&input.parentSessionId.length<=256&&input.parentSessionId.trim()===input.parentSessionId&&typeof input.callID==="string"&&input.callID.length>0&&input.callID.length<=256&&input.callID.trim()===input.callID&&(input.planTaskId===null||typeof input.planTaskId==="string"&&input.planTaskId.length>0&&input.planTaskId.length<=256&&input.planTaskId.trim()===input.planTaskId)}async function reserveBackgroundCoderSlot(directory,input){if(!validateReservationIdentity(input)||!Number.isInteger(input.maxConcurrent)||input.maxConcurrent<1||input.maxConcurrent>64||(input.occupiedTaskIds?.length??0)>64||!isValidReservationGeneration(input.generation))return{ok:!1,reason:"invalid"};let occupiedTaskIds=new Set;for(let taskId of input.occupiedTaskIds??[]){if(typeof taskId!=="string"||taskId.length===0||taskId.length>256||taskId.trim()!==taskId)return{ok:!1,reason:"invalid"};occupiedTaskIds.add(taskId)}try{return await withEvidenceLock(directory,BACKGROUND_CODER_RESERVATIONS_FILE,STORE_LOCK_AGENT2,RESERVATION_LOCK_TASK,async()=>{let reservationScan=scanBackgroundCoderReservationsForAdmission(directory);if(reservationScan.status==="uncertain")return{ok:!1,reason:"uncertain",detail:reservationScan.reason};let ownerScan=await scanDurableCoderOwners(directory);if(ownerScan.status==="uncertain")return{ok:!1,reason:"uncertain",detail:ownerScan.reason};let reservations=reservationScan.reservations.filter((reservation2)=>{let primary=findExactPrimaryReservationOwner(reservation2,ownerScan);return!(primary&&hasProvenReleasedReservationOwner(primary))});if(reservations.length!==reservationScan.reservations.length&&!await writeBackgroundCoderReservations(directory,reservations))return{ok:!1,reason:"uncertain",detail:"finished reservation reconciliation could not be persisted"};let activeOwnerKeys=new Set;for(let taskId of occupiedTaskIds)activeOwnerKeys.add(reservationOwnerKey({parentSessionId:input.parentSessionId,planTaskId:taskId,callID:""}));for(let reservation2 of reservations)if(reservation2.parentSessionId===input.parentSessionId)activeOwnerKeys.add(reservationOwnerKey(reservation2));for(let record3 of ownerScan.recordsByCorrelation.values())if(record3.parentSessionId===input.parentSessionId&&isActiveCoderOwner(record3))activeOwnerKeys.add(reservationOwnerKey({parentSessionId:record3.parentSessionId,planTaskId:record3.planTaskId,callID:record3.callID}));let reservationId=buildBackgroundCoderReservationId(input),existing=reservations.find((reservation2)=>reservation2.reservationId===reservationId);if(existing)return{ok:!1,reason:input.planTaskId===null?"duplicate_call":"duplicate_task",activeCount:activeOwnerKeys.size,existing};let incomingOwnerKey=reservationOwnerKey(input);if(input.planTaskId!==null&&activeOwnerKeys.has(incomingOwnerKey))return{ok:!1,reason:"duplicate_task",activeCount:activeOwnerKeys.size};if(activeOwnerKeys.size>=input.maxConcurrent)return{ok:!1,reason:"capacity",activeCount:activeOwnerKeys.size};if(reservations.length>=MAX_LIVE_BACKGROUND_CODER_RESERVATIONS)return{ok:!1,reason:"capacity",activeCount:activeOwnerKeys.size,detail:"durable reservation store is at its hard safety cap"};let now=input.now??Date.now(),leaseMs=clampReservationLeaseMs(input.leaseMs),reservation={reservationId,parentSessionId:input.parentSessionId,planTaskId:input.planTaskId,callID:input.callID,state:"reserved",correlationId:null,generation:input.generation??1,leaseExpiresAt:now+leaseMs,createdAt:now,updatedAt:now};if(!await writeBackgroundCoderReservations(directory,[...reservations,reservation]))return{ok:!1,reason:"uncertain",detail:"durable reservation claim could not be persisted"};return{ok:!0,reservation,activeCount:activeOwnerKeys.size+1}})}catch(error93){return{ok:!1,reason:"uncertain",detail:`background coder reservation lock failed: ${error93 instanceof Error?error93.message:String(error93)}`}}}async function bindBackgroundCoderReservation(directory,input){if(!validateReservationIdentity(input)||!input.reservationId||!input.correlationId||input.correlationId.length>256||input.correlationId.trim()!==input.correlationId||input.reservationId!==buildBackgroundCoderReservationId(input)||!isValidReservationGeneration(input.generation))return null;try{return await withEvidenceLock(directory,BACKGROUND_CODER_RESERVATIONS_FILE,STORE_LOCK_AGENT2,RESERVATION_LOCK_TASK,async()=>{let scan=scanBackgroundCoderReservationsForAdmission(directory);if(scan.status==="uncertain")return null;let index=scan.reservations.findIndex((reservation)=>reservation.reservationId===input.reservationId);if(index<0)return null;let current=scan.reservations[index];if(current.parentSessionId!==input.parentSessionId||current.planTaskId!==input.planTaskId||current.callID!==input.callID)return null;if(current.state==="bound"){if(current.correlationId!==input.correlationId)return null;let now2=input.now??Date.now(),leaseMs2=clampReservationLeaseMs(input.leaseMs),next2={...current,leaseExpiresAt:now2+leaseMs2,updatedAt:now2},reservations2=[...scan.reservations];return reservations2[index]=next2,await writeBackgroundCoderReservations(directory,reservations2)?next2:current}let currentGeneration=current.generation??1;if(input.generation!==void 0&&input.generation<currentGeneration)return null;let now=input.now??Date.now(),leaseMs=clampReservationLeaseMs(input.leaseMs),next={...current,state:"bound",correlationId:input.correlationId,...input.generation!==void 0||current.generation===void 0?{generation:input.generation??currentGeneration}:{},leaseExpiresAt:now+leaseMs,updatedAt:now},reservations=[...scan.reservations];return reservations[index]=next,await writeBackgroundCoderReservations(directory,reservations)?next:null})}catch{return null}}async function releaseBackgroundCoderReservation(directory,input){if(!validateReservationIdentity(input)||!input.reservationId||input.reservationId!==buildBackgroundCoderReservationId(input)||input.correlationId!==null&&(input.correlationId.length===0||input.correlationId.length>256||input.correlationId.trim()!==input.correlationId)||!isValidReservationGeneration(input.generation))return!1;try{return await withEvidenceLock(directory,BACKGROUND_CODER_RESERVATIONS_FILE,STORE_LOCK_AGENT2,RESERVATION_LOCK_TASK,async()=>{let scan=scanBackgroundCoderReservationsForAdmission(directory);if(scan.status==="uncertain")return!1;let index=scan.reservations.findIndex((reservation)=>reservation.reservationId===input.reservationId);if(index<0)return!1;let current=scan.reservations[index];if(current.parentSessionId!==input.parentSessionId||current.planTaskId!==input.planTaskId||current.callID!==input.callID||current.correlationId!==input.correlationId)return!1;if(input.generation!==void 0&¤t.generation!==void 0&&input.generation!==current.generation)return warn(`[background] refusing reservation release: terminal generation ${input.generation} does not match owned generation ${current.generation} for ${input.reservationId}`),!1;if(input.reason==="consumed"){if(current.state!=="bound"||!current.correlationId)return!1;let ownerScan=await scanDurableCoderOwners(directory);if(ownerScan.status==="uncertain")return!1;let primary=ownerScan.primaryByCorrelation.get(current.correlationId);if(!primary||primary.status!=="consumed"||!exactReservationRecordMatch(current,primary))return!1}let reservations=scan.reservations.filter((_,reservationIndex)=>reservationIndex!==index);return writeBackgroundCoderReservations(directory,reservations)})}catch{return!1}}async function reconcileLegacyCoderSettlements(directory,maxRecords,onReconciled,onAdvisoryReplaced){let reconciler=onReconciled??getLegacyCoderSettlementReconciler(directory),candidates=readDelegations(directory).filter((record3)=>record3.normalizedAgent==="coder"&&Boolean(record3.legacyCoderSettlementTransfer)&&Boolean(record3.terminalResult)).slice(0,maxRecords);if(candidates.length===0)return 0;let{transferCoderSettlementToBackground:transferCoderSettlementToBackground2}=await Promise.resolve().then(() => (init_coder_settlement(),exports_coder_settlement)),transferred=0;for(let record3 of candidates)try{let outcome=await transferCoderSettlementToBackground2({directory,taskId:record3.legacyCoderSettlementTransfer.taskId,transitionId:record3.legacyCoderSettlementTransfer.transitionId});if((outcome==="transferred"||outcome==="already-terminal"||outcome==="missing")&&reconciler){if(await reconciler(record3))await clearLegacyCoderSettlementTransferPending(directory,record3.correlationId)}if(outcome==="transferred")transferred+=1}catch(error93){let code=legacySettlementErrorCode(error93);if(!RETRYABLE_LEGACY_SETTLEMENT_ERROR_CODES.has(code??"")){let advisory=record3.advisoryInbox,manualMessage=`[BACKGROUND COMPLETION ${record3.terminalResult?.eventId??record3.correlationId}] coder task ${record3.evidenceTaskId??record3.planTaskId??"unknown"} legacy coder settlement requires manual recovery; run /swarm recover for this task (or /swarm reset-session).`,advisoryRecorded=!1;if(advisory?.state==="pending"){let replaced=await replacePendingBackgroundAdvisory(directory,record3.correlationId,{eventId:advisory.eventId,parentSessionId:advisory.parentSessionId,message:manualMessage});if(advisoryRecorded=replaced!==null,replaced)try{await onAdvisoryReplaced?.(record3,replaced)}catch(callbackError){warn(`[background] legacy coder settlement advisory replacement notification failed for ${record3.correlationId}: ${callbackError instanceof Error?callbackError.message:String(callbackError)}`)}}else if(record3.terminalResult)advisoryRecorded=await putPendingBackgroundAdvisory(directory,record3.correlationId,{eventId:record3.terminalResult.eventId,parentSessionId:record3.parentSessionId,message:manualMessage})!==null;if(advisoryRecorded)await clearLegacyCoderSettlementTransferPending(directory,record3.correlationId);warn(`[background] legacy coder settlement reconciliation requires manual recovery for ${record3.correlationId}: ${code??"unknown transfer failure"}`);continue}warn(`[background] legacy coder settlement reconciliation deferred for ${record3.correlationId}: ${error93 instanceof Error?error93.message:String(error93)}`)}return transferred}function legacySettlementErrorCode(error93){if(error93&&typeof error93==="object"&&"code"in error93&&typeof error93.code==="string")return error93.code??null;let detail=error93 instanceof Error?error93.message:String(error93);return/^([A-Z][A-Z0-9_]*)(?::|$)/.exec(detail.trim())?.[1]??null}async function maintainBackgroundDelegations(directory,options={}){let now=options.now??Date.now(),staleTimeoutMs=options.staleTimeoutMs??DEFAULT_STALE_DELEGATION_TIMEOUT_MS,maxRecords=options.maxRecords??DEFAULT_MAINTENANCE_BATCH,lockTimeoutMs=options.lockTimeoutMs??DEFAULT_MAINTENANCE_LOCK_TIMEOUT_MS,reason=options.reason??"manual",result={status:"ok",sweptStale:0,released:[],renewed:[],retained:[],examinedReservations:0},facts=[],emitObservation=(status,failureReason)=>{return appendDelegationMaintenanceObservation(directory,{at:now,status,reason:failureReason,summary:status==="ok"?{sweptStale:result.sweptStale,released:result.released.length,renewed:result.renewed.length,retained:result.retained.length}:void 0,facts}),{...result,status,...failureReason?{reason:failureReason}:{}}};try{result.sweptStale=await withEvidenceLock(directory,BACKGROUND_DELEGATIONS_FILE,STORE_LOCK_AGENT2,STORE_LOCK_TASK2,async()=>sweepStaleLocked(directory,staleTimeoutMs,now,DEFAULT_SWEEPABLE_DELEGATION_STATUSES,{},{maxSweep:maxRecords}),lockTimeoutMs)}catch(error93){if(error93 instanceof EvidenceLockTimeoutError)return facts.push({at:now,kind:"lock-contention",reason:`maintenance point '${reason}' skipped: delegations store lock contended`}),emitObservation("contention",error93.message);return facts.push({at:now,kind:"maintenance-failure",reason:`maintenance point '${reason}' sweep failed: ${error93 instanceof Error?error93.message:String(error93)}`}),emitObservation("failure",error93 instanceof Error?error93.message:String(error93))}try{await withEvidenceLock(directory,BACKGROUND_CODER_RESERVATIONS_FILE,STORE_LOCK_AGENT2,RESERVATION_LOCK_TASK,async()=>{let reservationScan=scanBackgroundCoderReservationsForAdmission(directory);if(reservationScan.status==="uncertain"){result.status="failure",result.reason=reservationScan.reason,facts.push({at:now,kind:"maintenance-failure",reason:`reservation store uncertain: ${reservationScan.reason}`});return}let ownerScan=await scanDurableCoderOwners(directory);if(ownerScan.status==="uncertain"){result.status="failure",result.reason=ownerScan.reason,facts.push({at:now,kind:"maintenance-failure",reason:`owner evidence uncertain; all reservations retained: ${ownerScan.reason}`});return}let batch=reservationScan.reservations.slice(0,maxRecords);result.examinedReservations=batch.length;let next=[],mutated=!1;for(let reservation of batch){let generation=reservation.generation??1,primary=findExactPrimaryReservationOwner(reservation,ownerScan);if(primary&&hasProvenReleasedReservationOwner(primary)){if((primary.generation??1)!==generation){result.retained.push({reservationId:reservation.reservationId,reason:"owner-terminal-older-generation"}),facts.push({at:now,kind:"retained-ambiguity",reservationId:reservation.reservationId,correlationId:reservation.correlationId??void 0,generation,reason:`proven-terminal owner is generation ${primary.generation??1}, reservation owns ${generation}`}),next.push(reservation);continue}mutated=!0,result.released.push({reservationId:reservation.reservationId,generation,reason:"proven-terminal-owner"}),facts.push({at:now,kind:"release",reservationId:reservation.reservationId,correlationId:reservation.correlationId??void 0,generation,reason:"proven-terminal-owner"});continue}if(reservation.leaseExpiresAt===void 0){result.retained.push({reservationId:reservation.reservationId,reason:"protected-legacy-no-lease"}),facts.push({at:now,kind:"retained-protected-legacy",reservationId:reservation.reservationId,generation,reason:"legacy reservation without leaseExpiresAt"}),next.push(reservation);continue}if(!(reservation.leaseExpiresAt<=now)){next.push(reservation);continue}if(primary){if((primary.generation??1)!==generation){result.retained.push({reservationId:reservation.reservationId,reason:"owner-older-generation"}),facts.push({at:now,kind:"retained-ambiguity",reservationId:reservation.reservationId,correlationId:reservation.correlationId??void 0,generation,reason:`owner record is generation ${primary.generation??1}, reservation owns ${generation}`}),next.push(reservation);continue}if(primary.status==="stale"){mutated=!0,result.released.push({reservationId:reservation.reservationId,generation,reason:"owner-swept-stale"}),facts.push({at:now,kind:"release",reservationId:reservation.reservationId,correlationId:reservation.correlationId??void 0,generation,reason:"owner record durably stale"});continue}if(isActiveCoderOwner(primary)){mutated=!0,result.renewed.push({reservationId:reservation.reservationId,generation}),facts.push({at:now,kind:"lease-renewed",reservationId:reservation.reservationId,correlationId:reservation.correlationId??void 0,generation,reason:"exact owner record still active"}),next.push({...reservation,leaseExpiresAt:now+BACKGROUND_CODER_RESERVATION_LEASE_MS,updatedAt:now});continue}result.retained.push({reservationId:reservation.reservationId,reason:"owner-terminal-unproven"}),facts.push({at:now,kind:"retained-ambiguity",reservationId:reservation.reservationId,correlationId:reservation.correlationId??void 0,generation,reason:`owner status '${primary.status}' does not prove release`}),next.push(reservation);continue}if(reservation.correlationId!==null&&ownerScan.recordsByCorrelation.has(reservation.correlationId)){result.retained.push({reservationId:reservation.reservationId,reason:"owner-identity-mismatch"}),facts.push({at:now,kind:"retained-ambiguity",reservationId:reservation.reservationId,correlationId:reservation.correlationId??void 0,generation,reason:"correlation exists under a different owner identity"}),next.push(reservation);continue}if(now-reservation.createdAt>staleTimeoutMs){mutated=!0,result.released.push({reservationId:reservation.reservationId,generation,reason:"unbound-orphan"}),facts.push({at:now,kind:"release",reservationId:reservation.reservationId,generation,reason:"no durable owner anywhere and pre-launch window exceeded"});continue}result.retained.push({reservationId:reservation.reservationId,reason:"unbound-within-stale-window"}),facts.push({at:now,kind:"retained-ambiguity",reservationId:reservation.reservationId,generation,reason:"no owner record yet; still inside the pre-launch stale window"}),next.push(reservation)}if(next.push(...reservationScan.reservations.slice(maxRecords)),mutated){if(!await writeBackgroundCoderReservations(directory,next))result.status="failure",result.reason="reservation reconciliation could not be persisted",facts.push({at:now,kind:"maintenance-failure",reason:"reservation store write failed during reconciliation"})}},lockTimeoutMs)}catch(error93){if(error93 instanceof EvidenceLockTimeoutError)return facts.push({at:now,kind:"lock-contention",reason:`maintenance point '${reason}' skipped: reservation store lock contended`}),emitObservation("contention",error93.message);return facts.push({at:now,kind:"maintenance-failure",reason:`maintenance point '${reason}' reconciliation failed: ${error93 instanceof Error?error93.message:String(error93)}`}),emitObservation("failure",error93 instanceof Error?error93.message:String(error93))}if(!options.skipLegacyCoderSettlementReconciliation)try{await reconcileLegacyCoderSettlements(directory,maxRecords,options.onLegacyCoderSettlementReconciled??getLegacyCoderSettlementReconciler(directory),options.onLegacyCoderSettlementAdvisoryReplaced)}catch(error93){warn(`[background] legacy coder settlement reconciliation pass failed: ${error93 instanceof Error?error93.message:String(error93)}`)}if(result.status==="failure")return emitObservation("failure",result.reason);return emitObservation("ok")}var BACKGROUND_DELEGATIONS_FILE="background-delegations.jsonl",BACKGROUND_DELEGATION_FALLBACK_DIR="background-delegation-fallback",BACKGROUND_CODER_RESERVATIONS_FILE="background-coder-reservations.json",BACKGROUND_DELEGATIONS_CHECKPOINT_FILE="background-delegations.checkpoint.json",BACKGROUND_DELEGATIONS_MANIFEST_FILE="background-delegations.manifest.json",MAX_LIVE_BACKGROUND_FALLBACKS=256,MAX_LIVE_BACKGROUND_CODER_RESERVATIONS=256,MAX_BACKGROUND_OBSERVED_FILES=5000,MAX_BACKGROUND_ADVISORY_CHARS=4000,LEGACY_CODER_SETTLEMENT_PENDING_ADVISORY_MARKER="legacy coder settlement transfer is pending",MAX_BACKGROUND_DELEGATION_GENERATION=1e6,DELEGATION_COORDINATION_NAMESPACE="background.pending-delegation",RESERVATION_COORDINATION_NAMESPACE="background.coder-reservation",RESERVATION_LEASE_NAMESPACE="background.coder-reservation.lease",MAX_RECOVERY_FALLBACK_BYTES=1048576,MAX_TRACKED_LENIENT_LEDGER_SIGNALS=32,LENIENT_LEDGER_SIGNAL_SOURCE="lenient-read",DELEGATION_COMPACTION_LOW_WATER_BYTES=262144,DELEGATION_COMPACTION_HIGH_WATER_BYTES=1048576,MAX_CHECKPOINT_BYTES=2097152,CHECKPOINT_SELECTION_RESERVE_BYTES=65536,MAX_CHECKPOINT_RECORDS=2048,MAX_COORDINATION_DELEGATION_ROWS,MAX_COORDINATION_TERMINAL_ROWS,TOMBSTONE_MIN_AGE_MS=259200000,STORE_LOCK_AGENT2="background",STORE_LOCK_TASK2="background-delegations",FALLBACK_LOCK_TASK="background-delegation-fallback",RESERVATION_LOCK_TASK="background-coder-reservations",ADVISORY_PREPARE_LEASE_MS=30000,INGESTION_CLAIM_LEASE_MS=30000,BACKGROUND_INGESTION_LEASE_MS=30000,BACKGROUND_CODER_RESERVATION_LEASE_MS=900000,BACKGROUND_CODER_RESERVATION_LEASE_MAX_MS=3600000,BACKGROUND_CODER_RESERVATION_LEASE_MIN_MS=60000,DEFAULT_STALE_DELEGATION_TIMEOUT_MS=1800000,DEFAULT_SWEEPABLE_DELEGATION_STATUSES,WorkflowLaneRecoverySchema,ResultSchema,WorkspaceSchema,TaskChangeContextSchema,WorktreeDescriptorSchema,TerminalResultSchema,NormalizedObservedFileSchema,SettlementProvenanceSchema,SettlementOutcomeSchema,CoderSettlementSchema,AdvisoryPreparationSchema,AdvisoryInboxSchema,DelegationIngestionSchema,BackgroundCoderReservationSchema,BackgroundCoderReservationStoreSchema,PromptSchema,RecordSchema2,FallbackArtifactSchema,SHA256_HEX,CheckpointSchema2,ManifestSchema,WRITER_ID,_checkpointInternals,CHECKPOINT_REBIND_HINT="remove .swarm/background-delegations.manifest.json (manifest only) after verifying no in-flight background delegations; recovery then falls back to the full-ledger read. Only if you also want to discard pre-cut closed summaries and audit history — which for a compacted (rolled) ledger exist ONLY in .swarm/background-delegations.checkpoint.json — remove the checkpoint too or use the full reset below",CHECKPOINT_RESET_HINT="the rolled tail no longer carries pre-checkpoint state: stop swarm processes, verify no in-flight background delegations, and remove .swarm/background-delegations.manifest.json, .swarm/background-delegations.checkpoint.json, and .swarm/background-delegations.jsonl to reset the store (or restore them from backup)",lenientLedgerSignalByRoot,lenientLedgerSignalOrder,DELEGATION_READ_RETRY_DELAY_MS=25,MAX_TRACKED_DELEGATION_READ_UNCERTAIN_ROOTS=32,DELEGATION_READ_UNCERTAIN_EMIT_COOLDOWN_MS=60000,delegationReadUncertainEmitAtByRoot,delegationReadUncertainEmitOrder,DELEGATION_READ_REASON_MAX_CHARS=200,MAX_LEGACY_CODER_SETTLEMENT_RECONCILERS=32,RETRYABLE_LEGACY_SETTLEMENT_ERROR_CODES,legacyCoderSettlementReconcilers,legacyCoderSettlementReconcilerOrder,_internals101,_staleSweepObserver=null,MAX_BACKGROUND_CODER_RESERVATION_STORE_BYTES=2097152,DEFAULT_MAINTENANCE_LOCK_TIMEOUT_MS=5000,DEFAULT_MAINTENANCE_BATCH=256;var init_pending_delegations=__esm(()=>{init_zod();init_db();init_lock();init_utils2();init_telemetry();init_bun_compat();init_canonical_root();init_logger();init_delegation_health();init_pr_review_collection_receipt();init_pr_review_contract();init_delegation_health();init_delegation_health();MAX_COORDINATION_DELEGATION_ROWS=MAX_CHECKPOINT_RECORDS*2,MAX_COORDINATION_TERMINAL_ROWS=MAX_CHECKPOINT_RECORDS;DEFAULT_SWEEPABLE_DELEGATION_STATUSES=new Set(["pending","running","ingestion_error"]),WorkflowLaneRecoverySchema=exports_external.object({workflowLane:exports_external.string(),kind:exports_external.enum(["legacy-verdict-row-recovery","parser-normalization","parser-row-recovery","truncated-preview-durable-artifact","transcript-incomplete-terminal-candidate","clean-attestation-salvaged"]),reason:exports_external.string()}).strict(),ResultSchema=exports_external.object({text:exports_external.string().optional(),error:exports_external.string().optional(),chars:exports_external.number(),truncated:exports_external.boolean(),digest:exports_external.string(),outputRef:exports_external.string().optional(),outputPreviewChars:exports_external.number().optional(),outputDegraded:exports_external.boolean().optional(),outputArtifactError:exports_external.string().optional(),transcriptIncomplete:exports_external.boolean().optional(),messageCount:exports_external.number().optional(),prReviewResultReceipt:PrReviewResultReceiptSchema.optional(),workflowLaneFailureClass:exports_external.enum(["contract","resource","liveness","operator_cancelled","deadline"]).optional(),terminalErrorClass:exports_external.object({kind:exports_external.enum(["provider","aborted","output_length","unknown"]),category:exports_external.string().min(1).max(128),statusCode:exports_external.number().int().optional(),hostRetryable:exports_external.boolean().optional()}).strict().optional(),salvagedWorkflowLanes:exports_external.array(exports_external.string()).optional(),salvagedWorkflowLaneRecoveries:exports_external.array(WorkflowLaneRecoverySchema).optional()}).strict(),WorkspaceSchema=exports_external.object({directory:exports_external.string(),gitHead:exports_external.string().nullable(),dirtyHash:exports_external.string().nullable(),changedFiles:exports_external.array(exports_external.string()).nullable().optional(),prHeadSha:exports_external.string().nullable(),scope:exports_external.string().nullable()}).strict(),TaskChangeContextSchema=exports_external.object({declaredFiles:exports_external.array(exports_external.string()).nullable(),baseline:WorkspaceSchema,workflowGeneration:exports_external.number().int().nonnegative().optional()}).strict(),WorktreeDescriptorSchema=exports_external.object({callID:exports_external.string().min(1).max(256),parentSessionId:exports_external.string().min(1).max(256),taskId:exports_external.string().min(1).max(256),planTaskId:exports_external.string().min(1).max(256).nullable(),worktreePath:exports_external.string().min(1).max(4096),branchName:exports_external.string().min(1).max(1024),worktreeId:exports_external.string().min(1).max(256),worktreeSessionId:exports_external.string().min(1).max(256),mergeStrategy:exports_external.enum(["merge","rebase","cherry-pick"]),landedUnstaged:exports_external.boolean().optional(),laneIndex:exports_external.number().int().nonnegative().max(255),worktreeDir:exports_external.string().min(1).max(4096).nullable(),reservationId:exports_external.string().min(1).max(512).optional(),generation:exports_external.number().int().min(1).optional(),provisioningOwner:exports_external.object({reservationId:exports_external.string().min(1).max(512),generation:exports_external.number().int().min(1),branchName:exports_external.string().min(1).max(1024)}).strict().optional()}).strict(),TerminalResultSchema=exports_external.object({eventId:exports_external.string().min(1).max(256),status:exports_external.enum(["completed","error","cancelled","rejected","stale"]),recordedAt:exports_external.number().int().nonnegative(),result:ResultSchema}).strict(),NormalizedObservedFileSchema=exports_external.string().min(1).max(4096).refine((value)=>normalizeObservedFile(value)===value),SettlementProvenanceSchema=exports_external.object({correlationId:exports_external.string().min(1).max(256),parentSessionId:exports_external.string().min(1).max(256),callID:exports_external.string().max(256),planTaskId:exports_external.string().min(1).max(256).nullable(),baseline:WorkspaceSchema,worktree:WorktreeDescriptorSchema.nullable()}).strict(),SettlementOutcomeSchema=exports_external.object({kind:exports_external.enum(["shared-root","standard-worktree"]),result:exports_external.enum(["ready","merged","unchanged","partial","failed"]),reason:exports_external.string().min(1).max(2000).optional(),sourceHeadAfterCommit:exports_external.string().min(1).max(256).nullable().optional(),targetHeadBeforeMerge:exports_external.string().min(1).max(256).nullable().optional(),targetHeadAfterMerge:exports_external.string().min(1).max(256).nullable().optional()}).strict(),CoderSettlementSchema=exports_external.object({state:exports_external.enum(["pending","settling","settled","preserved"]),provenance:SettlementProvenanceSchema,operationId:exports_external.string().min(1).max(256).optional(),sourceHeadAfterCommit:exports_external.string().min(1).max(256).nullable().optional(),targetHeadBeforeMerge:exports_external.string().min(1).max(256).nullable().optional(),observedFiles:exports_external.array(NormalizedObservedFileSchema).max(MAX_BACKGROUND_OBSERVED_FILES).nullable(),outcome:SettlementOutcomeSchema.optional(),updatedAt:exports_external.number().int().nonnegative()}).strict().superRefine((value,context)=>{if(value.state!=="pending"&&!value.operationId)context.addIssue({code:exports_external.ZodIssueCode.custom,message:"settling, settled, and preserved states require operationId"});if((value.state==="settled"||value.state==="preserved")&&!value.outcome)context.addIssue({code:exports_external.ZodIssueCode.custom,message:"terminal settlement state requires outcome"})}),AdvisoryPreparationSchema=exports_external.object({id:exports_external.string().min(1).max(256),preparedAt:exports_external.number().int().nonnegative(),leaseExpiresAt:exports_external.number().int().nonnegative()}).strict(),AdvisoryInboxSchema=exports_external.object({eventId:exports_external.string().min(1).max(256),parentSessionId:exports_external.string().min(1).max(256),state:exports_external.enum(["pending","delivered"]),message:exports_external.string().min(1).max(MAX_BACKGROUND_ADVISORY_CHARS),createdAt:exports_external.number().int().nonnegative(),preparation:AdvisoryPreparationSchema.optional(),deliveredAt:exports_external.number().int().nonnegative().optional()}).strict().superRefine((value,context)=>{if(value.state==="delivered"&&value.deliveredAt===void 0)context.addIssue({code:exports_external.ZodIssueCode.custom,message:"delivered advisory requires deliveredAt"});if(value.state==="delivered"&&value.preparation!==void 0)context.addIssue({code:exports_external.ZodIssueCode.custom,message:"delivered advisory cannot retain a preparation lease"})}),DelegationIngestionSchema=exports_external.object({state:exports_external.enum(["claimed","retryable","consumed"]),attempt:exports_external.number().int().positive(),updatedAt:exports_external.number().int().nonnegative(),claimToken:exports_external.string().min(1).max(256),leaseExpiresAt:exports_external.number().int().nonnegative().optional()}).strict().superRefine((value,context)=>{if(value.state==="claimed"&&value.leaseExpiresAt===void 0)context.addIssue({code:exports_external.ZodIssueCode.custom,message:"claimed ingestion requires a lease expiry"});if(value.state!=="claimed"&&value.leaseExpiresAt!==void 0)context.addIssue({code:exports_external.ZodIssueCode.custom,message:"completed ingestion cannot retain a claim lease"})}),BackgroundCoderReservationSchema=exports_external.object({reservationId:exports_external.string().min(1).max(256),parentSessionId:exports_external.string().min(1).max(256),planTaskId:exports_external.string().min(1).max(256).nullable(),callID:exports_external.string().min(1).max(256),state:exports_external.enum(["reserved","bound"]),correlationId:exports_external.string().min(1).max(256).nullable(),generation:exports_external.number().int().min(1).max(MAX_BACKGROUND_DELEGATION_GENERATION).optional(),leaseExpiresAt:exports_external.number().int().nonnegative().optional(),createdAt:exports_external.number().int().nonnegative(),updatedAt:exports_external.number().int().nonnegative()}).strict().superRefine((value,context)=>{if(value.state==="reserved"&&value.correlationId!==null)context.addIssue({code:exports_external.ZodIssueCode.custom,message:"unbound reservation cannot have a correlationId"});if(value.state==="bound"&&value.correlationId===null)context.addIssue({code:exports_external.ZodIssueCode.custom,message:"bound reservation requires a correlationId"})}),BackgroundCoderReservationStoreSchema=exports_external.object({schemaVersion:exports_external.literal(1),reservations:exports_external.array(BackgroundCoderReservationSchema).max(MAX_LIVE_BACKGROUND_CODER_RESERVATIONS)}).strict().superRefine((value,context)=>{let ids=new Set;for(let reservation of value.reservations){if(ids.has(reservation.reservationId)){context.addIssue({code:exports_external.ZodIssueCode.custom,message:"duplicate reservationId"});return}if(reservation.reservationId!==buildBackgroundCoderReservationId({parentSessionId:reservation.parentSessionId,planTaskId:reservation.planTaskId,callID:reservation.callID})){context.addIssue({code:exports_external.ZodIssueCode.custom,message:"reservationId does not match owner identity"});return}ids.add(reservation.reservationId)}}),PromptSchema=exports_external.object({text:exports_external.string(),chars:exports_external.number(),truncated:exports_external.boolean(),digest:exports_external.string()}).strict(),RecordSchema2=exports_external.object({schemaVersion:exports_external.union([exports_external.literal(1),exports_external.literal(2),exports_external.literal(3),exports_external.literal(4)]),correlationId:exports_external.string().min(1),jobId:exports_external.string().nullable(),subagentSessionId:exports_external.string().min(1),parentSessionId:exports_external.string().min(1),callID:exports_external.string(),normalizedAgent:exports_external.string(),swarmPrefixedAgent:exports_external.string(),planTaskId:exports_external.string().nullable(),evidenceTaskId:exports_external.string().nullable(),status:exports_external.enum(["pending","running","ingestion_error","rejected","completed","error","cancelled","stale","consumed"]),createdAt:exports_external.number(),updatedAt:exports_external.number(),batchId:exports_external.string().optional(),laneId:exports_external.string().optional(),mode:exports_external.string().optional(),workflowLane:exports_external.string().optional(),ownedWorkflowLanes:exports_external.array(exports_external.string().min(1).max(120)).min(1).max(11).optional(),prReviewLegacyTranscriptCompatibility:exports_external.boolean().optional(),promptHash:exports_external.string().optional(),workspace:WorkspaceSchema.optional(),taskChangeContext:TaskChangeContextSchema.optional(),workflowGeneration:exports_external.number().int().nonnegative().optional(),worktree:WorktreeDescriptorSchema.optional(),coderReservationId:exports_external.string().min(1).max(256).optional(),prompt:PromptSchema.optional(),generation:exports_external.number().int().positive().max(MAX_BACKGROUND_DELEGATION_GENERATION).optional(),terminalResult:TerminalResultSchema.optional(),coderSettlement:CoderSettlementSchema.optional(),advisoryInbox:AdvisoryInboxSchema.optional(),legacyCoderSettlementTransfer:exports_external.object({taskId:exports_external.string().min(1).max(256),transitionId:exports_external.string().min(1).max(256),updatedAt:exports_external.number().nonnegative()}).strict().optional(),ingestion:DelegationIngestionSchema.optional(),result:ResultSchema.optional(),completedAt:exports_external.number().optional()}).strict().superRefine((value,context)=>{if(value.mode?.startsWith("swarm-pr-review:")&&value.correlationId!==value.subagentSessionId)context.addIssue({code:exports_external.ZodIssueCode.custom,message:"PR-review delegation identity requires correlationId to equal subagentSessionId"})}),FallbackArtifactSchema=exports_external.object({schemaVersion:exports_external.literal(1),correlationId:exports_external.string().min(1).max(256),createdAt:exports_external.number().int().nonnegative(),record:RecordSchema2}).strict().superRefine((value,context)=>{if(value.record.correlationId!==value.correlationId||value.record.subagentSessionId!==value.correlationId||value.record.status!=="pending")context.addIssue({code:exports_external.ZodIssueCode.custom,message:"fallback identity/status does not match its pending record"})});SHA256_HEX=/^[0-9a-f]{64}$/,CheckpointSchema2=exports_external.object({schemaVersion:exports_external.literal(1),sequence:exports_external.number().int().positive(),writerId:exports_external.string().min(1).max(128),rootPath:exports_external.string().min(1).max(4096),createdAt:exports_external.number().int().nonnegative(),cutLedgerBytes:exports_external.number().int().nonnegative(),cutLedgerDigest:exports_external.string().regex(SHA256_HEX),records:exports_external.array(RecordSchema2).max(MAX_CHECKPOINT_RECORDS),closed:exports_external.array(RecordSchema2),audit:DelegationCheckpointAuditSchema,payloadChecksum:exports_external.string().regex(SHA256_HEX)}).strict(),ManifestSchema=exports_external.object({schemaVersion:exports_external.literal(1),sequence:exports_external.number().int().positive(),checkpointChecksum:exports_external.string().regex(SHA256_HEX),writerId:exports_external.string().min(1).max(128),rootPath:exports_external.string().min(1).max(4096),updatedAt:exports_external.number().int().nonnegative()}).strict(),WRITER_ID=`w-${process.pid}-${Math.random().toString(36).slice(2,10)}`;_checkpointInternals={renameWithRetry:(from,to)=>{let lastError;for(let attempt=0;attempt<5;attempt++)try{_checkpointInternals.renameOnce(from,to);return}catch(err){lastError=err;let code=err.code;if(code!=="EEXIST"&&code!=="EBUSY"&&code!=="EPERM")throw err;_checkpointInternals.syncSleep(15)}throw lastError},renameOnce:(from,to)=>{fs70.renameSync(from,to)},syncSleep:portableSyncSleep};lenientLedgerSignalByRoot=new Map,lenientLedgerSignalOrder=[];delegationReadUncertainEmitAtByRoot=new Map,delegationReadUncertainEmitOrder=[];RETRYABLE_LEGACY_SETTLEMENT_ERROR_CODES=new Set(["CODER_SETTLEMENT_LOCKED","EACCES","EBUSY","EIO","EPERM","ETIMEDOUT"]),legacyCoderSettlementReconcilers=new Map,legacyCoderSettlementReconcilerOrder=[];_internals101={readRetryDelayMs:DELEGATION_READ_RETRY_DELAY_MS,delegationReadUncertainEmitCooldownMs:DELEGATION_READ_UNCERTAIN_EMIT_COOLDOWN_MS,resetDelegationReadUncertainRegistry:()=>{delegationReadUncertainEmitAtByRoot.clear(),delegationReadUncertainEmitOrder.length=0},delegationReadUncertainEmitOrderSnapshot:()=>[...delegationReadUncertainEmitOrder],delegationReadUncertainCooldownsSnapshot:()=>new Map(delegationReadUncertainEmitAtByRoot),getLegacyCoderSettlementReconciler,readFallbackDirectory,getLegacyCoderSettlementReconcilerOrder:()=>[...legacyCoderSettlementReconcilerOrder],resetLegacyCoderSettlementReconcilers:()=>{legacyCoderSettlementReconcilers.clear(),legacyCoderSettlementReconcilerOrder.length=0},reservationCoordinationRowLimit:MAX_COORDINATION_STATE_LIST_ROWS,writeBackgroundCoderReservations}});import{createHash as createHash50}from"node:crypto";function rawTriggerIds(input){if(!Array.isArray(input))return null;let ids=[];for(let row of input){if(typeof row!=="object"||row===null)return null;let triggerId=row.trigger_id;if(typeof triggerId!=="string"||!triggerId.trim())return null;ids.push(triggerId.trim())}return ids}function assertExactTriggerIdSet(input){let ids=rawTriggerIds(input);if(!ids)return;let expected=new Set(PR_REVIEW_REQUIRED_TRIGGER_IDS),seen=new Set,duplicate=new Set;for(let id of ids){if(seen.has(id))duplicate.add(id);seen.add(id)}if(duplicate.size>0)throw Error(`duplicate trigger IDs: ${[...duplicate].join(", ")}`);let unknown3=[...seen].filter((id)=>!expected.has(id));if(unknown3.length>0)throw Error(`unknown trigger IDs: ${unknown3.join(", ")}. trigger_id must be one of the 11 mandatory micro-lane IDs: ${[...expected].join(", ")}. Base-lane IDs and mode strings (e.g. swarm-pr-review:base) are NOT trigger IDs.`);let missing=[...expected].filter((id)=>!seen.has(id));if(missing.length>0)throw Error(`missing trigger IDs: ${missing.join(", ")}`)}function assertMatchedRowsHaveProvenance(input){if(!Array.isArray(input))return;for(let row of input){if(typeof row!=="object"||row===null)continue;let value=row;if(value.result!=="MATCHED")continue;if(typeof value.source_batch_id!=="string"||!value.source_batch_id.trim()||typeof value.source_lane_id!=="string"||!value.source_lane_id.trim())throw Error(`MATCHED rows require source_batch_id and source_lane_id: ${String(value.trigger_id??"(missing trigger_id)")}`)}}function assertNoLegacyNoMatchResult(input){if(!Array.isArray(input))return;for(let row of input){if(typeof row!=="object"||row===null)continue;if(row.result==="NO-MATCH")throw Error("NO-MATCH is not a valid PR_REVIEW trigger result; use MATCHED or NOT_TRIGGERED with concrete evidence")}}function exactTriggerRows(rows){let expected=new Set(PR_REVIEW_REQUIRED_TRIGGER_IDS),seen=new Set,duplicate=new Set;for(let row of rows){if(seen.has(row.trigger_id))duplicate.add(row.trigger_id);seen.add(row.trigger_id)}let unknown3=[...seen].filter((id)=>!expected.has(id)),missing=[...expected].filter((id)=>!seen.has(id));if(duplicate.size>0||unknown3.length>0||missing.length>0)throw Error(`PR_REVIEW trigger ledger must be exact; missing: ${missing.join(", ")||"(none)"}; duplicate: ${[...duplicate].join(", ")||"(none)"}; unknown: ${unknown3.join(", ")||"(none)"}`);let byId=new Map(rows.map((row)=>[row.trigger_id,row]));return PR_REVIEW_REQUIRED_TRIGGER_IDS.map((id)=>{let row=byId.get(id);if(!row)throw Error(`missing trigger row: ${id}`);return row})}function summarizeTriggerRows(rows){let orderedRows=exactTriggerRows(rows);if(orderedRows.find((row)=>row.trigger_id==="unclassified-risk")?.result!=="MATCHED")throw Error("PR_REVIEW trigger ledger requires unclassified-risk to remain MATCHED as the fallback family");return{rows:orderedRows,matchedIds:orderedRows.filter((row)=>row.result==="MATCHED").map((row)=>row.trigger_id),notTriggeredIds:orderedRows.filter((row)=>row.result==="NOT_TRIGGERED").map((row)=>row.trigger_id)}}function parseRows(input,schema,label){let parsed=exports_external.array(schema).safeParse(input);if(!parsed.success)throw Error(`${label}: ${parsed.error.issues.map((issue3)=>`${issue3.path.join(".")}: ${issue3.message}`).join("; ")}`);return parsed.data}function validatePrReviewInlineTriggerLedger(input){return assertExactTriggerIdSet(input),assertNoLegacyNoMatchResult(input),summarizeTriggerRows(parseRows(input,PrReviewInlineTriggerRowSchema,"Invalid trigger ledger"))}function validatePrReviewPersistedInputLedger(input){return assertExactTriggerIdSet(input),assertNoLegacyNoMatchResult(input),assertMatchedRowsHaveProvenance(input),summarizeTriggerRows(parseRows(input,PrReviewPersistedInputRowSchema,"Invalid persisted trigger ledger"))}function validatePrReviewWriterInputLedger(input){return assertExactTriggerIdSet(input),assertNoLegacyNoMatchResult(input),assertMatchedRowsHaveProvenance(input),summarizeTriggerRows(parseRows(input,PrReviewWriterInputRowSchema,"Invalid final-writer trigger ledger"))}function assertCanonicalDefinitionFields(rows){let definitions=new Map(PR_REVIEW_TRIGGER_DEFINITIONS.map((definition)=>[definition.id,definition]));for(let row of rows){let definition=definitions.get(row.trigger_id);if(!definition||row.scope!==definition.scope||row.trigger_row!==definition.trigger_row||row.micro_lane!==definition.micro_lane)throw Error(`PR_REVIEW trigger definition drift for ${row.trigger_id}: scope, trigger_row, and micro_lane must match the canonical definition`)}}function dispatchedMicroLaneCount(rows){return new Set(rows.filter((row)=>row.result==="MATCHED").map((row)=>`${row.source_batch_id}\x00${row.source_lane_id}`)).size}function buildPrReviewTriggerReceiptV2(input){let envelope=ReceiptEnvelopeSchema.parse(input),validated=validatePrReviewPersistedInputLedger(input.rows),dispatchedCount=dispatchedMicroLaneCount(validated.rows);if(envelope.dispatched_micro_lane_count!==dispatchedCount)throw Error(`PR_REVIEW trigger receipt dispatched_micro_lane_count is inconsistent: expected ${dispatchedCount}`);let rows=validated.rows.map((row)=>{let definition=PR_REVIEW_TRIGGER_DEFINITIONS.find((candidate)=>candidate.id===row.trigger_id);if(!definition)throw Error(`unknown trigger definition: ${row.trigger_id}`);return{trigger_id:row.trigger_id,scope:definition.scope,trigger_row:definition.trigger_row,micro_lane:definition.micro_lane,result:row.result,evidence:row.evidence,...row.result==="MATCHED"?{source_batch_id:row.source_batch_id,source_lane_id:row.source_lane_id}:{}}});return V2ReceiptSchema.parse({...envelope,schema_version:2,trigger_count:rows.length,matched_count:validated.matchedIds.length,not_triggered_count:validated.notTriggeredIds.length,no_match_count:0,rows,coverage_degradations:input.coverage_degradations??[],receipt_covered_families:input.receipt_covered_families??[],...input.base_verification?{base_verification:input.base_verification}:{}})}function prReviewTriggerLedgerDigest(rows){let canonical=rows.map((row)=>[row.trigger_id,row.result,row.evidence]);return createHash50("sha256").update(JSON.stringify(canonical)).digest("hex")}function parsedReceipt(schemaVersion,rows,coverageDegradations=[],baseVerification,receiptCoveredFamilies=[]){return{schemaVersion,rows,matchedRows:rows.filter((row)=>row.result==="MATCHED"),notTriggeredRows:rows.filter((row)=>row.result==="NOT_TRIGGERED"),coverageDegradations,receiptCoveredFamilies,...baseVerification?{baseVerification}:{}}}function parsePrReviewTriggerReceipt(input){if(typeof input!=="object"||input===null)throw Error("PR_REVIEW trigger receipt must be an object");let schemaVersion=input.schema_version;if(schemaVersion===2){let receipt=V2ReceiptSchema.parse(input);assertCanonicalDefinitionFields(receipt.rows);let normalizedRows=receipt.rows.map((row)=>({trigger_id:row.trigger_id,result:row.result,evidence:row.evidence,...row.result==="MATCHED"?{source_batch_id:row.source_batch_id,source_lane_id:row.source_lane_id}:{}})),validated2=validatePrReviewPersistedInputLedger(normalizedRows),counts={trigger_count:validated2.rows.length,matched_count:validated2.matchedIds.length,not_triggered_count:validated2.notTriggeredIds.length,no_match_count:0,dispatched_micro_lane_count:dispatchedMicroLaneCount(validated2.rows)};for(let[field,expected]of Object.entries(counts))if(receipt[field]!==expected)throw Error(`PR_REVIEW trigger receipt ${field} is inconsistent: expected ${expected}`);return parsedReceipt(2,validated2.rows,receipt.coverage_degradations,receipt.base_verification,receipt.receipt_covered_families)}if(schemaVersion!==void 0&&schemaVersion!==1)throw Error(`Unsupported PR_REVIEW trigger schema_version: ${schemaVersion}`);let legacyEnvelope=schemaVersion===1?V1ReceiptSchema.parse(input):UnversionedRowOnlyReceiptSchema.parse(input),rowsInput=legacyEnvelope.rows,parsedLegacyRows=parseRows(rowsInput,LegacyRowSchema,"Invalid legacy trigger ledger; all rows must be MATCHED with complete source provenance");assertCanonicalDefinitionFields(parsedLegacyRows.filter((row)=>("scope"in row)));let legacyRows=parsedLegacyRows.map((row)=>({trigger_id:row.trigger_id,result:row.result,evidence:row.evidence,source_batch_id:row.source_batch_id,source_lane_id:row.source_lane_id})),validated=summarizeTriggerRows(legacyRows);if(schemaVersion===1){let receipt=legacyEnvelope,countFields={trigger_count:validated.rows.length,matched_count:validated.rows.length,no_match_count:0,dispatched_micro_lane_count:dispatchedMicroLaneCount(validated.rows)};for(let[field,expected]of Object.entries(countFields))if(receipt[field]!==expected)throw Error(`Historical PR_REVIEW trigger receipt ${field} is inconsistent: expected ${expected}`)}return parsedReceipt(schemaVersion===1?1:0,validated.rows)}var PR_REVIEW_MICRO_FAMILY_RETRY_BUDGET=2,PR_REVIEW_TRIGGER_DEFINITIONS,PR_REVIEW_REQUIRED_TRIGGER_IDS,PR_REVIEW_TRIGGER_RECEIPT_MAX_BYTES=2097152,TriggerIdSchema,TriggerEvidenceSchema,PrReviewInlineTriggerRowSchema,PrReviewPersistedInputRowSchema,PrReviewWriterInputRowSchema,TriggerDefinitionFieldShape,V2MatchedRowSchema,V2NotTriggeredRowSchema,V2RowSchema,TriggerCoverageDegradationSchema,TriggerReceiptCoveredFamilySchema,ReceiptEnvelopeSchema,V2ReceiptSchema,LegacyRowFieldShape,LegacyBasicRowSchema,LegacyFullRowSchema,LegacyRowSchema,V1ReceiptSchema,UnversionedRowOnlyReceiptSchema;var init_pr_review_trigger_contract=__esm(()=>{init_zod();PR_REVIEW_TRIGGER_DEFINITIONS=[{id:"auth-identity-secrets",scope:"universal",trigger_row:"authentication, authorization, identity, sessions, permissions, secrets, cryptography",micro_lane:"Identity and secret boundaries"},{id:"untrusted-input-boundaries",scope:"universal",trigger_row:"parsing, serialization, queries, templates/rendering, file or network input/output",micro_lane:"Untrusted input and sink analysis"},{id:"subprocess-platform",scope:"universal",trigger_row:"subprocesses, shell commands, filesystem operations, OS/runtime-specific code",micro_lane:"Subprocess and platform safety"},{id:"concurrency-state",scope:"universal",trigger_row:"queues, caches, retries, transactions, locks, state machines, async coordination",micro_lane:"Concurrency and state transitions"},{id:"dependencies-build-release",scope:"universal",trigger_row:"dependency manifests, lockfiles, installers, build scripts, CI, packaging, deployment",micro_lane:"Dependency and delivery integrity"},{id:"api-schema-migrations",scope:"universal",trigger_row:"public API, wire/schema/config/storage formats, migrations, feature flags",micro_lane:"Compatibility and migration safety"},{id:"test-infrastructure",scope:"universal",trigger_row:"tests, mocks, fixtures, harnesses, coverage, CI matrices",micro_lane:"Test validity and isolation"},{id:"ui-accessibility-i18n",scope:"universal",trigger_row:"user interfaces, interaction flows, rendering, accessibility, localization",micro_lane:"UI and human-interface quality"},{id:"privacy-observability",scope:"universal",trigger_row:"telemetry, logs, analytics, traces, retention, diagnostics",micro_lane:"Privacy and observability safety"},{id:"generated-provenance",scope:"universal",trigger_row:"generated, vendored, binary, model-produced, codegen or checked-in build artifacts",micro_lane:"Generated artifact provenance"},{id:"unclassified-risk",scope:"universal",trigger_row:"any changed artifact or behavior not confidently classified by the rows above",micro_lane:"Unclassified high-risk fallback"}],PR_REVIEW_REQUIRED_TRIGGER_IDS=PR_REVIEW_TRIGGER_DEFINITIONS.map((definition)=>definition.id),TriggerIdSchema=exports_external.enum(PR_REVIEW_REQUIRED_TRIGGER_IDS,{error:"unknown PR_REVIEW trigger_id"}),TriggerEvidenceSchema=exports_external.string().trim().min(1).max(4000),PrReviewInlineTriggerRowSchema=exports_external.discriminatedUnion("result",[exports_external.object({trigger_id:TriggerIdSchema,result:exports_external.literal("MATCHED"),evidence:TriggerEvidenceSchema}).strict(),exports_external.object({trigger_id:TriggerIdSchema,result:exports_external.literal("NOT_TRIGGERED"),evidence:TriggerEvidenceSchema}).strict()]),PrReviewPersistedInputRowSchema=exports_external.discriminatedUnion("result",[exports_external.object({trigger_id:TriggerIdSchema,result:exports_external.literal("MATCHED"),evidence:TriggerEvidenceSchema,source_batch_id:exports_external.string().trim().min(1),source_lane_id:exports_external.string().trim().min(1)}).strict(),exports_external.object({trigger_id:TriggerIdSchema,result:exports_external.literal("NOT_TRIGGERED"),evidence:TriggerEvidenceSchema}).strict()]),PrReviewWriterInputRowSchema=exports_external.discriminatedUnion("result",[exports_external.object({trigger_id:TriggerIdSchema,result:exports_external.literal("MATCHED"),evidence:TriggerEvidenceSchema.optional(),source_batch_id:exports_external.string().trim().min(1),source_lane_id:exports_external.string().trim().min(1)}).strict(),exports_external.object({trigger_id:TriggerIdSchema,result:exports_external.literal("NOT_TRIGGERED"),evidence:TriggerEvidenceSchema.optional()}).strict()]);TriggerDefinitionFieldShape={scope:exports_external.literal("universal"),trigger_row:exports_external.string().trim().min(1),micro_lane:exports_external.string().trim().min(1)},V2MatchedRowSchema=exports_external.object({trigger_id:TriggerIdSchema,...TriggerDefinitionFieldShape,result:exports_external.literal("MATCHED"),evidence:TriggerEvidenceSchema,source_batch_id:exports_external.string().trim().min(1),source_lane_id:exports_external.string().trim().min(1)}).strict(),V2NotTriggeredRowSchema=exports_external.object({trigger_id:TriggerIdSchema,...TriggerDefinitionFieldShape,result:exports_external.literal("NOT_TRIGGERED"),evidence:TriggerEvidenceSchema}).strict(),V2RowSchema=exports_external.union([V2MatchedRowSchema,V2NotTriggeredRowSchema]),TriggerCoverageDegradationSchema=exports_external.object({trigger_id:TriggerIdSchema,source_batch_id:exports_external.string().trim().min(1),source_lane_id:exports_external.string().trim().min(1),reason:exports_external.string().trim().min(1)}).strict(),TriggerReceiptCoveredFamilySchema=exports_external.object({trigger_id:TriggerIdSchema,source_batch_id:exports_external.string().trim().min(1),source_lane_id:exports_external.string().trim().min(1)}).strict(),ReceiptEnvelopeSchema=exports_external.object({run_id:exports_external.string().regex(/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/),pr_head_sha:exports_external.string().trim().regex(/^[0-9a-f]{6,64}$/i),base_ref:exports_external.string().trim().regex(/^(?!-)[A-Za-z0-9][A-Za-z0-9._/-]{0,255}$/),base_sha:exports_external.string().trim().regex(/^[0-9a-f]{6,64}$/i),evaluated_at:exports_external.string().datetime(),dispatched_micro_lane_count:exports_external.number().int().min(1)}),V2ReceiptSchema=ReceiptEnvelopeSchema.extend({schema_version:exports_external.literal(2),trigger_count:exports_external.number().int().min(0),matched_count:exports_external.number().int().min(0),not_triggered_count:exports_external.number().int().min(0),no_match_count:exports_external.number().int().min(0),rows:exports_external.array(V2RowSchema),coverage_degradations:exports_external.array(TriggerCoverageDegradationSchema).default([]),receipt_covered_families:exports_external.array(TriggerReceiptCoveredFamilySchema).default([]),base_verification:exports_external.enum(["live","bound_fallback"]).optional()}).strict();LegacyRowFieldShape={trigger_id:TriggerIdSchema,result:exports_external.literal("MATCHED"),evidence:TriggerEvidenceSchema,source_batch_id:exports_external.string().trim().min(1),source_lane_id:exports_external.string().trim().min(1)},LegacyBasicRowSchema=exports_external.object(LegacyRowFieldShape).strict(),LegacyFullRowSchema=exports_external.object({trigger_id:TriggerIdSchema,...TriggerDefinitionFieldShape,result:exports_external.literal("MATCHED"),evidence:TriggerEvidenceSchema,source_batch_id:exports_external.string().trim().min(1),source_lane_id:exports_external.string().trim().min(1)}).strict(),LegacyRowSchema=exports_external.union([LegacyBasicRowSchema,LegacyFullRowSchema]),V1ReceiptSchema=ReceiptEnvelopeSchema.extend({schema_version:exports_external.literal(1),trigger_count:exports_external.number().int().min(0),matched_count:exports_external.number().int().min(0),no_match_count:exports_external.number().int().min(0),rows:exports_external.array(LegacyRowSchema)}).strict(),UnversionedRowOnlyReceiptSchema=exports_external.object({rows:exports_external.array(exports_external.unknown())}).strict()});import{readFileSync as readFileSync43,statSync as statSync42}from"node:fs";function readPrReviewTriggerReceiptForGate(directory,triggerEvalPath){if(!triggerEvalPath)return{noReceipt:!0};let triggerPath=validateSwarmPath(directory,triggerEvalPath),triggerArtifact;try{let triggerStat=statSync42(triggerPath);if(!triggerStat.isFile()||triggerStat.size>PR_REVIEW_TRIGGER_RECEIPT_MAX_BYTES)throw Error("trigger evaluation artifact exceeds its read bound");triggerArtifact=JSON.parse(readFileSync43(triggerPath,"utf-8"))}catch{throw Error("BLOCKED: PR_REVIEW trigger evaluation artifact is missing or invalid")}try{return{receipt:parsePrReviewTriggerReceipt(triggerArtifact)}}catch(error93){throw Error(`BLOCKED: PR_REVIEW trigger evaluation is invalid: ${error93 instanceof Error?error93.message:String(error93)}`)}}function prReviewReceiptHasCoverageDegradations(directory,triggerEvalPath){let read=readPrReviewTriggerReceiptForGate(directory,triggerEvalPath);return"noReceipt"in read?!1:read.receipt.coverageDegradations.length>0}var init_pr_review_trigger_receipt_reader=__esm(()=>{init_utils2();init_pr_review_trigger_contract()});import*as fs71 from"node:fs";import*as path109 from"node:path";function decodeCompleteUtf8Prefix(bytes){let fatalDecoder=new TextDecoder("utf-8",{fatal:!0});try{return fatalDecoder.decode(bytes)}catch{for(let trim=1;trim<=3&&trim<=bytes.byteLength;trim+=1)try{return fatalDecoder.decode(bytes.subarray(0,bytes.byteLength-trim))}catch{}return new TextDecoder().decode(bytes).replace(/\uFFFD+$/u,"")}}function isExecutableFile(candidate){try{return fs71.statSync(candidate).isFile()}catch{return!1}}function resolveExecutableFromPath(names,envPath=process.env.PATH??"",platform=process.platform){let pathEntries=envPath.split(path109.delimiter).filter(Boolean),isWindows=platform==="win32";for(let rawName of names){if(!rawName)continue;if(path109.isAbsolute(rawName)&&isExecutableFile(rawName))return rawName;let extensions=isWindows&&path109.extname(rawName)===""?DEFAULT_WINDOWS_EXTENSIONS:[""];for(let dir of pathEntries)for(let ext of extensions){let candidate=path109.join(dir,`${rawName}${ext}`);if(isExecutableFile(candidate))return candidate}}return null}function clampTimeoutMs(timeoutMs){if(!Number.isFinite(timeoutMs))return MAX_RUNNER_TIMEOUT_MS;return Math.min(Math.max(1,Math.floor(timeoutMs)),MAX_RUNNER_TIMEOUT_MS)}function addTimeoutMs(baseMs,deltaMs){if(baseMs>=MAX_TIMEOUT_MS2)return MAX_TIMEOUT_MS2;return Math.min(MAX_TIMEOUT_MS2,baseMs+deltaMs)}function computeSpawnTimeoutMs(timeoutMs){let total=clampTimeoutMs(timeoutMs);for(let windowMs of[TERMINATION_GRACE_MS,TERMINATION_FORCE_MS,TERMINATION_CONFIRM_MS,TREE_TERMINATION_CONFIRM_MS,TERMINATION_FALLBACK_BUFFER_MS])total=addTimeoutMs(total,windowMs);return total}function startBoundedStreamRead(stream,maxBytes,onLimitExceeded){let reader=stream.getReader(),lockReleased=!1,cancelPromise,releaseLock=()=>{if(lockReleased)return;lockReleased=!0;try{reader.releaseLock()}catch{}},cancel=async()=>{return cancelPromise??=(async()=>{try{await reader.cancel()}catch{}finally{releaseLock()}})(),cancelPromise};if(maxBytes<=0)return onLimitExceeded?.(),{cancel,promise:(async()=>{return await cancel(),{text:"",truncated:!0}})()};return{promise:(async()=>{let chunks=[],total=0,truncated=!1;try{for(;;){let{done,value}=await reader.read();if(done)break;if(!value)continue;let remaining=maxBytes-total;if(value.byteLength>remaining){if(remaining>0)chunks.push(value.slice(0,remaining)),total+=remaining;truncated=!0,onLimitExceeded?.(),cancel();break}chunks.push(value),total+=value.byteLength}}finally{releaseLock()}let out=new Uint8Array(total),offset=0;for(let chunk of chunks)out.set(chunk,offset),offset+=chunk.byteLength;return{text:decodeCompleteUtf8Prefix(out),truncated}})(),cancel}}function timeoutKillSignal(platform){return platform==="win32"?"SIGTERM":"SIGKILL"}function reportKillFailure(error93,signal){if(error93?.code==="ESRCH")return;_internals102.warn(`external tool process kill failed for ${signal}`,error93)}function killProcess(proc){let signal=timeoutKillSignal(_internals102.platform());try{proc?.kill(signal)}catch(error93){reportKillFailure(error93,signal)}}function requestTermination(proc,signal){try{if(proc?.killTree)return proc.killTree(signal).then(()=>!0,(error93)=>{return reportKillFailure(error93,signal),!1});else return proc?.kill(signal),Promise.resolve(proc!==void 0)}catch(error93){return reportKillFailure(error93,signal),Promise.resolve(!1)}}async function waitForExitWithin(exitPromise,waitMs){if(waitMs<=0)return Promise.resolve(null);let timeoutHandle;try{return await Promise.race([exitPromise,new Promise((resolve54)=>{timeoutHandle=_internals102.setTimeout(()=>resolve54(null),waitMs)})])}finally{if(timeoutHandle!==void 0)_internals102.clearTimeout(timeoutHandle)}}async function waitForValueWithin(promise3,waitMs){let timeoutHandle;try{return await Promise.race([promise3.then((value)=>({completed:!0,value})),new Promise((resolve54)=>{timeoutHandle=_internals102.setTimeout(()=>resolve54({completed:!1}),waitMs)})])}finally{if(timeoutHandle!==void 0)_internals102.clearTimeout(timeoutHandle)}}async function collectBoundedStreams(stdoutRead,stderrRead,proc,treeAlreadyConfirmed=!1){let reads=Promise.all([stdoutRead.promise,stderrRead.promise]),collected=await waitForValueWithin(reads,STREAM_DRAIN_MS);if(!collected.completed){let treeTermination=waitForValueWithin(requestTermination(proc,"SIGKILL"),TREE_TERMINATION_CONFIRM_MS);Promise.allSettled([stdoutRead.cancel(),stderrRead.cancel()]),collected=await waitForValueWithin(reads,STREAM_CANCEL_MS);let terminationResult=await treeTermination;if(!treeAlreadyConfirmed&&(!terminationResult.completed||!terminationResult.value))return{kind:"unconfirmed-termination"}}if(!collected.completed)return{kind:"cleanup-failed"};return{kind:"collected",stdout:collected.value[0],stderr:collected.value[1]}}async function runExternalTool(options){if(!path109.isAbsolute(options.cwd))return{status:"spawn-error",exitCode:null,stdout:"",stderr:"",stdoutTruncated:!1,stderrTruncated:!1,message:"external tool cwd must be absolute"};if(options.abortSignal?.aborted)return{status:"cancelled",exitCode:null,stdout:"",stderr:"",stdoutTruncated:!1,stderrTruncated:!1,message:"external tool execution cancelled before spawn"};let proc,timeoutHandle,abortListener,overflowTreeTermination,exitSettled=!1,settledExitCode=null,runnerTimeoutMs=clampTimeoutMs(options.timeoutMs),spawnTimeoutMs=computeSpawnTimeoutMs(runnerTimeoutMs);try{proc=_internals102.bunSpawn([options.executable,...options.args],{cwd:options.cwd,env:options.env,stdin:"ignore",stdout:"pipe",stderr:"pipe",timeout:spawnTimeoutMs,killProcessTree:!0,windowsVerbatimArguments:options.windowsVerbatimArguments});let exitPromise=proc.exited.then((exitCode)=>{return exitSettled=!0,settledExitCode=exitCode,exitCode}),exitRacePromise=exitPromise.then((exitCode)=>({kind:"exit",exitCode})),timeout=new Promise((resolve54)=>{timeoutHandle=_internals102.setTimeout(()=>{if(exitSettled){resolve54({kind:"exit",exitCode:settledExitCode??proc?.exitCode??0});return}resolve54({kind:"timeout"})},runnerTimeoutMs)}),cancelled=new Promise((resolve54)=>{if(!options.abortSignal)return;let handled=!1;if(abortListener=()=>{if(handled)return;handled=!0,resolve54({kind:"cancelled"})},options.abortSignal.addEventListener("abort",abortListener,{once:!0}),options.abortSignal.aborted)abortListener()}),terminateOnOverflow=()=>{overflowTreeTermination??=requestTermination(proc,"SIGKILL")},stdoutRead=startBoundedStreamRead(proc.stdout,options.maxStdoutBytes,terminateOnOverflow),stderrRead=startBoundedStreamRead(proc.stderr,options.maxStderrBytes,terminateOnOverflow),exitResult=await Promise.race([exitRacePromise,timeout,cancelled]);if(exitResult.kind==="timeout"||exitResult.kind==="cancelled"){let gracefulTreeTermination=requestTermination(proc,"SIGTERM"),confirmedExitCode=await waitForExitWithin(exitPromise,TERMINATION_GRACE_MS);if(!overflowTreeTermination)overflowTreeTermination=requestTermination(proc,"SIGKILL");let treeTerminationResult=waitForValueWithin(Promise.all([gracefulTreeTermination,overflowTreeTermination]),TREE_TERMINATION_CONFIRM_MS);if(confirmedExitCode===null)confirmedExitCode=await waitForExitWithin(exitPromise,TERMINATION_FORCE_MS);if(confirmedExitCode===null)confirmedExitCode=await waitForExitWithin(exitPromise,TERMINATION_CONFIRM_MS);let treeTermination=await treeTerminationResult,treeTerminationConfirmed=treeTermination.completed&&treeTermination.value.some(Boolean);Promise.allSettled([stdoutRead.cancel(),stderrRead.cancel()]);let streams2=await collectBoundedStreams(stdoutRead,stderrRead,proc,treeTerminationConfirmed);if(streams2.kind!=="collected")return{status:"spawn-error",exitCode:confirmedExitCode??proc.exitCode,stdout:"",stderr:"",stdoutTruncated:!0,stderrTruncated:!0,message:streams2.kind==="unconfirmed-termination"?UNCONFIRMED_TERMINATION_MESSAGE:"external tool output cleanup did not complete"};let{stdout:stdout2,stderr:stderr2}=streams2;if(confirmedExitCode===null||!treeTerminationConfirmed)return{status:"spawn-error",exitCode:proc.exitCode,stdout:stdout2.text,stderr:stderr2.text,stdoutTruncated:stdout2.truncated,stderrTruncated:stderr2.truncated,message:UNCONFIRMED_TERMINATION_MESSAGE};if(exitResult.kind==="timeout")return{status:"timeout",exitCode:confirmedExitCode,stdout:stdout2.text,stderr:stderr2.text,stdoutTruncated:stdout2.truncated,stderrTruncated:stderr2.truncated};return{status:"cancelled",exitCode:confirmedExitCode,stdout:stdout2.text,stderr:stderr2.text,stdoutTruncated:stdout2.truncated,stderrTruncated:stderr2.truncated,message:"external tool execution cancelled"}}let streams=await collectBoundedStreams(stdoutRead,stderrRead,proc);if(streams.kind!=="collected")return{status:"spawn-error",exitCode:exitResult.exitCode,stdout:"",stderr:"",stdoutTruncated:!0,stderrTruncated:!0,message:streams.kind==="unconfirmed-termination"?UNCONFIRMED_TERMINATION_MESSAGE:"external tool output cleanup did not complete"};let{stdout,stderr}=streams;if(overflowTreeTermination){let overflowTermination=await waitForValueWithin(overflowTreeTermination,TREE_TERMINATION_CONFIRM_MS);if(!overflowTermination.completed||!overflowTermination.value)return{status:"spawn-error",exitCode:exitResult.exitCode,stdout:stdout.text,stderr:stderr.text,stdoutTruncated:stdout.truncated,stderrTruncated:stderr.truncated,message:UNCONFIRMED_TERMINATION_MESSAGE}}if(proc.spawnError)return{status:"spawn-error",exitCode:proc.exitCode,stdout:stdout.text,stderr:stderr.text,stdoutTruncated:stdout.truncated,stderrTruncated:stderr.truncated,message:proc.spawnError.message};if(proc.signalCode)return{status:"spawn-error",exitCode:exitResult.exitCode,stdout:stdout.text,stderr:stderr.text,stdoutTruncated:stdout.truncated,stderrTruncated:stderr.truncated,message:`external tool terminated by signal ${proc.signalCode}`};return{status:"completed",exitCode:exitResult.exitCode,stdout:stdout.text,stderr:stderr.text,stdoutTruncated:stdout.truncated,stderrTruncated:stderr.truncated}}catch(err){return{status:"spawn-error",exitCode:proc?.exitCode??null,stdout:"",stderr:"",stdoutTruncated:!1,stderrTruncated:!1,message:err instanceof Error?err.message:String(err)}}finally{if(timeoutHandle!==void 0)_internals102.clearTimeout(timeoutHandle);if(abortListener&&options.abortSignal)options.abortSignal.removeEventListener("abort",abortListener);if(!exitSettled)killProcess(proc)}}var DEFAULT_WINDOWS_EXTENSIONS,TERMINATION_GRACE_MS=20,TERMINATION_FORCE_MS=20,TERMINATION_CONFIRM_MS=20,TREE_TERMINATION_CONFIRM_MS=5100,TERMINATION_FALLBACK_BUFFER_MS=1,STREAM_DRAIN_MS=50,STREAM_CANCEL_MS=50,MAX_TIMEOUT_MS2=2147483647,TERMINATION_WINDOWS_MS,MAX_RUNNER_TIMEOUT_MS,UNCONFIRMED_TERMINATION_MESSAGE="external tool process termination could not be confirmed",_internals102;var init_external_tool_runner=__esm(()=>{init_bun_compat();init_logger();DEFAULT_WINDOWS_EXTENSIONS=[".exe",".cmd",".bat"],TERMINATION_WINDOWS_MS=TERMINATION_GRACE_MS+TERMINATION_FORCE_MS+TERMINATION_CONFIRM_MS+TREE_TERMINATION_CONFIRM_MS+TERMINATION_FALLBACK_BUFFER_MS,MAX_RUNNER_TIMEOUT_MS=MAX_TIMEOUT_MS2-TERMINATION_WINDOWS_MS;_internals102={bunSpawn,platform:()=>process.platform,now:()=>Date.now(),setTimeout,clearTimeout,clampTimeoutMs,computeSpawnTimeoutMs,warn}});import*as fsp4 from"node:fs/promises";import*as path110 from"node:path";function boundPath(value){let cleaned=value.replace(/[\p{Cc}]/gu," ").replace(/[`<>]/g," ").replace(/\s+/g," ").trim();return cleaned.length>MAX_EVIDENCE_PATH_LENGTH?`${cleaned.slice(0,MAX_EVIDENCE_PATH_LENGTH)}...`:cleaned}function evidence(parsed,worktreeRoot,gitDir,operations,detail){let allPaths=parsed?[...parsed.unmergedPaths,...parsed.dirtySubmodulePaths,...parsed.dirtyTrackedPaths,...parsed.untrackedPaths]:[],uniquePaths=[...new Set(allPaths)].map(boundPath);return{worktreeRoot:worktreeRoot?boundPath(worktreeRoot):null,gitDir:gitDir?boundPath(gitDir):null,operations,unmergedCodes:parsed?[...new Set(parsed.unmergedCodes)].sort():[],paths:uniquePaths.slice(0,MAX_EVIDENCE_PATHS),trackedCount:parsed?.dirtyTrackedPaths.length??0,untrackedCount:parsed?.untrackedPaths.length??0,pathsTruncated:uniquePaths.length>MAX_EVIDENCE_PATHS,...detail?{detail}:{}}}async function runGitCapture(directory,args2){let result=await runExternalTool({executable:resolveGitExecutable(),args:[...args2],cwd:path110.resolve(directory),timeoutMs:GIT_TIMEOUT_MS4,maxStdoutBytes:MAX_GIT_OUTPUT_BYTES,maxStderrBytes:65536});return{ok:result.status==="completed"&&result.exitCode===0&&!result.stdoutTruncated&&!result.stderrTruncated,stdout:result.stdout}}async function activeOperations(gitDir){return(await Promise.all(OPERATION_MARKERS.map(async([name,marker])=>{try{return await fsp4.lstat(path110.join(gitDir,marker)),name}catch(error93){if(error93.code==="ENOENT")return null;throw error93}}))).filter((value)=>value!==null)}async function classifyPrWorkflowGitState(directory,options={}){let[statusResult,rootResult,gitDirResult]=await Promise.all([_internals103.runGitCapture(directory,["status","--porcelain=v2","--branch","-z","--untracked-files=all"]),_internals103.runGitCapture(directory,["rev-parse","--show-toplevel"]),_internals103.runGitCapture(directory,["rev-parse","--absolute-git-dir"])]);if(!statusResult.ok||!rootResult.ok||!gitDirResult.ok)return{kind:"indeterminate",code:"GIT_STATE_INDETERMINATE",retryable:!1,requiredAction:"Confirm this is a readable Git worktree and resolve filesystem or Git errors before starting the PR workflow.",evidence:evidence(null,null,null,[],"required Git inspection failed")};let worktreeRoot=rootResult.stdout.trim(),gitDir=gitDirResult.stdout.trim(),parsedRaw=parsePorcelainV2Snapshot(statusResult.stdout);if(!worktreeRoot||!gitDir||!parsedRaw)return{kind:"indeterminate",code:"GIT_STATE_INDETERMINATE",retryable:!1,requiredAction:"Resolve the malformed or incomplete Git status before starting the PR workflow.",evidence:evidence(parsedRaw,worktreeRoot||null,gitDir||null,[],"Git returned an incomplete status snapshot")};let ignoredPaths=new Set((options.ignoredPaths??[]).map((value)=>value.replace(/\\/g,"/"))),keepPath=(value)=>!ignoredPaths.has(value.replace(/\\/g,"/")),parsed={...parsedRaw,dirtyTrackedPaths:parsedRaw.dirtyTrackedPaths.filter(keepPath),untrackedPaths:parsedRaw.untrackedPaths.filter(keepPath),unmergedPaths:parsedRaw.unmergedPaths.filter(keepPath),dirtySubmodulePaths:parsedRaw.dirtySubmodulePaths.filter(keepPath)},operations;try{operations=await _internals103.activeOperations(path110.resolve(gitDir))}catch{return{kind:"indeterminate",code:"GIT_STATE_INDETERMINATE",retryable:!1,requiredAction:"Resolve the unreadable Git operation state before starting the PR workflow.",evidence:evidence(parsed,worktreeRoot,gitDir,[],"Git operation markers could not be inspected")}}let stateEvidence=evidence(parsed,worktreeRoot,gitDir,operations);if(parsed.unmergedCodes.length>0)return{kind:"recovery-required",code:"UNMERGED_INDEX",retryable:!1,requiredAction:"Resolve or abort the current merge/rebase/cherry-pick/revert operation manually; conflicted index entries must never be stashed by PR workflow startup.",evidence:stateEvidence};if(operations.length>0)return{kind:"recovery-required",code:"GIT_OPERATION_IN_PROGRESS",retryable:!1,requiredAction:"Complete or abort the active Git operation manually before starting the PR workflow.",evidence:stateEvidence};if(parsed.dirtySubmodulePaths.length>0)return{kind:"recovery-required",code:"DIRTY_SUBMODULE",retryable:!1,requiredAction:"Resolve or preserve dirty submodule worktrees manually; the checkout-preparation stash cannot safely preserve them.",evidence:stateEvidence};if([...parsed.dirtyTrackedPaths,...parsed.untrackedPaths].find((candidate)=>candidate===".swarm"||candidate.startsWith(".swarm/")||candidate.startsWith(".swarm\\")))return{kind:"recovery-required",code:"SWARM_STATE_TRACKING_ERROR",retryable:!1,requiredAction:"Restore .swarm/ so it is git-excluded before starting the PR workflow; runtime state must not be treated as checkout dirt.",evidence:stateEvidence};if(parsed.dirtyTrackedPaths.length===0&&parsed.untrackedPaths.length===0)return{kind:"clean",code:"CLEAN",retryable:!0,requiredAction:"No checkout recovery is required.",evidence:stateEvidence};return{kind:"stashable",code:"STASHABLE_CHANGES",retryable:!0,requiredAction:"Run prepare_pr_workflow_checkout once to preserve the ordinary working-tree changes before checkout.",evidence:stateEvidence}}var GIT_TIMEOUT_MS4=5000,MAX_GIT_OUTPUT_BYTES=524288,MAX_EVIDENCE_PATHS=20,MAX_EVIDENCE_PATH_LENGTH=240,OPERATION_MARKERS,_internals103;var init_pr_workflow_state=__esm(()=>{init_workspace_snapshot();init_external_tool_runner();init_git_executable();OPERATION_MARKERS=[["merge","MERGE_HEAD"],["rebase-merge","rebase-merge"],["rebase-apply-or-am","rebase-apply"],["cherry-pick","CHERRY_PICK_HEAD"],["revert","REVERT_HEAD"],["bisect","BISECT_START"],["sequencer","sequencer"]];_internals103={runGitCapture,activeOperations,parsePorcelainV2:parsePorcelainV2Snapshot}});import{createHash as createHash51}from"node:crypto";function computeRedactionPolicyVersion(policy){return 2000000+SECRET_PATTERNS.length*2+(policy.rejectDurableSecrets?1:0)+(policy.detectPii?4:0)+(policy.rejectDurablePii?8:0)+(policy.piiDetector==="ner"?16:0)}function classifyStoredFingerprintAlgorithmVersion(rawStoredVersion,currentVersion=_internals104.currentAlgorithmVersion){let storedVersion=rawStoredVersion===void 0?LEGACY_FINGERPRINT_ALGORITHM_VERSION:rawStoredVersion;if(typeof storedVersion!=="number"||!Number.isFinite(storedVersion))return{status:"unknown"};return storedVersion===currentVersion?{status:"comparable"}:{status:"mismatch",storedVersion,currentVersion}}function computeMemoryCohortFingerprint(input){let canonical=stableCanonicalStringify(input);return createHash51("sha256").update(canonical).digest("hex").slice(0,12)}function buildMemoryCohortFingerprintInput(config3){return{provider:config3.provider,redaction_policy_version:computeRedactionPolicyVersion({rejectDurableSecrets:config3.redaction.rejectDurableSecrets,detectPii:config3.redaction.detectPii,rejectDurablePii:config3.redaction.rejectDurablePii,piiDetector:config3.redaction.piiDetector}),embedding_model:config3.embeddings.model,embedding_dimension:config3.embeddings.dimension,embedding_version:config3.embeddings.version??"default"}}function findSecrets(text){let findings=[];for(let{type,pattern}of SECRET_PATTERNS){pattern.lastIndex=0;for(let match of text.matchAll(pattern))if(match[0])findings.push({type,match:match[0]})}return findings}function containsSecret(text){return findSecrets(text).length>0}function redactSecrets(text){let redacted=text;for(let{type,pattern}of SECRET_PATTERNS)pattern.lastIndex=0,redacted=redacted.replace(pattern,`[REDACTED:${type}]`);return redacted}var SECRET_PATTERNS,FINGERPRINT_ALGORITHM_VERSION=2,LEGACY_FINGERPRINT_ALGORITHM_VERSION=1,_internals104;var init_redaction=__esm(()=>{SECRET_PATTERNS=[{type:"openai_api_key",pattern:/\bsk-[A-Za-z0-9_-]{20,}\b/g},{type:"github_token",pattern:/\b(?:ghp|gho|ghu|ghs|ghr|github_pat)_[A-Za-z0-9_]{20,}\b/g},{type:"aws_access_key_id",pattern:/\bAKIA[0-9A-Z]{16}\b/g},{type:"private_key_block",pattern:/-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/g},{type:"authorization_bearer",pattern:/\bAuthorization\s*:\s*Bearer\s+[A-Za-z0-9._~+/=-]{12,}/gi},{type:"env_secret",pattern:/\b(?:[A-Z][A-Z0-9]+_)+(?:KEY|TOKEN|SECRET|PASSWORD)\b\s*=\s*["']?[^\s"'`]{8,}["']?/gi},{type:"gitlab_token",pattern:/\bgl(?:pat|ptt)-[A-Za-z0-9_-]{15,}\b/g},{type:"slack_token",pattern:/\bxox[abprs]-[A-Za-z0-9-]{10,}\b/g},{type:"jwt_token",pattern:/\beyJ[A-Za-z0-9_-]+\.eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/g},{type:"aws_secret_access_key",pattern:/\b(?:aws_secret_access_key|AWS_SECRET_ACCESS_KEY|secret_access_key|SecretAccessKey)"?\s*[=:]\s*["']?[A-Za-z0-9/+=]{40}\b/g},{type:"aws_secret_access_key_context",pattern:/\bAKIA[0-9A-Z]{16}\b[^\n]{0,200}?\b[A-Za-z0-9/+=]{40}\b/g},{type:"stripe_secret_key",pattern:/\b(?:sk|rk)_(?:live|test)_[A-Za-z0-9]{24,}\b/g},{type:"google_api_key",pattern:/\bAIza[0-9A-Za-z_-]{35}\b/g},{type:"openssh_private_key_block",pattern:/-----BEGIN[ ]OPENSSH[ ]PRIVATE[ ]KEY-----[\s\S]*?-----END[ ]OPENSSH[ ]PRIVATE[ ]KEY-----/g}];_internals104={currentAlgorithmVersion:FINGERPRINT_ALGORITHM_VERSION}});import{createHash as createHash52,randomUUID as randomUUID15}from"node:crypto";import*as fsp5 from"node:fs/promises";import*as path111 from"node:path";function normalizeSessionID(sessionID){let normalized=sessionID.trim();if(!normalized)throw Error("BLOCKED: PR workflow gate requires a non-empty sessionID");return normalized}function prWorkflowSessionFileStem(sessionID){let normalized=normalizeSessionID(sessionID),slug=normalized.replace(/[^A-Za-z0-9_.-]/g,"_").slice(0,80)||"session",digest3=createHash52("sha256").update(normalized).digest("hex").slice(0,12);return`${slug}-${digest3}`}function workflowGateStateRelativePath(sessionID){return path111.join(WORKFLOW_GATE_DIR,`${prWorkflowSessionFileStem(sessionID)}.json`)}function workflowGateStateLockRelativePath(sessionID){return path111.join(WORKFLOW_GATE_DIR,`${prWorkflowSessionFileStem(sessionID)}.lock`)}function workflowCheckoutMutationLockRelativePath(){return path111.join(WORKFLOW_GATE_DIR,"checkout.lock")}function workflowGateStatePath(directory,sessionID){return validateSwarmPath(directory,workflowGateStateRelativePath(sessionID))}function workflowGateStateImportedPath(directory,sessionID){return`${workflowGateStatePath(directory,sessionID)}.imported`}function workflowGateStateProjectionMarkerPath(directory,sessionID){return`${workflowGateStatePath(directory,sessionID)}.sqlite-projection`}function workflowGateStateCoordinationNamespace(sessionID){return`${WORKFLOW_STATE_COORDINATION_PREFIX}:${prWorkflowSessionFileStem(sessionID)}`}function workflowGateStateLockPath(directory,sessionID){return validateSwarmPath(directory,workflowGateStateLockRelativePath(sessionID))}function workflowCheckoutMutationLockPath(directory){return validateSwarmPath(directory,workflowCheckoutMutationLockRelativePath())}function isoNow(){return new Date().toISOString()}function delay(ms){return new Promise((resolve56)=>setTimeout(resolve56,ms))}function sameBigIntFileIdentity(left,right){return left.dev===right.dev&&left.ino===right.ino}function normalizeComparableFsPath(value){let normalized=path111.normalize(path111.resolve(value));return process.platform==="win32"?normalized.toLowerCase():normalized}function stateCacheKey(directory,sessionID){return`${canonicalRootKeyFresh(directory)}\x00${normalizeSessionID(sessionID)}`}function rememberState(directory,state2){let cacheKey=stateCacheKey(directory,state2.sessionID);trackedStatesByProjectSession.delete(cacheKey),trackedStatesByProjectSession.set(cacheKey,state2);while(trackedStatesByProjectSession.size>MAX_TRACKED_SESSIONS2){let oldestKey=trackedStatesByProjectSession.keys().next().value;if(!oldestKey)break;trackedStatesByProjectSession.delete(oldestKey)}}function forgetTrackedPrWorkflowState(directory,sessionID){trackedStatesByProjectSession.delete(stateCacheKey(directory,sessionID))}function resetPrReviewPersistenceCaches(){trackedStatesByProjectSession.clear(),pendingStateMutationsByProjectSession.clear(),pendingCheckoutMutationsByProject.clear(),completedCheckoutLockOwners.clear()}function defaultIsProcessAlive(pid){try{return process.kill(pid,0),!0}catch(error93){return error93.code!=="ESRCH"}}function bindPrReviewPersistenceHooks(nextHooks){hooks=nextHooks}function bindPrReviewStateCodec(nextCodec){codec3=nextCodec}function requireCodec(){if(!codec3)throw Error("BLOCKED: PR workflow persistence codec is not bound (the gate must bind it at module init)");return codec3}async function ensurePrWorkflowSafeParentDirectory(directory,filePath){let swarmRoot=path111.resolve(directory,".swarm"),parentPath=path111.dirname(path111.resolve(filePath)),relativeParent=path111.relative(swarmRoot,parentPath);if(relativeParent===".."||relativeParent.startsWith(`..${path111.sep}`)||path111.isAbsolute(relativeParent))throw Error("BLOCKED: PR workflow atomic destination escapes the project .swarm directory");await fsp5.mkdir(swarmRoot,{recursive:!0});let currentPath=swarmRoot,currentIdentity=await assertSafeDirectory(currentPath,void 0);for(let segment of relativeParent.split(path111.sep).filter(Boolean)){let nextPath=path111.join(currentPath,segment);await hooks.beforeSafeDirectoryCreate?.(currentPath,nextPath),await assertSafeDirectory(currentPath,currentIdentity);try{await fsp5.mkdir(nextPath)}catch(error93){if(error93.code!=="EEXIST")throw error93}await assertSafeDirectory(currentPath,currentIdentity);let nextIdentity=await assertSafeDirectory(nextPath,void 0),[realCurrent,realNext]=await Promise.all([fsp5.realpath(currentPath),fsp5.realpath(nextPath)]);if(normalizeComparableFsPath(path111.dirname(realNext))!==normalizeComparableFsPath(realCurrent))throw Error("BLOCKED: PR workflow directory creation escaped the project .swarm tree");currentPath=nextPath,currentIdentity=nextIdentity}let realRoot=await fsp5.realpath(swarmRoot),realParent=await fsp5.realpath(parentPath),relativeRealParent=path111.relative(realRoot,realParent);if(relativeRealParent===".."||relativeRealParent.startsWith(`..${path111.sep}`)||path111.isAbsolute(relativeRealParent))throw Error("BLOCKED: PR workflow atomic parent escapes the project .swarm directory");return realParent}async function assertSafeDirectory(directoryPath,expectedIdentity){let stat11=await fsp5.lstat(directoryPath,{bigint:!0});if(stat11.isSymbolicLink()||!stat11.isDirectory()||expectedIdentity&&!sameBigIntFileIdentity(stat11,expectedIdentity))throw Error("BLOCKED: PR workflow .swarm path must be a real directory and must not change during the operation");return{dev:stat11.dev,ino:stat11.ino}}async function assertOpenedSwarmFileIdentity(directory,filePath,handle,expectedParent,label){let openedStat=await handle.stat({bigint:!0});if(!openedStat.isFile())throw Error(`BLOCKED: ${label} is not a file`);return await assertClosedSwarmFileIdentity(directory,filePath,openedStat,expectedParent,label),{dev:openedStat.dev,ino:openedStat.ino}}async function assertClosedSwarmFileIdentity(directory,filePath,expectedIdentity,expectedParent,label){if(!expectedIdentity)throw Error(`BLOCKED: ${label} has no identity`);let[stat11,realRoot,realFile,realParent]=await Promise.all([fsp5.lstat(filePath,{bigint:!0}),fsp5.realpath(path111.resolve(directory,".swarm")),fsp5.realpath(filePath),fsp5.realpath(path111.dirname(filePath))]),relativeFile=path111.relative(realRoot,realFile);if(stat11.isSymbolicLink()||!stat11.isFile()||!sameBigIntFileIdentity(stat11,expectedIdentity)||normalizeComparableFsPath(realParent)!==normalizeComparableFsPath(expectedParent)||relativeFile===""||relativeFile===".."||relativeFile.startsWith(`..${path111.sep}`)||path111.isAbsolute(relativeFile))throw Error(`BLOCKED: ${label} changed or escaped .swarm`)}async function writeAtomicJson2(directory,filePath,value){let safeParent=await ensurePrWorkflowSafeParentDirectory(directory,filePath),tempPath=`${filePath}.tmp.${process.pid}.${randomUUID15()}`,tempIdentity,lastError;try{let handle=await fsp5.open(tempPath,"wx");try{await hooks.beforeAtomicTempWrite?.(),tempIdentity=await assertOpenedSwarmFileIdentity(directory,tempPath,handle,safeParent,"PR workflow atomic temporary file"),await handle.writeFile(JSON.stringify(value,null,2),"utf-8"),await handle.sync()}finally{await handle.close()}await hooks.beforeAtomicRename?.(),await assertClosedSwarmFileIdentity(directory,tempPath,tempIdentity,safeParent,"PR workflow atomic temporary file");for(let attempt=0;attempt<WINDOWS_RENAME_MAX_RETRIES3;attempt++)try{await hooks.rename(tempPath,filePath),lastError=void 0;break}catch(error93){lastError=error93;let code=error93.code;if(code!=="EEXIST"&&code!=="EPERM"&&code!=="EBUSY")break;if(attempt<WINDOWS_RENAME_MAX_RETRIES3-1)await delay(RENAME_RETRY_DELAY_MS3)}if(lastError)throw lastError;await assertClosedSwarmFileIdentity(directory,filePath,tempIdentity,safeParent,"PR workflow atomic destination file")}finally{try{await fsp5.rm(tempPath,{force:!0})}catch{}}}async function writePrWorkflowAtomicJson(directory,filePath,value){await writeAtomicJson2(directory,filePath,value)}async function readPrWorkflowGateStateFromDisk(directory,sessionID,options={}){let authoritative=await readPrWorkflowGateStateFromCoordination(directory,sessionID);if(authoritative)return await repairImportedWorkflowGateShadow(directory,sessionID,authoritative),authoritative;return importLegacyPrWorkflowGateStateIfNeeded(directory,sessionID,options.allowSalvagedImport===!0)}async function readPrWorkflowGateStateFileRawFromDisk(filePath,stateLabel){let raw;try{raw=await fsp5.readFile(filePath,"utf-8")}catch(error93){if(error93.code==="ENOENT")return null;throw error93}let parsedJson;try{parsedJson=JSON.parse(raw)}catch{throw Error(`BLOCKED: PR workflow gate state for session "${stateLabel}" is not valid JSON`)}let parsed=requireCodec().safeParse(parsedJson);if(!parsed.success)throw Error(`BLOCKED: PR workflow gate state for session "${stateLabel}" is invalid`);return parsed.data}async function readPrWorkflowGateStateFileFromDisk(filePath,stateLabel){return readPrWorkflowGateStateFileRawFromDisk(filePath,stateLabel)}async function readPrWorkflowGateStateFromCoordination(directory,sessionID){return readPrWorkflowGateStateCoordinationRow(directory,sessionID)?.state??null}function readPrWorkflowGateStateCoordinationForRecovery(directory,sessionID){let normalizedSessionID=normalizeSessionID(sessionID),row=getCoordinationStateRaw(directory,workflowGateStateCoordinationNamespace(normalizedSessionID),WORKFLOW_STATE_ENTITY_KEY);if(!row)return{kind:"absent"};if(row.payload.length>MAX_COORDINATION_PAYLOAD_CHARS)return{kind:"corrupt",rowRevision:row.revision,generation:row.generation,reason:"coordination payload exceeds the maximum size"};let parsedJson;try{parsedJson=JSON.parse(row.payload)}catch{return{kind:"corrupt",rowRevision:row.revision,generation:row.generation,reason:"coordination payload is not valid JSON"}}let parsed=requireCodec().safeParse(parsedJson);if(!parsed.success)return{kind:"corrupt",rowRevision:row.revision,generation:row.generation,reason:"coordination payload failed the workflow state schema"};if(parsed.data.sessionID!==normalizedSessionID)return{kind:"invalid",reason:"coordination payload session identity does not match the requested session"};if(parsed.data.revision!==row.generation)return{kind:"corrupt",rowRevision:row.revision,generation:row.generation,reason:"coordination payload revision does not match its generation"};return{kind:"valid",rowRevision:row.revision,generation:row.generation,state:parsed.data}}function readPrWorkflowGateStateCoordinationRow(directory,sessionID){let row=getCoordinationState(directory,workflowGateStateCoordinationNamespace(sessionID),WORKFLOW_STATE_ENTITY_KEY);if(!row)return null;let parsedJson;try{parsedJson=JSON.parse(row.payload)}catch{throw Error(`BLOCKED: PR workflow gate state for session "${sessionID}" is not valid JSON`)}let parsed=requireCodec().safeParse(parsedJson);if(!parsed.success||parsed.data.sessionID!==normalizeSessionID(sessionID)||parsed.data.revision!==row.generation)throw Error(`BLOCKED: PR workflow gate state for session "${sessionID}" is invalid`);return{rowRevision:row.revision,state:parsed.data}}function workflowStateStatus(state2){let mode=state2.mode;return typeof mode==="string"&&mode.trim().length>0?mode:"active"}async function fileExists(filePath){try{return await fsp5.stat(filePath),!0}catch(error93){if(error93.code==="ENOENT")return!1;throw error93}}function serializeWorkflowGateState(state2){return JSON.stringify(state2,null,2)}async function readTextFileIfExists(filePath){try{return await fsp5.readFile(filePath,"utf8")}catch(error93){if(error93.code==="ENOENT")return null;throw error93}}async function writeProjectionMarker(directory,filePath){await ensurePrWorkflowSafeParentDirectory(directory,filePath),await fsp5.writeFile(filePath,`sqlite-projection
|
|
1274
1274
|
`,"utf8")}async function renameWithRetry6(from,to){let lastError;for(let attempt=0;attempt<WINDOWS_RENAME_MAX_RETRIES3;attempt++)try{await hooks.rename(from,to);return}catch(error93){lastError=error93;let code=error93.code;if(code!=="EEXIST"&&code!=="EPERM"&&code!=="EBUSY")throw error93;if(attempt<WINDOWS_RENAME_MAX_RETRIES3-1)await delay(RENAME_RETRY_DELAY_MS3)}throw lastError}async function collisionSafeImportedPath(filePath){let canonical=`${filePath}.imported`;if(!await fileExists(canonical))return canonical;for(let suffix=1;suffix<=1e4;suffix+=1){let candidate=`${canonical}.${suffix}`;if(!await fileExists(candidate))return candidate}throw Error(`No collision-safe archive path available for ${path111.basename(filePath)}`)}async function archiveShadowSource(filePath){if(!await fileExists(filePath))return;await renameWithRetry6(filePath,await collisionSafeImportedPath(filePath))}async function syncWorkflowGateShadowProjection(directory,sessionID,state2,options){let filePath=workflowGateStatePath(directory,sessionID);if(options.archiveLegacy&&await fileExists(filePath))await archiveShadowSource(filePath);await writeAtomicJson2(directory,filePath,state2),await writeProjectionMarker(directory,workflowGateStateProjectionMarkerPath(directory,sessionID))}async function repairImportedWorkflowGateShadow(directory,sessionID,state2){let filePath=workflowGateStatePath(directory,sessionID),markerPath=workflowGateStateProjectionMarkerPath(directory,sessionID),live=await readTextFileIfExists(filePath);if(live===null){await syncWorkflowGateShadowProjection(directory,sessionID,state2,{archiveLegacy:!1});return}let canonicalImportedExists=await fileExists(workflowGateStateImportedPath(directory,sessionID)),markerExists=await fileExists(markerPath),projected=serializeWorkflowGateState(state2);if(canonicalImportedExists&&markerExists&&live===projected)return;if(canonicalImportedExists&&live===projected){await writeProjectionMarker(directory,markerPath);return}await syncWorkflowGateShadowProjection(directory,sessionID,state2,{archiveLegacy:!0})}async function removeWorkflowGateShadowProjection(directory,sessionID){for(let filePath of[workflowGateStatePath(directory,sessionID),workflowGateStateProjectionMarkerPath(directory,sessionID)])try{await(hooks.removeShadowProjection??((target)=>fsp5.rm(target,{force:!0})))(filePath)}catch(error93){if(error93.code!=="ENOENT")throw error93}}function appendSessionTerminalizationEvent(directory,sessionID,rowRevision){try{appendCoreEventSync(directory,{type:"pr_workflow_session_terminalized",timestamp:isoNow(),sessionID,rowRevision})}catch{}}async function importLegacyPrWorkflowGateStateIfNeeded(directory,sessionID,allowSalvagedImport=!1){let filePath=workflowGateStatePath(directory,sessionID),raw;try{raw=await fsp5.readFile(filePath,"utf-8")}catch(error93){if(error93.code==="ENOENT")return null;throw error93}let legacy=allowSalvagedImport?(await(await Promise.resolve().then(() => (init_pr_workflow_gate(),exports_pr_workflow_gate))).readPrWorkflowGateStateForRecovery(directory,sessionID))?.state??null:await readPrWorkflowGateStateFileFromDisk(filePath,sessionID);if(!legacy)return null;let namespace=workflowGateStateCoordinationNamespace(sessionID),outcome=importCoordinationOnce(directory,{source:workflowGateStateRelativePath(sessionID),sourceDigest:createHash52("sha256").update(raw).digest("hex"),rowCount:1,emptyNamespace:namespace},()=>{let result=transitionCoordinationState(directory,{namespace,entityKey:WORKFLOW_STATE_ENTITY_KEY,expectedRevision:null,generation:legacy.revision,status:workflowStateStatus(legacy),payload:JSON.stringify(legacy)});if(result.outcome!=="applied")throw Error(`PR workflow gate state import failed: ${result.outcome}`)}),authoritative=await readPrWorkflowGateStateFromCoordination(directory,sessionID);if(authoritative&&outcome==="imported")await syncWorkflowGateShadowProjection(directory,sessionID,authoritative,{archiveLegacy:!0});return authoritative}async function writeStateWhileLocked(directory,state2,options={}){let bound=requireCodec(),validated=bound.parse(state2),currentAuthoritative=readPrWorkflowGateStateCoordinationRow(directory,validated.sessionID),current=currentAuthoritative?.state??null;if(!current)current=await readPrWorkflowGateStateFromDisk(directory,validated.sessionID),currentAuthoritative=readPrWorkflowGateStateCoordinationRow(directory,validated.sessionID);if(current?current.revision!==validated.revision:validated.revision!==0)throw Error("BLOCKED: PR workflow gate state changed concurrently; reload the active session state before retrying");if(current?.workflowInstanceId&&validated.workflowInstanceId!==current.workflowInstanceId&&options.replaceWorkflowInstanceId!==current.workflowInstanceId)throw Error("BLOCKED: PR workflow gate state changed concurrently; reload the active session state before retrying");let nextState=bound.parse({...validated,revision:validated.revision+1});if(transitionCoordinationState(directory,{namespace:workflowGateStateCoordinationNamespace(validated.sessionID),entityKey:WORKFLOW_STATE_ENTITY_KEY,expectedRevision:currentAuthoritative?.rowRevision??null,generation:nextState.revision,status:workflowStateStatus(nextState),payload:JSON.stringify(nextState)}).outcome!=="applied")throw Error("BLOCKED: PR workflow gate state changed concurrently; reload the active session state before retrying");return await syncWorkflowGateShadowProjection(directory,validated.sessionID,nextState,{archiveLegacy:!1}),rememberState(directory,nextState),nextState}async function deleteStateWhileLocked(directory,sessionID,options={}){let normalizedSessionID=normalizeSessionID(sessionID),currentAuthoritative=null,corruptCoordinationRowRevision;if(options.allowSalvagedRead){let coordination=readPrWorkflowGateStateCoordinationForRecovery(directory,normalizedSessionID);if(coordination.kind==="invalid")throw Error(`BLOCKED: PR workflow gate state for session "${normalizedSessionID}" is invalid (${coordination.reason})`);if(coordination.kind==="valid")currentAuthoritative={rowRevision:coordination.rowRevision,state:coordination.state};else if(coordination.kind==="corrupt")corruptCoordinationRowRevision=coordination.rowRevision}else currentAuthoritative=readPrWorkflowGateStateCoordinationRow(directory,normalizedSessionID);let recoveryState=null;if(!currentAuthoritative){if(options.allowSalvagedRead){let{readPrWorkflowGateStateForRecovery}=await Promise.resolve().then(() => (init_pr_workflow_gate(),exports_pr_workflow_gate));recoveryState=(await readPrWorkflowGateStateForRecovery(directory,normalizedSessionID))?.state??null}if(!recoveryState)await readPrWorkflowGateStateFromDisk(directory,normalizedSessionID,{allowSalvagedImport:options.allowSalvagedRead===!0}),currentAuthoritative=readPrWorkflowGateStateCoordinationRow(directory,normalizedSessionID)}let currentRevision=currentAuthoritative?.state.revision??recoveryState?.revision;if(options.expectedStateRevision!==void 0&¤tRevision!==options.expectedStateRevision)throw Error("BLOCKED: PR workflow gate state changed concurrently; reload the active session state before retrying");let authoritativeRowRevision=currentAuthoritative?.rowRevision??(recoveryState?corruptCoordinationRowRevision:void 0);if(authoritativeRowRevision!==void 0){if(!deleteCoordinationState(directory,workflowGateStateCoordinationNamespace(normalizedSessionID),WORKFLOW_STATE_ENTITY_KEY,authoritativeRowRevision))throw Error("BLOCKED: PR workflow gate state changed concurrently; reload the active session state before retrying")}await removeWorkflowGateShadowProjection(directory,normalizedSessionID),forgetTrackedPrWorkflowState(directory,normalizedSessionID)}async function terminalizePrWorkflowGateForSession(directory,sessionID){let normalizedSessionID=normalizeSessionID(sessionID);await withSessionStateMutation(directory,normalizedSessionID,async()=>{let row=getCoordinationStateRaw(directory,workflowGateStateCoordinationNamespace(normalizedSessionID),WORKFLOW_STATE_ENTITY_KEY);if(await removeWorkflowGateShadowProjection(directory,normalizedSessionID),await hooks.beforeTerminalizationDelete?.(),row){if(!deleteCoordinationState(directory,workflowGateStateCoordinationNamespace(normalizedSessionID),WORKFLOW_STATE_ENTITY_KEY,row.revision))throw Error("BLOCKED: PR workflow gate state changed concurrently; retry session terminalization");appendSessionTerminalizationEvent(directory,normalizedSessionID,row.revision)}forgetTrackedPrWorkflowState(directory,normalizedSessionID)})}function checkoutMutationProjectKey(directory){return canonicalRootKeyFresh(directory)}async function withCheckoutMutationDeadline(promise3,phase){let timeout;try{return await Promise.race([promise3,new Promise((resolve56)=>{timeout=setTimeout(()=>{resolve56({status:"timeout",error:new PrWorkflowCheckoutMutationTimeoutError(phase)})},hooks.checkoutMutationActionTimeoutMs)})])}finally{if(timeout)clearTimeout(timeout)}}async function withPrWorkflowCheckoutMutationLock(directory,action){let key2=checkoutMutationProjectKey(directory),previous=pendingCheckoutMutationsByProject.get(key2)??Promise.resolve(),release,current=new Promise((resolve56)=>{release=resolve56}),queued=previous.then(()=>current);pendingCheckoutMutationsByProject.set(key2,queued);let previousResult=await withCheckoutMutationDeadline(previous.then(()=>({status:"ready"})),"queue");if(previousResult.status==="timeout")throw release(),queued.then(()=>{if(pendingCheckoutMutationsByProject.get(key2)===queued)pendingCheckoutMutationsByProject.delete(key2)}),previousResult.error;let lock;try{lock=await acquireCheckoutMutationLock(directory)}catch(error93){if(release(),pendingCheckoutMutationsByProject.get(key2)===queued)pendingCheckoutMutationsByProject.delete(key2);throw error93}let actionOutcome=Promise.resolve().then(action).then((value)=>({status:"fulfilled",value}),(error93)=>({status:"rejected",error:error93})),outcome=await withCheckoutMutationDeadline(actionOutcome,"action");if(outcome.status==="timeout")throw actionOutcome.then(async()=>{try{await releaseCheckoutMutationLock(lock)}catch{}finally{if(release(),pendingCheckoutMutationsByProject.get(key2)===queued)pendingCheckoutMutationsByProject.delete(key2)}}),outcome.error;try{if(outcome.status==="rejected")throw outcome.error;return outcome.value}finally{try{await releaseCheckoutMutationLock(lock)}finally{if(release(),pendingCheckoutMutationsByProject.get(key2)===queued)pendingCheckoutMutationsByProject.delete(key2)}}}async function acquireCheckoutMutationLock(directory){let lockPath=workflowCheckoutMutationLockPath(directory),verifiedParent=await ensurePrWorkflowSafeParentDirectory(directory,lockPath);for(let attempt=0;attempt<STATE_MUTATION_LOCK_MAX_ATTEMPTS;attempt++)try{let handle=await hooks.openCheckoutLock(lockPath),lock={ownerToken:randomUUID15(),pid:process.pid,createdAtMs:hooks.nowMs()},lockIdentity,writeError;try{let openedStat=await handle.stat({bigint:!0});lockIdentity={dev:openedStat.dev,ino:openedStat.ino},lockIdentity=await assertOpenedSwarmFileIdentity(directory,lockPath,handle,verifiedParent,"PR workflow checkout mutation lock"),await hooks.beforeCheckoutLockWrite?.(),await handle.writeFile(JSON.stringify(lock),"utf-8")}catch(error93){writeError=error93}finally{await handle.close().catch(()=>{return})}if(writeError){if(lockIdentity)await removeCheckoutMutationLockByIdentity(directory,lockPath,lockIdentity,verifiedParent);throw writeError}return{path:lockPath,ownerToken:lock.ownerToken}}catch(error93){if(error93.code!=="EEXIST")throw error93;if(await reclaimAbandonedCheckoutMutationLock(lockPath))continue;if(attempt<STATE_MUTATION_LOCK_MAX_ATTEMPTS-1)await delay(STATE_MUTATION_LOCK_RETRY_DELAY_MS)}throw Error("BLOCKED: PR workflow checkout mutation is being handled by another process; retry after that checkout settles")}async function releaseCheckoutMutationLock(lock){let lastError;for(let attempt=0;attempt<WINDOWS_RENAME_MAX_RETRIES3;attempt++){try{if(await removeCheckoutMutationLockIfOwned(lock.path,lock.ownerToken)){completedCheckoutLockOwners.delete(lock.path);return}lastError=Error("PR workflow checkout mutation lock ownership changed before release")}catch(error93){lastError=error93}if(attempt<WINDOWS_RENAME_MAX_RETRIES3-1)await delay(RENAME_RETRY_DELAY_MS3)}throw rememberCompletedCheckoutLockOwner(lock.path,lock.ownerToken),lastError instanceof Error?lastError:Error("PR workflow checkout mutation lock release failed")}async function reclaimAbandonedCheckoutMutationLock(lockPath){let lock=await readCheckoutMutationLock(lockPath);if(lock){if(lock.pid===process.pid&&completedCheckoutLockOwners.get(lockPath)===lock.ownerToken){let removed=await removeCheckoutMutationLockIfOwned(lockPath,lock.ownerToken);if(removed)completedCheckoutLockOwners.delete(lockPath);return removed}if(hooks.isProcessAlive(lock.pid))return!1;return removeCheckoutMutationLockIfOwned(lockPath,lock.ownerToken)}try{let stat11=await fsp5.stat(lockPath);if(hooks.nowMs()-stat11.mtimeMs<STATE_MUTATION_LOCK_UNINITIALIZED_STALE_MS)return!1;return await fsp5.rm(lockPath,{force:!0}),!0}catch(error93){if(error93.code==="ENOENT")return!0;throw error93}}async function readCheckoutMutationLock(lockPath){let raw;try{raw=await fsp5.readFile(lockPath,"utf-8")}catch(error93){if(error93.code==="ENOENT")return null;throw error93}try{let parsed=JSON.parse(raw);if(typeof parsed==="object"&&parsed!==null&&typeof parsed.ownerToken==="string"&&parsed.ownerToken.length>0&&typeof parsed.pid==="number"&&Number.isInteger(parsed.pid)&&parsed.pid>0&&typeof parsed.createdAtMs==="number"&&Number.isFinite(parsed.createdAtMs))return parsed}catch{}return null}async function removeCheckoutMutationLockIfOwned(lockPath,ownerToken){let lock=await readCheckoutMutationLock(lockPath);if(!lock||lock.ownerToken!==ownerToken)return!1;try{return await hooks.removeCheckoutLock(lockPath),!0}catch(error93){if(error93.code==="ENOENT")return!1;throw error93}}async function removeCheckoutMutationLockByIdentity(directory,lockPath,identity,verifiedParent){let lastError;for(let attempt=0;attempt<WINDOWS_RENAME_MAX_RETRIES3;attempt++)try{await assertClosedSwarmFileIdentity(directory,lockPath,identity,verifiedParent,"PR workflow checkout mutation lock"),await hooks.removeCheckoutLock(lockPath);return}catch(error93){if(error93.code==="ENOENT")return;if(lastError=error93,attempt<WINDOWS_RENAME_MAX_RETRIES3-1)await delay(RENAME_RETRY_DELAY_MS3)}throw lastError instanceof Error?lastError:Error("PR workflow checkout mutation lock cleanup failed")}function rememberCompletedCheckoutLockOwner(lockPath,ownerToken){completedCheckoutLockOwners.delete(lockPath),completedCheckoutLockOwners.set(lockPath,ownerToken);while(completedCheckoutLockOwners.size>MAX_COMPLETED_CHECKOUT_LOCK_OWNERS){let oldest=completedCheckoutLockOwners.keys().next().value;if(oldest===void 0)break;completedCheckoutLockOwners.delete(oldest)}}async function withSessionStateMutation(directory,sessionID,action){let key2=stateCacheKey(directory,sessionID),previous=pendingStateMutationsByProjectSession.get(key2)??Promise.resolve(),release,current=new Promise((resolve56)=>{release=resolve56}),queued=previous.then(()=>current);pendingStateMutationsByProjectSession.set(key2,queued),await previous;try{let lock=await acquireSessionStateMutationLock(directory,sessionID);try{return await action()}finally{await releaseSessionStateMutationLock(lock)}}finally{if(release(),pendingStateMutationsByProjectSession.get(key2)===queued)pendingStateMutationsByProjectSession.delete(key2)}}async function acquireSessionStateMutationLock(directory,sessionID){let lockPath=workflowGateStateLockPath(directory,sessionID),verifiedParent=await ensurePrWorkflowSafeParentDirectory(directory,lockPath);for(let attempt=0;attempt<STATE_MUTATION_LOCK_MAX_ATTEMPTS;attempt++)try{let handle=await fsp5.open(lockPath,"wx"),lock={ownerToken:randomUUID15(),pid:process.pid,createdAtMs:hooks.nowMs()},writeError;try{await hooks.beforeSessionStateLockWrite?.(),await assertOpenedSwarmFileIdentity(directory,lockPath,handle,verifiedParent,"PR workflow state mutation lock"),await handle.writeFile(JSON.stringify(lock),"utf-8")}catch(error93){writeError=error93}finally{await handle.close().catch(()=>{return})}if(writeError)throw await removeSessionStateMutationLockIfOwned(lockPath,lock.ownerToken),writeError;return{path:lockPath,ownerToken:lock.ownerToken}}catch(error93){if(error93.code!=="EEXIST")throw error93;if(await reclaimAbandonedSessionStateMutationLock(lockPath))continue;if(attempt<STATE_MUTATION_LOCK_MAX_ATTEMPTS-1)await delay(STATE_MUTATION_LOCK_RETRY_DELAY_MS)}throw Error("BLOCKED: PR workflow gate state is being mutated by another process; retry after that session transition finishes")}async function releaseSessionStateMutationLock(lock){try{await removeSessionStateMutationLockIfOwned(lock.path,lock.ownerToken)}catch{}}async function reclaimAbandonedSessionStateMutationLock(lockPath){let lock=await readSessionStateMutationLock(lockPath);if(lock){if(hooks.isProcessAlive(lock.pid))return!1;return removeSessionStateMutationLockIfOwned(lockPath,lock.ownerToken)}try{let stat11=await fsp5.stat(lockPath);if(hooks.nowMs()-stat11.mtimeMs<STATE_MUTATION_LOCK_UNINITIALIZED_STALE_MS)return!1;return await fsp5.rm(lockPath,{force:!0}),!0}catch(error93){if(error93.code==="ENOENT")return!0;throw error93}}async function readSessionStateMutationLock(lockPath){let raw;try{raw=await fsp5.readFile(lockPath,"utf-8")}catch(error93){if(error93.code==="ENOENT")return null;throw error93}try{let parsed=JSON.parse(raw);if(typeof parsed==="object"&&parsed!==null&&typeof parsed.ownerToken==="string"&&parsed.ownerToken.length>0&&typeof parsed.pid==="number"&&Number.isInteger(parsed.pid)&&parsed.pid>0&&typeof parsed.createdAtMs==="number"&&Number.isFinite(parsed.createdAtMs))return parsed}catch{}return null}async function removeSessionStateMutationLockIfOwned(lockPath,ownerToken){let lock=await readSessionStateMutationLock(lockPath);if(!lock||lock.ownerToken!==ownerToken)return!1;try{return await fsp5.rm(lockPath),!0}catch(error93){if(error93.code==="ENOENT")return!1;throw error93}}var WORKFLOW_GATE_DIR="pr-workflow-gates",WORKFLOW_STATE_COORDINATION_PREFIX="pr-workflow.state",WORKFLOW_STATE_ENTITY_KEY="state",MAX_TRACKED_SESSIONS2=200,MAX_COMPLETED_CHECKOUT_LOCK_OWNERS=64,WINDOWS_RENAME_MAX_RETRIES3=3,RENAME_RETRY_DELAY_MS3=10,STATE_MUTATION_LOCK_MAX_ATTEMPTS=50,STATE_MUTATION_LOCK_RETRY_DELAY_MS=10,STATE_MUTATION_LOCK_UNINITIALIZED_STALE_MS=30000,CHECKOUT_MUTATION_ACTION_TIMEOUT_MS=300000,MAX_COORDINATION_PAYLOAD_CHARS=1048576,trackedStatesByProjectSession,pendingStateMutationsByProjectSession,pendingCheckoutMutationsByProject,completedCheckoutLockOwners,defaultPersistenceHooks,hooks,codec3,PrWorkflowCheckoutMutationTimeoutError;var init_persistence=__esm(()=>{init_coordination_store();init_core_events();init_utils2();init_canonical_root();trackedStatesByProjectSession=new Map,pendingStateMutationsByProjectSession=new Map,pendingCheckoutMutationsByProject=new Map,completedCheckoutLockOwners=new Map;defaultPersistenceHooks={nowMs:()=>Date.now(),isProcessAlive:defaultIsProcessAlive,openCheckoutLock:(lockPath)=>fsp5.open(lockPath,"wx"),removeCheckoutLock:(lockPath)=>fsp5.rm(lockPath),checkoutMutationActionTimeoutMs:CHECKOUT_MUTATION_ACTION_TIMEOUT_MS,rename:(from,to)=>fsp5.rename(from,to)},hooks=defaultPersistenceHooks;PrWorkflowCheckoutMutationTimeoutError=class PrWorkflowCheckoutMutationTimeoutError extends Error{phase;code="PR_WORKFLOW_CHECKOUT_MUTATION_TIMEOUT";retryable=!1;constructor(phase){super(phase==="queue"?"BLOCKED: timed out waiting for the active PR workflow checkout mutation; the existing owner still holds serialization and must settle before retrying":"BLOCKED: PR workflow checkout mutation exceeded its execution deadline; serialization remains held until the in-flight action actually settles");this.phase=phase;this.name="PrWorkflowCheckoutMutationTimeoutError"}}});import{createHash as createHash53,randomUUID as randomUUID16}from"node:crypto";import*as fsp6 from"node:fs/promises";import*as path112 from"node:path";function bindPrReviewReentryBindingReader(reader){bindingReader=reader}async function currentBinding(directory,sessionID){if(!bindingReader)throw Error("BLOCKED: re-entry authorization binding reader is not bound (the PR workflow gate must bind it at module init)");return bindingReader(directory,sessionID)}function reentryAuthorizationFilePath(directory,sessionID){let relative29=path112.join("pr-review","reentry-authorizations",`${prWorkflowSessionFileStem(sessionID)}.json`);return validateSwarmPath(directory,relative29)}function reentryAuthorizationImportedPath(directory,sessionID){return`${reentryAuthorizationFilePath(directory,sessionID)}.imported`}function reentryAuthorizationProjectionMarkerPath(directory,sessionID){return`${reentryAuthorizationFilePath(directory,sessionID)}.sqlite-projection`}function reentryAuthorizationCoordinationNamespace(sessionID){return`${AUTHORIZATION_COORDINATION_PREFIX}:${prWorkflowSessionFileStem(sessionID)}`}async function readAuthorizationFile(filePath){let raw;try{let stat12=await fsp6.stat(filePath);if(!stat12.isFile()||stat12.size>REENTRY_AUTHORIZATIONS_MAX_BYTES)throw Error("reentry authorization store is not a bounded regular file");raw=await fsp6.readFile(filePath,"utf8")}catch(error93){if(error93.code==="ENOENT")return null;throw error93}let decoded=JSON.parse(raw),parsed=AuthorizationFileSchema.safeParse(decoded);if(!parsed.success)throw Error(`reentry authorization store is invalid: ${parsed.error.issues.map((issue3)=>`${issue3.path.join(".")}: ${issue3.message}`).join("; ")}`);return parsed.data}function parseAuthorizationPayload(payload,sessionID){let decoded=JSON.parse(payload),parsed=AuthorizationFileSchema.safeParse(decoded);if(!parsed.success||parsed.data.sessionId!==sessionID)throw Error(`reentry authorization store is invalid for session "${sessionID}"`);return parsed.data}function readAuthorizationsFromCoordination(directory,sessionID){let row=getCoordinationState(directory,reentryAuthorizationCoordinationNamespace(sessionID),AUTHORIZATION_ENTITY_KEY);if(!row)return null;return{rowRevision:row.revision,rowGeneration:row.generation,store:parseAuthorizationPayload(row.payload,sessionID)}}async function renameWithRetryAsync(tempPath,targetPath){let lastError;for(let attempt=0;attempt<=_internals105.renameRetryDelaysMs.length;attempt++)try{await _internals105.renameImpl(tempPath,targetPath);return}catch(err){lastError=err;let code=err?.code;if(!code||!RETRYABLE_RENAME_CODES4.has(code))throw err;if(attempt<_internals105.renameRetryDelaysMs.length)await new Promise((resolve56)=>setTimeout(resolve56,_internals105.renameRetryDelaysMs[attempt]))}throw lastError}async function writeAuthorizationFile(filePath,file3){let serialized2=serializeAuthorizationFile(file3);if(Buffer.byteLength(serialized2,"utf8")>REENTRY_AUTHORIZATIONS_MAX_BYTES)throw Error("reentry authorization store exceeds its write bound");await fsp6.mkdir(path112.dirname(filePath),{recursive:!0});let tempPath=path112.join(path112.dirname(filePath),`.${path112.basename(filePath)}.${randomUUID16()}.tmp`);try{await fsp6.writeFile(tempPath,serialized2,{encoding:"utf8",flag:"wx"}),await renameWithRetryAsync(tempPath,filePath)}finally{await fsp6.rm(tempPath,{force:!0}).catch(()=>{return})}}async function fileExists2(filePath){try{return await fsp6.stat(filePath),!0}catch(error93){if(error93.code==="ENOENT")return!1;throw error93}}function serializeAuthorizationFile(file3){return`${JSON.stringify(file3,null,2)}
|
|
1275
1275
|
`}async function readTextFileIfExists2(filePath){try{return await fsp6.readFile(filePath,"utf8")}catch(error93){if(error93.code==="ENOENT")return null;throw error93}}async function writeProjectionMarker2(filePath){await fsp6.mkdir(path112.dirname(filePath),{recursive:!0}),await fsp6.writeFile(filePath,`sqlite-projection
|
|
1276
1276
|
`,"utf8")}async function collisionSafeImportedPath2(filePath){let canonical=`${filePath}.imported`;if(!await fileExists2(canonical))return canonical;for(let suffix=1;suffix<=1e4;suffix+=1){let candidate=`${canonical}.${suffix}`;if(!await fileExists2(candidate))return candidate}throw Error(`No collision-safe archive path available for ${path112.basename(filePath)}`)}async function archiveShadowSource2(filePath){if(!await fileExists2(filePath))return;await renameWithRetryAsync(filePath,await collisionSafeImportedPath2(filePath))}async function syncAuthorizationShadowProjection(directory,sessionID,store,options){let filePath=reentryAuthorizationFilePath(directory,sessionID);if(options.archiveLegacy&&await fileExists2(filePath))await archiveShadowSource2(filePath);await writeAuthorizationFile(filePath,store),await writeProjectionMarker2(reentryAuthorizationProjectionMarkerPath(directory,sessionID))}async function repairImportedAuthorizationShadow(directory,sessionID,store){let filePath=reentryAuthorizationFilePath(directory,sessionID),markerPath=reentryAuthorizationProjectionMarkerPath(directory,sessionID),live=await readTextFileIfExists2(filePath);if(live===null){await syncAuthorizationShadowProjection(directory,sessionID,store,{archiveLegacy:!1});return}let canonicalImportedExists=await fileExists2(reentryAuthorizationImportedPath(directory,sessionID)),markerExists=await fileExists2(markerPath),projected=serializeAuthorizationFile(store);if(canonicalImportedExists&&markerExists&&live===projected)return;if(canonicalImportedExists&&live===projected){await writeProjectionMarker2(markerPath);return}await syncAuthorizationShadowProjection(directory,sessionID,store,{archiveLegacy:!0})}async function readAuthorizationsAuthoritative(directory,sessionID){let existing=readAuthorizationsFromCoordination(directory,sessionID);if(existing)return await repairImportedAuthorizationShadow(directory,sessionID,existing.store),existing;let filePath=reentryAuthorizationFilePath(directory,sessionID),raw;try{raw=await fsp6.readFile(filePath,"utf8")}catch(error93){if(error93.code==="ENOENT")return null;throw error93}let legacy=await readAuthorizationFile(filePath);if(!legacy)return null;let outcome=importCoordinationOnce(directory,{source:path112.join("pr-review","reentry-authorizations",`${prWorkflowSessionFileStem(sessionID)}.json`),sourceDigest:createHash53("sha256").update(raw).digest("hex"),rowCount:legacy.authorizations.length,emptyNamespace:reentryAuthorizationCoordinationNamespace(sessionID)},()=>{let result=transitionCoordinationState(directory,{namespace:reentryAuthorizationCoordinationNamespace(sessionID),entityKey:AUTHORIZATION_ENTITY_KEY,expectedRevision:null,generation:1,status:"authorizations",payload:JSON.stringify(legacy)});if(result.outcome!=="applied")throw Error(`reentry authorization import failed: ${result.outcome}`)}),imported=readAuthorizationsFromCoordination(directory,sessionID);if(imported&&outcome==="imported")await syncAuthorizationShadowProjection(directory,sessionID,imported.store,{archiveLegacy:!0});return imported}function persistAuthorizationsAuthoritative(directory,sessionID,store,expectedRevision,generation){let result=transitionCoordinationState(directory,{namespace:reentryAuthorizationCoordinationNamespace(sessionID),entityKey:AUTHORIZATION_ENTITY_KEY,expectedRevision,generation,status:"authorizations",payload:JSON.stringify(store)});if(result.outcome!=="applied"&&result.outcome!=="revision_conflict"&&result.outcome!=="stale_generation")throw Error(`reentry authorization persistence failed: ${result.outcome}`);return{outcome:result.outcome}}function pruneAuthorizations(records,nowMs3){let unexpired=records.filter((record3)=>Date.parse(record3.expiresAt)>nowMs3),newest=(left,right)=>{let leftAt=left.consumedAt??left.createdAt,rightAt=right.consumedAt??right.createdAt;return leftAt===rightAt?0:leftAt>rightAt?-1:1},live=unexpired.filter((record3)=>!record3.consumedAt).sort(newest),consumed=unexpired.filter((record3)=>Boolean(record3.consumedAt)).sort(newest);return[...live,...consumed.slice(0,Math.max(0,MAX_PERSISTED_AUTHORIZATIONS-live.length))]}async function issuePrReviewReentryAuthorization(directory,sessionID,request){let trimmedSession=sessionID.trim();if(!trimmedSession)throw Error("BLOCKED: re-entry authorization requires an active sessionID");return withSessionStateMutation(directory,trimmedSession,async()=>{let binding=await currentBinding(directory,trimmedSession);if(!binding||binding.prHeadSha!==request.prHeadSha.toLowerCase())throw Error(`BLOCKED: re-entry authorization requires an active PR_REVIEW workflow bound to the declared head (active: ${binding?.prHeadSha??"(none)"})`);if(request.runId&&binding.runId&&request.runId!==binding.runId)throw Error("BLOCKED: re-entry authorization run does not match the active PR-review run");for(let attempt=0;attempt<MAX_AUTHORIZATION_WRITE_ATTEMPTS;attempt++){let existing=await readAuthorizationsAuthoritative(directory,trimmedSession),nowMs3=Date.now(),now=new Date(nowMs3).toISOString(),records=pruneAuthorizations(existing?.store.authorizations??[],nowMs3);if(records.filter((record4)=>!record4.consumedAt&&record4.role===request.role&&record4.generation===binding.generation).length>0)throw Error(`BLOCKED: an unconsumed re-entry authorization for role "${request.role}" at generation ${binding.generation} already exists; use it (one immediate Task dispatch) before issuing another`);if(records.filter((record4)=>!record4.consumedAt).length>=MAX_ACTIVE_AUTHORIZATIONS)throw Error(`BLOCKED: re-entry authorization store is at its bound of ${MAX_ACTIVE_AUTHORIZATIONS} active authorizations`);let record3={schemaVersion:1,authorizationId:randomUUID16(),sessionId:trimmedSession,...binding.workflowInstanceId?{workflowInstanceId:binding.workflowInstanceId}:{},...binding.runId?{runId:binding.runId}:{},prHeadSha:binding.prHeadSha,revisionDigest:binding.revisionDigest,role:request.role,generation:binding.generation,createdAt:now,expiresAt:new Date(nowMs3+AUTHORIZATION_TTL_MS).toISOString()},nextStore={schemaVersion:1,sessionId:trimmedSession,authorizations:[record3,...records].slice(0,MAX_PERSISTED_AUTHORIZATIONS)};if(persistAuthorizationsAuthoritative(directory,trimmedSession,nextStore,existing?.rowRevision??null,(existing?.rowGeneration??0)+1).outcome!=="applied")continue;return await syncAuthorizationShadowProjection(directory,trimmedSession,nextStore,{archiveLegacy:!1}),record3}throw Error("BLOCKED: re-entry authorization store changed concurrently; reload the active session state before retrying")})}function authorizationMatchesBinding(record3,binding){return binding.prHeadSha===record3.prHeadSha&&binding.revisionDigest===record3.revisionDigest&&binding.generation===record3.generation&&binding.workflowInstanceId===record3.workflowInstanceId&&binding.runId===record3.runId}async function hasPrReviewReentryAuthorizationAgainstBinding(directory,sessionID,request,binding){let trimmedSession=sessionID.trim();if(!trimmedSession)return!1;try{let existing=await readAuthorizationsAuthoritative(directory,trimmedSession);if(!existing)return!1;return pruneAuthorizations(existing.store.authorizations,Date.now()).some((record3)=>!record3.consumedAt&&record3.role===request.role&&record3.sessionId===trimmedSession&&authorizationMatchesBinding(record3,binding))}catch{return!1}}async function reservePrReviewReentryAuthorizationAgainstBinding(directory,sessionID,request,binding){let trimmedSession=sessionID.trim();if(!trimmedSession)return null;try{for(let attempt=0;attempt<MAX_AUTHORIZATION_WRITE_ATTEMPTS;attempt++){let existing=await readAuthorizationsAuthoritative(directory,trimmedSession);if(!existing)return null;let nowMs3=Date.now(),records=pruneAuthorizations(existing.store.authorizations,nowMs3),sameCallIndex=records.findIndex((record3)=>record3.consumedCallId===request.callID&&record3.role===request.role&&record3.sessionId===trimmedSession&&Date.parse(record3.expiresAt)>nowMs3),index=sameCallIndex>=0?sameCallIndex:records.findIndex((record3)=>!record3.consumedAt&&record3.role===request.role&&record3.sessionId===trimmedSession&&Date.parse(record3.expiresAt)>nowMs3);if(index<0){if(records.length!==existing.store.authorizations.length){let prunedStore={...existing.store,authorizations:records};if(persistAuthorizationsAuthoritative(directory,trimmedSession,prunedStore,existing.rowRevision,existing.rowGeneration+1).outcome!=="applied")continue;await syncAuthorizationShadowProjection(directory,trimmedSession,prunedStore,{archiveLegacy:!1})}return null}let candidate=records[index];if(!authorizationMatchesBinding(candidate,binding))return null;if(candidate.consumedCallId===request.callID)return candidate;let consumed={...candidate,consumedAt:new Date(nowMs3).toISOString(),consumedCallId:request.callID};records[index]=consumed;let nextStore={...existing.store,authorizations:records};if(persistAuthorizationsAuthoritative(directory,trimmedSession,nextStore,existing.rowRevision,existing.rowGeneration+1).outcome!=="applied")continue;return await syncAuthorizationShadowProjection(directory,trimmedSession,nextStore,{archiveLegacy:!1}),consumed}return null}catch{return null}}var AUTHORIZATION_TTL_MS=600000,MAX_ACTIVE_AUTHORIZATIONS=8,MAX_PERSISTED_AUTHORIZATIONS=32,REENTRY_AUTHORIZATIONS_MAX_BYTES=65536,AUTHORIZATION_COORDINATION_PREFIX="pr-review.reentry-authorizations",AUTHORIZATION_ENTITY_KEY="authorizations",MAX_AUTHORIZATION_WRITE_ATTEMPTS=5,bindingReader,PrReviewReentryAuthorizationRecordSchema,AuthorizationFileSchema,RENAME_RETRY_DELAYS_MS4,RETRYABLE_RENAME_CODES4,_internals105;var init_authorization=__esm(()=>{init_zod();init_pr_review_contract();init_coordination_store();init_utils2();init_persistence();PrReviewReentryAuthorizationRecordSchema=exports_external.object({schemaVersion:exports_external.literal(1),authorizationId:exports_external.string().min(1).max(64),sessionId:exports_external.string().min(1).max(256),workflowInstanceId:exports_external.string().min(1).max(128).optional(),runId:PrReviewRunIdSchema.optional(),prHeadSha:exports_external.string().regex(/^[0-9a-f]{6,64}$/i),revisionDigest:exports_external.string().min(1).max(256),role:exports_external.enum(["reviewer","test_engineer"]),generation:exports_external.number().int().nonnegative(),createdAt:exports_external.string().datetime(),expiresAt:exports_external.string().datetime(),consumedAt:exports_external.string().datetime().optional(),consumedCallId:exports_external.string().min(1).max(128).optional()}).strict(),AuthorizationFileSchema=exports_external.object({schemaVersion:exports_external.literal(1),sessionId:exports_external.string().min(1).max(256),authorizations:exports_external.array(PrReviewReentryAuthorizationRecordSchema).max(MAX_PERSISTED_AUTHORIZATIONS)}).strict();RENAME_RETRY_DELAYS_MS4=[10,25,50,100,200],RETRYABLE_RENAME_CODES4=new Set(["EPERM","EBUSY","EACCES","EEXIST"]);_internals105={AUTHORIZATION_TTL_MS,MAX_ACTIVE_AUTHORIZATIONS,reentryAuthorizationFilePath,reentryAuthorizationCoordinationNamespace,pruneAuthorizations,authorizationMatchesBinding,hasPrReviewReentryAuthorizationAgainstBinding,renameImpl:(from,to)=>fsp6.rename(from,to),renameRetryDelaysMs:RENAME_RETRY_DELAYS_MS4,renameWithRetryAsync,writeAuthorizationFile}});function zeroOutputResult(result){let outputRef=result.outputRef?.trim(),text=result.text?.trim()??"";return!outputRef&&text.length===0&&(result.chars??0)===0}function classifyPrReviewCircuitSignal(record3){if(!CIRCUIT_TERMINAL_DELEGATION_STATUSES.has(record3.status))return null;let result=record3.terminalResult?.result??record3.result,providerClass=result?.terminalErrorClass?.category;if(result?.terminalErrorClass&&providerClass){if(record3.status!=="error")return{kind:"ignored",reason:"cancellation"};if(result.terminalErrorClass.kind==="provider")return{kind:"provider_terminal",providerClass,batchId:record3.batchId??"",laneId:record3.laneId??"",terminalAtMs:record3.terminalResult?.recordedAt??record3.completedAt??record3.updatedAt??record3.createdAt??0};if(result.terminalErrorClass.kind==="aborted")return{kind:"ignored",reason:"cancellation"};if(result.terminalErrorClass.kind==="output_length")return{kind:"ignored",reason:"validation"};return{kind:"ignored",reason:"unknown"}}if(result?.workflowLaneFailureClass==="liveness")return{kind:"ignored",reason:"host_abandonment"};if(result?.workflowLaneFailureClass==="operator_cancelled")return{kind:"ignored",reason:"operator_abandonment"};switch(record3.status){case"error":return{kind:"ignored",reason:"unknown"};case"stale":return{kind:"ignored",reason:"stale_observation"};case"cancelled":return{kind:"ignored",reason:"cancellation"};case"completed":return zeroOutputResult(result??{})?{kind:"ignored",reason:"parser"}:null;default:return null}}function scanPrReviewCircuitEvidence(signals,generation,waterlineMs){let byKey=new Map;for(let signal of signals){if(signal.kind!=="provider_terminal")continue;if(signal.terminalAtMs<=0||waterlineMs!==void 0&&signal.terminalAtMs<=waterlineMs)continue;let key2=`${generation}\x00${signal.batchId}\x00${signal.laneId}`,existing=byKey.get(key2);if(!existing||existing.signal.terminalAtMs<signal.terminalAtMs)byKey.set(key2,{signal})}let grouped=new Map,ordered=[...byKey.values()].sort((left,right)=>right.signal.terminalAtMs-left.signal.terminalAtMs||left.signal.providerClass.localeCompare(right.signal.providerClass)||left.signal.batchId.localeCompare(right.signal.batchId)||left.signal.laneId.localeCompare(right.signal.laneId));for(let{signal}of ordered){let list2=grouped.get(signal.providerClass)??[];if(list2.length<PR_REVIEW_CIRCUIT_CONTRIBUTOR_LIMIT)list2.push(signal);grouped.set(signal.providerClass,list2)}return grouped}function adoptPrReviewCircuit(raw,nowMs3){if(raw===void 0||raw===null)return{kind:"absent"};let asV2=PrReviewCircuitRecordV2Schema.safeParse(raw);if(asV2.success)return{kind:"v2",record:asV2.data};let asLegacy=PrReviewCircuitLegacyRecordSchema.safeParse(raw);if(asLegacy.success)return{kind:"migrated",record:freshRecord(nowMs3,!0),diagnostic:{code:"migrated_legacy_circuit",legacySignatureCount:asLegacy.data.contributors.length}};let body=JSON.stringify(raw),hash4="";try{let h=2166136261;for(let index=0;index<body.length;index+=1)h^=body.charCodeAt(index),h=Math.imul(h,16777619);hash4=(h>>>0).toString(16).padStart(8,"0")}catch{hash4="unserializable"}return{kind:"malformed",diagnostic:{code:"malformed_circuit_dropped",bodyHash8:hash4,byteLength:body.length}}}function freshRecord(nowMs3,withWaterline){return{version:2,state:"CLOSED",generation:1,contributors:[],...withWaterline?{evidenceWaterline:new Date(nowMs3).toISOString()}:{}}}function advancePrReviewCircuit(current,input){let record3=current??freshRecord(input.nowMs,!1);if(record3.state==="CLOSED"){let evidence2=scanPrReviewCircuitEvidence(input.laneSignals,record3.generation,record3.evidenceWaterline?Date.parse(record3.evidenceWaterline):void 0),best=null;for(let[providerClass,lanes]of evidence2){if(lanes.length<input.threshold)continue;if(!best||lanes.length>best.lanes.length||lanes.length===best.lanes.length&&providerClass.localeCompare(best.providerClass)<0)best={providerClass,lanes}}if(!best)return{action:"admit",changed:!1};let openedAt=new Date(input.nowMs).toISOString();return{action:"block",reason:"circuit_open",changed:!0,record:{...record3,state:"OPEN",providerClass:best.providerClass,contributors:best.lanes.map((signal2)=>({batchId:signal2.batchId,laneId:signal2.laneId,terminalAt:new Date(signal2.terminalAtMs).toISOString()})),openedAt,openUntil:new Date(input.nowMs+input.openDurationMs).toISOString()}}}if(record3.state==="OPEN"){let openUntilMs=record3.openUntil?Date.parse(record3.openUntil):0;if(input.nowMs<openUntilMs)return{action:"block",reason:"circuit_open",changed:!1};if(!input.admission)return{action:"block",reason:"circuit_open",changed:!1};return{action:"admit_as_probe",changed:!0,record:{...record3,state:"HALF_OPEN",probe:{batchId:input.admission.batchId,laneId:input.admission.laneId,admittedAt:new Date(input.nowMs).toISOString()}}}}let probe2=record3.probe;if(!probe2)return{action:"block",reason:"probe_in_flight",changed:!1};if(input.admission&&input.admission.batchId===probe2.batchId&&!input.probeObservation)return{action:"admit_as_probe",changed:!1};if(!input.probeObservation)return{action:"block",reason:"probe_in_flight",changed:!1};let{terminalStatus,signal}=input.probeObservation;if(signal?.kind==="provider_terminal"){let contributor={batchId:probe2.batchId,laneId:probe2.laneId,terminalAt:new Date(signal.terminalAtMs).toISOString()},contributors=[...record3.contributors.filter((entry)=>!(entry.batchId===contributor.batchId&&entry.laneId===contributor.laneId)),contributor].slice(-PR_REVIEW_CIRCUIT_CONTRIBUTOR_LIMIT);return{action:"block",reason:"circuit_open",changed:!0,record:{...record3,state:"OPEN",contributors,openUntil:new Date(input.nowMs+input.openDurationMs).toISOString(),probe:void 0}}}if(terminalStatus==="completed"&&signal===null)return{action:"admit",changed:!0,record:{version:2,state:"CLOSED",generation:record3.generation+1,contributors:[],evidenceWaterline:new Date(input.probeObservation.terminalAtMs||input.nowMs).toISOString()}};return{action:"block",reason:"circuit_open",changed:!0,record:{...record3,state:"OPEN",openUntil:new Date(input.nowMs+input.openDurationMs).toISOString(),probe:void 0}}}function resolvePrReviewResiliencePolicy(policy){let defaults=DEFAULT_PR_REVIEW_RESILIENCE_CONFIG;return{enabled:policy?.enabled??defaults.enabled,canaryProbeMs:policy?.canary_probe_ms??defaults.canary_probe_ms,statusProbeTimeoutMs:policy?.status_probe_timeout_ms??defaults.status_probe_timeout_ms,correlatedFailureThreshold:policy?.correlated_failure_threshold??defaults.correlated_failure_threshold,maxRetryAttemptsAfterInitial:policy?.max_retry_attempts_after_initial??defaults.max_retry_attempts_after_initial,circuitOpenDurationMs:policy?.circuit_open_duration_ms??defaults.circuit_open_duration_ms}}function resetPrReviewResilienceForReEnable(args2){let previousGeneration=args2.previousCircuit&&"version"in args2.previousCircuit?args2.previousCircuit.generation:1;return{...freshRecord(args2.nowMs,!0),generation:previousGeneration+1}}function rollbackPrReviewCircuitProbe(circuit,nowMs3,openDurationMs){if(circuit.state!=="HALF_OPEN"||!circuit.probe)return circuit;return{...circuit,state:"OPEN",openUntil:new Date(nowMs3+openDurationMs).toISOString(),probe:void 0}}var PR_REVIEW_CIRCUIT_CONTRIBUTOR_LIMIT=768,PrReviewCircuitLegacyRecordSchema,PrReviewCircuitRecordV2Schema,PrReviewCircuitRecordSchema,CIRCUIT_TERMINAL_DELEGATION_STATUSES;var init_circuit=__esm(()=>{init_zod();init_schema();PrReviewCircuitLegacyRecordSchema=exports_external.object({signature:exports_external.string().min(1).max(512),count:exports_external.number().int().min(2).max(PR_REVIEW_CIRCUIT_CONTRIBUTOR_LIMIT),contributors:exports_external.array(exports_external.object({batchId:exports_external.string().min(1),laneId:exports_external.string().min(1)}).strict()).min(2).max(PR_REVIEW_CIRCUIT_CONTRIBUTOR_LIMIT),openedAt:exports_external.string().min(1)}).strict(),PrReviewCircuitRecordV2Schema=exports_external.object({version:exports_external.literal(2),state:exports_external.enum(["CLOSED","OPEN","HALF_OPEN"]),generation:exports_external.number().int().min(1),providerClass:exports_external.string().min(1).max(128).optional(),contributors:exports_external.array(exports_external.object({batchId:exports_external.string().min(1),laneId:exports_external.string().min(1),terminalAt:exports_external.string().min(1)}).strict()).max(PR_REVIEW_CIRCUIT_CONTRIBUTOR_LIMIT),openedAt:exports_external.string().min(1).optional(),openUntil:exports_external.string().min(1).optional(),evidenceWaterline:exports_external.string().min(1).optional(),probe:exports_external.object({batchId:exports_external.string().min(1),laneId:exports_external.string().min(1),admittedAt:exports_external.string().min(1)}).strict().optional()}).strict(),PrReviewCircuitRecordSchema=exports_external.union([PrReviewCircuitLegacyRecordSchema,PrReviewCircuitRecordV2Schema]),CIRCUIT_TERMINAL_DELEGATION_STATUSES=new Set(["completed","error","cancelled","stale"])});import{createHash as createHash54}from"node:crypto";import*as fs72 from"node:fs/promises";import*as path113 from"node:path";function parseCandidateConfidence(value){if(typeof value!=="string")throw Error("Invalid candidate confidence: expected LOW, MEDIUM, or HIGH");let normalized=value.trim().toUpperCase();if(normalized!=="LOW"&&normalized!=="MEDIUM"&&normalized!=="HIGH")throw Error(`Invalid candidate confidence "${value}": expected LOW, MEDIUM, or HIGH`);return{label:normalized,score:CONFIDENCE_SCORE[normalized]}}function tokens(value){return new Set(value.toLocaleLowerCase("en-US").replace(/[^a-z0-9]+/g," ").split(/\s+/).filter((token)=>token.length>=3&&!TOKEN_STOPWORDS.has(token)).map((token)=>TOKEN_ALIASES[token]??token))}function semanticSimilaritySets(a,b){if(a.size===0||b.size===0)return 0;let intersection3=0;for(let token of a)if(b.has(token))intersection3+=1;return intersection3/(a.size+b.size-intersection3)}function normalizedLocation(location){let file3=location.file.replaceAll("\\","/").trim().toLocaleLowerCase("en-US"),line=Number(location.line),lineEnd=location.lineEnd===void 0?line:Number(location.lineEnd);return`${file3}:${line}-${lineEnd}`}function normalizedCategory(category){return category.trim().toLocaleLowerCase("en-US")}function severity(value){if(value==="CRITICAL"||value==="HIGH"||value==="MEDIUM"||value==="LOW"||value==="INFO"||value==="NONE")return value;throw Error(`Invalid finding severity "${String(value)}"`)}function action(value){if(value==="route_to_reviewer"||value==="route_to_critic"||value==="report"||value==="suppress_with_reason"||value==="handoff_to_feedback")return value;return"report"}function status(value){if(value==="UNRESOLVED"||value==="CONFIRMED"||value==="DISPROVED"||value==="NON_ACTIONABLE"||value==="PRE_EXISTING")return value;return"UNRESOLVED"}function provenanceKey(value){return value.identity.trim()}function uniqueProvenance(values){let unique2=new Map;for(let value of values){if(typeof value.identity!=="string"||!value.identity.trim())throw Error("Finding provenance identity must be non-empty");let key2=provenanceKey(value);if(!unique2.has(key2))unique2.set(key2,{...value})}return[...unique2.values()].sort((a,b)=>provenanceKey(a).localeCompare(provenanceKey(b)))}function sameFinding(left,leftTokens,right,rightTokens){if(normalizedCategory(left.category)!==normalizedCategory(right.category))return!1;if(normalizedLocation(left.location)!==normalizedLocation(right.location))return!1;if(left.finding.trim()===right.finding.trim())return!0;return semanticSimilaritySets(leftTokens,rightTokens)>=0.3}function findingId(value){let material=`${normalizedLocation(value.location)}|${normalizedCategory(value.category)}|${[...tokens(value.finding)].sort().join(",")}`,hash4=2166136261;for(let char of material)hash4^=char.charCodeAt(0),hash4=Math.imul(hash4,16777619);return`finding-${(hash4>>>0).toString(16).padStart(8,"0")}`}function lowestConfidence(values){return values.reduce((lowest,value)=>CONFIDENCE_RANK[value]<CONFIDENCE_RANK[lowest]?value:lowest)}function synthesizePrReviewFindings(input){if(input.candidates.length>MAX_FINDING_SYNTHESIS_CANDIDATES)throw Error(`Finding synthesis accepts at most ${MAX_FINDING_SYNTHESIS_CANDIDATES} candidates`);let groups=[],groupTokens=[],diagnostics=[];for(let raw of input.candidates){if(!raw||typeof raw!=="object")throw Error("Finding candidate must be an object");let candidate={...raw,finding:typeof raw.finding==="string"?raw.finding.trim():"",severity:severity(raw.severity),confidence:parseCandidateConfidence(raw.confidence).label,category:typeof raw.category==="string"?raw.category.trim():""};if(!candidate.finding||!candidate.category||!candidate.location?.file)throw Error("Finding candidate requires non-empty finding, category, and location");let candidateTokens=tokens(candidate.finding),existingIndex=-1;for(let index=0;index<groups.length;index++)if(sameFinding(groups[index][0],groupTokens[index],candidate,candidateTokens)){existingIndex=index;break}if(existingIndex>=0)groups[existingIndex].push(candidate);else groups.push([candidate]),groupTokens.push(candidateTokens)}let findings=groups.map((group)=>{let first=group[0],provenance=uniqueProvenance(group.flatMap((candidate)=>Array.isArray(candidate.provenance)?candidate.provenance:[candidate.provenance])),severities=group.map((candidate)=>severity(candidate.severity)),confidenceValues=group.map((candidate)=>parseCandidateConfidence(candidate.confidence).label),finalSeverity=severities.reduce((highest,value)=>SEVERITY_RANK[value]>SEVERITY_RANK[highest]?value:highest),confidence=provenance.length>=2?"HIGH":lowestConfidence(confidenceValues);if(new Set(severities).size>1||new Set(confidenceValues).size>1)diagnostics.push(`conservative disagreement at ${normalizedLocation(first.location)}`);let finalAction=group.map((candidate)=>action(candidate.action)).reduce((mostRestrictive,value)=>ACTION_RANK[value]>ACTION_RANK[mostRestrictive]?value:mostRestrictive),finalStatus=group.map((candidate)=>status(candidate.status)).reduce((mostConservative,value)=>STATUS_RANK[value]>STATUS_RANK[mostConservative]?value:mostConservative),sourceFindingIds=[...new Set(group.flatMap((candidate)=>typeof candidate.sourceFindingId==="string"?[candidate.sourceFindingId]:[]))].sort();return{id:findingId(first),finding:first.finding,severity:finalSeverity,action:finalAction,confidence,confidenceScore:CONFIDENCE_SCORE[confidence],agreementCount:provenance.length,category:first.category,location:{...first.location},provenance,status:finalStatus,sourceFindingIds}});return{policyVersion:FINDING_POLICY_VERSION,findings,diagnostics}}function evaluateFinalFindingPolicy(input){if(input.policyVersion!==FINDING_POLICY_VERSION)throw Error(`Unsupported finding policy version ${input.policyVersion}`);let invalidProvenance=input.coverage.provenance==="invalid",noCoverage=input.coverage.quality==="none"||input.coverage.kind==="base"&&input.coverage.quality==="partial"&&input.findings.length===0,coverageDisposition=invalidProvenance?"INVALID_PROVENANCE":noCoverage?"NO_COVERAGE":input.coverage.quality==="degraded"&&input.coverage.disclosed?"DEGRADED_DISCLOSED":input.coverage.quality==="complete"?"COMPLETE":"PARTIAL";if(input.finalStatus!=="COMPLETE"||invalidProvenance||noCoverage)return{policyVersion:FINDING_POLICY_VERSION,permittedVerdicts:["INCOMPLETE"],coverageDisposition,blockingFindingIds:[]};let blockingFindingIds=[];for(let[index,value]of input.findings.entries()){let currentSeverity=severity(value.severity),currentStatus=String(value.status).toUpperCase(),currentAction=action(value.action);if(!(currentStatus==="UNRESOLVED"||currentStatus==="UNVERIFIED"||currentStatus==="CONFIRMED")||currentSeverity==="NONE")continue;if(currentSeverity==="CRITICAL"||currentSeverity==="HIGH"||currentSeverity==="MEDIUM"&¤tAction!=="report")blockingFindingIds.push(String(value.id??index))}if(blockingFindingIds.length>0)return{policyVersion:FINDING_POLICY_VERSION,permittedVerdicts:["REQUEST_CHANGES","INCOMPLETE"],coverageDisposition,blockingFindingIds};if(coverageDisposition==="DEGRADED_DISCLOSED"||coverageDisposition==="PARTIAL")return{policyVersion:FINDING_POLICY_VERSION,permittedVerdicts:["REQUEST_CHANGES","INCOMPLETE"],coverageDisposition,blockingFindingIds};return{policyVersion:FINDING_POLICY_VERSION,permittedVerdicts:["APPROVE","REQUEST_CHANGES","INCOMPLETE"],coverageDisposition,blockingFindingIds}}function settleCriticFinding(input){if(input.outcome==="NEEDS_MORE_EVIDENCE")return{terminal:!1,status:input.outcome,finalFinding:{...input.finding},handoffFindingIds:[]};if(input.outcome==="DISPROVED")return{terminal:!0,status:input.outcome,finalFinding:{...input.finding,status:"DISPROVED",severity:"NONE",action:"suppress_with_reason"},handoffFindingIds:[]};if(input.outcome==="DOWNGRADED"&&input.finalSeverity===void 0)throw Error("DOWNGRADED critic finding requires an explicit final severity");let finalSeverity=severity(input.finalSeverity??input.finding.severity);if(input.outcome==="UPHELD"&&finalSeverity==="NONE")throw Error("UPHELD critic finding cannot have NONE severity");if(input.outcome==="DOWNGRADED"&&finalSeverity==="CRITICAL")throw Error("DOWNGRADED critic finding cannot remain CRITICAL");let finalAction=action(input.finalAction??input.finding.action);return{terminal:!0,status:input.outcome,finalFinding:{...input.finding,severity:finalSeverity,action:finalAction},handoffFindingIds:finalAction==="handoff_to_feedback"&&input.finding.status!=="DISPROVED"?[input.finding.id]:[]}}function deriveFeedbackHandoffFindingIds(records){return[...new Set(records.filter((record3)=>record3.status==="CONFIRMED"&&record3.next_action==="handoff_to_feedback").map((record3)=>record3.finding_id))].sort()}function assessTerminalReadiness(input){let blockers=[];if(!input.baseReceipt?.valid)blockers.push("BASE_RECEIPT_MISSING");if(input.reviewerReceipts.length===0||input.reviewerReceipts.some((receipt)=>!receipt.valid))blockers.push("REVIEWER_RECEIPT_MISSING");if(!input.criticReceipt?.valid)blockers.push("CRITIC_RECEIPT_MISSING");if(input.criticReceipt?.valid&&input.criticSettlements&&input.criticSettlements.length===0)blockers.push("CRITIC_SETTLEMENT_MISSING");if(input.council.enabled&&!input.council.receipt?.valid)blockers.push("COUNCIL_RECEIPT_MISSING");if(input.coverage.kind==="micro"&&input.coverage.provenance==="invalid")blockers.push("MICRO_PROVENANCE_INVALID");if(input.coverage.quality==="degraded"&&!input.coverage.disclosed)blockers.push("MICRO_DEGRADATION_UNDISCLOSED");if(input.criticSettlements?.some((settlement)=>!settlement.terminal))blockers.push("CRITIC_SETTLEMENT_INCOMPLETE");return{ready:blockers.length===0,blockers,degradedCoverageDisclosed:input.coverage.quality==="degraded"&&input.coverage.provenance==="valid"&&input.coverage.disclosed===!0}}function reviewOutcomeSynthesisDigest(synthesis){return createHash54("sha256").update(JSON.stringify(synthesis),"utf8").digest("hex")}function safeTaskId(taskId){let value=taskId.trim();if(!/^[A-Za-z0-9_.-]{1,128}$/.test(value))throw Error("Review outcome taskId must be a bounded path-safe identifier");return value}async function persistReviewOutcome(input){let sessionId=input.routeReceipt.sessionId.trim(),taskId=safeTaskId(input.routeReceipt.taskId);if(!sessionId)throw Error("Review outcome sessionId must be non-empty");let relativeEvidence=path113.join("pr-review",taskId,"finding-policy.json"),evidencePath=validateSwarmPath(input.projectRoot,relativeEvidence),eventsPath=coreEventsFilePath(input.projectRoot),evidence2={schemaVersion:FINDING_POLICY_VERSION,sessionId,taskId,routeReceipt:input.routeReceipt,synthesis:input.synthesis,synthesisDigest:reviewOutcomeSynthesisDigest(input.synthesis),persistedAt:new Date().toISOString()};await ensurePrWorkflowSafeParentDirectory(input.projectRoot,evidencePath);let alreadyPersisted=!1;try{let existing=JSON.parse(await fs72.readFile(evidencePath,"utf8"));if(!(existing.schemaVersion===FINDING_POLICY_VERSION&&existing.sessionId===sessionId&&existing.taskId===taskId&&JSON.stringify(existing.routeReceipt)===JSON.stringify(input.routeReceipt)&&JSON.stringify(existing.synthesis)===JSON.stringify(input.synthesis)&&existing.synthesisDigest===reviewOutcomeSynthesisDigest(input.synthesis)))throw Error("Review outcome already exists with conflicting route or synthesis data");alreadyPersisted=!0}catch(error93){if(error93.code!=="ENOENT")throw error93}if(!alreadyPersisted)await writeAtomicJson2(input.projectRoot,evidencePath,evidence2);let reviewEvents=readReviewEvents(input.projectRoot,sessionId,taskId),{events}=reviewEvents,auditWindowComplete=reviewEvents.coverage!=="truncated"&&!reviewEvents.truncated,shouldEnsureAuditEvents=!alreadyPersisted||auditWindowComplete;if(shouldEnsureAuditEvents&&!events.some((event)=>event.type==="review.route.receipt"))appendCoreEventSync(input.projectRoot,{type:"review.route.receipt",sessionId,taskId,receiptVersion:input.routeReceipt.version});if(shouldEnsureAuditEvents&&!events.some((event)=>event.type==="review.finding.synthesis"))appendCoreEventSync(input.projectRoot,{type:"review.finding.synthesis",sessionId,taskId,policyVersion:FINDING_POLICY_VERSION,findingCount:Array.isArray(input.synthesis.findings)?input.synthesis.findings.length:0});return{persisted:!0,evidencePath,eventsPath}}async function readReviewOutcome(input){let taskId=safeTaskId(input.taskId),evidencePath=validateSwarmPath(input.projectRoot,path113.join("pr-review",taskId,"finding-policy.json")),evidence2=JSON.parse(await fs72.readFile(evidencePath,"utf8"));if(evidence2.sessionId!==input.sessionId||evidence2.taskId!==taskId||evidence2.schemaVersion!==FINDING_POLICY_VERSION)throw Error("Review outcome evidence identity or schema mismatch");if(!evidence2.synthesis||evidence2.synthesisDigest!==reviewOutcomeSynthesisDigest(evidence2.synthesis))throw Error("Review outcome evidence synthesis integrity mismatch");let reviewEvents=readReviewEvents(input.projectRoot,input.sessionId,taskId),{events}=reviewEvents;if(reviewEvents.coverage!=="truncated"&&!reviewEvents.truncated&&(!events.some((event)=>event.type==="review.route.receipt")||!events.some((event)=>event.type==="review.finding.synthesis")))throw Error("Review outcome evidence audit events are incomplete");return{evidence:evidence2,events,auditCoverage:reviewEvents.coverage}}function readReviewEvents(projectRoot,sessionId,taskId){let read=readCoreEvents(projectRoot);return{events:read.text.split(`
|
|
@@ -1278,7 +1278,7 @@ ${warnings.map((w)=>`Detected signal: ${w}`).join(`
|
|
|
1278
1278
|
`))return{frontmatter:"",body:content};let end=content.indexOf(`
|
|
1279
1279
|
---
|
|
1280
1280
|
`,4);if(end===-1)return{frontmatter:"",body:content};return{frontmatter:content.slice(0,end+5),body:content.slice(end+5)}}function skillContractDigest(body){let normalized=body.replace(/\r\n/g,`
|
|
1281
|
-
`);return createHash57("sha256").update(normalized,"utf8").digest("hex").slice(0,12)}var init_skill_contract_digest=()=>{};import*as fs73 from"node:fs";import*as os15 from"node:os";import*as path115 from"node:path";import{fileURLToPath as fileURLToPath4}from"node:url";function nearestPackageRootFrom(startDir){let current=startDir;for(let depth=0;depth<8;depth+=1){if(fs73.existsSync(path115.join(current,"package.json")))return current;let parent=path115.dirname(current);if(parent===current)return;current=parent}return}function readBodyDigestOrNull(file3){let content;try{content=fs73.readFileSync(file3,"utf8")}catch{return}return skillContractDigest(splitSkillFrontmatter(content).body)}async function ensurePrWorkflowSkillContractsFresh(directory,mode,options={}){let advisories=[],emit2=(message)=>{advisories.push(message),advisoryWarn(message)};try{let slug=PR_WORKFLOW_MODE_SKILL[mode],packageRoot=_internals106.resolvePackageRoot(),canonicalPath=path115.join(packageRoot,".opencode","skills",slug,"SKILL.md"),canonicalDigest=readBodyDigestOrNull(canonicalPath);if(!canonicalDigest)return advisories;let installedPath=path115.join(directory,".swarm","bundled-skills",slug,"SKILL.md"),installedExisted=fs73.existsSync(installedPath),installedBefore=readBodyDigestOrNull(installedPath);if(!installedExisted){let materialized=!1;try{await withTimeout(_internals106.syncBundled(directory,packageRoot,!0),options.budgetMs??SKILL_CONTRACT_ACTIVATION_BUDGET_MS,Error(`skill-contract materialization exceeded its budget for ${slug}`))}catch{}if(materialized=readBodyDigestOrNull(installedPath)===canonicalDigest,!materialized)emit2(`bundled skill '${slug}' is missing and could not be materialized: ${installedPath} was not found; the bounded re-sync from the shipped canonical ${canonicalPath} did not restore it — re-run the /swarm pr-review or /swarm pr-feedback command, or restart the host`)}else if(installedBefore!==canonicalDigest){let healed=!1;try{await withTimeout(_internals106.syncBundled(directory,packageRoot,!0),options.budgetMs??SKILL_CONTRACT_ACTIVATION_BUDGET_MS,Error(`skill-contract re-sync exceeded its budget for ${slug}`))}catch{}healed=readBodyDigestOrNull(installedPath)===canonicalDigest,emit2(`stale skill contract detected at ${mode} activation for '${slug}': the installed copy ${installedPath} (digest ${installedBefore??"<missing>"}) does not match the shipped canonical ${canonicalPath} (digest ${canonicalDigest}) — `+(healed?"refreshed from the canonical source":"still stale after the bounded re-sync; repair by re-running the /swarm pr-review or /swarm pr-feedback command, or delete the stale .swarm/bundled-skills directory"))}let home=_internals106.resolveUserGlobalHome();for(let relativePath of[path115.join(".opencode","skills",slug,"SKILL.md"),path115.join(".claude","skills",slug,"SKILL.md")]){let userPath=path115.join(home,relativePath),userDigest=readBodyDigestOrNull(userPath);if(userDigest===void 0||userDigest===canonicalDigest)continue;emit2(`stale user-global copy of '${slug}' shadows the canonical skill: ${userPath} (digest ${userDigest}) differs from the repository copy ${canonicalPath} (digest ${canonicalDigest}) — delete the stale user-global copy`)}return advisories.slice(0,MAX_ADVISORIES)}catch(error93){let message=`skill-contract verification failed (fail-open): ${error93 instanceof Error?error93.message:String(error93)}`;return advisoryWarn(message),[message]}}var PR_WORKFLOW_MODE_SKILL,SKILL_CONTRACT_ACTIVATION_BUDGET_MS=2000,SKILL_CONTRACT_WAKE_BUDGET_MS=750,MAX_SKILL_CONTRACT_ADVISORIES=8,MAX_ADVISORIES,_internals106;var init_pr_workflow_skill_contract=__esm(()=>{init_bundled_skills();init_skill_contract_digest();init_timeout();init_warning_buffer();PR_WORKFLOW_MODE_SKILL={PR_REVIEW:"swarm-pr-review",PR_FEEDBACK:"swarm-pr-feedback"},MAX_ADVISORIES=MAX_SKILL_CONTRACT_ADVISORIES;_internals106={resolvePackageRoot:()=>{let moduleDir=path115.dirname(fileURLToPath4(import.meta.url));return nearestPackageRootFrom(moduleDir)??path115.resolve(moduleDir,"..","..")},resolveUserGlobalHome:()=>{if(process.platform==="win32"){let userProfile=process.env.USERPROFILE?.trim();if(userProfile)return userProfile}else{let home=process.env.HOME?.trim();if(home)return home}return os15.homedir()},syncBundled:(projectDirectory,packageRoot,quiet)=>syncBundledProjectSkillsIfMissingAsync(projectDirectory,packageRoot,quiet)}});function classifyLaneLivenessCondition(input){if(input.recordStatus==="error")return"completed_failure";let sessionLiveOrUnknown=input.sessionStatusType===void 0||input.sessionStatusType==="busy"||input.sessionStatusType==="retry";if(input.waitBudgetExpired&&sessionLiveOrUnknown)return"observer_deadline";if(input.sessionStatusType==="retry")return"provider_retry_in_flight";if(input.exceededEffectiveHorizon)return"execution_deadline";return"idle_failed_child"}function resolveEffectivePrLaneHorizonMs(watchdog,backgroundPendingTimeoutMs){let watchdogOwnsHorizon=watchdog?.enabled===!0&&(watchdog.timeout_ms??0)>0,horizonMs=watchdogOwnsHorizon?watchdog?.timeout_ms:DEFAULT_STALE_DELEGATION_TIMEOUT_MS;return{horizonMs,source:watchdogOwnsHorizon?"watchdog-timeout":"reachability-floor",conflictDisclosed:backgroundPendingTimeoutMs!==void 0&&backgroundPendingTimeoutMs>0&&backgroundPendingTimeoutMs!==horizonMs}}function laneLivenessWatchdogFeatures(watchdog){let enabled=watchdog?.enabled===!0;return{deadlineActive:enabled&&(watchdog?.timeout_ms??0)>0,stallActive:enabled&&(watchdog?.stall_threshold_ms??0)>0&&(watchdog?.stall_min_steps??0)>0&&(watchdog?.stall_token_threshold??0)>0}}var LANE_LIVENESS_WATCHDOG_DEFAULTS,MAX_LANE_LIVENESS_DISCLOSED_IDS=10,ZERO_LANE_ACTIVITY,defaultReadLaneActivity=()=>ZERO_LANE_ACTIVITY;var init_lane_liveness_watchdog=__esm(()=>{init_pending_delegations();init_schema();LANE_LIVENESS_WATCHDOG_DEFAULTS=LaneLivenessWatchdogConfigSchema.parse({});ZERO_LANE_ACTIVITY={stepsObserved:0,estimatedTokens:0}});var exports_pr_workflow_gate={};__export(exports_pr_workflow_gate,{writePrWorkflowAtomicJson:()=>writePrWorkflowAtomicJson,withPrWorkflowCheckoutPreparationLock:()=>withPrWorkflowCheckoutPreparationLock,withPrWorkflowCheckoutMutationLock:()=>withPrWorkflowCheckoutMutationLock,withInactivePrWorkflowCheckoutRestoreLock:()=>withInactivePrWorkflowCheckoutRestoreLock,validatePrWorkflowTransportRecovery:()=>validatePrWorkflowTransportRecovery,validatePrReviewDiscoveryLaneCompletion:()=>validatePrReviewDiscoveryLaneCompletion2,validatePrFeedbackScopeBinding:()=>validatePrFeedbackScopeBinding,transitionPrReviewToFeedback:()=>transitionPrReviewToFeedback,terminalizePrWorkflowGateForSession:()=>terminalizePrWorkflowGateForSession2,submitPrReviewResult:()=>submitPrReviewResult,settlePresumedStalePrWorkflowLanes:()=>settlePresumedStalePrWorkflowLanes,rollbackPrReviewPartialBaseCoverageAdmission:()=>rollbackPrReviewPartialBaseCoverageAdmission,rollbackPrReviewBaseAdmissionIfUnlaunched:()=>rollbackPrReviewBaseAdmissionIfUnlaunched,resolvePrReviewWriterRunId:()=>resolvePrReviewWriterRunId,resolvePrFeedbackScopeDeclaration:()=>resolvePrFeedbackScopeDeclaration,reserveActivePrReviewReentryAuthorization:()=>reserveActivePrReviewReentryAuthorization,recoverArmedPrWorkflow:()=>recoverArmedPrWorkflow,recordPrReviewValidationBatch:()=>recordPrReviewValidationBatch,recordPrReviewSubmitRejection:()=>recordPrReviewSubmitRejection,recordPrReviewMicroFamilyDispatch:()=>recordPrReviewMicroFamilyDispatch,recordPrFeedbackStageA:()=>recordPrFeedbackStageA,recordPrFeedbackPushAttemptResult:()=>recordPrFeedbackPushAttemptResult,recordPrFeedbackGateBatch:()=>recordPrFeedbackGateBatch,rebindPrFeedbackHead:()=>rebindPrFeedbackHead,readPrWorkflowGateStateForRecovery:()=>readPrWorkflowGateStateForRecovery,readPrWorkflowGateState:()=>readPrWorkflowGateState,readPrReviewTerminalCoverageForReport:()=>readPrReviewTerminalCoverageForReport,readPrReviewReentryBindingContext:()=>readPrReviewReentryBindingContext,readPrReviewFinalFindingPolicyForReport:()=>readPrReviewFinalFindingPolicyForReport,readAuthoritativePrReviewCriticVerdicts:()=>readAuthoritativePrReviewCriticVerdicts,readAuthoritativePrReviewCriticSettlements:()=>readAuthoritativePrReviewCriticSettlements,prWorkflowSessionFileStem:()=>prWorkflowSessionFileStem,prReviewDiscoveryArtifactCoversLane:()=>prReviewDiscoveryArtifactCoversLane,normalizePrWorkflowShellCommand:()=>normalizePrWorkflowShellCommand,normalizePrReviewPartialBaseCoverageRecord:()=>normalizePrReviewPartialBaseCoverageRecord,markPrReviewTriggerEvaluationComplete:()=>markPrReviewTriggerEvaluationComplete,markPrReviewHandoffComplete:()=>markPrReviewHandoffComplete,markPrReviewArtifactBoundary:()=>markPrReviewArtifactBoundary,latestPrReviewSubmitRejectionMessage:()=>latestPrReviewSubmitRejectionMessage,invalidatePrFeedbackPublication:()=>invalidatePrFeedbackPublication,hasActivePrReviewReentryAuthorization:()=>hasActivePrReviewReentryAuthorization,formatPrReviewLaneValidationFailure:()=>formatPrReviewLaneValidationFailure,findDanglingLivePublicationGeneration:()=>findDanglingLivePublicationGeneration,ensurePrWorkflowSafeParentDirectory:()=>ensurePrWorkflowSafeParentDirectory,enforcePrWorkflowToolBefore:()=>enforcePrWorkflowToolBefore,enforcePrWorkflowDispatchLanesAsync:()=>enforcePrWorkflowDispatchLanesAsync,enforcePrReviewBaseDimensions:()=>enforcePrReviewBaseDimensions,enforcePrFeedbackVerificationOwnership:()=>enforcePrFeedbackVerificationOwnership,describePrWorkflowRevisionDigestFailure:()=>describePrWorkflowRevisionDigestFailure,describePrWorkflowPublicationSection:()=>describePrWorkflowPublicationSection,declarePrFeedbackScope:()=>declarePrFeedbackScope,declarePrFeedbackInventory:()=>declarePrFeedbackInventory,consumePrFeedbackScopeDeclaration:()=>consumePrFeedbackScopeDeclaration,computePrReviewDepthTier:()=>computePrReviewDepthTier,completePrWorkflow:()=>completePrWorkflow,collectPrWorkflowPendingLaneLiveness:()=>collectPrWorkflowPendingLaneLiveness,clearPrWorkflowGateState:()=>clearPrWorkflowGateState,cancelPrFeedbackPublication:()=>cancelPrFeedbackPublication,bindPrWorkflowHead:()=>bindPrWorkflowHead,bindPrReviewTriggerLedger:()=>bindPrReviewTriggerLedger,bindPrReviewBase:()=>bindPrReviewBase,assertPrReviewValidationSettled:()=>assertPrReviewValidationSettled,assertPrReviewCleanCheckout:()=>assertPrReviewCleanCheckout,assertPrReviewBaseCoverageSettled:()=>assertPrReviewBaseCoverageSettled2,assertPrReviewArtifactRecordsMatchAuthoritativeVerdicts:()=>assertPrReviewArtifactRecordsMatchAuthoritativeVerdicts,assertPrReviewArtifactBoundary:()=>assertPrReviewArtifactBoundary,assertPrFeedbackVerificationSettled:()=>assertPrFeedbackVerificationSettled,assertPrFeedbackReadyToPublish:()=>assertPrFeedbackReadyToPublish,assertPrFeedbackGatePhaseSettled:()=>assertPrFeedbackGatePhaseSettled,assertCurrentCheckoutHead:()=>assertCurrentCheckoutHead,appendPrWorkflowSkillContractAdvisories:()=>appendPrWorkflowSkillContractAdvisories,allowedPrReviewReportVerdicts:()=>allowedPrReviewReportVerdicts,admitPrReviewPartialBaseCoverage:()=>admitPrReviewPartialBaseCoverage2,activatePrWorkflow:()=>activatePrWorkflow,abortPrWorkflow:()=>abortPrWorkflow,_test_exports:()=>_test_exports2,PrWorkflowCheckoutMutationTimeoutError:()=>PrWorkflowCheckoutMutationTimeoutError,PrReviewResilienceRetryExhaustedError:()=>PrReviewResilienceRetryExhaustedError,PrReviewResilienceCircuitOpenError:()=>PrReviewResilienceCircuitOpenError,PR_WORKFLOW_PROBE_SKIPPED_NO_BUDGET_REASON:()=>PR_WORKFLOW_PROBE_SKIPPED_NO_BUDGET_REASON,PR_REVIEW_TIER_L_CONSOLIDATED_LANE_FLOOR:()=>PR_REVIEW_TIER_L_CONSOLIDATED_LANE_FLOOR,PR_REVIEW_REQUIRED_MICRO_LANE_IDS:()=>PR_REVIEW_REQUIRED_MICRO_LANE_IDS,PR_REVIEW_REPORT_VERDICTS:()=>PR_REVIEW_REPORT_VERDICTS,PR_REVIEW_MICRO_LANE_FLOORS:()=>PR_REVIEW_MICRO_LANE_FLOORS,PR_REVIEW_DEPTH_TIER_THRESHOLDS:()=>PR_REVIEW_DEPTH_TIER_THRESHOLDS,PR_REVIEW_BASE_LANE_FLOORS:()=>PR_REVIEW_BASE_LANE_FLOORS,PR_REVIEW_BASE_DIMENSION_IDS:()=>PR_REVIEW_BASE_DIMENSION_IDS,MAX_SALVAGED_SCHEMA_ERROR_CHARS:()=>MAX_SALVAGED_SCHEMA_ERROR_CHARS,MAX_PR_REVIEW_SUBMIT_REJECTIONS:()=>MAX_PR_REVIEW_SUBMIT_REJECTIONS,MAX_PR_FEEDBACK_INVENTORY_AMENDMENTS:()=>MAX_PR_FEEDBACK_INVENTORY_AMENDMENTS});import{createHash as createHash58,randomUUID as randomUUID17}from"node:crypto";import*as fsp8 from"node:fs/promises";import*as path116 from"node:path";function readPrWorkflowGateStateFromDisk3(directory,sessionID){return readPrWorkflowGateStateFromDisk(directory,sessionID)}function computePrReviewDepthTier(stats2){if(!stats2)return"L";if(stats2.hasSubmoduleChange)return"L";if(stats2.changedLines<=PR_REVIEW_DEPTH_TIER_THRESHOLDS.smallMaxChangedLines&&stats2.changedFiles<=PR_REVIEW_DEPTH_TIER_THRESHOLDS.smallMaxChangedFiles)return"S";if(stats2.changedLines<=PR_REVIEW_DEPTH_TIER_THRESHOLDS.mediumMaxChangedLines&&stats2.changedFiles<=PR_REVIEW_DEPTH_TIER_THRESHOLDS.mediumMaxChangedFiles)return"M";return"L"}function formatCheckoutRecoveryBlock(state2){let evidence2=JSON.stringify({operations:state2.evidence.operations,unmerged_codes:state2.evidence.unmergedCodes,paths:state2.evidence.paths,paths_truncated:state2.evidence.pathsTruncated});return`BLOCKED: PR workflow checkout requires manual Git recovery before activation. code=${state2.code} retryable=false required_action=${state2.requiredAction} evidence=${evidence2}`}function checkoutRecoveryRecord(state2){if(state2.kind!=="recovery-required"&&state2.kind!=="indeterminate")throw Error("PR workflow checkout recovery requires a terminal Git state");return{code:state2.code,retryable:!1,requiredAction:state2.requiredAction,evidence:state2.evidence,detectedAt:isoNow()}}async function activatePrWorkflow(directory,sessionID,mode,options={}){let normalizedSessionID=normalizeSessionID(sessionID),checkoutPreflight=!await readPrWorkflowGateState(directory,normalizedSessionID)&&options.requireCheckoutPreflight?await _test_exports2.classifyPrWorkflowGitStateAsync(directory):null;return withPrWorkflowCheckoutMutationLock(directory,async()=>withSessionStateMutation(directory,normalizedSessionID,async()=>{let existing=await readPrWorkflowGateStateFromDisk3(directory,normalizedSessionID);if(existing?.mode===mode){if(mode==="PR_FEEDBACK"&&options.prUrl){let requestedTarget=canonicalGitHubPrUrl(options.prUrl,options.forge);if(!requestedTarget)throw Error("BLOCKED: PR_FEEDBACK target must be a canonical GitHub PR URL");let existingTarget=existing.prFeedbackTargetUrl?canonicalGitHubPrUrl(existing.prFeedbackTargetUrl,options.forge):null;if(existingTarget&&requestedTarget!==existingTarget)throw Error("BLOCKED: active PR_FEEDBACK targets a different GitHub pull request");if(!existingTarget)existing=await writeStateWhileLocked(directory,{...existing,prFeedbackTargetUrl:options.prUrl,updatedAt:isoNow()})}return options.prHeadSha?bindPrWorkflowHeadWhileLocked(directory,normalizedSessionID,options.prHeadSha):existing}if(existing)throw Error(`BLOCKED: session "${normalizedSessionID}" already has an active ${existing.mode} workflow; complete it before starting ${mode}`);if(options.requireCheckoutPreflight){if(!checkoutPreflight)throw Error("BLOCKED: PR workflow gate state changed during checkout preflight; retry activation against the current project state");let lockedCheckoutPreflight=await _test_exports2.classifyPrWorkflowGitStateAsync(directory,{ignoredPaths:[path116.join(".swarm",workflowCheckoutMutationLockRelativePath()),path116.join(".swarm",workflowGateStateLockRelativePath(normalizedSessionID))]});if(lockedCheckoutPreflight.kind==="recovery-required"||lockedCheckoutPreflight.kind==="indeterminate")throw Error(formatCheckoutRecoveryBlock(lockedCheckoutPreflight))}let initialHead=options.prHeadSha?await assertCurrentCheckoutHead(directory,options.prHeadSha,mode):void 0,skillContractAdvisories=await ensurePrWorkflowSkillContractsFresh(directory,mode),timestamp=isoNow(),feedbackTargetUrl=mode==="PR_FEEDBACK"&&options.prUrl?canonicalGitHubPrUrl(options.prUrl,options.forge)?options.prUrl:null:void 0;if(feedbackTargetUrl===null)throw Error("BLOCKED: PR_FEEDBACK target must be a canonical GitHub PR URL");let nextState={schemaVersion:GATE_SCHEMA_VERSION,revision:0,workflowInstanceId:randomUUID17(),sessionID:normalizedSessionID,mode,activatedAt:timestamp,updatedAt:timestamp,...skillContractAdvisories.length>0?{skillContractAdvisories}:{},...initialHead?{prHeadSha:initialHead}:{},...feedbackTargetUrl?{prFeedbackTargetUrl:feedbackTargetUrl}:{}};return writeStateWhileLocked(directory,nextState)}))}async function appendPrWorkflowSkillContractAdvisories(directory,sessionID,advisories){if(advisories.length===0)return;let normalizedSessionID=normalizeSessionID(sessionID);if(!normalizedSessionID)return;await withSessionStateMutation(directory,normalizedSessionID,async()=>{try{let existing=await readPrWorkflowGateStateFromDisk3(directory,normalizedSessionID);if(!existing)return;let current=existing.skillContractAdvisories??[],merged=[...current];for(let advisory of advisories){if(merged.length>=MAX_SKILL_CONTRACT_ADVISORIES)break;if(!merged.includes(advisory))merged.push(advisory)}if(merged.length===current.length)return;await writeStateWhileLocked(directory,{...existing,skillContractAdvisories:merged,updatedAt:isoNow()})}catch{}})}async function readPrWorkflowGateState(directory,sessionID){let normalizedSessionID=normalizeSessionID(sessionID),state2=await readPrWorkflowGateStateFromDisk3(directory,normalizedSessionID);if(state2)rememberState(directory,state2);else forgetTrackedPrWorkflowState(directory,normalizedSessionID);return state2}function isLivenessTerminalLaneRecord(record3){if(record3.status!=="cancelled"&&record3.status!=="stale"&&record3.status!=="error")return!1;return record3.terminalResult?.result.workflowLaneFailureClass==="liveness"||record3.result?.workflowLaneFailureClass==="liveness"}async function recordPrReviewSubmitRejection(directory,childSessionId,message){try{let child=childSessionId.trim();if(!child)return;let childRead=readDelegationsDetailed(directory);if(childRead.status==="uncertain")return;let record3=childRead.records.find((candidate)=>candidate.subagentSessionId===child&&(candidate.mode==="swarm-pr-review:base"||candidate.mode==="swarm-pr-review:micro")),parentSessionId=record3?.parentSessionId?.trim();if(!parentSessionId)return;let existing=await readPrWorkflowGateStateFromDisk3(directory,parentSessionId);if(!existing||existing.mode!=="PR_REVIEW")return;let laneId=record3?.laneId?.trim(),bounded=redactSecrets(message.replace(PUBLICATION_URL_CREDENTIALS_PATTERN,"$1[REDACTED:url_credentials]@")).slice(0,300);await withSessionStateMutation(directory,parentSessionId,async()=>{let locked=await readPrWorkflowGateStateFromDisk3(directory,parentSessionId);if(!locked||locked.mode!=="PR_REVIEW")return;let prior=locked.prReviewSubmitRejections??[];if(prior.filter((entry)=>entry.childSessionId===child).at(-1)?.message===bounded)return;let journal=[...prior,{childSessionId:child,...laneId?{laneId}:{},at:Date.now(),message:bounded}].slice(-MAX_PR_REVIEW_SUBMIT_REJECTIONS);await writeStateWhileLocked(directory,{...locked,prReviewSubmitRejections:journal,updatedAt:isoNow()})})}catch{}}function latestPrReviewSubmitRejectionMessage(state2,childSessionId){let journal=state2.prReviewSubmitRejections;if(!journal?.length)return;for(let index=journal.length-1;index>=0;index--)if(journal[index]?.childSessionId===childSessionId)return journal[index]?.message;return}async function submitPrReviewResultCore(directory,childSessionId,input){let child=childSessionId.trim(),parsedResult=PrReviewLaneResultEnvelopeSchema.safeParse(input.result);if(!child||!parsedResult.success)return{status:"rejected",reason:"invalid child session or result envelope"};let childRead=readDelegationsDetailed(directory);if(childRead.status==="uncertain")return{status:"rejected",reason:`delegation store unreadable after ${childRead.attempts} attempts; child lookup uncertain (${childRead.reason})`};let preliminary=childRead.records.filter((record4)=>record4.subagentSessionId===child&&record4.correlationId===child&&(record4.mode==="swarm-pr-review:base"||record4.mode==="swarm-pr-review:micro")),repairRecord=null;if(preliminary.length!==1){let repairCandidates=childRead.records.filter((candidate)=>candidate.parentSessionId===child&&(candidate.mode==="swarm-pr-review:base"||candidate.mode==="swarm-pr-review:micro")&&(input.batchId===void 0||input.batchId===candidate.batchId)&&(input.laneId===void 0||input.laneId===candidate.laneId)&&isLivenessTerminalLaneRecord(candidate));if(repairCandidates.length!==1)return{status:"rejected",reason:`expected one exact child delegation, found ${preliminary.length}`};if(repairRecord=repairCandidates[0],parsedResult.data.outcome!=="INCOMPLETE")return{status:"rejected",reason:"architect-parent repair may only record an unresolved-terminal (INCOMPLETE) outcome"}}let parentSessionId=(repairRecord??preliminary[0]).parentSessionId,record3=repairRecord??preliminary[0],childOfRecord=record3.subagentSessionId;if(!record3.batchId||!record3.laneId)return{status:"rejected",reason:"delegation batch/lane provenance is missing"};if(input.batchId!==void 0&&input.batchId!==record3.batchId||input.laneId!==void 0&&input.laneId!==record3.laneId)return{status:"rejected",reason:"delegation batch/lane identity mismatch"};let{batchId,laneId}=record3;return withSessionStateMutation(directory,parentSessionId,async()=>{let state2=await readPrWorkflowGateStateFromDisk3(directory,parentSessionId);if(!state2||state2.mode!=="PR_REVIEW"||!state2.workflowInstanceId||!state2.prHeadSha||!state2.prReviewBaseSha)return{status:"rejected",reason:"no active bound PR_REVIEW workflow"};if((await createPrReviewGateContext2(directory,state2)).revisionDigest!==input.revisionDigest)return{status:"rejected",reason:"stale dispatch revision digest"};let dispatchWorkflowInstanceId=decodePrReviewWorkflowBinding(record3.jobId),dispatchWorkflowRevision=record3.workflowGeneration;if(!dispatchWorkflowInstanceId||dispatchWorkflowRevision===void 0)return{status:"rejected",reason:"delegation workflow binding provenance is missing"};if(dispatchWorkflowInstanceId!==state2.workflowInstanceId)return{status:"rejected",reason:"stale workflow instance binding"};if(repairRecord&&dispatchWorkflowRevision!==state2.revision)return{status:"rejected",reason:`superseded workflow generation binding (delegation generation ${dispatchWorkflowRevision}, active generation ${state2.revision})`};if(record3.mode!=="swarm-pr-review:base"&&record3.mode!=="swarm-pr-review:micro"||!sameProjectRoot(record3.workspace?.directory??"",directory))return{status:"rejected",reason:"delegation mode or workspace mismatch"};let ownedWorkflowLanes=record3.ownedWorkflowLanes?.length?record3.ownedWorkflowLanes:record3.workflowLane?[record3.workflowLane]:[];if(!record3.workflowLane||ownedWorkflowLanes.length===0)return{status:"rejected",reason:"delegation ownership is missing"};let semanticEnvelopeDigest=prReviewLaneResultEnvelopeDigest(parsedResult.data),existingReceiptDigest=record3.result?.prReviewResultReceipt?.semanticEnvelopeDigest,submission=reducePrReviewEvent(state2,{type:"lane_structured_result_submitted",batchId,laneId,generation:state2.revision,semanticEnvelopeDigest,outcome:parsedResult.data.outcome,...existingReceiptDigest!==void 0?{existingReceiptDigest}:{},...repairRecord?{submittedBy:"workflow_parent"}:{}});if(submission.status==="rejected")return{status:"rejected",reason:submission.rejection.code==="duplicate_conflicting_result"?"a different bound receipt is already recorded":`structured result submission rejected: ${submission.rejection.code}`};let published=await publishPrReviewResultReceipt(directory,{parentSessionId,childSessionId:childOfRecord,batchId,laneId,expectedWorkflowInstanceId:state2.workflowInstanceId,expectedWorkflowRevision:dispatchWorkflowRevision,expectedBaseSha:state2.prReviewBaseSha,...repairRecord?{parentRepair:!0}:{},receipt:{schemaVersion:1,mode:record3.mode,workflowInstanceId:dispatchWorkflowInstanceId,workflowRevision:dispatchWorkflowRevision,batchId,laneId,workflowLane:record3.workflowLane,ownedWorkflowLanes,baseSha:state2.prReviewBaseSha,headSha:state2.prHeadSha,dispatchRevisionDigest:input.revisionDigest,childSessionId:childOfRecord,generation:record3.generation??1,semanticEnvelopeDigest,envelope:parsedResult.data,...repairRecord?{submittedBy:"workflow_parent",submittedByParentSessionId:parentSessionId,laneTerminalStateAtSubmission:record3.status}:{}}});if(published.status==="recorded"||published.status==="duplicate")return{status:published.status,receiptDigest:semanticEnvelopeDigest};return{status:"rejected",reason:published.reason}})}async function submitPrReviewResult(directory,childSessionId,input){let outcome=await submitPrReviewResultCore(directory,childSessionId,input);if(outcome.status==="rejected")await recordPrReviewSubmitRejection(directory,childSessionId,outcome.reason);return outcome}async function withPrWorkflowCheckoutPreparationLock(directory,sessionID,action2){let normalizedSessionID=normalizeSessionID(sessionID);return withPrWorkflowCheckoutMutationLock(directory,async()=>withSessionStateMutation(directory,normalizedSessionID,async()=>{let state2=await readPrWorkflowGateStateFromDisk3(directory,normalizedSessionID);if(!state2)throw Error(`BLOCKED: no active PR workflow gate for session "${normalizedSessionID}". The gate is activated by running \`/swarm pr-review <pr-ref>\` (which activates PR_REVIEW) or \`/swarm pr-feedback <pr-ref>\` (which activates PR_FEEDBACK), or by the first dispatch_lanes_async call with mode "swarm-pr-review:*" / "swarm-pr-feedback:*". Run the appropriate command first, then retry checkout preparation.`);if(state2.prHeadSha)throw Error(`BLOCKED: ${state2.mode} checkout preparation is allowed only before the PR head is bound`);return action2(state2,{markRecoveryRequired:async(gitState)=>{let nextState={...state2,updatedAt:isoNow(),checkoutRecovery:checkoutRecoveryRecord(gitState)},persisted=await writeStateWhileLocked(directory,nextState);return Object.assign(state2,persisted),persisted}})}))}async function withInactivePrWorkflowCheckoutRestoreLock(directory,sessionID,action2){let normalizedSessionID=normalizeSessionID(sessionID);return withPrWorkflowCheckoutMutationLock(directory,async()=>withSessionStateMutation(directory,normalizedSessionID,async()=>{if(await readPrWorkflowGateStateFromDisk3(directory,normalizedSessionID))throw Error("BLOCKED: checkout restoration is allowed only after complete_pr_workflow or abort_pr_workflow clears the active gate");return await assertNoActivePrWorkflowGateForCheckoutRestore(directory),action2()}))}async function assertNoActivePrWorkflowGateForCheckoutRestore(directory){let gateDirectory=validateSwarmPath(directory,WORKFLOW_GATE_DIR),handle;try{handle=await fsp8.opendir(gateDirectory)}catch(error93){if(error93.code==="ENOENT")return;throw error93}let entriesRead=0,scanError,closeError;try{for(;;){let entry=await handle.read();if(!entry)break;if(entriesRead+=1,entriesRead>MAX_PR_WORKFLOW_GATE_DIRECTORY_ENTRIES)throw Error("BLOCKED: PR workflow gate inventory exceeds the bounded checkout-restoration scan; clear stale workflow state before retrying");if(!/\.json$/i.test(entry.name))continue;if(!entry.isFile())throw Error("BLOCKED: PR workflow gate inventory contains a non-regular state entry; checkout restoration cannot prove project inactivity");let statePath2=validateSwarmPath(directory,path116.join(WORKFLOW_GATE_DIR,entry.name)),state2=await readPrWorkflowGateStateFileFromDisk(statePath2,entry.name);if(!state2)continue;let expectedName=path116.basename(workflowGateStateRelativePath(state2.sessionID));if(entry.name!==expectedName)throw Error("BLOCKED: PR workflow gate inventory contains an ambiguous state filename; checkout restoration cannot prove project inactivity");let boundedEntryName=entry.name.length<=MAX_PR_WORKFLOW_GATE_ENTRY_NAME_CHARS?entry.name:`${entry.name.slice(0,MAX_PR_WORKFLOW_GATE_ENTRY_NAME_CHARS-1)}…`;throw Error(`BLOCKED: checkout restoration cannot mutate this project while session "${state2.sessionID}" has an active ${state2.mode} workflow (state entry "${boundedEntryName}"). For the owning session, run \`/swarm abort-pr-workflow ${state2.mode} <reason...>\` to recover the stuck gate.`)}}catch(error93){scanError=error93}finally{try{await handle.close()}catch(error93){if(error93.code!=="ERR_DIR_CLOSED")closeError=error93}}if(scanError!==void 0)throw scanError;if(closeError!==void 0)throw closeError}async function clearPrWorkflowGateState(directory,sessionID,expectedRevision,options={}){let normalizedSessionID=normalizeSessionID(sessionID);await withSessionStateMutation(directory,normalizedSessionID,async()=>{if(expectedRevision!==void 0){let current=options.allowSalvagedRead?(await readPrWorkflowGateStateForRecovery(directory,normalizedSessionID))?.state??null:await readPrWorkflowGateStateFromDisk3(directory,normalizedSessionID);if(!current||current.revision!==expectedRevision)throw Error("BLOCKED: PR workflow gate state changed during terminal completion; revalidate the current session state before retrying")}await deleteStateWhileLocked(directory,normalizedSessionID,{expectedStateRevision:expectedRevision,allowSalvagedRead:options.allowSalvagedRead})})}async function terminalizePrWorkflowGateForSession2(directory,sessionID){return terminalizePrWorkflowGateForSession(directory,sessionID)}function isLiveSessionStatusType(type){return LIVE_SESSION_STATUS_TYPES.has(type)}async function probePrWorkflowLaneSessionStatusTypes(directory,records,timeoutMs){let session=_test_exports2.getSessionOps(),statusOp=session?.status;if(!session||typeof statusOp!=="function")return{statuses:new Map,degradedReason:"probe-unavailable"};let timeoutError=Error("PR workflow lane liveness probe exceeded its deadline"),response;try{response=await withTimeout((async()=>statusOp.call(session,{query:{directory}}))(),timeoutMs??_test_exports2.laneLivenessProbeTimeoutMs,timeoutError)}catch(error93){return{statuses:new Map,degradedReason:error93===timeoutError?"probe-timeout":"probe-error"}}try{if(response?.error)return{statuses:new Map,degradedReason:"probe-error"};let data=response?.data;if(data===null||data===void 0)return{statuses:new Map,degradedReason:"probe-no-data"};let statuses=new Map;for(let record3 of records){let subagentSessionId=record3.subagentSessionId;if(!subagentSessionId)continue;let type=data[subagentSessionId]?.type;if(typeof type==="string")statuses.set(subagentSessionId,type)}return{statuses}}catch{return{statuses:new Map,degradedReason:"probe-error"}}}async function probeAlivePrWorkflowLaneSessions(directory,records){let probe2=await probePrWorkflowLaneSessionStatusTypes(directory,records);if(probe2.degradedReason)return{alive:new Set,degradedReason:probe2.degradedReason};let alive=new Set;for(let[sessionId,type]of probe2.statuses)if(isLiveSessionStatusType(type))alive.add(sessionId);return{alive}}async function collectPrWorkflowPendingLaneLiveness(directory,records,options={}){let now=0,pastThreshold=[],degraded=(record3,reason)=>({laneId:record3.laneId??record3.correlationId,pendingMs:Math.max(0,now-record3.updatedAt),hostStatus:"unknown",stalledSuspect:!0,degradedReason:reason});try{now=_test_exports2.nowMs();let threshold=_test_exports2.pendingLaneLivenessThresholdMs;if(pastThreshold=records.filter((record3)=>(record3.status==="pending"||record3.status==="running"||record3.status==="ingesting")&&now-record3.updatedAt>threshold),pastThreshold.length===0)return[];let budgetMs=Math.max(0,Math.min(_test_exports2.laneLivenessProbeTimeoutMs,options.probeBudgetMs??Number.POSITIVE_INFINITY));if(budgetMs<=0)return pastThreshold.map((record3)=>degraded(record3,PR_WORKFLOW_PROBE_SKIPPED_NO_BUDGET_REASON));let probe2=await probePrWorkflowLaneSessionStatusTypes(directory,pastThreshold,budgetMs),advisories=[];for(let record3 of pastThreshold){let pendingMs=now-record3.updatedAt,laneId=record3.laneId??record3.correlationId;if(probe2.degradedReason){advisories.push({laneId,pendingMs,hostStatus:"unknown",stalledSuspect:!0,degradedReason:probe2.degradedReason});continue}let subagentSessionId=record3.subagentSessionId,type=subagentSessionId?probe2.statuses.get(subagentSessionId):void 0;if(type===void 0){advisories.push({laneId,pendingMs,hostStatus:subagentSessionId?"absent":"unknown",stalledSuspect:!0});continue}advisories.push({laneId,pendingMs,hostStatus:type,stalledSuspect:!isLiveSessionStatusType(type)})}return advisories}catch{return pastThreshold.map((record3)=>degraded(record3,"advisory-unavailable"))}}function describePrWorkflowLaneProbe(settlement){let parts=[];if(settlement.probedAliveLaneIds?.length)parts.push(`liveness probe reports still running: ${settlement.probedAliveLaneIds.slice(0,MAX_DISCLOSED_LANE_IDS).join(", ")}`);if(settlement.probeDegradedReason)parts.push(`liveness probe degraded (${settlement.probeDegradedReason})`);return parts.length>0?` (${parts.join("; ")})`:""}function prWorkflowLaneLabel(record3){return record3.laneId??record3.subagentSessionId??"unknown"}function isOpenPrWorkflowLane(record3,sessionID){return record3.parentSessionId===sessionID&&record3.mode?.startsWith("swarm-pr-")===!0&&(record3.status==="pending"||record3.status==="running")}async function abortLaneSessionForWatchdog(record3){let session=_test_exports2.getSessionOps(),abortOp=session?.abort;if(!session||typeof abortOp!=="function"||!record3.subagentSessionId)return!1;try{return await withTimeout(abortOp.call(session,{path:{id:record3.subagentSessionId}}),_test_exports2.laneLivenessProbeTimeoutMs,Error("lane-liveness watchdog abort exceeded its deadline")),!0}catch{return!1}}function lastWatchdogEscalationsByLaneLabel(directory,sessionID){let escalations=new Map,activityObservations=new Map,deadlineLabels=new Set,text="";try{text=readCoreEvents(directory).text}catch{return{escalations,activityObservations,deadlineLabels}}for(let line of text.split(`
|
|
1281
|
+
`);return createHash57("sha256").update(normalized,"utf8").digest("hex").slice(0,12)}var init_skill_contract_digest=()=>{};import*as fs73 from"node:fs";import*as os15 from"node:os";import*as path115 from"node:path";import{fileURLToPath as fileURLToPath4}from"node:url";function nearestPackageRootFrom(startDir){let current=startDir;for(let depth=0;depth<8;depth+=1){if(fs73.existsSync(path115.join(current,"package.json")))return current;let parent=path115.dirname(current);if(parent===current)return;current=parent}return}function readBodyDigestOrNull(file3){let content;try{content=fs73.readFileSync(file3,"utf8")}catch{return}return skillContractDigest(splitSkillFrontmatter(content).body)}async function ensurePrWorkflowSkillContractsFresh(directory,mode,options={}){let advisories=[],emit2=(message)=>{advisories.push(message),advisoryWarn(message)};try{let slug=PR_WORKFLOW_MODE_SKILL[mode],packageRoot=_internals106.resolvePackageRoot(),canonicalPath=path115.join(packageRoot,".opencode","skills",slug,"SKILL.md"),canonicalDigest=readBodyDigestOrNull(canonicalPath);if(!canonicalDigest)return advisories;let installedPath=path115.join(directory,".swarm","bundled-skills",slug,"SKILL.md"),installedExisted=fs73.existsSync(installedPath),installedBefore=readBodyDigestOrNull(installedPath);if(!installedExisted){let materialized=!1;try{await withTimeout(_internals106.syncBundled(directory,packageRoot,!0),options.budgetMs??SKILL_CONTRACT_ACTIVATION_BUDGET_MS,Error(`skill-contract materialization exceeded its budget for ${slug}`))}catch{}if(materialized=readBodyDigestOrNull(installedPath)===canonicalDigest,!materialized)emit2(`bundled skill '${slug}' is missing and could not be materialized: ${installedPath} was not found; the bounded re-sync from the shipped canonical ${canonicalPath} did not restore it — re-run the /swarm pr-review or /swarm pr-feedback command, or restart the host`)}else if(installedBefore!==canonicalDigest){let healed=!1;try{await withTimeout(_internals106.syncBundled(directory,packageRoot,!0),options.budgetMs??SKILL_CONTRACT_ACTIVATION_BUDGET_MS,Error(`skill-contract re-sync exceeded its budget for ${slug}`))}catch{}healed=readBodyDigestOrNull(installedPath)===canonicalDigest,emit2(`stale skill contract detected at ${mode} activation for '${slug}': the installed copy ${installedPath} (digest ${installedBefore??"<missing>"}) does not match the shipped canonical ${canonicalPath} (digest ${canonicalDigest}) — `+(healed?"refreshed from the canonical source":"still stale after the bounded re-sync; repair by re-running the /swarm pr-review or /swarm pr-feedback command, or delete the stale .swarm/bundled-skills directory"))}let home=_internals106.resolveUserGlobalHome();for(let relativePath of[path115.join(".opencode","skills",slug,"SKILL.md"),path115.join(".claude","skills",slug,"SKILL.md")]){let userPath=path115.join(home,relativePath),userDigest=readBodyDigestOrNull(userPath);if(userDigest===void 0||userDigest===canonicalDigest)continue;emit2(`stale user-global copy of '${slug}' shadows the canonical skill: ${userPath} (digest ${userDigest}) differs from the repository copy ${canonicalPath} (digest ${canonicalDigest}) — delete the stale user-global copy`)}return advisories.slice(0,MAX_ADVISORIES)}catch(error93){let message=`skill-contract verification failed (fail-open): ${error93 instanceof Error?error93.message:String(error93)}`;return advisoryWarn(message),[message]}}var PR_WORKFLOW_MODE_SKILL,SKILL_CONTRACT_ACTIVATION_BUDGET_MS=2000,SKILL_CONTRACT_WAKE_BUDGET_MS=750,MAX_SKILL_CONTRACT_ADVISORIES=8,MAX_ADVISORIES,_internals106;var init_pr_workflow_skill_contract=__esm(()=>{init_bundled_skills();init_skill_contract_digest();init_timeout();init_warning_buffer();PR_WORKFLOW_MODE_SKILL={PR_REVIEW:"swarm-pr-review",PR_FEEDBACK:"swarm-pr-feedback"},MAX_ADVISORIES=MAX_SKILL_CONTRACT_ADVISORIES;_internals106={resolvePackageRoot:()=>{let moduleDir=path115.dirname(fileURLToPath4(import.meta.url));return nearestPackageRootFrom(moduleDir)??path115.resolve(moduleDir,"..","..")},resolveUserGlobalHome:()=>{if(process.platform==="win32"){let userProfile=process.env.USERPROFILE?.trim();if(userProfile)return userProfile}else{let home=process.env.HOME?.trim();if(home)return home}return os15.homedir()},syncBundled:(projectDirectory,packageRoot,quiet)=>syncBundledProjectSkillsIfMissingAsync(projectDirectory,packageRoot,quiet)}});function classifyLaneLivenessCondition(input){if(input.recordStatus==="error")return"completed_failure";let sessionLiveOrUnknown=input.sessionStatusType===void 0||input.sessionStatusType==="busy"||input.sessionStatusType==="retry";if(input.waitBudgetExpired&&sessionLiveOrUnknown)return"observer_deadline";if(input.sessionStatusType==="retry")return"provider_retry_in_flight";if(input.exceededEffectiveHorizon)return"execution_deadline";return"idle_failed_child"}function resolveEffectivePrLaneHorizonMs(watchdog,backgroundPendingTimeoutMs){let watchdogOwnsHorizon=watchdog?.enabled===!0&&(watchdog.timeout_ms??0)>0,horizonMs=watchdogOwnsHorizon?watchdog?.timeout_ms:DEFAULT_STALE_DELEGATION_TIMEOUT_MS;return{horizonMs,source:watchdogOwnsHorizon?"watchdog-timeout":"reachability-floor",conflictDisclosed:backgroundPendingTimeoutMs!==void 0&&backgroundPendingTimeoutMs>0&&backgroundPendingTimeoutMs!==horizonMs}}function laneLivenessWatchdogFeatures(watchdog){let enabled=watchdog?.enabled===!0;return{deadlineActive:enabled&&(watchdog?.timeout_ms??0)>0,stallActive:enabled&&(watchdog?.stall_threshold_ms??0)>0&&(watchdog?.stall_min_steps??0)>0&&(watchdog?.stall_token_threshold??0)>0}}var LANE_LIVENESS_WATCHDOG_DEFAULTS,MAX_LANE_LIVENESS_DISCLOSED_IDS=10,ZERO_LANE_ACTIVITY,defaultReadLaneActivity=()=>ZERO_LANE_ACTIVITY;var init_lane_liveness_watchdog=__esm(()=>{init_pending_delegations();init_schema();LANE_LIVENESS_WATCHDOG_DEFAULTS=LaneLivenessWatchdogConfigSchema.parse({});ZERO_LANE_ACTIVITY={stepsObserved:0,estimatedTokens:0}});var exports_pr_workflow_gate={};__export(exports_pr_workflow_gate,{writePrWorkflowAtomicJson:()=>writePrWorkflowAtomicJson,withPrWorkflowCheckoutPreparationLock:()=>withPrWorkflowCheckoutPreparationLock,withPrWorkflowCheckoutMutationLock:()=>withPrWorkflowCheckoutMutationLock,withInactivePrWorkflowCheckoutRestoreLock:()=>withInactivePrWorkflowCheckoutRestoreLock,validatePrWorkflowTransportRecovery:()=>validatePrWorkflowTransportRecovery,validatePrReviewDiscoveryLaneCompletion:()=>validatePrReviewDiscoveryLaneCompletion2,validatePrFeedbackScopeBinding:()=>validatePrFeedbackScopeBinding,validateExactStructuredReceiptCoverage:()=>validateExactStructuredReceiptCoverage2,transitionPrReviewToFeedback:()=>transitionPrReviewToFeedback,terminalizePrWorkflowGateForSession:()=>terminalizePrWorkflowGateForSession2,submitPrReviewResult:()=>submitPrReviewResult,settlePresumedStalePrWorkflowLanes:()=>settlePresumedStalePrWorkflowLanes,rollbackPrReviewPartialBaseCoverageAdmission:()=>rollbackPrReviewPartialBaseCoverageAdmission,rollbackPrReviewBaseAdmissionIfUnlaunched:()=>rollbackPrReviewBaseAdmissionIfUnlaunched,resolvePrReviewWriterRunId:()=>resolvePrReviewWriterRunId,resolvePrFeedbackScopeDeclaration:()=>resolvePrFeedbackScopeDeclaration,reserveActivePrReviewReentryAuthorization:()=>reserveActivePrReviewReentryAuthorization,recoverArmedPrWorkflow:()=>recoverArmedPrWorkflow,recordPrReviewValidationBatch:()=>recordPrReviewValidationBatch,recordPrReviewSubmitRejection:()=>recordPrReviewSubmitRejection,recordPrReviewMicroFamilyDispatch:()=>recordPrReviewMicroFamilyDispatch,recordPrFeedbackStageA:()=>recordPrFeedbackStageA,recordPrFeedbackPushAttemptResult:()=>recordPrFeedbackPushAttemptResult,recordPrFeedbackGateBatch:()=>recordPrFeedbackGateBatch,rebindPrFeedbackHead:()=>rebindPrFeedbackHead,readPrWorkflowGateStateForRecovery:()=>readPrWorkflowGateStateForRecovery,readPrWorkflowGateState:()=>readPrWorkflowGateState,readPrReviewTerminalCoverageForReport:()=>readPrReviewTerminalCoverageForReport,readPrReviewReentryBindingContext:()=>readPrReviewReentryBindingContext,readPrReviewFinalFindingPolicyForReport:()=>readPrReviewFinalFindingPolicyForReport,readAuthoritativePrReviewCriticVerdicts:()=>readAuthoritativePrReviewCriticVerdicts,readAuthoritativePrReviewCriticSettlements:()=>readAuthoritativePrReviewCriticSettlements,prWorkflowSessionFileStem:()=>prWorkflowSessionFileStem,prReviewDiscoveryArtifactCoversLane:()=>prReviewDiscoveryArtifactCoversLane,normalizePrWorkflowShellCommand:()=>normalizePrWorkflowShellCommand,normalizePrReviewPartialBaseCoverageRecord:()=>normalizePrReviewPartialBaseCoverageRecord,markPrReviewTriggerEvaluationComplete:()=>markPrReviewTriggerEvaluationComplete,markPrReviewHandoffComplete:()=>markPrReviewHandoffComplete,markPrReviewArtifactBoundary:()=>markPrReviewArtifactBoundary,latestPrReviewSubmitRejectionMessage:()=>latestPrReviewSubmitRejectionMessage,invalidatePrFeedbackPublication:()=>invalidatePrFeedbackPublication,hasActivePrReviewReentryAuthorization:()=>hasActivePrReviewReentryAuthorization,formatPrReviewLaneValidationFailure:()=>formatPrReviewLaneValidationFailure,findDanglingLivePublicationGeneration:()=>findDanglingLivePublicationGeneration,ensurePrWorkflowSafeParentDirectory:()=>ensurePrWorkflowSafeParentDirectory,enforcePrWorkflowToolBefore:()=>enforcePrWorkflowToolBefore,enforcePrWorkflowDispatchLanesAsync:()=>enforcePrWorkflowDispatchLanesAsync,enforcePrReviewBaseDimensions:()=>enforcePrReviewBaseDimensions,enforcePrFeedbackVerificationOwnership:()=>enforcePrFeedbackVerificationOwnership,describePrWorkflowRevisionDigestFailure:()=>describePrWorkflowRevisionDigestFailure,describePrWorkflowPublicationSection:()=>describePrWorkflowPublicationSection,declarePrFeedbackScope:()=>declarePrFeedbackScope,declarePrFeedbackInventory:()=>declarePrFeedbackInventory,consumePrFeedbackScopeDeclaration:()=>consumePrFeedbackScopeDeclaration,computePrReviewDepthTier:()=>computePrReviewDepthTier,completePrWorkflow:()=>completePrWorkflow,collectPrWorkflowPendingLaneLiveness:()=>collectPrWorkflowPendingLaneLiveness,clearPrWorkflowGateState:()=>clearPrWorkflowGateState,cancelPrFeedbackPublication:()=>cancelPrFeedbackPublication,bindPrWorkflowHead:()=>bindPrWorkflowHead,bindPrReviewTriggerLedger:()=>bindPrReviewTriggerLedger,bindPrReviewBase:()=>bindPrReviewBase,assertPrReviewValidationSettled:()=>assertPrReviewValidationSettled,assertPrReviewCleanCheckout:()=>assertPrReviewCleanCheckout,assertPrReviewBaseCoverageSettled:()=>assertPrReviewBaseCoverageSettled2,assertPrReviewArtifactRecordsMatchAuthoritativeVerdicts:()=>assertPrReviewArtifactRecordsMatchAuthoritativeVerdicts,assertPrReviewArtifactBoundary:()=>assertPrReviewArtifactBoundary,assertPrFeedbackVerificationSettled:()=>assertPrFeedbackVerificationSettled,assertPrFeedbackReadyToPublish:()=>assertPrFeedbackReadyToPublish,assertPrFeedbackGatePhaseSettled:()=>assertPrFeedbackGatePhaseSettled,assertCurrentCheckoutHead:()=>assertCurrentCheckoutHead,appendPrWorkflowSkillContractAdvisories:()=>appendPrWorkflowSkillContractAdvisories,allowedPrReviewReportVerdicts:()=>allowedPrReviewReportVerdicts,admitPrReviewPartialBaseCoverage:()=>admitPrReviewPartialBaseCoverage2,activatePrWorkflow:()=>activatePrWorkflow,abortPrWorkflow:()=>abortPrWorkflow,_test_exports:()=>_test_exports2,PrWorkflowCheckoutMutationTimeoutError:()=>PrWorkflowCheckoutMutationTimeoutError,PrReviewResilienceRetryExhaustedError:()=>PrReviewResilienceRetryExhaustedError,PrReviewResilienceCircuitOpenError:()=>PrReviewResilienceCircuitOpenError,PR_WORKFLOW_PROBE_SKIPPED_NO_BUDGET_REASON:()=>PR_WORKFLOW_PROBE_SKIPPED_NO_BUDGET_REASON,PR_REVIEW_TIER_L_CONSOLIDATED_LANE_FLOOR:()=>PR_REVIEW_TIER_L_CONSOLIDATED_LANE_FLOOR,PR_REVIEW_REQUIRED_MICRO_LANE_IDS:()=>PR_REVIEW_REQUIRED_MICRO_LANE_IDS,PR_REVIEW_REPORT_VERDICTS:()=>PR_REVIEW_REPORT_VERDICTS,PR_REVIEW_MICRO_LANE_FLOORS:()=>PR_REVIEW_MICRO_LANE_FLOORS,PR_REVIEW_DEPTH_TIER_THRESHOLDS:()=>PR_REVIEW_DEPTH_TIER_THRESHOLDS,PR_REVIEW_BASE_LANE_FLOORS:()=>PR_REVIEW_BASE_LANE_FLOORS,PR_REVIEW_BASE_DIMENSION_IDS:()=>PR_REVIEW_BASE_DIMENSION_IDS,MAX_SALVAGED_SCHEMA_ERROR_CHARS:()=>MAX_SALVAGED_SCHEMA_ERROR_CHARS,MAX_PR_REVIEW_SUBMIT_REJECTIONS:()=>MAX_PR_REVIEW_SUBMIT_REJECTIONS,MAX_PR_FEEDBACK_INVENTORY_AMENDMENTS:()=>MAX_PR_FEEDBACK_INVENTORY_AMENDMENTS});import{createHash as createHash58,randomUUID as randomUUID17}from"node:crypto";import*as fsp8 from"node:fs/promises";import*as path116 from"node:path";function readPrWorkflowGateStateFromDisk3(directory,sessionID){return readPrWorkflowGateStateFromDisk(directory,sessionID)}function computePrReviewDepthTier(stats2){if(!stats2)return"L";if(stats2.hasSubmoduleChange)return"L";if(stats2.changedLines<=PR_REVIEW_DEPTH_TIER_THRESHOLDS.smallMaxChangedLines&&stats2.changedFiles<=PR_REVIEW_DEPTH_TIER_THRESHOLDS.smallMaxChangedFiles)return"S";if(stats2.changedLines<=PR_REVIEW_DEPTH_TIER_THRESHOLDS.mediumMaxChangedLines&&stats2.changedFiles<=PR_REVIEW_DEPTH_TIER_THRESHOLDS.mediumMaxChangedFiles)return"M";return"L"}function formatCheckoutRecoveryBlock(state2){let evidence2=JSON.stringify({operations:state2.evidence.operations,unmerged_codes:state2.evidence.unmergedCodes,paths:state2.evidence.paths,paths_truncated:state2.evidence.pathsTruncated});return`BLOCKED: PR workflow checkout requires manual Git recovery before activation. code=${state2.code} retryable=false required_action=${state2.requiredAction} evidence=${evidence2}`}function checkoutRecoveryRecord(state2){if(state2.kind!=="recovery-required"&&state2.kind!=="indeterminate")throw Error("PR workflow checkout recovery requires a terminal Git state");return{code:state2.code,retryable:!1,requiredAction:state2.requiredAction,evidence:state2.evidence,detectedAt:isoNow()}}async function activatePrWorkflow(directory,sessionID,mode,options={}){let normalizedSessionID=normalizeSessionID(sessionID),checkoutPreflight=!await readPrWorkflowGateState(directory,normalizedSessionID)&&options.requireCheckoutPreflight?await _test_exports2.classifyPrWorkflowGitStateAsync(directory):null;return withPrWorkflowCheckoutMutationLock(directory,async()=>withSessionStateMutation(directory,normalizedSessionID,async()=>{let existing=await readPrWorkflowGateStateFromDisk3(directory,normalizedSessionID);if(existing?.mode===mode){if(mode==="PR_FEEDBACK"&&options.prUrl){let requestedTarget=canonicalGitHubPrUrl(options.prUrl,options.forge);if(!requestedTarget)throw Error("BLOCKED: PR_FEEDBACK target must be a canonical GitHub PR URL");let existingTarget=existing.prFeedbackTargetUrl?canonicalGitHubPrUrl(existing.prFeedbackTargetUrl,options.forge):null;if(existingTarget&&requestedTarget!==existingTarget)throw Error("BLOCKED: active PR_FEEDBACK targets a different GitHub pull request");if(!existingTarget)existing=await writeStateWhileLocked(directory,{...existing,prFeedbackTargetUrl:options.prUrl,updatedAt:isoNow()})}return options.prHeadSha?bindPrWorkflowHeadWhileLocked(directory,normalizedSessionID,options.prHeadSha):existing}if(existing)throw Error(`BLOCKED: session "${normalizedSessionID}" already has an active ${existing.mode} workflow; complete it before starting ${mode}`);if(options.requireCheckoutPreflight){if(!checkoutPreflight)throw Error("BLOCKED: PR workflow gate state changed during checkout preflight; retry activation against the current project state");let lockedCheckoutPreflight=await _test_exports2.classifyPrWorkflowGitStateAsync(directory,{ignoredPaths:[path116.join(".swarm",workflowCheckoutMutationLockRelativePath()),path116.join(".swarm",workflowGateStateLockRelativePath(normalizedSessionID))]});if(lockedCheckoutPreflight.kind==="recovery-required"||lockedCheckoutPreflight.kind==="indeterminate")throw Error(formatCheckoutRecoveryBlock(lockedCheckoutPreflight))}let initialHead=options.prHeadSha?await assertCurrentCheckoutHead(directory,options.prHeadSha,mode):void 0,skillContractAdvisories=await ensurePrWorkflowSkillContractsFresh(directory,mode),timestamp=isoNow(),feedbackTargetUrl=mode==="PR_FEEDBACK"&&options.prUrl?canonicalGitHubPrUrl(options.prUrl,options.forge)?options.prUrl:null:void 0;if(feedbackTargetUrl===null)throw Error("BLOCKED: PR_FEEDBACK target must be a canonical GitHub PR URL");let nextState={schemaVersion:GATE_SCHEMA_VERSION,revision:0,workflowInstanceId:randomUUID17(),sessionID:normalizedSessionID,mode,activatedAt:timestamp,updatedAt:timestamp,...skillContractAdvisories.length>0?{skillContractAdvisories}:{},...initialHead?{prHeadSha:initialHead}:{},...feedbackTargetUrl?{prFeedbackTargetUrl:feedbackTargetUrl}:{}};return writeStateWhileLocked(directory,nextState)}))}async function appendPrWorkflowSkillContractAdvisories(directory,sessionID,advisories){if(advisories.length===0)return;let normalizedSessionID=normalizeSessionID(sessionID);if(!normalizedSessionID)return;await withSessionStateMutation(directory,normalizedSessionID,async()=>{try{let existing=await readPrWorkflowGateStateFromDisk3(directory,normalizedSessionID);if(!existing)return;let current=existing.skillContractAdvisories??[],merged=[...current];for(let advisory of advisories){if(merged.length>=MAX_SKILL_CONTRACT_ADVISORIES)break;if(!merged.includes(advisory))merged.push(advisory)}if(merged.length===current.length)return;await writeStateWhileLocked(directory,{...existing,skillContractAdvisories:merged,updatedAt:isoNow()})}catch{}})}async function readPrWorkflowGateState(directory,sessionID){let normalizedSessionID=normalizeSessionID(sessionID),state2=await readPrWorkflowGateStateFromDisk3(directory,normalizedSessionID);if(state2)rememberState(directory,state2);else forgetTrackedPrWorkflowState(directory,normalizedSessionID);return state2}function isLivenessTerminalLaneRecord(record3){if(record3.status!=="cancelled"&&record3.status!=="stale"&&record3.status!=="error")return!1;return record3.terminalResult?.result.workflowLaneFailureClass==="liveness"||record3.result?.workflowLaneFailureClass==="liveness"}async function recordPrReviewSubmitRejection(directory,childSessionId,message){try{let child=childSessionId.trim();if(!child)return;let childRead=readDelegationsDetailed(directory);if(childRead.status==="uncertain")return;let record3=childRead.records.find((candidate)=>candidate.subagentSessionId===child&&(candidate.mode==="swarm-pr-review:base"||candidate.mode==="swarm-pr-review:micro")),parentSessionId=record3?.parentSessionId?.trim();if(!parentSessionId)return;let existing=await readPrWorkflowGateStateFromDisk3(directory,parentSessionId);if(!existing||existing.mode!=="PR_REVIEW")return;let laneId=record3?.laneId?.trim(),bounded=redactSecrets(message.replace(PUBLICATION_URL_CREDENTIALS_PATTERN,"$1[REDACTED:url_credentials]@")).slice(0,300);await withSessionStateMutation(directory,parentSessionId,async()=>{let locked=await readPrWorkflowGateStateFromDisk3(directory,parentSessionId);if(!locked||locked.mode!=="PR_REVIEW")return;let prior=locked.prReviewSubmitRejections??[];if(prior.filter((entry)=>entry.childSessionId===child).at(-1)?.message===bounded)return;let journal=[...prior,{childSessionId:child,...laneId?{laneId}:{},at:Date.now(),message:bounded}].slice(-MAX_PR_REVIEW_SUBMIT_REJECTIONS);await writeStateWhileLocked(directory,{...locked,prReviewSubmitRejections:journal,updatedAt:isoNow()})})}catch{}}function latestPrReviewSubmitRejectionMessage(state2,childSessionId){let journal=state2.prReviewSubmitRejections;if(!journal?.length)return;for(let index=journal.length-1;index>=0;index--)if(journal[index]?.childSessionId===childSessionId)return journal[index]?.message;return}async function submitPrReviewResultCore(directory,childSessionId,input){let child=childSessionId.trim(),parsedResult=PrReviewLaneResultEnvelopeSchema.safeParse(input.result);if(!child||!parsedResult.success)return{status:"rejected",reason:"invalid child session or result envelope"};let childRead=readDelegationsDetailed(directory);if(childRead.status==="uncertain")return{status:"rejected",reason:`delegation store unreadable after ${childRead.attempts} attempts; child lookup uncertain (${childRead.reason})`};let preliminary=childRead.records.filter((record4)=>record4.subagentSessionId===child&&record4.correlationId===child&&(record4.mode==="swarm-pr-review:base"||record4.mode==="swarm-pr-review:micro")),repairRecord=null;if(preliminary.length!==1){let repairCandidates=childRead.records.filter((candidate)=>candidate.parentSessionId===child&&(candidate.mode==="swarm-pr-review:base"||candidate.mode==="swarm-pr-review:micro")&&(input.batchId===void 0||input.batchId===candidate.batchId)&&(input.laneId===void 0||input.laneId===candidate.laneId)&&isLivenessTerminalLaneRecord(candidate));if(repairCandidates.length!==1)return{status:"rejected",reason:`expected one exact child delegation, found ${preliminary.length}`};if(repairRecord=repairCandidates[0],parsedResult.data.outcome!=="INCOMPLETE")return{status:"rejected",reason:"architect-parent repair may only record an unresolved-terminal (INCOMPLETE) outcome"}}let parentSessionId=(repairRecord??preliminary[0]).parentSessionId,record3=repairRecord??preliminary[0],childOfRecord=record3.subagentSessionId;if(!record3.batchId||!record3.laneId)return{status:"rejected",reason:"delegation batch/lane provenance is missing"};if(input.batchId!==void 0&&input.batchId!==record3.batchId||input.laneId!==void 0&&input.laneId!==record3.laneId)return{status:"rejected",reason:"delegation batch/lane identity mismatch"};let{batchId,laneId}=record3;return withSessionStateMutation(directory,parentSessionId,async()=>{let state2=await readPrWorkflowGateStateFromDisk3(directory,parentSessionId);if(!state2||state2.mode!=="PR_REVIEW"||!state2.workflowInstanceId||!state2.prHeadSha||!state2.prReviewBaseSha)return{status:"rejected",reason:"no active bound PR_REVIEW workflow"};if((await createPrReviewGateContext2(directory,state2)).revisionDigest!==input.revisionDigest)return{status:"rejected",reason:"stale dispatch revision digest"};let dispatchWorkflowInstanceId=decodePrReviewWorkflowBinding(record3.jobId),dispatchWorkflowRevision=record3.workflowGeneration;if(!dispatchWorkflowInstanceId||dispatchWorkflowRevision===void 0)return{status:"rejected",reason:"delegation workflow binding provenance is missing"};if(dispatchWorkflowInstanceId!==state2.workflowInstanceId)return{status:"rejected",reason:"stale workflow instance binding"};if(repairRecord&&dispatchWorkflowRevision!==state2.revision)return{status:"rejected",reason:`superseded workflow generation binding (delegation generation ${dispatchWorkflowRevision}, active generation ${state2.revision})`};if(record3.mode!=="swarm-pr-review:base"&&record3.mode!=="swarm-pr-review:micro"||!sameProjectRoot(record3.workspace?.directory??"",directory))return{status:"rejected",reason:"delegation mode or workspace mismatch"};let ownedWorkflowLanes=record3.ownedWorkflowLanes?.length?record3.ownedWorkflowLanes:record3.workflowLane?[record3.workflowLane]:[];if(!record3.workflowLane||ownedWorkflowLanes.length===0)return{status:"rejected",reason:"delegation ownership is missing"};let semanticEnvelopeDigest=prReviewLaneResultEnvelopeDigest(parsedResult.data),existingReceiptDigest=record3.result?.prReviewResultReceipt?.semanticEnvelopeDigest,submission=reducePrReviewEvent(state2,{type:"lane_structured_result_submitted",batchId,laneId,generation:state2.revision,semanticEnvelopeDigest,outcome:parsedResult.data.outcome,...existingReceiptDigest!==void 0?{existingReceiptDigest}:{},...repairRecord?{submittedBy:"workflow_parent"}:{}});if(submission.status==="rejected")return{status:"rejected",reason:submission.rejection.code==="duplicate_conflicting_result"?"a different bound receipt is already recorded":`structured result submission rejected: ${submission.rejection.code}`};let published=await publishPrReviewResultReceipt(directory,{parentSessionId,childSessionId:childOfRecord,batchId,laneId,expectedWorkflowInstanceId:state2.workflowInstanceId,expectedWorkflowRevision:dispatchWorkflowRevision,expectedBaseSha:state2.prReviewBaseSha,...repairRecord?{parentRepair:!0}:{},receipt:{schemaVersion:1,mode:record3.mode,workflowInstanceId:dispatchWorkflowInstanceId,workflowRevision:dispatchWorkflowRevision,batchId,laneId,workflowLane:record3.workflowLane,ownedWorkflowLanes,baseSha:state2.prReviewBaseSha,headSha:state2.prHeadSha,dispatchRevisionDigest:input.revisionDigest,childSessionId:childOfRecord,generation:record3.generation??1,semanticEnvelopeDigest,envelope:parsedResult.data,...repairRecord?{submittedBy:"workflow_parent",submittedByParentSessionId:parentSessionId,laneTerminalStateAtSubmission:record3.status}:{}}});if(published.status==="recorded"||published.status==="duplicate")return{status:published.status,receiptDigest:semanticEnvelopeDigest};return{status:"rejected",reason:published.reason}})}async function submitPrReviewResult(directory,childSessionId,input){let outcome=await submitPrReviewResultCore(directory,childSessionId,input);if(outcome.status==="rejected")await recordPrReviewSubmitRejection(directory,childSessionId,outcome.reason);return outcome}async function withPrWorkflowCheckoutPreparationLock(directory,sessionID,action2){let normalizedSessionID=normalizeSessionID(sessionID);return withPrWorkflowCheckoutMutationLock(directory,async()=>withSessionStateMutation(directory,normalizedSessionID,async()=>{let state2=await readPrWorkflowGateStateFromDisk3(directory,normalizedSessionID);if(!state2)throw Error(`BLOCKED: no active PR workflow gate for session "${normalizedSessionID}". The gate is activated by running \`/swarm pr-review <pr-ref>\` (which activates PR_REVIEW) or \`/swarm pr-feedback <pr-ref>\` (which activates PR_FEEDBACK), or by the first dispatch_lanes_async call with mode "swarm-pr-review:*" / "swarm-pr-feedback:*". Run the appropriate command first, then retry checkout preparation.`);if(state2.prHeadSha)throw Error(`BLOCKED: ${state2.mode} checkout preparation is allowed only before the PR head is bound`);return action2(state2,{markRecoveryRequired:async(gitState)=>{let nextState={...state2,updatedAt:isoNow(),checkoutRecovery:checkoutRecoveryRecord(gitState)},persisted=await writeStateWhileLocked(directory,nextState);return Object.assign(state2,persisted),persisted}})}))}async function withInactivePrWorkflowCheckoutRestoreLock(directory,sessionID,action2){let normalizedSessionID=normalizeSessionID(sessionID);return withPrWorkflowCheckoutMutationLock(directory,async()=>withSessionStateMutation(directory,normalizedSessionID,async()=>{if(await readPrWorkflowGateStateFromDisk3(directory,normalizedSessionID))throw Error("BLOCKED: checkout restoration is allowed only after complete_pr_workflow or abort_pr_workflow clears the active gate");return await assertNoActivePrWorkflowGateForCheckoutRestore(directory),action2()}))}async function assertNoActivePrWorkflowGateForCheckoutRestore(directory){let gateDirectory=validateSwarmPath(directory,WORKFLOW_GATE_DIR),handle;try{handle=await fsp8.opendir(gateDirectory)}catch(error93){if(error93.code==="ENOENT")return;throw error93}let entriesRead=0,scanError,closeError;try{for(;;){let entry=await handle.read();if(!entry)break;if(entriesRead+=1,entriesRead>MAX_PR_WORKFLOW_GATE_DIRECTORY_ENTRIES)throw Error("BLOCKED: PR workflow gate inventory exceeds the bounded checkout-restoration scan; clear stale workflow state before retrying");if(!/\.json$/i.test(entry.name))continue;if(!entry.isFile())throw Error("BLOCKED: PR workflow gate inventory contains a non-regular state entry; checkout restoration cannot prove project inactivity");let statePath2=validateSwarmPath(directory,path116.join(WORKFLOW_GATE_DIR,entry.name)),state2=await readPrWorkflowGateStateFileFromDisk(statePath2,entry.name);if(!state2)continue;let expectedName=path116.basename(workflowGateStateRelativePath(state2.sessionID));if(entry.name!==expectedName)throw Error("BLOCKED: PR workflow gate inventory contains an ambiguous state filename; checkout restoration cannot prove project inactivity");let boundedEntryName=entry.name.length<=MAX_PR_WORKFLOW_GATE_ENTRY_NAME_CHARS?entry.name:`${entry.name.slice(0,MAX_PR_WORKFLOW_GATE_ENTRY_NAME_CHARS-1)}…`;throw Error(`BLOCKED: checkout restoration cannot mutate this project while session "${state2.sessionID}" has an active ${state2.mode} workflow (state entry "${boundedEntryName}"). For the owning session, run \`/swarm abort-pr-workflow ${state2.mode} <reason...>\` to recover the stuck gate.`)}}catch(error93){scanError=error93}finally{try{await handle.close()}catch(error93){if(error93.code!=="ERR_DIR_CLOSED")closeError=error93}}if(scanError!==void 0)throw scanError;if(closeError!==void 0)throw closeError}async function clearPrWorkflowGateState(directory,sessionID,expectedRevision,options={}){let normalizedSessionID=normalizeSessionID(sessionID);await withSessionStateMutation(directory,normalizedSessionID,async()=>{if(expectedRevision!==void 0){let current=options.allowSalvagedRead?(await readPrWorkflowGateStateForRecovery(directory,normalizedSessionID))?.state??null:await readPrWorkflowGateStateFromDisk3(directory,normalizedSessionID);if(!current||current.revision!==expectedRevision)throw Error("BLOCKED: PR workflow gate state changed during terminal completion; revalidate the current session state before retrying")}await deleteStateWhileLocked(directory,normalizedSessionID,{expectedStateRevision:expectedRevision,allowSalvagedRead:options.allowSalvagedRead})})}async function terminalizePrWorkflowGateForSession2(directory,sessionID){return terminalizePrWorkflowGateForSession(directory,sessionID)}function isLiveSessionStatusType(type){return LIVE_SESSION_STATUS_TYPES.has(type)}async function probePrWorkflowLaneSessionStatusTypes(directory,records,timeoutMs){let session=_test_exports2.getSessionOps(),statusOp=session?.status;if(!session||typeof statusOp!=="function")return{statuses:new Map,degradedReason:"probe-unavailable"};let timeoutError=Error("PR workflow lane liveness probe exceeded its deadline"),response;try{response=await withTimeout((async()=>statusOp.call(session,{query:{directory}}))(),timeoutMs??_test_exports2.laneLivenessProbeTimeoutMs,timeoutError)}catch(error93){return{statuses:new Map,degradedReason:error93===timeoutError?"probe-timeout":"probe-error"}}try{if(response?.error)return{statuses:new Map,degradedReason:"probe-error"};let data=response?.data;if(data===null||data===void 0)return{statuses:new Map,degradedReason:"probe-no-data"};let statuses=new Map;for(let record3 of records){let subagentSessionId=record3.subagentSessionId;if(!subagentSessionId)continue;let type=data[subagentSessionId]?.type;if(typeof type==="string")statuses.set(subagentSessionId,type)}return{statuses}}catch{return{statuses:new Map,degradedReason:"probe-error"}}}async function probeAlivePrWorkflowLaneSessions(directory,records){let probe2=await probePrWorkflowLaneSessionStatusTypes(directory,records);if(probe2.degradedReason)return{alive:new Set,degradedReason:probe2.degradedReason};let alive=new Set;for(let[sessionId,type]of probe2.statuses)if(isLiveSessionStatusType(type))alive.add(sessionId);return{alive}}async function collectPrWorkflowPendingLaneLiveness(directory,records,options={}){let now=0,pastThreshold=[],degraded=(record3,reason)=>({laneId:record3.laneId??record3.correlationId,pendingMs:Math.max(0,now-record3.updatedAt),hostStatus:"unknown",stalledSuspect:!0,degradedReason:reason});try{now=_test_exports2.nowMs();let threshold=_test_exports2.pendingLaneLivenessThresholdMs;if(pastThreshold=records.filter((record3)=>(record3.status==="pending"||record3.status==="running"||record3.status==="ingesting")&&now-record3.updatedAt>threshold),pastThreshold.length===0)return[];let budgetMs=Math.max(0,Math.min(_test_exports2.laneLivenessProbeTimeoutMs,options.probeBudgetMs??Number.POSITIVE_INFINITY));if(budgetMs<=0)return pastThreshold.map((record3)=>degraded(record3,PR_WORKFLOW_PROBE_SKIPPED_NO_BUDGET_REASON));let probe2=await probePrWorkflowLaneSessionStatusTypes(directory,pastThreshold,budgetMs),advisories=[];for(let record3 of pastThreshold){let pendingMs=now-record3.updatedAt,laneId=record3.laneId??record3.correlationId;if(probe2.degradedReason){advisories.push({laneId,pendingMs,hostStatus:"unknown",stalledSuspect:!0,degradedReason:probe2.degradedReason});continue}let subagentSessionId=record3.subagentSessionId,type=subagentSessionId?probe2.statuses.get(subagentSessionId):void 0;if(type===void 0){advisories.push({laneId,pendingMs,hostStatus:subagentSessionId?"absent":"unknown",stalledSuspect:!0});continue}advisories.push({laneId,pendingMs,hostStatus:type,stalledSuspect:!isLiveSessionStatusType(type)})}return advisories}catch{return pastThreshold.map((record3)=>degraded(record3,"advisory-unavailable"))}}function describePrWorkflowLaneProbe(settlement){let parts=[];if(settlement.probedAliveLaneIds?.length)parts.push(`liveness probe reports still running: ${settlement.probedAliveLaneIds.slice(0,MAX_DISCLOSED_LANE_IDS).join(", ")}`);if(settlement.probeDegradedReason)parts.push(`liveness probe degraded (${settlement.probeDegradedReason})`);return parts.length>0?` (${parts.join("; ")})`:""}function prWorkflowLaneLabel(record3){return record3.laneId??record3.subagentSessionId??"unknown"}function isOpenPrWorkflowLane(record3,sessionID){return record3.parentSessionId===sessionID&&record3.mode?.startsWith("swarm-pr-")===!0&&(record3.status==="pending"||record3.status==="running")}async function abortLaneSessionForWatchdog(record3){let session=_test_exports2.getSessionOps(),abortOp=session?.abort;if(!session||typeof abortOp!=="function"||!record3.subagentSessionId)return!1;try{return await withTimeout(abortOp.call(session,{path:{id:record3.subagentSessionId}}),_test_exports2.laneLivenessProbeTimeoutMs,Error("lane-liveness watchdog abort exceeded its deadline")),!0}catch{return!1}}function lastWatchdogEscalationsByLaneLabel(directory,sessionID){let escalations=new Map,activityObservations=new Map,deadlineLabels=new Set,text="";try{text=readCoreEvents(directory).text}catch{return{escalations,activityObservations,deadlineLabels}}for(let line of text.split(`
|
|
1282
1282
|
`)){let trimmed=line.trim();if(!trimmed||!trimmed.includes("pr_workflow_lane_watchdog"))continue;let event;try{event=JSON.parse(trimmed)}catch{continue}if(event.type!=="pr_workflow_lane_watchdog")continue;if(sessionID!==void 0&&event.sessionID!==sessionID)continue;let isEscalation=event.escalated===!0,isActivityObservation=!isEscalation&&event.activityObserved===!0,isDeadlineEvent=!isEscalation&&!isActivityObservation&&event.condition==="execution_deadline";if(!isEscalation&&!isActivityObservation&&!isDeadlineEvent)continue;let timestamp=Date.parse(`${event.timestamp}`);if(!Number.isFinite(timestamp))continue;let laneIds=event.laneIds;if(!Array.isArray(laneIds))continue;let target=isEscalation?escalations:activityObservations;for(let label of laneIds){if(typeof label!=="string")continue;if(isDeadlineEvent){deadlineLabels.add(label);continue}let prior=target.get(label);if(prior===void 0||timestamp>prior)target.set(label,timestamp)}}return{escalations,activityObservations,deadlineLabels}}function appendWatchdogActivityObservation(directory,sessionID,labels,horizon,condition){try{appendCoreEventSync(directory,{type:"pr_workflow_lane_watchdog",timestamp:isoNow(),sessionID,condition,laneIds:labels.slice(0,MAX_LANE_LIVENESS_DISCLOSED_IDS),effectiveHorizonMs:horizon.horizonMs,horizonSource:horizon.source,escalated:!1,activityObserved:!0,disclosure:`${labels.length} lane(s) progressed (activity observed since the last escalation); stall escalation baseline reset`})}catch{}}async function evaluateLaneLivenessWatchdogEscalation(args2){let{directory,sessionID,lanes,sessionTypes,watchdog,horizon}=args2,candidates=lanes.filter((record3)=>{if(!record3.subagentSessionId)return!1;let type=sessionTypes.get(record3.subagentSessionId);return type==="busy"||type==="retry"});if(candidates.length===0)return;let lastEscalations=lastWatchdogEscalationsByLaneLabel(directory,sessionID),escalated=[],progressed=[],firstEscalatedSteps=0,firstEscalatedTokens=0;for(let record3 of candidates){let activity=null;try{activity=await laneLivenessWatchdogSurface.readLaneActivity(directory,record3.subagentSessionId)}catch{activity=null}let steps=activity?.stepsObserved??0,tokens2=activity?.estimatedTokens??0;if(steps>=watchdog.stall_min_steps||tokens2>=watchdog.stall_token_threshold){progressed.push(record3);continue}let label=prWorkflowLaneLabel(record3),lastEscalation=lastEscalations.escalations.get(label);if(lastEscalation!==void 0){let lastActivity=activity?.lastActivityAtMs;if(!(lastActivity!==void 0&&lastActivity>=lastEscalation||(lastEscalations.activityObservations.get(label)??-1/0)>=lastEscalation))continue}if(escalated.length===0)firstEscalatedSteps=steps,firstEscalatedTokens=tokens2;escalated.push(record3)}if(progressed.length>0){let firstProgressed=progressed[0],firstProgressedType=firstProgressed.subagentSessionId?sessionTypes.get(firstProgressed.subagentSessionId):void 0;appendWatchdogActivityObservation(directory,sessionID,progressed.map(prWorkflowLaneLabel),horizon,firstProgressedType==="retry"?"provider_retry_in_flight":"idle_failed_child")}if(escalated.length===0)return;let first=escalated[0],condition=classifyLaneLivenessCondition({sessionStatusType:first.subagentSessionId?sessionTypes.get(first.subagentSessionId):void 0,recordStatus:first.status,waitBudgetExpired:!1,exceededEffectiveHorizon:Date.now()-first.updatedAt>horizon.horizonMs}),laneLabels=escalated.map(prWorkflowLaneLabel),disclosure=`${laneLabels.length} lane(s) stalled (fewer than ${watchdog.stall_min_steps} steps and fewer than ~${watchdog.stall_token_threshold} estimated tokens in the last ${watchdog.stall_threshold_ms}ms): inspect the lane transcript or abort via /swarm abort-pr-workflow (force): ${laneLabels.slice(0,MAX_LANE_LIVENESS_DISCLOSED_IDS).join(", ")}`;try{appendCoreEventSync(directory,{type:"pr_workflow_lane_watchdog",timestamp:isoNow(),sessionID,condition,laneIds:laneLabels.slice(0,MAX_LANE_LIVENESS_DISCLOSED_IDS),effectiveHorizonMs:horizon.horizonMs,horizonSource:horizon.source,escalated:!0,stall:{stepsObserved:firstEscalatedSteps,estimatedTokens:firstEscalatedTokens,stallThresholdMs:watchdog.stall_threshold_ms,stallMinSteps:watchdog.stall_min_steps,stallTokenThreshold:watchdog.stall_token_threshold},disclosure})}catch{}}async function settlePresumedStalePrWorkflowLanes(directory,sessionID,options){let watchdog=options?.laneLivenessWatchdog,{deadlineActive,stallActive}=laneLivenessWatchdogFeatures(watchdog),watchdogWork=deadlineActive||stallActive,horizon=resolveEffectivePrLaneHorizonMs(watchdog,options?.backgroundPendingTimeoutMs),horizonConflictNote=horizon.conflictDisclosed?horizon.source==="watchdog-timeout"?`lane_liveness_watchdog.timeout_ms (${horizon.horizonMs}ms) governs the PR-lane settlement horizon; hooks.background_pending_timeout_minutes was also set and disagrees — it was not applied (one effective horizon)`:`PR-lane settlement uses the ${Math.round(horizon.horizonMs/60000)}min reachability floor; hooks.background_pending_timeout_minutes disagrees with it and does not change this horizon`:void 0,now=Date.now(),open7=[],presumedStale=[],laneRead=readDelegationsDetailed(directory);if(laneRead.status==="uncertain")return{openLaneIds:[],openLanes:0,freshOpenLanes:0,presumedStaleLaneIds:[],...horizonConflictNote?{horizonConflictNote}:{},uncertainty:{reason:laneRead.reason,attempts:laneRead.attempts}};for(let record3 of laneRead.records){if(!isOpenPrWorkflowLane(record3,sessionID))continue;if(now-record3.updatedAt>horizon.horizonMs)presumedStale.push(record3);else open7.push(record3)}if(watchdogWork&&(open7.length>0||presumedStale.length>0))laneLivenessWatchdogSurface.evaluations+=1;if(presumedStale.length===0){if(watchdogWork&&stallActive&&open7.length>0){let statuses=new Map;try{let probe3=await _test_exports2.probeLaneSessionStatusTypesAsync(directory,open7);if(statuses=probe3.statuses,!probe3.degradedReason)laneLivenessWatchdogSurface.hostStatusCalls+=1}catch{}if(statuses.size>0)await evaluateLaneLivenessWatchdogEscalation({directory,sessionID,lanes:open7,sessionTypes:statuses,watchdog,horizon})}return{openLaneIds:open7.map(prWorkflowLaneLabel),openLanes:open7.length,freshOpenLanes:open7.length,presumedStaleLaneIds:[],...horizonConflictNote?{horizonConflictNote}:{}}}let probe2,sessionTypes=new Map;if(watchdogWork)try{let typesProbe=await _test_exports2.probeLaneSessionStatusTypesAsync(directory,stallActive?[...presumedStale,...open7]:presumedStale);if(sessionTypes=typesProbe.statuses,!typesProbe.degradedReason)laneLivenessWatchdogSurface.hostStatusCalls+=1;let alive=new Set;for(let[sessionId,type]of typesProbe.statuses)if(isLiveSessionStatusType(type))alive.add(sessionId);probe2=typesProbe.degradedReason?{alive:new Set,degradedReason:typesProbe.degradedReason}:{alive}}catch{probe2={alive:new Set,degradedReason:"probe-error"}}else try{probe2=await _test_exports2.probeLaneLivenessAsync(directory,presumedStale)}catch{probe2={alive:new Set,degradedReason:"probe-error"}}let probeRetained=[],settled=[],deadlineLanes=[];for(let record3 of presumedStale){let type=record3.subagentSessionId?sessionTypes.get(record3.subagentSessionId):void 0;if(deadlineActive&&type!=="retry")deadlineLanes.push(record3),settled.push(record3);else if(record3.subagentSessionId&&probe2.alive.has(record3.subagentSessionId))probeRetained.push(record3);else if(deadlineActive)deadlineLanes.push(record3),settled.push(record3);else settled.push(record3)}let probedAliveLaneIds=probeRetained.map(prWorkflowLaneLabel),openLaneIds=[...open7.map(prWorkflowLaneLabel),...probedAliveLaneIds],retentionDisclosure=probeRetained.length>0?`${probeRetained.length} lane(s) past the horizon retained: liveness probe reports still running: ${probedAliveLaneIds.slice(0,MAX_DISCLOSED_LANE_IDS).join(", ")}`:void 0,retentionFields={...probedAliveLaneIds.length>0?{probedAliveLaneIds,probeRetainedCorrelationIds:probeRetained.map((record3)=>record3.correlationId)}:{},...probe2.degradedReason?{probeDegradedReason:probe2.degradedReason}:{}};if(settled.length===0){if(watchdogWork&&stallActive&&probeRetained.length>0)await evaluateLaneLivenessWatchdogEscalation({directory,sessionID,lanes:probeRetained,sessionTypes,watchdog,horizon});return{openLaneIds,openLanes:openLaneIds.length,freshOpenLanes:open7.length,presumedStaleLaneIds:[],...horizonConflictNote?{horizonConflictNote}:{},...retentionFields,disclosure:retentionDisclosure}}if(deadlineActive){let priorDeadlineLabels=lastWatchdogEscalationsByLaneLabel(directory,sessionID).deadlineLabels,abortAttempted=!1;for(let record3 of deadlineLanes){if((record3.subagentSessionId?sessionTypes.get(record3.subagentSessionId):void 0)!=="busy"||!record3.subagentSessionId)continue;if(priorDeadlineLabels.has(prWorkflowLaneLabel(record3)))continue;if(abortAttempted=!0,await abortLaneSessionForWatchdog(record3))laneLivenessWatchdogSurface.hostAbortCalls+=1}if(deadlineLanes.length>0)try{appendCoreEventSync(directory,{type:"pr_workflow_lane_watchdog",timestamp:isoNow(),sessionID,condition:"execution_deadline",laneIds:deadlineLanes.map(prWorkflowLaneLabel).slice(0,MAX_LANE_LIVENESS_DISCLOSED_IDS),effectiveHorizonMs:horizon.horizonMs,horizonSource:horizon.source,escalated:!1,disclosure:`${deadlineLanes.length} lane(s) exceeded the ${horizon.horizonMs}ms execution deadline (${horizon.source}); `+(abortAttempted?"sessions aborted best-effort and settled ":"no session abort was attempted (the liveness probe could not confirm these sessions were running); lanes settled ")+"through the shared path with the real outcome: no output observed (no transcript activity recorded for these lanes)"})}catch{}}let presumedStaleLaneIds=settled.map(prWorkflowLaneLabel),disclosure=`${presumedStaleLaneIds.length} lane(s) stale >${Math.round(horizon.horizonMs/60000)}min, treated as settled: ${presumedStaleLaneIds.slice(0,MAX_DISCLOSED_LANE_IDS).join(", ")}`+(probe2.degradedReason?`; settled despite liveness probe failure (${probe2.degradedReason})`:"; liveness probe found no live session")+(retentionDisclosure?`; ${retentionDisclosure}`:"");try{await _test_exports2.sweepStaleDelegationsAsync(directory,horizon.horizonMs,{statuses:PR_WORKFLOW_SWEEPABLE_LANE_STATUSES,excludeCorrelationIds:new Set(probeRetained.map((record3)=>record3.correlationId))})}catch{}try{appendCoreEventSync(directory,{type:"pr_workflow_lanes_presumed_stale",timestamp:isoNow(),sessionID,presumedStaleLanes:presumedStaleLaneIds.slice(0,MAX_DISCLOSED_LANE_IDS),staleTimeoutMs:horizon.horizonMs,probeStatus:probe2.degradedReason??"ok",probedAliveLanes:probedAliveLaneIds.slice(0,MAX_DISCLOSED_LANE_IDS),disclosure})}catch{}if(watchdogWork&&stallActive&&!(deadlineActive&&deadlineLanes.length>0)){let stallCandidates=[...open7,...probeRetained];if(stallCandidates.length>0&&sessionTypes.size>0)await evaluateLaneLivenessWatchdogEscalation({directory,sessionID,lanes:stallCandidates,sessionTypes,watchdog,horizon});else if(stallCandidates.length>0);}return{openLaneIds,openLanes:openLaneIds.length,freshOpenLanes:open7.length,presumedStaleLaneIds,...horizonConflictNote?{horizonConflictNote}:{},...retentionFields,disclosure}}async function finalizeOverriddenProbeRetainedLanes(directory,sessionID,correlationIds,horizonMs=PR_WORKFLOW_STALE_LANE_TIMEOUT_MS,reason="/swarm abort-pr-workflow force override"){try{await _test_exports2.sweepStaleDelegationsAsync(directory,horizonMs,{statuses:PR_WORKFLOW_SWEEPABLE_LANE_STATUSES,includeCorrelationIds:new Set(correlationIds),failureClass:"operator_cancelled",reasonPrefix:`lane finalized by operator force abort: ${reason}`})}catch{}let targeted=new Set(correlationIds),outcome={sessionOpenLaneIds:[],finalizedLaneIds:[],sparedLaneDescriptions:[]},finalizeRead=readDelegationsDetailed(directory);if(finalizeRead.status==="uncertain")return{...outcome,delegationReadUncertain:`${finalizeRead.reason} (after ${finalizeRead.attempts} attempts)`};for(let record3 of finalizeRead.records){if(isOpenPrWorkflowLane(record3,sessionID))outcome.sessionOpenLaneIds.push(record3.correlationId);if(!targeted.has(record3.correlationId))continue;if(record3.status==="stale")outcome.finalizedLaneIds.push(record3.correlationId);else if(record3.status!=="pending"&&record3.status!=="running")outcome.sparedLaneDescriptions.push(`${record3.correlationId} (${record3.status})`)}return outcome}async function abortPrWorkflow(directory,sessionID,options={kind:"recovery",reason:""}){let recovery=await readPrWorkflowGateStateForRecovery(directory,sessionID);if(!recovery){if(options.cancelPublication){if(!options.reason.trim())throw Error("BLOCKED: cancel_publication requires a non-empty reason; the cancellation reason is part of the durable audit trail");let dangling=findDanglingLivePublicationGeneration(directory,sessionID);if(!dangling)throw noActiveGateError(sessionID);return appendPublicationEvent(directory,{type:"pr_feedback_publication_cancelled",sessionID:normalizeSessionID(sessionID),generation:dangling.generation,reason:options.reason.trim(),stateFileAbsent:!0,observedRemoteHead:null}),{mode:"PR_FEEDBACK",observedRemoteHead:null,openLanes:0,stateSalvaged:!1,stateSalvageDisclosure:"The gate state file was already absent; the live publication generation in the audit trail was recorded as cancelled_without_publication (event-only terminal)."}}throw noActiveGateError(sessionID)}let state2=recovery.state,cancelRevision=null,cancellationObservedRemoteHead;if(options.expectedMode&&state2.mode!==options.expectedMode)throw wrongModeError(state2,options.expectedMode);if(options.cancelPublication){if(options.kind==="force")throw Error('BLOCKED: cancel_publication cannot be combined with kind "force"; use kind "cancel-publication" with a reason');if(options.kind!=="cancel-publication")throw Error('BLOCKED: cancel_publication requires kind "cancel-publication"; do not combine it with kind "recovery" or "force"');if(!options.reason.trim())throw Error("BLOCKED: cancel_publication requires a non-empty reason; the cancellation reason is part of the durable audit trail");let activeState=state2.prFeedbackPublication?.active?.state;if(activeState==="published")throw Error("BLOCKED: PR_FEEDBACK publication is already marked published; use complete_pr_workflow so the actual remote branch is re-verified before the gate clears");if(state2.mode!=="PR_FEEDBACK"||!state2.prFeedbackReadyToPublish&&!recovery.armedShapeUnreadable&&activeState!=="armed"&&activeState!=="push_in_flight"&&activeState!=="invalidated"&&activeState!=="cancelled_without_publication")throw Error("BLOCKED: cancel_publication applies only to a PR_FEEDBACK workflow with a publication generation (armed, push_in_flight, or invalidated)");let cancellation=await cancelPrFeedbackPublication(directory,sessionID,options.reason.trim());cancelRevision=cancellation.revision,cancellationObservedRemoteHead=cancellation.observedRemoteHead}if(state2.prFeedbackPublication?.active?.state==="published")throw Error("BLOCKED: PR_FEEDBACK publication is already marked published; use complete_pr_workflow so the actual remote branch is re-verified before the gate clears");if((state2.prFeedbackReadyToPublish||recovery.armedShapeUnreadable)&&!options.cancelPublication)throw Error(`BLOCKED: ${state2.mode} is armed for publication; abort is blocked. Complete the workflow with complete_pr_workflow (or push the bound commit first) before aborting, or use the audited cancellation (abort_pr_workflow with cancel_publication and a reason).`+(recovery.armedShapeUnreadable?" The publication-arming record is itself unreadable, so it is treated as armed (fail-closed).":""));let laneSettlement=await settlePresumedStalePrWorkflowLanes(directory,state2.sessionID,options.laneLiveness),probeRetainedLanes=laneSettlement.probedAliveLaneIds??[],overridesProbeRetention=options.kind==="force"&&laneSettlement.freshOpenLanes===0&&probeRetainedLanes.length>0;if(laneSettlement.uncertainty)throw Error(`BLOCKED: ${state2.mode} abort refused while the delegation store is unreadable after ${laneSettlement.uncertainty.attempts} attempts (${laneSettlement.uncertainty.reason}); open lanes are UNKNOWN, not absent. Restore the store (see the settlement disclosure) or retry once it is readable before aborting.`);if(laneSettlement.openLanes>0&&!overridesProbeRetention){let laneIds=laneSettlement.openLaneIds.filter(Boolean).slice(0,MAX_DISCLOSED_LANE_IDS).join(", ");throw Error(`BLOCKED: ${state2.mode} abort refused while ${laneSettlement.openLanes} PR workflow lane(s) are still in flight (lane ids: ${laneIds}). Collect their results or let them settle before aborting.`+describePrWorkflowLaneProbe(laneSettlement))}let sanitizedReason=typeof options.reason==="string"&&options.reason.trim().length>0?options.reason.trim().slice(0,500):void 0;if(sanitizedReason===void 0)throw Error(`BLOCKED: ${state2.mode} abort requires a non-empty reason (recorded to the audit trail).`);let overrideTargetedLaneIds=overridesProbeRetention?laneSettlement.probeRetainedCorrelationIds??[]:[],probeRetentionOverrideDecision=overridesProbeRetention?`force abort overrode ${probeRetainedLanes.length} lane(s) past the staleness horizon that the liveness probe reported as still running: ${probeRetainedLanes.slice(0,MAX_DISCLOSED_LANE_IDS).join(", ")}. Their sessions were NOT stopped and their output was NOT collected.`:void 0,abortEvent={type:"pr_workflow_aborted",timestamp:isoNow(),sessionID:state2.sessionID,mode:state2.mode,kind:options.kind,...state2.prHeadSha?{prHeadSha:state2.prHeadSha}:{},...state2.checkoutRecovery?{hadTerminalRecovery:!0}:{},openLanes:laneSettlement.openLanes,...laneSettlement.presumedStaleLaneIds.length>0?{presumedStaleLanes:laneSettlement.presumedStaleLaneIds.slice(0,MAX_DISCLOSED_LANE_IDS),presumedStaleDisclosure:laneSettlement.disclosure}:{},...probeRetainedLanes.length>0?{probeRetainedLanes:probeRetainedLanes.slice(0,MAX_DISCLOSED_LANE_IDS)}:{},...probeRetentionOverrideDecision?{probeRetentionOverrideDisclosure:probeRetentionOverrideDecision}:{},...overridesProbeRetention?{probeRetentionOverrideLanes:overrideTargetedLaneIds.slice(0,MAX_DISCLOSED_LANE_IDS)}:{},...laneSettlement.probeDegradedReason?{probeStatus:laneSettlement.probeDegradedReason}:{},...recovery.salvaged?{stateSalvaged:!0,stateSalvageDisclosure:recovery.disclosure,...recovery.revisionSalvageable?{}:{casEscapeDisclosure:CAS_ESCAPE_DISCLOSURE}}:{},reason:sanitizedReason};try{appendCoreEventSync(directory,abortEvent)}catch{}let casEscape=recovery.salvaged&&!recovery.revisionSalvageable;await _test_exports2.beforeAbortClear?.();try{await clearPrWorkflowGateState(directory,sessionID,casEscape?void 0:cancelRevision??state2.revision,{allowSalvagedRead:recovery.salvaged})}catch(error93){try{appendCoreEventSync(directory,{type:"pr_workflow_abort_not_completed",timestamp:isoNow(),sessionID:state2.sessionID,mode:state2.mode,...state2.prHeadSha?{prHeadSha:state2.prHeadSha}:{},reason:sanitizedReason,...overridesProbeRetention?{probeRetentionOverrideLanes:overrideTargetedLaneIds.slice(0,MAX_DISCLOSED_LANE_IDS),probeRetentionOverrideFinalized:!1}:{},failure:(error93 instanceof Error?error93.message:String(error93)).slice(0,MAX_BASE_COVERAGE_DIAGNOSTIC_CHARS2),disclosure:"RETRACTION: the pr_workflow_aborted record for this session did NOT complete — "+"the clear failed and the gate state may still be active. Revalidate the current session state before retrying the abort."+(overridesProbeRetention?" The probe-retention override finalized no record: it runs only after the clear succeeds, and this clear failed. Other lanes in the same settlement "+"batch may already have been finalized as presumed-stale, and a concurrent abort for this session may have finalized more — revalidate the lane records rather than assuming they are untouched.":"")})}catch{}throw error93}let overrideOutcome=overridesProbeRetention?await finalizeOverriddenProbeRetainedLanes(directory,state2.sessionID,overrideTargetedLaneIds,resolveEffectivePrLaneHorizonMs(options.laneLiveness?.laneLivenessWatchdog,options.laneLiveness?.backgroundPendingTimeoutMs).horizonMs,options.reason??"/swarm abort-pr-workflow force override"):{sessionOpenLaneIds:[],finalizedLaneIds:[],sparedLaneDescriptions:[]},probeRetentionOverrideDisclosure=probeRetentionOverrideDecision?probeRetentionOverrideDecision+(overrideOutcome.finalizedLaneIds.length===0?"":` Their delegation records were finalized (correlationId: ${overrideOutcome.finalizedLaneIds.slice(0,MAX_DISCLOSED_LANE_IDS).join(", ")}); whatever those lanes still produce is no longer collectable.`)+(overrideOutcome.sparedLaneDescriptions.length===0?"":` ${overrideOutcome.sparedLaneDescriptions.length} of the overridden lane(s) were NOT finalized: the sweep left those records intact at the status they had already reached (${overrideOutcome.sparedLaneDescriptions.slice(0,MAX_DISCLOSED_LANE_IDS).join(", ")}). This abort did not discard them — check collect_lane_results before assuming that work is gone.`)+(overrideOutcome.delegationReadUncertain!==void 0?` WARNING: the post-abort delegation-store re-read was unreadable (${overrideOutcome.delegationReadUncertain}); whether any PR workflow delegation record(s) for this session remain open is UNKNOWN — revalidate with pr_workflow_status before assuming a new PR workflow can start.`:overrideOutcome.sessionOpenLaneIds.length===0?" A new PR workflow can now be started for this session.":` WARNING: ${overrideOutcome.sessionOpenLaneIds.length} PR workflow delegation record(s) for this session are still open (correlationId: ${overrideOutcome.sessionOpenLaneIds.slice(0,MAX_DISCLOSED_LANE_IDS).join(", ")}) and will keep refusing PR workflow checkout preparation for this session until they settle.`):void 0;return{mode:state2.mode,...state2.prHeadSha?{prHeadSha:state2.prHeadSha}:{},...cancellationObservedRemoteHead!==void 0?{observedRemoteHead:cancellationObservedRemoteHead}:{},openLanes:laneSettlement.openLanes,...laneSettlement.presumedStaleLaneIds.length>0?{presumedStaleLanes:laneSettlement.presumedStaleLaneIds,presumedStaleDisclosure:laneSettlement.disclosure}:{},...probeRetainedLanes.length>0?{probeRetainedLanes}:{},...probeRetentionOverrideDisclosure?{probeRetentionOverrideDisclosure}:{},...laneSettlement.probeDegradedReason?{probeDegradedReason:laneSettlement.probeDegradedReason}:{},...recovery.salvaged?{stateSalvaged:!0,stateSalvageDisclosure:recovery.disclosure}:{},...casEscape?{casEscapeDisclosure:CAS_ESCAPE_DISCLOSURE}:{}}}async function recoverArmedPrWorkflow(directory,sessionID,request){let sanitizedReason=typeof request.reason==="string"&&request.reason.trim().length>0?request.reason.trim().slice(0,500):void 0;if(sanitizedReason===void 0)throw Error("BLOCKED: armed recovery requires a non-empty reason (recorded to the audit trail).");return withSessionStateMutation(directory,normalizeSessionID(sessionID),async()=>{let state2=await readPrWorkflowGateStateFromDisk3(directory,normalizeSessionID(sessionID));if(!state2)throw noActiveGateError(sessionID);if(request.expectedMode&&state2.mode!==request.expectedMode)throw wrongModeError(state2,request.expectedMode);let armed=state2.prFeedbackReadyToPublish;if(!armed)throw Error(`BLOCKED: ${state2.mode} is not armed for publication; armed recovery applies only to an active staged publication authorization (complete or abort normally instead).`);if(request.prHeadSha!==state2.prHeadSha)throw Error(`BLOCKED: armed recovery head mismatch: workflow is bound to "${state2.prHeadSha??"(none)"}", request declared "${request.prHeadSha}".`);if(state2.prReviewBaseSha===void 0!==(request.baseSha===void 0))throw Error(`BLOCKED: armed recovery base mismatch: ${state2.prReviewBaseSha===void 0?"the active workflow has no merge-base binding but the request declared one":"the active workflow is merge-base bound but the request omitted base_sha"}; fail closed.`);if(request.baseSha!==void 0&&state2.prReviewBaseSha!==void 0&&request.baseSha!==state2.prReviewBaseSha)throw Error(`BLOCKED: armed recovery base mismatch: workflow is merge-base bound to "${state2.prReviewBaseSha}", request declared "${request.baseSha}".`);if(request.revisionDigest!==armed.revisionDigest)throw Error("BLOCKED: armed recovery revision digest does not match the staged publication authorization; fail closed.");if(request.generation!==state2.revision)throw Error(`BLOCKED: armed recovery generation mismatch: current gate generation is ${state2.revision}, request declared ${request.generation}. Stale requests fail closed; re-read the workflow state and retry.`);if(request.workflowInstanceId===void 0!==(state2.workflowInstanceId===void 0))throw Error("BLOCKED: armed recovery workflow identity mismatch: request and active state disagree on workflowInstanceId presence; fail closed.");if(request.workflowInstanceId!==void 0&&state2.workflowInstanceId!==void 0&&request.workflowInstanceId!==state2.workflowInstanceId)throw Error(`BLOCKED: armed recovery workflow identity mismatch: active workflow is "${state2.workflowInstanceId}", request declared "${request.workflowInstanceId}".`);let laneSettlement=await settlePresumedStalePrWorkflowLanes(directory,state2.sessionID,request.laneLiveness);if(laneSettlement.uncertainty)throw Error(`BLOCKED: armed recovery refused while the delegation store is unreadable after ${laneSettlement.uncertainty.attempts} attempts (${laneSettlement.uncertainty.reason}); open lanes are UNKNOWN, not absent. Restore the store before recovering.`);if(laneSettlement.openLanes>0){let laneIds=laneSettlement.openLaneIds.filter(Boolean).slice(0,MAX_DISCLOSED_LANE_IDS).join(", ");throw Error(`BLOCKED: armed recovery refused while ${laneSettlement.openLanes} PR workflow lane(s) are still in flight (lane ids: ${laneIds}). Collect their results or let them settle before recovering.`+describePrWorkflowLaneProbe(laneSettlement))}let cancelledDimensions=[],cancellations=state2.prReviewDimensionCancellations,recoveredAt=isoNow();if(state2.mode==="PR_REVIEW"&&state2.prHeadSha){let ctx=await createPrReviewGateContext2(directory,state2),settlement=derivePrReviewDimensionSettlement(directory,state2,ctx.revisionDigest);for(let entry of settlement.unresolvedDimensions){if(entry.terminalState!=="NOT_LAUNCHED")continue;cancelledDimensions.push(entry.dimension)}if(cancelledDimensions.length>0){let recoveryOutcome=reducePrReviewEvent(state2,{type:"armed_recovery_requested",binding:{sessionID:state2.sessionID,...state2.workflowInstanceId?{workflowInstanceId:state2.workflowInstanceId}:{},prHeadSha:state2.prHeadSha,revisionDigest:armed.revisionDigest,generation:state2.revision},dimensionsToCancel:cancelledDimensions,nowIso:recoveredAt,reason:sanitizedReason});if(recoveryOutcome.status==="rejected")throw Error(`BLOCKED: armed recovery rejected (${recoveryOutcome.rejection.code}): ${recoveryOutcome.rejection.detail}`);cancellations=recoveryOutcome.state.prReviewDimensionCancellations??cancellations}}try{appendCoreEventSync(directory,{type:"pr_workflow_armed_recovery",timestamp:recoveredAt,sessionID:state2.sessionID,mode:state2.mode,prHeadSha:state2.prHeadSha,revisionDigest:armed.revisionDigest,generation:state2.revision,settledLanes:laneSettlement.presumedStaleLaneIds?.length??0,cancelledDimensions,reason:sanitizedReason})}catch{}return await writeStateWhileLocked(directory,{...state2,updatedAt:recoveredAt,prFeedbackReadyToPublish:void 0,prFeedbackArmedRecovery:{recoveredAt,prHeadSha:state2.prHeadSha,revisionDigest:armed.revisionDigest,generation:state2.revision,reason:sanitizedReason},...cancellations?{prReviewDimensionCancellations:cancellations}:{}}),{mode:state2.mode,prHeadSha:state2.prHeadSha,openLanes:laneSettlement.openLanes,settledLanes:laneSettlement.presumedStaleLaneIds?.length??0,cancelledDimensions,recoveredAt}})}async function bindPrWorkflowHead(directory,sessionID,prHeadSha){let normalizedSessionID=normalizeSessionID(sessionID);return withPrWorkflowCheckoutMutationLock(directory,async()=>withSessionStateMutation(directory,normalizedSessionID,async()=>bindPrWorkflowHeadWhileLocked(directory,normalizedSessionID,prHeadSha)))}async function bindPrWorkflowHeadWhileLocked(directory,normalizedSessionID,prHeadSha){let normalizedHead=normalizePrHeadSha(prHeadSha),state2=await readPrWorkflowGateStateFromDisk3(directory,normalizedSessionID);if(!state2)throw Error(`BLOCKED: no active PR workflow gate for session "${normalizedSessionID}". The gate must be activated before the PR head can be bound.`);if(await assertCurrentCheckoutHead(directory,normalizedHead,state2.mode),state2.prHeadSha&&state2.prHeadSha!==normalizedHead)throw Error(`BLOCKED: active ${state2.mode} workflow is bound to PR head "${state2.prHeadSha}"; received "${normalizedHead}"`);if(!state2.prHeadSha)await assertPrReviewCleanCheckout(directory,state2.mode);if(!state2.prHeadSha&&state2.mode==="PR_FEEDBACK")await assertPrFeedbackTrackingCheckout(directory,normalizedHead);if(state2.prHeadSha===normalizedHead){if(state2.mode==="PR_FEEDBACK")await assertPrFeedbackTrackingCheckout(directory,normalizedHead);return state2}let nextState={...state2,prHeadSha:normalizedHead,checkoutRecovery:void 0,updatedAt:isoNow()};await _test_exports2.beforePrFeedbackTrackingPersist?.();try{return await writeStateWhileLocked(directory,nextState)}catch(error93){if(!state2.prHeadSha)try{let candidates=await resolvePrFeedbackTrackingCandidatesAsync(directory,normalizedHead);if(candidates?.local.length===1)await switchPrFeedbackTrackingCandidateAsync(directory,candidates.local[0]);else if(candidates?.remote.length===1)await switchPrFeedbackTrackingCandidateAsync(directory,candidates.remote[0]);await assertPrFeedbackTrackingCheckout(directory,normalizedHead)}catch{}throw error93}}async function rebindPrFeedbackHead(directory,sessionID,prHeadSha){let state2=await requireBoundState2(directory,sessionID,"PR_FEEDBACK"),normalizedHead=normalizePrHeadSha(prHeadSha);if(state2.prFeedbackReadyToPublish)throw Error("BLOCKED: PR_FEEDBACK rebind is refused while publication is armed; complete the workflow (or push the bound commit) before rebinding.");let rebindRead=readDelegationsDetailed(directory);if(rebindRead.status==="uncertain")throw Error(`BLOCKED: PR_FEEDBACK rebind refused while the delegation store is unreadable after ${rebindRead.attempts} attempts (${rebindRead.reason}); in-flight lanes are UNKNOWN. Restore the store before rebinding.`);let openLanes=rebindRead.records.filter((record3)=>record3.parentSessionId===state2.sessionID&&record3.mode?.startsWith("swarm-pr-")&&(record3.status==="pending"||record3.status==="running"));if(openLanes.length>0)throw Error(`BLOCKED: PR_FEEDBACK rebind refused while ${openLanes.length} PR workflow lane(s) are still in flight; collect their results first.`);if(normalizedHead===state2.prHeadSha)throw Error(`BLOCKED: PR_FEEDBACK rebind to the current intake head "${normalizedHead}" is a no-op; a rebind must move to a genuinely new verified PR head after merge/rebase repair.`);await assertCurrentCheckoutHead(directory,normalizedHead,state2.mode),await assertPrFeedbackTrackingCheckout(directory,normalizedHead);let nextState={...state2,prHeadSha:normalizedHead,prFeedbackStageA:void 0,prFeedbackVerifications:void 0,prFeedbackGateBatches:void 0,prFeedbackRebindCount:(state2.prFeedbackRebindCount??0)+1,updatedAt:isoNow()};try{appendCoreEventSync(directory,{type:"pr_feedback_rebound",timestamp:isoNow(),sessionID:state2.sessionID,previousPrHeadSha:state2.prHeadSha,prHeadSha:normalizedHead,rebindCount:nextState.prFeedbackRebindCount})}catch{}return withSessionStateMutation(directory,state2.sessionID,async()=>writeStateWhileLocked(directory,nextState))}async function bindPrReviewBase(directory,sessionID,options){let state2=await bindPrWorkflowHead(directory,sessionID,options.prHeadSha);if(state2.mode!=="PR_REVIEW")throw Error("BLOCKED: only PR_REVIEW can bind a review merge base");let baseRef=options.baseRef.trim(),baseSha=normalizePrHeadSha(options.baseSha).toLowerCase();if(!baseRef)throw Error("BLOCKED: PR_REVIEW base_ref must not be empty");if(state2.prReviewBaseRef&&state2.prReviewBaseRef!==baseRef||state2.prReviewBaseSha&&state2.prReviewBaseSha!==baseSha)throw Error(`BLOCKED: active PR_REVIEW is bound to merge-base scope "${state2.prReviewBaseRef??"(unbound)"}" at "${state2.prReviewBaseSha??"(unbound)"}"; received "${baseRef}" at "${baseSha}"`);if(state2.prReviewBaseRef===baseRef&&state2.prReviewBaseSha===baseSha)return state2;let prHeadSha=normalizePrHeadSha(options.prHeadSha).toLowerCase(),diffStats=await _test_exports2.resolvePrReviewDiffStatsAsync(directory,baseSha,prHeadSha);return state2={...state2,prReviewBaseRef:baseRef,prReviewBaseSha:baseSha,prReviewDepthTier:computePrReviewDepthTier(diffStats),...diffStats?{prReviewDiffStats:diffStats}:{},updatedAt:isoNow()},await persistState2(directory,state2),state2}async function assertCurrentCheckoutHead(directory,expectedHead,mode="PR_REVIEW"){let normalizedExpected=normalizePrHeadSha(expectedHead),currentHead=(await _test_exports2.resolveCurrentGitHeadAsync(directory))?.trim();if(!currentHead)throw Error(`BLOCKED: cannot resolve the current Git HEAD in "${directory}" to verify against PR head "${normalizedExpected}". This means Git could not resolve HEAD (the working directory may not be a Git repository, HEAD may be unborn, the commit object may be missing in a shallow clone, the Git binary may not be on PATH, or the bounded Git invocation may have timed out). Verify with two separate standalone commands. First run: git -C "${directory}" rev-parse --verify HEAD^0. Then run: git -C "${directory}" cat-file -t HEAD (which must print commit).`);if(currentHead.toLowerCase()!==normalizedExpected.toLowerCase()){let remediation=mode==="PR_FEEDBACK"?"Check out the intended local tracking branch at that exact head (for example with a safe standalone `gh pr checkout <number-or-url>` or `git switch -c <local> --track <remote>/<branch>`), then retry the bind. Do not create a new detached feedback checkout.":`Run bare, standalone commands from that directory. If the commit is not present locally, first run \`git fetch origin <pr-head-ref>\`. Then run \`git switch --detach ${normalizedExpected}\`. Do not prefix the switch with \`git -C\`; the read-only shell classifier refuses \`git -C ... switch\`.`;throw Error(`BLOCKED: current checkout HEAD "${currentHead}" does not match PR head "${normalizedExpected}" (working directory: "${directory}"). ${remediation}`)}return normalizedExpected}async function assertPrReviewCleanCheckout(directory,mode="PR_REVIEW"){if(await _test_exports2.resolveIsWorkingTreeCleanAsync(directory)!==!0)throw Error(`BLOCKED: ${mode} requires a clean index and working tree at the exact PR head`)}async function assertPrFeedbackTrackingCheckout(directory,prHeadSha){let currentHead=(await _test_exports2.resolveCurrentGitHeadAsync(directory))?.trim();if(!currentHead)throw Error("BLOCKED: PR_FEEDBACK requires a resolved exact Git HEAD before first head bind");if(currentHead.toLowerCase()!==prHeadSha.toLowerCase())throw Error(`BLOCKED: PR_FEEDBACK exact head changed before attach; expected ${prHeadSha}, received ${currentHead}`);let currentUpstream=await _test_exports2.resolveCurrentUpstreamPushTargetAsync(directory),matchingRemoteRefs=await _test_exports2.resolveRemoteRefsContainingHeadAsync(directory,prHeadSha);if(currentUpstream){if(matchingRemoteRefs===null)throw Error("BLOCKED: PR_FEEDBACK could not verify the current upstream against the exact intake PR head; the bounded Git query failed or timed out");if(matchingRemoteRefs.includes(currentUpstream.remoteTrackingRef))return;throw Error(`BLOCKED: PR_FEEDBACK current upstream "${currentUpstream.remoteTrackingRef}" must point to the exact intake PR head "${prHeadSha}"; refusing to replace an existing tracking relationship`)}let candidates=await resolvePrFeedbackTrackingCandidatesAsync(directory,prHeadSha);if(!candidates)throw Error(`BLOCKED: PR_FEEDBACK could not inspect tracked branches for exact PR head "${prHeadSha}"; the bounded Git query failed or timed out`);let{local:localCandidates,remote:remoteCandidates}=candidates;if(localCandidates.length===1){if(await _test_exports2.beforePrFeedbackTrackingSwitch?.(),!await switchPrFeedbackTrackingCandidateAsync(directory,localCandidates[0]))throw Error(`BLOCKED: PR_FEEDBACK could not attach exact local tracked branch "${localCandidates[0].branchName}"; it may be checked out in another linked worktree or the bounded Git switch failed`)}else if(localCandidates.length>1)throw Error(`BLOCKED: PR_FEEDBACK exact head "${prHeadSha}" matches multiple local tracked branches: ${localCandidates.map((candidate)=>candidate.branchName).join(", ")}`);else if(remoteCandidates.length===1){if(await _test_exports2.beforePrFeedbackTrackingSwitch?.(),!await switchPrFeedbackTrackingCandidateAsync(directory,remoteCandidates[0]))throw Error(`BLOCKED: PR_FEEDBACK could not attach exact remote-tracking branch "${remoteCandidates[0].remoteTrackingRef}"; the bounded Git switch failed or timed out`)}else if(remoteCandidates.length>1)throw Error(`BLOCKED: PR_FEEDBACK exact head "${prHeadSha}" matches multiple remote-tracking refs: ${remoteCandidates.map((candidate)=>candidate.remoteTrackingRef).join(", ")}`);else throw Error("BLOCKED: PR_FEEDBACK requires a current local branch or exact remote-tracking ref that points to the intake PR head before the first bind");await _test_exports2.afterPrFeedbackTrackingSwitch?.();let attachedHead=(await _test_exports2.resolveCurrentGitHeadAsync(directory))?.trim();if(attachedHead?.toLowerCase()!==prHeadSha.toLowerCase())throw Error(`BLOCKED: PR_FEEDBACK exact head changed after attach; expected ${prHeadSha}, received ${attachedHead??"(unresolved)"}`);if(await _test_exports2.resolveIsWorkingTreeCleanAsync(directory)!==!0)throw Error("BLOCKED: PR_FEEDBACK requires a clean working tree after checkout attachment");let attachedUpstream=await _test_exports2.resolveCurrentUpstreamPushTargetAsync(directory);if(!attachedUpstream)throw Error("BLOCKED: PR_FEEDBACK could not resolve the attached branch upstream after checkout promotion");if(!(await _test_exports2.resolveRemoteRefsContainingHeadAsync(directory,prHeadSha))?.includes(attachedUpstream.remoteTrackingRef))throw Error(`BLOCKED: PR_FEEDBACK upstream "${attachedUpstream.remoteTrackingRef}" must point to the exact intake PR head "${prHeadSha}" before the first head bind`)}async function enforcePrWorkflowDispatchLanesAsync(directory,sessionID,toolName){let state2=await readPrWorkflowGateState(directory,sessionID);if(!state2)return null;if(toolName===DISPATCH_TOOL_NAME)return state2;if(toolName===BLOCKING_DISPATCH_TOOL_NAME)throw Error(`BLOCKED: active ${state2.mode} workflow for session "${state2.sessionID}" requires ${DISPATCH_TOOL_NAME}; ${BLOCKING_DISPATCH_TOOL_NAME} is not allowed`);return state2}function declaredBaseDimensions(lanes){return lanes.flatMap((lane)=>lane.ownedWorkflowLanes?.length?lane.ownedWorkflowLanes:[lane.workflowLane])}function exactDimensionPartition(actual,expected){return actual.length===expected.length&&new Set(actual).size===expected.length&&expected.every((dimension)=>actual.includes(dimension))}function latestDelegationRecord(records){return[...records].sort((left,right)=>{let leftKey=left.completedAt??left.updatedAt??left.createdAt;return(right.completedAt??right.updatedAt??right.createdAt)-leftKey})[0]??null}function warnDelegationReadUncertainOnce(scope,uncertain){let key2=`${scope}\x00${uncertain.reason}`;if(delegationReadUncertainLogged.has(key2))return;if(delegationReadUncertainLogged.size>=DELEGATION_READ_UNCERTAIN_LOG_LIMIT){let oldest=delegationReadUncertainLogged.values().next().value;if(oldest!==void 0)delegationReadUncertainLogged.delete(oldest)}delegationReadUncertainLogged.add(key2),warn(`PR workflow gate: delegation store unreadable after ${uncertain.attempts} attempts (${uncertain.reason}); ${scope} is UNKNOWN, not absent`)}function batchLaneRecords(directory,state2,batchId,laneId){let outcome=findByBatchIdDetailed(directory,batchId,{parentSessionId:state2.sessionID});if(outcome.status==="uncertain")return warnDelegationReadUncertainOnce("batch lane records",outcome),[];return outcome.value.filter((record3)=>record3.laneId===laneId)}function batchIsTerminal(directory,state2,batchId){let outcome=findByBatchIdDetailed(directory,batchId,{parentSessionId:state2.sessionID});if(outcome.status==="uncertain")return warnDelegationReadUncertainOnce("batch terminality",outcome),!1;return outcome.value.length>0&&outcome.value.every((record3)=>TERMINAL_FAILED_DELEGATION_STATUSES2.has(record3.status)||record3.status==="consumed")}function effectivePrReviewResiliencePolicy(state2,requestedPolicy){return state2.prReviewResilience?.policy??snapshotPrReviewResiliencePolicy(requestedPolicy)}function reportCircuitAdoptionDiagnostic(diagnostic){if(diagnostic.code==="migrated_legacy_circuit"){log("PR review resilience circuit: migrated unversioned legacy circuit record to v2 CLOSED (nonblocking, evidence waterlined)",{legacyContributors:diagnostic.legacySignatureCount});return}if(malformedCircuitDiagnosticsSeen.has(diagnostic.bodyHash8))return;if(malformedCircuitDiagnosticsSeen.size>=MALFORMED_CIRCUIT_DIAGNOSTIC_LIMIT){let oldest=malformedCircuitDiagnosticsSeen.values().next().value;if(oldest!==void 0)malformedCircuitDiagnosticsSeen.delete(oldest)}malformedCircuitDiagnosticsSeen.add(diagnostic.bodyHash8),log("PR review resilience circuit: malformed circuit record dropped (fail-open)",{bodyHash8:diagnostic.bodyHash8,byteLength:diagnostic.byteLength})}function circuitOpenDurationMs(policy){return policy.circuitOpenDurationMs??DEFAULT_PR_REVIEW_RESILIENCE_CONFIG.circuit_open_duration_ms}function laneSignalsForCircuitReview(directory,state2){let signals=[];for(let batch of state2.prReviewBaseDispatches??[])for(let lane of batch.lanes){let latest=latestDelegationRecord(batchLaneRecords(directory,state2,batch.batchId,lane.laneId));if(!latest)continue;let signal=classifyPrReviewCircuitSignal(latest);if(signal)signals.push(signal)}return signals}function probeObservationForCircuit(directory,state2,circuit){if(circuit.state!=="HALF_OPEN"||!circuit.probe)return;let latest=latestDelegationRecord(batchLaneRecords(directory,state2,circuit.probe.batchId,circuit.probe.laneId));if(!latest)return;if(!TERMINAL_FAILED_DELEGATION_STATUSES2.has(latest.status))return;return{terminalStatus:latest.status,signal:classifyPrReviewCircuitSignal(latest),terminalAtMs:latest.terminalResult?.recordedAt??latest.completedAt??latest.updatedAt??latest.createdAt??0}}function formatPrReviewResilienceCircuitOpenMessage(circuit,nowMs3=Date.now()){if(!circuit)return"BLOCKED: PR_REVIEW resilience retry circuit is open; collect, diagnose, cancel, abort, gap reporting, and config disable remain available";if("version"in circuit){let openUntilMs=circuit.openUntil?Date.parse(circuit.openUntil):0,remainingMs=Math.max(0,openUntilMs-nowMs3),retryNote=remainingMs>0?`the recovery canary probe is admitted in about ${Math.ceil(remainingMs/1000)}s`:"the next staged dispatch is admitted as the recovery canary probe";return`BLOCKED: PR_REVIEW resilience retry circuit is ${circuit.state} after ${circuit.contributors.length} distinct terminal provider failures (${circuit.providerClass??"provider"}); ${retryNote}; collect, diagnose, cancel, abort, gap reporting, and config disable remain available`}return`BLOCKED: PR_REVIEW base dispatch circuit is open after ${circuit.count} correlated terminal failures (${circuit.signature}); collect every launched lane, then settle coverage truthfully (COMPLETE/PARTIAL/NO_COVERAGE) via complete_pr_workflow`}async function advanceResilienceCircuitWhileLocked(args2){let{directory}=args2,state2=args2.state,snapshot=args2.snapshot,nowMs3=_test_exports2.nowMs(),adoption=adoptPrReviewCircuit(snapshot.circuit,nowMs3),circuit=null;if(adoption.kind==="v2")circuit=adoption.record;else if(adoption.kind==="migrated")circuit=adoption.record,snapshot={...snapshot,circuit:adoption.record},state2=await writeStateWhileLocked(directory,{...state2,updatedAt:isoNow(),prReviewResilience:snapshot}),reportCircuitAdoptionDiagnostic(adoption.diagnostic);else if(adoption.kind==="malformed"){let withoutCircuit={...snapshot};withoutCircuit.circuit=void 0,snapshot=withoutCircuit,reportCircuitAdoptionDiagnostic(adoption.diagnostic)}let advanceOutcome=reducePrReviewEvent(state2,{type:"circuit_advance_requested",nowMs:nowMs3,laneSignals:laneSignalsForCircuitReview(directory,state2),probeObservation:circuit?.state==="HALF_OPEN"?probeObservationForCircuit(directory,state2,circuit):void 0,admission:args2.admission,policy:snapshot.policy});if(advanceOutcome.status==="rejected")return{state:state2,snapshot};let nextState=advanceOutcome.state,blockedReason=advanceOutcome.effects.find((effect)=>effect.kind==="block_dispatch")?.reason;if(advanceOutcome.effects.some((effect)=>effect.kind==="persist_state"))snapshot={...snapshot,circuit:nextState.prReviewResilience?.circuit},state2=await writeStateWhileLocked(directory,{...nextState,updatedAt:isoNow(),prReviewResilience:snapshot});else state2=nextState;if(blockedReason!==void 0)return{state:state2,snapshot,blocked:{reason:blockedReason}};let pendingProbe=nextState.prReviewResilience?.circuit;if(pendingProbe&&"version"in pendingProbe&&pendingProbe.state==="HALF_OPEN"&&pendingProbe.probe)return{state:state2,snapshot,pendingProbeCircuit:pendingProbe};return{state:state2,snapshot}}async function preflightPrReviewResilienceCircuitBeforePrune(directory,state2,previous,policy,liveResilienceEnabled){let nextState=state2,nextPrevious=previous,snapshot=nextState.prReviewResilience;if(!snapshot){if(snapshot={policy,attempts:[]},nextPrevious.length>0)nextState=await writeStateWhileLocked(directory,{...nextState,updatedAt:isoNow(),prReviewResilience:snapshot}),nextPrevious=nextState.prReviewBaseDispatches??[],snapshot=nextState.prReviewResilience??snapshot}if(!liveResilienceEnabled)return{state:nextState,previous:nextPrevious};let outcome=await advanceResilienceCircuitWhileLocked({directory,state:nextState,snapshot});if(outcome.blocked)throw new PrReviewResilienceCircuitOpenError(formatPrReviewResilienceCircuitOpenMessage(outcome.snapshot.circuit));return{state:outcome.state,previous:outcome.state.prReviewBaseDispatches??nextPrevious}}async function probeResilienceCanaryLiveness(directory,records,timeoutMs){let session=_test_exports2.getSessionOps(),status2=session?.status;if(!session||typeof status2!=="function")return{live:!1,reason:"status probe unavailable"};let timeoutError=Error("PR workflow resilience canary probe exceeded its deadline"),response;try{response=await withTimeout((async()=>status2.call(session,{query:{directory}}))(),timeoutMs,timeoutError)}catch(error93){return{live:!1,reason:error93===timeoutError?"status probe timed out":"status probe failed"}}if(response?.error)return{live:!1,reason:"status probe errored"};if(!response?.data)return{live:!1,reason:"status probe returned no data"};for(let record3 of records){let type=response.data[record3.subagentSessionId]?.type;if(type==="busy"||type==="retry")return{live:!0}}return{live:!1,reason:"status probe did not report busy/retry"}}async function evaluatePrReviewResilienceAttempt(directory,state2,attempt,revisionDigest,policy){let attempts=summarizePrReviewBaseDimensionAttempts(directory,state2,revisionDigest),remaining=attempt.targetDimensions.filter((dimension)=>!attempts.successful.has(dimension)&&!attempts.inFlight.has(dimension)),inFlight=attempt.targetDimensions.filter((dimension)=>attempts.inFlight.has(dimension));if(remaining.length===0&&inFlight.length===0)return{remaining:[],inFlight:[],canaryState:"success",fanoutSettled:Boolean(attempt.fanoutBatchId)};if(attempts.successful.has(attempt.canaryWorkflowLane))return{remaining,inFlight,canaryState:"success",fanoutSettled:attempt.fanoutBatchId?batchIsTerminal(directory,state2,attempt.fanoutBatchId):!1};let canaryRecords=batchLaneRecords(directory,state2,attempt.canaryBatchId,attempt.canaryLaneId);if(canaryRecords.length>0&&canaryRecords.every((record3)=>TERMINAL_FAILED_DELEGATION_STATUSES2.has(record3.status)))return{remaining,inFlight,canaryState:"failed",fanoutSettled:!1};let admittedAtMs=Date.parse(attempt.admittedAt);if(Number.isFinite(admittedAtMs)&&_test_exports2.nowMs()-admittedAtMs<policy.canaryProbeMs)return{remaining,inFlight,canaryState:"waiting",reason:"canary probe horizon has not elapsed yet",fanoutSettled:!1};let probe2=await probeResilienceCanaryLiveness(directory,canaryRecords,policy.statusProbeTimeoutMs);if(probe2.live)return{remaining,inFlight,canaryState:"live",fanoutSettled:!1};return{remaining,inFlight,canaryState:"waiting",reason:probe2.reason,fanoutSettled:!1}}function unresolvedPrReviewBaseDimensions(attempts){return PR_REVIEW_BASE_DIMENSION_IDS.filter((dimension)=>!attempts.successful.has(dimension)&&!attempts.inFlight.has(dimension))}async function enforcePrReviewBaseDimensions(directory,sessionID,lanes,options){let normalizedSessionID=normalizeSessionID(sessionID);return withPrWorkflowCheckoutMutationLock(directory,async()=>withSessionStateMutation(directory,normalizedSessionID,async()=>enforcePrReviewBaseDimensionsWhileLocked(directory,normalizedSessionID,lanes,options)))}async function enforcePrReviewBaseDimensionsWhileLocked(directory,normalizedSessionID,lanes,options){let state2=await bindPrWorkflowHeadWhileLocked(directory,normalizedSessionID,options.prHeadSha);if(state2.mode!=="PR_REVIEW")throw wrongModeError(state2,"PR_REVIEW");let normalizedLanes=normalizeWorkflowLanes(lanes),claimedDimensionIds=declaredBaseDimensions(normalizedLanes);if(claimedDimensionIds.filter((laneId)=>!PR_REVIEW_BASE_DIMENSION_IDS.includes(laneId)).length>0){let expected=PR_REVIEW_BASE_DIMENSION_IDS.join(", "),received=claimedDimensionIds.join(", ")||"(none)";throw Error(`BLOCKED: PR_REVIEW base dispatch lane ids must be drawn from: ${expected}. Received: ${received}`)}if((state2.prReviewDepthTier??"L")==="L"&&normalizedLanes.some((lane)=>(lane.ownedWorkflowLanes?.length??1)!==1)){let rejection=await tierLConsolidationRejection(directory,state2,normalizedLanes,options.revisionDigest);if(rejection)throw Error(`BLOCKED: PR_REVIEW base dispatch at depth tier L requires one dedicated lane per dimension; consolidated owned_workflow_lanes are allowed only at tiers S and M, or on a retry batch that satisfies all five of: (1) every consolidated dimension already has a recorded lane that reached a terminal non-successful state; (2) no consolidated dimension already has a successful source; (3) no single lane owns all ${PR_REVIEW_BASE_DIMENSION_IDS.length} dimensions; (4) a batch claiming all ${PR_REVIEW_BASE_DIMENSION_IDS.length} dimensions uses at least ${PR_REVIEW_BASE_LANE_FLOORS.L} lanes; and (5) across every recorded base batch the six dimensions stay backed by at least ${PR_REVIEW_TIER_L_CONSOLIDATED_LANE_FLOOR} distinct lanes, counting each dimension no consolidated lane claims as one plus the FEWEST declared consolidated lanes that suffice to cover every dimension consolidated lanes do claim. Clause 5 is cumulative over every base batch this wave recorded, including batches the `+"capacity GC has since dropped, and it counts a minimum cover rather than declarations — so "+"neither splitting one consolidation across several batches nor declaring overlapping or duplicate consolidations evades it. "+rejection)}let batchId=normalizeBatchId(options.batchId),previous=state2.prReviewBaseDispatches??[];if(previous.some((record4)=>record4.batchId===batchId))throw Error(`BLOCKED: PR_REVIEW base batch id "${batchId}" is already recorded`);let depthTier=state2.prReviewDepthTier??"L",requestedContractRetry=options.prReviewContractRetry===!0,requestedWaveStage=options.prReviewWaveStage,requestedWaveAttempt=options.prReviewWaveAttempt;if(requestedContractRetry&&(requestedWaveStage!==void 0||requestedWaveAttempt!==void 0))throw Error("BLOCKED: PR_REVIEW contract retry is mutually exclusive with pr_review_wave_stage and pr_review_wave_attempt");if(requestedWaveStage===void 0!==(requestedWaveAttempt===void 0))throw Error("BLOCKED: PR_REVIEW staged base dispatch requires both pr_review_wave_stage and pr_review_wave_attempt together");let resiliencePolicy=effectivePrReviewResiliencePolicy(state2,options.prReviewResiliencePolicy),liveResilienceEnabled=options.prReviewResiliencePolicy?.enabled??DEFAULT_PR_REVIEW_RESILIENCE_CONFIG.enabled;if(previous.length>=MAX_WORKFLOW_BATCHES&&requestedWaveStage!==void 0&&requestedWaveAttempt!==void 0&&depthTier!=="S"&&liveResilienceEnabled)({state:state2,previous}=await preflightPrReviewResilienceCircuitBeforePrune(directory,state2,previous,resiliencePolicy,liveResilienceEnabled));if(previous.length>=MAX_WORKFLOW_BATCHES){if(state2=await prunePrWorkflowBatchesForCapacity(directory,state2,options.revisionDigest),previous=state2.prReviewBaseDispatches??[],previous.length>=MAX_WORKFLOW_BATCHES)throw Error("BLOCKED: PR_REVIEW base batch limit reached")}let nextResilience=state2.prReviewResilience;if(!nextResilience){if(nextResilience={policy:resiliencePolicy,attempts:[]},previous.length>0)state2=await writeStateWhileLocked(directory,{...state2,updatedAt:isoNow(),prReviewResilience:nextResilience}),previous=state2.prReviewBaseDispatches??[]}if(nextResilience&&(!liveResilienceEnabled||nextResilience.policy.enabled===!1)){let configEvent={type:"resilience_config_changed",enabled:liveResilienceEnabled,policy:liveResilienceEnabled?options.prReviewResiliencePolicy:void 0,nowMs:_test_exports2.nowMs()},outcome=reducePrReviewEvent(state2,configEvent);if(outcome.status==="applied"&&outcome.effects.some((effect)=>effect.kind==="persist_state"))state2=await writeStateWhileLocked(directory,{...outcome.state,updatedAt:isoNow()}),previous=state2.prReviewBaseDispatches??[],nextResilience=state2.prReviewResilience??nextResilience}if(liveResilienceEnabled&&depthTier!=="S"&&requestedWaveStage===void 0&&!requestedContractRetry)throw Error("BLOCKED: PR_REVIEW base dispatch at depth tier M or L requires canary-first staged admission while pr_review_resilience is enabled");if(requestedWaveStage!==void 0&&requestedWaveAttempt!==void 0){if(depthTier==="S"||!liveResilienceEnabled)throw Error("BLOCKED: staged PR_REVIEW base dispatch is valid only when pr_review_resilience is enabled at depth tier M or L");let revisionDigest=options.revisionDigest;if(!revisionDigest)revisionDigest=(await createPrReviewGateContext2(directory,state2)).revisionDigest;let snapshot=nextResilience??{policy:resiliencePolicy,attempts:[]},pendingProbeCircuit;if(liveResilienceEnabled){let outcome=await advanceResilienceCircuitWhileLocked({directory,state:state2,snapshot,admission:{batchId,laneId:normalizedLanes[0]?.laneId??""}});if(state2=outcome.state,snapshot=outcome.snapshot,nextResilience=outcome.snapshot,pendingProbeCircuit=outcome.pendingProbeCircuit,outcome.blocked)throw new PrReviewResilienceCircuitOpenError(formatPrReviewResilienceCircuitOpenMessage(outcome.snapshot.circuit))}let lastAttempt=snapshot.attempts.at(-1);if(requestedWaveStage==="canary"){let target=[...PR_REVIEW_BASE_DIMENSION_IDS],expectedAttempt=0,globalInFlight=[];if(lastAttempt){let globalAttempts=summarizePrReviewBaseDimensionAttempts(directory,state2,revisionDigest);globalInFlight=PR_REVIEW_BASE_DIMENSION_IDS.filter((dimension)=>globalAttempts.inFlight.has(dimension));let globalTarget=unresolvedPrReviewBaseDimensions(globalAttempts),evaluated=await evaluatePrReviewResilienceAttempt(directory,state2,lastAttempt,revisionDigest,snapshot.policy);if(!lastAttempt.fanoutBatchId)if(evaluated.canaryState==="success"){if(evaluated.remaining.length>0)throw Error(`BLOCKED: PR_REVIEW base attempt ${lastAttempt.attempt} requires its fanout batch before a later retry attempt`);if(globalTarget.length===0)throw new PrReviewResilienceRetryExhaustedError("BLOCKED: PR_REVIEW base dispatch has no unresolved obligations remaining");target=[...globalTarget]}else{if(evaluated.canaryState==="live")throw Error(`BLOCKED: PR_REVIEW base attempt ${lastAttempt.attempt} canary is still live; fanout is the next admissible stage`);if(evaluated.canaryState==="waiting")throw Error(`BLOCKED: PR_REVIEW base attempt ${lastAttempt.attempt} canary is not yet proven successful or live: ${evaluated.reason??"probe failed closed"}`);target=[...globalTarget]}else{if(!batchIsTerminal(directory,state2,lastAttempt.fanoutBatchId))throw Error(`BLOCKED: PR_REVIEW base attempt ${lastAttempt.attempt} fanout is still in flight`);target=[...globalTarget]}expectedAttempt=lastAttempt.attempt+1}else if(previous.length>0){let globalAttempts=summarizePrReviewBaseDimensionAttempts(directory,state2,revisionDigest);globalInFlight=PR_REVIEW_BASE_DIMENSION_IDS.filter((dimension)=>globalAttempts.inFlight.has(dimension)),target=unresolvedPrReviewBaseDimensions(globalAttempts)}if(target.length===0){if(globalInFlight.length>0)throw Error(lastAttempt?`BLOCKED: PR_REVIEW base attempt ${lastAttempt.attempt} still has in-flight obligations that cannot be retried yet: ${globalInFlight.join(", ")}`:`BLOCKED: PR_REVIEW base still has in-flight obligations that cannot be retried yet: ${globalInFlight.join(", ")}`);throw new PrReviewResilienceRetryExhaustedError("BLOCKED: PR_REVIEW base dispatch has no unresolved obligations remaining")}if(requestedWaveAttempt!==expectedAttempt||requestedWaveAttempt>snapshot.policy.maxRetryAttemptsAfterInitial)throw new PrReviewResilienceRetryExhaustedError(`BLOCKED: PR_REVIEW base allows attempt 0 plus at most ${snapshot.policy.maxRetryAttemptsAfterInitial} retry attempts`);if(normalizedLanes.length!==1||(normalizedLanes[0]?.ownedWorkflowLanes?.length??1)!==1)throw Error("BLOCKED: PR_REVIEW staged canary dispatch requires exactly one singleton base lane");let canaryDimension=normalizedLanes[0].workflowLane;if(!target.includes(canaryDimension))throw Error(`BLOCKED: PR_REVIEW canary lane must target one unresolved base obligation from: ${target.join(", ")}`);nextResilience={policy:snapshot.policy,attempts:[...snapshot.attempts,{attempt:requestedWaveAttempt,targetDimensions:target,canaryBatchId:batchId,canaryLaneId:normalizedLanes[0].laneId,canaryWorkflowLane:canaryDimension,admittedAt:isoNow()}],...pendingProbeCircuit??snapshot.circuit?{circuit:pendingProbeCircuit??snapshot.circuit}:{}}}else{if(!lastAttempt||lastAttempt.attempt!==requestedWaveAttempt||lastAttempt.fanoutBatchId)throw Error(`BLOCKED: PR_REVIEW base fanout must follow the recorded canary for attempt ${requestedWaveAttempt}`);let evaluated=await evaluatePrReviewResilienceAttempt(directory,state2,lastAttempt,revisionDigest,snapshot.policy);if(evaluated.canaryState==="failed")throw Error(`BLOCKED: PR_REVIEW base attempt ${requestedWaveAttempt} canary failed; close the attempt and carry the unresolved target into the next retry`);if(evaluated.canaryState==="waiting")throw Error(`BLOCKED: PR_REVIEW base attempt ${requestedWaveAttempt} canary is not yet proven successful or live: ${evaluated.reason??"probe failed closed"}`);let remainingTarget=lastAttempt.targetDimensions.filter((dimension)=>dimension!==lastAttempt.canaryWorkflowLane&&evaluated.remaining.includes(dimension));if(remainingTarget.length===0)throw Error(`BLOCKED: PR_REVIEW base attempt ${requestedWaveAttempt} has no remaining unresolved obligations for fanout`);if(!exactDimensionPartition(declaredBaseDimensions(normalizedLanes),remainingTarget))throw Error(`BLOCKED: PR_REVIEW base fanout must partition the remaining unresolved obligations exactly once: ${remainingTarget.join(", ")}`);if(requestedWaveAttempt===0){let combinedDimensions=[lastAttempt.canaryWorkflowLane,...declaredBaseDimensions(normalizedLanes)];if(!exactDimensionPartition(combinedDimensions,lastAttempt.targetDimensions))throw Error("BLOCKED: PR_REVIEW base attempt 0 canary plus fanout must partition all six base dimensions exactly once");if(depthTier==="M"&&normalizedLanes.length+1<PR_REVIEW_BASE_LANE_FLOORS.M)throw Error(`BLOCKED: PR_REVIEW base attempt 0 at depth tier M requires at least ${PR_REVIEW_BASE_LANE_FLOORS.M} combined canary+fanout lanes`);if(depthTier==="L"&&(normalizedLanes.length+1!==PR_REVIEW_BASE_DIMENSION_IDS.length||normalizedLanes.some((lane)=>(lane.ownedWorkflowLanes?.length??1)!==1)))throw Error("BLOCKED: PR_REVIEW base attempt 0 at depth tier L requires six singleton combined canary+fanout lanes")}nextResilience={...snapshot,attempts:[...snapshot.attempts.slice(0,-1),{...lastAttempt,fanoutBatchId:batchId}]}}}if(requestedContractRetry){let revisionDigest=options.revisionDigest??(await createPrReviewGateContext2(directory,state2)).revisionDigest,attempts=summarizePrReviewBaseDimensionAttempts(directory,state2,revisionDigest);if(normalizedLanes.length!==1||(normalizedLanes[0]?.ownedWorkflowLanes?.length??1)!==1)throw Error("BLOCKED: PR_REVIEW contract retry requires exactly one singleton lane");let contractedDimension=declaredBaseDimensions(normalizedLanes)[0]??normalizedLanes[0].workflowLane;if(attempts.successful.has(contractedDimension))throw Error(`BLOCKED: PR_REVIEW contract retry cannot target already-successful dimension "${contractedDimension}"`);if(attempts.inFlight.has(contractedDimension))throw Error(`BLOCKED: PR_REVIEW contract retry cannot target in-flight dimension "${contractedDimension}"`);if(!attempts.contractFailed.has(contractedDimension))throw Error(`BLOCKED: PR_REVIEW contract retry requires a recorded terminal contract failure for dimension "${contractedDimension}"`);if(attempts.contractRetried.has(contractedDimension))throw Error(`BLOCKED: PR_REVIEW contract retry for dimension "${contractedDimension}" was already admitted`)}let record3={batchId,lanes:normalizedLanes.map((lane)=>({laneId:lane.laneId,workflowLane:lane.workflowLane,...lane.ownedWorkflowLanes?{ownedWorkflowLanes:lane.ownedWorkflowLanes}:{}})),validatedAt:isoNow()},admissionOutcome=reducePrReviewEvent(state2,{type:"base_admission_requested",batchId,lanes:record3.lanes,maxBatches:MAX_WORKFLOW_BATCHES,validatedAt:record3.validatedAt});if(admissionOutcome.status==="rejected")throw Error("BLOCKED: PR_REVIEW base batch limit reached");let nextState={...admissionOutcome.state,updatedAt:isoNow(),...requestedContractRetry?{prReviewContractRetryDimensions:[...state2.prReviewContractRetryDimensions??[],declaredBaseDimensions(normalizedLanes)[0]]}:{},...nextResilience?{prReviewResilience:nextResilience}:{}};return writeStateWhileLocked(directory,nextState)}async function rollbackPrReviewBaseAdmissionIfUnlaunched(directory,sessionID,batchId,contractRetry=!1){let normalizedSessionID=normalizeSessionID(sessionID),normalizedBatchId=normalizeBatchId(batchId);return withPrWorkflowCheckoutMutationLock(directory,async()=>withSessionStateMutation(directory,normalizedSessionID,async()=>{let state2=await readPrWorkflowGateState(directory,normalizedSessionID);if(!state2||state2.mode!=="PR_REVIEW")return!1;let batchRead=findByBatchIdDetailed(directory,normalizedBatchId,{parentSessionId:normalizedSessionID});if(batchRead.status==="uncertain")return warnDelegationReadUncertainOnce("base admission rollback existence guard",batchRead),!1;let batchRecords=batchRead.value,rollbackOutcome=reducePrReviewEvent(state2,{type:"base_admission_rolled_back",batchId:normalizedBatchId,batchDelegationRecordsExist:batchRecords.length>0});if(rollbackOutcome.status==="rejected")return!1;let rollbackState=rollbackOutcome.state,currentBaseDispatches=state2.prReviewBaseDispatches??[],nextBaseDispatches=rollbackState.prReviewBaseDispatches??[],rolledBackDimensions=new Set(currentBaseDispatches.at(-1)?.lanes.flatMap((lane)=>lane.ownedWorkflowLanes?.length?lane.ownedWorkflowLanes:[lane.workflowLane])??[]),nextContractRetryDimensions=contractRetry?(state2.prReviewContractRetryDimensions??[]).filter((dimension)=>!rolledBackDimensions.has(dimension)):state2.prReviewContractRetryDimensions,lastAttempt=state2.prReviewResilience?.attempts.at(-1),nextResilience=rollbackState.prReviewResilience;if(lastAttempt?.canaryBatchId===normalizedBatchId)nextResilience=nextResilience?{...nextResilience,attempts:nextResilience.attempts.slice(0,-1)}:nextResilience;else if(lastAttempt?.fanoutBatchId===normalizedBatchId)nextResilience=nextResilience?{...nextResilience,attempts:[...nextResilience.attempts.slice(0,-1),{...lastAttempt,fanoutBatchId:void 0}]}:nextResilience;let rolledBackCircuit=nextResilience?.circuit;if(rolledBackCircuit&&"version"in rolledBackCircuit&&rolledBackCircuit.state==="HALF_OPEN"&&rolledBackCircuit.probe?.batchId===normalizedBatchId){let probeOutcome=reducePrReviewEvent({...rollbackState,prReviewResilience:nextResilience},{type:"circuit_probe_settled",outcome:{result:"rolled_back_admission"},nowMs:_test_exports2.nowMs(),policy:{...nextResilience?.policy??snapshotPrReviewResiliencePolicy(),circuitOpenDurationMs:circuitOpenDurationMs(nextResilience?.policy??snapshotPrReviewResiliencePolicy())}});if(probeOutcome.status==="applied")nextResilience=probeOutcome.state.prReviewResilience??nextResilience}let shouldKeepResilience=nextBaseDispatches.length>0&&Boolean(nextResilience?.policy)||Boolean(nextResilience?.circuit)||(nextResilience?.attempts.length??0)>0;return await writeStateWhileLocked(directory,{...state2,updatedAt:isoNow(),prReviewBaseDispatches:nextBaseDispatches,...nextBaseDispatches.length>0?{prReviewBaseDispatch:nextBaseDispatches.at(-1)}:{prReviewBaseDispatch:void 0},...shouldKeepResilience?{prReviewResilience:nextResilience}:{prReviewResilience:void 0},...nextContractRetryDimensions?.length?{prReviewContractRetryDimensions:nextContractRetryDimensions}:{prReviewContractRetryDimensions:void 0}}),!0}))}function encodeConsolidatedLaneKey(owned){return[...new Set(owned)].sort().join("|")}function decodeConsolidatedLaneKey(key2){return key2.split("|").filter((dimension)=>dimension.length>0)}function minimumConsolidatedLaneCover(sets){let bitOf=new Map;for(let set3 of sets)for(let dimension of set3)if(!bitOf.has(dimension))bitOf.set(dimension,bitOf.size);let universeSize=bitOf.size;if(universeSize===0)return 0;let distinctMasks=new Set,largestSetSize=1;for(let set3 of sets){let mask=0,size=0;for(let dimension of set3){let bit=1<<bitOf.get(dimension);if((mask&bit)===0)size+=1;mask|=bit}if(mask===0)continue;distinctMasks.add(mask),largestSetSize=Math.max(largestSetSize,size)}if(universeSize>MAX_COVER_UNIVERSE_BITS)return Math.ceil(universeSize/largestSetSize);let full=(1<<universeSize)-1,unreachable=universeSize+1,best=Array(full+1).fill(unreachable);best[0]=0;for(let mask=0;mask<full;mask+=1){let steps=best[mask];if(steps===unreachable)continue;for(let setMask of distinctMasks){let next=mask|setMask;if(next===mask)continue;if(best[next]>steps+1)best[next]=steps+1}}return best[full]}function tierLBackingLaneCount(state2,normalizedLanes,dedicatedSuccessful){let consolidatedDimensions=new Set,consolidatedSets=[],consider=(owned,allowSupersede)=>{let declared=owned.filter((dimension)=>Boolean(dimension));if(declared.length<2)return;let live=allowSupersede?declared.filter((dimension)=>!dedicatedSuccessful.has(dimension)):declared;if(live.length===0)return;consolidatedSets.push([...new Set(live)]);for(let dimension of live)consolidatedDimensions.add(dimension)},considerLane=(lane,allowSupersede)=>consider(lane.ownedWorkflowLanes?.length?lane.ownedWorkflowLanes:[lane.workflowLane],allowSupersede);for(let batch of state2.prReviewBaseDispatches??[])for(let lane of batch.lanes)considerLane(lane,!0);for(let key2 of state2.prReviewRetiredConsolidatedLanes??[])consider(decodeConsolidatedLaneKey(key2),!0);for(let lane of normalizedLanes)considerLane(lane,!1);return{backingLanes:PR_REVIEW_BASE_DIMENSION_IDS.filter((dimension)=>!consolidatedDimensions.has(dimension)).length+minimumConsolidatedLaneCover(consolidatedSets),consolidatedDimensions:[...consolidatedDimensions]}}async function tierLConsolidationRejection(directory,state2,normalizedLanes,revisionDigest){if((state2.prReviewBaseDispatches?.length??0)===0)return"This is the initial base wave, which may never consolidate at tier L.";let dimensionCount=PR_REVIEW_BASE_DIMENSION_IDS.length,consolidatedLanes=normalizedLanes.filter((lane)=>(lane.ownedWorkflowLanes?.length??1)!==1),wholeWaveLane=consolidatedLanes.find((lane)=>(lane.ownedWorkflowLanes?.length??1)>=dimensionCount);if(wholeWaveLane)return`Lane "${wholeWaveLane.laneId}" owns all ${dimensionCount} dimensions on its own.`;if(new Set(normalizedLanes.flatMap((lane)=>lane.ownedWorkflowLanes??[lane.workflowLane])).size>=dimensionCount&&normalizedLanes.length<PR_REVIEW_BASE_LANE_FLOORS.L)return`This batch claims all ${dimensionCount} dimensions with only ${normalizedLanes.length} lanes.`;let digest3=revisionDigest;if(!digest3)digest3=(await createPrReviewGateContext2(directory,state2)).revisionDigest;let attempts=summarizePrReviewBaseDimensionAttempts(directory,state2,digest3),consolidatedDimensions=[...new Set(consolidatedLanes.flatMap((lane)=>lane.ownedWorkflowLanes??[lane.workflowLane]))].filter((dimension)=>Boolean(dimension)),alreadySuccessful=consolidatedDimensions.filter((dimension)=>attempts.successful.has(dimension));if(alreadySuccessful.length>0)return`These consolidated dimensions already have a successful source: ${alreadySuccessful.join(", ")}.`;let notTerminallyFailed=consolidatedDimensions.filter((dimension)=>!attempts.terminallyFailed.has(dimension));if(notTerminallyFailed.length>0)return`These consolidated dimensions have no recorded lane that reached a terminal non-successful state (never dispatched, still in flight, or awaiting ingestion): ${notTerminallyFailed.join(", ")}.`;let backing=tierLBackingLaneCount(state2,normalizedLanes,attempts.dedicatedSuccessful);if(backing.backingLanes<PR_REVIEW_TIER_L_CONSOLIDATED_LANE_FLOOR)return`Across every base batch this wave would be backed by only ${backing.backingLanes} distinct lanes (each dimension no consolidated lane claims counts as one, plus the fewest declared consolidated lanes that cover the rest), and dimensions ${backing.consolidatedDimensions.join(", ")} would be covered by consolidated lanes.`;return null}async function prunePrWorkflowBatchesForCapacity(directory,state2,revisionDigest){try{let digest3=revisionDigest??(await createPrReviewGateContext2(directory,state2)).revisionDigest,before={candidate:derivePrReviewCandidateInventory2(directory,state2,{revisionDigest:digest3}),critic:derivePrReviewCriticInventory2(directory,state2,{revisionDigest:digest3})},pruned=pruneWorkflowBatches(directory,state2,digest3);if(!pruned)return state2;let after={candidate:derivePrReviewCandidateInventory2(directory,pruned,{revisionDigest:digest3}),critic:derivePrReviewCriticInventory2(directory,pruned,{revisionDigest:digest3})};if(!sameStringSet(before.candidate,after.candidate)||!sameStringSet(before.critic,after.critic))return warn("PR_REVIEW batch GC aborted: pruning would have changed the derived inventory; every batch was kept"),state2;let survivingBaseIds=new Set((pruned.prReviewBaseDispatches??[]).map((batch)=>batch.batchId));if(state2.prReviewBaseDispatch&&!survivingBaseIds.has(state2.prReviewBaseDispatch.batchId))return warn("PR_REVIEW batch GC aborted: the latest base dispatch pointer would have been orphaned"),state2;return pruned}catch(error93){return warn(`PR_REVIEW batch GC aborted: ${error93 instanceof Error?error93.message:String(error93)}`),state2}}function pruneWorkflowBatches(directory,state2,revisionDigest){let baseBatches=state2.prReviewBaseDispatches??[],validationBatches=state2.prReviewValidationBatches??[],ctx={revisionDigest},contributingBaseBatchIds=new Set;for(let batch of baseBatches){let successful2=successfulObligationsFromExactBatch2(directory,state2,batch.batchId,batch.lanes,"swarm-pr-review:base",batch.validatedAt,!0,new Set,revisionDigest);if(batch.lanes.some((lane)=>((lane.ownedWorkflowLanes?.length)?lane.ownedWorkflowLanes:[lane.workflowLane]).every((dimension)=>successful2.has(dimension))))contributingBaseBatchIds.add(batch.batchId)}let newestBaseBatchId=baseBatches.at(-1)?.batchId,survivingBase=baseBatches.filter((batch)=>batch.batchId===newestBaseBatchId||contributingBaseBatchIds.has(batch.batchId)),newestBatchIdByPhase=new Map;for(let batch of validationBatches)newestBatchIdByPhase.set(batch.phase,batch.batchId);let contributingReviewerBatchIds=new Set(composePrReviewPhaseVerdicts(directory,state2,"reviewer",ctx,!0).contributingBatchIds),survivingValidation=validationBatches.filter((batch)=>{if(batch.phase==="council"||batch.phase==="critic")return!0;if(newestBatchIdByPhase.get(batch.phase)===batch.batchId)return!0;return contributingReviewerBatchIds.has(batch.batchId)});if(survivingBase.length===baseBatches.length&&survivingValidation.length===validationBatches.length)return null;let survivingValidationIds=new Set(survivingValidation.map((batch)=>batch.batchId)),retiredReviewerSessionIds=new Set(state2.prReviewRetiredReviewerSessionIds??[]);for(let batch of validationBatches){if(batch.phase!=="reviewer")continue;if(survivingValidationIds.has(batch.batchId))continue;let batchRead=findByBatchIdDetailed(directory,batch.batchId,{parentSessionId:state2.sessionID});if(batchRead.status==="uncertain")return warnDelegationReadUncertainOnce("retired-reviewer session collection",batchRead),null;for(let record3 of batchRead.value){let subagentSessionId=record3.subagentSessionId?.trim();if(subagentSessionId)retiredReviewerSessionIds.add(subagentSessionId)}}if(retiredReviewerSessionIds.size>MAX_RETIRED_REVIEWER_SESSION_IDS)return warn("PR_REVIEW batch GC aborted: retiring these reviewer batches would overflow the forbidden child-session ledger; every batch was kept"),null;let survivingBaseIds=new Set(survivingBase.map((batch)=>batch.batchId)),retiredConsolidatedLanes=new Set(state2.prReviewRetiredConsolidatedLanes??[]);for(let batch of baseBatches){if(survivingBaseIds.has(batch.batchId))continue;for(let lane of batch.lanes){let owned=lane.ownedWorkflowLanes?.length?lane.ownedWorkflowLanes:[lane.workflowLane];if(new Set(owned).size<2)continue;retiredConsolidatedLanes.add(encodeConsolidatedLaneKey(owned))}}if(retiredConsolidatedLanes.size>MAX_RETIRED_CONSOLIDATED_LANES)return warn("PR_REVIEW batch GC aborted: retiring these base batches would overflow the retired consolidated-lane ledger; every batch was kept"),null;let survivingBatchIds=new Set([...survivingBaseIds,...survivingValidationIds]),coherence=Object.fromEntries(Object.entries(state2.prReviewBatchCoherence??{}).filter(([batchId])=>survivingBatchIds.has(batchId)));return{...state2,...state2.prReviewBaseDispatches?{prReviewBaseDispatches:survivingBase}:{},...state2.prReviewValidationBatches?{prReviewValidationBatches:survivingValidation}:{},prReviewBatchCoherence:Object.keys(coherence).length>0?coherence:void 0,prReviewRetiredReviewerSessionIds:retiredReviewerSessionIds.size>0?[...retiredReviewerSessionIds]:void 0,prReviewRetiredConsolidatedLanes:retiredConsolidatedLanes.size>0?[...retiredConsolidatedLanes]:void 0}}async function admitPrReviewPartialBaseCoverage2(directory,sessionID,runId,unresolvedDimensions){return await admitPrReviewPartialBaseCoverage(directory,sessionID,runId,unresolvedDimensions)}async function assertPrReviewBaseCoverageSettled2(directory,sessionID,gateContext){let settled=await assertPrReviewBaseCoverageSettled(directory,sessionID,gateContext);return{state:settled.state,settlement:settled.settlement}}async function recordPrReviewMicroFamilyDispatch(directory,sessionID,lanes,options){let state2=await bindPrWorkflowHead(directory,sessionID,options.prHeadSha);if(state2.mode!=="PR_REVIEW")throw wrongModeError(state2,"PR_REVIEW");let batchId=normalizeBatchId(options.batchId),previous=state2.prReviewMicroFamilyDispatches??[];if(previous.some((record4)=>record4.batchId===batchId))return state2;if(previous.length>=MAX_WORKFLOW_BATCHES)throw Error(`BLOCKED: PR_REVIEW micro-family dispatch ledger limit reached (${MAX_WORKFLOW_BATCHES} recorded acknowledgments). Nothing was appended and no lane was launched, so re-issuing this dispatch call is safe once the ledger has room. A healthy run records at most ~33 acknowledgments (11 families x initial dispatch + 2 retries), so reaching the cap indicates a dispatch loop. Recovery: let the active workflow settle or restart with abort_pr_workflow (kind "recovery").`);let record3={batchId,prHeadSha:options.prHeadSha,lanes:normalizeWorkflowLanes(lanes).map((lane)=>({laneId:lane.laneId,workflowLane:lane.workflowLane,...lane.ownedWorkflowLanes?.length?{ownedWorkflowLanes:lane.ownedWorkflowLanes}:{}})),admittedAt:isoNow()},nextState={...state2,updatedAt:isoNow(),prReviewMicroFamilyDispatches:[...previous,record3]};return await persistState2(directory,nextState),nextState}async function recordPrReviewValidationBatch(directory,sessionID,phase,lanes,options){let state2=await bindPrWorkflowHead(directory,sessionID,options.prHeadSha);if(state2.mode!=="PR_REVIEW")throw wrongModeError(state2,"PR_REVIEW");if(!state2.prReviewTriggerEvalPath)throw Error("BLOCKED: PR_REVIEW validation dispatch requires a completed trigger evaluation");let ctx=await createPrReviewGateContext2(directory,state2);if(phase==="reviewer"&&(state2.prReviewValidationBatches??[]).some((batch)=>batch.phase==="council"))state2=await assertPrReviewValidationSettled(directory,sessionID,"council",ctx);else if(phase==="critic")state2=await assertPrReviewValidationSettled(directory,sessionID,"reviewer",ctx);ctx={revisionDigest:ctx.revisionDigest};let normalizedLanes=normalizeWorkflowLanes(lanes);if((phase==="reviewer"||phase==="critic")&&normalizedLanes.some((lane)=>!lane.reviewItemIds?.length))throw Error(`BLOCKED: PR_REVIEW ${phase} lanes require non-empty review_item_ids ownership`);let validatedInventory;if(phase==="reviewer"||phase==="critic"){assertNoDuplicates(normalizedLanes.flatMap((lane)=>lane.reviewItemIds??[]),`PR_REVIEW ${phase} review item ownership`);let assigned=normalizedLanes.flatMap((lane)=>lane.reviewItemIds??[]);validatedInventory=phase==="reviewer"?derivePrReviewCandidateInventory2(directory,state2,ctx):derivePrReviewCriticInventory2(directory,state2,ctx),assertStringSetSubset(assigned,validatedInventory,`PR_REVIEW ${phase} ownership`)}let batchId=normalizeBatchId(options.batchId),previous=state2.prReviewValidationBatches??[];if(previous.some((batch)=>batch.batchId===batchId))throw Error(`BLOCKED: PR_REVIEW validation batch id "${batchId}" is already recorded`);if(previous.length>=MAX_WORKFLOW_BATCHES){if(state2=await prunePrWorkflowBatchesForCapacity(directory,state2,ctx.revisionDigest),previous=state2.prReviewValidationBatches??[],previous.length>=MAX_WORKFLOW_BATCHES)throw Error("BLOCKED: PR_REVIEW validation batch limit reached")}let record3={batchId,phase,lanes:normalizedLanes,validatedAt:isoNow()},reviewerItemBindings=phase==="critic"?criticReviewerItemBindings(directory,state2,normalizedLanes,ctx):void 0,retained=phase==="reviewer"?previous.filter((batch)=>batch.phase!=="critic"||Boolean(state2.prReviewBatchCoherence?.[batch.batchId]?.reviewerItemBindings)):previous,retainedIds=new Set(retained.map((batch)=>batch.batchId)),coherence=Object.fromEntries(Object.entries(state2.prReviewBatchCoherence??{}).filter(([id])=>retainedIds.has(id)));if(validatedInventory)coherence[batchId]={validatedInventory,...reviewerItemBindings?{reviewerItemBindings,reviewerItemBindingKeyEncoding:"prefixed-v1"}:{}};let nextState={...state2,updatedAt:isoNow(),prReviewValidationBatches:[...retained,record3],prReviewBatchCoherence:Object.keys(coherence).length>0?coherence:void 0};return await persistState2(directory,nextState),nextState}async function assertPrReviewValidationSettled(directory,sessionID,phase,gateContext){let state2=await requireBoundState2(directory,sessionID,"PR_REVIEW"),ctx=gateContext??await createPrReviewGateContext2(directory,state2),declaredPhases=new Set((state2.prReviewValidationBatches??[]).map((batch)=>batch.phase)),phases=phase?[phase]:["council","reviewer","critic"].filter((candidate)=>declaredPhases.has(candidate));for(let requiredPhase of phases){let validationBatches=state2.prReviewValidationBatches??[],batches=requiredPhase==="council"?validationBatches.filter((batch)=>batch.phase==="council"):prReviewPhaseWindow2(state2,requiredPhase);if(batches.length===0)throw Error(requiredPhase==="reviewer"&&declaredPhases.has("council")?"BLOCKED: PR_REVIEW requires at least one reviewer batch after the latest council batch":`BLOCKED: PR_REVIEW requires at least one ${requiredPhase} batch`);if(requiredPhase==="council"){let settled=new Set;for(let batch of batches)for(let obligation of successfulObligationsFromExactBatch2(directory,state2,batch.batchId,batch.lanes,"swarm-pr-review:council",batch.validatedAt,!0,new Set,ctx.revisionDigest))settled.add(obligation);let missing=[...new Set(batches.flatMap((batch)=>batch.lanes.map((lane)=>lane.workflowLane)))].filter((obligation)=>!settled.has(obligation));if(missing.length>0)throw Error(`BLOCKED: PR_REVIEW council obligations lack successful exact artifacts: ${missing.join(", ")}`);continue}let composed=composePrReviewPhaseVerdicts(directory,state2,requiredPhase,ctx);if(composed.unclaimed.length>0){let named=composed.unclaimed.slice(0,MAX_UNCLAIMED_ITEMS_IN_MESSAGE),overflow=composed.unclaimed.length-named.length;throw Error(`BLOCKED: PR_REVIEW ${requiredPhase} items lack an authenticated verdict from any successful lane: ${named.join(", ")}`+(overflow>0?` (+${overflow} more)`:"")+(composed.diagnostics.length>0?`; diagnostics: ${composed.diagnostics.join(" | ")}`:""))}if(assertSettledPhaseHasAuthoritativeVerdicts(requiredPhase,composed,requiredPhase==="reviewer"?deriveLatestPrReviewReviewerVerdicts(directory,state2,ctx):deriveLatestPrReviewCriticVerdicts(directory,state2,ctx),`assertPrReviewValidationSettled(${requiredPhase})`),composed.diagnostics.length>0)warn(`PR_REVIEW ${requiredPhase} settled by composition across batches [${composed.contributingBatchIds.join(", ")}] with abandoned or ineligible lanes`,composed.diagnostics)}return state2}async function declarePrFeedbackInventory(directory,sessionID,inventoryIds,options){let state2=await bindPrWorkflowHead(directory,sessionID,options.prHeadSha);if(state2.mode!=="PR_FEEDBACK")throw wrongModeError(state2,"PR_FEEDBACK");let normalizedInventory=normalizeInventoryIds(inventoryIds),requiredHandoffIds=state2.prFeedbackReviewHandoff?.findingIds??[],inventorySet=new Set(normalizedInventory),missingHandoffIds=requiredHandoffIds.filter((findingId2)=>!inventorySet.has(findingId2));if(missingHandoffIds.length>0)throw Error(`BLOCKED: PR_FEEDBACK inventory must include every continued review finding: ${missingHandoffIds.join(", ")}`);if(state2.prFeedbackInventory){let existing=state2.prFeedbackInventory;if(sameStringArray(existing,normalizedInventory))return state2;let nextIds=new Set(normalizedInventory),droppedIds=existing.filter((itemId)=>!nextIds.has(itemId));if(droppedIds.length>0)throw Error(`BLOCKED: PR_FEEDBACK inventory is append-only after declaration; declared item(s) may not be removed or renamed: ${droppedIds.join(", ")}`);let existingIds=new Set(existing),appendedIds=normalizedInventory.filter((itemId)=>!existingIds.has(itemId));if(appendedIds.length===0)throw Error("BLOCKED: PR_FEEDBACK inventory amendment declared no new items");let previousAmendments=state2.prFeedbackInventoryAmendments??[];if(previousAmendments.length+appendedIds.length>MAX_PR_FEEDBACK_INVENTORY_AMENDMENTS)throw Error(`BLOCKED: PR_FEEDBACK inventory amendment limit reached (${MAX_PR_FEEDBACK_INVENTORY_AMENDMENTS}); the amendment ledger is an audit trail and is never pruned`);let amendedAt=isoNow(),batch=previousAmendments.reduce((highest,amendment)=>Math.max(highest,amendment.batch),0)+1,amendedState={...state2,updatedAt:amendedAt,prFeedbackInventory:normalizedInventory,prFeedbackInventoryAmendments:[...previousAmendments,...appendedIds.map((entry)=>({entry,amendedAt,batch}))],prFeedbackReadyToPublish:void 0},superseded=supersedeLivePublicationInPendingState(amendedState,"inventory-amended");if(await persistState2(directory,superseded.state),superseded.invalidationEvent)appendPublicationEvent(directory,superseded.invalidationEvent);return superseded.state}let nextState={...state2,updatedAt:isoNow(),prFeedbackInventory:normalizedInventory,prFeedbackVerifications:[]};return await persistState2(directory,nextState),nextState}async function prunePrFeedbackVerificationsForCapacity(directory,state2){try{let digest3=await currentPrFeedbackRevisionDigest(directory,state2),batches=state2.prFeedbackVerifications??[],before=prFeedbackCoveredItems(directory,state2,digest3),newestBatchId=batches.at(-1)?.batchId,surviving=batches.filter((batch)=>batch.batchId===newestBatchId||prFeedbackBatchCoveredItems(directory,state2,batch,digest3).size>0);if(surviving.length===batches.length)return state2;let retiredItemOwnership={...state2.prFeedbackRetiredItemOwnership??{}},survivingIds=new Set(surviving.map((batch)=>batch.batchId));for(let batch of batches){if(survivingIds.has(batch.batchId))continue;for(let lane of batch.ownership)for(let itemId of lane.ownedItemIds)retiredItemOwnership[itemId]=lane.laneId}if(Object.keys(retiredItemOwnership).length>MAX_RETIRED_FEEDBACK_ITEM_OWNERS)return warn("PR_FEEDBACK verification GC aborted: retiring these batches would overflow the item-ownership ledger; every batch was kept"),state2;let pruned={...state2,prFeedbackVerifications:surviving,prFeedbackRetiredItemOwnership:Object.keys(retiredItemOwnership).length>0?retiredItemOwnership:void 0},after=prFeedbackCoveredItems(directory,pruned,digest3);if(!sameStringSet([...before],[...after]))return warn("PR_FEEDBACK verification GC aborted: pruning would have changed the covered inventory; every batch was kept"),state2;if(state2.prFeedbackVerification&&!survivingIds.has(state2.prFeedbackVerification.batchId))return warn("PR_FEEDBACK verification GC aborted: the latest verification pointer would have been orphaned"),state2;return pruned}catch(error93){return warn(`PR_FEEDBACK verification GC aborted: ${error93 instanceof Error?error93.message:String(error93)}`),state2}}async function enforcePrFeedbackVerificationOwnership(directory,sessionID,ownership,options){let state2=await bindPrWorkflowHead(directory,sessionID,options.prHeadSha);if(state2.mode!=="PR_FEEDBACK")throw wrongModeError(state2,"PR_FEEDBACK");let inventory=state2.prFeedbackInventory;if(!inventory||inventory.length===0)throw Error(`BLOCKED: PR_FEEDBACK verification for session "${state2.sessionID}" requires a declared feedback inventory before dispatch`);let normalizedOwnership=normalizeOwnership(ownership),inventorySet=new Set(inventory),claimedByItemId=new Map,previous=state2.prFeedbackVerifications??[],batchId=normalizeBatchId(options.batchId);if(previous.some((record4)=>record4.batchId===batchId))throw Error(`BLOCKED: PR_FEEDBACK verification batch id "${batchId}" is already recorded`);if(previous.length>=MAX_WORKFLOW_BATCHES){if(state2=await prunePrFeedbackVerificationsForCapacity(directory,state2),previous=state2.prFeedbackVerifications??[],previous.length>=MAX_WORKFLOW_BATCHES)throw Error("BLOCKED: PR_FEEDBACK verification batch limit reached")}for(let[itemId,laneId]of Object.entries(state2.prFeedbackRetiredItemOwnership??{}))claimedByItemId.set(itemId,laneId);for(let record4 of previous)for(let lane of record4.ownership)for(let itemId of lane.ownedItemIds)claimedByItemId.set(itemId,lane.laneId);for(let lane of normalizedOwnership)for(let itemId of lane.ownedItemIds){if(!inventorySet.has(itemId))throw Error(`BLOCKED: PR_FEEDBACK verification lane "${lane.laneId}" owns undeclared item "${itemId}"`);let previousLane=claimedByItemId.get(itemId);if(previousLane&&previousLane!==lane.laneId)throw Error(`BLOCKED: PR_FEEDBACK verification item "${itemId}" is owned by both "${previousLane}" and "${lane.laneId}"`);claimedByItemId.set(itemId,lane.laneId)}let record3={batchId,ownership:normalizedOwnership,validatedAt:isoNow()},nextState={...state2,updatedAt:isoNow(),prFeedbackVerifications:[...previous,record3],prFeedbackVerification:record3};return await persistState2(directory,nextState),nextState}function prFeedbackBatchCoveredItems(directory,state2,batch,currentDigest){let covered=new Set,successfulLaneIds=successfulObligationsFromExactBatch2(directory,state2,batch.batchId,batch.ownership.map((lane)=>({laneId:lane.laneId,workflowLane:lane.laneId})),"swarm-pr-feedback:verification",batch.validatedAt,!1,new Set,currentDigest);for(let lane of batch.ownership){if(!successfulLaneIds.has(lane.laneId))continue;if(!legacyFeedbackArtifactCoversItems(directory,state2,batch.batchId,lane.laneId,lane.ownedItemIds))continue;for(let itemId of lane.ownedItemIds)covered.add(itemId)}return covered}function prFeedbackCoveredItems(directory,state2,currentDigest){let covered=new Set;for(let batch of state2.prFeedbackVerifications??[])for(let itemId of prFeedbackBatchCoveredItems(directory,state2,batch,currentDigest))covered.add(itemId);return covered}async function assertPrFeedbackVerificationSettledState(directory,state2){if(state2.mode!=="PR_FEEDBACK")throw wrongModeError(state2,"PR_FEEDBACK");let currentDigest=await currentPrFeedbackRevisionDigest(directory,state2),inventory=state2.prFeedbackInventory,batches=state2.prFeedbackVerifications??[];if(!inventory||batches.length===0)throw Error("BLOCKED: PR_FEEDBACK requires an immutable inventory and verification batches");let covered=prFeedbackCoveredItems(directory,state2,currentDigest),missing=inventory.filter((itemId)=>!covered.has(itemId));if(missing.length>0||covered.size!==inventory.length)throw Error(`BLOCKED: PR_FEEDBACK verification ownership is incomplete; missing inventory items: ${missing.join(", ")||"(none)"}`);return currentDigest}async function assertPrFeedbackVerificationSettled(directory,sessionID){let state2=await requireBoundState2(directory,sessionID,"PR_FEEDBACK");return await assertPrFeedbackVerificationSettledState(directory,state2),state2}async function recordPrFeedbackStageA(directory,sessionID,revisionDigest,checks5,options={}){let state2=await assertPrFeedbackVerificationSettled(directory,sessionID),currentDigest=await currentPrFeedbackRevisionDigest(directory,state2);if(revisionDigest!==currentDigest)throw Error("BLOCKED: PR_FEEDBACK Stage A receipt is stale because the working-tree revision changed during validation");if(checks5.length<2||checks5.length>258)throw Error("BLOCKED: PR_FEEDBACK Stage A requires two to 258 controller-created check receipts");let optionalCategoryOrder=["build","typecheck","lint"],applicableCategories=options.applicableCategories??optionalCategoryOrder.filter((category)=>checks5.some((check3)=>check3.category===category));if(assertNoDuplicates(applicableCategories,"PR_FEEDBACK Stage A applicable categories"),applicableCategories.some((category)=>!optionalCategoryOrder.includes(category)))throw Error("BLOCKED: PR_FEEDBACK Stage A applicability may contain only build, typecheck, and lint");let required3=new Set(["diff-check","reproduction",...applicableCategories]),singletonSeen=new Set,applicableObligations=[...options.applicableObligations??[]];assertNoDuplicates(applicableObligations.map(({id})=>id),"PR_FEEDBACK Stage A applicable obligations");let requiredObligationIds=new Set(applicableObligations.map(({id})=>id)),commandDigests=new Set,reproductionFeedbackItemIds=[];for(let check3 of checks5){if(["diff-check","reproduction"].includes(check3.category)&&singletonSeen.has(check3.category))throw Error(`BLOCKED: PR_FEEDBACK Stage A contains duplicate category "${check3.category}"`);if(singletonSeen.add(check3.category),required3.delete(check3.category),check3.obligationId){let obligation=applicableObligations.find((candidate)=>candidate.id===check3.obligationId);if(!obligation||obligation.category!==check3.category||obligation.workingDirectory!==(check3.workingDirectory??".")||!requiredObligationIds.delete(check3.obligationId))throw Error(`BLOCKED: PR_FEEDBACK Stage A receipt does not match one exact applicable obligation: ${check3.obligationId}`);let sourceContract=obligation.source.includes(".pr-validation.json#")?{path:obligation.source.slice(0,obligation.source.lastIndexOf("#")),id:obligation.source.slice(obligation.source.lastIndexOf("#")+1)}:void 0,requiredContract=obligation.validatorContract??sourceContract;if(requiredContract&&(check3.validatorContract?.path!==requiredContract.path||check3.validatorContract.id!==requiredContract.id))throw Error(`BLOCKED: PR_FEEDBACK Stage A obligation ${obligation.id} requires exact validator contract provenance`)}let commandDigest=createHash58("sha256").update(`${check3.obligationId??check3.category}\x00${check3.workingDirectory??"."}\x00${check3.command.join("\x00")}`).digest("hex");if(commandDigests.has(commandDigest))throw Error("BLOCKED: PR_FEEDBACK Stage A cannot reuse one command as multiple check receipts");if(commandDigests.add(commandDigest),check3.category==="diff-check"&&!sameStringArray(check3.command,["git","diff","--check"]))throw Error("BLOCKED: PR_FEEDBACK Stage A diff-check receipt is not the exact git diff --check command");if(check3.category==="reproduction"&&(!check3.targets?.length||!check3.feedbackTargets?.length||check3.targets.some((target)=>!check3.command.join(" ").includes(target))))throw Error("BLOCKED: PR_FEEDBACK Stage A reproduction receipt requires exact selected targets");if(check3.category==="reproduction"){if(reproductionFeedbackItemIds=check3.feedbackTargets.map((mapping)=>mapping.feedbackItemId),assertNoDuplicates(reproductionFeedbackItemIds,"PR_FEEDBACK Stage A reproduction feedback item mappings"),check3.feedbackTargets.some((mapping)=>!check3.targets.includes(mapping.target)))throw Error("BLOCKED: PR_FEEDBACK Stage A feedback mappings must reference exact executed reproduction targets")}}if(required3.size>0)throw Error(`BLOCKED: PR_FEEDBACK Stage A is missing required checks: ${[...required3].join(", ")}`);if(requiredObligationIds.size>0)throw Error(`BLOCKED: PR_FEEDBACK Stage A is missing applicable workspace obligations: ${[...requiredObligationIds].join(", ")}`);if(!sameStringArray(reproductionFeedbackItemIds,state2.prFeedbackInventory??[]))throw Error("BLOCKED: PR_FEEDBACK Stage A reproduction must map every immutable feedback item exactly once and in declared order");let normalizedCategories=optionalCategoryOrder.filter((category)=>applicableCategories.includes(category)),retainsGateBatches=stageARetainsGateBatches(state2.prFeedbackStageA,{revisionDigest:currentDigest,applicableCategories:normalizedCategories,applicableObligations}),nextState={...state2,updatedAt:isoNow(),prFeedbackStageA:{revisionDigest:currentDigest,checks:[...checks5],feedbackItemIds:reproductionFeedbackItemIds,applicableCategories:normalizedCategories,applicableObligations,validatedAt:isoNow()},prFeedbackGateBatches:retainsGateBatches?[...state2.prFeedbackGateBatches??[]]:[],prFeedbackReadyToPublish:void 0},superseded=supersedeLivePublicationInPendingState(nextState,"stage-a-rerun");if(await persistState2(directory,superseded.state),superseded.invalidationEvent)appendPublicationEvent(directory,superseded.invalidationEvent);return superseded.state}function canonicalStageAObligation(obligation){return[obligation.id,obligation.category,obligation.workingDirectory,obligation.source,obligation.validatorContract?.path??"",obligation.validatorContract?.id??""].join("\x00")}function stageARetainsGateBatches(previous,next){if(!previous||previous.revisionDigest!==next.revisionDigest)return!1;if(!previous.applicableCategories||!previous.applicableObligations)return!1;let nextCategories=new Set(next.applicableCategories);if(!previous.applicableCategories.every((category)=>nextCategories.has(category)))return!1;let nextObligations=new Set(next.applicableObligations.map(canonicalStageAObligation));return previous.applicableObligations.every((obligation)=>nextObligations.has(canonicalStageAObligation(obligation)))}async function recordPrFeedbackGateBatch(directory,sessionID,phase,lane,options){let state2=await bindPrWorkflowHead(directory,sessionID,options.prHeadSha);if(state2.mode!=="PR_FEEDBACK")throw wrongModeError(state2,"PR_FEEDBACK");let inventory=state2.prFeedbackInventory;if(!inventory?.length)throw Error("BLOCKED: PR_FEEDBACK ordered gates require an immutable feedback inventory");let normalized=normalizeOwnership([lane])[0];if(!sameStringArray(normalized.ownedItemIds,inventory))throw Error(`BLOCKED: PR_FEEDBACK ${phase} must own every inventory item exactly once and in declared order`);let phaseIndex=PR_FEEDBACK_PHASE_ORDER.indexOf(phase),prerequisite=PR_FEEDBACK_PHASE_ORDER[phaseIndex-1];if(prerequisite)state2=await assertPrFeedbackGatePhaseSettled(directory,sessionID,prerequisite);let{prFeedbackStageA:stageA,prFeedbackInventory:refreshedInventory}=state2,currentDigest=await currentPrFeedbackRevisionDigest(directory,state2);if(!stageA||!refreshedInventory||stageA.revisionDigest!==currentDigest||!sameStringArray(stageA.feedbackItemIds??[],refreshedInventory)||options.revisionDigest!==currentDigest)throw Error(`BLOCKED: PR_FEEDBACK ${phase} requires fresh Stage A checks on the current revision`);let batchId=normalizeBatchId(options.batchId),previous=state2.prFeedbackGateBatches??[];if(previous.some((batch)=>batch.batchId===batchId))throw Error(`BLOCKED: PR_FEEDBACK gate batch id "${batchId}" is already recorded`);let retained=previous.filter((batch)=>PR_FEEDBACK_PHASE_ORDER.indexOf(batch.phase)<phaseIndex),record3={batchId,phase,laneId:normalized.laneId,itemIds:normalized.ownedItemIds,revisionDigest:currentDigest,validatedAt:isoNow()},nextState={...state2,updatedAt:isoNow(),prFeedbackGateBatches:[...retained,record3]};return await persistState2(directory,nextState),nextState}async function assertPrFeedbackGatePhaseSettled(directory,sessionID,phase){let state2=await requireBoundState2(directory,sessionID,"PR_FEEDBACK"),currentDigest=await currentPrFeedbackRevisionDigest(directory,state2);if(state2.prFeedbackStageA?.revisionDigest!==currentDigest)throw Error(`BLOCKED: PR_FEEDBACK ${phase} cannot use stale Stage A evidence`);if(!sameStringArray(state2.prFeedbackStageA?.feedbackItemIds??[],state2.prFeedbackInventory??[]))throw Error(`BLOCKED: PR_FEEDBACK ${phase} Stage A reproduction is not bound to the exact immutable feedback inventory`);let batch=[...state2.prFeedbackGateBatches??[]].reverse().find((candidate)=>candidate.phase===phase);if(!batch||batch.revisionDigest!==currentDigest)throw Error(`BLOCKED: PR_FEEDBACK ${phase} has no validation batch on the current revision`);if(!sameStringArray(batch.itemIds,state2.prFeedbackInventory??[]))throw Error(`BLOCKED: PR_FEEDBACK ${phase} evidence covers a stale inventory; the feedback inventory was amended after this batch was recorded. Re-run ${phase} against every current inventory item.`);if(!successfulObligationsFromExactBatch2(directory,state2,batch.batchId,[{laneId:batch.laneId,workflowLane:phase,reviewItemIds:batch.itemIds}],`swarm-pr-feedback:${phase}`,batch.validatedAt,!0,new Set,currentDigest).has(phase))throw Error(`BLOCKED: PR_FEEDBACK ${phase} requires one complete, non-degraded positive verdict row per inventory item`);let batchRead=findByBatchIdDetailed(directory,batch.batchId,{parentSessionId:state2.sessionID});if(batchRead.status==="uncertain")throw Error(`BLOCKED: PR_FEEDBACK ${phase} gate cannot be validated: the delegation store is unreadable after ${batchRead.attempts} attempts (${batchRead.reason}); the batch's durable child record is UNKNOWN, not absent. Restore the store and re-validate.`);if(batchRead.value.find((candidate)=>candidate.laneId===batch.laneId)?.workspace?.dirtyHash!==currentDigest)throw Error(`BLOCKED: PR_FEEDBACK ${phase} artifact is not bound to the current revision digest`);return assertIndependentFeedbackGateSessions(directory,state2,phase),state2}function assertIndependentFeedbackGateSessions(directory,state2,throughPhase){let throughIndex=PR_FEEDBACK_PHASE_ORDER.indexOf(throughPhase),batches=(state2.prFeedbackGateBatches??[]).filter((batch)=>PR_FEEDBACK_PHASE_ORDER.indexOf(batch.phase)<=throughIndex),seenSessions=new Set;for(let batch of batches){let batchRead=findByBatchIdDetailed(directory,batch.batchId,{parentSessionId:state2.sessionID});if(batchRead.status==="uncertain")throw Error(`BLOCKED: PR_FEEDBACK ${batch.phase} cannot be validated: the delegation store is unreadable after ${batchRead.attempts} attempts (${batchRead.reason}); the batch's durable child session is UNKNOWN, not absent. Restore the store and re-validate.`);let matching=batchRead.value.filter((record4)=>record4.laneId===batch.laneId);if(matching.length!==1)throw Error(`BLOCKED: PR_FEEDBACK ${batch.phase} must resolve from exactly one durable child session`);let record3=matching[0],expectedRole=PR_FEEDBACK_PHASE_ROLE[batch.phase];if(!(record3.normalizedAgent===expectedRole||expectedRole==="critic"&&record3.normalizedAgent.startsWith("critic_")))throw Error(`BLOCKED: PR_FEEDBACK ${batch.phase} requires role ${expectedRole}, received ${record3.normalizedAgent||"(unknown)"}`);if(seenSessions.has(record3.subagentSessionId))throw Error(`BLOCKED: PR_FEEDBACK independent phases reused child session "${record3.subagentSessionId}"`);seenSessions.add(record3.subagentSessionId)}}async function assertPrFeedbackReadyToPublish(directory,sessionID){let state2=await assertPrFeedbackVerificationSettled(directory,sessionID);for(let phase of PR_FEEDBACK_PHASE_ORDER)state2=await assertPrFeedbackGatePhaseSettled(directory,sessionID,phase);return state2}function deriveReadyToPublishMirror(active){if(!active||active.state!=="armed"&&active.state!=="push_in_flight")return;return{revisionDigest:active.revisionDigest,localHead:active.localHead,remoteName:active.remoteName,remoteBranchRef:active.remoteBranchRef,remoteRef:active.remoteRef,validatedAt:active.armedAt??active.createdAt}}async function verifyPublicationIdentityComponent(directory,state2,active,component){switch(component){case"digest":try{let digest3=await currentPrFeedbackRevisionDigest(directory,state2);return digest3===active.revisionDigest?{kind:"intact"}:{kind:"drift",component,detail:`approved revision digest ${active.revisionDigest} vs current ${digest3}`}}catch(error93){return{kind:"unresolvable",component,detail:String(error93?.message??error93)}}case"head":{let head=(await _test_exports2.resolveCurrentGitHeadAsync(directory))?.trim();if(!head)return{kind:"unresolvable",component,detail:"HEAD resolution returned empty"};return head===active.localHead?{kind:"intact"}:{kind:"drift",component,detail:`approved head ${active.localHead} vs current ${head}`}}case"worktree":{let clean=await _test_exports2.resolveIsWorkingTreeCleanAsync(directory);if(clean!==!0&&clean!==!1)return{kind:"unresolvable",component,detail:"clean-status resolution failed"};return clean===!0?{kind:"intact"}:{kind:"drift",component,detail:"working tree or index is dirty"}}case"upstream":{let target=await _test_exports2.resolveCurrentUpstreamPushTargetAsync(directory);if(!target)return{kind:"unresolvable",component,detail:"upstream target resolution returned empty"};return target.remoteName===active.remoteName&&target.remoteBranchRef===active.remoteBranchRef&&target.remoteTrackingRef===active.remoteRef?{kind:"intact"}:{kind:"drift",component,detail:`approved target ${active.remoteName}/${active.remoteBranchRef}/${active.remoteRef} vs current ${target.remoteName}/${target.remoteBranchRef}/${target.remoteTrackingRef}`}}case"remote-url":{if(!active.remoteUrlIdentity)return{kind:"unresolvable",component,detail:"armed generation carries no remote URL identity"};let url3=await _test_exports2.resolveRemoteUrlIdentityAsync(directory,active.remoteName);if(!url3)return{kind:"unresolvable",component,detail:`remote "${active.remoteName}" URL could not be resolved`};return url3===active.remoteUrlIdentity?{kind:"intact"}:{kind:"drift",component,detail:`approved remote URL identity ${active.remoteUrlIdentity} vs current ${url3}`}}case"workspace-identity":{let identity=canonicalWorkspaceIdentity(directory);if(!identity)return{kind:"unresolvable",component,detail:"canonical workspace identity could not be resolved"};return identity===active.workspaceIdentity?{kind:"intact"}:{kind:"drift",component,detail:"generation is bound to a different workspace"}}case"evidence-join":return publicationEvidenceJoinIntact(state2,active)?{kind:"intact"}:{kind:"drift",component,detail:"the receipt set recorded at arming is no longer the active one"};default:return{kind:"unresolvable",component,detail:"unknown component"}}}async function checkPublicationIdentity(directory,state2,active){for(let component of PUBLICATION_IDENTITY_COMPONENTS){let check3=await verifyPublicationIdentityComponent(directory,state2,active,component);if(check3.kind!=="intact")return check3}if(!publicationEvidenceJoinIntact(state2,active))return{kind:"drift",component:"evidence-join",detail:"the receipt set recorded at arming is no longer the active one"};return{kind:"intact"}}function publicationEvidenceJoinIntact(state2,active){if(state2.prFeedbackStageA?.validatedAt!==active.evidence.stageAValidatedAt)return!1;for(let join90 of active.evidence.batches){let batch=[...state2.prFeedbackGateBatches??[]].reverse().find((candidate)=>candidate.phase===join90.phase);if(!batch||batch.batchId!==join90.batchId||batch.laneId!==join90.laneId)return!1}return!0}function buildPublicationEvidenceJoin(state2,currentDigest){let stageA=state2.prFeedbackStageA;if(!stageA||stageA.revisionDigest!==currentDigest||!stageA.validatedAt)return null;let batches=[];for(let phase of PR_FEEDBACK_PHASE_ORDER){let batch=[...state2.prFeedbackGateBatches??[]].reverse().find((candidate)=>candidate.phase===phase&&candidate.revisionDigest===currentDigest);if(!batch)return null;batches.push({phase,batchId:batch.batchId,laneId:batch.laneId})}return{stageAValidatedAt:stageA.validatedAt,batches}}function appendPublicationEvent(directory,event){try{appendCoreEventSync(directory,{...event,timestamp:isoNow()})}catch{}}function boundPublicationDiagnostic(text){let redacted=redactSecrets(text).replace(PUBLICATION_URL_CREDENTIALS_PATTERN,"$1[REDACTED:url_credentials]@");return redacted.length>MAX_PUSH_ATTEMPT_DIAGNOSTIC_CHARS?`${redacted.slice(0,MAX_PUSH_ATTEMPT_DIAGNOSTIC_CHARS-3)}...`:redacted}function nextPublicationContainer(previous,active,historyAppends=[],attempts=[]){let history=[...previous?.history??[],...historyAppends].slice(-MAX_PUBLICATION_HISTORY_GENERATIONS);return{schemaVersion:PUBLICATION_SCHEMA_VERSION,active,history,attempts:attempts.slice(-MAX_PUBLICATION_ATTEMPTS)}}async function invalidatePublicationGeneration(directory,sessionID,reason,options={}){let normalizedSessionID=normalizeSessionID(sessionID);return withSessionStateMutation(directory,normalizedSessionID,async()=>{let state2=await readPrWorkflowGateStateFromDisk3(directory,normalizedSessionID);if(!state2||state2.mode!=="PR_FEEDBACK")throw Error("BLOCKED: PR_FEEDBACK publication invalidation requires an active PR_FEEDBACK gate");return applyPublicationInvalidationWhileLocked(directory,state2,reason,options)})}async function applyPublicationInvalidationWhileLocked(directory,state2,reason,options={}){{let active=state2.prFeedbackPublication?.active,legacyRecord=active?void 0:state2.prFeedbackReadyToPublish;if(!active&&!legacyRecord)throw Error("BLOCKED: no armed publication generation to invalidate");if(active&&active.state!=="armed"&&active.state!=="push_in_flight")throw Error(`BLOCKED: publication generation ${active.generation} is already ${active.state}`);if(options.driftReverification&&options.drift&&active){let recheck=await verifyPublicationIdentityComponent(directory,state2,active,options.drift.component);if(recheck.kind!=="drift")throw Error(`BLOCKED: PR_FEEDBACK publication drift on ${options.drift.component} did not re-confirm under the state lock (${recheck.kind}); no invalidation was recorded — retry from current state`);options.drift={component:recheck.component,detail:recheck.detail}}let now=isoNow(),attempts=(state2.prFeedbackPublication?.attempts??[]).map((attempt)=>attempt.result?attempt:{...attempt,result:{outcome:options.finalizeInFlightAs??"uncertain",exitStatus:"not-observed",diagnostic:`finalized by publication invalidation (${reason})`,postPush:{localHead:null,observedRemoteHead:null},completedAt:now}}),invalidated;if(active)invalidated={...active,state:"invalidated",invalidatedAt:now,invalidationReason:reason};else if(legacyRecord)invalidated={schemaVersion:PUBLICATION_SCHEMA_VERSION,generation:1,state:"invalidated",workspaceIdentity:canonicalWorkspaceIdentity(directory)??"unresolvable",sessionID:state2.sessionID,intakeHeadSha:state2.prHeadSha??"unknown",localHeadRef:"unknown",localHead:legacyRecord.localHead,remoteName:legacyRecord.remoteName,remoteUrlIdentity:void 0,remoteBranchRef:legacyRecord.remoteBranchRef,remoteRef:legacyRecord.remoteRef,revisionDigest:legacyRecord.revisionDigest,evidence:{stageAValidatedAt:state2.prFeedbackStageA?.validatedAt??"unknown",batches:(state2.prFeedbackGateBatches??[]).map((batch)=>({phase:batch.phase,batchId:batch.batchId,laneId:batch.laneId}))},invalidationReason:reason,createdAt:legacyRecord.validatedAt,armedAt:legacyRecord.validatedAt,invalidatedAt:now};else throw Error("BLOCKED: no armed publication generation to invalidate");if(!active)attempts=[];let nextState={...state2,updatedAt:now,prFeedbackStageA:void 0,prFeedbackVerifications:void 0,prFeedbackGateBatches:void 0,prFeedbackScopes:void 0,prFeedbackReadyToPublish:void 0,prFeedbackPublication:nextPublicationContainer(state2.prFeedbackPublication,invalidated,[],attempts)};return await writeStateWhileLocked(directory,nextState),appendPublicationEvent(directory,{type:"pr_feedback_publication_invalidated",sessionID:state2.sessionID,generation:invalidated.generation,reason,previousState:active?.state??"armed",drift:options.drift??null,revisionDigest:invalidated.revisionDigest,localHead:invalidated.localHead,remoteName:invalidated.remoteName,remoteBranchRef:invalidated.remoteBranchRef,supersededBatchIds:invalidated.evidence.batches.map((b)=>b.batchId)}),{generation:invalidated,state:nextState}}}async function ensurePublicationGenerationCurrent(directory,sessionID){let normalizedSessionID=normalizeSessionID(sessionID),state2=await readPrWorkflowGateState(directory,normalizedSessionID);if(!state2||state2.mode!=="PR_FEEDBACK")return state2;if(state2.prFeedbackPublication||!state2.prFeedbackReadyToPublish)return state2;let legacy=state2.prFeedbackReadyToPublish;return withSessionStateMutation(directory,normalizedSessionID,async()=>{let locked=await readPrWorkflowGateStateFromDisk3(directory,normalizedSessionID);if(!locked||locked.mode!=="PR_FEEDBACK")return locked??state2;if(locked.prFeedbackPublication||!locked.prFeedbackReadyToPublish)return locked;let now=isoNow(),base={schemaVersion:PUBLICATION_SCHEMA_VERSION,generation:1,sessionID:locked.sessionID,prTargetUrl:locked.prFeedbackTargetUrl,intakeHeadSha:locked.prHeadSha??"unknown",revisionDigest:legacy.revisionDigest,evidence:buildPublicationEvidenceJoin(locked,legacy.revisionDigest)??{stageAValidatedAt:"unknown",batches:[]},createdAt:legacy.validatedAt,armedAt:legacy.validatedAt},mismatch=async(reason)=>{let invalidated={...base,evidence:base.evidence.batches.length>0?base.evidence:{stageAValidatedAt:locked.prFeedbackStageA?.validatedAt??"unknown",batches:(locked.prFeedbackGateBatches??[]).map((batch)=>({phase:batch.phase,batchId:batch.batchId,laneId:batch.laneId}))},state:"invalidated",workspaceIdentity:canonicalWorkspaceIdentity(directory)??"unresolvable",localHeadRef:"unknown",localHead:legacy.localHead,remoteName:legacy.remoteName,remoteUrlIdentity:void 0,remoteBranchRef:legacy.remoteBranchRef,remoteRef:legacy.remoteRef,invalidationReason:reason,invalidatedAt:now},nextState2={...locked,updatedAt:now,prFeedbackStageA:void 0,prFeedbackVerifications:void 0,prFeedbackGateBatches:void 0,prFeedbackScopes:void 0,prFeedbackReadyToPublish:void 0,prFeedbackPublication:nextPublicationContainer(locked.prFeedbackPublication,invalidated)};return await writeStateWhileLocked(directory,nextState2),appendPublicationEvent(directory,{type:"pr_feedback_publication_migrated",sessionID:locked.sessionID,generation:1,outcome:"invalidated",reason}),nextState2};if(locked.prFeedbackStageA?.revisionDigest!==legacy.revisionDigest||!(locked.prFeedbackGateBatches??[]).some((batch)=>batch.revisionDigest===legacy.revisionDigest))return mismatch("legacy-migration-receipt-mismatch");let workspaceIdentity=canonicalWorkspaceIdentity(directory);if(!workspaceIdentity)return mismatch("legacy-migration-unresolvable");let digest3;try{digest3=await currentPrFeedbackRevisionDigest(directory,locked)}catch{return mismatch("legacy-migration-unresolvable")}let head=(await _test_exports2.resolveCurrentGitHeadAsync(directory))?.trim(),target=await _test_exports2.resolveCurrentUpstreamPushTargetAsync(directory),localHeadRef=await resolveCurrentLocalHeadRefAsync(directory),remoteUrlIdentity=await _test_exports2.resolveRemoteUrlIdentityAsync(directory,legacy.remoteName);if(digest3!==legacy.revisionDigest||head!==legacy.localHead||!target||target.remoteName!==legacy.remoteName||target.remoteBranchRef!==legacy.remoteBranchRef||target.remoteTrackingRef!==legacy.remoteRef||!localHeadRef||!remoteUrlIdentity)return mismatch("legacy-migration-identity-mismatch");let evidenceJoin=buildPublicationEvidenceJoin(locked,legacy.revisionDigest);if(!evidenceJoin)return mismatch("legacy-migration-receipt-mismatch");let upgraded={...base,evidence:evidenceJoin,state:"armed",workspaceIdentity,localHeadRef,localHead:legacy.localHead,remoteName:legacy.remoteName,remoteUrlIdentity,remoteBranchRef:legacy.remoteBranchRef,remoteRef:legacy.remoteRef},nextState={...locked,updatedAt:now,prFeedbackPublication:nextPublicationContainer(locked.prFeedbackPublication,upgraded)};return await writeStateWhileLocked(directory,nextState),appendPublicationEvent(directory,{type:"pr_feedback_publication_migrated",sessionID:locked.sessionID,generation:1,outcome:"armed",reason:"legacy-record-proven-equivalent"}),nextState})}async function reconcileForeignInFlightAttempt(directory,sessionID,currentCallId){let normalizedSessionID=normalizeSessionID(sessionID);return withSessionStateMutation(directory,normalizedSessionID,async()=>{let state2=await readPrWorkflowGateStateFromDisk3(directory,normalizedSessionID),publication=state2?.prFeedbackPublication,active=publication?.active;if(!state2||!publication||!active||active.state!=="push_in_flight"||!publication.attempts.some((attempt)=>!attempt.result))return state2;let now=isoNow(),localHead=(await _test_exports2.resolveCurrentGitHeadAsync(directory))?.trim(),observedRemoteHead=await _test_exports2.resolveExactRemoteBranchHeadAsync(directory,active.remoteName,active.remoteBranchRef),attempts=publication.attempts.map((attempt)=>attempt.result?attempt:{...attempt,result:{outcome:"uncertain",exitStatus:"not-observed",diagnostic:boundPublicationDiagnostic(`recovered without an observed result${currentCallId&&attempt.callID===currentCallId?" (same call)":""}`),postPush:{localHead:localHead??null,observedRemoteHead},completedAt:now}}),nextState={...state2,updatedAt:now,prFeedbackPublication:nextPublicationContainer(publication,{...active,state:"armed"},[],attempts)};return await writeStateWhileLocked(directory,nextState),appendPublicationEvent(directory,{type:"pr_feedback_push_attempt_result",sessionID:state2.sessionID,generation:active.generation,outcome:"uncertain",by:"reaper",observedRemoteHead}),nextState})}async function invalidatePrFeedbackPublication(directory,sessionID,reason){let trimmed=reason.trim();if(!trimmed)throw Error("BLOCKED: invalidate_pr_feedback_publication requires a non-empty reason; the reason is part of the durable audit trail");return await ensurePublicationGenerationCurrent(directory,sessionID),await reconcileForeignInFlightAttempt(directory,sessionID),(await invalidatePublicationGeneration(directory,sessionID,`controller-rework:${trimmed}`)).generation}function describePrWorkflowPublicationSection(state2){let active=state2.prFeedbackPublication?.active,history=state2.prFeedbackPublication?.history??[],attempts=state2.prFeedbackPublication?.attempts??[];if(!active&&!state2.prFeedbackReadyToPublish&&history.length===0)return null;let lines=[];if(state2.prFeedbackReadyToPublish&&!active)lines.push("publication: legacy armed record awaiting generation migration (fail-closed until the next gated interaction migrates it)");if(active){if(lines.push(`publication: generation ${active.generation} state=${active.state}`),lines.push(` approved: ${active.localHead} -> ${active.remoteName} ${active.remoteBranchRef} (digest ${active.revisionDigest.slice(0,12)}…)`),active.remoteUrlIdentity)lines.push(` remote url identity: ${active.remoteUrlIdentity}`);if(active.state==="invalidated"&&active.invalidationReason)lines.push(` invalidated because: ${active.invalidationReason}`);if(active.supersededByGeneration)lines.push(` superseded by generation ${active.supersededByGeneration}`);let generationAttempts=attempts.filter((attempt)=>attempt.generation===active.generation);if(generationAttempts.length>0){let outcomes=generationAttempts.map((attempt)=>attempt.result?.outcome??"in-flight");lines.push(` push attempts: ${generationAttempts.length} (${outcomes.join(", ")})`)}switch(active.state){case"armed":lines.push(" next: run the exact approved push, then complete_pr_workflow");break;case"push_in_flight":lines.push(" next: a push attempt is in flight; the next gated interaction reconciles it (uncertain) and re-verifies the remote before any retry");break;case"invalidated":lines.push(" next: rerun Stage A and every independent gate on the corrected content, then arm a fresh generation with complete_pr_workflow; the exact scoped rework path reopens via prepare_pr_feedback_scope");break;case"published":lines.push(" terminal: published (verified remote head)");break;case"cancelled_without_publication":lines.push(" terminal: cancelled without publication");break;default:lines.push(" next: continue the ordered gates")}}if(history.length>0){let summary=history.map((generation)=>`gen ${generation.generation}: ${generation.state}${generation.supersededByGeneration?` -> ${generation.supersededByGeneration}`:""}`).join("; ");lines.push(` superseded generations: ${summary}`)}return lines.push(" audit: full publication trail in the .swarm events store (pr_feedback_publication_*, pr_feedback_push_attempt_*, pr_feedback_published)"),lines.join(`
|
|
1283
1283
|
`)}function findDanglingLivePublicationGeneration(directory,sessionID){let text;try{text=readCoreEvents(directory).text}catch{return null}if(!text.trim())return null;let dangling=null;for(let line of text.split(`
|
|
1284
1284
|
`)){if(!line.trim())continue;let event;try{event=JSON.parse(line)}catch{continue}if(typeof event.type!=="string"||!PUBLICATION_EVENT_TYPES.has(event.type)||event.sessionID!==sessionID)continue;let generation=typeof event.generation==="number"?event.generation:null;switch(event.type){case"pr_feedback_publication_armed":case"pr_feedback_push_attempt_started":dangling=generation?{generation}:dangling;break;case"pr_feedback_publication_migrated":if(event.outcome==="armed")dangling=generation?{generation}:dangling;else dangling=null;break;default:dangling=null;break}}return dangling}function supersedeLivePublicationInPendingState(pending,reason){let publication=pending.prFeedbackPublication,active=publication?.active;if(!(pending.prFeedbackReadyToPublish!=null||active?.state==="armed"||active?.state==="push_in_flight"))return{state:pending,invalidationEvent:null};let now=isoNow(),attempts=(publication?.attempts??[]).map((attempt)=>attempt.result?attempt:{...attempt,result:{outcome:"uncertain",exitStatus:"not-observed",diagnostic:`finalized by publication invalidation (${reason})`,postPush:{localHead:null,observedRemoteHead:null},completedAt:now}}),invalidatedActive=active?{...active,state:"invalidated",invalidatedAt:now,invalidationReason:reason}:void 0,nextState={...pending,updatedAt:now,prFeedbackReadyToPublish:void 0,prFeedbackVerifications:void 0,prFeedbackGateBatches:void 0,prFeedbackScopes:void 0,prFeedbackPublication:active?nextPublicationContainer(publication,invalidatedActive,[],attempts):pending.prFeedbackPublication},invalidationEvent=active?{type:"pr_feedback_publication_invalidated",sessionID:pending.sessionID,generation:active.generation,reason,previousState:active.state,drift:null,revisionDigest:active.revisionDigest,localHead:active.localHead,remoteName:active.remoteName,remoteBranchRef:active.remoteBranchRef,supersededBatchIds:active.evidence.batches.map((b)=>b.batchId)}:null;return{state:nextState,invalidationEvent}}function parseExactBoundPushIntent(command,armed){if(hasUnsafeShellControlSyntax(command))return{ok:!1,reason:"shell-syntax"};if(!armed.remoteBranchRef.startsWith("refs/heads/"))return{ok:!1,reason:"unbound-target"};let tokens2=command.trim().split(/\s+/);if(tokens2.length!==4||tokens2[0].toLowerCase()!=="git"||tokens2[1].toLowerCase()!=="push"||tokens2.some((token)=>/["'\\]/.test(token)))return{ok:!1,reason:"token-shape"};let[remoteToken,refspecToken]=[tokens2[2],tokens2[3]];if(remoteToken.startsWith("-")||refspecToken.startsWith("-"))return{ok:!1,reason:"flag-or-option"};if(/[:@]/.test(remoteToken)||remoteToken.includes("://"))return{ok:!1,reason:"credential-bearing-remote"};let refspecParts=refspecToken.split(":");if(refspecParts.length!==2)return{ok:!1,reason:refspecParts.length>2?"token-shape":"invalid-dest-ref"};let[sourceToken,destToken]=refspecParts;if(!destToken.startsWith("refs/heads/")||destToken==="refs/heads/")return{ok:!1,reason:"invalid-dest-ref"};if(sourceToken==="")return{ok:!1,reason:"delete-refspec"};if(sourceToken.includes("*")||destToken.includes("*"))return{ok:!1,reason:"wildcard-refspec"};if(remoteToken!==armed.remoteName)return{ok:!1,reason:"remote-mismatch"};if(sourceToken!==armed.localHead)return{ok:!1,reason:"source-mismatch"};if(destToken!==armed.remoteBranchRef)return{ok:!1,reason:"branch-mismatch"};let intent={remote:remoteToken,sourceSha:sourceToken,destRef:destToken};return{ok:!0,intent,digest:createHash58("sha256").update(JSON.stringify(intent),"utf8").digest("hex")}}async function admitPrFeedbackPushAttempt(directory,sessionID,callID,intent,intentDigest){let normalizedSessionID=normalizeSessionID(sessionID);await withSessionStateMutation(directory,normalizedSessionID,async()=>{let state2=await readPrWorkflowGateStateFromDisk3(directory,normalizedSessionID),active=state2?.prFeedbackPublication?.active;if(!state2||state2.mode!=="PR_FEEDBACK"||!active)throw Error("BLOCKED: PR_FEEDBACK push admission requires an armed publication generation");if(active.state!=="armed")throw Error(`BLOCKED: PR_FEEDBACK push admission requires the armed state, not ${active.state}`);let check3=await checkPublicationIdentity(directory,state2,active);if(check3.kind==="unresolvable")throw Error(`BLOCKED: PR_FEEDBACK could not verify the armed publication identity component "${check3.component}" (${check3.detail}); the push was not admitted`);if(check3.kind==="drift"){let invalidation=await applyPublicationInvalidationWhileLocked(directory,state2,`drift:${check3.component}`,{drift:check3});throw Error(`BLOCKED: PR_FEEDBACK publication generation ${invalidation.generation.generation} was INVALIDATED because approved content identity drifted (${check3.component}: ${check3.detail}). Rerun Stage A and every independent gate, then arm a fresh generation with complete_pr_workflow.`)}let now=isoNow();if(intent.remote!==active.remoteName||intent.sourceSha!==active.localHead||intent.destRef!==active.remoteBranchRef)throw Error("BLOCKED: PR_FEEDBACK push intent does not match the armed publication generation under the state lock; the push was not admitted");let observedRemoteHead=await _test_exports2.resolveExactRemoteBranchHeadAsync(directory,active.remoteName,active.remoteBranchRef),localHead=(await _test_exports2.resolveCurrentGitHeadAsync(directory))?.trim(),worktreeClean=await _test_exports2.resolveIsWorkingTreeCleanAsync(directory),baseAttempt={attemptId:randomUUID17(),generation:active.generation,sessionID:state2.sessionID,callID,intentDigest,intent:{remote:intent.remote,sourceSha:intent.sourceSha,destRef:intent.destRef},prePush:{localHead:active.localHead,worktreeClean:worktreeClean===!0,remoteName:active.remoteName,remoteBranchRef:active.remoteBranchRef,observedRemoteHead},startedAt:now};if(observedRemoteHead?.toLowerCase()===active.localHead.toLowerCase()){let attempt={...baseAttempt,result:{outcome:"completed",exitStatus:"not-observed",diagnostic:"remote branch already observed at the approved head (no-op push)",postPush:{localHead:localHead??null,observedRemoteHead:observedRemoteHead??null},completedAt:now}},nextState2={...state2,updatedAt:now,prFeedbackPublication:nextPublicationContainer(state2.prFeedbackPublication,active,[],[...state2.prFeedbackPublication?.attempts??[],attempt])};await writeStateWhileLocked(directory,nextState2),appendPublicationEvent(directory,{type:"pr_feedback_push_attempt_result",sessionID:state2.sessionID,generation:active.generation,outcome:"completed",by:"no-op-observation",observedRemoteHead});return}let nextState={...state2,updatedAt:now,prFeedbackPublication:nextPublicationContainer(state2.prFeedbackPublication,{...active,state:"push_in_flight"},[],[...state2.prFeedbackPublication?.attempts??[],baseAttempt])};await writeStateWhileLocked(directory,nextState),appendPublicationEvent(directory,{type:"pr_feedback_push_attempt_started",sessionID:state2.sessionID,generation:active.generation,intentDigest,intent,observedRemoteHead})});let attempts=(await readPrWorkflowGateState(directory,normalizedSessionID))?.prFeedbackPublication?.attempts??[];return attempts[attempts.length-1]?.result?.outcome==="completed"?{kind:"already-published-remotely"}:{kind:"started"}}function describeToolOutputText(output){if(typeof output==="string")return output;if(output&&typeof output==="object"&&"output"in output&&typeof output.output==="string")return output.output;try{return JSON.stringify(output)??""}catch{return""}}async function recordPrFeedbackPushAttemptResult(directory,input,command,output){let normalizedTool=(normalizeToolName(input.tool)??input.tool).toLowerCase();if(normalizedTool!=="bash"&&normalizedTool!=="shell")return;if(!/^\s*git\s+push/i.test(command))return;let normalizedSessionID=normalizeSessionID(input.sessionID);await withSessionStateMutation(directory,normalizedSessionID,async()=>{let state2=await readPrWorkflowGateStateFromDisk3(directory,normalizedSessionID),publication=state2?.prFeedbackPublication,active=publication?.active;if(!state2||!publication||!active||active.state!=="push_in_flight"||!input.callID)return;let attemptIndex=publication.attempts.findIndex((attempt)=>!attempt.result&&attempt.callID===input.callID);if(attemptIndex<0)return;let now=isoNow(),localHead=(await _test_exports2.resolveCurrentGitHeadAsync(directory))?.trim(),observedRemoteHead=await _test_exports2.resolveExactRemoteBranchHeadAsync(directory,active.remoteName,active.remoteBranchRef),remoteVerifiedAtApprovedHead=observedRemoteHead?.toLowerCase()===active.localHead.toLowerCase(),metadataExit=output?.metadata?.exitCode,exitStatus=typeof metadataExit==="number"&&Number.isInteger(metadataExit)?metadataExit:"not-observed",outcome;if(remoteVerifiedAtApprovedHead)outcome="completed";else if(exitStatus!=="not-observed"&&exitStatus!==0)outcome="rejected";else outcome="uncertain";let diagnostic=boundPublicationDiagnostic(remoteVerifiedAtApprovedHead?`push result observed; remote branch verified at the approved head${exitStatus!=="not-observed"&&exitStatus!==0?` (shell reported nonzero exit ${exitStatus}; the verified remote head is the publication truth)`:""}`:`push result observed without remote verification at the approved head; exit status ${exitStatus==="not-observed"?"not observed":exitStatus}; output: ${describeToolOutputText(output)}`),attempts=publication.attempts.map((attempt,index)=>index===attemptIndex?{...attempt,result:{outcome,exitStatus,diagnostic,postPush:{localHead:localHead??null,observedRemoteHead:observedRemoteHead??null},completedAt:now}}:attempt),nextState={...state2,updatedAt:now,prFeedbackPublication:nextPublicationContainer(publication,{...active,state:"armed"},[],attempts)};await writeStateWhileLocked(directory,nextState),appendPublicationEvent(directory,{type:"pr_feedback_push_attempt_result",sessionID:state2.sessionID,generation:active.generation,outcome,exitStatus,by:"tool-after",observedRemoteHead})})}async function cancelPrFeedbackPublication(directory,sessionID,reason){let normalizedSessionID=normalizeSessionID(sessionID),nextRevision=null,observedRemoteHead=null,cancelledGeneration=null,cancelledAttemptsFinalized=0;try{await withSessionStateMutation(directory,normalizedSessionID,async()=>{let state2=await readPrWorkflowGateStateFromDisk3(directory,normalizedSessionID),publication=state2?.prFeedbackPublication,active=publication?.active;if(!state2||!publication||!active)return;if(active.state==="cancelled_without_publication"){nextRevision=state2.revision;return}if(active.state!=="armed"&&active.state!=="push_in_flight"&&active.state!=="invalidated")throw Error(`BLOCKED: PR_FEEDBACK publication generation ${active.generation} is ${active.state}; only armed, push_in_flight, or invalidated generations may be cancelled`);let now=isoNow();observedRemoteHead=await _test_exports2.resolveExactRemoteBranchHeadAsync(directory,active.remoteName,active.remoteBranchRef);let attempts=publication.attempts.map((attempt)=>attempt.result?attempt:{...attempt,result:{outcome:"cancelled",exitStatus:"not-observed",diagnostic:"finalized by publication cancellation",postPush:{localHead:null,observedRemoteHead},completedAt:now}}),cancelled={...active,state:"cancelled_without_publication",cancelledAt:now,invalidationReason:active.invalidationReason??`cancelled:${reason}`},nextState={...state2,updatedAt:now,prFeedbackReadyToPublish:void 0,prFeedbackPublication:nextPublicationContainer(publication,cancelled,[],attempts)};nextRevision=(await writeStateWhileLocked(directory,nextState)).revision,cancelledGeneration=active.generation,cancelledAttemptsFinalized=attempts.filter((attempt)=>attempt.result?.outcome==="cancelled").length})}catch(error93){if(error93 instanceof Error&&error93.message.startsWith("BLOCKED: PR_FEEDBACK publication generation"))throw error93}return appendPublicationEvent(directory,{type:"pr_feedback_publication_cancelled",sessionID:normalizedSessionID,...cancelledGeneration!==null?{generation:cancelledGeneration}:{},reason,...cancelledAttemptsFinalized>0?{attemptsFinalized:cancelledAttemptsFinalized}:{},observedRemoteHead}),{revision:nextRevision,observedRemoteHead}}async function assertPrFeedbackPublicationArmed(directory,sessionID,options={}){let state2=await ensurePublicationGenerationCurrent(directory,sessionID)??await requireBoundState2(directory,sessionID,"PR_FEEDBACK");state2=await reconcileForeignInFlightAttempt(directory,sessionID,options.currentCallId)??state2??await requireBoundState2(directory,sessionID,"PR_FEEDBACK");let active=state2.prFeedbackPublication?.active;if(!active||active.state!=="armed"&&active.state!=="push_in_flight"){if(active?.state==="invalidated")throw Error(`BLOCKED: PR_FEEDBACK publication generation ${active.generation} was invalidated${active.invalidationReason?` (${active.invalidationReason})`:""}; rerun Stage A and every independent gate, then arm a fresh generation with complete_pr_workflow`);throw Error("BLOCKED: PR_FEEDBACK publication is not armed; call complete_pr_workflow once after every ordered gate passes")}let check3=await checkPublicationIdentity(directory,state2,active);if(check3.kind==="unresolvable")throw Error(`BLOCKED: PR_FEEDBACK could not verify the armed publication identity component "${check3.component}" (${check3.detail}); the armed window is unchanged and fails closed. Resolve the verification failure and retry.`);if(check3.kind==="drift"){let invalidation=await invalidatePublicationGeneration(directory,sessionID,`drift:${check3.component}`,{drift:check3,driftReverification:!0});throw Error(`BLOCKED: PR_FEEDBACK publication generation ${invalidation.generation.generation} was INVALIDATED because approved content identity drifted (${check3.component}: ${check3.detail}). Every approval of that generation is now superseded. Rerun Stage A and every independent gate, then arm a fresh generation with complete_pr_workflow.`)}return state2}async function resolvePrReviewWriterRunId(directory,sessionID,requestedRunId){let normalizedSessionID=normalizeSessionID(sessionID);return withPrWorkflowCheckoutMutationLock(directory,()=>withSessionStateMutation(directory,normalizedSessionID,async()=>{let state2=await requireBoundState2(directory,normalizedSessionID,"PR_REVIEW"),workflowInstanceId=workflowIdentity(state2),normalizedRequested=requestedRunId?.trim()||void 0,stateBoundValues=[state2.prReviewReservedRunId,state2.prReviewTriggerEvalRunId,state2.prReviewArtifactRunId].filter((value)=>Boolean(value?.trim())),stateDistinct=[...new Set(stateBoundValues)];if(normalizedRequested&&stateDistinct.some((value)=>value!==normalizedRequested)){if(stateDistinct.length===1)throw Error(`BLOCKED: field run_id expected "${stateDistinct[0]}", got "${normalizedRequested}"`);throw Error(`BLOCKED: field run_id expected one unambiguous active value, got "${normalizedRequested}" while active bindings are ${stateDistinct.join(", ")}`)}let recoveredReservations=normalizedRequested?[]:await findOwnedPrReviewRunReservations(directory,normalizedSessionID,workflowInstanceId),distinct=[...new Set([...stateBoundValues,...recoveredReservations])];if(!normalizedRequested&&distinct.length>1)throw Error(`BLOCKED: field run_id expected one unambiguous active value, got (omitted) while active bindings are ${distinct.join(", ")}`);let reserve=async(runId)=>{return await tryCreatePrReviewRunReservation(directory,normalizedSessionID,workflowInstanceId,runId)==="occupied"?null:runId},resolvedRunId=normalizedRequested??distinct[0];if(!resolvedRunId){let base=generatePrReviewRunId();for(let suffix=0;suffix<MAX_PR_REVIEW_RUN_ID_SUFFIX_ATTEMPTS&&!resolvedRunId;suffix+=1){let candidate=suffix===0?base:`${base}-${suffix}`,reserved=await reserve(candidate);if(reserved)resolvedRunId=reserved}if(!resolvedRunId)throw Error(`BLOCKED: PR_REVIEW run_id generation exhausted ${MAX_PR_REVIEW_RUN_ID_SUFFIX_ATTEMPTS} reservation attempts for base "${base}"`)}else if(await reserve(resolvedRunId)===null)throw Error(`BLOCKED: field run_id expected an unused active reservation, got "${resolvedRunId}" which is already occupied by another workflow`);if(state2.prReviewReservedRunId===resolvedRunId)return resolvedRunId;let nextState={...state2,updatedAt:isoNow(),prReviewReservedRunId:resolvedRunId};return(await writeStateWhileLocked(directory,nextState,{replaceWorkflowInstanceId:state2.workflowInstanceId})).prReviewReservedRunId??resolvedRunId}))}async function markPrReviewTriggerEvaluationComplete(directory,sessionID,runId,artifactPath){let state2=(await assertPrReviewBaseCoverageSettled2(directory,sessionID)).state,normalizedRunId=runId.trim();if(!normalizedRunId)throw Error("BLOCKED: PR_REVIEW trigger artifact run_id is required");let normalizedPath=artifactPath.trim();if(!normalizedPath)throw Error("BLOCKED: PR_REVIEW trigger artifact path is required");if(state2.prReviewTriggerEvalRunId&&state2.prReviewTriggerEvalRunId!==normalizedRunId)throw Error(`BLOCKED: PR_REVIEW trigger evaluation is already bound to run "${state2.prReviewTriggerEvalRunId}"`);if(state2.prReviewArtifactRunId&&state2.prReviewArtifactRunId!==normalizedRunId)throw Error(`BLOCKED: PR_REVIEW trigger evaluation run_id must match the findings artifact run "${state2.prReviewArtifactRunId}"`);let nextState={...state2,updatedAt:isoNow(),prReviewTriggerEvalPath:normalizedPath,prReviewTriggerEvalRunId:normalizedRunId};return await persistState2(directory,nextState),nextState}async function bindPrReviewTriggerLedger(directory,sessionID,input){let ledger;try{ledger=validatePrReviewInlineTriggerLedger(input)}catch(error93){throw Error(`BLOCKED: invalid PR_REVIEW trigger_evaluation: ${error93 instanceof Error?error93.message:String(error93)}`)}let state2=(await assertPrReviewBaseCoverageSettled2(directory,sessionID)).state;if(state2.prReviewTriggerLedger){let frozen;try{frozen=validatePrReviewInlineTriggerLedger(state2.prReviewTriggerLedger)}catch(error93){throw Error(`BLOCKED: persisted PR_REVIEW trigger ledger is invalid: ${error93 instanceof Error?error93.message:String(error93)}`)}if(prReviewTriggerLedgerDigest(frozen.rows)!==prReviewTriggerLedgerDigest(ledger.rows))throw Error("BLOCKED: PR_REVIEW trigger_evaluation must remain exactly identical across every micro dispatch");return state2}let nextState={...state2,updatedAt:isoNow(),prReviewTriggerLedger:ledger.rows};return await persistState2(directory,nextState),nextState}async function assertPrReviewArtifactBoundary(directory,sessionID,runId,boundary,findingIds,options={}){let state2=await requireBoundState2(directory,sessionID,"PR_REVIEW"),baseOnlyExplorerCheckpoint=boundary==="post_explorer"&&!state2.prReviewTriggerEvalPath;if(!state2.prReviewTriggerEvalPath&&!baseOnlyExplorerCheckpoint)throw Error("BLOCKED: PR_REVIEW findings persistence requires the trigger evaluation artifact (write_pr_review_trigger_eval must complete first)");if(baseOnlyExplorerCheckpoint&&!options.skipBaseCoverage)state2=(await assertPrReviewBaseCoverageSettled2(directory,sessionID)).state;let persistedBoundaries=state2.prReviewArtifactBoundaries??[],boundaryOrder=["post_explorer","post_reviewer","post_critic"],boundaryIndex=boundaryOrder.indexOf(boundary),requiredPriorBoundary=boundaryOrder[boundaryIndex-1];if(requiredPriorBoundary&&!persistedBoundaries.includes(requiredPriorBoundary))throw Error(`BLOCKED: PR_REVIEW ${boundary} findings require the prior ${requiredPriorBoundary} checkpoint`);if(persistedBoundaries.some((persisted)=>boundaryOrder.indexOf(persisted)>boundaryIndex))throw Error(`BLOCKED: PR_REVIEW ${boundary} findings cannot be persisted after a later checkpoint`);let ctx=await createPrReviewGateContext2(directory,state2);if(boundary==="post_reviewer")state2=await assertPrReviewValidationSettled(directory,sessionID,"reviewer",ctx);else if(boundary==="post_critic"){if(await assertPrReviewValidationSettled(directory,sessionID,"reviewer",ctx),derivePrReviewCriticInventoryForCoverageGate(directory,state2,ctx,"assertPrReviewArtifactBoundary(post_critic)").length>0)state2=await assertPrReviewValidationSettled(directory,sessionID,"critic",ctx)}if(state2.prReviewArtifactRunId&&state2.prReviewArtifactRunId!==runId)throw Error(`BLOCKED: PR_REVIEW artifacts are already bound to run "${state2.prReviewArtifactRunId}"`);if(state2.prReviewTriggerEvalRunId&&state2.prReviewTriggerEvalRunId!==runId)throw Error(`BLOCKED: PR_REVIEW findings must use the same run as the trigger evaluation "${state2.prReviewTriggerEvalRunId}"`);let expectedFindingIds=derivePrReviewCandidateInventory2(directory,state2,ctx),normalizedFindingIds=[...new Set(findingIds)].sort();if(normalizedFindingIds.length!==findingIds.length||JSON.stringify(normalizedFindingIds)!==JSON.stringify([...expectedFindingIds].sort())){let actualSet=new Set(normalizedFindingIds),expectedSet=new Set(expectedFindingIds),missing=[...expectedSet].filter((id)=>!actualSet.has(id)),extra=[...actualSet].filter((id)=>!expectedSet.has(id)),duplicates=[...new Set(findingIds.filter((id,index)=>findingIds.indexOf(id)!==index))].sort();throw Error(`BLOCKED: PR_REVIEW ${boundary} findings must exactly cover the discovered candidate inventory; missing: ${missing.join(", ")||"(none)"}; extra: ${extra.join(", ")||"(none)"}; duplicates: ${duplicates.join(", ")||"(none)"}`)}return state2}async function assertPrReviewArtifactRecordsMatchAuthoritativeVerdicts(directory,sessionID,boundary,records){let state2=await requireBoundState2(directory,sessionID,"PR_REVIEW"),violations=[],report=(findingId2,field,expected,actual)=>{violations.push({findingId:findingId2,detail:`${field} expected ${expected}, got ${actual}`})},reportSeverity=(record3,expected)=>{if(record3.severity===expected)return;let raw=record3.severity,actual=raw===void 0?"(omitted)":raw===null?"(null)":raw===""?"(empty)":`"${raw}"`;report(record3.finding_id,"severity",`"${expected}"`,actual)},reportRiskMetadata=(record3,reviewer)=>{if(record3.status!=="CONFIRMED")return;let expectedImpact=reviewer.riskImpact??"UNKNOWN",expectedTags=reviewer.riskTags??[],actualImpact=record3.risk_impact??"UNKNOWN",actualTags=record3.risk_tags??[];if(actualImpact!==expectedImpact)report(record3.finding_id,"risk_impact",`"${expectedImpact}"`,record3.risk_impact===void 0?"(omitted)":`"${actualImpact}"`);if(actualTags.join(",")!==expectedTags.join(","))report(record3.finding_id,"risk_tags",JSON.stringify(expectedTags),record3.risk_tags===void 0?"(omitted)":JSON.stringify(actualTags))};if(boundary==="post_explorer"){let candidateSeverities=derivePrReviewCandidateSeverities(directory,state2,await createPrReviewGateContext2(directory,state2));for(let record3 of records){if(record3.status!=="PENDING")report(record3.finding_id,"status",'"PENDING"',`"${record3.status}"`);if(record3.next_action!=="route_to_reviewer")report(record3.finding_id,"next_action",'"route_to_reviewer"',`"${record3.next_action}"`);let candidateSeverity=candidateSeverities.get(record3.finding_id);if(candidateSeverity){reportSeverity(record3,candidateSeverity);continue}if(record3.finding_id===PR_REVIEW_CLEAN_SENTINEL_ID){reportSeverity(record3,"NONE");continue}violations.push({findingId:record3.finding_id,detail:"no authoritative candidate severity (absent from the derived candidate inventory)"})}}else{let ctx=await createPrReviewGateContext2(directory,state2),reviewerVerdicts=authoritativeReviewerVerdictsForGate(directory,state2,ctx,`assertPrReviewArtifactRecordsMatchAuthoritativeVerdicts(${boundary})`),criticVerdicts=boundary==="post_critic"?authoritativeCriticVerdictsForGate(directory,state2,ctx,`assertPrReviewArtifactRecordsMatchAuthoritativeVerdicts(${boundary})`):void 0;for(let record3 of records){let reviewer=reviewerVerdicts.get(record3.finding_id);if(!reviewer){violations.push({findingId:record3.finding_id,detail:"no authoritative reviewer verdict (absent from the settled reviewer map)"});continue}let requiresCritic=prReviewFindingRequiresCritic({classification:reviewer.classification,severity:reviewer.severity,risk_impact:reviewer.riskImpact,risk_tags:reviewer.riskTags}),expectedStatus=reviewer.classification==="UNVERIFIED"?"PENDING":reviewer.classification;if(boundary==="post_reviewer"){if(record3.status!==expectedStatus)report(record3.finding_id,"status",`"${expectedStatus}"`,`"${record3.status}"`);let expectedAction=requiresCritic?"route_to_critic":reviewer.classification==="CONFIRMED"||reviewer.classification==="PRE_EXISTING"?"report":reviewer.classification==="DISPROVED"?"suppress_with_reason":"route_to_reviewer";if(record3.next_action!==expectedAction)report(record3.finding_id,"next_action",`"${expectedAction}"`,`"${record3.next_action}"`);reportSeverity(record3,reviewer.severity),reportRiskMetadata(record3,reviewer);continue}if(!requiresCritic){let expectedAction=reviewer.classification==="CONFIRMED"||reviewer.classification==="PRE_EXISTING"?"report":reviewer.classification==="DISPROVED"?"suppress_with_reason":"route_to_reviewer";if(record3.status!==expectedStatus)report(record3.finding_id,"status",`"${expectedStatus}"`,`"${record3.status}"`);if(record3.next_action!==expectedAction)report(record3.finding_id,"next_action",`"${expectedAction}"`,`"${record3.next_action}"`);reportSeverity(record3,reviewer.severity),reportRiskMetadata(record3,reviewer);continue}let critic=criticVerdicts?.get(record3.finding_id);if(!critic){reportSeverity(record3,reviewer.severity),reportRiskMetadata(record3,reviewer),violations.push({findingId:record3.finding_id,detail:"no authoritative critic verdict (absent from the settled critic map)"});continue}if(critic.status==="DISPROVED"){if(record3.status!=="DISPROVED")report(record3.finding_id,"status",'"DISPROVED"',`"${record3.status}"`);if(record3.next_action!=="suppress_with_reason")report(record3.finding_id,"next_action",'"suppress_with_reason"',`"${record3.next_action}"`)}else{if(record3.status!=="CONFIRMED")report(record3.finding_id,"status",'"CONFIRMED"',`"${record3.status}"`);if(!["report","handoff_to_feedback"].includes(record3.next_action))report(record3.finding_id,"next_action",'"report" or "handoff_to_feedback"',`"${record3.next_action}"`)}reportSeverity(record3,critic.severity)}}if(violations.length>0){violations.sort((left,right)=>left.findingId<right.findingId?-1:left.findingId>right.findingId?1:0);let lines=violations.map((violation)=>` ${violation.findingId}: ${violation.detail}`);throw Error(`BLOCKED: PR_REVIEW ${boundary} artifact invalid — ${violations.length} violation(s):
|
|
@@ -7876,8 +7876,8 @@ Ignoring will not affect already-tracked files. To stop tracking them, run:
|
|
|
7876
7876
|
`).trim(),text=bodyText.length>MAX_TEXT_LENGTH2?`${bodyText.slice(0,MAX_TEXT_LENGTH2)}…`:bodyText,textTruncated=outcome.truncated||bodyText.length>MAX_TEXT_LENGTH2,evidence2=await captureFetchEvidence(dirResult.directory,outcome.finalUrl,title,text),ok2={success:!0,url:parsed.data.url,finalUrl:outcome.finalUrl,status:outcome.status,contentType:outcome.contentType??void 0,title,text,truncated:textTruncated,bytesReturned:outcome.bytes.byteLength,evidence:evidence2};return JSON.stringify(ok2,null,2)}});async function captureFetchEvidence(directory,url3,title,text){try{let written=await _internals327.writeEvidenceDocuments(directory,[{sourceType:"crawl",url:url3,title,text,createdBy:"web_fetch"}]);return{stored:written.records.length>0,ref:written.refs[0],path:written.path}}catch(err2){return{stored:!1,error:err2 instanceof Error?err2.message:String(err2)}}}var _internals327={httpRequest:performHttpRequest,dnsLookup:lookup,loadPluginConfig,writeEvidenceDocuments};init_zod();init_loader();var CURRENT_INTENT_RE=/\b(?:latest|current|currently|today|now|newest|recent|recently|up\s*-?\s*to\s*-?\s*date|this\s+(?:week|month|year)|as\s+of\s+(?:today|now))\b/i,HISTORICAL_INTENT_RE=/\b(?:history|historical|archive|archived|in\s+20\d{2}|during\s+20\d{2}|from\s+20\d{2}|for\s+20\d{2}|as\s+of\s+20\d{2})\b/i;function applySearchQueryPolicy(rawQuery,now2=new Date){let originalQuery=rawQuery,query=rawQuery.trim().replace(/\s+/g," "),currentYear=now2.getUTCFullYear(),temporalIntent=detectTemporalIntent(query),removedStaleYears=[];if(temporalIntent==="current")query=removeTrailingStaleCutoffYears(query,currentYear,removedStaleYears);return{originalQuery,query,temporalIntent,freshness:temporalIntent==="current"?chooseFreshness(query):void 0,removedStaleYears}}function detectTemporalIntent(query){if(CURRENT_INTENT_RE.test(query))return"current";if(HISTORICAL_INTENT_RE.test(query))return"historical";return"unspecified"}function chooseFreshness(query){if(/\b(?:today|now|as\s+of\s+(?:today|now))\b/i.test(query))return"day";if(/\bthis\s+week\b/i.test(query))return"week";if(/\b(?:recent|recently|this\s+month)\b/i.test(query))return"month";return"year"}function removeTrailingStaleCutoffYears(query,currentYear,removed){return query.replace(/\s+(?:as\s+of\s+)?(20\d{2})\s*$/i,(match,year)=>{if(Number(year)>=currentYear)return match;return removed.push(year),""}).replace(/\s+/g," ").trim()}init_timeout();class WebSearchError extends Error{cause;constructor(message,cause){super(message);this.cause=cause;this.name="WebSearchError"}}class WebSearchConfigError extends Error{constructor(message){super(message);this.name="WebSearchConfigError"}}var SEARCH_TIMEOUT_MS=6000;class TavilyProvider{apiKey;constructor(apiKey){this.apiKey=apiKey}async search(query,maxResults,options={}){let requestBody={api_key:this.apiKey,query,max_results:maxResults,search_depth:"advanced"};if(options.freshness)requestBody.time_range=options.freshness;let response,timeoutError2=new WebSearchError(`Tavily search timed out after ${SEARCH_TIMEOUT_MS}ms`);try{response=await withTimeoutSignal((signal2)=>fetch("https://api.tavily.com/search",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(requestBody),signal:signal2}),SEARCH_TIMEOUT_MS,timeoutError2)}catch(err2){if(err2===timeoutError2)throw err2;throw new WebSearchError(`Tavily network error for query "${query}"`,err2)}if(!response.ok)throw new WebSearchError(`Tavily HTTP ${response.status} for query "${query}"`);let body;try{body=await response.json()}catch(err2){throw new WebSearchError("Tavily returned non-JSON response",err2)}let results=body?.results;if(!Array.isArray(results))return[];return results.filter((r)=>typeof r?.title==="string"&&typeof r?.url==="string"&&typeof r?.content==="string").map((r)=>({title:r.title,url:r.url,snippet:r.content,query}))}}class BraveProvider{apiKey;constructor(apiKey){this.apiKey=apiKey}async search(query,maxResults,options={}){let url3=new URL("https://api.search.brave.com/res/v1/web/search");url3.searchParams.set("q",query),url3.searchParams.set("count",String(maxResults));let freshness=toBraveFreshness(options.freshness);if(freshness)url3.searchParams.set("freshness",freshness);let response,braveTimeoutError=new WebSearchError(`Brave search timed out after ${SEARCH_TIMEOUT_MS}ms`);try{response=await withTimeoutSignal((signal2)=>fetch(url3.toString(),{method:"GET",headers:{"X-Subscription-Token":this.apiKey,Accept:"application/json"},signal:signal2}),SEARCH_TIMEOUT_MS,braveTimeoutError)}catch(err2){if(err2===braveTimeoutError)throw err2;throw new WebSearchError(`Brave network error for query "${query}"`,err2)}if(!response.ok)throw new WebSearchError(`Brave HTTP ${response.status} for query "${query}"`);let body;try{body=await response.json()}catch(err2){throw new WebSearchError("Brave returned non-JSON response",err2)}let results=body?.web?.results;if(!Array.isArray(results))return[];return results.filter((r)=>typeof r?.title==="string"&&typeof r?.url==="string"&&typeof r?.description==="string").map((r)=>({title:r.title,url:r.url,snippet:r.description,query}))}}function toBraveFreshness(freshness){switch(freshness){case"day":return"pd";case"week":return"pw";case"month":return"pm";case"year":return"py";default:return}}function resolveApiKey(provider,configKey){if(configKey&&configKey.length>0)return configKey;let envName=provider==="tavily"?"TAVILY_API_KEY":"BRAVE_SEARCH_API_KEY",fromEnv=process.env[envName];return fromEnv&&fromEnv.length>0?fromEnv:void 0}function createWebSearchProvider(config3){let apiKey=resolveApiKey(config3.searchProvider,config3.searchApiKey);if(!apiKey){let envName=config3.searchProvider==="tavily"?"TAVILY_API_KEY":"BRAVE_SEARCH_API_KEY";throw new WebSearchConfigError(`No API key for search provider "${config3.searchProvider}". Set council.general.searchApiKey in the resolved config (global ~/.config/opencode/opencode-swarm.json, project .opencode/opencode-swarm.json override) or export ${envName}.`)}switch(config3.searchProvider){case"tavily":return new TavilyProvider(apiKey);case"brave":return new BraveProvider(apiKey)}}init_create_tool();init_resolve_working_directory();var MAX_RESULTS_HARD_CAP=10,ArgsSchema7=exports_external.object({query:exports_external.string().min(1).max(500),max_results:exports_external.number().int().min(1).max(20).optional(),freshness:exports_external.enum(["auto","none","day","week","month","year"]).default("auto"),working_directory:exports_external.string().optional()}),web_search=createSwarmTool({description:"External web search for architect-driven council research, SME domain research, and skill-improver research. Returns titled results with snippets and URLs. Used by the architect in MODE: COUNCIL to gather a RESEARCH CONTEXT before dispatching council agents and by SME to evaluate external skill/source candidates. Normalizes current-intent queries, strips trailing stale cutoff years, and applies provider freshness filters by default. Requires council.general.enabled and a configured search API key (Tavily or Brave) in the resolved config: global ~/.config/opencode/opencode-swarm.json, then project .opencode/opencode-swarm.json overrides. max_results is capped at 10 with default from council.general.maxSourcesPerMember.",args:{query:exports_external.string().min(1).max(500).describe("Search query string (1–500 characters)."),freshness:exports_external.enum(["auto","none","day","week","month","year"]).optional().describe('Optional freshness filter. Query normalization always runs; "auto" infers provider freshness from current/recency terms, while "none" disables provider freshness filtering.'),max_results:exports_external.number().int().min(1).max(20).optional().describe(`Number of results to request (1–20). Hard-capped at ${MAX_RESULTS_HARD_CAP}. Defaults to council.general.maxSourcesPerMember.`),working_directory:exports_external.string().optional().describe("Project root for config resolution. Optional.")},execute:async(args2,directory)=>{let parsed=ArgsSchema7.safeParse(args2);if(!parsed.success){let fail3={success:!1,reason:"invalid_args",message:parsed.error.issues.map((i)=>`${i.path.join(".")}: ${i.message}`).join("; ")};return JSON.stringify(fail3,null,2)}let dirResult=resolveWorkingDirectory(parsed.data.working_directory,directory);if(!dirResult.success){let fail3={success:!1,reason:"invalid_working_directory",message:dirResult.message};return JSON.stringify(fail3,null,2)}let generalConfig=loadPluginConfig(dirResult.directory).council?.general;if(!generalConfig||generalConfig.enabled!==!0)return JSON.stringify({success:!1,reason:"council_general_disabled",message:"web_search is disabled - set council.general.enabled: true in the resolved config: global ~/.config/opencode/opencode-swarm.json or project .opencode/opencode-swarm.json."},null,2);let requested=parsed.data.max_results??generalConfig.maxSourcesPerMember,maxResults=Math.min(requested,MAX_RESULTS_HARD_CAP),policy=applySearchQueryPolicy(parsed.data.query),requestedFreshness=parsed.data.freshness??"auto",freshness=requestedFreshness==="auto"?policy.freshness:requestedFreshness==="none"?void 0:requestedFreshness,provider;try{provider=createWebSearchProvider(generalConfig)}catch(err2){let fail3={success:!1,reason:err2 instanceof WebSearchConfigError?"missing_api_key":"provider_init_failed",message:err2 instanceof Error?err2.message:String(err2)};return JSON.stringify(fail3,null,2)}try{let results=await provider.search(policy.query,maxResults,{freshness}),evidence2=await captureSearchEvidence(dirResult.directory,policy.query,results),scannedResults=results.map(({title,url:url3,snippet})=>{let titleScan=scanExternalContent(title,{trustLevel:"low"}),snippetScan=scanExternalContent(snippet,{trustLevel:"low"}),threatLevel=titleScan.threatLevel==="error"||snippetScan.threatLevel==="error"?"error":titleScan.threatLevel==="warning"||snippetScan.threatLevel==="warning"?"warning":"none";return{title:titleScan.clean?title:titleScan.neutralized,url:url3,snippet:snippetScan.clean?snippet:snippetScan.neutralized,evidenceRef:evidence2.refByUrl.get(url3),threatLevel}}),ok2={success:!0,query:policy.query,originalQuery:policy.originalQuery,temporalIntent:policy.temporalIntent,freshness,removedStaleYears:policy.removedStaleYears,totalResults:results.length,results:scannedResults,evidence:{stored:evidence2.stored,path:evidence2.path,refs:evidence2.refs,error:evidence2.error}};return JSON.stringify(ok2,null,2)}catch(err2){let fail3={success:!1,reason:err2 instanceof WebSearchError?"search_failed":"unknown",message:err2 instanceof Error?err2.message:String(err2)};return JSON.stringify(fail3,null,2)}}});async function captureSearchEvidence(directory,query,results){try{let written=await _internals328.writeEvidenceDocuments(directory,results.map((result)=>({sourceType:"web_search",query,title:result.title,url:result.url,snippet:result.snippet,createdBy:"web_search"}))),refByUrl=new Map;for(let record3 of written.records)if(record3.url)refByUrl.set(record3.url,record3.ref);return{stored:written.records.length>0,path:written.path,refs:written.refs,refByUrl}}catch(err2){return{stored:!1,refs:[],refByUrl:new Map,error:err2 instanceof Error?err2.message:String(err2)}}}var _internals328={writeEvidenceDocuments};init_zod();init_loader();init_schema();init_curator_llm_factory();init_knowledge_curator();init_skill_generator();init_schema3();init_store5();init_create_tool();init_resolve_working_directory();import*as path383 from"node:path";var FindingSchema3=exports_external.object({severity:exports_external.enum(["low","medium","high","critical"]),category:exports_external.string().min(1),agents:exports_external.array(exports_external.string().min(1)).default([]),tasks:exports_external.array(exports_external.string().min(1)).default([]),evidence_refs:exports_external.array(exports_external.string().min(1)).default([]),description:exports_external.string().min(1),recommendation:exports_external.string().default("")}),KnowledgeRecommendationSchema2=exports_external.object({lesson:exports_external.string().min(1),target_agents:exports_external.array(exports_external.string().min(1)).default([]),confidence:exports_external.number().min(0).max(1).default(0.5),evidence_refs:exports_external.array(exports_external.string().min(1)).default([])}),ArgsSchema8=exports_external.object({phase:exports_external.number().int().min(0).max(999),verdict:exports_external.enum(["APPROVE","CONCERNS","REJECT"]),findings:exports_external.array(FindingSchema3).default([]),knowledge_recommendations:exports_external.array(KnowledgeRecommendationSchema2).default([]),working_directory:exports_external.string().optional(),provenance_agent_name:exports_external.string().min(1).optional(),provenance_session_id:exports_external.string().min(1).optional()}),write_architecture_supervisor_evidence=createSwarmTool({description:"Persist the architecture supervisor verdict for a phase. PREREQUISITE: dispatch critic_architecture_supervisor as an Agent task with the phase + agent summaries, collect its strict-JSON verdict (verdict/findings/knowledge_recommendations), then call this tool with those values. Writes .swarm/evidence/{phase}/"+"architecture-supervisor.json. This tool persists only — it does not contact the "+"supervisor. Architect-only; config-gated via architectural_supervision.enabled.",args:{phase:exports_external.number().int().min(0).max(999).describe("Phase number being reviewed."),verdict:exports_external.enum(["APPROVE","CONCERNS","REJECT"]).describe("Supervisor verdict."),findings:exports_external.array(FindingSchema3).optional().describe("System-level findings from the supervisor."),knowledge_recommendations:exports_external.array(KnowledgeRecommendationSchema2).optional().describe("Durable lessons proposed by the supervisor."),working_directory:exports_external.string().optional(),provenance_agent_name:exports_external.string().min(1).optional().describe("Agent name that produced this evidence (optional provenance)."),provenance_session_id:exports_external.string().min(1).optional().describe("Session ID of the agent that produced this evidence (optional provenance).")},execute:async(rawArgs,directory)=>{let parsed=ArgsSchema8.safeParse(rawArgs);if(!parsed.success)return JSON.stringify({success:!1,reason:"invalid arguments",errors:parsed.error.issues.map((i)=>({path:i.path.join("."),message:i.message}))},null,2);let args2=parsed.data,dirResult=resolveWorkingDirectory(args2.working_directory,directory);if(!dirResult.success)return JSON.stringify({success:!1,reason:dirResult.message},null,2);let provenance=args2.provenance_agent_name||args2.provenance_session_id?{agent_name:args2.provenance_agent_name,session_id:args2.provenance_session_id,captured_at:new Date().toISOString()}:void 0,report={schema_version:SUMMARY_SCHEMA_VERSION,phase:args2.phase,verdict:args2.verdict,findings:args2.findings,knowledge_recommendations:args2.knowledge_recommendations,created_at:new Date().toISOString(),...provenance?{provenance}:{}},evidencePath2=writeSupervisorReport(dirResult.directory,report),knowledgeProposed=0,knowledgeReinforced=0,knowledgeQuarantined=0;try{let config3=loadPluginConfig(dirResult.directory);if(config3.architectural_supervision?.persist_knowledge_recommendations&&args2.knowledge_recommendations.length>0){let knowledgeConfig=KnowledgeConfigSchema.parse(config3.knowledge??{}),lessons=args2.knowledge_recommendations.map((r)=>r.lesson),result=await curateAndStoreSwarm(lessons,path383.basename(dirResult.directory),{phase_number:args2.phase},dirResult.directory,knowledgeConfig,{skipAutoPromotion:!0,llmDelegate:createCuratorLLMDelegate(dirResult.directory,"phase"),enrichmentQuota:{maxCalls:knowledgeConfig.enrichment.max_calls_per_day,window:knowledgeConfig.enrichment.quota_window}});knowledgeProposed=result.stored,knowledgeReinforced=result.reinforced,knowledgeQuarantined=result.quarantined}}catch{}let skillsProposed=0;try{let config3=loadPluginConfig(dirResult.directory),hasFailureLoop=args2.findings.some((f)=>f.category==="failure_loop");if(config3.architectural_supervision?.persist_knowledge_recommendations&&hasFailureLoop)skillsProposed=(await generateSkills({directory:dirResult.directory,mode:"draft"})).written.length}catch{}return JSON.stringify({success:!0,phase:args2.phase,verdict:args2.verdict,findings_count:args2.findings.length,knowledge_proposed:knowledgeProposed,knowledge_reinforced:knowledgeReinforced,knowledge_quarantined:knowledgeQuarantined,skills_proposed:skillsProposed,evidence_path:evidencePath2},null,2)}});init_zod();init_qa_gate_profile();import fs237 from"node:fs";import path384 from"node:path";function normalizeVerdict2(verdict){if(!LIVE_VERDICT_SET_2.includes(verdict))throw Error(`Invalid verdict: must be 'APPROVED' or 'NEEDS_REVISION', got '${verdict}'`);switch(verdict){case"APPROVED":return"approved";case"NEEDS_REVISION":return"rejected";default:return verdict.toLowerCase()}}function normalizeVerdict4(verdict){if(!LIVE_VERDICT_SET_4.includes(verdict))throw Error(`Invalid verdict: must be 'PASS', 'WARN', 'FAIL', or 'SKIP', got '${verdict}'`);switch(verdict){case"PASS":return"pass";case"WARN":return"warn";case"FAIL":return"fail";case"SKIP":return"skip";default:return verdict.toLowerCase()}}var LIVE_VERDICT_SET_2=["APPROVED","NEEDS_REVISION"],LIVE_VERDICT_SET_4=["PASS","WARN","FAIL","SKIP"],VERDICT_SET_2=LIVE_VERDICT_SET_2,VERDICT_SET_4=LIVE_VERDICT_SET_4;function isAcceptedVerdict2(v){return LIVE_VERDICT_SET_2.includes(v)}function isAcceptedVerdict4(v){return LIVE_VERDICT_SET_4.includes(v)}init_utils2();init_ledger();init_manager();init_utils3();init_logger();init_swarm_artifact_cache();init_create_tool();function buildApprovedPreflightFailure(phase,failure5){return JSON.stringify({success:!1,phase,reason:failure5.reason,message:failure5.message,recovery_guidance:failure5.recovery_guidance},null,2)}async function executeWriteDriftEvidence(args2,directory){let phase=args2.phase;if(!Number.isInteger(phase)||phase<1)return JSON.stringify({success:!1,phase,message:"Invalid phase: must be a positive integer"},null,2);if(!isAcceptedVerdict2(args2.verdict))return JSON.stringify({success:!1,phase,message:"Invalid verdict: must be 'APPROVED' or 'NEEDS_REVISION'"},null,2);let summary=args2.summary;if(typeof summary!=="string"||summary.trim().length===0)return JSON.stringify({success:!1,phase,message:"Invalid summary: must be a non-empty string"},null,2);let normalizedVerdict=_internals329.normalizeVerdict2(args2.verdict),approvedPlan=null,snapshotInfo,qaProfileLocked;if(normalizedVerdict==="approved"){if(approvedPlan=await loadPlanJsonOnly(directory),!approvedPlan)return buildApprovedPreflightFailure(phase,{reason:"plan_required_for_approval",message:"PLAN_REQUIRED_FOR_APPROVAL: plan.json must exist before APPROVED drift evidence can be persisted.",recovery_guidance:"Restore the current .swarm/plan.json and ensure the exact plan identity is available before retrying write_drift_evidence."});let profileLookup=getProfileLookupForIdentity(directory,approvedPlan);if(profileLookup.kind==="missing")return buildApprovedPreflightFailure(phase,{reason:"qa_gate_selection_required",message:"QA_GATE_SELECTION_REQUIRED: no durable QA gate selection exists for this exact plan identity.",recovery_guidance:`Call set_qa_gates with swarm_id=${JSON.stringify(approvedPlan.swarm)} and plan_title=${JSON.stringify(approvedPlan.title)} before retrying write_drift_evidence with the identical identity.`});if(profileLookup.kind==="unbound_legacy")return buildApprovedPreflightFailure(phase,{reason:"qa_gate_identity_unbound",message:"QA_GATE_IDENTITY_UNBOUND: the current plan has a legacy QA gate profile row that is not exact-bound.",recovery_guidance:formatLegacyQaBindingRecovery({swarm:approvedPlan.swarm,title:approvedPlan.title},"retry write_drift_evidence with the identical identity")});try{let lockAnchor=await takeSnapshotEvent(directory,approvedPlan,{source:"drift_approval_prelock"}),planId=derivePlanId(approvedPlan),locked=_internals329.lockProfileForIdentity(directory,approvedPlan,lockAnchor.seq),lockedBySnapshotSeq=locked.locked_by_snapshot_seq??lockAnchor.seq,approvedSnapshot=await takeSnapshotEvent(directory,approvedPlan,{source:"critic_approved",approvalMetadata:{phase,verdict:"APPROVED",summary:summary.trim(),approved_at:new Date().toISOString(),locked_by_snapshot_seq:lockedBySnapshotSeq}});snapshotInfo={seq:approvedSnapshot.seq,timestamp:approvedSnapshot.timestamp,locked_by_snapshot_seq:lockedBySnapshotSeq},qaProfileLocked={plan_id:planId,locked_at:locked.locked_at??"",locked_by_snapshot_seq:locked.locked_by_snapshot_seq??-1}}catch(error93){let message=error93 instanceof Error?error93.message:String(error93);return log("[write_drift_evidence] critic-approved persistence failed:",message),buildApprovedPreflightFailure(phase,{reason:"approval_persistence_failed",message:`APPROVAL_PERSISTENCE_FAILED: QA gate profile lock or critic-approved snapshot failed: ${message}`,recovery_guidance:"Resolve the ledger or QA profile persistence failure, then rerun write_drift_evidence. A completed profile lock is idempotent, and no visible approval is published until both persistence steps succeed."})}}let provenance=args2.provenanceAgentName||args2.provenanceSessionId?{agent_name:args2.provenanceAgentName,session_id:args2.provenanceSessionId,captured_at:new Date().toISOString()}:void 0,evidenceContent={entries:[{type:"drift-verification",verdict:normalizedVerdict,summary:summary.trim(),timestamp:new Date().toISOString(),requirementCoverage:args2.requirementCoverage,...provenance?{provenance}:{}}]},filename="drift-verifier.json",relativePath2=path384.join("evidence",String(phase),filename),validatedPath;try{validatedPath=validateSwarmPath(directory,relativePath2)}catch(error93){return JSON.stringify({success:!1,phase,message:error93 instanceof Error?error93.message:"Failed to validate path"},null,2)}let evidenceDir=path384.dirname(validatedPath);try{await fs237.promises.mkdir(evidenceDir,{recursive:!0});let tempPath=path384.join(evidenceDir,`.${filename}.tmp`);return await fs237.promises.writeFile(tempPath,JSON.stringify(evidenceContent,null,2),"utf-8"),await fs237.promises.rename(tempPath,validatedPath),invalidateCachedArtifact(validatedPath),JSON.stringify({success:!0,phase,verdict:normalizedVerdict,message:`Drift evidence written to .swarm/evidence/${phase}/drift-verifier.json`,approvedSnapshot:snapshotInfo,qaProfileLocked},null,2)}catch(error93){return JSON.stringify({success:!1,phase,message:error93 instanceof Error?error93.message:String(error93)},null,2)}}var _internals329={normalizeVerdict2,VERDICT_SET_2,isAcceptedVerdict2,lockProfileForIdentity},write_drift_evidence=createSwarmTool({allowWorkingDirectoryOverride:!0,description:"Write drift verification evidence for a completed phase. Normalizes verdict (APPROVED->approved, NEEDS_REVISION->rejected) and writes a gate-contract formatted EvidenceBundle to .swarm/evidence/{phase}/drift-verifier.json. Use this after critic_drift_verifier delegation to persist the verification result.",args:{phase:exports_external.number().int().min(1).describe("The phase number for the drift verification (e.g., 1, 2, 3)"),verdict:exports_external.enum(VERDICT_SET_2).describe("Verdict of the drift verification: 'APPROVED' or 'NEEDS_REVISION'"),summary:exports_external.string().describe("Human-readable summary of the drift verification"),requirementCoverage:exports_external.string().optional().describe("Requirement coverage report from req_coverage tool (JSON string)"),provenanceAgentName:exports_external.string().min(1).optional().describe("Agent name that produced this evidence (optional provenance)"),provenanceSessionId:exports_external.string().min(1).optional().describe("Session ID of the agent that produced this evidence (optional provenance)")},execute:async(args2,directory)=>{let rawPhase=args2.phase!==void 0?Number(args2.phase):0;try{let writeDriftEvidenceArgs={phase:Number(args2.phase),verdict:String(args2.verdict),summary:String(args2.summary??""),requirementCoverage:args2.requirementCoverage!==void 0?String(args2.requirementCoverage):void 0,provenanceAgentName:args2.provenanceAgentName!==void 0?String(args2.provenanceAgentName):void 0,provenanceSessionId:args2.provenanceSessionId!==void 0?String(args2.provenanceSessionId):void 0};return await executeWriteDriftEvidence(writeDriftEvidenceArgs,directory)}catch(error93){return JSON.stringify({success:!1,phase:rawPhase,message:error93 instanceof Error?error93.message:"Unknown error"},null,2)}}});init_zod();init_loader();init_council_review_identity();import fs238 from"node:fs";import path385 from"node:path";init_types();init_lock();init_utils2();init_config3();init_gateway();init_reward_capture();init_ledger();init_manager();init_utils3();init_logger();init_swarm_artifact_cache();init_create_tool();var FINAL_COUNCIL_MEMBERS=COUNCIL_MEMBER_ROLES,VerdictSchema3=exports_external.object({agent:exports_external.string().min(1).max(64),verdict:exports_external.enum(["APPROVE","CONCERNS","REJECT"]),confidence:exports_external.number().min(0).max(1),findings:exports_external.array(exports_external.object({severity:exports_external.enum(["CRITICAL","HIGH","MEDIUM","LOW"]),category:exports_external.string().min(1),location:exports_external.string(),detail:exports_external.string(),evidence:exports_external.string()})),criteriaAssessed:exports_external.array(exports_external.string()),criteriaUnmet:exports_external.array(exports_external.string()),durationMs:exports_external.number().nonnegative()}),ArgsSchema9=exports_external.object({phase:exports_external.number().int().min(1).max(1000),projectSummary:exports_external.string().min(1),roundNumber:exports_external.number().int().min(1).max(10).optional(),verdicts:exports_external.array(VerdictSchema3).min(1).max(5)});function normalizeFinalVerdict(verdict,requiredFixesCount){if(verdict==="APPROVE")return"approved";if(verdict==="REJECT")return"rejected";return requiredFixesCount>0?"rejected":"concerns"}function resolveFinalCouncilVerdicts(verdicts){let resolved=[],distinctRoles=[],unknownAgents=[],duplicateAgents=[];for(let verdict of verdicts){let role=resolveCouncilMemberRole(verdict.agent);if(!role){if(!unknownAgents.includes(verdict.agent))unknownAgents.push(verdict.agent);continue}if(distinctRoles.includes(role)){if(!duplicateAgents.includes(verdict.agent))duplicateAgents.push(verdict.agent);continue}distinctRoles.push(role),resolved.push({...verdict,agent:role})}return{resolved,distinctRoles,unknownAgents,duplicateAgents}}function invalidResponse3(issues){return JSON.stringify({success:!1,reason:"invalid arguments",errors:issues.map((issue3)=>({path:issue3.path.join("."),message:issue3.message}))},null,2)}async function executeWriteFinalCouncilEvidence(args2,directory,ctx){let parsed=ArgsSchema9.safeParse(args2);if(!parsed.success)return await recordUnscopedCouncilAttempt(directory,"final","invalid_arguments",args2,parsed.error.issues.map((issue3)=>({path:issue3.path,code:issue3.code})),ctx?.sessionID)??invalidResponse3(parsed.error.issues);let input=parsed.data,config3=loadPluginConfig(directory),plan=null;try{plan=await loadPlan(directory)}catch{}let planHash=plan?computePlanLedgerHash(plan):void 0,planId=plan?derivePlanId(plan):void 0,planIdentityHash=plan?derivePlanIdentityHash(plan):void 0,reviewHash=plan?computeCouncilReviewHash(plan):null,identity=computeCouncilReviewIdentity({level:"final",scope:{kind:"final",final:!0},plan,config:config3.council}),completionPolicy=resolveFinalCompletionPolicy(config3.council),{resolved,distinctRoles,unknownAgents,duplicateAgents}=resolveFinalCouncilVerdicts(input.verdicts),membersVoted=distinctRoles,membersAbsent=FINAL_COUNCIL_MEMBERS.filter((member)=>!distinctRoles.includes(member)),requiredMembers=completionPolicy.mode==="quorum"?completionPolicy.minimumMembers:FINAL_COUNCIL_MEMBERS.length;return runCouncilAttempt({directory,scope:{kind:"final",identityDigest:identity.identityDigest},clientRound:input.roundNumber,maxRounds:config3.council?.maxRounds??3,sessionID:ctx?.sessionID,escalationConfigured:config3.council?.escalateOnMaxRounds!==void 0,request:input,verdictCount:input.verdicts.length,members:[...new Set(input.verdicts.map((v)=>v.agent))].slice(0,5),probePendingEvidence:async(attemptId,round)=>hasFinalEvidenceAttempt(directory,attemptId,round),evaluate:async(authoritativeRound)=>{if(membersVoted.length<requiredMembers)return{disposition:"insufficient_quorum",response:{success:!1,reason:"insufficient_quorum",message:`Final council quorum not met: ${membersVoted.length} of ${requiredMembers} required distinct canonical members provided verdicts (policy: ${completionPolicy.mode}${completionPolicy.mode==="quorum"?`, minimumMembers: ${completionPolicy.minimumMembers}`:""}). Members voted: [${membersVoted.join(", ")}]. Members absent: [${membersAbsent.join(", ")}].`+(unknownAgents.length>0?` Unknown identities (never counted): [${unknownAgents.join(", ")}].`:"")+(duplicateAgents.length>0?` Duplicate identities (collapsed): [${duplicateAgents.join(", ")}].`:"")+" Dispatch the absent council members with project-scoped context and collect their verdicts before calling write_final_council_evidence.",membersVoted,membersAbsent,quorumRequired:requiredMembers,completionPolicy,...unknownAgents.length>0?{unknownAgents}:{},...duplicateAgents.length>0?{duplicateAgents}:{}},transition:"stay",gateEffect:"none"};let synthesis=synthesizeFinalCouncilAdvisory(input.projectSummary.trim(),resolved,authoritativeRound,config3.council);if(synthesis.overallVerdict==="CONCERNS"&&synthesis.blockingConcernsCount>0)return{disposition:"blocking_concerns_unresolved",response:{success:!1,reason:"blocking_concerns_unresolved",overallVerdict:synthesis.overallVerdict,blockingConcernsCount:synthesis.blockingConcernsCount,requiredFixes:synthesis.requiredFixes,unifiedFeedbackMd:synthesis.unifiedFeedbackMd,message:`Final council returned CONCERNS with ${synthesis.blockingConcernsCount} HIGH/CRITICAL finding(s) promoted to requiredFixes. These must be resolved before the project can close. Do NOT write evidence or proceed — address every requiredFix and resubmit.`},transition:"advance",gateEffect:"blocked",verdict:synthesis.overallVerdict,quorumSize:synthesis.quorumSize};if(!plan)return{disposition:"plan_not_found",response:{success:!1,reason:"plan_not_found",message:"Cannot write final council evidence: plan.json not found. The plan must be loaded and available before writing final council evidence.",phase:input.phase,plan_id:"unknown"},transition:"stay",gateEffect:"none"};let normalizedVerdict=normalizeFinalVerdict(synthesis.overallVerdict,synthesis.requiredFixes.length),evidenceEntry={type:"final-council",phase:input.phase,plan_id:planId,plan_hash:planHash,plan_identity_hash:planIdentityHash,...councilIdentityEvidenceFields(identity),final_completion_policy:completionPolicy,freshness_max_age_hours:config3.council?.freshnessMaxAgeHours??24,verdict:normalizedVerdict,rawCouncilVerdict:synthesis.overallVerdict,quorumSize:synthesis.quorumSize,membersVoted,membersAbsent,requiredFixes:synthesis.requiredFixes,advisoryFindings:synthesis.advisoryFindings,advisoryNotes:synthesis.advisoryNotes,unresolvedConflicts:synthesis.unresolvedConflicts,roundNumber:synthesis.roundNumber,allCriteriaMet:synthesis.allCriteriaMet,memberVerdicts:synthesis.memberVerdicts,unifiedFeedbackMd:synthesis.unifiedFeedbackMd,projectSummary:synthesis.projectSummary,timestamp:synthesis.timestamp},validatedPath;try{validatedPath=_internals330.validateSwarmPath(directory,path385.join("evidence","final-council.json"))}catch(error93){return{disposition:"invalid_evidence_path",response:{success:!1,phase:input.phase,message:error93 instanceof Error?error93.message:"Failed to validate path"},transition:"stay",gateEffect:"none"}}let evidenceDir=path385.dirname(validatedPath),accepted=synthesis.overallVerdict==="APPROVE"||synthesis.overallVerdict==="CONCERNS"&&synthesis.blockingConcernsCount===0;return{disposition:`evaluated_${synthesis.overallVerdict.toLowerCase()}`,response:{success:!0,phase:input.phase,overallVerdict:synthesis.overallVerdict,verdict:normalizedVerdict,vetoedBy:synthesis.vetoedBy,roundNumber:synthesis.roundNumber,allCriteriaMet:synthesis.allCriteriaMet,requiredFixesCount:synthesis.requiredFixes.length,advisoryFindingsCount:synthesis.advisoryFindings.length,unresolvedConflictsCount:synthesis.unresolvedConflicts.length,advisoryNotes:synthesis.advisoryNotes,membersVoted,membersAbsent,quorumSize:synthesis.quorumSize,quorumMet:!0,completionPolicy,evidencePath:synthesis.evidencePath,unifiedFeedbackMd:synthesis.unifiedFeedbackMd,message:"Final council evidence written to .swarm/evidence/final-council.json"},transition:accepted?"close":"advance",gateEffect:accepted?"allowed":"blocked",verdict:synthesis.overallVerdict,quorumSize:synthesis.quorumSize,evidence:{reference:synthesis.evidencePath,commit:async(attemptId)=>{await withEvidenceLock(directory,path385.join("evidence","final-council.json"),"write-final-council-evidence",attemptId,async()=>{let currentPlan=await loadPlan(directory);if(!currentPlan||computeCouncilReviewHash(currentPlan)!==reviewHash)throw Error("final council plan changed before evidence publication");await fs238.promises.mkdir(evidenceDir,{recursive:!0});let tempPath=path385.join(evidenceDir,`.final-council.${attemptId}.tmp`);try{await fs238.promises.writeFile(tempPath,JSON.stringify({entries:[{...evidenceEntry,attemptId}]},null,2),"utf-8"),await fs238.promises.rename(tempPath,validatedPath),invalidateCachedArtifact(validatedPath)}finally{await fs238.promises.rm(tempPath,{force:!0}).catch(()=>{})}})}},afterCommit:async()=>{try{let memoryConfig=config3.memory;if(memoryConfig?.enabled===!0&&ctx?.sessionID){let provider=createConfiguredMemoryProvider(directory,memoryConfig);try{await applyCouncilReward(provider,{runId:ctx.sessionID,unitId:void 0,reward:COUNCIL_VERDICT_REWARDS[synthesis.overallVerdict],eta:memoryConfig.qLearning.learningRate,initialQValue:memoryConfig.qLearning.initialQValue,qLearning:memoryConfig.qLearning,timestamp:new Date().toISOString(),verdictLabel:synthesis.overallVerdict})}finally{await provider.close?.()}}}catch(rewardErr){warn(`[write-final-council-evidence] final council reward capture failed: ${rewardErr instanceof Error?rewardErr.message:String(rewardErr)}`)}}}}})}var write_final_council_evidence=createSwarmTool({allowWorkingDirectoryOverride:!0,description:"Write final council evidence for a completed project. This is not General Council mode and does not use convene_general_council. PREREQUISITE: dispatch critic, reviewer, sme, test_engineer, and explorer as project-scoped Agent tasks, collect their CouncilMemberVerdict JSON, then call this tool to synthesize and persist .swarm/evidence/final-council.json. Quorum follows council.finalCompletionPolicy: default requires all five canonical roles with zero absentees; an explicit quorum policy accepts a bounded minimum of distinct canonical members. Member names may be exact canonical roles or multi-swarm prefixed names (e.g. local_critic); unknown and duplicate identities never count.",args:{phase:exports_external.number().int().min(1).max(1000).describe("The final phase number for the project being reviewed"),projectSummary:exports_external.string().min(1).describe("Summary of the completed project and total work reviewed"),roundNumber:exports_external.number().int().min(1).max(10).optional().describe("1-indexed final council round number. Defaults to the current server round."),verdicts:exports_external.array(VerdictSchema3).min(1).max(5).describe("Collected CouncilMemberVerdict objects from critic, reviewer, sme, test_engineer, and explorer (canonical or multi-swarm prefixed names).")},execute:async(args2,directory,ctx)=>executeWriteFinalCouncilEvidence(args2,directory,ctx)});function hasFinalEvidenceAttempt(directory,attemptId,round){try{let evidencePath2=validateSwarmPath(directory,path385.join("evidence","final-council.json")),parsed=JSON.parse(fs238.readFileSync(evidencePath2,"utf8"));return Boolean(parsed.entries?.some((entry)=>entry.type==="final-council"&&entry.attemptId===attemptId&&entry.roundNumber===round))}catch{return!1}}var _internals330={validateSwarmPath};init_zod();import fs239 from"node:fs";import path386 from"node:path";init_utils2();init_swarm_artifact_cache();init_create_tool();async function executeWriteHallucinationEvidence(args2,directory){let phase=args2.phase;if(!Number.isInteger(phase)||phase<1)return JSON.stringify({success:!1,phase,message:"Invalid phase: must be a positive integer"},null,2);if(!isAcceptedVerdict2(args2.verdict))return JSON.stringify({success:!1,phase,message:"Invalid verdict: must be 'APPROVED' or 'NEEDS_REVISION'"},null,2);let summary=args2.summary;if(typeof summary!=="string"||summary.trim().length===0)return JSON.stringify({success:!1,phase,message:"Invalid summary: must be a non-empty string"},null,2);let normalizedVerdict=_internals331.normalizeVerdict2(args2.verdict),evidenceContent={entries:[{type:"hallucination-verification",verdict:normalizedVerdict,summary:summary.trim(),timestamp:new Date().toISOString(),findings:args2.findings}]},filename="hallucination-guard.json",relativePath2=path386.join("evidence",String(phase),filename),validatedPath;try{validatedPath=validateSwarmPath(directory,relativePath2)}catch(error93){return JSON.stringify({success:!1,phase,message:error93 instanceof Error?error93.message:"Failed to validate path"},null,2)}let evidenceDir=path386.dirname(validatedPath);try{await fs239.promises.mkdir(evidenceDir,{recursive:!0});let tempPath=path386.join(evidenceDir,`.${filename}.tmp`);return await fs239.promises.writeFile(tempPath,JSON.stringify(evidenceContent,null,2),"utf-8"),await fs239.promises.rename(tempPath,validatedPath),invalidateCachedArtifact(validatedPath),JSON.stringify({success:!0,phase,verdict:normalizedVerdict,message:`Hallucination evidence written to .swarm/evidence/${phase}/hallucination-guard.json`},null,2)}catch(error93){return JSON.stringify({success:!1,phase,message:error93 instanceof Error?error93.message:String(error93)},null,2)}}var _internals331={normalizeVerdict2,VERDICT_SET_2,isAcceptedVerdict2},write_hallucination_evidence=createSwarmTool({allowWorkingDirectoryOverride:!0,description:"Write hallucination verification evidence for a completed phase. Normalizes verdict (APPROVED->approved, NEEDS_REVISION->rejected) and writes a gate-contract formatted EvidenceBundle to .swarm/evidence/{phase}/hallucination-guard.json. Use this after critic_hallucination_verifier delegation to persist the verification result. Unlike write_drift_evidence, this tool does NOT lock the QA gate profile.",args:{phase:exports_external.number().int().min(1).describe("The phase number for the hallucination verification (e.g., 1, 2, 3)"),verdict:exports_external.enum(VERDICT_SET_2).describe("Verdict of the hallucination verification: 'APPROVED' or 'NEEDS_REVISION'"),summary:exports_external.string().describe("Human-readable summary of the hallucination verification"),findings:exports_external.string().optional().describe("Optional bullet list of FABRICATED/DRIFTED/UNSUPPORTED/BROKEN findings (for NEEDS_REVISION)")},execute:async(args2,directory)=>{let rawPhase=args2.phase!==void 0?Number(args2.phase):0;try{let typedArgs={phase:Number(args2.phase),verdict:String(args2.verdict),summary:String(args2.summary??""),findings:args2.findings!==void 0?String(args2.findings):void 0};return await executeWriteHallucinationEvidence(typedArgs,directory)}catch(error93){return JSON.stringify({success:!1,phase:rawPhase,message:error93 instanceof Error?error93.message:"Unknown error"},null,2)}}});init_zod();import fs240 from"node:fs";import path387 from"node:path";init_utils2();init_swarm_artifact_cache();init_create_tool();async function executeWriteMutationEvidence(args2,directory){let phase=args2.phase;if(!Number.isInteger(phase)||phase<1)return JSON.stringify({success:!1,phase,message:"Invalid phase: must be a positive integer"},null,2);if(!isAcceptedVerdict4(args2.verdict))return JSON.stringify({success:!1,phase,message:"Invalid verdict: must be 'PASS', 'WARN', 'FAIL', or 'SKIP'"},null,2);if(args2.killRate!==void 0){if(typeof args2.killRate!=="number"||Number.isNaN(args2.killRate))return JSON.stringify({success:!1,phase,message:"Invalid killRate: must be a number"},null,2)}if(args2.adjustedKillRate!==void 0){if(typeof args2.adjustedKillRate!=="number"||Number.isNaN(args2.adjustedKillRate))return JSON.stringify({success:!1,phase,message:"Invalid adjustedKillRate: must be a number"},null,2)}let summary=args2.summary;if(typeof summary!=="string"||summary.trim().length===0)return JSON.stringify({success:!1,phase,message:"Invalid summary: must be a non-empty string"},null,2);let normalizedVerdict=_internals332.normalizeVerdict4(args2.verdict),evidenceEntry={type:"mutation-gate",verdict:normalizedVerdict,killRate:args2.killRate??0,adjustedKillRate:args2.adjustedKillRate??0,summary:summary.trim(),timestamp:new Date().toISOString()};if(args2.survivedMutants!==void 0)evidenceEntry.survivedMutants=args2.survivedMutants;let evidenceContent={entries:[evidenceEntry]},filename="mutation-gate.json",relativePath2=path387.join("evidence",String(phase),filename),validatedPath;try{validatedPath=validateSwarmPath(directory,relativePath2)}catch(error93){return JSON.stringify({success:!1,phase,message:error93 instanceof Error?error93.message:"Failed to validate path"},null,2)}let evidenceDir=path387.dirname(validatedPath);try{await fs240.promises.mkdir(evidenceDir,{recursive:!0});let tempPath=path387.join(evidenceDir,`.${filename}.tmp`);return await fs240.promises.writeFile(tempPath,JSON.stringify(evidenceContent,null,2),"utf-8"),await fs240.promises.rename(tempPath,validatedPath),invalidateCachedArtifact(validatedPath),JSON.stringify({success:!0,phase,verdict:normalizedVerdict,message:`Mutation gate evidence written to .swarm/evidence/${phase}/mutation-gate.json`},null,2)}catch(error93){return JSON.stringify({success:!1,phase,message:error93 instanceof Error?error93.message:String(error93)},null,2)}}var _internals332={normalizeVerdict4,VERDICT_SET_4,isAcceptedVerdict4},write_mutation_evidence=createSwarmTool({allowWorkingDirectoryOverride:!0,description:'Write mutation gate evidence for a completed phase. Accepts phase, verdict (PASS/WARN/FAIL/SKIP), killRate, adjustedKillRate, summary, and optional survivedMutants. Normalizes uppercase verdicts to lowercase (PASS→pass, WARN→warn, FAIL→fail, SKIP→skip) and writes entries[0].type="mutation-gate" to .swarm/evidence/{phase}/mutation-gate.json using atomic temp+rename write. Use this after mutation_test tool returns to persist the gate verdict.',args:{phase:exports_external.number().int().min(1).describe("The phase number for the mutation gate (e.g., 1, 2, 3)"),verdict:exports_external.enum(VERDICT_SET_4).describe("Verdict of the mutation gate: 'PASS', 'WARN', 'FAIL', or 'SKIP'"),killRate:exports_external.number().optional().describe("The raw kill rate (e.g., 0.85)"),adjustedKillRate:exports_external.number().optional().describe("The adjusted kill rate accounting for timeout survived mutants (e.g., 0.87)"),summary:exports_external.string().describe("Human-readable summary of the mutation gate result"),survivedMutants:exports_external.string().optional().describe("Optional JSON-serialized list of survived mutants")},execute:async(args2,directory)=>{let rawPhase=args2.phase!==void 0?Number(args2.phase):0;try{let typedArgs={phase:Number(args2.phase),verdict:String(args2.verdict),killRate:args2.killRate!==void 0?Number(args2.killRate):void 0,adjustedKillRate:args2.adjustedKillRate!==void 0?Number(args2.adjustedKillRate):void 0,summary:String(args2.summary??""),survivedMutants:args2.survivedMutants!==void 0?String(args2.survivedMutants):void 0};return await executeWriteMutationEvidence(typedArgs,directory)}catch(error93){return JSON.stringify({success:!1,phase:rawPhase,message:error93 instanceof Error?error93.message:"Unknown error"},null,2)}}});init_zod();init_pr_review_contract();init_pr_workflow_gate();init_utils2();init_finding_policy();init_create_tool();import{createHash as createHash120,randomUUID as randomUUID49}from"node:crypto";import*as fs241 from"node:fs";import*as path388 from"node:path";var PersistedFindingSchema=PrReviewFindingSchema.extend({boundary:exports_external.enum(["post_explorer","post_reviewer","post_critic"]),pr_head_sha:exports_external.string().regex(/^[0-9a-f]{6,64}$/i),recorded_at:exports_external.string().datetime()}).passthrough(),PersistedHandoffSchema=PrReviewHandoffSchema.extend({schema_version:exports_external.literal(1),run_id:PrReviewRunIdSchema,pr_head_sha:exports_external.string().regex(/^[0-9a-f]{6,64}$/i),created_at:exports_external.string().datetime()}).strict();function failure5(message){return JSON.stringify({success:!1,message},null,2)}async function readFindings(filePath){try{return(await readBoundedUtf8File2(filePath,PR_REVIEW_FINDINGS_MAX_BYTES,"findings artifact")).split(/\r?\n/).filter(Boolean).map((line,index)=>{let decoded;try{decoded=JSON.parse(line)}catch(error93){throw Error(`line ${index+1} is not JSON: ${error93 instanceof Error?error93.message:String(error93)}`)}if(decoded!==null&&typeof decoded==="object"){let record3=decoded;if(record3.risk_impact===void 0)record3.risk_impact="UNKNOWN";if(record3.risk_tags===void 0)record3.risk_tags=[]}let parsed=PersistedFindingSchema.safeParse(decoded);if(!parsed.success)throw Error(`line ${index+1} violates the persisted finding schema: ${formatPrReviewValidationIssues(parsed.error.issues,decoded).join("; ")}`);return parsed.data})}catch(error93){if(error93.code==="ENOENT")return[];throw error93}}async function readBoundedUtf8File2(filePath,maxBytes,label){let stat25=await fs241.promises.stat(filePath);if(!stat25.isFile()||stat25.size>maxBytes)throw Error(`${label} is not a bounded regular file (max ${maxBytes} bytes)`);let text=await fs241.promises.readFile(filePath,"utf8"),bytes=Buffer.byteLength(text,"utf8");if(bytes>maxBytes)throw Error(`${label} exceeds ${maxBytes} bytes after read (got ${bytes})`);return text}async function atomicWrite9(filePath,content){await fs241.promises.mkdir(path388.dirname(filePath),{recursive:!0});let tempPath=path388.join(path388.dirname(filePath),`.${path388.basename(filePath)}.${randomUUID49()}.tmp`);try{await fs241.promises.writeFile(tempPath,content,{encoding:"utf8",flag:"wx"}),await fs241.promises.rename(tempPath,filePath)}finally{await fs241.promises.rm(tempPath,{force:!0}).catch(()=>{return})}}async function atomicCreate(filePath,content){await fs241.promises.mkdir(path388.dirname(filePath),{recursive:!0});let tempPath=path388.join(path388.dirname(filePath),`.${path388.basename(filePath)}.${randomUUID49()}.tmp`);try{await fs241.promises.writeFile(tempPath,content,{encoding:"utf8",flag:"wx"});try{return await fs241.promises.link(tempPath,filePath),!0}catch(error93){if(error93.code==="EEXIST")return!1;throw error93}}finally{await fs241.promises.rm(tempPath,{force:!0}).catch(()=>{return})}}var _internals333={atomicWrite:atomicWrite9,atomicCreate,assertBoundary:assertPrReviewArtifactBoundary,assertCriticSettlements,readFindings};function operationFailure(operation,relativePath2,expected,error93){return failure5(`operation ${operation} path "${relativePath2}": expected ${expected}, got ${JSON.stringify(error93 instanceof Error?error93.message:String(error93))}`)}function latestFindings(records){let latest=new Map;for(let record3 of records)latest.set(record3.finding_id,record3);return latest}function canonicalFindingRecords(records){return JSON.stringify(records.map((record3)=>({finding_id:record3.finding_id,status:record3.status,file_line:record3.file_line,evidence:record3.evidence,next_action:record3.next_action,severity:record3.severity,category:record3.category,confidence:record3.confidence,provenance:record3.provenance,risk_impact:record3.risk_impact,risk_tags:record3.risk_tags,critic_status:record3.critic_status})).sort((left,right)=>left.finding_id.localeCompare(right.finding_id)))}function policyLocation(fileLine){let match=fileLine.trim().match(/^(.*?):(\d+)(?:-(\d+))?$/);if(!match)return{file:fileLine.trim(),line:1};return{file:match[1],line:Number(match[2]),...match[3]?{lineEnd:Number(match[3])}:{}}}function policyCandidates(records,sessionID,boundary){return records.map((record3)=>({finding:record3.evidence,severity:record3.severity??"NONE",action:record3.next_action,confidence:record3.confidence??"MEDIUM",category:record3.category??"review-finding",location:policyLocation(record3.file_line),provenance:((record3.provenance?.length)?record3.provenance:[`session:${sessionID}`]).map((identity)=>({identity,lane:boundary})),status:record3.status,sourceFindingId:record3.finding_id}))}function assertCriticSettlements(records,existing,authoritativeCriticVerdicts){let priorById=latestFindings(existing.filter((record3)=>record3.boundary==="post_reviewer")),settlements=[];for(let record3 of records){let prior=priorById.get(record3.finding_id),authoritative=authoritativeCriticVerdicts.get(record3.finding_id),needsCriticAuthority=prior?.next_action==="route_to_critic"||record3.critic_status!==void 0;if(needsCriticAuthority&&!authoritative)throw Error(`critic settlement for ${record3.finding_id} has no authenticated authoritative critic verdict`);if(authoritative?.status==="DOWNGRADED"&&record3.severity===void 0)throw Error(`critic settlement for ${record3.finding_id} DOWNGRADED verdict requires an explicit severity matching the authenticated authoritative critic verdict`);if(authoritative&&record3.severity!==void 0&&authoritative.severity!==record3.severity)throw Error(`critic settlement for ${record3.finding_id} severity contradicts the authenticated authoritative critic verdict`);if(record3.critic_status&&authoritative){if(record3.critic_status!==authoritative.status)throw Error(`critic settlement for ${record3.finding_id} status "${record3.critic_status}" contradicts the authenticated authoritative critic status "${authoritative.status}"`)}let outcome=authoritative?.status==="DISPROVED"||record3.status==="DISPROVED"?"DISPROVED":authoritative?.status==="DOWNGRADED"?"DOWNGRADED":authoritative?.status==="UPHELD"?"UPHELD":prior?.severity&&record3.severity&&prior.severity!==record3.severity?"DOWNGRADED":"UPHELD",settled=settleCriticFinding({finding:{id:record3.finding_id,status:record3.status,severity:record3.severity??"NONE",action:record3.next_action},outcome,finalSeverity:record3.severity,finalAction:record3.next_action});if(settled.finalFinding.severity!==(record3.severity??"NONE")||settled.finalFinding.action!==record3.next_action)throw Error(`critic settlement for ${record3.finding_id} does not match the final persisted severity/action`);if(needsCriticAuthority||authoritative)settlements.push({findingId:record3.finding_id,terminal:settled.terminal,status:settled.status,finalFinding:settled.finalFinding,handoffFindingIds:settled.handoffFindingIds})}return settlements}async function executeWritePrReviewArtifact(args2,directory,context={}){let parsed=WritePrReviewArtifactArgsSchema.safeParse(args2);if(!parsed.success)return failure5(`Invalid PR-review artifact: ${formatPrReviewValidationIssues(parsed.error.issues,args2).join("; ")}`);let sessionID=context.sessionID?.trim();if(!sessionID)return failure5(formatPrReviewRuntimeFieldError("session_id","a non-empty active session identifier",context.sessionID));let state2;try{state2=await readPrWorkflowGateState(directory,sessionID)}catch(error93){return operationFailure("read",`pr-workflow-gates/${prWorkflowSessionFileStem(sessionID)}.json`,"a bounded valid PR workflow state artifact",error93)}if(state2?.mode!=="PR_REVIEW"||!state2.prHeadSha)return failure5(formatPrReviewRuntimeFieldError("workflow.mode",'an active head-bound "PR_REVIEW" workflow',state2?{mode:state2.mode,pr_head_sha:state2.prHeadSha}:null));if(state2.prHeadSha!==parsed.data.pr_head_sha.toLowerCase())return failure5(formatPrReviewRuntimeFieldError("pr_head_sha",`"${state2.prHeadSha}"`,parsed.data.pr_head_sha));let resolvedRunId;try{resolvedRunId=await resolvePrReviewWriterRunId(directory,sessionID,parsed.data.run_id)}catch(error93){let message=error93 instanceof Error?error93.message:String(error93);return message.startsWith("BLOCKED: field ")?failure5(message):operationFailure("reserve",`pr-review/${parsed.data.run_id??"<generated-run-id>"}/run-reservation.json`,"a create-only reservation owned by the active workflow",error93)}let relativeFindingsPath=path388.join("pr-review",resolvedRunId,"findings.jsonl"),findingsPath;try{findingsPath=validateSwarmPath(directory,relativeFindingsPath)}catch(error93){return operationFailure("resolve",relativeFindingsPath.split(path388.sep).join("/"),"a contained path below the project .swarm directory",error93)}let existing;try{existing=await readFindings(findingsPath)}catch(error93){return failure5(`operation read path "${relativeFindingsPath.split(path388.sep).join("/")}": expected bounded JSONL matching the persisted findings schema, got ${error93 instanceof Error?error93.message:String(error93)}`)}if(parsed.data.kind==="findings"){let findingsInput=parsed.data,findingIds=findingsInput.records.map((record3)=>record3.finding_id),existingBoundaryRecords=existing.filter((record3)=>record3.boundary===findingsInput.boundary),hasExistingBoundaryRecords=existingBoundaryRecords.length>0,isExactReplay=hasExistingBoundaryRecords&&canonicalFindingRecords(existingBoundaryRecords)===canonicalFindingRecords(findingsInput.records),boundaryCommitted=state2.prReviewArtifactRunId===resolvedRunId&&(state2.prReviewArtifactBoundaries??[]).includes(findingsInput.boundary),existingBoundaryIds=new Set(existingBoundaryRecords.map((record3)=>record3.finding_id)),requestedFindingIds=new Set(findingIds),isPostExplorerSupersession=boundaryCommitted&&findingsInput.boundary==="post_explorer"&&Boolean(state2.prReviewTriggerEvalPath)&&existingBoundaryIds.size<requestedFindingIds.size&&[...existingBoundaryIds].every((id)=>requestedFindingIds.has(id)),isCommittedReplay=isExactReplay&&boundaryCommitted,partialAdmissionToRollback,rollbackPartialAdmission=async()=>{if(!partialAdmissionToRollback)return;try{return await rollbackPrReviewPartialBaseCoverageAdmission(directory,sessionID,partialAdmissionToRollback)?void 0:"partial base coverage admission could not be safely rolled back because durable state changed"}catch(error93){return`partial base coverage admission rollback failed: ${error93 instanceof Error?error93.message:String(error93)}`}},withPartialAdmissionRollback=async(result)=>{let rollbackError=await rollbackPartialAdmission();if(!rollbackError)return result;try{let decoded=JSON.parse(result);return typeof decoded.message==="string"?failure5(`${decoded.message}; ${rollbackError}`):result}catch{return result}};if(!isCommittedReplay)try{await _internals333.assertBoundary(directory,sessionID,resolvedRunId,findingsInput.boundary,findingIds,findingsInput.partial_base_coverage?{skipBaseCoverage:!0}:void 0)}catch(error93){return withPartialAdmissionRollback(failure5(formatPrReviewRuntimeFieldError(findingsInput.partial_base_coverage?"partial_base_coverage":"boundary",findingsInput.partial_base_coverage?"a terminal N-of-6 settlement: every declared unresolved dimension terminal (typed failure, explicit cancellation, or never launched) after every other boundary predicate passes":`the legal next "${findingsInput.boundary}" checkpoint for run "${resolvedRunId}" with exact inventory [${findingIds.join(", ")}]`,error93 instanceof Error?error93.message:String(error93))))}try{await assertPrReviewArtifactRecordsMatchAuthoritativeVerdicts(directory,sessionID,findingsInput.boundary,findingsInput.records)}catch(error93){return failure5(formatPrReviewRuntimeFieldError("records",`records exactly matching authoritative ${findingsInput.boundary} verdicts and disposition rules`,error93 instanceof Error?error93.message:String(error93)))}if(hasExistingBoundaryRecords&&boundaryCommitted&&!isExactReplay&&!isPostExplorerSupersession)return failure5(formatPrReviewRuntimeFieldError("records",`an exact replay of the already-persisted "${findingsInput.boundary}" boundary`,findingsInput.records));if(!isCommittedReplay)try{if(findingsInput.partial_base_coverage){let hadPartialAdmission=Boolean(state2.prReviewPartialBaseCoverage||state2.prReviewCoverageDisclosurePath||state2.prReviewCoverageDisclosureDigest);if(await _internals333.assertBoundary(directory,sessionID,resolvedRunId,findingsInput.boundary,findingIds,{skipBaseCoverage:!0}),state2=await admitPrReviewPartialBaseCoverage2(directory,sessionID,resolvedRunId,findingsInput.partial_base_coverage.unresolved_dimensions),!hadPartialAdmission&&state2.prReviewPartialBaseCoverage&&state2.prReviewCoverageDisclosurePath&&state2.prReviewCoverageDisclosureDigest)partialAdmissionToRollback={runId:state2.prReviewPartialBaseCoverage.runId,boundary:findingsInput.boundary,relativePath:state2.prReviewCoverageDisclosurePath,digest:state2.prReviewCoverageDisclosureDigest}}if(findingsInput.partial_base_coverage)await _internals333.assertBoundary(directory,sessionID,resolvedRunId,findingsInput.boundary,findingIds)}catch(error93){return withPartialAdmissionRollback(failure5(formatPrReviewRuntimeFieldError(findingsInput.partial_base_coverage?"partial_base_coverage":"boundary",findingsInput.partial_base_coverage?"a terminal N-of-6 settlement: every declared unresolved dimension terminal (typed failure, explicit cancellation, or never launched) after every other boundary predicate passes":`the legal next "${findingsInput.boundary}" checkpoint for run "${resolvedRunId}" with exact inventory [${findingIds.join(", ")}]`,error93 instanceof Error?error93.message:String(error93))))}let recordedAt=new Date().toISOString(),appended=isExactReplay?[]:findingsInput.records.map((record3)=>({...record3,boundary:findingsInput.boundary,pr_head_sha:state2.prHeadSha,recorded_at:recordedAt})),allRecords=[...existing,...appended],serializedFindings=allRecords.map((record3)=>JSON.stringify(record3)).join(`
|
|
7877
7877
|
`)+(allRecords.length>0?`
|
|
7878
7878
|
`:""),findingsDigest=createHash120("sha256").update(serializedFindings,"utf8").digest("hex"),criticSettlements;if(findingsInput.boundary==="post_critic")try{let authoritativeCriticVerdicts=existing.some((record3)=>record3.boundary==="post_reviewer"&&record3.next_action==="route_to_critic")?await readAuthoritativePrReviewCriticVerdicts(directory,sessionID):new Map;criticSettlements=assertCriticSettlements(findingsInput.records,existing,authoritativeCriticVerdicts)}catch(error93){return withPartialAdmissionRollback(operationFailure("validate",relativeFindingsPath.split(path388.sep).join("/"),"an authoritative critic settlement matching the authenticated critic verdict map",error93))}if(!isExactReplay){let serializedBytes=Buffer.byteLength(serializedFindings,"utf8");if(serializedBytes>PR_REVIEW_FINDINGS_MAX_BYTES)return withPartialAdmissionRollback(failure5(formatPrReviewRuntimeFieldError("records",`a complete findings artifact at most ${PR_REVIEW_FINDINGS_MAX_BYTES} UTF-8 bytes`,`${serializedBytes} bytes`)));try{await _internals333.atomicWrite(findingsPath,serializedFindings)}catch(error93){return withPartialAdmissionRollback(operationFailure("write",relativeFindingsPath.split(path388.sep).join("/"),"an atomic findings checkpoint write",error93))}}let latest2=latestFindings(allRecords);if(findingsInput.boundary==="post_critic")try{let synthesis=synthesizePrReviewFindings({candidates:policyCandidates([...latest2.values()],sessionID,findingsInput.boundary)});await persistReviewOutcome({projectRoot:directory,routeReceipt:{kind:"pr_review_finding_policy",version:1,sessionId:sessionID,taskId:resolvedRunId,boundary:findingsInput.boundary,prHeadSha:state2.prHeadSha,findingsPath:relativeFindingsPath.split(path388.sep).join("/"),findingsDigest},synthesis:{...synthesis,criticSettlements}})}catch(error93){return withPartialAdmissionRollback(operationFailure("persist",`pr-review/${resolvedRunId}/finding-policy.json`,"an authoritative version-1 critic settlement and finding-policy evidence record",error93))}let handoffRequired=deriveFeedbackHandoffFindingIds([...latest2.values()]).length>0;if(!isCommittedReplay)try{await markPrReviewArtifactBoundary(directory,sessionID,resolvedRunId,findingsInput.boundary,relativeFindingsPath.split(path388.sep).join("/"),findingIds,handoffRequired)}catch(error93){return withPartialAdmissionRollback(operationFailure("update",`pr-workflow-gates/${prWorkflowSessionFileStem(sessionID)}.json`,`a durable ${findingsInput.boundary} boundary receipt`,error93))}return JSON.stringify({success:!0,run_id:resolvedRunId,path:relativeFindingsPath.split(path388.sep).join("/"),boundary:findingsInput.boundary,appended:appended.length,replayed:isExactReplay,handoff_required:handoffRequired,...state2.prReviewPartialBaseCoverage?{partial_base_coverage:{unresolved_dimensions:normalizePrReviewPartialBaseCoverageRecord(state2.prReviewPartialBaseCoverage).unresolvedDimensions.map((entry)=>({dimension:entry.dimension,terminal_state:entry.terminalState,reason_kind:entry.reasonKind,failure_class:entry.failureClass})),path:state2.prReviewCoverageDisclosurePath,digest:state2.prReviewCoverageDisclosureDigest}}:{}},null,2)}let latest=latestFindings(existing),actionableIds=deriveFeedbackHandoffFindingIds([...latest.values()]),requestedIds=[...new Set(parsed.data.handoff.finding_ids)].sort();if(actionableIds.length===0||JSON.stringify(actionableIds)!==JSON.stringify(requestedIds))return failure5(`field handoff.finding_ids: expected authoritative actionable set [${actionableIds.join(", ")||"(none)"}], got requested [${requestedIds.join(", ")||"(none)"}]`);let relativeHandoffPath=path388.join("pr-review",resolvedRunId,"feedback-handoff.json"),handoffPath;try{handoffPath=validateSwarmPath(directory,relativeHandoffPath)}catch(error93){return operationFailure("resolve",relativeHandoffPath.split(path388.sep).join("/"),"a contained path below the project .swarm directory",error93)}let handoffRecord={schema_version:1,run_id:resolvedRunId,pr_head_sha:state2.prHeadSha,created_at:new Date().toISOString(),...parsed.data.handoff},comparableHandoff=(record3)=>({schema_version:record3.schema_version,run_id:record3.run_id,pr_head_sha:record3.pr_head_sha,pr_url:record3.pr_url,finding_ids:record3.finding_ids,summary:record3.summary,provenance:record3.provenance}),handoffsMatch=(existing2)=>JSON.stringify(comparableHandoff(existing2))===JSON.stringify(comparableHandoff(handoffRecord)),readPersistedHandoff=async()=>{let raw=await readBoundedUtf8File2(handoffPath,PR_REVIEW_HANDOFF_MAX_BYTES,"handoff artifact"),decoded;try{decoded=JSON.parse(raw)}catch(error93){throw Error(`invalid JSON: ${error93 instanceof Error?error93.message:String(error93)}`)}let validated=PersistedHandoffSchema.safeParse(decoded);if(!validated.success)throw Error(`schema mismatch: ${formatPrReviewValidationIssues(validated.error.issues,decoded).join("; ")}`);return validated.data},existingHandoff=null;try{existingHandoff=await readPersistedHandoff()}catch(error93){if(error93.code!=="ENOENT")return failure5(`operation read path "${relativeHandoffPath.split(path388.sep).join("/")}": expected bounded JSON matching the persisted handoff schema, got ${error93 instanceof Error?error93.message:String(error93)}`)}if(existingHandoff){if(!handoffsMatch(existingHandoff))return failure5("field handoff: expected an exact retry of the persisted handoff, got conflicting handoff content")}else{let serializedHandoff=`${JSON.stringify(handoffRecord,null,2)}
|
|
7879
|
-
`,serializedHandoffBytes=Buffer.byteLength(serializedHandoff,"utf8");if(serializedHandoffBytes>PR_REVIEW_HANDOFF_MAX_BYTES)return failure5(formatPrReviewRuntimeFieldError("handoff",`a persisted handoff artifact at most ${PR_REVIEW_HANDOFF_MAX_BYTES} UTF-8 bytes`,`${serializedHandoffBytes} bytes`));let created;try{created=await _internals333.atomicCreate(handoffPath,serializedHandoff)}catch(error93){return operationFailure("create",relativeHandoffPath.split(path388.sep).join("/"),"an atomic create-only handoff artifact",error93)}if(!created){let raced;try{raced=await readPersistedHandoff()}catch(error93){return failure5(`operation read path "${relativeHandoffPath.split(path388.sep).join("/")}": expected the concurrently persisted handoff schema, got ${error93 instanceof Error?error93.message:String(error93)}`)}if(!handoffsMatch(raced))return failure5("field handoff: expected an exact retry of the persisted handoff, got conflicting concurrent handoff content")}}let alreadyOffered;try{alreadyOffered=(await markPrReviewHandoffComplete(directory,sessionID,resolvedRunId,relativeHandoffPath.split(path388.sep).join("/"))).alreadyOffered}catch(error93){return operationFailure("update",`pr-review/${resolvedRunId}/feedback-consent.json and pr-workflow-gates/${prWorkflowSessionFileStem(sessionID)}.json`,"a matching durable consent offer and handoff receipt",error93)}return JSON.stringify({success:!0,run_id:resolvedRunId,path:relativeHandoffPath.split(path388.sep).join("/"),finding_count:actionableIds.length,already_offered:alreadyOffered,confirmation_command:`/swarm pr-feedback ${parsed.data.handoff.pr_url} continue from .swarm/${relativeHandoffPath.split(path388.sep).join("/")}`},null,2)}var write_pr_review_artifact=createSwarmTool({allowWorkingDirectoryOverride:!0,description:"Persist schema-validated PR-review findings checkpoints and exact actionable feedback handoffs under the active run.",args:{kind:exports_external.enum(["findings","handoff"]),run_id:PrReviewRunIdSchema.optional(),pr_head_sha:exports_external.string().trim().regex(/^[0-9a-f]{6,64}$/i),boundary:exports_external.enum(["post_explorer","post_reviewer","post_critic"]).optional(),records:exports_external.array(PrReviewFindingSchema).min(1).max(1000).optional(),partial_base_coverage:PrReviewPartialBaseCoverageSchema.optional(),handoff:PrReviewHandoffSchema.optional()},execute:executeWritePrReviewArtifact});init_zod();init_lane_output_store();init_pending_delegations();init_pr_review_contract();init_pr_review_trigger_contract();init_workspace_snapshot();init_pr_workflow_gate();init_utils2();init_logger();init_create_tool();init_pr_review_trigger_contract();import{randomUUID as randomUUID50}from"node:crypto";import fs242 from"node:fs";import path389 from"node:path";var _internals334={resolvePrWorkflowRevisionDigest,resolvePrWorkflowRevisionDigestAsync,resolveMergeBase:resolveExactMergeBase,resolveMergeBaseAsync:resolveExactMergeBaseAsync,markPrReviewTriggerEvaluationComplete,findByBatchIdDetailed,readPrWorkflowGateState};function comparableTriggerReceipt(receipt){return JSON.stringify({...receipt,evaluated_at:void 0,base_verification:void 0})}async function readBoundedTriggerReceipt(destination){let stat25=await fs242.promises.stat(destination);if(!stat25.isFile()||stat25.size>PR_REVIEW_TRIGGER_RECEIPT_MAX_BYTES)throw Error(`trigger evaluation receipt is not a bounded regular file (max ${PR_REVIEW_TRIGGER_RECEIPT_MAX_BYTES} bytes)`);let raw=await fs242.promises.readFile(destination,"utf8"),bytes=Buffer.byteLength(raw,"utf8");if(bytes>PR_REVIEW_TRIGGER_RECEIPT_MAX_BYTES)throw Error(`trigger evaluation receipt exceeds ${PR_REVIEW_TRIGGER_RECEIPT_MAX_BYTES} bytes after read (got ${bytes})`);let decoded;try{decoded=JSON.parse(raw)}catch(error93){throw Error(`trigger evaluation receipt is not valid JSON: ${error93 instanceof Error?error93.message:String(error93)}`)}if(parsePrReviewTriggerReceipt(decoded),decoded.schema_version!==2)throw Error("trigger evaluation receipt must use schema_version 2");return decoded}async function createTriggerReceipt(destination,content){let parent=path389.dirname(destination),tempPath=path389.join(parent,`.trigger-eval.${randomUUID50()}.tmp`);await fs242.promises.mkdir(parent,{recursive:!0});try{await fs242.promises.writeFile(tempPath,content,{encoding:"utf8",flag:"wx"});try{return await fs242.promises.link(tempPath,destination),!0}catch(error93){if(error93.code==="EEXIST")return!1;throw error93}}finally{await fs242.promises.rm(tempPath,{force:!0}).catch(()=>{return})}}async function resolveCurrentRevisionDigest(directory,prHeadSha){if(_internals334.resolvePrWorkflowRevisionDigest!==resolvePrWorkflowRevisionDigest)return _internals334.resolvePrWorkflowRevisionDigest(directory,prHeadSha);return _internals334.resolvePrWorkflowRevisionDigestAsync(directory,prHeadSha)}var REVISION_DIGEST_RESOLUTION_ATTEMPTS=2;async function resolveCurrentRevisionDigestWithRetry(directory,prHeadSha){for(let attempt=1;attempt<=REVISION_DIGEST_RESOLUTION_ATTEMPTS;attempt+=1){let digest5=await resolveCurrentRevisionDigest(directory,prHeadSha);if(digest5)return digest5}return null}async function resolveReviewMergeBase(directory,baseRef,prHeadSha){if(_internals334.resolveMergeBase!==resolveExactMergeBase)return _internals334.resolveMergeBase(directory,baseRef,prHeadSha);return _internals334.resolveMergeBaseAsync(directory,baseRef,prHeadSha)}var WritePrReviewTriggerEvalArgsSchema=exports_external.object({run_id:PrReviewRunIdSchema.optional(),pr_head_sha:exports_external.string().trim().regex(/^[0-9a-f]{6,64}$/i),base_sha:exports_external.string().trim().regex(/^[0-9a-f]{6,64}$/i).optional(),base_ref:exports_external.string().trim().regex(/^(?!-)[A-Za-z0-9][A-Za-z0-9._/-]{0,255}$/).optional(),rows:exports_external.array(PrReviewWriterInputRowSchema).min(1)}).strict();function failure6(message){return JSON.stringify({success:!1,message},null,2)}async function executeWritePrReviewTriggerEval(args2,directory,context={}){let writerLedger;try{writerLedger=validatePrReviewWriterInputLedger(typeof args2==="object"&&args2!==null?args2.rows:void 0)}catch(error93){return failure6(error93 instanceof Error?error93.message:String(error93))}let parsed=WritePrReviewTriggerEvalArgsSchema.safeParse(args2);if(!parsed.success)return failure6(`Invalid trigger evaluation: ${formatPrReviewValidationIssues(parsed.error.issues,args2).join("; ")}`);let sessionID=context.sessionID?.trim();if(!sessionID)return failure6("PR_REVIEW trigger evaluation requires the current session to have an active, bound PR_REVIEW gate");let gateState;try{gateState=await readPrWorkflowGateState(directory,sessionID)}catch(error93){return failure6(error93 instanceof Error?error93.message:String(error93))}if(gateState?.mode!=="PR_REVIEW"||!gateState.prHeadSha)return failure6("PR_REVIEW trigger evaluation requires the current session to have an active, bound PR_REVIEW gate");if(gateState.prHeadSha!==parsed.data.pr_head_sha)return failure6(formatPrReviewRuntimeFieldError("pr_head_sha",`"${gateState.prHeadSha}"`,parsed.data.pr_head_sha));try{await assertPrReviewBaseCoverageSettled2(directory,sessionID)}catch(error93){return failure6(error93 instanceof Error?error93.message:String(error93))}if(!gateState.prReviewTriggerLedger)return failure6("PR_REVIEW trigger evaluation requires the canonical ledger frozen by the first micro dispatch — dispatch the first swarm-pr-review:micro batch with the complete trigger_evaluation parameter on dispatch_lanes_async; that dispatch freezes the ledger this tool then persists");let frozenLedger;try{frozenLedger=validatePrReviewInlineTriggerLedger(gateState.prReviewTriggerLedger)}catch(error93){return failure6(`Persisted PR_REVIEW trigger ledger is invalid: ${error93 instanceof Error?error93.message:String(error93)}`)}let classificationDrift=frozenLedger.rows.filter((row,index)=>writerLedger.rows[index]?.result!==row.result).map((row)=>row.trigger_id);if(classificationDrift.length>0)return failure6(`PR_REVIEW trigger classification drift from the canonical ledger frozen across micro dispatches: ${classificationDrift.join(", ")}`);let triggerLedger;try{triggerLedger=validatePrReviewPersistedInputLedger(frozenLedger.rows.map((frozenRow,index)=>{let writerRow=writerLedger.rows[index];if(frozenRow.result==="NOT_TRIGGERED")return frozenRow;if(!writerRow||writerRow.result!=="MATCHED")throw Error(`missing MATCHED provenance for ${frozenRow.trigger_id}`);return{...frozenRow,source_batch_id:writerRow.source_batch_id,source_lane_id:writerRow.source_lane_id}}))}catch(error93){return failure6(error93 instanceof Error?error93.message:String(error93))}let validatedRows=triggerLedger.rows,currentRevisionDigest=await resolveCurrentRevisionDigestWithRetry(directory,parsed.data.pr_head_sha);if(!currentRevisionDigest)return failure6(`Active PR_REVIEW trigger evaluation could not bind the current exact revision digest for pr_head_sha "${parsed.data.pr_head_sha}" after ${REVISION_DIGEST_RESOLUTION_ATTEMPTS} attempts. A null digest collapses several causes: the bounded git call timed out, the git process failed to spawn, the working tree could not be read, or pr_head_sha was rejected as an unsafe revision token. This fails closed on purpose and has no bound-value fallback — no independently-bound durable PR_REVIEW revision digest exists to compare against, so accepting an unresolved digest would let a lane artifact self-certify its own revision. Nothing was persisted, so this call is retryable as-is. Recovery: confirm the checkout is readable and pr_head_sha exists here (git rev-parse), retry once the environment settles, or restart with abort_pr_workflow (kind "recovery").`);let citedLaneOwnership=new Map,coverageDegradations=[],countFamilyDispatchAttempts=(state2,triggerId,prHeadSha)=>(state2?.prReviewMicroFamilyDispatches??[]).filter((dispatchRecord)=>dispatchRecord.prHeadSha===prHeadSha&&dispatchRecord.lanes.some((lane)=>((lane.ownedWorkflowLanes?.length)?lane.ownedWorkflowLanes:lane.workflowLane?[lane.workflowLane]:[]).includes(triggerId)));for(let row of validatedRows){if(row.result!=="MATCHED")continue;let batchRead=_internals334.findByBatchIdDetailed(directory,row.source_batch_id,{parentSessionId:sessionID});if(batchRead.status==="uncertain")return failure6(`MATCHED trigger ${row.trigger_id} cannot be validated: the delegation store is unreadable after ${batchRead.attempts} attempts (${batchRead.reason}); the batch's records are UNKNOWN, not absent. Nothing was persisted, so this call is retryable as-is once the store is readable.`);let record3=batchRead.value.find((candidate2)=>candidate2.laneId===row.source_lane_id),recordOwnedLanes=record3?.ownedWorkflowLanes?.length?record3.ownedWorkflowLanes:record3?.workflowLane?[record3.workflowLane]:[];citedLaneOwnership.set(`${row.source_batch_id}\x00${row.source_lane_id}`,recordOwnedLanes);let outputRef=record3?.result?.outputRef?.trim(),outputArtifact=outputRef?readLaneOutput(directory,outputRef):null,provenanceFailure=!record3||record3.mode!=="swarm-pr-review:micro"||!recordOwnedLanes.includes(row.trigger_id)||!record3.result?.digest?.trim()||!record3.result?.outputRef?.trim()||!outputArtifact||outputArtifact.artifact.batchId!==row.source_batch_id||outputArtifact.artifact.laneId!==row.source_lane_id||outputArtifact.artifact.mode!=="swarm-pr-review:micro"||outputArtifact.artifact.sessionId!==record3.subagentSessionId||outputArtifact.artifact.parentSessionId!==record3.parentSessionId||outputArtifact.artifact.agent!==record3.swarmPrefixedAgent||outputArtifact.artifact.role!==record3.normalizedAgent||outputArtifact.artifact.source!=="collect_lane_results"||outputArtifact.artifact.workflowLane!==record3.workflowLane||outputArtifact.artifact.prHeadSha!==record3.workspace?.prHeadSha||outputArtifact.artifact.gitHead!==record3.workspace?.gitHead||outputArtifact.artifact.revisionDigest!==currentRevisionDigest||outputArtifact.artifact.digest!==record3.result?.digest||outputArtifact.artifact.chars!==record3.result?.chars||record3.workspace?.prHeadSha!==parsed.data.pr_head_sha||record3.workspace?.gitHead!==parsed.data.pr_head_sha,laneAlreadySubmittedReceipt=!!record3?.result?.prReviewResultReceipt||!!record3?.terminalResult?.result.prReviewResultReceipt,deadFamilyRecordShape=provenanceFailure&&!laneAlreadySubmittedReceipt&&!!record3&&record3.mode==="swarm-pr-review:micro"&&recordOwnedLanes.includes(row.trigger_id)&&(record3.status==="stale"||record3.status==="error")&&record3.result?.workflowLaneFailureClass==="liveness"&&!record3.result?.outputRef?.trim()&&!outputArtifact&&record3.workspace?.prHeadSha===parsed.data.pr_head_sha&&record3.workspace?.gitHead===parsed.data.pr_head_sha,snapshotFamilyAttempts=countFamilyDispatchAttempts(gateState,row.trigger_id,parsed.data.pr_head_sha),citedBatchAmongRecordedAttempts=snapshotFamilyAttempts.some((dispatchRecord)=>dispatchRecord.batchId===row.source_batch_id),deadFamilyRetryBudgetExhausted=snapshotFamilyAttempts.length>=1+PR_REVIEW_MICRO_FAMILY_RETRY_BUDGET&&citedBatchAmongRecordedAttempts,livenessTerminalDead=deadFamilyRecordShape&&deadFamilyRetryBudgetExhausted;if(deadFamilyRecordShape&&!deadFamilyRetryBudgetExhausted)return failure6(snapshotFamilyAttempts.length<1+PR_REVIEW_MICRO_FAMILY_RETRY_BUDGET?`MATCHED trigger ${row.trigger_id} cites a liveness-dead micro lane, but the dead-family disclosure requires the bounded retry budget (initial dispatch plus ${PR_REVIEW_MICRO_FAMILY_RETRY_BUDGET} retries) to be exhausted first: only ${snapshotFamilyAttempts.length} dispatch attempt(s) for this family are recorded in gate state for pr_head_sha "${parsed.data.pr_head_sha}"${citedBatchAmongRecordedAttempts?"":`, and the cited batch "${row.source_batch_id}" is not among them`}. Nothing was persisted, so this call is retryable as-is. Recovery: re-dispatch the family (each micro dispatch_lanes acknowledgment records one attempt) or restart with abort_pr_workflow (kind "recovery").`:`MATCHED trigger ${row.trigger_id} cites a liveness-dead micro lane whose batch "${row.source_batch_id}" is not among the recorded dispatch attempts for this family under pr_head_sha "${parsed.data.pr_head_sha}", so retry-budget exhaustion cannot be attributed to the cited lane. Nothing was persisted, so this call is retryable as-is. Recovery: re-dispatch the family or restart with abort_pr_workflow (kind "recovery").`);if(provenanceFailure&&!livenessTerminalDead)return failure6(`MATCHED trigger ${row.trigger_id} does not reference a verifiable micro-lane provenance chain`);if(livenessTerminalDead){let freshRead=_internals334.findByBatchIdDetailed(directory,row.source_batch_id,{parentSessionId:sessionID});if(freshRead.status==="uncertain")return failure6(`MATCHED trigger ${row.trigger_id} cannot be validated: the delegation store is unreadable after ${freshRead.attempts} attempts (${freshRead.reason}); the batch's records are UNKNOWN, not absent. Nothing was persisted, so this call is retryable as-is once the store is readable.`);let freshRecord2=freshRead.value.find((candidate2)=>candidate2.laneId===row.source_lane_id),freshOwnedLanes=freshRecord2?.ownedWorkflowLanes?.length?freshRecord2.ownedWorkflowLanes:freshRecord2?.workflowLane?[freshRecord2.workflowLane]:[],freshAlreadySubmittedReceipt=!!freshRecord2?.result?.prReviewResultReceipt||!!freshRecord2?.terminalResult?.result.prReviewResultReceipt;if(!(!!freshRecord2&&freshRecord2.mode==="swarm-pr-review:micro"&&freshOwnedLanes.includes(row.trigger_id)&&(freshRecord2.status==="stale"||freshRecord2.status==="error")&&freshRecord2.result?.workflowLaneFailureClass==="liveness"&&!freshRecord2.result?.outputRef?.trim()&&freshRecord2.workspace?.prHeadSha===parsed.data.pr_head_sha&&freshRecord2.workspace?.gitHead===parsed.data.pr_head_sha&&!freshAlreadySubmittedReceipt))return failure6(`MATCHED trigger ${row.trigger_id} does not reference a verifiable micro-lane provenance chain`);let freshGateState;try{freshGateState=await _internals334.readPrWorkflowGateState(directory,sessionID)}catch(error93){return failure6(error93 instanceof Error?error93.message:String(error93))}let freshFamilyAttempts=countFamilyDispatchAttempts(freshGateState,row.trigger_id,parsed.data.pr_head_sha);if(!(freshFamilyAttempts.length>=1+PR_REVIEW_MICRO_FAMILY_RETRY_BUDGET&&freshFamilyAttempts.some((dispatchRecord)=>dispatchRecord.batchId===row.source_batch_id)))return failure6(`MATCHED trigger ${row.trigger_id} cites a liveness-dead micro lane, but the persisted dispatch-attempt ledger no longer proves the retry budget exhausted for this family at the decision moment (${freshFamilyAttempts.length} attempt(s) recorded, cited batch ${row.source_batch_id}). Nothing was persisted, so this call is retryable as-is. Recovery: re-dispatch the family or restart with abort_pr_workflow (kind "recovery").`);coverageDegradations.push({trigger_id:row.trigger_id,source_batch_id:row.source_batch_id,source_lane_id:row.source_lane_id,reason:`liveness-terminal dead family: lane settled ${freshRecord2.status} with typed liveness class (presumed host abandonment), no retained artifact; family disclosed unattested; retry budget exhausted after ${freshFamilyAttempts.length} recorded dispatch attempt(s) for this family (cited batch ${row.source_batch_id} among them)`});continue}let degradationReasons=[];if(record3.status!=="completed")degradationReasons.push(`lane status ${record3.status}`);if(record3.result?.outputDegraded===!0)degradationReasons.push("output degraded");if(record3.result?.transcriptIncomplete===!0)degradationReasons.push("transcript incomplete");if(record3.result?.truncated===!0)degradationReasons.push("output truncated");if((record3.result?.chars??0)<=0)degradationReasons.push("empty output");if(!prReviewDiscoveryArtifactCoversLane(outputArtifact.artifact.text,row.trigger_id,recordOwnedLanes,record3.mode))degradationReasons.push(`no covered candidate or clean row for: ${row.trigger_id}`);for(let reason of degradationReasons)coverageDegradations.push({trigger_id:row.trigger_id,source_batch_id:row.source_batch_id,source_lane_id:row.source_lane_id,reason})}let citedLaneEntries=[...citedLaneOwnership.entries()];for(let i=0;i<citedLaneEntries.length;i++)for(let j=i+1;j<citedLaneEntries.length;j++){let[keyA,ownedA]=citedLaneEntries[i],[keyB,ownedB]=citedLaneEntries[j],overlap2=ownedA.filter((family)=>ownedB.includes(family));if(overlap2.length>0)return failure6(`PR_REVIEW trigger evaluation cites two lanes with overlapping ownership: "${keyA}" and "${keyB}" both declare ${overlap2.join(", ")}`)}let matchedFamilySet=new Set(triggerLedger.matchedIds),citedOwnershipSet=new Set(citedLaneEntries.flatMap(([,owned])=>owned)),ownershipOutsideMatchedLedger=[...citedOwnershipSet].filter((family)=>!matchedFamilySet.has(family)),matchedWithoutOwnedLane=[...matchedFamilySet].filter((family)=>!citedOwnershipSet.has(family));if(ownershipOutsideMatchedLedger.length>0||matchedWithoutOwnedLane.length>0)return failure6(`PR_REVIEW cited lane ownership must equal the MATCHED trigger set; owned but NOT_TRIGGERED/unlisted: ${ownershipOutsideMatchedLedger.join(", ")||"(none)"}; MATCHED without cited ownership: ${matchedWithoutOwnedLane.join(", ")||"(none)"}`);if(!parsed.data.base_sha)return failure6("Active PR_REVIEW trigger evaluation requires the exact merge-base base_sha");if(!parsed.data.base_ref)return failure6("Active PR_REVIEW trigger evaluation requires the exact live base_ref used to verify base_sha");if(!gateState.prReviewBaseRef||!gateState.prReviewBaseSha)return failure6('Active PR_REVIEW trigger evaluation requires a durably bound review base; the active PR_REVIEW gate has no bound base_ref/base_sha, so the received scope cannot be verified against anything. Re-bind the review scope by dispatching the review lanes for this PR, or restart with abort_pr_workflow (kind "recovery").');let resolvedMergeBase=await resolveReviewMergeBase(directory,parsed.data.base_ref,parsed.data.pr_head_sha),baseVerification="live";if(resolvedMergeBase){if(resolvedMergeBase.toLowerCase()!==parsed.data.base_sha.toLowerCase())return failure6(`PR_REVIEW merge-base mismatch: expected ${resolvedMergeBase}, received ${parsed.data.base_sha}`);if(gateState.prReviewBaseRef!==parsed.data.base_ref||gateState.prReviewBaseSha!==parsed.data.base_sha.toLowerCase())return failure6(`PR_REVIEW trigger evaluation scope mismatch: workflow is bound to ${gateState.prReviewBaseRef??"(unbound)"} at ${gateState.prReviewBaseSha??"(unbound)"}, received ${parsed.data.base_ref} at ${parsed.data.base_sha}`)}else if(parsed.data.base_ref===gateState.prReviewBaseRef&&parsed.data.base_sha.toLowerCase()===gateState.prReviewBaseSha)baseVerification="bound_fallback",criticalWarn(`PR_REVIEW trigger evaluation could not re-derive the merge base for base_ref "${parsed.data.base_ref}" at pr_head_sha "${parsed.data.pr_head_sha}"; proceeding on the durably bound, bind-time-verified review scope (${gateState.prReviewBaseRef} at ${gateState.prReviewBaseSha}). The receipt discloses base_verification: bound_fallback and the final review report must disclose it too.`);else return failure6(`Active PR_REVIEW trigger evaluation could not resolve the exact merge base from base_ref "${parsed.data.base_ref}" and pr_head_sha "${parsed.data.pr_head_sha}", and the received scope does not equal the durably bound review scope (${gateState.prReviewBaseRef} at ${gateState.prReviewBaseSha}), so the bound-scope fallback does not apply. A null resolution collapses several causes: the bounded git call timed out, the git process failed to spawn, base_ref is not resolvable in this checkout, or base_ref/pr_head_sha was rejected as an unsafe revision token. Recovery: verify both revisions exist here (git rev-parse), retry once the environment settles, or restart with abort_pr_workflow (kind "recovery").`);let matchedCount=validatedRows.filter((row)=>row.result==="MATCHED").length,dispatchedMicroLaneCount2=new Set(validatedRows.filter((row)=>row.result==="MATCHED").map((row)=>`${row.source_batch_id}\x00${row.source_lane_id}`)).size,microFloor=Math.min(PR_REVIEW_MICRO_LANE_FLOORS[gateState.prReviewDepthTier??"L"],matchedCount);if(dispatchedMicroLaneCount2<microFloor)return failure6(`PR_REVIEW micro lane floor unmet: depth tier ${gateState.prReviewDepthTier??"L"} requires at least ${microFloor} dispatched micro lane(s) across the attestation; the ledger attributes ${matchedCount} matched families to only ${dispatchedMicroLaneCount2}`);let resolvedRunId;try{resolvedRunId=await resolvePrReviewWriterRunId(directory,sessionID,parsed.data.run_id)}catch(error93){return failure6(error93 instanceof Error?error93.message:String(error93))}let artifact=buildPrReviewTriggerReceiptV2({run_id:resolvedRunId,pr_head_sha:parsed.data.pr_head_sha,base_ref:parsed.data.base_ref,base_sha:parsed.data.base_sha,evaluated_at:new Date().toISOString(),dispatched_micro_lane_count:dispatchedMicroLaneCount2,rows:validatedRows,coverage_degradations:coverageDegradations,base_verification:baseVerification}),relativePath2=path389.join("pr-review",resolvedRunId,"trigger-eval.json"),destination;try{destination=validateSwarmPath(directory,relativePath2)}catch(error93){return failure6(error93 instanceof Error?error93.message:String(error93))}let replayed=!1;try{let existing=null;try{existing=await readBoundedTriggerReceipt(destination)}catch(error93){if(error93.code!=="ENOENT")throw error93}if(existing){if(comparableTriggerReceipt(existing)!==comparableTriggerReceipt(artifact))return failure6(`PR_REVIEW trigger evaluation receipt already exists for run "${resolvedRunId}" with conflicting content`);artifact=existing,replayed=!0}else if(!await createTriggerReceipt(destination,`${JSON.stringify(artifact,null,2)}
|
|
7880
|
-
`)){let raced=await readBoundedTriggerReceipt(destination);if(comparableTriggerReceipt(raced)!==comparableTriggerReceipt(artifact))return failure6(`PR_REVIEW trigger evaluation receipt concurrently appeared for run "${resolvedRunId}" with conflicting content`);artifact=raced,replayed=!0}}catch(error93){return failure6(`Failed to read or persist trigger evaluation at "${relativePath2.split(path389.sep).join("/")}": ${error93 instanceof Error?error93.message:String(error93)}`)}try{await _internals334.markPrReviewTriggerEvaluationComplete(directory,sessionID,resolvedRunId,relativePath2.split(path389.sep).join("/"))}catch(error93){return failure6(`Failed to persist trigger evaluation gate receipt for "${relativePath2.split(path389.sep).join("/")}": ${error93 instanceof Error?error93.message:String(error93)}`)}return JSON.stringify({success:!0,replayed,run_id:resolvedRunId,path:relativePath2.split(path389.sep).join("/"),trigger_count:artifact.trigger_count,matched_count:artifact.matched_count,not_triggered_count:artifact.not_triggered_count,no_match_count:artifact.no_match_count,dispatched_micro_lane_count:dispatchedMicroLaneCount2,base_verification:baseVerification,...baseVerification==="bound_fallback"?{base_verification_note:"live merge-base re-derivation was unavailable; the bound review scope was used and MUST be disclosed in the final review report"}:{},coverage_degradation_count:coverageDegradations.length,...coverageDegradations.length>0?{coverage_degradations:coverageDegradations,note:"degraded families recorded on the receipt; disclose them in the final review report"}:{}},null,2)}var write_pr_review_trigger_eval=createSwarmTool({allowWorkingDirectoryOverride:!0,description:"Persist the complete, exact-set PR-review trigger receipt after every MATCHED family has completed. Supply classifications and MATCHED provenance; evidence is optional and non-authoritative because the receipt reuses evidence frozen by the first micro dispatch. NOT_TRIGGERED families remain provenance-free.",args:{run_id:WritePrReviewTriggerEvalArgsSchema.shape.run_id,pr_head_sha:WritePrReviewTriggerEvalArgsSchema.shape.pr_head_sha,base_sha:WritePrReviewTriggerEvalArgsSchema.shape.base_sha,base_ref:WritePrReviewTriggerEvalArgsSchema.shape.base_ref,rows:WritePrReviewTriggerEvalArgsSchema.shape.rows},execute:executeWritePrReviewTriggerEval});init_write_retro();function defineHandlers(handlers){return handlers}var TOOL_MANIFEST=defineHandlers({diff:()=>diff,diff_summary:()=>diff_summary,syntax_check:()=>syntax_check,placeholder_scan:()=>placeholder_scan,imports:()=>imports,lint:()=>lint,secretscan:()=>secretscan,sast_scan:()=>sast_scan,build_check:()=>build_check,pre_check_batch:()=>pre_check_batch,quality_budget:()=>quality_budget,symbols:()=>symbols,complexity_hotspots:()=>complexity_hotspots,schema_drift:()=>schema_drift,todo_extract:()=>todo_extract,evidence_check:()=>evidence_check,check_gate_status:()=>check_gate_status,completion_verify:()=>completion_verify,complete_pr_workflow:()=>complete_pr_workflow,abort_pr_workflow:()=>abort_pr_workflow,cancel_lane_batch:()=>cancel_lane_batch,authorize_pr_review_reentry:()=>authorize_pr_review_reentry,submit_pr_review_result:()=>submit_pr_review_result,approve_plan_critic:()=>approve_plan_critic,approve_retry_sounding_board:()=>approve_retry_sounding_board,recover_rework_task:()=>recover_rework_task,recover_stage_a_task:()=>recover_stage_a_task,prepare_pr_workflow_checkout:()=>prepare_pr_workflow_checkout,record_implementation_review:()=>record_implementation_review,record_issue_publication:()=>record_issue_publication,record_issue_reproduction:()=>record_issue_reproduction,record_recurrence_sweep:()=>record_recurrence_sweep,record_branch_freshness:()=>record_branch_freshness,record_trace_validation:()=>record_trace_validation,record_merge_approval:()=>record_merge_approval,invalidate_pr_feedback_publication:()=>invalidate_pr_feedback_publication,rebind_pr_feedback_head:()=>rebind_pr_feedback_head,run_pr_feedback_stage_a:()=>run_pr_feedback_stage_a,submit_council_verdicts:()=>submit_council_verdicts,submit_phase_council_verdicts:()=>submit_phase_council_verdicts,declare_council_criteria:()=>declare_council_criteria,sbom_generate:()=>sbom_generate,checkpoint:()=>checkpoint,pkg_audit:()=>pkg_audit,parse_lane_candidates:()=>parse_lane_candidates,plan_conflict_check:()=>plan_conflict_check,prepare_pr_feedback_scope:()=>prepare_pr_feedback_scope,write_pr_review_artifact:()=>write_pr_review_artifact,pr_review_submission:()=>pr_review_submission,export_pr_review_partial_results:()=>export_pr_review_partial_results,write_pr_review_trigger_eval:()=>write_pr_review_trigger_eval,test_runner:()=>test_runner,test_impact:()=>test_impact,mutation_test:()=>mutation_test,generate_mutants:()=>generate_mutants,detect_domains:()=>detect_domains,git_blame:()=>git_blame,gitingest:()=>gitingest,retrieve_summary:()=>retrieve_summary,retrieve_lane_output:()=>retrieve_lane_output,extract_code_blocks:()=>extract_code_blocks,phase_complete:()=>phase_complete,run_phase_review:()=>run_phase_review,repair_gate_evidence:()=>repair_gate_evidence,repair_knowledge_receipt_ledger:()=>repair_knowledge_receipt_ledger,record_directive_override:()=>record_directive_override,save_plan:()=>save_plan,update_task_status:()=>update_task_status,lint_spec:()=>lint_spec,write_retro:()=>write_retro,write_drift_evidence:()=>write_drift_evidence,write_hallucination_evidence:()=>write_hallucination_evidence,write_mutation_evidence:()=>write_mutation_evidence,declare_scope:()=>declare_scope,scope_validate:()=>scope_validate,knowledge_query:()=>knowledge_query,doc_scan:()=>doc_scan,doc_extract:()=>doc_extract,curator_analyze:()=>curator_analyze,consensus_mine:()=>consensus_mine,knowledge_add:()=>knowledge_add,knowledge_recall:()=>knowledge_recall,knowledge_remove:()=>knowledge_remove,co_change_analyzer:()=>co_change_analyzer,context_status:()=>context_status,search:()=>search,ast_grep:()=>ast_grep,actionlint_scan:()=>actionlint_scan,osv_scan:()=>osv_scan,gh_evidence:()=>gh_evidence,pr_workflow_status:()=>pr_workflow_status,batch_symbols:()=>batch_symbols,suggest_patch:()=>suggestPatch,req_coverage:()=>req_coverage,get_approved_plan:()=>get_approved_plan,repo_map:()=>repo_map,get_qa_gate_profile:()=>get_qa_gate_profile,set_qa_gates:()=>set_qa_gates,web_search:()=>web_search,web_fetch:()=>web_fetch,convene_general_council:()=>convene_general_council,write_final_council_evidence:()=>write_final_council_evidence,skill_generate:()=>skill_generate,skill_list:()=>skill_list,skill_apply:()=>skill_apply,skill_inspect:()=>skill_inspect,run_stale_reconciliation:()=>run_stale_reconciliation,skill_regenerate:()=>skill_regenerate,skill_retire:()=>skill_retire,skill_improve:()=>skill_improve,spec_write:()=>spec_write,knowledge_receipt:()=>knowledge_receipt,knowledge_receipt_status:()=>knowledge_receipt_status,knowledge_archive:()=>knowledge_archive,swarm_memory_recall:()=>swarm_memory_recall,swarm_memory_propose:()=>swarm_memory_propose,swarm_memory_outcome:()=>swarm_memory_outcome,swarm_command:()=>swarm_command,dispatch_lanes:()=>dispatch_lanes,dispatch_lanes_async:()=>dispatch_lanes_async,collect_lane_results:()=>collect_lane_results,summarize_work:()=>summarize_work,write_architecture_supervisor_evidence:()=>write_architecture_supervisor_evidence,lean_turbo_plan_lanes:()=>lean_turbo_plan_lanes,lean_turbo_acquire_locks:()=>lean_turbo_acquire_locks,lean_turbo_critic:()=>lean_turbo_critic,lean_turbo_runner_status:()=>lean_turbo_runner_status,lean_turbo_review:()=>lean_turbo_review,lean_turbo_run_phase:()=>lean_turbo_run_phase,lean_turbo_status:()=>lean_turbo_status,swarm_apply_patch:()=>swarmApplyPatch2,external_skill_discover:()=>external_skill_discover,external_skill_list:()=>external_skill_list,external_skill_inspect:()=>external_skill_inspect,external_skill_promote:()=>external_skill_promote,external_skill_reject:()=>external_skill_reject,external_skill_delete:()=>external_skill_delete,external_skill_revoke:()=>external_skill_revoke,epic_next_wave:()=>epic_next_wave,epic_phase_review:()=>epic_phase_review});function buildPluginToolObject(agents,config3,evaluationModelDispatcher,reviewModelDispatcher,generatedAgentNames=Object.keys(agents),reviewAgentModelRegistry,getActiveAgentName){let tools={},reviewAgentNames=Object.freeze([...generatedAgentNames]),knowledgeEnabled=config3?.knowledge?.enabled!==!1,knowledgeTools=new Set(["knowledge_add","knowledge_recall","knowledge_remove","knowledge_query","knowledge_receipt","knowledge_archive"]);for(let[name,handler]of Object.entries(TOOL_MANIFEST)){if(!knowledgeEnabled&&knowledgeTools.has(name))continue;tools[name]=handler()}tools.swarm_command=createSwarmCommandTool(agents,evaluationModelDispatcher,reviewModelDispatcher,config3?.auto_review,reviewAgentModelRegistry,getActiveAgentName),tools.phase_complete=createPhaseCompleteTool({reviewModelDispatcher,generatedAgentNames:reviewAgentNames,reviewAgentModelRegistry,getActiveAgentName}),tools.run_phase_review=createRunPhaseReviewTool(reviewModelDispatcher,reviewAgentNames,reviewAgentModelRegistry,getActiveAgentName),tools.lean_turbo_review=createLeanTurboReviewTool(reviewModelDispatcher,reviewAgentNames,reviewAgentModelRegistry,getActiveAgentName),tools.lean_turbo_critic=createLeanTurboCriticTool(reviewModelDispatcher,reviewAgentNames,reviewAgentModelRegistry,getActiveAgentName),tools.lean_turbo_run_phase=createLeanTurboRunPhaseTool(reviewAgentNames),tools.epic_phase_review=createEpicPhaseReviewTool(reviewModelDispatcher,reviewAgentNames,reviewAgentModelRegistry,getActiveAgentName);let tracked={};for(let[name,def]of Object.entries(tools)){let execute2=def.execute;if(typeof execute2==="function")tracked[name]={...def,execute:withStartupFirstToolTracking(name,execute2)};else tracked[name]=def}return tracked}init_package();init_consent();init_vault();var PLUGIN_VERSION=package_default.version,MAX_DEDUP_PER_SESSION=4096,MAX_TRACKED_DEDUP_SESSIONS=500,GUIDANCE_CARRIER_ID_PREFIX2="swarm-guidance:",DIRECTIVE_TEXT_PREFIX="<swarm_system_directive";function safeStringify(value){try{return JSON.stringify(value)??""}catch{return String(value)}}var _internals335={appendRecord:appendTrainingVaultRecord,readConsent:(directory)=>readActiveTrainingConsent(directory),buildRecord:buildTrainingVaultRecord};function kindForRole(role){if(role==="user")return"user_message";if(role==="assistant")return"assistant_message";return null}function createTrainingCaptureObserver(directory){let dedupBySession=new Map;function markSeen(sessionId,recordId){let entry=dedupBySession.get(sessionId);if(!entry){entry={order:[],seen:new Set},dedupBySession.set(sessionId,entry);while(dedupBySession.size>MAX_TRACKED_DEDUP_SESSIONS){let oldest=dedupBySession.keys().next().value;if(oldest===void 0)break;dedupBySession.delete(oldest)}}if(entry.seen.has(recordId))return!1;if(entry.seen.add(recordId),entry.order.push(recordId),entry.order.length>MAX_DEDUP_PER_SESSION){let evicted=entry.order.shift();if(evicted!==void 0)entry.seen.delete(evicted)}return!0}function capture(kind,role,content,sessionId,source){let consent=_internals335.readConsent(directory);if(!consent)return;let record3=_internals335.buildRecord({directory,kind,role,content,sessionId,pluginVersion:PLUGIN_VERSION,source,consent});if(!markSeen(sessionId,record3.record_id))return;_internals335.appendRecord(directory,record3)}return{async observeMessages(output){try{let messages=output?.messages;if(!Array.isArray(messages))return;for(let message of messages)try{let info=message?.info;if(!info)continue;let sessionId=info.sessionID;if(typeof sessionId!=="string"||sessionId.length===0)continue;if(typeof info.id==="string"&&info.id.startsWith(GUIDANCE_CARRIER_ID_PREFIX2))continue;let kind=kindForRole(info.role??"");if(!kind)continue;let parts=message.parts;if(!Array.isArray(parts))continue;for(let part of parts)try{if(part?.type!=="text")continue;let text=typeof part.text==="string"?part.text:"";if(text.length===0)continue;if(text.startsWith(DIRECTIVE_TEXT_PREFIX))continue;capture(kind,info.role??"",text,sessionId,"chat")}catch{}}catch{}}catch{}},async observeToolExecution(event){try{let sessionId=event?.sessionID;if(typeof sessionId!=="string"||sessionId.length===0)return;let tool3=typeof event?.tool==="string"?event.tool:"unknown",inputSummary=safeStringify(event?.input);if(inputSummary.length>0)capture("tool_call","tool",inputSummary,sessionId,"tool");let outputSummary=safeStringify(event?.error??event?.output??"");if(outputSummary.length>0&&outputSummary!=='""')capture("tool_result","tool",`${tool3}
|
|
7879
|
+
`,serializedHandoffBytes=Buffer.byteLength(serializedHandoff,"utf8");if(serializedHandoffBytes>PR_REVIEW_HANDOFF_MAX_BYTES)return failure5(formatPrReviewRuntimeFieldError("handoff",`a persisted handoff artifact at most ${PR_REVIEW_HANDOFF_MAX_BYTES} UTF-8 bytes`,`${serializedHandoffBytes} bytes`));let created;try{created=await _internals333.atomicCreate(handoffPath,serializedHandoff)}catch(error93){return operationFailure("create",relativeHandoffPath.split(path388.sep).join("/"),"an atomic create-only handoff artifact",error93)}if(!created){let raced;try{raced=await readPersistedHandoff()}catch(error93){return failure5(`operation read path "${relativeHandoffPath.split(path388.sep).join("/")}": expected the concurrently persisted handoff schema, got ${error93 instanceof Error?error93.message:String(error93)}`)}if(!handoffsMatch(raced))return failure5("field handoff: expected an exact retry of the persisted handoff, got conflicting concurrent handoff content")}}let alreadyOffered;try{alreadyOffered=(await markPrReviewHandoffComplete(directory,sessionID,resolvedRunId,relativeHandoffPath.split(path388.sep).join("/"))).alreadyOffered}catch(error93){return operationFailure("update",`pr-review/${resolvedRunId}/feedback-consent.json and pr-workflow-gates/${prWorkflowSessionFileStem(sessionID)}.json`,"a matching durable consent offer and handoff receipt",error93)}return JSON.stringify({success:!0,run_id:resolvedRunId,path:relativeHandoffPath.split(path388.sep).join("/"),finding_count:actionableIds.length,already_offered:alreadyOffered,confirmation_command:`/swarm pr-feedback ${parsed.data.handoff.pr_url} continue from .swarm/${relativeHandoffPath.split(path388.sep).join("/")}`},null,2)}var write_pr_review_artifact=createSwarmTool({allowWorkingDirectoryOverride:!0,description:"Persist schema-validated PR-review findings checkpoints and exact actionable feedback handoffs under the active run.",args:{kind:exports_external.enum(["findings","handoff"]),run_id:PrReviewRunIdSchema.optional(),pr_head_sha:exports_external.string().trim().regex(/^[0-9a-f]{6,64}$/i),boundary:exports_external.enum(["post_explorer","post_reviewer","post_critic"]).optional(),records:exports_external.array(PrReviewFindingSchema).min(1).max(1000).optional(),partial_base_coverage:PrReviewPartialBaseCoverageSchema.optional(),handoff:PrReviewHandoffSchema.optional()},execute:executeWritePrReviewArtifact});init_zod();init_lane_output_store();init_pending_delegations();init_pr_review_contract();init_pr_review_trigger_contract();init_workspace_snapshot();init_pr_workflow_gate();init_utils2();init_logger();init_create_tool();init_pr_review_trigger_contract();import{randomUUID as randomUUID50}from"node:crypto";import fs242 from"node:fs";import path389 from"node:path";var _internals334={resolvePrWorkflowRevisionDigest,resolvePrWorkflowRevisionDigestAsync,resolveMergeBase:resolveExactMergeBase,resolveMergeBaseAsync:resolveExactMergeBaseAsync,markPrReviewTriggerEvaluationComplete,findByBatchIdDetailed,readPrWorkflowGateState,comparableTriggerReceipt};function comparableTriggerReceipt(receipt){return JSON.stringify({...receipt,evaluated_at:void 0,base_verification:void 0,coverage_degradations:receipt.coverage_degradations??[],receipt_covered_families:receipt.receipt_covered_families??[]})}async function readBoundedTriggerReceipt(destination){let stat25=await fs242.promises.stat(destination);if(!stat25.isFile()||stat25.size>PR_REVIEW_TRIGGER_RECEIPT_MAX_BYTES)throw Error(`trigger evaluation receipt is not a bounded regular file (max ${PR_REVIEW_TRIGGER_RECEIPT_MAX_BYTES} bytes)`);let raw=await fs242.promises.readFile(destination,"utf8"),bytes=Buffer.byteLength(raw,"utf8");if(bytes>PR_REVIEW_TRIGGER_RECEIPT_MAX_BYTES)throw Error(`trigger evaluation receipt exceeds ${PR_REVIEW_TRIGGER_RECEIPT_MAX_BYTES} bytes after read (got ${bytes})`);let decoded;try{decoded=JSON.parse(raw)}catch(error93){throw Error(`trigger evaluation receipt is not valid JSON: ${error93 instanceof Error?error93.message:String(error93)}`)}if(parsePrReviewTriggerReceipt(decoded),decoded.schema_version!==2)throw Error("trigger evaluation receipt must use schema_version 2");return decoded}async function createTriggerReceipt(destination,content){let parent=path389.dirname(destination),tempPath=path389.join(parent,`.trigger-eval.${randomUUID50()}.tmp`);await fs242.promises.mkdir(parent,{recursive:!0});try{await fs242.promises.writeFile(tempPath,content,{encoding:"utf8",flag:"wx"});try{return await fs242.promises.link(tempPath,destination),!0}catch(error93){if(error93.code==="EEXIST")return!1;throw error93}}finally{await fs242.promises.rm(tempPath,{force:!0}).catch(()=>{return})}}async function resolveCurrentRevisionDigest(directory,prHeadSha){if(_internals334.resolvePrWorkflowRevisionDigest!==resolvePrWorkflowRevisionDigest)return _internals334.resolvePrWorkflowRevisionDigest(directory,prHeadSha);return _internals334.resolvePrWorkflowRevisionDigestAsync(directory,prHeadSha)}var REVISION_DIGEST_RESOLUTION_ATTEMPTS=2;async function resolveCurrentRevisionDigestWithRetry(directory,prHeadSha){for(let attempt=1;attempt<=REVISION_DIGEST_RESOLUTION_ATTEMPTS;attempt+=1){let digest5=await resolveCurrentRevisionDigest(directory,prHeadSha);if(digest5)return digest5}return null}async function resolveReviewMergeBase(directory,baseRef,prHeadSha){if(_internals334.resolveMergeBase!==resolveExactMergeBase)return _internals334.resolveMergeBase(directory,baseRef,prHeadSha);return _internals334.resolveMergeBaseAsync(directory,baseRef,prHeadSha)}var WritePrReviewTriggerEvalArgsSchema=exports_external.object({run_id:PrReviewRunIdSchema.optional(),pr_head_sha:exports_external.string().trim().regex(/^[0-9a-f]{6,64}$/i),base_sha:exports_external.string().trim().regex(/^[0-9a-f]{6,64}$/i).optional(),base_ref:exports_external.string().trim().regex(/^(?!-)[A-Za-z0-9][A-Za-z0-9._/-]{0,255}$/).optional(),rows:exports_external.array(PrReviewWriterInputRowSchema).min(1)}).strict();function failure6(message){return JSON.stringify({success:!1,message},null,2)}async function executeWritePrReviewTriggerEval(args2,directory,context={}){let writerLedger;try{writerLedger=validatePrReviewWriterInputLedger(typeof args2==="object"&&args2!==null?args2.rows:void 0)}catch(error93){return failure6(error93 instanceof Error?error93.message:String(error93))}let parsed=WritePrReviewTriggerEvalArgsSchema.safeParse(args2);if(!parsed.success)return failure6(`Invalid trigger evaluation: ${formatPrReviewValidationIssues(parsed.error.issues,args2).join("; ")}`);let sessionID=context.sessionID?.trim();if(!sessionID)return failure6("PR_REVIEW trigger evaluation requires the current session to have an active, bound PR_REVIEW gate");let gateState;try{gateState=await readPrWorkflowGateState(directory,sessionID)}catch(error93){return failure6(error93 instanceof Error?error93.message:String(error93))}if(gateState?.mode!=="PR_REVIEW"||!gateState.prHeadSha)return failure6("PR_REVIEW trigger evaluation requires the current session to have an active, bound PR_REVIEW gate");if(gateState.prHeadSha!==parsed.data.pr_head_sha)return failure6(formatPrReviewRuntimeFieldError("pr_head_sha",`"${gateState.prHeadSha}"`,parsed.data.pr_head_sha));try{await assertPrReviewBaseCoverageSettled2(directory,sessionID)}catch(error93){return failure6(error93 instanceof Error?error93.message:String(error93))}if(!gateState.prReviewTriggerLedger)return failure6("PR_REVIEW trigger evaluation requires the canonical ledger frozen by the first micro dispatch — dispatch the first swarm-pr-review:micro batch with the complete trigger_evaluation parameter on dispatch_lanes_async; that dispatch freezes the ledger this tool then persists");let frozenLedger;try{frozenLedger=validatePrReviewInlineTriggerLedger(gateState.prReviewTriggerLedger)}catch(error93){return failure6(`Persisted PR_REVIEW trigger ledger is invalid: ${error93 instanceof Error?error93.message:String(error93)}`)}let classificationDrift=frozenLedger.rows.filter((row,index)=>writerLedger.rows[index]?.result!==row.result).map((row)=>row.trigger_id);if(classificationDrift.length>0)return failure6(`PR_REVIEW trigger classification drift from the canonical ledger frozen across micro dispatches: ${classificationDrift.join(", ")}`);let triggerLedger;try{triggerLedger=validatePrReviewPersistedInputLedger(frozenLedger.rows.map((frozenRow,index)=>{let writerRow=writerLedger.rows[index];if(frozenRow.result==="NOT_TRIGGERED")return frozenRow;if(!writerRow||writerRow.result!=="MATCHED")throw Error(`missing MATCHED provenance for ${frozenRow.trigger_id}`);return{...frozenRow,source_batch_id:writerRow.source_batch_id,source_lane_id:writerRow.source_lane_id}}))}catch(error93){return failure6(error93 instanceof Error?error93.message:String(error93))}let validatedRows=triggerLedger.rows,currentRevisionDigest=await resolveCurrentRevisionDigestWithRetry(directory,parsed.data.pr_head_sha);if(!currentRevisionDigest)return failure6(`Active PR_REVIEW trigger evaluation could not bind the current exact revision digest for pr_head_sha "${parsed.data.pr_head_sha}" after ${REVISION_DIGEST_RESOLUTION_ATTEMPTS} attempts. A null digest collapses several causes: the bounded git call timed out, the git process failed to spawn, the working tree could not be read, or pr_head_sha was rejected as an unsafe revision token. This fails closed on purpose and has no bound-value fallback — no independently-bound durable PR_REVIEW revision digest exists to compare against, so accepting an unresolved digest would let a lane artifact self-certify its own revision. Nothing was persisted, so this call is retryable as-is. Recovery: confirm the checkout is readable and pr_head_sha exists here (git rev-parse), retry once the environment settles, or restart with abort_pr_workflow (kind "recovery").`);let citedLaneOwnership=new Map,coverageDegradations=[],receiptCoveredFamilies=[],countFamilyDispatchAttempts=(state2,triggerId,prHeadSha)=>(state2?.prReviewMicroFamilyDispatches??[]).filter((dispatchRecord)=>dispatchRecord.prHeadSha===prHeadSha&&dispatchRecord.lanes.some((lane)=>((lane.ownedWorkflowLanes?.length)?lane.ownedWorkflowLanes:lane.workflowLane?[lane.workflowLane]:[]).includes(triggerId)));for(let row of validatedRows){if(row.result!=="MATCHED")continue;let batchRead=_internals334.findByBatchIdDetailed(directory,row.source_batch_id,{parentSessionId:sessionID});if(batchRead.status==="uncertain")return failure6(`MATCHED trigger ${row.trigger_id} cannot be validated: the delegation store is unreadable after ${batchRead.attempts} attempts (${batchRead.reason}); the batch's records are UNKNOWN, not absent. Nothing was persisted, so this call is retryable as-is once the store is readable.`);let record3=batchRead.value.find((candidate2)=>candidate2.laneId===row.source_lane_id),recordOwnedLanes=record3?.ownedWorkflowLanes?.length?record3.ownedWorkflowLanes:record3?.workflowLane?[record3.workflowLane]:[];citedLaneOwnership.set(`${row.source_batch_id}\x00${row.source_lane_id}`,recordOwnedLanes);let outputRef=record3?.result?.outputRef?.trim(),outputArtifact=outputRef?readLaneOutput(directory,outputRef):null,provenanceFailure=!record3||record3.mode!=="swarm-pr-review:micro"||!recordOwnedLanes.includes(row.trigger_id)||!record3.result?.digest?.trim()||!record3.result?.outputRef?.trim()||!outputArtifact||outputArtifact.artifact.batchId!==row.source_batch_id||outputArtifact.artifact.laneId!==row.source_lane_id||outputArtifact.artifact.mode!=="swarm-pr-review:micro"||outputArtifact.artifact.sessionId!==record3.subagentSessionId||outputArtifact.artifact.parentSessionId!==record3.parentSessionId||outputArtifact.artifact.agent!==record3.swarmPrefixedAgent||outputArtifact.artifact.role!==record3.normalizedAgent||outputArtifact.artifact.source!=="collect_lane_results"||outputArtifact.artifact.workflowLane!==record3.workflowLane||outputArtifact.artifact.prHeadSha!==record3.workspace?.prHeadSha||outputArtifact.artifact.gitHead!==record3.workspace?.gitHead||outputArtifact.artifact.revisionDigest!==currentRevisionDigest||outputArtifact.artifact.digest!==record3.result?.digest||outputArtifact.artifact.chars!==record3.result?.chars||record3.workspace?.prHeadSha!==parsed.data.pr_head_sha||record3.workspace?.gitHead!==parsed.data.pr_head_sha,laneAlreadySubmittedReceipt=!!record3?.result?.prReviewResultReceipt||!!record3?.terminalResult?.result.prReviewResultReceipt,deadFamilyRecordShape=provenanceFailure&&!laneAlreadySubmittedReceipt&&!!record3&&record3.mode==="swarm-pr-review:micro"&&recordOwnedLanes.includes(row.trigger_id)&&(record3.status==="stale"||record3.status==="error")&&record3.result?.workflowLaneFailureClass==="liveness"&&!record3.result?.outputRef?.trim()&&!outputArtifact&&record3.workspace?.prHeadSha===parsed.data.pr_head_sha&&record3.workspace?.gitHead===parsed.data.pr_head_sha,snapshotFamilyAttempts=countFamilyDispatchAttempts(gateState,row.trigger_id,parsed.data.pr_head_sha),citedBatchAmongRecordedAttempts=snapshotFamilyAttempts.some((dispatchRecord)=>dispatchRecord.batchId===row.source_batch_id),deadFamilyRetryBudgetExhausted=snapshotFamilyAttempts.length>=1+PR_REVIEW_MICRO_FAMILY_RETRY_BUDGET&&citedBatchAmongRecordedAttempts,livenessTerminalDead=deadFamilyRecordShape&&deadFamilyRetryBudgetExhausted;if(deadFamilyRecordShape&&!deadFamilyRetryBudgetExhausted)return failure6(snapshotFamilyAttempts.length<1+PR_REVIEW_MICRO_FAMILY_RETRY_BUDGET?`MATCHED trigger ${row.trigger_id} cites a liveness-dead micro lane, but the dead-family disclosure requires the bounded retry budget (initial dispatch plus ${PR_REVIEW_MICRO_FAMILY_RETRY_BUDGET} retries) to be exhausted first: only ${snapshotFamilyAttempts.length} dispatch attempt(s) for this family are recorded in gate state for pr_head_sha "${parsed.data.pr_head_sha}"${citedBatchAmongRecordedAttempts?"":`, and the cited batch "${row.source_batch_id}" is not among them`}. Nothing was persisted, so this call is retryable as-is. Recovery: re-dispatch the family (each micro dispatch_lanes acknowledgment records one attempt) or restart with abort_pr_workflow (kind "recovery").`:`MATCHED trigger ${row.trigger_id} cites a liveness-dead micro lane whose batch "${row.source_batch_id}" is not among the recorded dispatch attempts for this family under pr_head_sha "${parsed.data.pr_head_sha}", so retry-budget exhaustion cannot be attributed to the cited lane. Nothing was persisted, so this call is retryable as-is. Recovery: re-dispatch the family or restart with abort_pr_workflow (kind "recovery").`);if(provenanceFailure&&!livenessTerminalDead)return failure6(`MATCHED trigger ${row.trigger_id} does not reference a verifiable micro-lane provenance chain`);if(livenessTerminalDead){let freshRead=_internals334.findByBatchIdDetailed(directory,row.source_batch_id,{parentSessionId:sessionID});if(freshRead.status==="uncertain")return failure6(`MATCHED trigger ${row.trigger_id} cannot be validated: the delegation store is unreadable after ${freshRead.attempts} attempts (${freshRead.reason}); the batch's records are UNKNOWN, not absent. Nothing was persisted, so this call is retryable as-is once the store is readable.`);let freshRecord2=freshRead.value.find((candidate2)=>candidate2.laneId===row.source_lane_id),freshOwnedLanes=freshRecord2?.ownedWorkflowLanes?.length?freshRecord2.ownedWorkflowLanes:freshRecord2?.workflowLane?[freshRecord2.workflowLane]:[],freshAlreadySubmittedReceipt=!!freshRecord2?.result?.prReviewResultReceipt||!!freshRecord2?.terminalResult?.result.prReviewResultReceipt;if(!(!!freshRecord2&&freshRecord2.mode==="swarm-pr-review:micro"&&freshOwnedLanes.includes(row.trigger_id)&&(freshRecord2.status==="stale"||freshRecord2.status==="error")&&freshRecord2.result?.workflowLaneFailureClass==="liveness"&&!freshRecord2.result?.outputRef?.trim()&&freshRecord2.workspace?.prHeadSha===parsed.data.pr_head_sha&&freshRecord2.workspace?.gitHead===parsed.data.pr_head_sha&&!freshAlreadySubmittedReceipt))return failure6(`MATCHED trigger ${row.trigger_id} does not reference a verifiable micro-lane provenance chain`);let freshGateState;try{freshGateState=await _internals334.readPrWorkflowGateState(directory,sessionID)}catch(error93){return failure6(error93 instanceof Error?error93.message:String(error93))}let freshFamilyAttempts=countFamilyDispatchAttempts(freshGateState,row.trigger_id,parsed.data.pr_head_sha);if(!(freshFamilyAttempts.length>=1+PR_REVIEW_MICRO_FAMILY_RETRY_BUDGET&&freshFamilyAttempts.some((dispatchRecord)=>dispatchRecord.batchId===row.source_batch_id)))return failure6(`MATCHED trigger ${row.trigger_id} cites a liveness-dead micro lane, but the persisted dispatch-attempt ledger no longer proves the retry budget exhausted for this family at the decision moment (${freshFamilyAttempts.length} attempt(s) recorded, cited batch ${row.source_batch_id}). Nothing was persisted, so this call is retryable as-is. Recovery: re-dispatch the family or restart with abort_pr_workflow (kind "recovery").`);coverageDegradations.push({trigger_id:row.trigger_id,source_batch_id:row.source_batch_id,source_lane_id:row.source_lane_id,reason:`liveness-terminal dead family: lane settled ${freshRecord2.status} with typed liveness class (presumed host abandonment), no retained artifact; family disclosed unattested; retry budget exhausted after ${freshFamilyAttempts.length} recorded dispatch attempt(s) for this family (cited batch ${row.source_batch_id} among them)`});continue}let creditRecord=record3,freshCreditRead=_internals334.findByBatchIdDetailed(directory,row.source_batch_id,{parentSessionId:sessionID});if(freshCreditRead.status==="uncertain")return failure6(`MATCHED trigger ${row.trigger_id} cannot validate receipt-settled coverage: the delegation store is unreadable after ${freshCreditRead.attempts} attempts (${freshCreditRead.reason}); the batch's records are UNKNOWN, not absent. Nothing was persisted, so this call is retryable as-is once the store is readable.`);let freshCreditRecord=freshCreditRead.value.find((candidate2)=>candidate2.laneId===row.source_lane_id);if(freshCreditRecord&&freshCreditRecord.batchId===creditRecord.batchId&&freshCreditRecord.laneId===creditRecord.laneId&&freshCreditRecord.subagentSessionId===creditRecord.subagentSessionId)creditRecord=freshCreditRecord;let receiptCoverage=validateExactStructuredReceiptCoverage2({record:creditRecord,result:creditRecord.result,artifact:null,expected:{mode:creditRecord.mode==="swarm-pr-review:base"?creditRecord.mode:"swarm-pr-review:micro",workflowLane:creditRecord.workflowLane??row.trigger_id,ownedWorkflowLanes:recordOwnedLanes,prHeadSha:parsed.data.pr_head_sha,gitHead:parsed.data.pr_head_sha,revisionDigest:currentRevisionDigest,workflowInstanceId:gateState.workflowInstanceId,workflowRevision:creditRecord.workflowGeneration,baseSha:gateState.prReviewBaseSha}});if(receiptCoverage.status==="accepted"&&receiptCoverage.creditedWorkflowLanes.includes(row.trigger_id)){receiptCoveredFamilies.push({trigger_id:row.trigger_id,source_batch_id:row.source_batch_id,source_lane_id:row.source_lane_id});continue}let degradationReasons=[];if(record3.status!=="completed")degradationReasons.push(`lane status ${record3.status}`);if(record3.result?.outputDegraded===!0)degradationReasons.push("output degraded");if(record3.result?.transcriptIncomplete===!0)degradationReasons.push("transcript incomplete");if(record3.result?.truncated===!0)degradationReasons.push("output truncated");if((record3.result?.chars??0)<=0)degradationReasons.push("empty output");if(!prReviewDiscoveryArtifactCoversLane(outputArtifact.artifact.text,row.trigger_id,recordOwnedLanes,record3.mode))degradationReasons.push(`no covered candidate or clean row for: ${row.trigger_id}`);for(let reason of degradationReasons)coverageDegradations.push({trigger_id:row.trigger_id,source_batch_id:row.source_batch_id,source_lane_id:row.source_lane_id,reason})}let citedLaneEntries=[...citedLaneOwnership.entries()];for(let i=0;i<citedLaneEntries.length;i++)for(let j=i+1;j<citedLaneEntries.length;j++){let[keyA,ownedA]=citedLaneEntries[i],[keyB,ownedB]=citedLaneEntries[j],overlap2=ownedA.filter((family)=>ownedB.includes(family));if(overlap2.length>0)return failure6(`PR_REVIEW trigger evaluation cites two lanes with overlapping ownership: "${keyA}" and "${keyB}" both declare ${overlap2.join(", ")}`)}let matchedFamilySet=new Set(triggerLedger.matchedIds),citedOwnershipSet=new Set(citedLaneEntries.flatMap(([,owned])=>owned)),ownershipOutsideMatchedLedger=[...citedOwnershipSet].filter((family)=>!matchedFamilySet.has(family)),matchedWithoutOwnedLane=[...matchedFamilySet].filter((family)=>!citedOwnershipSet.has(family));if(ownershipOutsideMatchedLedger.length>0||matchedWithoutOwnedLane.length>0)return failure6(`PR_REVIEW cited lane ownership must equal the MATCHED trigger set; owned but NOT_TRIGGERED/unlisted: ${ownershipOutsideMatchedLedger.join(", ")||"(none)"}; MATCHED without cited ownership: ${matchedWithoutOwnedLane.join(", ")||"(none)"}`);if(!parsed.data.base_sha)return failure6("Active PR_REVIEW trigger evaluation requires the exact merge-base base_sha");if(!parsed.data.base_ref)return failure6("Active PR_REVIEW trigger evaluation requires the exact live base_ref used to verify base_sha");if(!gateState.prReviewBaseRef||!gateState.prReviewBaseSha)return failure6('Active PR_REVIEW trigger evaluation requires a durably bound review base; the active PR_REVIEW gate has no bound base_ref/base_sha, so the received scope cannot be verified against anything. Re-bind the review scope by dispatching the review lanes for this PR, or restart with abort_pr_workflow (kind "recovery").');let resolvedMergeBase=await resolveReviewMergeBase(directory,parsed.data.base_ref,parsed.data.pr_head_sha),baseVerification="live";if(resolvedMergeBase){if(resolvedMergeBase.toLowerCase()!==parsed.data.base_sha.toLowerCase())return failure6(`PR_REVIEW merge-base mismatch: expected ${resolvedMergeBase}, received ${parsed.data.base_sha}`);if(gateState.prReviewBaseRef!==parsed.data.base_ref||gateState.prReviewBaseSha!==parsed.data.base_sha.toLowerCase())return failure6(`PR_REVIEW trigger evaluation scope mismatch: workflow is bound to ${gateState.prReviewBaseRef??"(unbound)"} at ${gateState.prReviewBaseSha??"(unbound)"}, received ${parsed.data.base_ref} at ${parsed.data.base_sha}`)}else if(parsed.data.base_ref===gateState.prReviewBaseRef&&parsed.data.base_sha.toLowerCase()===gateState.prReviewBaseSha)baseVerification="bound_fallback",criticalWarn(`PR_REVIEW trigger evaluation could not re-derive the merge base for base_ref "${parsed.data.base_ref}" at pr_head_sha "${parsed.data.pr_head_sha}"; proceeding on the durably bound, bind-time-verified review scope (${gateState.prReviewBaseRef} at ${gateState.prReviewBaseSha}). The receipt discloses base_verification: bound_fallback and the final review report must disclose it too.`);else return failure6(`Active PR_REVIEW trigger evaluation could not resolve the exact merge base from base_ref "${parsed.data.base_ref}" and pr_head_sha "${parsed.data.pr_head_sha}", and the received scope does not equal the durably bound review scope (${gateState.prReviewBaseRef} at ${gateState.prReviewBaseSha}), so the bound-scope fallback does not apply. A null resolution collapses several causes: the bounded git call timed out, the git process failed to spawn, base_ref is not resolvable in this checkout, or base_ref/pr_head_sha was rejected as an unsafe revision token. Recovery: verify both revisions exist here (git rev-parse), retry once the environment settles, or restart with abort_pr_workflow (kind "recovery").`);let matchedCount=validatedRows.filter((row)=>row.result==="MATCHED").length,dispatchedMicroLaneCount2=new Set(validatedRows.filter((row)=>row.result==="MATCHED").map((row)=>`${row.source_batch_id}\x00${row.source_lane_id}`)).size,microFloor=Math.min(PR_REVIEW_MICRO_LANE_FLOORS[gateState.prReviewDepthTier??"L"],matchedCount);if(dispatchedMicroLaneCount2<microFloor)return failure6(`PR_REVIEW micro lane floor unmet: depth tier ${gateState.prReviewDepthTier??"L"} requires at least ${microFloor} dispatched micro lane(s) across the attestation; the ledger attributes ${matchedCount} matched families to only ${dispatchedMicroLaneCount2}`);let resolvedRunId;try{resolvedRunId=await resolvePrReviewWriterRunId(directory,sessionID,parsed.data.run_id)}catch(error93){return failure6(error93 instanceof Error?error93.message:String(error93))}let artifact=buildPrReviewTriggerReceiptV2({run_id:resolvedRunId,pr_head_sha:parsed.data.pr_head_sha,base_ref:parsed.data.base_ref,base_sha:parsed.data.base_sha,evaluated_at:new Date().toISOString(),dispatched_micro_lane_count:dispatchedMicroLaneCount2,rows:validatedRows,coverage_degradations:coverageDegradations,receipt_covered_families:receiptCoveredFamilies,base_verification:baseVerification}),relativePath2=path389.join("pr-review",resolvedRunId,"trigger-eval.json"),destination;try{destination=validateSwarmPath(directory,relativePath2)}catch(error93){return failure6(error93 instanceof Error?error93.message:String(error93))}let replayed=!1;try{let existing=null;try{existing=await readBoundedTriggerReceipt(destination)}catch(error93){if(error93.code!=="ENOENT")throw error93}if(existing){if(comparableTriggerReceipt(existing)!==comparableTriggerReceipt(artifact))return failure6(`PR_REVIEW trigger evaluation receipt already exists for run "${resolvedRunId}" with conflicting content`);artifact=existing,replayed=!0}else if(!await createTriggerReceipt(destination,`${JSON.stringify(artifact,null,2)}
|
|
7880
|
+
`)){let raced=await readBoundedTriggerReceipt(destination);if(comparableTriggerReceipt(raced)!==comparableTriggerReceipt(artifact))return failure6(`PR_REVIEW trigger evaluation receipt concurrently appeared for run "${resolvedRunId}" with conflicting content`);artifact=raced,replayed=!0}}catch(error93){return failure6(`Failed to read or persist trigger evaluation at "${relativePath2.split(path389.sep).join("/")}": ${error93 instanceof Error?error93.message:String(error93)}`)}try{await _internals334.markPrReviewTriggerEvaluationComplete(directory,sessionID,resolvedRunId,relativePath2.split(path389.sep).join("/"))}catch(error93){return failure6(`Failed to persist trigger evaluation gate receipt for "${relativePath2.split(path389.sep).join("/")}": ${error93 instanceof Error?error93.message:String(error93)}`)}return JSON.stringify({success:!0,replayed,run_id:resolvedRunId,path:relativePath2.split(path389.sep).join("/"),trigger_count:artifact.trigger_count,matched_count:artifact.matched_count,not_triggered_count:artifact.not_triggered_count,no_match_count:artifact.no_match_count,dispatched_micro_lane_count:dispatchedMicroLaneCount2,base_verification:baseVerification,...baseVerification==="bound_fallback"?{base_verification_note:"live merge-base re-derivation was unavailable; the bound review scope was used and MUST be disclosed in the final review report"}:{},coverage_degradation_count:coverageDegradations.length,...coverageDegradations.length>0?{coverage_degradations:coverageDegradations,note:"degraded families recorded on the receipt; disclose them in the final review report"}:{},receipt_covered_family_count:receiptCoveredFamilies.length,...receiptCoveredFamilies.length>0?{receipt_covered_families:receiptCoveredFamilies,receipt_covered_note:"receipt-settled families recorded on the receipt; disclose them as receipt-covered (not transcript-covered, not degraded) in the final review report"}:{}},null,2)}var write_pr_review_trigger_eval=createSwarmTool({allowWorkingDirectoryOverride:!0,description:"Persist the complete, exact-set PR-review trigger receipt after every MATCHED family has completed. Supply classifications and MATCHED provenance; evidence is optional and non-authoritative because the receipt reuses evidence frozen by the first micro dispatch. NOT_TRIGGERED families remain provenance-free.",args:{run_id:WritePrReviewTriggerEvalArgsSchema.shape.run_id,pr_head_sha:WritePrReviewTriggerEvalArgsSchema.shape.pr_head_sha,base_sha:WritePrReviewTriggerEvalArgsSchema.shape.base_sha,base_ref:WritePrReviewTriggerEvalArgsSchema.shape.base_ref,rows:WritePrReviewTriggerEvalArgsSchema.shape.rows},execute:executeWritePrReviewTriggerEval});init_write_retro();function defineHandlers(handlers){return handlers}var TOOL_MANIFEST=defineHandlers({diff:()=>diff,diff_summary:()=>diff_summary,syntax_check:()=>syntax_check,placeholder_scan:()=>placeholder_scan,imports:()=>imports,lint:()=>lint,secretscan:()=>secretscan,sast_scan:()=>sast_scan,build_check:()=>build_check,pre_check_batch:()=>pre_check_batch,quality_budget:()=>quality_budget,symbols:()=>symbols,complexity_hotspots:()=>complexity_hotspots,schema_drift:()=>schema_drift,todo_extract:()=>todo_extract,evidence_check:()=>evidence_check,check_gate_status:()=>check_gate_status,completion_verify:()=>completion_verify,complete_pr_workflow:()=>complete_pr_workflow,abort_pr_workflow:()=>abort_pr_workflow,cancel_lane_batch:()=>cancel_lane_batch,authorize_pr_review_reentry:()=>authorize_pr_review_reentry,submit_pr_review_result:()=>submit_pr_review_result,approve_plan_critic:()=>approve_plan_critic,approve_retry_sounding_board:()=>approve_retry_sounding_board,recover_rework_task:()=>recover_rework_task,recover_stage_a_task:()=>recover_stage_a_task,prepare_pr_workflow_checkout:()=>prepare_pr_workflow_checkout,record_implementation_review:()=>record_implementation_review,record_issue_publication:()=>record_issue_publication,record_issue_reproduction:()=>record_issue_reproduction,record_recurrence_sweep:()=>record_recurrence_sweep,record_branch_freshness:()=>record_branch_freshness,record_trace_validation:()=>record_trace_validation,record_merge_approval:()=>record_merge_approval,invalidate_pr_feedback_publication:()=>invalidate_pr_feedback_publication,rebind_pr_feedback_head:()=>rebind_pr_feedback_head,run_pr_feedback_stage_a:()=>run_pr_feedback_stage_a,submit_council_verdicts:()=>submit_council_verdicts,submit_phase_council_verdicts:()=>submit_phase_council_verdicts,declare_council_criteria:()=>declare_council_criteria,sbom_generate:()=>sbom_generate,checkpoint:()=>checkpoint,pkg_audit:()=>pkg_audit,parse_lane_candidates:()=>parse_lane_candidates,plan_conflict_check:()=>plan_conflict_check,prepare_pr_feedback_scope:()=>prepare_pr_feedback_scope,write_pr_review_artifact:()=>write_pr_review_artifact,pr_review_submission:()=>pr_review_submission,export_pr_review_partial_results:()=>export_pr_review_partial_results,write_pr_review_trigger_eval:()=>write_pr_review_trigger_eval,test_runner:()=>test_runner,test_impact:()=>test_impact,mutation_test:()=>mutation_test,generate_mutants:()=>generate_mutants,detect_domains:()=>detect_domains,git_blame:()=>git_blame,gitingest:()=>gitingest,retrieve_summary:()=>retrieve_summary,retrieve_lane_output:()=>retrieve_lane_output,extract_code_blocks:()=>extract_code_blocks,phase_complete:()=>phase_complete,run_phase_review:()=>run_phase_review,repair_gate_evidence:()=>repair_gate_evidence,repair_knowledge_receipt_ledger:()=>repair_knowledge_receipt_ledger,record_directive_override:()=>record_directive_override,save_plan:()=>save_plan,update_task_status:()=>update_task_status,lint_spec:()=>lint_spec,write_retro:()=>write_retro,write_drift_evidence:()=>write_drift_evidence,write_hallucination_evidence:()=>write_hallucination_evidence,write_mutation_evidence:()=>write_mutation_evidence,declare_scope:()=>declare_scope,scope_validate:()=>scope_validate,knowledge_query:()=>knowledge_query,doc_scan:()=>doc_scan,doc_extract:()=>doc_extract,curator_analyze:()=>curator_analyze,consensus_mine:()=>consensus_mine,knowledge_add:()=>knowledge_add,knowledge_recall:()=>knowledge_recall,knowledge_remove:()=>knowledge_remove,co_change_analyzer:()=>co_change_analyzer,context_status:()=>context_status,search:()=>search,ast_grep:()=>ast_grep,actionlint_scan:()=>actionlint_scan,osv_scan:()=>osv_scan,gh_evidence:()=>gh_evidence,pr_workflow_status:()=>pr_workflow_status,batch_symbols:()=>batch_symbols,suggest_patch:()=>suggestPatch,req_coverage:()=>req_coverage,get_approved_plan:()=>get_approved_plan,repo_map:()=>repo_map,get_qa_gate_profile:()=>get_qa_gate_profile,set_qa_gates:()=>set_qa_gates,web_search:()=>web_search,web_fetch:()=>web_fetch,convene_general_council:()=>convene_general_council,write_final_council_evidence:()=>write_final_council_evidence,skill_generate:()=>skill_generate,skill_list:()=>skill_list,skill_apply:()=>skill_apply,skill_inspect:()=>skill_inspect,run_stale_reconciliation:()=>run_stale_reconciliation,skill_regenerate:()=>skill_regenerate,skill_retire:()=>skill_retire,skill_improve:()=>skill_improve,spec_write:()=>spec_write,knowledge_receipt:()=>knowledge_receipt,knowledge_receipt_status:()=>knowledge_receipt_status,knowledge_archive:()=>knowledge_archive,swarm_memory_recall:()=>swarm_memory_recall,swarm_memory_propose:()=>swarm_memory_propose,swarm_memory_outcome:()=>swarm_memory_outcome,swarm_command:()=>swarm_command,dispatch_lanes:()=>dispatch_lanes,dispatch_lanes_async:()=>dispatch_lanes_async,collect_lane_results:()=>collect_lane_results,summarize_work:()=>summarize_work,write_architecture_supervisor_evidence:()=>write_architecture_supervisor_evidence,lean_turbo_plan_lanes:()=>lean_turbo_plan_lanes,lean_turbo_acquire_locks:()=>lean_turbo_acquire_locks,lean_turbo_critic:()=>lean_turbo_critic,lean_turbo_runner_status:()=>lean_turbo_runner_status,lean_turbo_review:()=>lean_turbo_review,lean_turbo_run_phase:()=>lean_turbo_run_phase,lean_turbo_status:()=>lean_turbo_status,swarm_apply_patch:()=>swarmApplyPatch2,external_skill_discover:()=>external_skill_discover,external_skill_list:()=>external_skill_list,external_skill_inspect:()=>external_skill_inspect,external_skill_promote:()=>external_skill_promote,external_skill_reject:()=>external_skill_reject,external_skill_delete:()=>external_skill_delete,external_skill_revoke:()=>external_skill_revoke,epic_next_wave:()=>epic_next_wave,epic_phase_review:()=>epic_phase_review});function buildPluginToolObject(agents,config3,evaluationModelDispatcher,reviewModelDispatcher,generatedAgentNames=Object.keys(agents),reviewAgentModelRegistry,getActiveAgentName){let tools={},reviewAgentNames=Object.freeze([...generatedAgentNames]),knowledgeEnabled=config3?.knowledge?.enabled!==!1,knowledgeTools=new Set(["knowledge_add","knowledge_recall","knowledge_remove","knowledge_query","knowledge_receipt","knowledge_archive"]);for(let[name,handler]of Object.entries(TOOL_MANIFEST)){if(!knowledgeEnabled&&knowledgeTools.has(name))continue;tools[name]=handler()}tools.swarm_command=createSwarmCommandTool(agents,evaluationModelDispatcher,reviewModelDispatcher,config3?.auto_review,reviewAgentModelRegistry,getActiveAgentName),tools.phase_complete=createPhaseCompleteTool({reviewModelDispatcher,generatedAgentNames:reviewAgentNames,reviewAgentModelRegistry,getActiveAgentName}),tools.run_phase_review=createRunPhaseReviewTool(reviewModelDispatcher,reviewAgentNames,reviewAgentModelRegistry,getActiveAgentName),tools.lean_turbo_review=createLeanTurboReviewTool(reviewModelDispatcher,reviewAgentNames,reviewAgentModelRegistry,getActiveAgentName),tools.lean_turbo_critic=createLeanTurboCriticTool(reviewModelDispatcher,reviewAgentNames,reviewAgentModelRegistry,getActiveAgentName),tools.lean_turbo_run_phase=createLeanTurboRunPhaseTool(reviewAgentNames),tools.epic_phase_review=createEpicPhaseReviewTool(reviewModelDispatcher,reviewAgentNames,reviewAgentModelRegistry,getActiveAgentName);let tracked={};for(let[name,def]of Object.entries(tools)){let execute2=def.execute;if(typeof execute2==="function")tracked[name]={...def,execute:withStartupFirstToolTracking(name,execute2)};else tracked[name]=def}return tracked}init_package();init_consent();init_vault();var PLUGIN_VERSION=package_default.version,MAX_DEDUP_PER_SESSION=4096,MAX_TRACKED_DEDUP_SESSIONS=500,GUIDANCE_CARRIER_ID_PREFIX2="swarm-guidance:",DIRECTIVE_TEXT_PREFIX="<swarm_system_directive";function safeStringify(value){try{return JSON.stringify(value)??""}catch{return String(value)}}var _internals335={appendRecord:appendTrainingVaultRecord,readConsent:(directory)=>readActiveTrainingConsent(directory),buildRecord:buildTrainingVaultRecord};function kindForRole(role){if(role==="user")return"user_message";if(role==="assistant")return"assistant_message";return null}function createTrainingCaptureObserver(directory){let dedupBySession=new Map;function markSeen(sessionId,recordId){let entry=dedupBySession.get(sessionId);if(!entry){entry={order:[],seen:new Set},dedupBySession.set(sessionId,entry);while(dedupBySession.size>MAX_TRACKED_DEDUP_SESSIONS){let oldest=dedupBySession.keys().next().value;if(oldest===void 0)break;dedupBySession.delete(oldest)}}if(entry.seen.has(recordId))return!1;if(entry.seen.add(recordId),entry.order.push(recordId),entry.order.length>MAX_DEDUP_PER_SESSION){let evicted=entry.order.shift();if(evicted!==void 0)entry.seen.delete(evicted)}return!0}function capture(kind,role,content,sessionId,source){let consent=_internals335.readConsent(directory);if(!consent)return;let record3=_internals335.buildRecord({directory,kind,role,content,sessionId,pluginVersion:PLUGIN_VERSION,source,consent});if(!markSeen(sessionId,record3.record_id))return;_internals335.appendRecord(directory,record3)}return{async observeMessages(output){try{let messages=output?.messages;if(!Array.isArray(messages))return;for(let message of messages)try{let info=message?.info;if(!info)continue;let sessionId=info.sessionID;if(typeof sessionId!=="string"||sessionId.length===0)continue;if(typeof info.id==="string"&&info.id.startsWith(GUIDANCE_CARRIER_ID_PREFIX2))continue;let kind=kindForRole(info.role??"");if(!kind)continue;let parts=message.parts;if(!Array.isArray(parts))continue;for(let part of parts)try{if(part?.type!=="text")continue;let text=typeof part.text==="string"?part.text:"";if(text.length===0)continue;if(text.startsWith(DIRECTIVE_TEXT_PREFIX))continue;capture(kind,info.role??"",text,sessionId,"chat")}catch{}}catch{}}catch{}},async observeToolExecution(event){try{let sessionId=event?.sessionID;if(typeof sessionId!=="string"||sessionId.length===0)return;let tool3=typeof event?.tool==="string"?event.tool:"unknown",inputSummary=safeStringify(event?.input);if(inputSummary.length>0)capture("tool_call","tool",inputSummary,sessionId,"tool");let outputSummary=safeStringify(event?.error??event?.output??"");if(outputSummary.length>0&&outputSummary!=='""')capture("tool_result","tool",`${tool3}
|
|
7881
7881
|
${outputSummary}`,sessionId,"tool")}catch{}}}}init_utils();init_git_executable();init_project_boundary();init_provider_error_classification();init_timeout();function truncateToolOutput(output,maxLines,toolName,tailLines=10){if(!output)return output;if(tailLines>=maxLines)tailLines=Math.floor(maxLines/2);let lines=output.split(`
|
|
7882
7882
|
`);if(lines.length<=maxLines)return output;let omittedCount=lines.length-maxLines,headLines=lines.slice(0,maxLines-tailLines),tailContent=lines.slice(-tailLines),footerLines=[];if(footerLines.push(""),footerLines.push(`[... ${omittedCount} line${omittedCount===1?"":"s"} omitted ...]`),toolName)footerLines.push(`Tool: ${toolName}`);return footerLines.push("Use /swarm retrieve <id> to get the full content"),`${headLines.join(`
|
|
7883
7883
|
`)}
|