opencode-swarm 7.188.7 → 7.188.8
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/binaries/win32-arm64/swarm-sandbox-runner.exe +0 -0
- package/binaries/win32-x64/swarm-sandbox-runner.exe +0 -0
- package/dist/cli/{auto-checkpoint-1z9d2jrk.js → auto-checkpoint-cdcf7yeb.js} +4 -4
- package/dist/cli/{checkpoint-f8165pv4.js → checkpoint-jpc3a69d.js} +8 -8
- package/dist/cli/{coder-settlement-gaby6spt.js → coder-settlement-rmaypr7g.js} +3 -3
- package/dist/cli/{config-doctor-4wgw6nak.js → config-doctor-b5t9hrzb.js} +7 -7
- package/dist/cli/{core-y89texpp.js → core-ky5b3mh6.js} +1 -1
- package/dist/cli/{curator-tkz65fvw.js → curator-bsafet3m.js} +25 -25
- package/dist/cli/{curator-drift-rpwrx355.js → curator-drift-2dwkkykq.js} +5 -5
- package/dist/cli/{curator-llm-factory-1qbcj7vs.js → curator-llm-factory-ajtxk3sm.js} +25 -25
- package/dist/cli/{doctor-knowledge-receipt-phase-id-11q7en6t.js → doctor-knowledge-receipt-phase-id-mckkwm0c.js} +4 -4
- package/dist/cli/{evidence-summary-service-hn7vdm45.js → evidence-summary-service-svrt4se9.js} +9 -9
- package/dist/cli/{gate-evidence-sxh3r64f.js → gate-evidence-jcw4mvwr.js} +2 -2
- package/dist/cli/{guardrail-explain-e0wbeyk1.js → guardrail-explain-5j0cg165.js} +26 -26
- package/dist/cli/{guardrail-log-gzrj46h0.js → guardrail-log-h6fc7rnv.js} +3 -3
- package/dist/cli/{guardrail-reset-7z62s1j5.js → guardrail-reset-kjmqnr5r.js} +25 -25
- package/dist/cli/{hive-promoter-88d95wk8.js → hive-promoter-edp5c7k2.js} +25 -25
- package/dist/cli/{index-snwj9ptc.js → index-0g7wya30.js} +1 -1
- package/dist/cli/{index-kap459mr.js → index-11v15np0.js} +2 -2
- package/dist/cli/{index-yj1cwps4.js → index-8gyt9j0a.js} +1 -1
- package/dist/cli/{index-c016phsk.js → index-8hf3rt47.js} +4 -4
- package/dist/cli/{index-y8z9x87e.js → index-9m3pcjf2.js} +1 -1
- package/dist/cli/{index-7k9hdn0b.js → index-b81wsm2s.js} +1 -1
- package/dist/cli/{index-0j5ggeem.js → index-chsaj89g.js} +1 -1
- package/dist/cli/{index-c937rpbm.js → index-d1yjbjf9.js} +3 -3
- package/dist/cli/{index-ghjg1rxe.js → index-d4vrpe06.js} +1 -1
- package/dist/cli/{index-ytms8x1h.js → index-e69469z9.js} +2 -2
- package/dist/cli/{index-rw0c6qtt.js → index-f0kk9daj.js} +3 -3
- package/dist/cli/{index-pnfd3s7s.js → index-fbw4g7yh.js} +1 -1
- package/dist/cli/{index-eh0sg1pz.js → index-fqyd21v7.js} +3 -3
- package/dist/cli/{index-g39cmzpj.js → index-gfqz06ra.js} +2 -2
- package/dist/cli/{index-emh69vk9.js → index-h93hm2ew.js} +124 -62
- package/dist/cli/{index-03ad14qc.js → index-hsmvdecz.js} +2 -2
- package/dist/cli/{index-7eajwwfg.js → index-js2jykf9.js} +1 -1
- package/dist/cli/{index-2wctq2hn.js → index-kwbgrb3y.js} +1 -1
- package/dist/cli/{index-2vtrjm19.js → index-kx0sr39t.js} +27 -27
- package/dist/cli/{index-61kszszd.js → index-mcnqpmw6.js} +2 -2
- package/dist/cli/{index-ffmw6af9.js → index-n8n94des.js} +25 -25
- package/dist/cli/{index-xsdphmet.js → index-nyy3hpwg.js} +6 -6
- package/dist/cli/{index-a4s5yrdd.js → index-pd9hkz4f.js} +3 -3
- package/dist/cli/{index-8sqyx5rh.js → index-qg3tx5az.js} +1 -1
- package/dist/cli/{index-m9g7s9ee.js → index-r89wr177.js} +1 -1
- package/dist/cli/{index-7zyktm9f.js → index-s55t0cdc.js} +5 -5
- package/dist/cli/{index-y3sk68m5.js → index-sarq27b9.js} +1 -1
- package/dist/cli/{index-xj3k6x1h.js → index-vhqcqq73.js} +1 -1
- package/dist/cli/{index-5102w44y.js → index-wbjk8xq9.js} +2 -2
- package/dist/cli/{index-9tes309n.js → index-yyh5kegx.js} +1 -1
- package/dist/cli/index.js +26 -26
- package/dist/cli/{knowledge-escalator-ejfb2e7c.js → knowledge-escalator-ndsm1023.js} +7 -7
- package/dist/cli/{knowledge-events-3fzfehwy.js → knowledge-events-pcbxvykz.js} +5 -5
- package/dist/cli/{knowledge-store-swxk4tr6.js → knowledge-store-00t92ypz.js} +1 -1
- package/dist/cli/{knowledge-validator-0a1at9gm.js → knowledge-validator-f8mkzp37.js} +2 -2
- package/dist/cli/{mcp-0ah7s1j0.js → mcp-sawqgyk6.js} +1 -1
- package/dist/cli/{model-preflight-nfvapzyj.js → model-preflight-7rrjh3wp.js} +25 -25
- package/dist/cli/{pending-delegations-hynywgkj.js → pending-delegations-2161efex.js} +2 -2
- package/dist/cli/{pr-subscriptions-k86p5qcn.js → pr-subscriptions-m47zghfv.js} +1 -1
- package/dist/cli/{pr-workflow-gate-3ett6hjh.js → pr-workflow-gate-hmtae8gc.js} +25 -25
- package/dist/cli/{scan-cursor-9961dhv1.js → scan-cursor-gdy1qjed.js} +2 -2
- package/dist/cli/{schema-s5zbnzmv.js → schema-qaxjz2de.js} +1 -1
- package/dist/cli/{scope-persistence-2w562h83.js → scope-persistence-dnx61ybv.js} +5 -5
- package/dist/cli/{server-vrk0k61v.js → server-6wmhhy81.js} +25 -25
- package/dist/cli/{skill-generator-bfcjzp20.js → skill-generator-sgv3bdgt.js} +8 -8
- package/dist/cli/{snapshot-coordination-init-8ykpp5m6.js → snapshot-coordination-init-qbtzxwga.js} +25 -25
- package/dist/cli/{speckit-checkoff-3x52vw64.js → speckit-checkoff-yepzgcmj.js} +3 -3
- package/dist/cli/{worktree-collision-ownership-kjw1pqfc.js → worktree-collision-ownership-cswsfrj6.js} +2 -2
- package/dist/cli/{worktree-isolation-xdgm4ekx.js → worktree-isolation-vj7egepy.js} +25 -25
- package/dist/hooks/knowledge-receipt-ledger.d.ts +23 -0
- package/dist/hooks/knowledge-receipt-validator.d.ts +10 -0
- package/dist/index.js +11 -11
- package/dist/state.d.ts +48 -0
- package/package.json +1 -1
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.188.7",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"]},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_decide_phase:{description:"Compute the Epic Mode verdict for a phase WITHOUT dispatching coders. Runs preflight + calibration + the three gates (p-threshold, hot-module, greenfield), persists the decision, and returns the verdict so the architect can dispatch waves via the visible Task tool (promote) or fall back to per-task serial (demote). Pair with `epic_plan_waves` to get the wave plan when promoted. Use when /swarm epic is on for the session.",agents:["architect"]},epic_plan_waves:{description:"Partition a phase's pending tasks into ordered concurrent waves for Epic Mode dispatch. A wave is a set of tasks with mutually disjoint declared scopes and all dependencies satisfied by prior waves. Returns `{ waves: [{ waveId, taskIds, files }, ...], serializedTasks, degradedTasks }`. "+'For each wave in order, the architect dispatches one `Task(subagent_type="coder", ...)` per `taskId` — all in one assistant message — so the wave runs concurrently and each coder appears as a visible subagent. '+"Wait for the wave to finish before dispatching the next. Pair with `epic_decide_phase` (called first; this tool is only relevant on a `promote` verdict). "+"Preflight reject reasons: `no-plan`, `no-phase`, `phase-empty`, `phase-already-complete`, `scopes-missing` (call `declare_scope` for `missingScopes`), `git-failed` (transient — retry), `planner-error`.",agents:["architect"]},epic_record_divergence:{description:"After every `update_task_status(completed)`, record the task's declared-vs-actual divergence to .swarm/epic/divergence.jsonl. Feeds Epic Mode's self-calibration loop (Capability D). Best-effort: never blocks.",agents:["architect"]}},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,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.188.8",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"]},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_decide_phase:{description:"Compute the Epic Mode verdict for a phase WITHOUT dispatching coders. Runs preflight + calibration + the three gates (p-threshold, hot-module, greenfield), persists the decision, and returns the verdict so the architect can dispatch waves via the visible Task tool (promote) or fall back to per-task serial (demote). Pair with `epic_plan_waves` to get the wave plan when promoted. Use when /swarm epic is on for the session.",agents:["architect"]},epic_plan_waves:{description:"Partition a phase's pending tasks into ordered concurrent waves for Epic Mode dispatch. A wave is a set of tasks with mutually disjoint declared scopes and all dependencies satisfied by prior waves. Returns `{ waves: [{ waveId, taskIds, files }, ...], serializedTasks, degradedTasks }`. "+'For each wave in order, the architect dispatches one `Task(subagent_type="coder", ...)` per `taskId` — all in one assistant message — so the wave runs concurrently and each coder appears as a visible subagent. '+"Wait for the wave to finish before dispatching the next. Pair with `epic_decide_phase` (called first; this tool is only relevant on a `promote` verdict). "+"Preflight reject reasons: `no-plan`, `no-phase`, `phase-empty`, `phase-already-complete`, `scopes-missing` (call `declare_scope` for `missingScopes`), `git-failed` (transient — retry), `planner-error`.",agents:["architect"]},epic_record_divergence:{description:"After every `update_task_status(completed)`, record the task's declared-vs-actual divergence to .swarm/epic/divergence.jsonl. Feeds Epic Mode's self-calibration loop (Capability D). Best-effort: never blocks.",agents:["architect"]}},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,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
|
|
|
@@ -511,13 +511,13 @@ ${blockedSummary}
|
|
|
511
511
|
`)??[]){if(!line.trim())continue;let parsed=null;try{parsed=parseRepairQuarantineEntry(JSON.parse(line))}catch{parsed=null}if(!parsed)throw new ReceiptStoreError("store_corrupt","receipt repair quarantine metadata is invalid");existing.push(parsed)}if(existing.some((candidate)=>candidate.original_journal_sha256===entry.original_journal_sha256&&candidate.phase===entry.phase&&candidate.session_id===entry.session_id))return;if(existing.length>=MAX_REPAIR_QUARANTINE_RECORDS)throw new ReceiptStoreError("store_unavailable","receipt repair quarantine is full; existing immutable records were preserved");await _internals22.appendFsynced(paths.quarantine,`${JSON.stringify(entry)}
|
|
512
512
|
`)}async function repairKnowledgeReceiptLedger(directory,input){let observations=[];try{let result=await withReceiptLedgerLock(directory,async(paths)=>{let repairReason=input.reason.trim();if(!input.phase.trim()||!input.session_id.trim()||repairReason.length<12||/^(fix|repair|test|debug|unknown|n\/?a|none)$/i.test(repairReason))throw new ReceiptStoreError("store_unavailable","receipt repair requires exact phase/session identity and a substantive reason");let raw=null;try{raw=await readBytesIfPresent(paths.journal,MAX_JOURNAL_BYTES)}catch(error49){if(error49 instanceof ReceiptStoreError)throw error49;throw new ReceiptStoreError("store_unavailable",error49 instanceof Error?error49.message:String(error49))}try{let state2=await loadState(paths,observations),resolvedGraceDays=input.grace_days??(state2.cutoverCompleted?DEFAULT_RECEIPT_GRACE_DAYS:configuredGraceDays(directory));await ensureCutoverLocked(paths,state2,resolvedGraceDays);let overlaps=overlappingRepairUncertainties(state2,{phase:input.phase,session_id:input.session_id});if(await _internals22.writeSnapshot(paths,state2).catch(()=>{return}),overlaps.length>0)return{ok:!0,status:"pending_re_evaluation",pending_re_evaluation:!0,repair_id:overlaps[0]?.repair_id,salvage_through_seq:state2.lastSeq,salvage_through_hash:state2.lastHash};return{ok:!0,status:"validated_projection",pending_re_evaluation:!1,salvage_through_seq:state2.lastSeq,salvage_through_hash:state2.lastHash}}catch(error49){if(!(error49 instanceof ReceiptStoreError)||error49.code!=="store_corrupt")throw error49;if(raw===null)throw error49;let rawBytes=raw.byteLength;if(rawBytes>MAX_REPAIR_CAPTURE_BYTES)throw new ReceiptStoreError("store_unavailable",`receipt repair requires original authority <= ${MAX_REPAIR_CAPTURE_BYTES} bytes`);let salvaged=salvageReceiptJournal(raw,observations),resolvedGraceDays=input.grace_days??(salvaged.state.cutoverCompleted?DEFAULT_RECEIPT_GRACE_DAYS:configuredGraceDays(directory));await ensureCutoverLocked(paths,salvaged.state,resolvedGraceDays);let key=repairUncertaintyKey(input.phase,input.session_id),existing=salvaged.state.repairUncertainties.get(key),repairId=existing?.repair_id??randomUUID4(),journalHash=rawSha256(raw);await writeRepairQuarantineEntry(paths,{schema_version:REPAIR_QUARANTINE_SCHEMA_VERSION,repair_id:repairId,created_at:nowIso(),phase:input.phase,session_id:input.session_id,task_id:input.task_id,reason:repairReason,corruption_detail:salvaged.corruption_detail,original_journal_sha256:journalHash,original_journal_bytes:rawBytes,original_journal_base64:raw.toString("base64"),salvage_through_seq:salvaged.salvage_through_seq,salvage_through_hash:salvaged.salvage_through_hash});let fresh=emptyState(observations);fresh.memberships=new Map(salvaged.state.memberships),fresh.traceIds=new Set(salvaged.state.traceIds),fresh.emptyTraces=new Map(salvaged.state.emptyTraces),fresh.cutoverCompleted=salvaged.state.cutoverCompleted,fresh.legacyUnverifiable=salvaged.state.legacyUnverifiable,fresh.legacyTraceRegistry=new Set(salvaged.state.legacyTraceRegistry),fresh.legacyUnverifiableTraceIds=new Set(salvaged.state.legacyUnverifiableTraceIds),fresh.phaseLifecycle=new Map(salvaged.state.phaseLifecycle),fresh.repairUncertainties=new Map(salvaged.state.repairUncertainties),fresh.auditTail=[...salvaged.state.auditTail];let checkpoint=makeRecord(fresh,"checkpoint",buildCheckpointPayload(salvaged.state)),rewritten=[`${JSON.stringify(checkpoint)}
|
|
513
513
|
`];if(applyRecord(fresh,checkpoint),!existing){let uncertainty={phase:input.phase,session_id:input.session_id,task_id:input.task_id,reason:repairReason,repair_id:repairId,installed_at:nowIso(),raw_journal_sha256:journalHash,raw_journal_bytes:rawBytes,salvage_through_seq:salvaged.salvage_through_seq,salvage_through_hash:salvaged.salvage_through_hash},install=makeRecord(fresh,"repair_uncertainty_installed",{uncertainty});rewritten.push(`${JSON.stringify(install)}
|
|
514
|
-
`),applyRecord(fresh,install)}return await _internals22.atomicWriteFsynced(paths.journal,rewritten.join("")),await _internals22.writeSnapshot(paths,fresh).catch(()=>{return}),{ok:!0,status:"repaired_authority",pending_re_evaluation:!0,repair_id:repairId,salvage_through_seq:salvaged.salvage_through_seq,salvage_through_hash:salvaged.salvage_through_hash}}});for(let observation of observations)emitKnowledgeReceiptTransition(observation);return result}catch(error49){for(let observation of observations)emitKnowledgeReceiptTransition(observation);return unavailable(error49)}}async function commitDisplayedMembership(directory,input){return runLocked(directory,input.grace_days,async(paths,state2,graceDays)=>{if(!input.trace_id||!input.session_id||input.entries.length===0)throw new ReceiptStoreError("store_unavailable","invalid displayed membership");if(input.phase_id!==void 0&&(!Number.isSafeInteger(input.phase_id)||input.phase_id<1))throw new ReceiptStoreError("store_unavailable","invalid displayed membership: phase_id must be a safe integer >= 1");let eventId=randomUUID4(),committedAt=nowIso(),exposureKind=normalizeExposureKind(input.exposure_kind),memberships=[],newMemberships=[],closedLifecycle=findClosedLifecycleForPhase(state2,{phase:input.phase,phase_id:input.phase_id,session_id:input.session_id,task_id:input.task_id})??(input.task_id!==void 0?findClosedLifecycleForPhase(state2,{phase:input.phase,phase_id:input.phase_id,session_id:input.session_id,task_id:void 0}):void 0);for(let entry of input.entries){let existing=state2.memberships.get(keyOf2(input.trace_id,entry.entry_id));if(existing){if(existing.session_id!==input.session_id||existing.phase!==input.phase||existing.phase_id!==void 0&&input.phase_id!==void 0&&existing.phase_id!==input.phase_id||existing.task_id!==input.task_id||existing.critical!==entry.critical||existing.cohort_id!==input.cohort_id||existing.source_link_id!==input.source_link_id||existing.exposure_kind!==exposureKind)throw new ReceiptStoreError("store_unavailable",`conflicting immutable membership for ${input.trace_id}/${entry.entry_id}`);memberships.push({...existing,terminal:existing.terminal?{...existing.terminal}:void 0});continue}if(input.phase&&closedLifecycle?.closed_event_id)throw new ReceiptStoreError("store_unavailable",`cannot add receipt membership to closed lifecycle ${input.session_id}/${input.phase}`);let membership={trace_id:input.trace_id,entry_id:entry.entry_id,session_id:input.session_id,phase:input.phase,phase_id:input.phase_id,task_id:input.task_id,agent:input.agent,critical:entry.critical,rank:entry.rank,score:entry.score,committed_at:committedAt,membership_event_id:eventId,grace_days:graceDays,cohort_id:input.cohort_id,source_link_id:input.source_link_id,exposure_kind:exposureKind,origin:"v2"};memberships.push(membership),newMemberships.push(membership)}if(newMemberships.length)await appendRecord(paths,state2,makeRecord(state2,"membership_committed",{memberships:newMemberships},eventId)),await clearRepairUncertaintyIfFresh(paths,state2,input,{event_id:eventId,trace_id:input.trace_id,kind:"membership_committed"});return{event_id:newMemberships.length?eventId:memberships[0].membership_event_id,memberships}})}async function commitEmptyRetrieval(directory,input){return runLocked(directory,input.grace_days,async(paths,state2,graceDays)=>{let existing=state2.emptyTraces.get(emptyKeyOf(input.trace_id,input.session_id));if(existing){if(existing.phase!==input.phase||existing.task_id!==input.task_id||existing.grace_days!==graceDays)throw new ReceiptStoreError("store_unavailable",`conflicting immutable empty retrieval for ${input.trace_id}/${input.session_id}`);if(!existing.terminal_event_id){let terminal=makeRecord(state2,"terminal_committed",{empty_trace_id:input.trace_id,empty_trace_session_id:input.session_id});await appendRecord(paths,state2,terminal)}return{event_id:existing.empty_event_id,terminal_event_id:existing.terminal_event_id}}let eventId=randomUUID4(),terminalEventId=randomUUID4(),trace={trace_id:input.trace_id,session_id:input.session_id,phase:input.phase,task_id:input.task_id,committed_at:nowIso(),empty_event_id:eventId,grace_days:graceDays};return await appendRecord(paths,state2,makeRecord(state2,"empty_retrieval_committed",{trace},eventId)),await appendRecord(paths,state2,makeRecord(state2,"terminal_committed",{empty_trace_id:input.trace_id,empty_trace_session_id:input.session_id},terminalEventId)),await clearRepairUncertaintyIfFresh(paths,state2,input,{event_id:eventId,trace_id:input.trace_id,kind:"empty_retrieval_committed"}),{event_id:eventId,terminal_event_id:terminalEventId}})}async function validateAndCommitTerminalBatch(directory,input){return runLocked(directory,input.grace_days,async(paths,state2)=>{let items=input.items??input.terminals??[];if(items.some((item)=>typeof item.entry_id!=="string"||!item.entry_id||!isReceiptOutcome(item.outcome)||!isOptionalString(item.source)||!isOptionalString(item.reason)||item.predicate_check!==void 0&&parsePredicateCheck(item.predicate_check)===null||!isOptionalString(item.event_id)))throw new ReceiptStoreError("store_unavailable","invalid terminal payload");let accepted=[],idempotent=[],idempotentEvents=[],rejected=[];if(input.no_relevant_knowledge){let empty=state2.emptyTraces.get(emptyKeyOf(input.trace_id,input.session_id));if(!empty||empty.session_id!==input.session_id||items.length)return{accepted,committed:accepted,idempotent,idempotent_events:idempotentEvents,rejected:[{entry_id:"",reason:"trace_not_found"}],closes_no_relevant:!1,terminal_event_id:void 0};if(!empty.terminal_event_id){let row=makeRecord(state2,"terminal_committed",{empty_trace_id:input.trace_id,empty_trace_session_id:input.session_id});await appendRecord(paths,state2,row)}return{accepted,committed:accepted,idempotent,idempotent_events:idempotentEvents,rejected,closes_no_relevant:!0,terminal_event_id:state2.emptyTraces.get(emptyKeyOf(input.trace_id,input.session_id))?.terminal_event_id}}let transitions=[],traceExists=state2.traceIds.has(input.trace_id),stagedOutcomes=new Map,reservedEventIds=new Set,authorized=!1;for(let item of items){let membership=state2.memberships.get(keyOf2(input.trace_id,item.entry_id));if(!membership){rejected.push({entry_id:item.entry_id,reason:traceExists?"id_not_in_trace":isLegacyUnverifiableTrace(state2,input.trace_id)?"legacy_unverifiable":"trace_not_found"});continue}if(membership.session_id!==input.session_id){rejected.push({entry_id:item.entry_id,reason:"wrong_session"});continue}if(input.phase!==void 0&&!membershipMatchesPhaseIdentity(membership,input.phase,input.phase_id)){rejected.push({entry_id:item.entry_id,reason:"wrong_phase"});continue}if(input.task_id!==void 0&&membership.task_id!==input.task_id){rejected.push({entry_id:item.entry_id,reason:"wrong_task"});continue}let stagedOutcome=stagedOutcomes.get(item.entry_id);if(stagedOutcome!==void 0){if(stagedOutcome===item.outcome){idempotent.push(item.entry_id);let stagedCommit=accepted.find((entry)=>entry.entry_id===item.entry_id);if(stagedCommit)idempotentEvents.push(stagedCommit)}else rejected.push({entry_id:item.entry_id,reason:"duplicate_conflicting_terminal"});continue}if(stagedOutcomes.set(item.entry_id,item.outcome),membership.terminal?.outcome===item.outcome&&!input.authorization){idempotent.push(item.entry_id),idempotentEvents.push({entry_id:item.entry_id,outcome:item.outcome,event_id:membership.terminal.event_id});continue}if(membership.terminal){let auth=input.authorization;if(!auth||!auth.reason||auth.expected_event_id!==membership.terminal.event_id||auth.expected_outcome!==void 0&&auth.expected_outcome!==membership.terminal.outcome){rejected.push({entry_id:item.entry_id,reason:"duplicate_conflicting_terminal"});continue}authorized=!0}else if(input.authorization){if(!input.authorization.reason||input.authorization.expected_event_id!==""){rejected.push({entry_id:item.entry_id,reason:"unauthorized_transition"});continue}authorized=!0}if(input.cohort_id!==void 0&&membership.cohort_id!==void 0&&membership.cohort_id!==input.cohort_id||input.source_link_id!==void 0&&membership.source_link_id!==void 0&&membership.source_link_id!==input.source_link_id)throw new ReceiptStoreError("store_unavailable",`conflicting receipt correlation metadata for ${input.trace_id}/${item.entry_id}`);let requestedEventId=item.event_id?.trim();if(requestedEventId){if(hasAuthoritativeEventId(state2,requestedEventId)||reservedEventIds.has(requestedEventId)){rejected.push({entry_id:item.entry_id,reason:"event_id_conflict"});continue}}let eventId=requestedEventId||randomUUID4();reservedEventIds.add(eventId),transitions.push({trace_id:input.trace_id,entry_id:item.entry_id,terminal:{outcome:item.outcome,source:normalizeReceiptSource(item.source),reason:item.reason,predicate_check:item.predicate_check,event_id:eventId,committed_at:nowIso(),...input.authorization?{authorized_transition:{actor:input.authorization.actor,reason:input.authorization.reason,previous_event_id:membership.terminal?.event_id??"",previous_outcome:membership.terminal?.outcome}}:{}},cohort_id:input.cohort_id,source_link_id:input.source_link_id}),accepted.push({entry_id:item.entry_id,outcome:item.outcome,event_id:eventId})}if(transitions.length)await appendRecord(paths,state2,makeRecord(state2,authorized?"authorized_transition_committed":"terminal_committed",{transitions,authorization:authorized?input.authorization:void 0}));if(idempotent.length)await appendRecord(paths,state2,makeRecord(state2,"terminal_attempt_idempotent",{trace_id:input.trace_id,entry_ids:idempotent}));if(rejected.length)await appendRecord(paths,state2,makeRecord(state2,"terminal_attempt_rejected",{trace_id:input.trace_id,rejected}));return{accepted,committed:accepted,idempotent,idempotent_events:idempotentEvents,rejected,closes_no_relevant:!1,terminal_event_id:void 0}})}async function commitApplicationMarkerBatch(directory,input){return runLocked(directory,void 0,async(paths,state2)=>{let items=input.items??input.markers??[],committed=[],idempotent=[],rejected=[],transitions=[],traceExists=state2.traceIds.has(input.trace_id),staged=new Map;for(let item of items){let membership=state2.memberships.get(keyOf2(input.trace_id,item.entry_id));if(!membership){rejected.push({entry_id:item.entry_id,reason:traceExists?"id_not_in_trace":isLegacyUnverifiableTrace(state2,input.trace_id)?"legacy_unverifiable":"trace_not_found"});continue}if(membership.session_id!==input.session_id){rejected.push({entry_id:item.entry_id,reason:"wrong_session"});continue}let stagedOutcome=staged.get(item.entry_id);if(stagedOutcome!==void 0){if(stagedOutcome===item.outcome)idempotent.push(item.entry_id);else rejected.push({entry_id:item.entry_id,reason:"duplicate_conflicting_terminal"});continue}if(staged.set(item.entry_id,item.outcome),membership.application_marker?.outcome===item.outcome){idempotent.push(item.entry_id);continue}if(membership.application_marker){rejected.push({entry_id:item.entry_id,reason:"duplicate_conflicting_terminal"});continue}let eventId=randomUUID4(),marker={outcome:item.outcome,source:normalizeReceiptSource(item.source),reason:item.reason,event_id:eventId,committed_at:nowIso()};transitions.push({trace_id:input.trace_id,entry_id:item.entry_id,marker}),committed.push({entry_id:item.entry_id,outcome:item.outcome,event_id:eventId})}if(transitions.length)await appendRecord(paths,state2,makeRecord(state2,"application_marker_committed",{markers:transitions}));return{committed,idempotent,rejected}})}async function commitGateReleaseBatch(directory,input){return runLocked(directory,input.grace_days,async(paths,state2)=>{let committed=[],idempotent=[],rejected=[],releases=[],traceExists=state2.traceIds.has(input.trace_id),staged=new Set;for(let item of input.items){let membership=state2.memberships.get(keyOf2(input.trace_id,item.entry_id));if(!membership){rejected.push({entry_id:item.entry_id,reason:traceExists?"id_not_in_trace":isLegacyUnverifiableTrace(state2,input.trace_id)?"legacy_unverifiable":"trace_not_found"});continue}if(membership.session_id!==input.session_id){rejected.push({entry_id:item.entry_id,reason:"wrong_session"});continue}if(staged.has(item.entry_id)){idempotent.push({entry_id:item.entry_id,event_id:membership.gate_release?.event_id??releases.at(-1)?.release.event_id??""});continue}if(staged.add(item.entry_id),membership.gate_release?.membership_event_id===membership.membership_event_id){idempotent.push({entry_id:item.entry_id,event_id:membership.gate_release.event_id});continue}let release={source:normalizeReceiptSource(item.source),reason:item.reason,event_id:randomUUID4(),committed_at:nowIso(),membership_event_id:membership.membership_event_id};releases.push({trace_id:input.trace_id,entry_id:item.entry_id,release}),committed.push({entry_id:item.entry_id,event_id:release.event_id,membership_event_id:release.membership_event_id})}if(releases.length)await appendRecord(paths,state2,makeRecord(state2,"gate_release_committed",{releases}));return{committed,idempotent,rejected}})}async function commitApplicationOutcomeBatch(directory,input){return runLocked(directory,input.grace_days,async(paths,state2)=>{let committed=[],idempotent=[],rejected=[],markers=[],transitions=[],traceExists=state2.traceIds.has(input.trace_id),staged=new Map,stagedResults=new Map;for(let item of input.items){let membership=state2.memberships.get(keyOf2(input.trace_id,item.entry_id));if(!membership){rejected.push({entry_id:item.entry_id,reason:traceExists?"id_not_in_trace":isLegacyUnverifiableTrace(state2,input.trace_id)?"legacy_unverifiable":"trace_not_found"});continue}if(membership.session_id!==input.session_id){rejected.push({entry_id:item.entry_id,reason:"wrong_session"});continue}let stagedOutcome=staged.get(item.entry_id);if(stagedOutcome!==void 0){let stagedResult=stagedResults.get(item.entry_id);if(stagedOutcome===item.outcome&&stagedResult)idempotent.push(stagedResult);else rejected.push({entry_id:item.entry_id,reason:"duplicate_conflicting_terminal"});continue}if(staged.set(item.entry_id,item.outcome),membership.application_marker&&membership.application_marker.outcome!==item.outcome||membership.terminal&&membership.terminal.outcome!==item.outcome){rejected.push({entry_id:item.entry_id,reason:"duplicate_conflicting_terminal"});continue}let now=nowIso(),source=normalizeReceiptSource(item.source),marker=membership.application_marker??{outcome:item.outcome,source,reason:item.reason,event_id:randomUUID4(),committed_at:now},terminal=membership.terminal??{outcome:item.outcome,source,reason:item.reason,event_id:randomUUID4(),committed_at:now};if(!membership.application_marker)markers.push({trace_id:input.trace_id,entry_id:item.entry_id,marker});if(!membership.terminal)transitions.push({trace_id:input.trace_id,entry_id:item.entry_id,terminal});let result={entry_id:item.entry_id,outcome:item.outcome,marker_event_id:marker.event_id,terminal_event_id:terminal.event_id};if(stagedResults.set(item.entry_id,result),membership.application_marker&&membership.terminal)idempotent.push(result);else committed.push(result)}if(markers.length||transitions.length)await appendRecord(paths,state2,makeRecord(state2,"application_marker_committed",{markers,transitions}));return{committed,idempotent,rejected}})}async function queryLiveMemberships(directory,filters={}){return runLocked(directory,filters.grace_days,async(_paths,state2)=>{let overlaps=overlappingRepairUncertainties(state2,{phase:filters.phase,session_id:filters.session_id});if(overlaps.length>0)throw new ReceiptStoreError("store_unavailable",repairUncertaintyUnavailable(overlaps).detail);return{memberships:[...state2.memberships.values()].filter((m)=>(filters.phase_id===void 0||membershipMatchesPhaseIdentity(m,filters.phase??"",filters.phase_id))&&(!filters.phase||filters.phase_id!==void 0||m.phase===filters.phase)&&(!filters.task_id||m.task_id===filters.task_id)&&(!filters.session_id||m.session_id===filters.session_id)&&(filters.include_terminal!==!1||!m.terminal)&&(filters.include_phase_closed!==!1||!m.phase_closed_at)&&(!filters.exposure_kind||m.exposure_kind===filters.exposure_kind)).map((m)=>({...m,terminal:m.terminal?{...m.terminal}:void 0}))}},{compact:!1,writeSnapshot:!1})}async function queryHistoricalOutcomes(directory,entryIds,graceDays){return runLocked(directory,graceDays,async(paths,state2)=>{let wanted=entryIds?new Set(entryIds):null,memberships=new Map;for(let membership of state2.memberships.values())if(!wanted||wanted.has(membership.entry_id))memberships.set(archiveKey(membership),membership);let raw=await readUtf8IfPresent(paths.archive,MAX_ARCHIVE_BYTES);if(raw)for(let line of raw.split(`
|
|
514
|
+
`),applyRecord(fresh,install)}return await _internals22.atomicWriteFsynced(paths.journal,rewritten.join("")),await _internals22.writeSnapshot(paths,fresh).catch(()=>{return}),{ok:!0,status:"repaired_authority",pending_re_evaluation:!0,repair_id:repairId,salvage_through_seq:salvaged.salvage_through_seq,salvage_through_hash:salvaged.salvage_through_hash}}});for(let observation of observations)emitKnowledgeReceiptTransition(observation);return result}catch(error49){for(let observation of observations)emitKnowledgeReceiptTransition(observation);return unavailable(error49)}}async function commitDisplayedMembership(directory,input){return runLocked(directory,input.grace_days,async(paths,state2,graceDays)=>{if(!input.trace_id||!input.session_id||input.entries.length===0)throw new ReceiptStoreError("store_unavailable","invalid displayed membership");if(input.phase_id!==void 0&&(!Number.isSafeInteger(input.phase_id)||input.phase_id<1))throw new ReceiptStoreError("store_unavailable","invalid displayed membership: phase_id must be a safe integer >= 1");let eventId=randomUUID4(),committedAt=nowIso(),exposureKind=normalizeExposureKind(input.exposure_kind),memberships=[],newMemberships=[],closedLifecycle=findClosedLifecycleForPhase(state2,{phase:input.phase,phase_id:input.phase_id,session_id:input.session_id,task_id:input.task_id})??(input.task_id!==void 0?findClosedLifecycleForPhase(state2,{phase:input.phase,phase_id:input.phase_id,session_id:input.session_id,task_id:void 0}):void 0);for(let entry of input.entries){let existing=state2.memberships.get(keyOf2(input.trace_id,entry.entry_id));if(existing){if(existing.session_id!==input.session_id||existing.phase!==input.phase||existing.phase_id!==void 0&&input.phase_id!==void 0&&existing.phase_id!==input.phase_id||existing.task_id!==input.task_id||existing.critical!==entry.critical||existing.cohort_id!==input.cohort_id||existing.source_link_id!==input.source_link_id||existing.exposure_kind!==exposureKind)throw new ReceiptStoreError("store_unavailable",`conflicting immutable membership for ${input.trace_id}/${entry.entry_id}`);memberships.push({...existing,terminal:existing.terminal?{...existing.terminal}:void 0});continue}if(input.phase&&closedLifecycle?.closed_event_id)throw new ReceiptStoreError("store_unavailable",`cannot add receipt membership to closed lifecycle ${input.session_id}/${input.phase}`);let membership={trace_id:input.trace_id,entry_id:entry.entry_id,session_id:input.session_id,phase:input.phase,phase_id:input.phase_id,task_id:input.task_id,agent:input.agent,critical:entry.critical,rank:entry.rank,score:entry.score,committed_at:committedAt,membership_event_id:eventId,grace_days:graceDays,cohort_id:input.cohort_id,source_link_id:input.source_link_id,exposure_kind:exposureKind,origin:"v2"};memberships.push(membership),newMemberships.push(membership)}if(newMemberships.length)await appendRecord(paths,state2,makeRecord(state2,"membership_committed",{memberships:newMemberships},eventId)),await clearRepairUncertaintyIfFresh(paths,state2,input,{event_id:eventId,trace_id:input.trace_id,kind:"membership_committed"});return{event_id:newMemberships.length?eventId:memberships[0].membership_event_id,memberships}})}async function commitEmptyRetrieval(directory,input){return runLocked(directory,input.grace_days,async(paths,state2,graceDays)=>{let existing=state2.emptyTraces.get(emptyKeyOf(input.trace_id,input.session_id));if(existing){if(existing.phase!==input.phase||existing.task_id!==input.task_id||existing.grace_days!==graceDays)throw new ReceiptStoreError("store_unavailable",`conflicting immutable empty retrieval for ${input.trace_id}/${input.session_id}`);if(!existing.terminal_event_id){let terminal=makeRecord(state2,"terminal_committed",{empty_trace_id:input.trace_id,empty_trace_session_id:input.session_id});await appendRecord(paths,state2,terminal)}return{event_id:existing.empty_event_id,terminal_event_id:existing.terminal_event_id}}let eventId=randomUUID4(),terminalEventId=randomUUID4(),trace={trace_id:input.trace_id,session_id:input.session_id,phase:input.phase,task_id:input.task_id,committed_at:nowIso(),empty_event_id:eventId,grace_days:graceDays};return await appendRecord(paths,state2,makeRecord(state2,"empty_retrieval_committed",{trace},eventId)),await appendRecord(paths,state2,makeRecord(state2,"terminal_committed",{empty_trace_id:input.trace_id,empty_trace_session_id:input.session_id},terminalEventId)),await clearRepairUncertaintyIfFresh(paths,state2,input,{event_id:eventId,trace_id:input.trace_id,kind:"empty_retrieval_committed"}),{event_id:eventId,terminal_event_id:terminalEventId}})}async function validateAndCommitTerminalBatch(directory,input){return runLocked(directory,input.grace_days,async(paths,state2)=>{let items=input.items??input.terminals??[];if(items.some((item)=>typeof item.entry_id!=="string"||!item.entry_id||!isReceiptOutcome(item.outcome)||!isOptionalString(item.source)||!isOptionalString(item.reason)||item.predicate_check!==void 0&&parsePredicateCheck(item.predicate_check)===null||!isOptionalString(item.event_id)))throw new ReceiptStoreError("store_unavailable","invalid terminal payload");let accepted=[],idempotent=[],idempotentEvents=[],rejected=[];if(input.no_relevant_knowledge){let empty=state2.emptyTraces.get(emptyKeyOf(input.trace_id,input.session_id));if(!empty||empty.session_id!==input.session_id||items.length)return{accepted,committed:accepted,idempotent,idempotent_events:idempotentEvents,rejected:[{entry_id:"",reason:"trace_not_found"}],closes_no_relevant:!1,terminal_event_id:void 0};if(!empty.terminal_event_id){let row=makeRecord(state2,"terminal_committed",{empty_trace_id:input.trace_id,empty_trace_session_id:input.session_id});await appendRecord(paths,state2,row)}return{accepted,committed:accepted,idempotent,idempotent_events:idempotentEvents,rejected,closes_no_relevant:!0,terminal_event_id:state2.emptyTraces.get(emptyKeyOf(input.trace_id,input.session_id))?.terminal_event_id}}let transitions=[],traceExists=state2.traceIds.has(input.trace_id),stagedOutcomes=new Map,reservedEventIds=new Set,authorizedFilingSessions=new Set([...new Set((input.authorized_filing_sessions??[]).filter((candidate)=>typeof candidate==="string"))].map((candidate)=>candidate.trim()).filter((candidate)=>candidate.length>0).slice(0,MAX_AUTHORIZED_FILING_SESSIONS)),wrongSessionStamps={},authorized=!1;for(let item of items){let membership=state2.memberships.get(keyOf2(input.trace_id,item.entry_id));if(!membership){rejected.push({entry_id:item.entry_id,reason:traceExists?"id_not_in_trace":isLegacyUnverifiableTrace(state2,input.trace_id)?"legacy_unverifiable":"trace_not_found"});continue}if(membership.session_id!==input.session_id){let roleMatches=!membership.agent||input.agent!==void 0&&input.agent!==""&&stripKnownSwarmPrefix(membership.agent).toLowerCase()===stripKnownSwarmPrefix(input.agent).toLowerCase();if(!(authorizedFilingSessions.has(membership.session_id)&&roleMatches)){rejected.push({entry_id:item.entry_id,reason:"wrong_session"}),wrongSessionStamps[item.entry_id]=membership.session_id;continue}}if(input.phase!==void 0&&!membershipMatchesPhaseIdentity(membership,input.phase,input.phase_id)){rejected.push({entry_id:item.entry_id,reason:"wrong_phase"});continue}if(input.task_id!==void 0&&membership.task_id!==input.task_id){rejected.push({entry_id:item.entry_id,reason:"wrong_task"});continue}let stagedOutcome=stagedOutcomes.get(item.entry_id);if(stagedOutcome!==void 0){if(stagedOutcome===item.outcome){idempotent.push(item.entry_id);let stagedCommit=accepted.find((entry)=>entry.entry_id===item.entry_id);if(stagedCommit)idempotentEvents.push(stagedCommit)}else rejected.push({entry_id:item.entry_id,reason:"duplicate_conflicting_terminal"});continue}if(stagedOutcomes.set(item.entry_id,item.outcome),membership.terminal?.outcome===item.outcome&&!input.authorization){idempotent.push(item.entry_id),idempotentEvents.push({entry_id:item.entry_id,outcome:item.outcome,event_id:membership.terminal.event_id});continue}if(membership.terminal){let auth=input.authorization;if(!auth||!auth.reason||auth.expected_event_id!==membership.terminal.event_id||auth.expected_outcome!==void 0&&auth.expected_outcome!==membership.terminal.outcome){rejected.push({entry_id:item.entry_id,reason:"duplicate_conflicting_terminal"});continue}authorized=!0}else if(input.authorization){if(!input.authorization.reason||input.authorization.expected_event_id!==""){rejected.push({entry_id:item.entry_id,reason:"unauthorized_transition"});continue}authorized=!0}if(input.cohort_id!==void 0&&membership.cohort_id!==void 0&&membership.cohort_id!==input.cohort_id||input.source_link_id!==void 0&&membership.source_link_id!==void 0&&membership.source_link_id!==input.source_link_id)throw new ReceiptStoreError("store_unavailable",`conflicting receipt correlation metadata for ${input.trace_id}/${item.entry_id}`);let requestedEventId=item.event_id?.trim();if(requestedEventId){if(hasAuthoritativeEventId(state2,requestedEventId)||reservedEventIds.has(requestedEventId)){rejected.push({entry_id:item.entry_id,reason:"event_id_conflict"});continue}}let eventId=requestedEventId||randomUUID4();reservedEventIds.add(eventId),transitions.push({trace_id:input.trace_id,entry_id:item.entry_id,terminal:{outcome:item.outcome,source:normalizeReceiptSource(item.source),reason:item.reason,predicate_check:item.predicate_check,event_id:eventId,committed_at:nowIso(),...input.authorization?{authorized_transition:{actor:input.authorization.actor,reason:input.authorization.reason,previous_event_id:membership.terminal?.event_id??"",previous_outcome:membership.terminal?.outcome}}:{}},cohort_id:input.cohort_id,source_link_id:input.source_link_id}),accepted.push({entry_id:item.entry_id,outcome:item.outcome,event_id:eventId})}if(transitions.length)await appendRecord(paths,state2,makeRecord(state2,authorized?"authorized_transition_committed":"terminal_committed",{transitions,authorization:authorized?input.authorization:void 0}));if(idempotent.length)await appendRecord(paths,state2,makeRecord(state2,"terminal_attempt_idempotent",{trace_id:input.trace_id,entry_ids:idempotent}));if(rejected.length)await appendRecord(paths,state2,makeRecord(state2,"terminal_attempt_rejected",{trace_id:input.trace_id,rejected}));return{accepted,committed:accepted,idempotent,idempotent_events:idempotentEvents,rejected,closes_no_relevant:!1,terminal_event_id:void 0,...Object.keys(wrongSessionStamps).length>0?{wrong_session_membership_sessions:wrongSessionStamps}:{}}})}async function commitApplicationMarkerBatch(directory,input){return runLocked(directory,void 0,async(paths,state2)=>{let items=input.items??input.markers??[],committed=[],idempotent=[],rejected=[],transitions=[],traceExists=state2.traceIds.has(input.trace_id),staged=new Map;for(let item of items){let membership=state2.memberships.get(keyOf2(input.trace_id,item.entry_id));if(!membership){rejected.push({entry_id:item.entry_id,reason:traceExists?"id_not_in_trace":isLegacyUnverifiableTrace(state2,input.trace_id)?"legacy_unverifiable":"trace_not_found"});continue}if(membership.session_id!==input.session_id){rejected.push({entry_id:item.entry_id,reason:"wrong_session"});continue}let stagedOutcome=staged.get(item.entry_id);if(stagedOutcome!==void 0){if(stagedOutcome===item.outcome)idempotent.push(item.entry_id);else rejected.push({entry_id:item.entry_id,reason:"duplicate_conflicting_terminal"});continue}if(staged.set(item.entry_id,item.outcome),membership.application_marker?.outcome===item.outcome){idempotent.push(item.entry_id);continue}if(membership.application_marker){rejected.push({entry_id:item.entry_id,reason:"duplicate_conflicting_terminal"});continue}let eventId=randomUUID4(),marker={outcome:item.outcome,source:normalizeReceiptSource(item.source),reason:item.reason,event_id:eventId,committed_at:nowIso()};transitions.push({trace_id:input.trace_id,entry_id:item.entry_id,marker}),committed.push({entry_id:item.entry_id,outcome:item.outcome,event_id:eventId})}if(transitions.length)await appendRecord(paths,state2,makeRecord(state2,"application_marker_committed",{markers:transitions}));return{committed,idempotent,rejected}})}async function commitGateReleaseBatch(directory,input){return runLocked(directory,input.grace_days,async(paths,state2)=>{let committed=[],idempotent=[],rejected=[],releases=[],traceExists=state2.traceIds.has(input.trace_id),staged=new Set;for(let item of input.items){let membership=state2.memberships.get(keyOf2(input.trace_id,item.entry_id));if(!membership){rejected.push({entry_id:item.entry_id,reason:traceExists?"id_not_in_trace":isLegacyUnverifiableTrace(state2,input.trace_id)?"legacy_unverifiable":"trace_not_found"});continue}if(membership.session_id!==input.session_id){rejected.push({entry_id:item.entry_id,reason:"wrong_session"});continue}if(staged.has(item.entry_id)){idempotent.push({entry_id:item.entry_id,event_id:membership.gate_release?.event_id??releases.at(-1)?.release.event_id??""});continue}if(staged.add(item.entry_id),membership.gate_release?.membership_event_id===membership.membership_event_id){idempotent.push({entry_id:item.entry_id,event_id:membership.gate_release.event_id});continue}let release={source:normalizeReceiptSource(item.source),reason:item.reason,event_id:randomUUID4(),committed_at:nowIso(),membership_event_id:membership.membership_event_id};releases.push({trace_id:input.trace_id,entry_id:item.entry_id,release}),committed.push({entry_id:item.entry_id,event_id:release.event_id,membership_event_id:release.membership_event_id})}if(releases.length)await appendRecord(paths,state2,makeRecord(state2,"gate_release_committed",{releases}));return{committed,idempotent,rejected}})}async function commitApplicationOutcomeBatch(directory,input){return runLocked(directory,input.grace_days,async(paths,state2)=>{let committed=[],idempotent=[],rejected=[],markers=[],transitions=[],traceExists=state2.traceIds.has(input.trace_id),staged=new Map,stagedResults=new Map;for(let item of input.items){let membership=state2.memberships.get(keyOf2(input.trace_id,item.entry_id));if(!membership){rejected.push({entry_id:item.entry_id,reason:traceExists?"id_not_in_trace":isLegacyUnverifiableTrace(state2,input.trace_id)?"legacy_unverifiable":"trace_not_found"});continue}if(membership.session_id!==input.session_id){rejected.push({entry_id:item.entry_id,reason:"wrong_session"});continue}let stagedOutcome=staged.get(item.entry_id);if(stagedOutcome!==void 0){let stagedResult=stagedResults.get(item.entry_id);if(stagedOutcome===item.outcome&&stagedResult)idempotent.push(stagedResult);else rejected.push({entry_id:item.entry_id,reason:"duplicate_conflicting_terminal"});continue}if(staged.set(item.entry_id,item.outcome),membership.application_marker&&membership.application_marker.outcome!==item.outcome||membership.terminal&&membership.terminal.outcome!==item.outcome){rejected.push({entry_id:item.entry_id,reason:"duplicate_conflicting_terminal"});continue}let now=nowIso(),source=normalizeReceiptSource(item.source),marker=membership.application_marker??{outcome:item.outcome,source,reason:item.reason,event_id:randomUUID4(),committed_at:now},terminal=membership.terminal??{outcome:item.outcome,source,reason:item.reason,event_id:randomUUID4(),committed_at:now};if(!membership.application_marker)markers.push({trace_id:input.trace_id,entry_id:item.entry_id,marker});if(!membership.terminal)transitions.push({trace_id:input.trace_id,entry_id:item.entry_id,terminal});let result={entry_id:item.entry_id,outcome:item.outcome,marker_event_id:marker.event_id,terminal_event_id:terminal.event_id};if(stagedResults.set(item.entry_id,result),membership.application_marker&&membership.terminal)idempotent.push(result);else committed.push(result)}if(markers.length||transitions.length)await appendRecord(paths,state2,makeRecord(state2,"application_marker_committed",{markers,transitions}));return{committed,idempotent,rejected}})}async function queryLiveMemberships(directory,filters={}){return runLocked(directory,filters.grace_days,async(_paths,state2)=>{let overlaps=overlappingRepairUncertainties(state2,{phase:filters.phase,session_id:filters.session_id});if(overlaps.length>0)throw new ReceiptStoreError("store_unavailable",repairUncertaintyUnavailable(overlaps).detail);return{memberships:[...state2.memberships.values()].filter((m)=>(filters.phase_id===void 0||membershipMatchesPhaseIdentity(m,filters.phase??"",filters.phase_id))&&(!filters.phase||filters.phase_id!==void 0||m.phase===filters.phase)&&(!filters.task_id||m.task_id===filters.task_id)&&(!filters.session_id||m.session_id===filters.session_id)&&(filters.include_terminal!==!1||!m.terminal)&&(filters.include_phase_closed!==!1||!m.phase_closed_at)&&(!filters.exposure_kind||m.exposure_kind===filters.exposure_kind)).map((m)=>({...m,terminal:m.terminal?{...m.terminal}:void 0}))}},{compact:!1,writeSnapshot:!1})}async function queryHistoricalOutcomes(directory,entryIds,graceDays){return runLocked(directory,graceDays,async(paths,state2)=>{let wanted=entryIds?new Set(entryIds):null,memberships=new Map;for(let membership of state2.memberships.values())if(!wanted||wanted.has(membership.entry_id))memberships.set(archiveKey(membership),membership);let raw=await readUtf8IfPresent(paths.archive,MAX_ARCHIVE_BYTES);if(raw)for(let line of raw.split(`
|
|
515
515
|
`).filter(Boolean)){let summary=null;try{summary=parseArchiveSummary(JSON.parse(line))}catch{}if(!summary)throw new ReceiptStoreError("store_corrupt","receipt archive contains an invalid authoritative summary");if("entry_id"in summary&&(!wanted||wanted.has(summary.entry_id))){let key=archiveKey(summary);if(!memberships.has(key))memberships.set(key,summary)}}return{memberships:[...memberships.values()]}},{compact:!1,writeSnapshot:!1})}async function phaseTransition(directory,phase,kind,sessionId,taskId,graceDays,phaseId){return runLocked(directory,graceDays,async(paths,state2)=>{if(!phase.trim())throw new ReceiptStoreError("store_unavailable","phase is required");let effectivePhaseId=phaseId!==void 0&&Number.isSafeInteger(phaseId)&&phaseId>=1?phaseId:void 0,scopeKeys=new Map,addScope=(scopeSessionId,scopeTaskId)=>{if(sessionId!==void 0&&scopeSessionId!==sessionId||taskId!==void 0&&scopeTaskId!==taskId)return;scopeKeys.set(phaseLifecycleKey(phase,scopeSessionId,scopeTaskId),{session_id:scopeSessionId,task_id:scopeTaskId})};for(let membership of state2.memberships.values())if(membershipMatchesPhaseIdentity(membership,phase,effectivePhaseId))addScope(membership.session_id,membership.task_id);for(let trace of state2.emptyTraces.values())if(trace.phase===phase)addScope(trace.session_id,trace.task_id);for(let lifecycle of state2.phaseLifecycle.values())if(effectivePhaseId!==void 0?(lifecycle.phase_id===effectivePhaseId||lifecycle.phase_id===void 0&&extractPhaseIdFromLabel(lifecycle.phase)===effectivePhaseId)&&(sessionId===void 0||lifecycle.session_id===sessionId):lifecycle.phase===phase)addScope(lifecycle.session_id,lifecycle.task_id);if(scopeKeys.size===0&&sessionId!==void 0){let closedLifecycle=findClosedLifecycleForPhase(state2,{phase,phase_id:effectivePhaseId,session_id:sessionId,task_id:taskId});if(closedLifecycle)addScope(closedLifecycle.session_id,closedLifecycle.task_id)}if(scopeKeys.size===0&&sessionId!==void 0)addScope(sessionId,taskId);if(scopeKeys.size===0)throw new ReceiptStoreError("store_unavailable","no exact receipt lifecycle scope exists for phase closure");if(sessionId===void 0&&scopeKeys.size!==1)throw new ReceiptStoreError("store_unavailable","receipt lifecycle scope is ambiguous without an exact session identity");let eventId="";for(let[key,scope]of scopeKeys){let lifecycle=findClosedLifecycleForPhase(state2,{phase,phase_id:effectivePhaseId,session_id:scope.session_id,task_id:scope.task_id})??state2.phaseLifecycle.get(key),existingEventId=kind==="phase_close_intent"?lifecycle?.intent_event_id:lifecycle?.closed_event_id;if(existingEventId){eventId||=existingEventId;continue}let row=makeRecord(state2,kind,{phase,...effectivePhaseId!==void 0?{phase_id:effectivePhaseId}:{},...scope});if(await appendRecord(paths,state2,row),lifecycle===void 0)state2.phaseLifecycle.set(key,{phase,...effectivePhaseId!==void 0?{phase_id:effectivePhaseId}:{},session_id:scope.session_id,task_id:scope.task_id,intent_event_id:kind==="phase_close_intent"?row.event_id:void 0,intent_at:kind==="phase_close_intent"?row.timestamp:void 0,closed_event_id:kind==="phase_closed"?row.event_id:void 0,closed_at:kind==="phase_closed"?row.timestamp:void 0});else{if(lifecycle.phase_id===void 0&&effectivePhaseId!==void 0)lifecycle.phase_id=effectivePhaseId;if(kind==="phase_close_intent"&&!lifecycle.intent_event_id)lifecycle.intent_event_id=row.event_id,lifecycle.intent_at=row.timestamp;else if(kind==="phase_closed"&&!lifecycle.closed_event_id)lifecycle.closed_event_id=row.event_id,lifecycle.closed_at=row.timestamp}eventId||=row.event_id}if(kind==="phase_closed")await compactIfNeeded(paths,state2);return{event_id:eventId}})}async function reconcilePhaseClose(directory,phase,durablePlanClosed,sessionId,taskId,phaseId){if(!durablePlanClosed)return{ok:!0,reconciled:!1};let result=await commitPhaseClosed(directory,phase,sessionId,taskId,phaseId);return result.ok?{ok:!0,reconciled:!0}:result}async function compactIfNeeded(paths,state2){let now=_internals22.nowMs(),eligible=[...state2.memberships.values()].filter((m)=>(m.terminal||m.gate_release)&&m.phase_closed_at&&now>=Date.parse(m.phase_closed_at)+m.grace_days*86400000),eligibleEmpty=[...state2.emptyTraces.values()].filter((trace)=>trace.terminal_event_id&&trace.phase_closed_at&&now>=Date.parse(trace.phase_closed_at)+trace.grace_days*86400000);if(!eligible.length&&!eligibleEmpty.length&&state2.recordCount<=_internals22.maxJournalRecords)return;let archiveById=new Map,existing=await readUtf8IfPresent(paths.archive,MAX_ARCHIVE_BYTES);if(existing)for(let line of existing.split(`
|
|
516
516
|
`).filter(Boolean)){let summary=null;try{summary=parseArchiveSummary(JSON.parse(line))}catch{}if(!summary)throw new ReceiptStoreError("store_corrupt","receipt archive contains an invalid summary");archiveById.set(archiveKey(summary),summary)}let retainedArchive=[...archiveById.values()],archiveContent=serializeArchive(retainedArchive),archiveBytes=Buffer.byteLength(archiveContent,"utf8"),archiveChanged=!1,retainIfCapacity=(summary)=>{let key=archiveKey(summary);if(archiveById.has(key))return;let line=`${JSON.stringify(summary)}
|
|
517
517
|
`,lineBytes=Buffer.byteLength(line,"utf8");if(retainedArchive.length+1>_internals22.maxArchiveRecords||archiveBytes+lineBytes>_internals22.maxArchiveBytes)return;archiveById.set(key,summary),retainedArchive.push(summary),archiveContent+=line,archiveBytes+=lineBytes,archiveChanged=!0};for(let membership of eligible)retainIfCapacity(membership);for(let trace of eligibleEmpty)retainIfCapacity({...trace,summary_kind:"empty_trace"});if(archiveChanged)await _internals22.atomicWriteFsynced(paths.archive,archiveContent);let retainedIds=new Set(retainedArchive.map(archiveKey));for(let membership of eligible)if(retainedIds.has(archiveKey(membership)))state2.memberships.delete(keyOf2(membership.trace_id,membership.entry_id));for(let trace of eligibleEmpty){let summary={...trace,summary_kind:"empty_trace"};if(retainedIds.has(archiveKey(summary)))state2.emptyTraces.delete(emptyKeyOf(trace.trace_id,trace.session_id))}for(let traceId of[...state2.legacyTraceRegistry])if(![...state2.memberships.values()].some((membership)=>membership.origin==="legacy"&&membership.trace_id===traceId))state2.legacyTraceRegistry.delete(traceId);state2.traceIds=new Set([...state2.memberships.values()].map((membership)=>membership.trace_id));let fresh=emptyState(state2.observations);fresh.cutoverCompleted=state2.cutoverCompleted,fresh.legacyUnverifiable=state2.legacyUnverifiable,fresh.legacyTraceRegistry=new Set(state2.legacyTraceRegistry),fresh.legacyUnverifiableTraceIds=new Set(state2.legacyUnverifiableTraceIds),fresh.phaseLifecycle=new Map(state2.phaseLifecycle),fresh.repairUncertainties=new Map(state2.repairUncertainties),fresh.auditTail=[...state2.auditTail];let checkpoint=makeRecord(fresh,"checkpoint",{memberships:[...state2.memberships.values()],empty_traces:[...state2.emptyTraces.values()],cutover_completed:state2.cutoverCompleted,legacy_unverifiable:state2.legacyUnverifiable,legacy_trace_registry:[...state2.legacyTraceRegistry].sort(),legacy_unverifiable_trace_ids:[...state2.legacyUnverifiableTraceIds].sort(),phase_lifecycle:[...state2.phaseLifecycle.values()],repair_uncertainties:[...state2.repairUncertainties.values()],audit_tail:state2.auditTail});await _internals22.atomicWriteFsynced(paths.journal,`${JSON.stringify(checkpoint)}
|
|
518
518
|
`),state2.lastSeq=checkpoint.seq,state2.lastHash=checkpoint.hash,state2.recordCount=1,queueRecordObservations(state2,checkpoint)}function serializeArchive(summaries){return summaries.length?`${summaries.map((summary)=>JSON.stringify(summary)).join(`
|
|
519
519
|
`)}
|
|
520
|
-
`:""}async function inspectMembershipPhaseIds(directory){return runLocked(directory,void 0,async(_paths,state2)=>{let backfillable=0,unparsable=[],missing=0;for(let membership of state2.memberships.values()){if(membership.phase_id!==void 0)continue;if(missing++,membership.phase===void 0){unparsable.push({trace_id:membership.trace_id,entry_id:membership.entry_id});continue}if(extractPhaseIdFromLabel(membership.phase)!==void 0)backfillable++;else unparsable.push({trace_id:membership.trace_id,entry_id:membership.entry_id,label:membership.phase})}return{missing,backfillable,unparsable}},{compact:!1,writeSnapshot:!1})}async function backfillMembershipPhaseIds(directory){return runLocked(directory,void 0,async(paths,state2)=>{let items=[],skipped=[];for(let membership of state2.memberships.values()){if(membership.phase_id!==void 0)continue;let phaseId=extractPhaseIdFromLabel(membership.phase);if(phaseId===void 0){skipped.push({trace_id:membership.trace_id,entry_id:membership.entry_id,label:membership.phase});continue}items.push({trace_id:membership.trace_id,entry_id:membership.entry_id,phase_id:phaseId})}if(items.length>0){let eventId=randomUUID4(),row=makeRecord(state2,"phase_id_backfilled",{items},eventId);await appendRecord(paths,state2,row);for(let item of items){let membership=state2.memberships.get(keyOf2(item.trace_id,item.entry_id));if(membership&&membership.phase_id===void 0)membership.phase_id=item.phase_id}}return{backfilled:items.length,skipped,journal_records:items.length>0?1:0}})}var RECEIPT_TERMINAL_OUTCOMES,CANONICAL_RECEIPT_SOURCES,GENESIS_HASH="GENESIS",MAX_JOURNAL_RECORDS=2000,MAX_AUDIT_TAIL_RECORDS=256,MAX_JOURNAL_BYTES=33554432,MAX_ARCHIVE_RECORDS=1e4,MAX_ARCHIVE_BYTES=16777216,MAX_LEGACY_BYTES=33554432,MAX_REPAIR_CAPTURE_BYTES=4194304,MAX_REPAIR_QUARANTINE_RECORDS=8,REPAIR_QUARANTINE_SCHEMA_VERSION=1,DEFAULT_RECEIPT_GRACE_DAYS=7,keyOf2=(traceId,entryId)=>`${traceId.length}:${traceId}${entryId}`,emptyKeyOf=(traceId,sessionId)=>`${traceId.length}:${traceId}${sessionId}`,phaseLifecycleKey=(phase,sessionId,taskId)=>`${sessionId.length}:${sessionId}${phase.length}:${phase}${taskId===void 0?"u:":`s:${taskId.length}:${taskId}`}`,repairUncertaintyKey=(phase,sessionId)=>`${sessionId.length}:${sessionId}${phase.length}:${phase}`,recordPhaseCloseIntent=(directory,phase,sessionId,taskId,phaseId)=>phaseTransition(directory,phase,"phase_close_intent",sessionId,taskId,void 0,phaseId),commitPhaseClosed=(directory,phase,sessionId,taskId,phaseId)=>phaseTransition(directory,phase,"phase_closed",sessionId,taskId,void 0,phaseId),_internals22;var init_knowledge_receipt_ledger=__esm(()=>{init_config();init_schema();init_learning_health();init_extractors();init_knowledge_receipt_ledger_storage();init_knowledge_receipt_observability();RECEIPT_TERMINAL_OUTCOMES=new Set(["applied","ignored","contradicted","violated","n_a"]),CANONICAL_RECEIPT_SOURCES=new Set(["delegate","reviewer","architect","architect_marker","test_engineer","phase_override","application_gate_staleness_release","application_gate_denial_limit_release","application_gate_session_reset_release","manual","migration","unknown"]);_internals22={nowMs:()=>Date.now(),writeSnapshot,atomicWriteFsynced,appendFsynced,commitApplicationMarkerBatch,maxJournalRecords:MAX_JOURNAL_RECORDS,maxArchiveRecords:MAX_ARCHIVE_RECORDS,maxArchiveBytes:MAX_ARCHIVE_BYTES,maxRepairQuarantineRecords:MAX_REPAIR_QUARANTINE_RECORDS}});var exports_knowledge_events={};__export(exports_knowledge_events,{resolveLegacyApplicationLogPath:()=>resolveLegacyApplicationLogPath,resolveKnowledgeEventsPath:()=>resolveKnowledgeEventsPath,resolveKnowledgeCounterBaselinePath:()=>resolveKnowledgeCounterBaselinePath,resolveHiveEventsPath:()=>resolveHiveEventsPath2,recordKnowledgeEventsBatch:()=>recordKnowledgeEventsBatch,recordKnowledgeEvent:()=>recordKnowledgeEvent,recordHiveKnowledgeEvent:()=>recordHiveKnowledgeEvent,recomputeCounters:()=>recomputeCounters,readLegacyApplicationRecords:()=>readLegacyApplicationRecords,readKnowledgeEvents:()=>readKnowledgeEvents,readKnowledgeCounterRollups:()=>readKnowledgeCounterRollups,readHiveKnowledgeEvents:()=>readHiveKnowledgeEvents,readAuthoritativeKnowledgeCounterRollups:()=>readAuthoritativeKnowledgeCounterRollups,newTraceId:()=>newTraceId2,newEventId:()=>newEventId2,effectiveRetrievalOutcomes:()=>effectiveRetrievalOutcomes,countViolationsInWindow:()=>countViolationsInWindow,countEntryViolationsInWindow:()=>countEntryViolationsInWindow,countEntryContradictionsInWindow:()=>countEntryContradictionsInWindow,countEmptyTraceTerminals:()=>countEmptyTraceTerminals,applyKnowledgeVerdictFeedback:()=>applyKnowledgeVerdictFeedback,appendKnowledgeEventsBatch:()=>appendKnowledgeEventsBatch,appendKnowledgeEvent:()=>appendKnowledgeEvent,appendHiveKnowledgeEvent:()=>appendHiveKnowledgeEvent,_internals:()=>_internals23,RECEIPT_EVENT_TYPES:()=>RECEIPT_EVENT_TYPES,MAX_VIOLATION_TIMESTAMPS:()=>MAX_VIOLATION_TIMESTAMPS,MAX_EVENT_LOG_ENTRIES:()=>MAX_EVENT_LOG_ENTRIES,KNOWLEDGE_EVENT_SCHEMA_VERSION:()=>KNOWLEDGE_EVENT_SCHEMA_VERSION});import{randomUUID as randomUUID5}from"node:crypto";import{existsSync as existsSync11}from"node:fs";import{appendFile,mkdir as mkdir4,readFile as readFile5,stat as stat6}from"node:fs/promises";import*as path21 from"node:path";function resolveKnowledgeEventsPath(directory){return path21.join(resolveKnowledgeStoreDir(directory),"knowledge-events.jsonl")}function resolveKnowledgeCounterBaselinePath(directory){return path21.join(resolveKnowledgeStoreDir(directory),"knowledge-counter-baseline.json")}function resolveLegacyApplicationLogPath(directory){return path21.join(resolveKnowledgeStoreDir(directory),"knowledge-application.jsonl")}function newTraceId2(){return randomUUID5()}function newEventId2(){return randomUUID5()}function withDefaults(event){return{schema_version:KNOWLEDGE_EVENT_SCHEMA_VERSION,...event,event_id:event.event_id||newEventId2(),timestamp:event.timestamp||new Date().toISOString()}}async function appendKnowledgeEvent(directory,event){let[populated]=await appendKnowledgeEventsBatch(directory,[event]);return populated}async function appendKnowledgeEventsBatch(directory,events){if(events.length===0)return[];let populated=events.map(withDefaults),filePath=resolveKnowledgeEventsPath(directory),dirPath=path21.dirname(filePath);await mkdir4(dirPath,{recursive:!0});let release;try{release=await import_proper_lockfile3.default.lock(dirPath,{retries:{retries:200,minTimeout:10,maxTimeout:100}}),await appendFile(filePath,`${populated.map((e)=>JSON.stringify(e)).join(`
|
|
520
|
+
`:""}async function inspectMembershipPhaseIds(directory){return runLocked(directory,void 0,async(_paths,state2)=>{let backfillable=0,unparsable=[],missing=0;for(let membership of state2.memberships.values()){if(membership.phase_id!==void 0)continue;if(missing++,membership.phase===void 0){unparsable.push({trace_id:membership.trace_id,entry_id:membership.entry_id});continue}if(extractPhaseIdFromLabel(membership.phase)!==void 0)backfillable++;else unparsable.push({trace_id:membership.trace_id,entry_id:membership.entry_id,label:membership.phase})}return{missing,backfillable,unparsable}},{compact:!1,writeSnapshot:!1})}async function backfillMembershipPhaseIds(directory){return runLocked(directory,void 0,async(paths,state2)=>{let items=[],skipped=[];for(let membership of state2.memberships.values()){if(membership.phase_id!==void 0)continue;let phaseId=extractPhaseIdFromLabel(membership.phase);if(phaseId===void 0){skipped.push({trace_id:membership.trace_id,entry_id:membership.entry_id,label:membership.phase});continue}items.push({trace_id:membership.trace_id,entry_id:membership.entry_id,phase_id:phaseId})}if(items.length>0){let eventId=randomUUID4(),row=makeRecord(state2,"phase_id_backfilled",{items},eventId);await appendRecord(paths,state2,row);for(let item of items){let membership=state2.memberships.get(keyOf2(item.trace_id,item.entry_id));if(membership&&membership.phase_id===void 0)membership.phase_id=item.phase_id}}return{backfilled:items.length,skipped,journal_records:items.length>0?1:0}})}var RECEIPT_TERMINAL_OUTCOMES,CANONICAL_RECEIPT_SOURCES,GENESIS_HASH="GENESIS",MAX_JOURNAL_RECORDS=2000,MAX_AUDIT_TAIL_RECORDS=256,MAX_JOURNAL_BYTES=33554432,MAX_ARCHIVE_RECORDS=1e4,MAX_ARCHIVE_BYTES=16777216,MAX_LEGACY_BYTES=33554432,MAX_REPAIR_CAPTURE_BYTES=4194304,MAX_REPAIR_QUARANTINE_RECORDS=8,REPAIR_QUARANTINE_SCHEMA_VERSION=1,DEFAULT_RECEIPT_GRACE_DAYS=7,keyOf2=(traceId,entryId)=>`${traceId.length}:${traceId}${entryId}`,emptyKeyOf=(traceId,sessionId)=>`${traceId.length}:${traceId}${sessionId}`,phaseLifecycleKey=(phase,sessionId,taskId)=>`${sessionId.length}:${sessionId}${phase.length}:${phase}${taskId===void 0?"u:":`s:${taskId.length}:${taskId}`}`,repairUncertaintyKey=(phase,sessionId)=>`${sessionId.length}:${sessionId}${phase.length}:${phase}`,MAX_AUTHORIZED_FILING_SESSIONS=8,recordPhaseCloseIntent=(directory,phase,sessionId,taskId,phaseId)=>phaseTransition(directory,phase,"phase_close_intent",sessionId,taskId,void 0,phaseId),commitPhaseClosed=(directory,phase,sessionId,taskId,phaseId)=>phaseTransition(directory,phase,"phase_closed",sessionId,taskId,void 0,phaseId),_internals22;var init_knowledge_receipt_ledger=__esm(()=>{init_config();init_schema();init_learning_health();init_extractors();init_knowledge_receipt_ledger_storage();init_knowledge_receipt_observability();RECEIPT_TERMINAL_OUTCOMES=new Set(["applied","ignored","contradicted","violated","n_a"]),CANONICAL_RECEIPT_SOURCES=new Set(["delegate","reviewer","architect","architect_marker","test_engineer","phase_override","application_gate_staleness_release","application_gate_denial_limit_release","application_gate_session_reset_release","manual","migration","unknown"]);_internals22={nowMs:()=>Date.now(),writeSnapshot,atomicWriteFsynced,appendFsynced,commitApplicationMarkerBatch,maxJournalRecords:MAX_JOURNAL_RECORDS,maxArchiveRecords:MAX_ARCHIVE_RECORDS,maxArchiveBytes:MAX_ARCHIVE_BYTES,maxRepairQuarantineRecords:MAX_REPAIR_QUARANTINE_RECORDS}});var exports_knowledge_events={};__export(exports_knowledge_events,{resolveLegacyApplicationLogPath:()=>resolveLegacyApplicationLogPath,resolveKnowledgeEventsPath:()=>resolveKnowledgeEventsPath,resolveKnowledgeCounterBaselinePath:()=>resolveKnowledgeCounterBaselinePath,resolveHiveEventsPath:()=>resolveHiveEventsPath2,recordKnowledgeEventsBatch:()=>recordKnowledgeEventsBatch,recordKnowledgeEvent:()=>recordKnowledgeEvent,recordHiveKnowledgeEvent:()=>recordHiveKnowledgeEvent,recomputeCounters:()=>recomputeCounters,readLegacyApplicationRecords:()=>readLegacyApplicationRecords,readKnowledgeEvents:()=>readKnowledgeEvents,readKnowledgeCounterRollups:()=>readKnowledgeCounterRollups,readHiveKnowledgeEvents:()=>readHiveKnowledgeEvents,readAuthoritativeKnowledgeCounterRollups:()=>readAuthoritativeKnowledgeCounterRollups,newTraceId:()=>newTraceId2,newEventId:()=>newEventId2,effectiveRetrievalOutcomes:()=>effectiveRetrievalOutcomes,countViolationsInWindow:()=>countViolationsInWindow,countEntryViolationsInWindow:()=>countEntryViolationsInWindow,countEntryContradictionsInWindow:()=>countEntryContradictionsInWindow,countEmptyTraceTerminals:()=>countEmptyTraceTerminals,applyKnowledgeVerdictFeedback:()=>applyKnowledgeVerdictFeedback,appendKnowledgeEventsBatch:()=>appendKnowledgeEventsBatch,appendKnowledgeEvent:()=>appendKnowledgeEvent,appendHiveKnowledgeEvent:()=>appendHiveKnowledgeEvent,_internals:()=>_internals23,RECEIPT_EVENT_TYPES:()=>RECEIPT_EVENT_TYPES,MAX_VIOLATION_TIMESTAMPS:()=>MAX_VIOLATION_TIMESTAMPS,MAX_EVENT_LOG_ENTRIES:()=>MAX_EVENT_LOG_ENTRIES,KNOWLEDGE_EVENT_SCHEMA_VERSION:()=>KNOWLEDGE_EVENT_SCHEMA_VERSION});import{randomUUID as randomUUID5}from"node:crypto";import{existsSync as existsSync11}from"node:fs";import{appendFile,mkdir as mkdir4,readFile as readFile5,stat as stat6}from"node:fs/promises";import*as path21 from"node:path";function resolveKnowledgeEventsPath(directory){return path21.join(resolveKnowledgeStoreDir(directory),"knowledge-events.jsonl")}function resolveKnowledgeCounterBaselinePath(directory){return path21.join(resolveKnowledgeStoreDir(directory),"knowledge-counter-baseline.json")}function resolveLegacyApplicationLogPath(directory){return path21.join(resolveKnowledgeStoreDir(directory),"knowledge-application.jsonl")}function newTraceId2(){return randomUUID5()}function newEventId2(){return randomUUID5()}function withDefaults(event){return{schema_version:KNOWLEDGE_EVENT_SCHEMA_VERSION,...event,event_id:event.event_id||newEventId2(),timestamp:event.timestamp||new Date().toISOString()}}async function appendKnowledgeEvent(directory,event){let[populated]=await appendKnowledgeEventsBatch(directory,[event]);return populated}async function appendKnowledgeEventsBatch(directory,events){if(events.length===0)return[];let populated=events.map(withDefaults),filePath=resolveKnowledgeEventsPath(directory),dirPath=path21.dirname(filePath);await mkdir4(dirPath,{recursive:!0});let release;try{release=await import_proper_lockfile3.default.lock(dirPath,{retries:{retries:200,minTimeout:10,maxTimeout:100}}),await appendFile(filePath,`${populated.map((e)=>JSON.stringify(e)).join(`
|
|
521
521
|
`)}
|
|
522
522
|
`,"utf-8");try{let lines=(await readFile5(filePath,"utf-8")).split(`
|
|
523
523
|
`).filter((line)=>line.trim().length>0);if(lines.length>MAX_EVENT_LOG_ENTRIES){let evicted=lines.slice(0,lines.length-MAX_EVENT_LOG_ENTRIES),trimmed=lines.slice(lines.length-MAX_EVENT_LOG_ENTRIES);await foldEvictedEventsIntoBaseline(directory,evicted,filePath),await atomicWriteFile(filePath,`${trimmed.join(`
|
|
@@ -1259,7 +1259,7 @@ ${expectedBodyBlock}
|
|
|
1259
1259
|
`).slice(0,3).join(`
|
|
1260
1260
|
`),headingMatch=/^\s*(APPROVED|NEEDS_REVISION|REJECTED)\s*$/im.exec(nextLines);if(headingMatch)return headingMatch[1].toUpperCase()}let lines=text.split(`
|
|
1261
1261
|
`),tailStart=Math.max(0,lines.length-6),inFence=!1;for(let i=0;i<lines.length;i++){if(/^\s*(?:`{3,})/.test(lines[i]))inFence=!inFence;if(i<tailStart)continue;if(inFence)continue;let line=lines[i];if(line.includes("|"))continue;let bare=/^\s*(APPROVED|NEEDS_REVISION|REJECTED)\s*$/i.exec(line);if(bare)return bare[1].toUpperCase()}return null}function taskLooksLikePlanCritic(args2){let text=[args2.prompt,args2.task,args2.description,args2.message,args2.input].filter((value)=>typeof value==="string").join(`
|
|
1262
|
-
`).toLowerCase();if(!text)return!1;return PLAN_CRITIC_TASK_SIGNALS.some((signal)=>text.includes(signal))}async function isPlanCriticApproved(directory){try{let plan=await loadPlanJsonOnly(directory);if(!plan)return!1;let planId=derivePlanId(plan),approved=await loadLastPlanCriticApprovedSnapshot(directory,planId);if(!approved)return!1;if(approved.approval?.verdict!=="APPROVED"||approved.approval?.source!=="plan_critic_gate")return!1;if(approved.payloadHash!==computePlanStructureHash(plan))return!1;return!0}catch{return!1}}async function assertPlanCriticApprovedForExecution(directory,plan){if(!plan)return;let planId=derivePlanId(plan),approved=await loadLastPlanCriticApprovedSnapshot(directory,planId);if(!approved)throw Error("PLAN_CRITIC_GATE_VIOLATION: Cannot delegate to coder before plan critic approval. Delegate to critic in MODE: CRITIC-GATE and require VERDICT: APPROVED before EXECUTE. If the critic already returned APPROVED but the snapshot was not recorded "+"(format/signal mismatch — issue #2012), call approve_plan_critic with a reason, "+"or run /swarm approve-plan-critic <reason>, to record a manual approval.");if(approved.approval?.verdict!=="APPROVED"||approved.approval?.source!=="plan_critic_gate")throw Error("PLAN_CRITIC_GATE_VIOLATION: Latest approved-plan snapshot does not contain plan critic VERDICT: APPROVED evidence. Re-run MODE: CRITIC-GATE and wait for explicit approval before coder execution. If the critic already returned APPROVED but the snapshot was not recorded (issue #2012), call approve_plan_critic or run /swarm approve-plan-critic.");if(approved.payloadHash!==computePlanStructureHash(plan))throw Error("PLAN_CRITIC_GATE_VIOLATION: Current plan differs from the last critic-approved snapshot. Re-run MODE: CRITIC-GATE after plan changes before delegating to coder. If re-review is not possible, call approve_plan_critic or run /swarm approve-plan-critic to record a fresh manual approval for the current plan.")}function resolvePlanCriticPolicyForExecution(directory,plan,sessionOverrides={}){try{let profile=getProfileForIdentity(directory,{swarm:plan.swarm,title:plan.title});if(!profile)return{required:DEFAULT_QA_GATES.critic_pre_plan,source:"default_missing_profile"};return{required:getEffectiveGates(profile,sessionOverrides).critic_pre_plan,source:sessionOverrides.critic_pre_plan===!0&&profile.gates.critic_pre_plan===!1?"session_ratchet":"persisted_profile"}}catch(error93){return warn(`[delegation-gate] failed to resolve critic_pre_plan profile; enforcing the gate: ${error93 instanceof Error?error93.message:String(error93)}`),{required:!0,source:"corrupt_profile_conservative"}}}async function recordPlanCriticApprovalSnapshotIfApplicable(directory,input,args2,output){if((typeof args2.subagent_type==="string"?stripKnownSwarmPrefix(args2.subagent_type):null)!=="critic")return;if(!taskLooksLikePlanCritic(args2))return;if(extractPlanCriticVerdict(output)!=="APPROVED")return;let plan=await loadPlanJsonOnly(directory);if(!plan)for(let attempt=0;attempt<2&&!plan;attempt++)await new Promise((resolve50)=>setTimeout(resolve50,150)),plan=await loadPlanJsonOnly(directory);if(!plan){warn("[delegation-gate] plan critic APPROVED verdict could not be recorded: plan.json not readable after retry. The critic_pre_plan gate will block coder delegation until a snapshot exists. Call approve_plan_critic (or /swarm approve-plan-critic) with a reason to record a manual approval if the critic genuinely approved.");return}await takeSnapshotEvent(directory,plan,{source:"critic_approved",approvalMetadata:{verdict:"APPROVED",source:"plan_critic_gate",session_id:input.sessionID,call_id:input.callID,approved_at:new Date().toISOString()},payloadHashOverride:computePlanStructureHash(plan)})}async function forceRecordPlanCriticApproval(directory,sessionID,options={}){let session=ensureAgentSession(sessionID,void 0,directory);if(!session||!session.agentName||stripKnownSwarmPrefix(session.agentName)!=="architect")throw Error("NOT_AUTHORIZED: approve_plan_critic requires an active architect session. The plan-critic gate escape hatch is an architect-only escalation; a coder/reviewer cannot self-unblock. Run /swarm approve-plan-critic from an architect context, or ask the user to run it.");let plan=await loadPlanJsonOnly(directory);if(!plan){let planPath=path97.join(directory,".swarm","plan.json");if(fs60.existsSync(planPath))throw Error("PLAN_CORRUPT: .swarm/plan.json exists but could not be parsed (corrupt or schema-invalid). Repair or re-save the plan before recording a plan-critic approval.");throw Error("PLAN_NOT_FOUND: no .swarm/plan.json — cannot record a plan-critic "+"approval for a non-existent plan. Save a plan first.")}let planId=derivePlanId(plan),recordedAt=new Date().toISOString(),sanitizedReason=typeof options.reason==="string"&&options.reason.trim().length>0?options.reason.trim().slice(0,500):void 0,userConfirmed=options.userConfirmed===!0;await takeSnapshotEvent(directory,plan,{source:"critic_approved",approvalMetadata:{verdict:"APPROVED",source:"plan_critic_gate",method:"manual_override",reason:sanitizedReason,user_confirmed:userConfirmed,session_id:sessionID,approved_at:recordedAt},payloadHashOverride:computePlanStructureHash(plan)});try{appendCoreEventSync(directory,{type:"plan_critic_gate_manual_approval",timestamp:recordedAt,sessionID,plan_id:planId,user_confirmed:userConfirmed,...sanitizedReason?{reason:sanitizedReason}:{}})}catch(err){warn(`[delegation-gate] plan_critic_gate_manual_approval audit event write failed: ${err instanceof Error?err.message:String(err)}`)}return{planId,recordedAt,...sanitizedReason?{reason:sanitizedReason}:{},userConfirmed}}async function forceRecordRetrySoundingBoardApproval(directory,sessionID,options){let session=ensureAgentSession(sessionID,void 0,directory);if(!session||!session.agentName||stripKnownSwarmPrefix(session.agentName)!=="architect")throw Error("APPROVE_RETRY_SOUNDING_BOARD_ARCHITECT_REQUIRED: approve_retry_sounding_board requires an active architect session. The coder retry circuit-breaker escape hatch is architect-only; a coder/reviewer cannot self-unblock.");let taskId=typeof options.taskId==="string"?options.taskId.trim():"";if(!taskId)throw Error('APPROVE_RETRY_UNKNOWN_TASK: approve_retry_sounding_board requires the exact plan task id (e.g. "2.1").');let plan=await loadPlanJsonOnly(directory);if(!plan){let planPath=path97.join(directory,".swarm","plan.json");if(fs60.existsSync(planPath))throw Error("PLAN_CORRUPT: .swarm/plan.json exists but could not be parsed (corrupt or schema-invalid). Repair or re-save the plan before recording a retry sounding-board approval.");throw Error("PLAN_NOT_FOUND: no .swarm/plan.json — cannot record a retry "+"sounding-board approval without a plan. Save a plan first.")}if(!new Set(plan.phases.flatMap((phase)=>phase.tasks.map((task)=>task.id))).has(taskId))throw Error(`APPROVE_RETRY_UNKNOWN_TASK: task ${taskId} is not in the current plan. Refusing to record evidence for a foreign task id.`);let{getTaskWorkflowSnapshot:getTaskWorkflowSnapshot2,readTaskEvidence:readTaskEvidence2,recordGateEvidence:recordGateEvidence2}=await Promise.resolve().then(() => (init_gate_evidence(),exports_gate_evidence)),evidence=await readTaskEvidence2(directory,taskId),workflow=getTaskWorkflowSnapshot2(evidence);if(!evidence||!workflow.authoritative)throw Error(`APPROVE_RETRY_NO_WORKFLOW: no durable task workflow evidence exists for task ${taskId} — there is no retry state to recover.`);let prior;try{prior=readCoderRetryEscalations(directory,taskId,workflow.retryEpoch)}catch(error93){if(error93 instanceof Error&&error93.message==="CORE_EVENT_AUTHORITY_INDEX_UNREADABLE")throw Error("APPROVE_RETRY_AUDIT_INDEX_UNREADABLE: the retry audit authority index is unreadable, so the prior sounding_board_consultation cannot be verified. Repair the events store (see /swarm doctor) and retry.");throw error93}if(!prior.has("sounding_board_consultation"))throw Error(`APPROVE_RETRY_CONSULTATION_REQUIRED: task ${taskId} has no durable sounding_board_consultation escalation for retry epoch ${workflow.retryEpoch}. `+"Dispatch critic_sounding_board first — this tool records an obtained APPROVED verdict, it cannot substitute for the consultation.");let sanitizedReason=typeof options.reason==="string"&&options.reason.trim().length>0?options.reason.trim().slice(0,500):void 0,recordedAt=new Date().toISOString(),transitionId=`retry-sb-manual:${sessionID}:epoch${workflow.retryEpoch}`;await recordGateEvidence2(directory,taskId,"critic_sounding_board",sessionID,!1,{transitionId,expectedGeneration:workflow.generation});let auditEventRecorded=!0;try{appendCoreEventSync(directory,{type:"coder_retry_circuit_breaker",timestamp:recordedAt,taskId,generation:workflow.generation,retryEpoch:workflow.retryEpoch,rejectionCount:workflow.retryCount,rejectionHistory:[...workflow.retryHistory],phase:Number(taskId.split(".")[0])||0,action:"sounding_board_manual_approval",...sanitizedReason?{reason:sanitizedReason}:{}},{dedupeOnAuthorityKey:!0})}catch(err){auditEventRecorded=!1,warn(`[delegation-gate] sounding_board_manual_approval audit event write failed: ${err instanceof Error?err.message:String(err)}`)}return{taskId,generation:workflow.generation,retryEpoch:workflow.retryEpoch,recordedAt,auditEventRecorded}}function isTaskCompletedForParallelGuidance(task){let status=task.status??"pending";return status==="completed"||status==="closed"}function getPlanTaskDeclaredFiles(plan,taskId){if(!plan||!taskId)return null;for(let phase of plan.phases){let task=phase.tasks.find((candidate)=>candidate.id===taskId);if(task)return[...task.files_touched]}return null}async function hasExplicitEmptyPlanScope(directory,taskId){let planPath=path97.join(directory,".swarm","plan.json"),handle;try{handle=await fs60.promises.open(planPath,"r");let stat9=await handle.stat();if(!stat9.isFile()||stat9.size>MAX_RAW_PLAN_SCOPE_INSPECTION_BYTES)return!1;let bytes=Buffer.alloc(stat9.size),offset=0;while(offset<bytes.length){let result=await handle.read(bytes,offset,bytes.length-offset,offset);if(result.bytesRead===0)return!1;offset+=result.bytesRead}let parsed=JSON.parse(bytes.toString("utf8"));if(!Array.isArray(parsed.phases))return!1;for(let phase of parsed.phases){if(!phase||typeof phase!=="object")continue;let tasks=phase.tasks;if(!Array.isArray(tasks))continue;for(let task of tasks){if(!task||typeof task!=="object")continue;let record3=task;if(record3.id===taskId&&Object.hasOwn(record3,"files_touched")&&Array.isArray(record3.files_touched)&&record3.files_touched.length===0)return!0}}}catch{return!1}finally{await handle?.close().catch(()=>{return})}return!1}async function settleRejectedEmptyPlanScope(directory,input,taskId,expectedGeneration){let baseline=await captureWorkspaceSnapshotAsync(directory);if(baseline.gitHead===null||!Array.isArray(baseline.changedFiles)||baseline.changedFiles.length!==0)return null;let transitionId=`coder-preflight:${input.callID}`;try{await beginCoderSettlement({directory,taskId,transitionId,actor:input.sessionID,expectedGeneration,context:{baseline,declaredFiles:[],workflowGeneration:expectedGeneration}});let observedFiles=await changedFilesSinceSnapshotAsync(directory,baseline);if(observedFiles===null)throw Error("CODER_SETTLEMENT_BASELINE_UNAVAILABLE: empty-scope preflight could not prove a clean post-baseline workspace.");return await settleCoderDispatch({directory,taskId,transitionId,accepted:!1,testEngineerExempt:!1,observedFiles})}catch(error93){try{await abortCoderSettlement({directory,taskId,transitionId,reason:`empty-scope preflight settlement failed: ${error93 instanceof Error?error93.message:String(error93)}`})}catch(abortError){criticalWarn(`[delegation-gate] failed to abort empty-scope preflight settlement for ${taskId}: ${abortError instanceof Error?abortError.message:String(abortError)}`)}throw error93}}function describeCoderScopeFailure(args2,planTaskIdContext){if(planTaskIdContext.status==="over_limit")return`loaded plan task context exceeds the shared bounded limit (${TASK_ID_RESOLUTION_LIMITS.maxKnownIds} task ids); task-id resolution fails closed instead of guessing. Provide an explicit structured scope declaration or narrow the plan context before delegating.`;let resolution=resolveTaskId(args2,{policy:"plan",...toTaskIdPlanContextOptions(planTaskIdContext)}),knownPlanTaskIds=planTaskIdContext.status==="available"?planTaskIdContext.taskIds:void 0,knownSummary=knownPlanTaskIds?[...knownPlanTaskIds].sort().join(", ")||"(none)":"(none)",rawTaskId=args2.task_id??args2.taskId,explicitFieldShape=typeof rawTaskId==="string"&&rawTaskId.trim().length>0?`"${rawTaskId.trim().slice(0,40)}" (non-plan-shaped; treated as runtime session id and ignored — falling through to text extraction)`:"absent",candidateTextFields=[args2.prompt,args2.description,args2.task,args2.input],taskLineCandidates=new Set,taskLineDetected=!1;for(let field of candidateTextFields){if(typeof field!=="string")continue;let taskLine=extractTaskLine(field);if(!taskLine)continue;taskLineDetected=!0;for(let m of taskLine.matchAll(/\b(\d+\.\d+(?:\.\d+)*)\b/g))if(knownPlanTaskIds?.has(m[1]))taskLineCandidates.add(m[1])}let textCandidates=new Set;for(let field of candidateTextFields){if(typeof field!=="string")continue;for(let m of field.matchAll(/\b(\d+\.\d+(?:\.\d+)*)\b/g))if(knownPlanTaskIds?.has(m[1]))textCandidates.add(m[1])}if(resolution.status==="invalid"&&typeof rawTaskId==="string"&&isStrictTaskId(rawTaskId.trim()))return`explicit task_id "${rawTaskId.trim().slice(0,40)}" is plan-shaped but does not resolve safely against the loaded plan, so resolution fails closed before prompt fallback. Known plan task ids: ${knownSummary}.`;if(resolution.status==="over_limit")return`task-id resolution exceeded a bounded input limit (${resolution.input}); provide exactly one concise TASK: <N.M> line or a valid explicit plan task_id. Known plan task ids: ${knownSummary}.`;if(taskLineCandidates.size>1)return`multiple candidate task ids found in TASK: line: [${[...taskLineCandidates].sort().join(", ")}]; provide exactly one unambiguous TASK: <id> line. Known plan task ids: ${knownSummary}.`;if(textCandidates.size>1)return`multiple candidate task ids found in prompt text: [${[...textCandidates].sort().join(", ")}]; provide exactly one unambiguous TASK: <id> line. Known plan task ids: ${knownSummary}.`;return`no plan task id could be resolved. Include a TASK: <N.M> line or plan-task-shaped task_id arg. Explicit task_id field: ${explicitFieldShape}. TASK: line detected: ${taskLineDetected?"yes":"no"}. Known plan task ids: ${knownSummary}.`}function stripSingleTrailingAnnotationSuffix(value){let suffixMatch=value.match(/(?:\s+\([^()]*\))+$/);if(!suffixMatch)return value;let suffix=suffixMatch[0];if((suffix.match(/\([^()]*\)/g)??[]).length!==1)return null;return value.slice(0,-suffix.length).trimEnd()||null}function normalizeFileDirectiveValue(rawValue){let value=rawValue.trim();if(!value)return null;let quote=value[0];if(quote==='"'||quote==="'"){let closingQuoteIndex=value.indexOf(quote,1);if(closingQuoteIndex===-1)return null;let filePath=value.slice(1,closingQuoteIndex);if(!filePath)return null;let suffix=value.slice(closingQuoteIndex+1);if(suffix.length>0&&!/^\s+\([^()]*\)\s*$/.test(suffix))return null;return filePath}let normalized=stripSingleTrailingAnnotationSuffix(value);if(!normalized||/[,;|]/.test(normalized))return null;return normalized}function extractTaskFileDirectives(args2,mode){let files=new Set,present=!1;for(let field of[args2.prompt,args2.description,args2.task,args2.input]){if(typeof field!=="string")continue;for(let line of field.split(/\r?\n/)){if(!/^\s*FILE\s*:/i.test(line))continue;present=!0;let value=normalizeFileDirectiveValue(line.replace(/^\s*FILE\s*:\s*/i,""));if(!value){if(mode==="observe")continue;return{present:!0,files:null}}files.add(value)}}return{present,files:present&&files.size>0?[...files]:null}}function parsePerTaskVerdicts(outputText2){let verdicts=new Map,errors5=[],reviewedPattern=/^\[REVIEWED\]\s*\|\s*(?:task-)?(\d+\.\d+(?:\.\d+)*)\s*\|\s*(APPROVED|REJECTED|CONCERNS)\s*\|?/im,testedPattern=/^\[TESTED\]\s*\|\s*(?:task-)?(\d+\.\d+(?:\.\d+)*)\s*\|\s*(PASS|FAIL|SKIPPED)\s*\|?/im;for(let line of outputText2.split(/\r?\n/)){let trimmed=line.trim(),match=reviewedPattern.exec(trimmed);if(match){let taskId=match[1],verdict=match[2];if(isStrictTaskId(taskId)){let existing=verdicts.get(taskId);if(existing){if(existing.verdict!==verdict||existing.kind!=="REVIEWED")errors5.push(`STAGE_B_VERDICT_CONFLICT: task ${taskId} has conflicting verdicts: ${existing.kind}/${existing.verdict} vs REVIEWED/${verdict}`)}else verdicts.set(taskId,{verdict,kind:"REVIEWED"})}continue}if(match=testedPattern.exec(trimmed),match){let taskId=match[1],verdict=match[2];if(isStrictTaskId(taskId)){let existing=verdicts.get(taskId);if(existing){if(existing.verdict!==verdict||existing.kind!=="TESTED")errors5.push(`STAGE_B_VERDICT_CONFLICT: task ${taskId} has conflicting verdicts: ${existing.kind}/${existing.verdict} vs TESTED/${verdict}`)}else verdicts.set(taskId,{verdict,kind:"TESTED"})}}}return{verdicts,errors:errors5}}async function findTaskAwaitingCompletion(directory,requestedTaskId){if(!directory)return null;let plan=null;try{plan=await loadPlanJsonOnly(directory)}catch{return null}if(!plan)return null;let{getTaskWorkflowSnapshot:getTaskWorkflowSnapshot2,readTaskEvidence:readTaskEvidence2}=await Promise.resolve().then(() => (init_gate_evidence(),exports_gate_evidence)),tasks=plan.phases.flatMap((phase)=>phase.tasks),orderedTasks=requestedTaskId?[...tasks.filter((task)=>task.id===requestedTaskId),...tasks.filter((task)=>task.id!==requestedTaskId)]:tasks;for(let task of orderedTasks){let taskId=task.id,evidence=await readTaskEvidence2(directory,taskId),workflow=getTaskWorkflowSnapshot2(evidence),councilEvidence=evidence?.gates.council,awaitsQaCompletion=workflow.authoritative&&workflow.state==="tests_run",awaitsCouncilCompletion=workflow.authoritative&&workflow.state==="pre_check_passed"&&councilEvidence?.verdict==="APPROVE";if(!awaitsQaCompletion&&!awaitsCouncilCompletion)continue;let planStatus=task.status??"pending";if(planStatus==="completed"||planStatus==="closed"||planStatus==="blocked")continue;return taskId}return null}function completionGateViolationMessage(taskAwaitingCompletion){return`TASK_COMPLETION_GATE_VIOLATION: Task ${taskAwaitingCompletion} reached tests_run but is not marked completed in plan.json/plan.md. Call update_task_status with task_id="${taskAwaitingCompletion}" and status="completed". Read-only inspection remains available; a proven-disjoint task may continue; if plan.json is ledger-stale, retry save_plan with reconcile_ledger_projection=true and otherwise-unchanged plan content.`}function readCoderRetryEscalations(directory,taskId,retryEpoch){return getCoderRetryEscalationActions(directory,taskId,retryEpoch)}async function emitCoderRetryEscalation(directory,input){try{appendCoreEventSync(directory,{type:"coder_retry_circuit_breaker",timestamp:new Date().toISOString(),taskId:input.taskId,generation:input.generation,retryEpoch:input.retryEpoch,rejectionCount:input.rejectionCount,rejectionHistory:input.rejectionHistory,phase:Number(input.taskId.split(".")[0])||0,action:input.action},{dedupeOnAuthorityKey:!0})}catch(error93){if(error93 instanceof Error&&error93.message===CORE_EVENT_LOCKED)throw Error("TASK_RETRY_AUDIT_LOCKED");throw error93}}async function enforceCoderRetryEscalation(input){if(input.retryCount<3)return;let prior;try{prior=readCoderRetryEscalations(input.directory,input.taskId,input.retryEpoch)}catch(error93){if(error93 instanceof Error&&error93.message==="CORE_EVENT_AUTHORITY_INDEX_UNREADABLE")throw Error("TASK_RETRY_AUDIT_INDEX_UNREADABLE");throw error93}if(!prior.has("sounding_board_consultation"))throw await emitCoderRetryEscalation(input.directory,{...input,rejectionCount:input.retryCount,rejectionHistory:input.retryHistory,action:"sounding_board_consultation"}),Error(`TASK_RETRY_CRITIC_REQUIRED: task ${input.taskId} reached the bounded retry threshold. Dispatch critic_sounding_board for this exact task before another coder attempt.`);if(prior.has("simplification"))throw await emitCoderRetryEscalation(input.directory,{...input,rejectionCount:input.retryCount,rejectionHistory:input.retryHistory,action:"user_escalation"}),Error(`TASK_RETRY_USER_ESCALATION_REQUIRED: task ${input.taskId} failed its critic-guided simplified retry. Stop and ask the user to change scope, authorize repair, or choose a different approach.`);if(!input.criticSatisfied)throw Error(`TASK_RETRY_CRITIC_REQUIRED: task ${input.taskId} is waiting for an exact-generation critic_sounding_board APPROVED verdict.`);await emitCoderRetryEscalation(input.directory,{...input,rejectionCount:input.retryCount,rejectionHistory:input.retryHistory,action:"simplification"})}function isExplicitTaskEvidenceAgent(targetAgent){return EXPLICIT_TASK_EVIDENCE_AGENTS.has(stripKnownSwarmPrefix(targetAgent))}function evidenceTaskResolutionOptions(targetAgent,allowSessionFallback){if(isExplicitTaskEvidenceAgent(targetAgent))return{policy:"attribution",allowSessionFallback:!1};if(allowSessionFallback===!1)return{allowSessionFallback:!1};return}function canRunWhileTaskAwaitsCompletion(input){let normalizedTool=input.normalizedTool.toLowerCase();if(isReadOnlyTool(normalizedTool))return!0;if(COMPLETION_RECOVERY_TOOLS.has(normalizedTool))return!0;if(normalizedTool==="spec_write"&&input.directory&&fs60.existsSync(path97.join(input.directory,".swarm","spec-staleness.json")))return!0;if(normalizedTool==="save_plan"&&input.args.reconcile_ledger_projection===!0)return!0;if(normalizedTool==="update_task_status"&&input.requestedTaskId===input.awaitingTaskId)return!0;if(input.directory&&input.requestedTaskId&&input.requestedTaskId!==input.awaitingTaskId)try{if(isProvablyDisjoint(input.directory,[input.awaitingTaskId,input.requestedTaskId]))return!0}catch{return!1}return!1}async function buildParallelExecutionGuidance(directory,sessionID,session){if(!directory)return null;let plan=await loadPlanJsonOnly(directory);if(!plan)return null;let profile=plan.execution_profile,enabled=profile?.parallelization_enabled===!0,maxConcurrent=profile?.max_concurrent_tasks??10,effectiveMaxConcurrent=session?.maxConcurrencyOverride??maxConcurrent,allTasks=plan.phases.flatMap((phase)=>phase.tasks),blockedTasks=allTasks.filter((task)=>{if(task.status!=="blocked")return!1;let reason=(task.blocked_reason??"").toLowerCase();return reason.includes("fail")||reason.includes("error")||reason.includes("exception")}),totalTasks=allTasks.length,backoffTriggered=!1;if(totalTasks>0&&blockedTasks.length>0){let failureRate=blockedTasks.length/totalTasks,FAILURE_RATE_THRESHOLD=0.2,BACKOFF_MULTIPLIER=0.5;if(failureRate>0.2&&blockedTasks.length>=2){let newConcurrency=Math.max(1,Math.floor(effectiveMaxConcurrent*0.5));if(newConcurrency<effectiveMaxConcurrent)effectiveMaxConcurrent=newConcurrency,session.maxConcurrencyOverride=newConcurrency,backoffTriggered=!0}}if(!enabled||effectiveMaxConcurrent<=1)return null;if(hasActiveLeanTurbo(sessionID))return"[NEXT] Lean Turbo is active; use lean_turbo_run_phase and Lean Turbo lane guidance instead of standard execution-profile slot filling.";let currentPhaseId=resolveActivePhaseId(plan),currentPhase=plan.phases.find((phase)=>phase.id===currentPhaseId);if(!currentPhase)return null;let tasks=currentPhase.tasks;if(tasks.length===0)return null;let pendingTaskIds=collectPendingTaskIdsForActivePhase(plan),fallbackReason=null;if(pendingTaskIds.length<2)fallbackReason="fewer than two pending tasks in the active phase — nothing to parallelize";else try{let verdict=computeParallelVerdict(directory,pendingTaskIds,{plan});if(verdict.verdict==="all_disjoint");else if(verdict.verdict==="unknown_scopes"){let shown=verdict.unknownScopeTasks.slice(0,6).join(", "),more=verdict.unknownScopeTasks.length>6?` (and ${verdict.unknownScopeTasks.length-6} more)`:"";fallbackReason=`no live declared scope for task${verdict.unknownScopeTasks.length===1?"":"s"}: ${shown}${more} — call declare_scope for each pending task, then retry`}else{let conflictPair=verdict.pairs.find((pair)=>pair.verdict==="conflict"),evidence=(conflictPair?.evidence??[]).slice(0,3).join("; ");fallbackReason=`declared scopes overlap: tasks ${conflictPair?.a??"?"} and ${conflictPair?.b??"?"} conflict (${evidence||"shared paths"})`}}catch{fallbackReason="verdict computation failed (fail-safe serial per v8 contract)"}if(fallbackReason!==null)return`[PARALLEL EXECUTION PROFILE] parallelization_enabled=true max_concurrent_tasks=${effectiveMaxConcurrent}; SERIAL fallback active (v8 automatic safety) — exact reason: ${fallbackReason}. Run plan_conflict_check on the pending tasks to inspect the conflict matrix and a suggested serialization order, or proceed serially (one coder at a time).`;let completed=new Set;for(let task of allTasks){let taskId=task.id;if(isTaskCompletedForParallelGuidance(task))completed.add(taskId);if(getTaskState(session,taskId)==="complete")completed.add(taskId)}let occupied=new Set;for(let task of allTasks){let taskId=task.id;if(task.status==="in_progress")occupied.add(taskId);let state2=getTaskState(session,taskId);if(ACTIVE_PARALLEL_TASK_STATES.has(state2))occupied.add(taskId)}let availableSlots=Math.max(0,effectiveMaxConcurrent-occupied.size);if(availableSlots<=0)return`[PARALLEL EXECUTION PROFILE] parallelization_enabled=true max_concurrent_tasks=${effectiveMaxConcurrent}; all standard execution slots are occupied. Continue current active task gates before starting more coder work.`;let eligible=tasks.filter((task)=>{let taskId=task.id;if((task.status??"pending")!=="pending")return!1;if(occupied.has(taskId))return!1;return task.depends.every((dep)=>completed.has(dep))}).map((task)=>task.id).slice(0,availableSlots);if(eligible.length===0)return`[PARALLEL EXECUTION PROFILE] parallelization_enabled=true max_concurrent_tasks=${effectiveMaxConcurrent}; no dependency-ready pending tasks are available for a new coder slot. Continue the current task/gate.`;let failureWarning=backoffTriggered?` (${blockedTasks.length} blocked task(s) detected — concurrency auto-reduced due to failures)`:"";return`[PARALLEL EXECUTION PROFILE] parallelization_enabled=true max_concurrent_tasks=${effectiveMaxConcurrent}; ${occupied.size} slot(s) occupied. Eligible now: ${eligible.join(", ")}. [NEXT] dispatch up to ${availableSlots} eligible coder task(s) before waiting; preserve ONE task per coder call and call declare_scope for each task.${failureWarning}`}function collectPendingTaskIdsForActivePhase(plan){let currentPhaseId=resolveActivePhaseId(plan),currentPhase=plan.phases.find((phase)=>phase.id===currentPhaseId);if(!currentPhase)return[];return currentPhase.tasks.filter((t)=>t.status==="pending").map((t)=>t.id)}function scopeVerdictAllowsParallel(directory,plan){try{let pendingTaskIds=collectPendingTaskIdsForActivePhase(plan);if(pendingTaskIds.length<2)return!1;return computeParallelVerdict(directory,pendingTaskIds,{plan}).verdict==="all_disjoint"}catch{return!1}}async function getEvidenceTaskId(session,directory){let resolvedPlanPath,primary=session.currentTaskId??session.lastCoderDelegationTaskId;if(primary)return primary;if(session.taskWorkflowStates&&session.taskWorkflowStates.size>0)return session.taskWorkflowStates.keys().next().value??null;try{if(typeof directory!=="string"||directory.length===0)return null;let resolvedDirectory=path97.resolve(directory),planPath=path97.join(resolvedDirectory,".swarm","plan.json");if(resolvedPlanPath=path97.resolve(planPath),!resolvedPlanPath.startsWith(resolvedDirectory+path97.sep)&&resolvedPlanPath!==resolvedDirectory)return null;let planContent=await fs60.promises.readFile(resolvedPlanPath,"utf-8"),plan=EvidenceTaskIdPlanSchema.parse(JSON.parse(planContent));if(!plan||!Array.isArray(plan.phases))return null;for(let phase of plan.phases)if(Array.isArray(phase.tasks)){for(let task of phase.tasks)if(task.status==="in_progress")return task.id??null}}catch(err){if(err instanceof ZodError){let issueSummary=err.issues.slice(0,3).map((issue3)=>issue3.message).join("; ");return warn(`[delegation-gate] getEvidenceTaskId ignored invalid plan schema at ${resolvedPlanPath??"unknown path"}: ${issueSummary}`),null}if(process.env.DEBUG_SWARM&&err instanceof Error)warn(`[delegation-gate] getEvidenceTaskId error: ${err.message} (code=${err.code??"none"})`);return null}return null}async function resolveEvidenceTaskId(args2,session,directory,options={}){let plan=null,planTaskIdContext;try{if(plan=await loadPlanJsonOnly(directory),plan)planTaskIdContext=collectPlanTaskIdContextFromPhases(plan.phases)}catch{}if(args2)try{let policy=options.policy??"plan",planContextOptions=policy==="attribution"&&planTaskIdContext?.status==="over_limit"?{}:planTaskIdContext?toTaskIdPlanContextOptions(planTaskIdContext):{},resolutionOptions={policy,...planContextOptions,standaloneTaskMarkerOnly:policy==="attribution"},resolution=resolveTaskId(args2,resolutionOptions);if(resolution.status==="resolved"){let resolvedTaskId=resolution.taskId;if(policy==="attribution"&&!isStrictTaskId(resolvedTaskId)){let markerOnlyArgs={...args2};for(let field of EXPLICIT_TASK_ID_FIELDS)delete markerOnlyArgs[field];let markerResolution=resolveTaskId(markerOnlyArgs,resolutionOptions);if(markerResolution.status!=="resolved"||!isStrictTaskId(markerResolution.taskId))return null;resolvedTaskId=markerResolution.taskId}if(planTaskIdContext?.status==="over_limit"&&!plan?.phases.some((phase)=>phase?.tasks?.some((task)=>task?.id===resolvedTaskId)))return null;return resolvedTaskId}if(resolution.status==="invalid"||resolution.status==="ambiguous"||resolution.status==="over_limit")return null}catch{}if(options.allowSessionFallback===!1)return null;return getEvidenceTaskId(session,directory)}function sameReplayPrompt(existing,incoming){if(existing===void 0||incoming===void 0)return existing===incoming;return existing.digest===incoming.digest&&existing.chars===incoming.chars&&existing.truncated===incoming.truncated&&existing.text===incoming.text}function hasStableBackgroundReplayIdentity(existing,incoming){return existing.correlationId===incoming.correlationId&&existing.subagentSessionId===incoming.subagentSessionId&&existing.parentSessionId===incoming.parentSessionId&&existing.callID===incoming.callID&&existing.jobId===incoming.jobId&&existing.normalizedAgent===incoming.normalizedAgent&&existing.swarmPrefixedAgent===incoming.swarmPrefixedAgent&&existing.planTaskId===incoming.planTaskId&&existing.evidenceTaskId===incoming.evidenceTaskId&&sameReplayPrompt(existing.prompt,incoming.prompt)}function hydrateBackgroundReplayInput(existing,incoming){return{...incoming,workspace:existing.workspace,taskChangeContext:existing.taskChangeContext,worktree:existing.worktree,coderReservationId:existing.coderReservationId,prompt:existing.prompt,generation:existing.generation??1}}function sanitizeDenialText(value){return value.replace(/[\x00-\x1f\x7f]+/g," ")}function isRepairableStageBView(existingView,durableEligibleState){return existingView===void 0||existingView==="rework_required"||compareTaskWorkflowStateRank(durableEligibleState,existingView)>0}function warnStageBSettlementDropped(session,params){let{taskId,agent,reasonClass,drops}=params,restartNote=reasonClass==="unbound"?" The dispatch-generation binding is process-local and was lost — a plugin reload or host restart between dispatch and settlement is the usual cause; no durable binding was found for this dispatch, so it cannot be reconstructed.":"",dedupeToken=`[stageb-settlement-drop:${reasonClass}:${taskId}]`,safeCallID=sanitizeDenialText(params.callID),safeDetail=sanitizeDenialText(params.detail),message=reasonClass==="rejection_persist_failed"?`${dedupeToken} STAGE B SETTLEMENT DROPPED: ${agent} task ${taskId} from call ${safeCallID}: ${safeDetail}. The rejection verdict was not persisted (fail-closed); the task stays at its current state. Remedy: inspect .swarm/ evidence storage for this task and retry the rejection transition (the verdict need not be re-earned).`:`${dedupeToken} STAGE B SETTLEMENT DROPPED: ${agent} task ${taskId} from call ${safeCallID}: ${safeDetail}.${restartNote} The clean verdict was not recorded (fail-closed); the task stays at its current state. Remedy: re-dispatch the ${agent} gate for task ${taskId}.`;pushAdvisory(session,message,{dedupeKey:dedupeToken});let tasks=drops.get(reasonClass)??[];tasks.push(taskId),drops.set(reasonClass,tasks)}function flushStageBSettlementDropWarnings(drops){for(let[reasonClass,taskIds]of drops){if(taskIds.length===0)continue;let listed=taskIds.slice(0,10).join(", "),overflow=taskIds.length>10?` (+${taskIds.length-10} more)`:"";criticalWarn(`[delegation-gate] Stage B settlement dropped for task(s) ${listed}${overflow}: ${STAGE_B_SETTLEMENT_DROP_REASONS[reasonClass]}. See session advisories for per-task remedies.`)}drops.clear()}function createDelegationGateHook(config3,directory,registeredAgents){initDurableStatusPath(directory);let enabled=config3.hooks?.delegation_gate!==!1,delegationMaxChars=config3.hooks?.delegation_max_chars??4000,backgroundSubagentsEnabled=config3.hooks?.background_subagents===!0,backgroundPendingTimeoutMs=(config3.hooks?.background_pending_timeout_minutes??30)*60000,MAX_PENDING_CODER_CHANGE_CONTEXTS=128,coderTaskChangeContextByCallID=new Map,begunCoderSettlementsByCallID=new Map,rememberBegunCoderSettlement=(callID,taskId,transitionId)=>{if(!begunCoderSettlementsByCallID.has(callID)&&begunCoderSettlementsByCallID.size>=MAX_PENDING_CODER_CHANGE_CONTEXTS)throw Error(`BEGUN_SETTLEMENT_CONTEXT_CAPACITY: refusing coder dispatch because ${MAX_PENDING_CODER_CHANGE_CONTEXTS} live begun settlements are already tracked`);begunCoderSettlementsByCallID.set(callID,{taskId,transitionId})},backgroundCoderReservationByCallID=new Map,coderObservedFilesByCallID=new Map,stageBDispatchGenerationsByCallID=new Map,gateDispatchPrimaryTaskByCallID=new Map,stageBDispatchContextByCallID=new Map,reviewRouteByTaskKey=new Map,stageBRouteSlotByCallID=new Map,reviewRouteTaskKey=(sessionId,taskId)=>`${sessionId}\x00${taskId}`,MAX_REVIEW_ROUTE_RECORDS=128,rememberReviewRoute=(key2,route)=>{reviewRouteByTaskKey.delete(key2),reviewRouteByTaskKey.set(key2,route);while(reviewRouteByTaskKey.size>MAX_REVIEW_ROUTE_RECORDS){let oldest=reviewRouteByTaskKey.keys().next().value;if(!oldest)break;reviewRouteByTaskKey.delete(oldest)}},clearReviewRouteStateForSession=(sessionId)=>{let prefix=`${sessionId}\x00`;for(let key2 of reviewRouteByTaskKey.keys())if(key2.startsWith(prefix))reviewRouteByTaskKey.delete(key2)},bindReviewRouteSlots=(callID,sessionId,role,taskIds)=>{let bindings=new Map,session=swarmState.agentSessions.get(sessionId);for(let taskId of taskIds){let route=reviewRouteByTaskKey.get(reviewRouteTaskKey(sessionId,taskId));if(!route||route.kind!=="review_route_receipt")continue;let identities=role==="reviewer"?route.identities.reviewers:route.identities.testEngineers,slots=role==="reviewer"?route.slots?.reviewers??identities:route.slots?.testEngineers??identities;if(slots.length===0||identities.length!==slots.length)continue;let prior=stageBRouteSlotByCallID.get(callID)?.get(taskId),settled=session?getStageBRouteEvidence(session,taskId).find((entry)=>entry.role===role&&entry.sessionId===sessionId&&entry.taskId===taskId&&entry.callId===callID&&entry.generation===stageBDispatchGenerationsByCallID.get(callID)?.get(taskId)):void 0,existing=prior??settled,occupiedSlots=new Set;for(let entry of session?getStageBRouteEvidence(session,taskId):[])if(entry.role===role&&entry.slotId)occupiedSlots.add(entry.slotId);for(let[otherCallId,otherBindings]of stageBRouteSlotByCallID){if(otherCallId===callID)continue;let other=otherBindings.get(taskId);if(other?.role===role&&other.sessionId===sessionId&&other.taskId===taskId&&other.slotId)occupiedSlots.add(other.slotId)}let slotIndex=existing?slots.indexOf(existing.slotId??""):slots.findIndex((slotId2)=>!occupiedSlots.has(slotId2));if(slotIndex<0||slotIndex>=slots.length)continue;let slotId=slots[slotIndex];bindings.set(taskId,{role,identity:identities[slotIndex],sessionId,taskId,slotId,callId:callID,...existing?.childSessionId?{childSessionId:existing.childSessionId}:{},generation:stageBDispatchGenerationsByCallID.get(callID)?.get(taskId)})}if(bindings.size>0)stageBRouteSlotByCallID.set(callID,bindings)},publishedScopeBindingsByCallID=new Map,publishScopeBinding=async(callID,bindingDirectory,binding)=>{let published=await persistAndRegisterScopeBinding(bindingDirectory,binding);if(!published.ok)throw Error(`${published.code}: ${published.message}`);let entries=publishedScopeBindingsByCallID.get(callID)??[];entries.push({directory:bindingDirectory,binding}),publishedScopeBindingsByCallID.delete(callID),publishedScopeBindingsByCallID.set(callID,entries);while(publishedScopeBindingsByCallID.size>MAX_PENDING_SCOPE_BINDINGS){let oldest=publishedScopeBindingsByCallID.keys().next().value;if(oldest===void 0)break;let evicted=publishedScopeBindingsByCallID.get(oldest)??[];publishedScopeBindingsByCallID.delete(oldest);for(let entry of evicted)clearScopeBindingFromDisk({directory:entry.directory,binding:entry.binding}),clearExactScopeBinding(entry.binding)}},clearPublishedScopeBindings=(callID)=>{let entries=publishedScopeBindingsByCallID.get(callID)??[];publishedScopeBindingsByCallID.delete(callID);for(let entry of entries)clearScopeBindingFromDisk({directory:entry.directory,binding:entry.binding}),clearExactScopeBinding(entry.binding)},taskMetadata=async(input)=>{let bindRouteChildSession=()=>{let routeBindings=stageBRouteSlotByCallID.get(input.callID);if(!routeBindings)return;for(let binding of routeBindings.values())binding.childSessionId=input.childSessionID},result=await claimScopeBindingForChildDurably({directory,parentSessionId:input.parentSessionID,childSessionId:input.childSessionID,dispatchCallId:input.callID});if(!result.ok){if(result.code==="SCOPE_NOT_DECLARED"){bindRouteChildSession();return}throw Error(`${result.code}: ${result.message}`)}let{previous,claimed}=result.value,entries=publishedScopeBindingsByCallID.get(input.callID)??[];for(let entry of entries)if(entry.directory===directory&&entry.binding.bindingId===previous.bindingId&&entry.binding.generationId===previous.generationId)entry.binding=claimed;let childSession=ensureAgentSession(input.childSessionID,"coder",directory);if(childSession.prmDelegationCallId!==input.callID)childSession.prmDelegationCallId=input.callID,resetPrmSessionState(childSession,input.childSessionID);childSession.currentTaskId=claimed.taskId,childSession.declaredCoderScope=[...claimed.files],bindRouteChildSession()},sessionEnded=(sessionID,includeOwnedChildren=!1)=>{if(!sessionID)return;clearReviewRouteStateForSession(sessionID);let removed=clearScopeBindings((binding)=>binding.ownerSessionId===sessionID||includeOwnedChildren&&binding.parentOwnerSessionId===sessionID);for(let binding of removed)clearScopeBindingFromDisk({directory:binding.workspaceIdentity,binding});if(removed.some((binding)=>binding.ownerSessionId===sessionID&&binding.activation==="active")){let endedSession=swarmState.agentSessions.get(sessionID);if(endedSession)endedSession.currentTaskId=null,endedSession.declaredCoderScope=null}for(let[callID,entries]of publishedScopeBindingsByCallID){let remaining=entries.filter((entry)=>entry.binding.ownerSessionId!==sessionID&&(!includeOwnedChildren||entry.binding.parentOwnerSessionId!==sessionID));if(remaining.length===0)publishedScopeBindingsByCallID.delete(callID);else if(remaining.length!==entries.length)publishedScopeBindingsByCallID.set(callID,remaining)}},clearCoderTaskChangeContext=(callID)=>{coderTaskChangeContextByCallID.delete(callID),coderObservedFilesByCallID.delete(callID)},rememberStageBDispatchGenerations=(callID,sessionID,generations)=>{if(!stageBDispatchGenerationsByCallID.has(callID)&&stageBDispatchGenerationsByCallID.size>=MAX_PENDING_CODER_CHANGE_CONTEXTS)throw Error(`STAGE_B_CONTEXT_CAPACITY: refusing Stage B dispatch because ${MAX_PENDING_CODER_CHANGE_CONTEXTS} live generation bindings are already tracked`);stageBDispatchGenerationsByCallID.set(callID,generations);let durableStart=Date.now(),persisted=_internals84.recordStageBDispatchBindings(directory,{sessionID:sessionID??"",callID,bindings:[...generations.entries()].map(([taskId,generation])=>({taskId,generation}))}),durableElapsed=Date.now()-durableStart;if(!persisted)criticalWarn(`[delegation-gate] Stage B durable binding write FAILED for call ${callID} — restart recovery for this dispatch is unavailable until re-dispatch (non-fatal; in-memory fencing remains active)`);else if(durableElapsed>50)log(`[delegation-gate] Stage B durable binding write for call ${callID}: persisted=true elapsedMs=${durableElapsed}`)},releasePrelaunchBackgroundCoderReservation=async(callID)=>{let reservation=backgroundCoderReservationByCallID.get(callID);if(!reservation)return;if(await _internals84.releaseBackgroundCoderReservationForDispatch(directory,{...reservation,reason:"recovered"})){backgroundCoderReservationByCallID.delete(callID);return}warn(`[delegation-gate] pre-launch background coder reservation ${reservation.reservationId} could not be released; later admission remains fail-closed`)},rememberCoderObservedFiles=(callID,observedFiles)=>{if(!coderObservedFilesByCallID.has(callID)&&coderObservedFilesByCallID.size>=MAX_PENDING_CODER_CHANGE_CONTEXTS){let oldest=coderObservedFilesByCallID.keys().next().value;if(oldest!==void 0)coderObservedFilesByCallID.delete(oldest)}coderObservedFilesByCallID.set(callID,observedFiles)},rememberCoderTaskChangeContext=async(callID,declaredFiles,observationDirectory=directory,workflowGeneration)=>{if(!coderTaskChangeContextByCallID.has(callID)&&coderTaskChangeContextByCallID.size>=MAX_PENDING_CODER_CHANGE_CONTEXTS)throw Error(`BACKGROUND_CODER_CONTEXT_CAPACITY: refusing coder dispatch because ${MAX_PENDING_CODER_CHANGE_CONTEXTS} live change baselines are already tracked`);coderTaskChangeContextByCallID.set(callID,{declaredFiles,baseline:await captureWorkspaceSnapshotAsync(observationDirectory),workflowGeneration})},beginForegroundCoderSettlementIfNeeded=async(input,taskId,background,worktree)=>{if(backgroundSubagentsEnabled&&isBackgroundTrue(background))return;let context=coderTaskChangeContextByCallID.get(input.callID);if(!context||context.workflowGeneration===void 0)throw Error(`CODER_SETTLEMENT_CONTEXT_MISSING: no durable baseline or generation for task ${taskId}`);let baselineDirtyFiles=Array.isArray(context.baseline.changedFiles)?context.baseline.changedFiles:[];if(baselineDirtyFiles.length>0){let sample=baselineDirtyFiles.slice(0,5).join(", ");throw Error(`CODER_SETTLEMENT_CLEAN_BASELINE_REQUIRED: ${String(baselineDirtyFiles.length)} uncommitted/untracked change(s) present at dispatch (${sample}${baselineDirtyFiles.length>5?", …":""}). `+"Commit or stash them before dispatching a coder — exact-task settlement cannot attribute coder mutations from a dirty launch baseline. "+`(.swarm/ plugin runtime state is excluded from this check automatically.) Task ${taskId} was not dispatched and no settlement state was created.`)}await beginCoderSettlement({directory,taskId,transitionId:`coder:${input.callID}`,actor:input.sessionID,expectedGeneration:context.workflowGeneration,context,...worktree?{worktree}:{}}),rememberBegunCoderSettlement(input.callID,taskId,`coder:${input.callID}`)},shouldRememberCoderTaskChangeContext=(_declaredFiles,_background)=>!0,backgroundCompletionClaimed=(record3)=>{let callID=record3.callID;clearPublishedScopeBindings(callID),clearCoderTaskChangeContext(callID),begunCoderSettlementsByCallID.delete(callID),stageBDispatchGenerationsByCallID.delete(callID),deleteStageBDispatchBindings(directory,record3.parentSessionId,callID),stageBRouteSlotByCallID.delete(callID),gateDispatchPrimaryTaskByCallID.delete(callID),stageBDispatchContextByCallID.delete(callID),deleteStoredInputArgs(callID)};if(!enabled)return{messagesTransform:async(_input,_output)=>{},toolBefore:async(input,output)=>{let args2=output.args;if(!isTaskToolId(input.tool)||!args2||typeof args2.subagent_type!=="string"||stripKnownSwarmPrefix(args2.subagent_type)!=="coder")return;let prepared=await prepareCoderScope(directory,input,args2);await publishScopeBinding(input.callID,directory,prepared.binding)},toolAfter:async(input,output)=>{if(isTaskToolId(input.tool)&&outputLooksLikeBackgroundRunning(output))return;clearPublishedScopeBindings(input.callID)},taskMetadata,sessionEnded,backgroundCompletionClaimed,abortDeniedSettlementForCall:async()=>{}};return{toolBefore:async(input,output)=>{if(!input.sessionID)return;let normalized=normalizeToolName(input.tool),preflightArgs=output.args;if(isTaskToolId(input.tool)&&preflightArgs&&typeof preflightArgs.subagent_type==="string"){let exactPreflightAgent=preflightArgs.subagent_type,preflightAgent=stripKnownSwarmPrefix(exactPreflightAgent),registeredMode=registeredAgents?Object.entries(registeredAgents).find(([name])=>name.toLowerCase()===exactPreflightAgent.trim().toLowerCase())?.[1]:void 0,isCriticDispatch=preflightAgent.startsWith("critic"),isRegistryMatchedDispatch=registeredMode!==void 0,isPrimaryDispatch=registeredMode?.mode==="primary";if((isCriticDispatch||isRegistryMatchedDispatch)&&!isPrimaryDispatch){let denialError;if(isCriticDispatch){let legacyCriticModel=config3.agents?.[preflightAgent]?.model??DEFAULT_MODELS[preflightAgent]??DEFAULT_MODELS.default,criticModel=registeredAgents?resolveRuntimeAgentModel(config3,registeredAgents,exactPreflightAgent)??resolveRegisteredAgentModel(config3,exactPreflightAgent)??legacyCriticModel:legacyCriticModel;try{let{checkSingleModelResolution:checkSingleModelResolution2}=await Promise.resolve().then(() => (init_model_preflight(),exports_model_preflight));if(await checkSingleModelResolution2(criticModel,swarmState.opencodeClient)==="unresolved")telemetry.modelUnresolved(preflightAgent,criticModel,"plan-critic dispatch preflight"),denialError=`PLAN_CRITIC_MODEL_UNRESOLVED: the ${sanitizeDenialText(exactPreflightAgent)} agent's effective model "${sanitizeDenialText(criticModel)}" does not resolve against the provider catalog — the critic can never run, so the plan-critic gate cannot produce VERDICT: APPROVED. `+`Fix the effective model configuration for "${sanitizeDenialText(exactPreflightAgent)}" in opencode-swarm.json (including any matching swarm override or inherited critic model), then re-run MODE: CRITIC-GATE.`}catch(error93){if(error93 instanceof Error&&error93.message.startsWith("PLAN_CRITIC_MODEL_UNRESOLVED")){let{invalidateProviderCatalogCache:invalidateProviderCatalogCache2}=await Promise.resolve().then(() => (init_model_preflight(),exports_model_preflight));throw invalidateProviderCatalogCache2(),error93}}}else{let overrideEntry=resolveEffectiveAgentOverride(config3,exactPreflightAgent),finalModel=overrideEntry&&typeof overrideEntry.model==="string"&&overrideEntry.model.trim()===""?"":(registeredAgents?resolveRuntimeAgentModel(config3,registeredAgents,exactPreflightAgent):void 0)??resolveRegisteredAgentModel(config3,exactPreflightAgent);if(finalModel===void 0||finalModel.trim()==="")telemetry.modelUnresolved(preflightAgent,"(no final selection)","swarm-agent dispatch preflight"),denialError=`SWARM_AGENT_MODEL_MISSING_SELECTION: the ${sanitizeDenialText(exactPreflightAgent)} agent is registered but has no final model selection (blank model override or a stale swarm registry entry) — dispatching it cannot succeed. `+"Fix agents.<role>.model in opencode-swarm.json (the matching swarm override wins over the top-level entry) or correct the swarm configuration, then retry.";else try{let{checkSingleModelResolution:checkSingleModelResolution2}=await Promise.resolve().then(() => (init_model_preflight(),exports_model_preflight));if(await checkSingleModelResolution2(finalModel,swarmState.opencodeClient)==="unresolved")telemetry.modelUnresolved(preflightAgent,finalModel,"swarm-agent dispatch preflight"),denialError=`SWARM_AGENT_MODEL_UNRESOLVED: the ${sanitizeDenialText(exactPreflightAgent)} agent's effective model "${sanitizeDenialText(finalModel)}" does not resolve against the provider catalog — dispatching this role will fail permanently ("Model not found"/"Forbidden"). `+"Fix the effective model configuration in opencode-swarm.json (the matching swarm override wins over top-level agents.<role>.model). fallback_models entries only serve transient runtime failures; configure a resolvable primary model for this role."}catch{}}if(denialError!==void 0){let{invalidateProviderCatalogCache:invalidateProviderCatalogCache2}=await Promise.resolve().then(() => (init_model_preflight(),exports_model_preflight));throw invalidateProviderCatalogCache2(),Error(denialError)}}}let completionArgs=output.args;if(completionArgs){let completionPlanContext;try{let plan2=await loadPlanJsonOnly(directory);if(plan2)completionPlanContext=collectPlanTaskIdContextFromPhases(plan2.phases)}catch{}let requestedTaskId=resolveDelegatedPlanTaskId(completionArgs,completionPlanContext?toTaskIdPlanContextOptions(completionPlanContext):void 0);if(requestedTaskId){let{getTaskWorkflowSnapshot:getTaskWorkflowSnapshot3,readTaskEvidence:readTaskEvidence3}=await Promise.resolve().then(() => (init_gate_evidence(),exports_gate_evidence)),recoveredCoder=await recoverCoderSettlement(directory,requestedTaskId);if(recoveredCoder){let recoveredSession=ensureAgentSession(input.sessionID,void 0,directory),workflow=getTaskWorkflowSnapshot3(recoveredCoder.evidence);recoveredSession.taskWorkflowStates.set(requestedTaskId,workflow.state),recoveredSession.stageBCompletion?.delete(requestedTaskId),updateTaskWorkflowCache(recoveredSession,requestedTaskId,workflow)}let recoveredTerminal=await recoverPreparedTaskTerminal(directory,requestedTaskId,input.sessionID);if(recoveredTerminal){let recoveredSession=ensureAgentSession(input.sessionID,void 0,directory),workflow=getTaskWorkflowSnapshot3(recoveredTerminal.evidence);recoveredSession.taskWorkflowStates.set(requestedTaskId,workflow.state),recoveredSession.stageBCompletion?.delete(requestedTaskId),recoveredSession.taskCouncilApproved?.delete(requestedTaskId),recoveredSession.taskCouncilWorkflowGeneration?.delete(requestedTaskId),updateTaskWorkflowCache(recoveredSession,requestedTaskId,workflow)}let recoveredRepair=null;try{recoveredRepair=await recoverPreparedTaskRepair(directory,requestedTaskId,input.sessionID)}catch(error93){criticalWarn(`[delegation-gate] task-repair recovery deferred for ${requestedTaskId}: ${error93 instanceof Error?error93.message:String(error93)}`)}if(recoveredRepair){let recoveredSession=ensureAgentSession(input.sessionID,void 0,directory),workflow=getTaskWorkflowSnapshot3(await readTaskEvidence3(directory,requestedTaskId));recoveredSession.taskWorkflowStates.set(requestedTaskId,workflow.state),recoveredSession.stageBCompletion?.delete(requestedTaskId),recoveredSession.taskCouncilApproved?.delete(requestedTaskId),recoveredSession.taskCouncilWorkflowGeneration?.delete(requestedTaskId),updateTaskWorkflowCache(recoveredSession,requestedTaskId,workflow)}}let taskAwaitingCompletion=await findTaskAwaitingCompletion(directory,requestedTaskId);if(taskAwaitingCompletion){if(!canRunWhileTaskAwaitsCompletion({directory,normalizedTool:normalized,args:completionArgs,awaitingTaskId:taskAwaitingCompletion,requestedTaskId}))throw Error(completionGateViolationMessage(taskAwaitingCompletion))}}if(!isTaskToolId(input.tool))return;let args2=output.args;if(!args2)return;let subagentType=args2.subagent_type;if(typeof subagentType!=="string")return;let targetAgent=stripKnownSwarmPrefix(subagentType);if(!backgroundSubagentsEnabled&&isBackgroundTrue(args2.background)&&isKnownCanonicalRole(targetAgent))throw Error(SWARM_BACKGROUND_TASK_BLOCKED_MESSAGE);if(targetAgent==="reviewer"||targetAgent==="test_engineer"){let routedTaskId=null,routeDispatchStarted=!1;try{let reviewSession=swarmState.agentSessions.get(input.sessionID);if(reviewSession){let activePrReviewBinding=await readPrReviewReentryBindingContext(directory,input.sessionID),reviewTaskId=await resolveEvidenceTaskId(args2,reviewSession,directory,activePrReviewBinding?{allowSessionFallback:!1}:void 0),changedFiles=reviewTaskId?getModifiedFilesForTask(reviewSession,reviewTaskId):[],routeTaskId=reviewTaskId??`unresolved-${input.callID}`;routedTaskId=routeTaskId,markStageBRouteRequired(reviewSession,routeTaskId);let pendingRoute=buildReviewRoutePending({sessionId:input.sessionID,taskId:routeTaskId});if(await persistReviewRouteReceipt({projectRoot:directory,receipt:pendingRoute}),routeDispatchStarted=!0,rememberReviewRoute(reviewRouteTaskKey(input.sessionID,routeTaskId),pendingRoute),changedFiles.length===0){let routerError=buildReviewRouteRouterError({code:"NO_CHANGED_FILES",sessionId:input.sessionID,taskId:routeTaskId});await persistReviewRouteReceipt({projectRoot:directory,receipt:routerError}),rememberReviewRoute(reviewRouteTaskKey(input.sessionID,routeTaskId),routerError)}else{let routing=await routeReviewForChanges(directory,changedFiles),routeReceipt=buildReviewRouteReceipt({sessionId:input.sessionID,taskId:routeTaskId,complexity:routing.depth,semanticRisk:routing.reason,requiredReviewers:Array.from({length:routing.reviewerCount},(_,index)=>`${routeTaskId}:reviewer:${index+1}`),requiredTestEngineers:Array.from({length:routing.testEngineerCount},(_,index)=>`${routeTaskId}:test_engineer:${index+1}`)});if(await persistReviewRouteReceipt({projectRoot:directory,receipt:routeReceipt}),rememberReviewRoute(reviewRouteTaskKey(input.sessionID,routeTaskId),routeReceipt),shouldParallelizeReview(routing))pushAdvisory(reviewSession,`REVIEW ROUTING: High complexity detected (${routing.reason}). Consider parallel review: ${routing.reviewerCount} reviewers, ${routing.testEngineerCount} test engineers recommended.`)}}}catch(error93){let detail=error93 instanceof Error?error93.message:String(error93);if(!routeDispatchStarted){warn(`[delegation-gate] review route dispatch could not establish its pending receipt: ${detail}`);return}let routerError=buildReviewRouteRouterError({code:/unavailable|timed out|timeout|not found/i.test(detail)?"ROUTER_UNAVAILABLE":"ROUTER_FAILED",sessionId:input.sessionID,taskId:routedTaskId??`unresolved-${input.callID}`,detail});try{if(await persistReviewRouteReceipt({projectRoot:directory,receipt:routerError}),routedTaskId)rememberReviewRoute(reviewRouteTaskKey(input.sessionID,routedTaskId),routerError)}catch(persistError){warn(`[delegation-gate] review route receipt was not recorded: ${detail}; router-error persistence failed: ${persistError instanceof Error?persistError.message:String(persistError)}`)}}}if(targetAgent==="coder"||targetAgent==="reviewer"){let acceptancePromptText=ACCEPTANCE_ARGS_FIELDS.map((field)=>args2[field]).filter((value)=>typeof value==="string").join(`
|
|
1262
|
+
`).toLowerCase();if(!text)return!1;return PLAN_CRITIC_TASK_SIGNALS.some((signal)=>text.includes(signal))}async function isPlanCriticApproved(directory){try{let plan=await loadPlanJsonOnly(directory);if(!plan)return!1;let planId=derivePlanId(plan),approved=await loadLastPlanCriticApprovedSnapshot(directory,planId);if(!approved)return!1;if(approved.approval?.verdict!=="APPROVED"||approved.approval?.source!=="plan_critic_gate")return!1;if(approved.payloadHash!==computePlanStructureHash(plan))return!1;return!0}catch{return!1}}async function assertPlanCriticApprovedForExecution(directory,plan){if(!plan)return;let planId=derivePlanId(plan),approved=await loadLastPlanCriticApprovedSnapshot(directory,planId);if(!approved)throw Error("PLAN_CRITIC_GATE_VIOLATION: Cannot delegate to coder before plan critic approval. Delegate to critic in MODE: CRITIC-GATE and require VERDICT: APPROVED before EXECUTE. If the critic already returned APPROVED but the snapshot was not recorded "+"(format/signal mismatch — issue #2012), call approve_plan_critic with a reason, "+"or run /swarm approve-plan-critic <reason>, to record a manual approval.");if(approved.approval?.verdict!=="APPROVED"||approved.approval?.source!=="plan_critic_gate")throw Error("PLAN_CRITIC_GATE_VIOLATION: Latest approved-plan snapshot does not contain plan critic VERDICT: APPROVED evidence. Re-run MODE: CRITIC-GATE and wait for explicit approval before coder execution. If the critic already returned APPROVED but the snapshot was not recorded (issue #2012), call approve_plan_critic or run /swarm approve-plan-critic.");if(approved.payloadHash!==computePlanStructureHash(plan))throw Error("PLAN_CRITIC_GATE_VIOLATION: Current plan differs from the last critic-approved snapshot. Re-run MODE: CRITIC-GATE after plan changes before delegating to coder. If re-review is not possible, call approve_plan_critic or run /swarm approve-plan-critic to record a fresh manual approval for the current plan.")}function resolvePlanCriticPolicyForExecution(directory,plan,sessionOverrides={}){try{let profile=getProfileForIdentity(directory,{swarm:plan.swarm,title:plan.title});if(!profile)return{required:DEFAULT_QA_GATES.critic_pre_plan,source:"default_missing_profile"};return{required:getEffectiveGates(profile,sessionOverrides).critic_pre_plan,source:sessionOverrides.critic_pre_plan===!0&&profile.gates.critic_pre_plan===!1?"session_ratchet":"persisted_profile"}}catch(error93){return warn(`[delegation-gate] failed to resolve critic_pre_plan profile; enforcing the gate: ${error93 instanceof Error?error93.message:String(error93)}`),{required:!0,source:"corrupt_profile_conservative"}}}async function recordPlanCriticApprovalSnapshotIfApplicable(directory,input,args2,output){if((typeof args2.subagent_type==="string"?stripKnownSwarmPrefix(args2.subagent_type):null)!=="critic")return;if(!taskLooksLikePlanCritic(args2))return;if(extractPlanCriticVerdict(output)!=="APPROVED")return;let plan=await loadPlanJsonOnly(directory);if(!plan)for(let attempt=0;attempt<2&&!plan;attempt++)await new Promise((resolve50)=>setTimeout(resolve50,150)),plan=await loadPlanJsonOnly(directory);if(!plan){warn("[delegation-gate] plan critic APPROVED verdict could not be recorded: plan.json not readable after retry. The critic_pre_plan gate will block coder delegation until a snapshot exists. Call approve_plan_critic (or /swarm approve-plan-critic) with a reason to record a manual approval if the critic genuinely approved.");return}await takeSnapshotEvent(directory,plan,{source:"critic_approved",approvalMetadata:{verdict:"APPROVED",source:"plan_critic_gate",session_id:input.sessionID,call_id:input.callID,approved_at:new Date().toISOString()},payloadHashOverride:computePlanStructureHash(plan)})}async function forceRecordPlanCriticApproval(directory,sessionID,options={}){let session=ensureAgentSession(sessionID,void 0,directory);if(!session||!session.agentName||stripKnownSwarmPrefix(session.agentName)!=="architect")throw Error("NOT_AUTHORIZED: approve_plan_critic requires an active architect session. The plan-critic gate escape hatch is an architect-only escalation; a coder/reviewer cannot self-unblock. Run /swarm approve-plan-critic from an architect context, or ask the user to run it.");let plan=await loadPlanJsonOnly(directory);if(!plan){let planPath=path97.join(directory,".swarm","plan.json");if(fs60.existsSync(planPath))throw Error("PLAN_CORRUPT: .swarm/plan.json exists but could not be parsed (corrupt or schema-invalid). Repair or re-save the plan before recording a plan-critic approval.");throw Error("PLAN_NOT_FOUND: no .swarm/plan.json — cannot record a plan-critic "+"approval for a non-existent plan. Save a plan first.")}let planId=derivePlanId(plan),recordedAt=new Date().toISOString(),sanitizedReason=typeof options.reason==="string"&&options.reason.trim().length>0?options.reason.trim().slice(0,500):void 0,userConfirmed=options.userConfirmed===!0;await takeSnapshotEvent(directory,plan,{source:"critic_approved",approvalMetadata:{verdict:"APPROVED",source:"plan_critic_gate",method:"manual_override",reason:sanitizedReason,user_confirmed:userConfirmed,session_id:sessionID,approved_at:recordedAt},payloadHashOverride:computePlanStructureHash(plan)});try{appendCoreEventSync(directory,{type:"plan_critic_gate_manual_approval",timestamp:recordedAt,sessionID,plan_id:planId,user_confirmed:userConfirmed,...sanitizedReason?{reason:sanitizedReason}:{}})}catch(err){warn(`[delegation-gate] plan_critic_gate_manual_approval audit event write failed: ${err instanceof Error?err.message:String(err)}`)}return{planId,recordedAt,...sanitizedReason?{reason:sanitizedReason}:{},userConfirmed}}async function forceRecordRetrySoundingBoardApproval(directory,sessionID,options){let session=ensureAgentSession(sessionID,void 0,directory);if(!session||!session.agentName||stripKnownSwarmPrefix(session.agentName)!=="architect")throw Error("APPROVE_RETRY_SOUNDING_BOARD_ARCHITECT_REQUIRED: approve_retry_sounding_board requires an active architect session. The coder retry circuit-breaker escape hatch is architect-only; a coder/reviewer cannot self-unblock.");let taskId=typeof options.taskId==="string"?options.taskId.trim():"";if(!taskId)throw Error('APPROVE_RETRY_UNKNOWN_TASK: approve_retry_sounding_board requires the exact plan task id (e.g. "2.1").');let plan=await loadPlanJsonOnly(directory);if(!plan){let planPath=path97.join(directory,".swarm","plan.json");if(fs60.existsSync(planPath))throw Error("PLAN_CORRUPT: .swarm/plan.json exists but could not be parsed (corrupt or schema-invalid). Repair or re-save the plan before recording a retry sounding-board approval.");throw Error("PLAN_NOT_FOUND: no .swarm/plan.json — cannot record a retry "+"sounding-board approval without a plan. Save a plan first.")}if(!new Set(plan.phases.flatMap((phase)=>phase.tasks.map((task)=>task.id))).has(taskId))throw Error(`APPROVE_RETRY_UNKNOWN_TASK: task ${taskId} is not in the current plan. Refusing to record evidence for a foreign task id.`);let{getTaskWorkflowSnapshot:getTaskWorkflowSnapshot2,readTaskEvidence:readTaskEvidence2,recordGateEvidence:recordGateEvidence2}=await Promise.resolve().then(() => (init_gate_evidence(),exports_gate_evidence)),evidence=await readTaskEvidence2(directory,taskId),workflow=getTaskWorkflowSnapshot2(evidence);if(!evidence||!workflow.authoritative)throw Error(`APPROVE_RETRY_NO_WORKFLOW: no durable task workflow evidence exists for task ${taskId} — there is no retry state to recover.`);let prior;try{prior=readCoderRetryEscalations(directory,taskId,workflow.retryEpoch)}catch(error93){if(error93 instanceof Error&&error93.message==="CORE_EVENT_AUTHORITY_INDEX_UNREADABLE")throw Error("APPROVE_RETRY_AUDIT_INDEX_UNREADABLE: the retry audit authority index is unreadable, so the prior sounding_board_consultation cannot be verified. Repair the events store (see /swarm doctor) and retry.");throw error93}if(!prior.has("sounding_board_consultation"))throw Error(`APPROVE_RETRY_CONSULTATION_REQUIRED: task ${taskId} has no durable sounding_board_consultation escalation for retry epoch ${workflow.retryEpoch}. `+"Dispatch critic_sounding_board first — this tool records an obtained APPROVED verdict, it cannot substitute for the consultation.");let sanitizedReason=typeof options.reason==="string"&&options.reason.trim().length>0?options.reason.trim().slice(0,500):void 0,recordedAt=new Date().toISOString(),transitionId=`retry-sb-manual:${sessionID}:epoch${workflow.retryEpoch}`;await recordGateEvidence2(directory,taskId,"critic_sounding_board",sessionID,!1,{transitionId,expectedGeneration:workflow.generation});let auditEventRecorded=!0;try{appendCoreEventSync(directory,{type:"coder_retry_circuit_breaker",timestamp:recordedAt,taskId,generation:workflow.generation,retryEpoch:workflow.retryEpoch,rejectionCount:workflow.retryCount,rejectionHistory:[...workflow.retryHistory],phase:Number(taskId.split(".")[0])||0,action:"sounding_board_manual_approval",...sanitizedReason?{reason:sanitizedReason}:{}},{dedupeOnAuthorityKey:!0})}catch(err){auditEventRecorded=!1,warn(`[delegation-gate] sounding_board_manual_approval audit event write failed: ${err instanceof Error?err.message:String(err)}`)}return{taskId,generation:workflow.generation,retryEpoch:workflow.retryEpoch,recordedAt,auditEventRecorded}}function isTaskCompletedForParallelGuidance(task){let status=task.status??"pending";return status==="completed"||status==="closed"}function getPlanTaskDeclaredFiles(plan,taskId){if(!plan||!taskId)return null;for(let phase of plan.phases){let task=phase.tasks.find((candidate)=>candidate.id===taskId);if(task)return[...task.files_touched]}return null}async function hasExplicitEmptyPlanScope(directory,taskId){let planPath=path97.join(directory,".swarm","plan.json"),handle;try{handle=await fs60.promises.open(planPath,"r");let stat9=await handle.stat();if(!stat9.isFile()||stat9.size>MAX_RAW_PLAN_SCOPE_INSPECTION_BYTES)return!1;let bytes=Buffer.alloc(stat9.size),offset=0;while(offset<bytes.length){let result=await handle.read(bytes,offset,bytes.length-offset,offset);if(result.bytesRead===0)return!1;offset+=result.bytesRead}let parsed=JSON.parse(bytes.toString("utf8"));if(!Array.isArray(parsed.phases))return!1;for(let phase of parsed.phases){if(!phase||typeof phase!=="object")continue;let tasks=phase.tasks;if(!Array.isArray(tasks))continue;for(let task of tasks){if(!task||typeof task!=="object")continue;let record3=task;if(record3.id===taskId&&Object.hasOwn(record3,"files_touched")&&Array.isArray(record3.files_touched)&&record3.files_touched.length===0)return!0}}}catch{return!1}finally{await handle?.close().catch(()=>{return})}return!1}async function settleRejectedEmptyPlanScope(directory,input,taskId,expectedGeneration){let baseline=await captureWorkspaceSnapshotAsync(directory);if(baseline.gitHead===null||!Array.isArray(baseline.changedFiles)||baseline.changedFiles.length!==0)return null;let transitionId=`coder-preflight:${input.callID}`;try{await beginCoderSettlement({directory,taskId,transitionId,actor:input.sessionID,expectedGeneration,context:{baseline,declaredFiles:[],workflowGeneration:expectedGeneration}});let observedFiles=await changedFilesSinceSnapshotAsync(directory,baseline);if(observedFiles===null)throw Error("CODER_SETTLEMENT_BASELINE_UNAVAILABLE: empty-scope preflight could not prove a clean post-baseline workspace.");return await settleCoderDispatch({directory,taskId,transitionId,accepted:!1,testEngineerExempt:!1,observedFiles})}catch(error93){try{await abortCoderSettlement({directory,taskId,transitionId,reason:`empty-scope preflight settlement failed: ${error93 instanceof Error?error93.message:String(error93)}`})}catch(abortError){criticalWarn(`[delegation-gate] failed to abort empty-scope preflight settlement for ${taskId}: ${abortError instanceof Error?abortError.message:String(abortError)}`)}throw error93}}function describeCoderScopeFailure(args2,planTaskIdContext){if(planTaskIdContext.status==="over_limit")return`loaded plan task context exceeds the shared bounded limit (${TASK_ID_RESOLUTION_LIMITS.maxKnownIds} task ids); task-id resolution fails closed instead of guessing. Provide an explicit structured scope declaration or narrow the plan context before delegating.`;let resolution=resolveTaskId(args2,{policy:"plan",...toTaskIdPlanContextOptions(planTaskIdContext)}),knownPlanTaskIds=planTaskIdContext.status==="available"?planTaskIdContext.taskIds:void 0,knownSummary=knownPlanTaskIds?[...knownPlanTaskIds].sort().join(", ")||"(none)":"(none)",rawTaskId=args2.task_id??args2.taskId,explicitFieldShape=typeof rawTaskId==="string"&&rawTaskId.trim().length>0?`"${rawTaskId.trim().slice(0,40)}" (non-plan-shaped; treated as runtime session id and ignored — falling through to text extraction)`:"absent",candidateTextFields=[args2.prompt,args2.description,args2.task,args2.input],taskLineCandidates=new Set,taskLineDetected=!1;for(let field of candidateTextFields){if(typeof field!=="string")continue;let taskLine=extractTaskLine(field);if(!taskLine)continue;taskLineDetected=!0;for(let m of taskLine.matchAll(/\b(\d+\.\d+(?:\.\d+)*)\b/g))if(knownPlanTaskIds?.has(m[1]))taskLineCandidates.add(m[1])}let textCandidates=new Set;for(let field of candidateTextFields){if(typeof field!=="string")continue;for(let m of field.matchAll(/\b(\d+\.\d+(?:\.\d+)*)\b/g))if(knownPlanTaskIds?.has(m[1]))textCandidates.add(m[1])}if(resolution.status==="invalid"&&typeof rawTaskId==="string"&&isStrictTaskId(rawTaskId.trim()))return`explicit task_id "${rawTaskId.trim().slice(0,40)}" is plan-shaped but does not resolve safely against the loaded plan, so resolution fails closed before prompt fallback. Known plan task ids: ${knownSummary}.`;if(resolution.status==="over_limit")return`task-id resolution exceeded a bounded input limit (${resolution.input}); provide exactly one concise TASK: <N.M> line or a valid explicit plan task_id. Known plan task ids: ${knownSummary}.`;if(taskLineCandidates.size>1)return`multiple candidate task ids found in TASK: line: [${[...taskLineCandidates].sort().join(", ")}]; provide exactly one unambiguous TASK: <id> line. Known plan task ids: ${knownSummary}.`;if(textCandidates.size>1)return`multiple candidate task ids found in prompt text: [${[...textCandidates].sort().join(", ")}]; provide exactly one unambiguous TASK: <id> line. Known plan task ids: ${knownSummary}.`;return`no plan task id could be resolved. Include a TASK: <N.M> line or plan-task-shaped task_id arg. Explicit task_id field: ${explicitFieldShape}. TASK: line detected: ${taskLineDetected?"yes":"no"}. Known plan task ids: ${knownSummary}.`}function stripSingleTrailingAnnotationSuffix(value){let suffixMatch=value.match(/(?:\s+\([^()]*\))+$/);if(!suffixMatch)return value;let suffix=suffixMatch[0];if((suffix.match(/\([^()]*\)/g)??[]).length!==1)return null;return value.slice(0,-suffix.length).trimEnd()||null}function normalizeFileDirectiveValue(rawValue){let value=rawValue.trim();if(!value)return null;let quote=value[0];if(quote==='"'||quote==="'"){let closingQuoteIndex=value.indexOf(quote,1);if(closingQuoteIndex===-1)return null;let filePath=value.slice(1,closingQuoteIndex);if(!filePath)return null;let suffix=value.slice(closingQuoteIndex+1);if(suffix.length>0&&!/^\s+\([^()]*\)\s*$/.test(suffix))return null;return filePath}let normalized=stripSingleTrailingAnnotationSuffix(value);if(!normalized||/[,;|]/.test(normalized))return null;return normalized}function extractTaskFileDirectives(args2,mode){let files=new Set,present=!1;for(let field of[args2.prompt,args2.description,args2.task,args2.input]){if(typeof field!=="string")continue;for(let line of field.split(/\r?\n/)){if(!/^\s*FILE\s*:/i.test(line))continue;present=!0;let value=normalizeFileDirectiveValue(line.replace(/^\s*FILE\s*:\s*/i,""));if(!value){if(mode==="observe")continue;return{present:!0,files:null}}files.add(value)}}return{present,files:present&&files.size>0?[...files]:null}}function parsePerTaskVerdicts(outputText2){let verdicts=new Map,errors5=[],reviewedPattern=/^\[REVIEWED\]\s*\|\s*(?:task-)?(\d+\.\d+(?:\.\d+)*)\s*\|\s*(APPROVED|REJECTED|CONCERNS)\s*\|?/im,testedPattern=/^\[TESTED\]\s*\|\s*(?:task-)?(\d+\.\d+(?:\.\d+)*)\s*\|\s*(PASS|FAIL|SKIPPED)\s*\|?/im;for(let line of outputText2.split(/\r?\n/)){let trimmed=line.trim(),match=reviewedPattern.exec(trimmed);if(match){let taskId=match[1],verdict=match[2];if(isStrictTaskId(taskId)){let existing=verdicts.get(taskId);if(existing){if(existing.verdict!==verdict||existing.kind!=="REVIEWED")errors5.push(`STAGE_B_VERDICT_CONFLICT: task ${taskId} has conflicting verdicts: ${existing.kind}/${existing.verdict} vs REVIEWED/${verdict}`)}else verdicts.set(taskId,{verdict,kind:"REVIEWED"})}continue}if(match=testedPattern.exec(trimmed),match){let taskId=match[1],verdict=match[2];if(isStrictTaskId(taskId)){let existing=verdicts.get(taskId);if(existing){if(existing.verdict!==verdict||existing.kind!=="TESTED")errors5.push(`STAGE_B_VERDICT_CONFLICT: task ${taskId} has conflicting verdicts: ${existing.kind}/${existing.verdict} vs TESTED/${verdict}`)}else verdicts.set(taskId,{verdict,kind:"TESTED"})}}}return{verdicts,errors:errors5}}async function findTaskAwaitingCompletion(directory,requestedTaskId){if(!directory)return null;let plan=null;try{plan=await loadPlanJsonOnly(directory)}catch{return null}if(!plan)return null;let{getTaskWorkflowSnapshot:getTaskWorkflowSnapshot2,readTaskEvidence:readTaskEvidence2}=await Promise.resolve().then(() => (init_gate_evidence(),exports_gate_evidence)),tasks=plan.phases.flatMap((phase)=>phase.tasks),orderedTasks=requestedTaskId?[...tasks.filter((task)=>task.id===requestedTaskId),...tasks.filter((task)=>task.id!==requestedTaskId)]:tasks;for(let task of orderedTasks){let taskId=task.id,evidence=await readTaskEvidence2(directory,taskId),workflow=getTaskWorkflowSnapshot2(evidence),councilEvidence=evidence?.gates.council,awaitsQaCompletion=workflow.authoritative&&workflow.state==="tests_run",awaitsCouncilCompletion=workflow.authoritative&&workflow.state==="pre_check_passed"&&councilEvidence?.verdict==="APPROVE";if(!awaitsQaCompletion&&!awaitsCouncilCompletion)continue;let planStatus=task.status??"pending";if(planStatus==="completed"||planStatus==="closed"||planStatus==="blocked")continue;return taskId}return null}function completionGateViolationMessage(taskAwaitingCompletion){return`TASK_COMPLETION_GATE_VIOLATION: Task ${taskAwaitingCompletion} reached tests_run but is not marked completed in plan.json/plan.md. Call update_task_status with task_id="${taskAwaitingCompletion}" and status="completed". Read-only inspection remains available; a proven-disjoint task may continue; if plan.json is ledger-stale, retry save_plan with reconcile_ledger_projection=true and otherwise-unchanged plan content.`}function readCoderRetryEscalations(directory,taskId,retryEpoch){return getCoderRetryEscalationActions(directory,taskId,retryEpoch)}async function emitCoderRetryEscalation(directory,input){try{appendCoreEventSync(directory,{type:"coder_retry_circuit_breaker",timestamp:new Date().toISOString(),taskId:input.taskId,generation:input.generation,retryEpoch:input.retryEpoch,rejectionCount:input.rejectionCount,rejectionHistory:input.rejectionHistory,phase:Number(input.taskId.split(".")[0])||0,action:input.action},{dedupeOnAuthorityKey:!0})}catch(error93){if(error93 instanceof Error&&error93.message===CORE_EVENT_LOCKED)throw Error("TASK_RETRY_AUDIT_LOCKED");throw error93}}async function enforceCoderRetryEscalation(input){if(input.retryCount<3)return;let prior;try{prior=readCoderRetryEscalations(input.directory,input.taskId,input.retryEpoch)}catch(error93){if(error93 instanceof Error&&error93.message==="CORE_EVENT_AUTHORITY_INDEX_UNREADABLE")throw Error("TASK_RETRY_AUDIT_INDEX_UNREADABLE");throw error93}if(!prior.has("sounding_board_consultation"))throw await emitCoderRetryEscalation(input.directory,{...input,rejectionCount:input.retryCount,rejectionHistory:input.retryHistory,action:"sounding_board_consultation"}),Error(`TASK_RETRY_CRITIC_REQUIRED: task ${input.taskId} reached the bounded retry threshold. Dispatch critic_sounding_board for this exact task before another coder attempt.`);if(prior.has("simplification"))throw await emitCoderRetryEscalation(input.directory,{...input,rejectionCount:input.retryCount,rejectionHistory:input.retryHistory,action:"user_escalation"}),Error(`TASK_RETRY_USER_ESCALATION_REQUIRED: task ${input.taskId} failed its critic-guided simplified retry. Stop and ask the user to change scope, authorize repair, or choose a different approach.`);if(!input.criticSatisfied)throw Error(`TASK_RETRY_CRITIC_REQUIRED: task ${input.taskId} is waiting for an exact-generation critic_sounding_board APPROVED verdict.`);await emitCoderRetryEscalation(input.directory,{...input,rejectionCount:input.retryCount,rejectionHistory:input.retryHistory,action:"simplification"})}function isExplicitTaskEvidenceAgent(targetAgent){return EXPLICIT_TASK_EVIDENCE_AGENTS.has(stripKnownSwarmPrefix(targetAgent))}function evidenceTaskResolutionOptions(targetAgent,allowSessionFallback){if(isExplicitTaskEvidenceAgent(targetAgent))return{policy:"attribution",allowSessionFallback:!1};if(allowSessionFallback===!1)return{allowSessionFallback:!1};return}function canRunWhileTaskAwaitsCompletion(input){let normalizedTool=input.normalizedTool.toLowerCase();if(isReadOnlyTool(normalizedTool))return!0;if(COMPLETION_RECOVERY_TOOLS.has(normalizedTool))return!0;if(normalizedTool==="spec_write"&&input.directory&&fs60.existsSync(path97.join(input.directory,".swarm","spec-staleness.json")))return!0;if(normalizedTool==="save_plan"&&input.args.reconcile_ledger_projection===!0)return!0;if(normalizedTool==="update_task_status"&&input.requestedTaskId===input.awaitingTaskId)return!0;if(input.directory&&input.requestedTaskId&&input.requestedTaskId!==input.awaitingTaskId)try{if(isProvablyDisjoint(input.directory,[input.awaitingTaskId,input.requestedTaskId]))return!0}catch{return!1}return!1}async function buildParallelExecutionGuidance(directory,sessionID,session){if(!directory)return null;let plan=await loadPlanJsonOnly(directory);if(!plan)return null;let profile=plan.execution_profile,enabled=profile?.parallelization_enabled===!0,maxConcurrent=profile?.max_concurrent_tasks??10,effectiveMaxConcurrent=session?.maxConcurrencyOverride??maxConcurrent,allTasks=plan.phases.flatMap((phase)=>phase.tasks),blockedTasks=allTasks.filter((task)=>{if(task.status!=="blocked")return!1;let reason=(task.blocked_reason??"").toLowerCase();return reason.includes("fail")||reason.includes("error")||reason.includes("exception")}),totalTasks=allTasks.length,backoffTriggered=!1;if(totalTasks>0&&blockedTasks.length>0){let failureRate=blockedTasks.length/totalTasks,FAILURE_RATE_THRESHOLD=0.2,BACKOFF_MULTIPLIER=0.5;if(failureRate>0.2&&blockedTasks.length>=2){let newConcurrency=Math.max(1,Math.floor(effectiveMaxConcurrent*0.5));if(newConcurrency<effectiveMaxConcurrent)effectiveMaxConcurrent=newConcurrency,session.maxConcurrencyOverride=newConcurrency,backoffTriggered=!0}}if(!enabled||effectiveMaxConcurrent<=1)return null;if(hasActiveLeanTurbo(sessionID))return"[NEXT] Lean Turbo is active; use lean_turbo_run_phase and Lean Turbo lane guidance instead of standard execution-profile slot filling.";let currentPhaseId=resolveActivePhaseId(plan),currentPhase=plan.phases.find((phase)=>phase.id===currentPhaseId);if(!currentPhase)return null;let tasks=currentPhase.tasks;if(tasks.length===0)return null;let pendingTaskIds=collectPendingTaskIdsForActivePhase(plan),fallbackReason=null;if(pendingTaskIds.length<2)fallbackReason="fewer than two pending tasks in the active phase — nothing to parallelize";else try{let verdict=computeParallelVerdict(directory,pendingTaskIds,{plan});if(verdict.verdict==="all_disjoint");else if(verdict.verdict==="unknown_scopes"){let shown=verdict.unknownScopeTasks.slice(0,6).join(", "),more=verdict.unknownScopeTasks.length>6?` (and ${verdict.unknownScopeTasks.length-6} more)`:"";fallbackReason=`no live declared scope for task${verdict.unknownScopeTasks.length===1?"":"s"}: ${shown}${more} — call declare_scope for each pending task, then retry`}else{let conflictPair=verdict.pairs.find((pair)=>pair.verdict==="conflict"),evidence=(conflictPair?.evidence??[]).slice(0,3).join("; ");fallbackReason=`declared scopes overlap: tasks ${conflictPair?.a??"?"} and ${conflictPair?.b??"?"} conflict (${evidence||"shared paths"})`}}catch{fallbackReason="verdict computation failed (fail-safe serial per v8 contract)"}if(fallbackReason!==null)return`[PARALLEL EXECUTION PROFILE] parallelization_enabled=true max_concurrent_tasks=${effectiveMaxConcurrent}; SERIAL fallback active (v8 automatic safety) — exact reason: ${fallbackReason}. Run plan_conflict_check on the pending tasks to inspect the conflict matrix and a suggested serialization order, or proceed serially (one coder at a time).`;let completed=new Set;for(let task of allTasks){let taskId=task.id;if(isTaskCompletedForParallelGuidance(task))completed.add(taskId);if(getTaskState(session,taskId)==="complete")completed.add(taskId)}let occupied=new Set;for(let task of allTasks){let taskId=task.id;if(task.status==="in_progress")occupied.add(taskId);let state2=getTaskState(session,taskId);if(ACTIVE_PARALLEL_TASK_STATES.has(state2))occupied.add(taskId)}let availableSlots=Math.max(0,effectiveMaxConcurrent-occupied.size);if(availableSlots<=0)return`[PARALLEL EXECUTION PROFILE] parallelization_enabled=true max_concurrent_tasks=${effectiveMaxConcurrent}; all standard execution slots are occupied. Continue current active task gates before starting more coder work.`;let eligible=tasks.filter((task)=>{let taskId=task.id;if((task.status??"pending")!=="pending")return!1;if(occupied.has(taskId))return!1;return task.depends.every((dep)=>completed.has(dep))}).map((task)=>task.id).slice(0,availableSlots);if(eligible.length===0)return`[PARALLEL EXECUTION PROFILE] parallelization_enabled=true max_concurrent_tasks=${effectiveMaxConcurrent}; no dependency-ready pending tasks are available for a new coder slot. Continue the current task/gate.`;let failureWarning=backoffTriggered?` (${blockedTasks.length} blocked task(s) detected — concurrency auto-reduced due to failures)`:"";return`[PARALLEL EXECUTION PROFILE] parallelization_enabled=true max_concurrent_tasks=${effectiveMaxConcurrent}; ${occupied.size} slot(s) occupied. Eligible now: ${eligible.join(", ")}. [NEXT] dispatch up to ${availableSlots} eligible coder task(s) before waiting; preserve ONE task per coder call and call declare_scope for each task.${failureWarning}`}function collectPendingTaskIdsForActivePhase(plan){let currentPhaseId=resolveActivePhaseId(plan),currentPhase=plan.phases.find((phase)=>phase.id===currentPhaseId);if(!currentPhase)return[];return currentPhase.tasks.filter((t)=>t.status==="pending").map((t)=>t.id)}function scopeVerdictAllowsParallel(directory,plan){try{let pendingTaskIds=collectPendingTaskIdsForActivePhase(plan);if(pendingTaskIds.length<2)return!1;return computeParallelVerdict(directory,pendingTaskIds,{plan}).verdict==="all_disjoint"}catch{return!1}}async function getEvidenceTaskId(session,directory){let resolvedPlanPath,primary=session.currentTaskId??session.lastCoderDelegationTaskId;if(primary)return primary;if(session.taskWorkflowStates&&session.taskWorkflowStates.size>0)return session.taskWorkflowStates.keys().next().value??null;try{if(typeof directory!=="string"||directory.length===0)return null;let resolvedDirectory=path97.resolve(directory),planPath=path97.join(resolvedDirectory,".swarm","plan.json");if(resolvedPlanPath=path97.resolve(planPath),!resolvedPlanPath.startsWith(resolvedDirectory+path97.sep)&&resolvedPlanPath!==resolvedDirectory)return null;let planContent=await fs60.promises.readFile(resolvedPlanPath,"utf-8"),plan=EvidenceTaskIdPlanSchema.parse(JSON.parse(planContent));if(!plan||!Array.isArray(plan.phases))return null;for(let phase of plan.phases)if(Array.isArray(phase.tasks)){for(let task of phase.tasks)if(task.status==="in_progress")return task.id??null}}catch(err){if(err instanceof ZodError){let issueSummary=err.issues.slice(0,3).map((issue3)=>issue3.message).join("; ");return warn(`[delegation-gate] getEvidenceTaskId ignored invalid plan schema at ${resolvedPlanPath??"unknown path"}: ${issueSummary}`),null}if(process.env.DEBUG_SWARM&&err instanceof Error)warn(`[delegation-gate] getEvidenceTaskId error: ${err.message} (code=${err.code??"none"})`);return null}return null}async function resolveEvidenceTaskId(args2,session,directory,options={}){let plan=null,planTaskIdContext;try{if(plan=await loadPlanJsonOnly(directory),plan)planTaskIdContext=collectPlanTaskIdContextFromPhases(plan.phases)}catch{}if(args2)try{let policy=options.policy??"plan",planContextOptions=policy==="attribution"&&planTaskIdContext?.status==="over_limit"?{}:planTaskIdContext?toTaskIdPlanContextOptions(planTaskIdContext):{},resolutionOptions={policy,...planContextOptions,standaloneTaskMarkerOnly:policy==="attribution"},resolution=resolveTaskId(args2,resolutionOptions);if(resolution.status==="resolved"){let resolvedTaskId=resolution.taskId;if(policy==="attribution"&&!isStrictTaskId(resolvedTaskId)){let markerOnlyArgs={...args2};for(let field of EXPLICIT_TASK_ID_FIELDS)delete markerOnlyArgs[field];let markerResolution=resolveTaskId(markerOnlyArgs,resolutionOptions);if(markerResolution.status!=="resolved"||!isStrictTaskId(markerResolution.taskId))return null;resolvedTaskId=markerResolution.taskId}if(planTaskIdContext?.status==="over_limit"&&!plan?.phases.some((phase)=>phase?.tasks?.some((task)=>task?.id===resolvedTaskId)))return null;return resolvedTaskId}if(resolution.status==="invalid"||resolution.status==="ambiguous"||resolution.status==="over_limit")return null}catch{}if(options.allowSessionFallback===!1)return null;return getEvidenceTaskId(session,directory)}function sameReplayPrompt(existing,incoming){if(existing===void 0||incoming===void 0)return existing===incoming;return existing.digest===incoming.digest&&existing.chars===incoming.chars&&existing.truncated===incoming.truncated&&existing.text===incoming.text}function hasStableBackgroundReplayIdentity(existing,incoming){return existing.correlationId===incoming.correlationId&&existing.subagentSessionId===incoming.subagentSessionId&&existing.parentSessionId===incoming.parentSessionId&&existing.callID===incoming.callID&&existing.jobId===incoming.jobId&&existing.normalizedAgent===incoming.normalizedAgent&&existing.swarmPrefixedAgent===incoming.swarmPrefixedAgent&&existing.planTaskId===incoming.planTaskId&&existing.evidenceTaskId===incoming.evidenceTaskId&&sameReplayPrompt(existing.prompt,incoming.prompt)}function hydrateBackgroundReplayInput(existing,incoming){return{...incoming,workspace:existing.workspace,taskChangeContext:existing.taskChangeContext,worktree:existing.worktree,coderReservationId:existing.coderReservationId,prompt:existing.prompt,generation:existing.generation??1}}function sanitizeDenialText(value){return value.replace(/[\x00-\x1f\x7f]+/g," ")}function isRepairableStageBView(existingView,durableEligibleState){return existingView===void 0||existingView==="rework_required"||compareTaskWorkflowStateRank(durableEligibleState,existingView)>0}function warnStageBSettlementDropped(session,params){let{taskId,agent,reasonClass,drops}=params,restartNote=reasonClass==="unbound"?" The dispatch-generation binding is process-local and was lost — a plugin reload or host restart between dispatch and settlement is the usual cause; no durable binding was found for this dispatch, so it cannot be reconstructed.":"",dedupeToken=`[stageb-settlement-drop:${reasonClass}:${taskId}]`,safeCallID=sanitizeDenialText(params.callID),safeDetail=sanitizeDenialText(params.detail),message=reasonClass==="rejection_persist_failed"?`${dedupeToken} STAGE B SETTLEMENT DROPPED: ${agent} task ${taskId} from call ${safeCallID}: ${safeDetail}. The rejection verdict was not persisted (fail-closed); the task stays at its current state. Remedy: inspect .swarm/ evidence storage for this task and retry the rejection transition (the verdict need not be re-earned).`:`${dedupeToken} STAGE B SETTLEMENT DROPPED: ${agent} task ${taskId} from call ${safeCallID}: ${safeDetail}.${restartNote} The clean verdict was not recorded (fail-closed); the task stays at its current state. Remedy: re-dispatch the ${agent} gate for task ${taskId}.`;pushAdvisory(session,message,{dedupeKey:dedupeToken});let tasks=drops.get(reasonClass)??[];tasks.push(taskId),drops.set(reasonClass,tasks)}function flushStageBSettlementDropWarnings(drops){for(let[reasonClass,taskIds]of drops){if(taskIds.length===0)continue;let listed=taskIds.slice(0,10).join(", "),overflow=taskIds.length>10?` (+${taskIds.length-10} more)`:"";criticalWarn(`[delegation-gate] Stage B settlement dropped for task(s) ${listed}${overflow}: ${STAGE_B_SETTLEMENT_DROP_REASONS[reasonClass]}. See session advisories for per-task remedies.`)}drops.clear()}function createDelegationGateHook(config3,directory,registeredAgents){initDurableStatusPath(directory);let enabled=config3.hooks?.delegation_gate!==!1,delegationMaxChars=config3.hooks?.delegation_max_chars??4000,backgroundSubagentsEnabled=config3.hooks?.background_subagents===!0,backgroundPendingTimeoutMs=(config3.hooks?.background_pending_timeout_minutes??30)*60000,MAX_PENDING_CODER_CHANGE_CONTEXTS=128,coderTaskChangeContextByCallID=new Map,begunCoderSettlementsByCallID=new Map,rememberBegunCoderSettlement=(callID,taskId,transitionId)=>{if(!begunCoderSettlementsByCallID.has(callID)&&begunCoderSettlementsByCallID.size>=MAX_PENDING_CODER_CHANGE_CONTEXTS)throw Error(`BEGUN_SETTLEMENT_CONTEXT_CAPACITY: refusing coder dispatch because ${MAX_PENDING_CODER_CHANGE_CONTEXTS} live begun settlements are already tracked`);begunCoderSettlementsByCallID.set(callID,{taskId,transitionId})},backgroundCoderReservationByCallID=new Map,coderObservedFilesByCallID=new Map,stageBDispatchGenerationsByCallID=new Map,gateDispatchPrimaryTaskByCallID=new Map,stageBDispatchContextByCallID=new Map,reviewRouteByTaskKey=new Map,stageBRouteSlotByCallID=new Map,reviewRouteTaskKey=(sessionId,taskId)=>`${sessionId}\x00${taskId}`,MAX_REVIEW_ROUTE_RECORDS=128,rememberReviewRoute=(key2,route)=>{reviewRouteByTaskKey.delete(key2),reviewRouteByTaskKey.set(key2,route);while(reviewRouteByTaskKey.size>MAX_REVIEW_ROUTE_RECORDS){let oldest=reviewRouteByTaskKey.keys().next().value;if(!oldest)break;reviewRouteByTaskKey.delete(oldest)}},clearReviewRouteStateForSession=(sessionId)=>{let prefix=`${sessionId}\x00`;for(let key2 of reviewRouteByTaskKey.keys())if(key2.startsWith(prefix))reviewRouteByTaskKey.delete(key2)},bindReviewRouteSlots=(callID,sessionId,role,taskIds)=>{let bindings=new Map,session=swarmState.agentSessions.get(sessionId);for(let taskId of taskIds){let route=reviewRouteByTaskKey.get(reviewRouteTaskKey(sessionId,taskId));if(!route||route.kind!=="review_route_receipt")continue;let identities=role==="reviewer"?route.identities.reviewers:route.identities.testEngineers,slots=role==="reviewer"?route.slots?.reviewers??identities:route.slots?.testEngineers??identities;if(slots.length===0||identities.length!==slots.length)continue;let prior=stageBRouteSlotByCallID.get(callID)?.get(taskId),settled=session?getStageBRouteEvidence(session,taskId).find((entry)=>entry.role===role&&entry.sessionId===sessionId&&entry.taskId===taskId&&entry.callId===callID&&entry.generation===stageBDispatchGenerationsByCallID.get(callID)?.get(taskId)):void 0,existing=prior??settled,occupiedSlots=new Set;for(let entry of session?getStageBRouteEvidence(session,taskId):[])if(entry.role===role&&entry.slotId)occupiedSlots.add(entry.slotId);for(let[otherCallId,otherBindings]of stageBRouteSlotByCallID){if(otherCallId===callID)continue;let other=otherBindings.get(taskId);if(other?.role===role&&other.sessionId===sessionId&&other.taskId===taskId&&other.slotId)occupiedSlots.add(other.slotId)}let slotIndex=existing?slots.indexOf(existing.slotId??""):slots.findIndex((slotId2)=>!occupiedSlots.has(slotId2));if(slotIndex<0||slotIndex>=slots.length)continue;let slotId=slots[slotIndex];bindings.set(taskId,{role,identity:identities[slotIndex],sessionId,taskId,slotId,callId:callID,...existing?.childSessionId?{childSessionId:existing.childSessionId}:{},generation:stageBDispatchGenerationsByCallID.get(callID)?.get(taskId)})}if(bindings.size>0)stageBRouteSlotByCallID.set(callID,bindings)},publishedScopeBindingsByCallID=new Map,publishScopeBinding=async(callID,bindingDirectory,binding)=>{let published=await persistAndRegisterScopeBinding(bindingDirectory,binding);if(!published.ok)throw Error(`${published.code}: ${published.message}`);let entries=publishedScopeBindingsByCallID.get(callID)??[];entries.push({directory:bindingDirectory,binding}),publishedScopeBindingsByCallID.delete(callID),publishedScopeBindingsByCallID.set(callID,entries);while(publishedScopeBindingsByCallID.size>MAX_PENDING_SCOPE_BINDINGS){let oldest=publishedScopeBindingsByCallID.keys().next().value;if(oldest===void 0)break;let evicted=publishedScopeBindingsByCallID.get(oldest)??[];publishedScopeBindingsByCallID.delete(oldest);for(let entry of evicted)clearScopeBindingFromDisk({directory:entry.directory,binding:entry.binding}),clearExactScopeBinding(entry.binding)}},clearPublishedScopeBindings=(callID)=>{let entries=publishedScopeBindingsByCallID.get(callID)??[];publishedScopeBindingsByCallID.delete(callID);for(let entry of entries)clearScopeBindingFromDisk({directory:entry.directory,binding:entry.binding}),clearExactScopeBinding(entry.binding)},taskMetadata=async(input)=>{setDispatchParent(input.childSessionID,input.parentSessionID);let bindRouteChildSession=()=>{let routeBindings=stageBRouteSlotByCallID.get(input.callID);if(!routeBindings)return;for(let binding of routeBindings.values())binding.childSessionId=input.childSessionID},result=await claimScopeBindingForChildDurably({directory,parentSessionId:input.parentSessionID,childSessionId:input.childSessionID,dispatchCallId:input.callID});if(!result.ok){if(result.code==="SCOPE_NOT_DECLARED"){bindRouteChildSession();return}throw Error(`${result.code}: ${result.message}`)}let{previous,claimed}=result.value,entries=publishedScopeBindingsByCallID.get(input.callID)??[];for(let entry of entries)if(entry.directory===directory&&entry.binding.bindingId===previous.bindingId&&entry.binding.generationId===previous.generationId)entry.binding=claimed;let childSession=ensureAgentSession(input.childSessionID,"coder",directory);if(childSession.prmDelegationCallId!==input.callID)childSession.prmDelegationCallId=input.callID,resetPrmSessionState(childSession,input.childSessionID);childSession.currentTaskId=claimed.taskId,childSession.declaredCoderScope=[...claimed.files],bindRouteChildSession()},sessionEnded=(sessionID,includeOwnedChildren=!1)=>{if(!sessionID)return;clearReviewRouteStateForSession(sessionID);let removed=clearScopeBindings((binding)=>binding.ownerSessionId===sessionID||includeOwnedChildren&&binding.parentOwnerSessionId===sessionID);for(let binding of removed)clearScopeBindingFromDisk({directory:binding.workspaceIdentity,binding});if(removed.some((binding)=>binding.ownerSessionId===sessionID&&binding.activation==="active")){let endedSession=swarmState.agentSessions.get(sessionID);if(endedSession)endedSession.currentTaskId=null,endedSession.declaredCoderScope=null}for(let[callID,entries]of publishedScopeBindingsByCallID){let remaining=entries.filter((entry)=>entry.binding.ownerSessionId!==sessionID&&(!includeOwnedChildren||entry.binding.parentOwnerSessionId!==sessionID));if(remaining.length===0)publishedScopeBindingsByCallID.delete(callID);else if(remaining.length!==entries.length)publishedScopeBindingsByCallID.set(callID,remaining)}},clearCoderTaskChangeContext=(callID)=>{coderTaskChangeContextByCallID.delete(callID),coderObservedFilesByCallID.delete(callID)},rememberStageBDispatchGenerations=(callID,sessionID,generations)=>{if(!stageBDispatchGenerationsByCallID.has(callID)&&stageBDispatchGenerationsByCallID.size>=MAX_PENDING_CODER_CHANGE_CONTEXTS)throw Error(`STAGE_B_CONTEXT_CAPACITY: refusing Stage B dispatch because ${MAX_PENDING_CODER_CHANGE_CONTEXTS} live generation bindings are already tracked`);stageBDispatchGenerationsByCallID.set(callID,generations);let durableStart=Date.now(),persisted=_internals84.recordStageBDispatchBindings(directory,{sessionID:sessionID??"",callID,bindings:[...generations.entries()].map(([taskId,generation])=>({taskId,generation}))}),durableElapsed=Date.now()-durableStart;if(!persisted)criticalWarn(`[delegation-gate] Stage B durable binding write FAILED for call ${callID} — restart recovery for this dispatch is unavailable until re-dispatch (non-fatal; in-memory fencing remains active)`);else if(durableElapsed>50)log(`[delegation-gate] Stage B durable binding write for call ${callID}: persisted=true elapsedMs=${durableElapsed}`)},releasePrelaunchBackgroundCoderReservation=async(callID)=>{let reservation=backgroundCoderReservationByCallID.get(callID);if(!reservation)return;if(await _internals84.releaseBackgroundCoderReservationForDispatch(directory,{...reservation,reason:"recovered"})){backgroundCoderReservationByCallID.delete(callID);return}warn(`[delegation-gate] pre-launch background coder reservation ${reservation.reservationId} could not be released; later admission remains fail-closed`)},rememberCoderObservedFiles=(callID,observedFiles)=>{if(!coderObservedFilesByCallID.has(callID)&&coderObservedFilesByCallID.size>=MAX_PENDING_CODER_CHANGE_CONTEXTS){let oldest=coderObservedFilesByCallID.keys().next().value;if(oldest!==void 0)coderObservedFilesByCallID.delete(oldest)}coderObservedFilesByCallID.set(callID,observedFiles)},rememberCoderTaskChangeContext=async(callID,declaredFiles,observationDirectory=directory,workflowGeneration)=>{if(!coderTaskChangeContextByCallID.has(callID)&&coderTaskChangeContextByCallID.size>=MAX_PENDING_CODER_CHANGE_CONTEXTS)throw Error(`BACKGROUND_CODER_CONTEXT_CAPACITY: refusing coder dispatch because ${MAX_PENDING_CODER_CHANGE_CONTEXTS} live change baselines are already tracked`);coderTaskChangeContextByCallID.set(callID,{declaredFiles,baseline:await captureWorkspaceSnapshotAsync(observationDirectory),workflowGeneration})},beginForegroundCoderSettlementIfNeeded=async(input,taskId,background,worktree)=>{if(backgroundSubagentsEnabled&&isBackgroundTrue(background))return;let context=coderTaskChangeContextByCallID.get(input.callID);if(!context||context.workflowGeneration===void 0)throw Error(`CODER_SETTLEMENT_CONTEXT_MISSING: no durable baseline or generation for task ${taskId}`);let baselineDirtyFiles=Array.isArray(context.baseline.changedFiles)?context.baseline.changedFiles:[];if(baselineDirtyFiles.length>0){let sample=baselineDirtyFiles.slice(0,5).join(", ");throw Error(`CODER_SETTLEMENT_CLEAN_BASELINE_REQUIRED: ${String(baselineDirtyFiles.length)} uncommitted/untracked change(s) present at dispatch (${sample}${baselineDirtyFiles.length>5?", …":""}). `+"Commit or stash them before dispatching a coder — exact-task settlement cannot attribute coder mutations from a dirty launch baseline. "+`(.swarm/ plugin runtime state is excluded from this check automatically.) Task ${taskId} was not dispatched and no settlement state was created.`)}await beginCoderSettlement({directory,taskId,transitionId:`coder:${input.callID}`,actor:input.sessionID,expectedGeneration:context.workflowGeneration,context,...worktree?{worktree}:{}}),rememberBegunCoderSettlement(input.callID,taskId,`coder:${input.callID}`)},shouldRememberCoderTaskChangeContext=(_declaredFiles,_background)=>!0,backgroundCompletionClaimed=(record3)=>{let callID=record3.callID;clearPublishedScopeBindings(callID),clearCoderTaskChangeContext(callID),begunCoderSettlementsByCallID.delete(callID),stageBDispatchGenerationsByCallID.delete(callID),deleteStageBDispatchBindings(directory,record3.parentSessionId,callID),stageBRouteSlotByCallID.delete(callID),gateDispatchPrimaryTaskByCallID.delete(callID),stageBDispatchContextByCallID.delete(callID),deleteStoredInputArgs(callID)};if(!enabled)return{messagesTransform:async(_input,_output)=>{},toolBefore:async(input,output)=>{let args2=output.args;if(!isTaskToolId(input.tool)||!args2||typeof args2.subagent_type!=="string"||stripKnownSwarmPrefix(args2.subagent_type)!=="coder")return;let prepared=await prepareCoderScope(directory,input,args2);await publishScopeBinding(input.callID,directory,prepared.binding)},toolAfter:async(input,output)=>{if(isTaskToolId(input.tool)&&outputLooksLikeBackgroundRunning(output))return;clearPublishedScopeBindings(input.callID)},taskMetadata,sessionEnded,backgroundCompletionClaimed,abortDeniedSettlementForCall:async()=>{}};return{toolBefore:async(input,output)=>{if(!input.sessionID)return;let normalized=normalizeToolName(input.tool),preflightArgs=output.args;if(isTaskToolId(input.tool)&&preflightArgs&&typeof preflightArgs.subagent_type==="string"){let exactPreflightAgent=preflightArgs.subagent_type,preflightAgent=stripKnownSwarmPrefix(exactPreflightAgent),registeredMode=registeredAgents?Object.entries(registeredAgents).find(([name])=>name.toLowerCase()===exactPreflightAgent.trim().toLowerCase())?.[1]:void 0,isCriticDispatch=preflightAgent.startsWith("critic"),isRegistryMatchedDispatch=registeredMode!==void 0,isPrimaryDispatch=registeredMode?.mode==="primary";if((isCriticDispatch||isRegistryMatchedDispatch)&&!isPrimaryDispatch){let denialError;if(isCriticDispatch){let legacyCriticModel=config3.agents?.[preflightAgent]?.model??DEFAULT_MODELS[preflightAgent]??DEFAULT_MODELS.default,criticModel=registeredAgents?resolveRuntimeAgentModel(config3,registeredAgents,exactPreflightAgent)??resolveRegisteredAgentModel(config3,exactPreflightAgent)??legacyCriticModel:legacyCriticModel;try{let{checkSingleModelResolution:checkSingleModelResolution2}=await Promise.resolve().then(() => (init_model_preflight(),exports_model_preflight));if(await checkSingleModelResolution2(criticModel,swarmState.opencodeClient)==="unresolved")telemetry.modelUnresolved(preflightAgent,criticModel,"plan-critic dispatch preflight"),denialError=`PLAN_CRITIC_MODEL_UNRESOLVED: the ${sanitizeDenialText(exactPreflightAgent)} agent's effective model "${sanitizeDenialText(criticModel)}" does not resolve against the provider catalog — the critic can never run, so the plan-critic gate cannot produce VERDICT: APPROVED. `+`Fix the effective model configuration for "${sanitizeDenialText(exactPreflightAgent)}" in opencode-swarm.json (including any matching swarm override or inherited critic model), then re-run MODE: CRITIC-GATE.`}catch(error93){if(error93 instanceof Error&&error93.message.startsWith("PLAN_CRITIC_MODEL_UNRESOLVED")){let{invalidateProviderCatalogCache:invalidateProviderCatalogCache2}=await Promise.resolve().then(() => (init_model_preflight(),exports_model_preflight));throw invalidateProviderCatalogCache2(),error93}}}else{let overrideEntry=resolveEffectiveAgentOverride(config3,exactPreflightAgent),finalModel=overrideEntry&&typeof overrideEntry.model==="string"&&overrideEntry.model.trim()===""?"":(registeredAgents?resolveRuntimeAgentModel(config3,registeredAgents,exactPreflightAgent):void 0)??resolveRegisteredAgentModel(config3,exactPreflightAgent);if(finalModel===void 0||finalModel.trim()==="")telemetry.modelUnresolved(preflightAgent,"(no final selection)","swarm-agent dispatch preflight"),denialError=`SWARM_AGENT_MODEL_MISSING_SELECTION: the ${sanitizeDenialText(exactPreflightAgent)} agent is registered but has no final model selection (blank model override or a stale swarm registry entry) — dispatching it cannot succeed. `+"Fix agents.<role>.model in opencode-swarm.json (the matching swarm override wins over the top-level entry) or correct the swarm configuration, then retry.";else try{let{checkSingleModelResolution:checkSingleModelResolution2}=await Promise.resolve().then(() => (init_model_preflight(),exports_model_preflight));if(await checkSingleModelResolution2(finalModel,swarmState.opencodeClient)==="unresolved")telemetry.modelUnresolved(preflightAgent,finalModel,"swarm-agent dispatch preflight"),denialError=`SWARM_AGENT_MODEL_UNRESOLVED: the ${sanitizeDenialText(exactPreflightAgent)} agent's effective model "${sanitizeDenialText(finalModel)}" does not resolve against the provider catalog — dispatching this role will fail permanently ("Model not found"/"Forbidden"). `+"Fix the effective model configuration in opencode-swarm.json (the matching swarm override wins over top-level agents.<role>.model). fallback_models entries only serve transient runtime failures; configure a resolvable primary model for this role."}catch{}}if(denialError!==void 0){let{invalidateProviderCatalogCache:invalidateProviderCatalogCache2}=await Promise.resolve().then(() => (init_model_preflight(),exports_model_preflight));throw invalidateProviderCatalogCache2(),Error(denialError)}}}let completionArgs=output.args;if(completionArgs){let completionPlanContext;try{let plan2=await loadPlanJsonOnly(directory);if(plan2)completionPlanContext=collectPlanTaskIdContextFromPhases(plan2.phases)}catch{}let requestedTaskId=resolveDelegatedPlanTaskId(completionArgs,completionPlanContext?toTaskIdPlanContextOptions(completionPlanContext):void 0);if(requestedTaskId){let{getTaskWorkflowSnapshot:getTaskWorkflowSnapshot3,readTaskEvidence:readTaskEvidence3}=await Promise.resolve().then(() => (init_gate_evidence(),exports_gate_evidence)),recoveredCoder=await recoverCoderSettlement(directory,requestedTaskId);if(recoveredCoder){let recoveredSession=ensureAgentSession(input.sessionID,void 0,directory),workflow=getTaskWorkflowSnapshot3(recoveredCoder.evidence);recoveredSession.taskWorkflowStates.set(requestedTaskId,workflow.state),recoveredSession.stageBCompletion?.delete(requestedTaskId),updateTaskWorkflowCache(recoveredSession,requestedTaskId,workflow)}let recoveredTerminal=await recoverPreparedTaskTerminal(directory,requestedTaskId,input.sessionID);if(recoveredTerminal){let recoveredSession=ensureAgentSession(input.sessionID,void 0,directory),workflow=getTaskWorkflowSnapshot3(recoveredTerminal.evidence);recoveredSession.taskWorkflowStates.set(requestedTaskId,workflow.state),recoveredSession.stageBCompletion?.delete(requestedTaskId),recoveredSession.taskCouncilApproved?.delete(requestedTaskId),recoveredSession.taskCouncilWorkflowGeneration?.delete(requestedTaskId),updateTaskWorkflowCache(recoveredSession,requestedTaskId,workflow)}let recoveredRepair=null;try{recoveredRepair=await recoverPreparedTaskRepair(directory,requestedTaskId,input.sessionID)}catch(error93){criticalWarn(`[delegation-gate] task-repair recovery deferred for ${requestedTaskId}: ${error93 instanceof Error?error93.message:String(error93)}`)}if(recoveredRepair){let recoveredSession=ensureAgentSession(input.sessionID,void 0,directory),workflow=getTaskWorkflowSnapshot3(await readTaskEvidence3(directory,requestedTaskId));recoveredSession.taskWorkflowStates.set(requestedTaskId,workflow.state),recoveredSession.stageBCompletion?.delete(requestedTaskId),recoveredSession.taskCouncilApproved?.delete(requestedTaskId),recoveredSession.taskCouncilWorkflowGeneration?.delete(requestedTaskId),updateTaskWorkflowCache(recoveredSession,requestedTaskId,workflow)}}let taskAwaitingCompletion=await findTaskAwaitingCompletion(directory,requestedTaskId);if(taskAwaitingCompletion){if(!canRunWhileTaskAwaitsCompletion({directory,normalizedTool:normalized,args:completionArgs,awaitingTaskId:taskAwaitingCompletion,requestedTaskId}))throw Error(completionGateViolationMessage(taskAwaitingCompletion))}}if(!isTaskToolId(input.tool))return;let args2=output.args;if(!args2)return;let subagentType=args2.subagent_type;if(typeof subagentType!=="string")return;let targetAgent=stripKnownSwarmPrefix(subagentType);if(!backgroundSubagentsEnabled&&isBackgroundTrue(args2.background)&&isKnownCanonicalRole(targetAgent))throw Error(SWARM_BACKGROUND_TASK_BLOCKED_MESSAGE);if(targetAgent==="reviewer"||targetAgent==="test_engineer"){let routedTaskId=null,routeDispatchStarted=!1;try{let reviewSession=swarmState.agentSessions.get(input.sessionID);if(reviewSession){let activePrReviewBinding=await readPrReviewReentryBindingContext(directory,input.sessionID),reviewTaskId=await resolveEvidenceTaskId(args2,reviewSession,directory,activePrReviewBinding?{allowSessionFallback:!1}:void 0),changedFiles=reviewTaskId?getModifiedFilesForTask(reviewSession,reviewTaskId):[],routeTaskId=reviewTaskId??`unresolved-${input.callID}`;routedTaskId=routeTaskId,markStageBRouteRequired(reviewSession,routeTaskId);let pendingRoute=buildReviewRoutePending({sessionId:input.sessionID,taskId:routeTaskId});if(await persistReviewRouteReceipt({projectRoot:directory,receipt:pendingRoute}),routeDispatchStarted=!0,rememberReviewRoute(reviewRouteTaskKey(input.sessionID,routeTaskId),pendingRoute),changedFiles.length===0){let routerError=buildReviewRouteRouterError({code:"NO_CHANGED_FILES",sessionId:input.sessionID,taskId:routeTaskId});await persistReviewRouteReceipt({projectRoot:directory,receipt:routerError}),rememberReviewRoute(reviewRouteTaskKey(input.sessionID,routeTaskId),routerError)}else{let routing=await routeReviewForChanges(directory,changedFiles),routeReceipt=buildReviewRouteReceipt({sessionId:input.sessionID,taskId:routeTaskId,complexity:routing.depth,semanticRisk:routing.reason,requiredReviewers:Array.from({length:routing.reviewerCount},(_,index)=>`${routeTaskId}:reviewer:${index+1}`),requiredTestEngineers:Array.from({length:routing.testEngineerCount},(_,index)=>`${routeTaskId}:test_engineer:${index+1}`)});if(await persistReviewRouteReceipt({projectRoot:directory,receipt:routeReceipt}),rememberReviewRoute(reviewRouteTaskKey(input.sessionID,routeTaskId),routeReceipt),shouldParallelizeReview(routing))pushAdvisory(reviewSession,`REVIEW ROUTING: High complexity detected (${routing.reason}). Consider parallel review: ${routing.reviewerCount} reviewers, ${routing.testEngineerCount} test engineers recommended.`)}}}catch(error93){let detail=error93 instanceof Error?error93.message:String(error93);if(!routeDispatchStarted){warn(`[delegation-gate] review route dispatch could not establish its pending receipt: ${detail}`);return}let routerError=buildReviewRouteRouterError({code:/unavailable|timed out|timeout|not found/i.test(detail)?"ROUTER_UNAVAILABLE":"ROUTER_FAILED",sessionId:input.sessionID,taskId:routedTaskId??`unresolved-${input.callID}`,detail});try{if(await persistReviewRouteReceipt({projectRoot:directory,receipt:routerError}),routedTaskId)rememberReviewRoute(reviewRouteTaskKey(input.sessionID,routedTaskId),routerError)}catch(persistError){warn(`[delegation-gate] review route receipt was not recorded: ${detail}; router-error persistence failed: ${persistError instanceof Error?persistError.message:String(persistError)}`)}}}if(targetAgent==="coder"||targetAgent==="reviewer"){let acceptancePromptText=ACCEPTANCE_ARGS_FIELDS.map((field)=>args2[field]).filter((value)=>typeof value==="string").join(`
|
|
1263
1263
|
`),acceptanceCheck=validateCoderReviewerAcceptanceField(acceptancePromptText);if(!acceptanceCheck.valid){let detail=acceptanceCheck.reason==="acceptance_field_empty"?"its ACCEPTANCE field is present but empty/whitespace-only":"it has no ACCEPTANCE field";throw Error(`ACCEPTANCE_FIELD_REQUIRED: the ${targetAgent} delegation was blocked because ${detail}. `+"Every coder/reviewer dispatch MUST carry a non-empty ACCEPTANCE: line in its prompt — the mapped FR-###/SC-### ids "+"(for a single-task dispatch the delegation gate injects their verbatim requirement text from .swarm/spec.md automatically; phase/final-council multi-task reviewer dispatches are NOT auto-injected and must paste the verbatim text yourself) when the task maps to one or more spec requirements, or a one-line task-derived statement of what DONE looks like otherwise (see the ACCEPTANCE FIELD RESOLUTION section of your system prompt and .swarm/spec.md). Add an ACCEPTANCE: line to the delegation prompt and re-dispatch. Do NOT investigate the installed swarm plugin package (node_modules/opencode-swarm, "+"~/.cache/opencode) — the fix is in your dispatch content, not in plugin internals. If this same error "+"repeats after 2 fix attempts, STOP and present the blocker to the user.")}let coverageResult,coverageTaskId=null;try{let coveragePlan=await _internals84.loadPlanJsonOnly(directory);if(coveragePlan){let coveragePlanTaskContext=collectPlanTaskIdContextFromPhases(coveragePlan.phases);if(coverageTaskId=resolveDelegatedPlanTaskId(args2,toTaskIdPlanContextOptions(coveragePlanTaskContext)),coverageTaskId){let coverageTask=coveragePlan.phases.flatMap((phase)=>phase.tasks).find((t)=>t.id===coverageTaskId),frRefs=coverageTask?.fr_refs;if(coverageTask&&Array.isArray(frRefs)&&frRefs.length>0){let specText=await fs60.promises.readFile(path97.join(directory,".swarm","spec.md"),"utf8");injectSpecRequirementsIntoAcceptance({args:args2,frRefs,specText});let effectiveAcceptanceText=ACCEPTANCE_ARGS_FIELDS.map((field)=>args2[field]).filter((value)=>typeof value==="string").join(`
|
|
1264
1264
|
`);coverageResult=checkAcceptanceCoversFrRefs({acceptanceText:effectiveAcceptanceText,frRefs,specText})}}}}catch{coverageResult=void 0}if(coverageResult&&coverageResult.covered===!1)throw buildAcceptanceCoverageMismatchError({targetAgent,coverageTaskId,coverageResult})}if(TASK_GATE_AGENTS.has(targetAgent)){let isPrReviewReentryAgent=targetAgent==="reviewer"||targetAgent==="test_engineer";if(isPrReviewReentryAgent&&swarmState.pendingRehydrations.size>0)await Promise.allSettled([...swarmState.pendingRehydrations]);let stageBSession=ensureAgentSession(input.sessionID,void 0,directory),activePrReviewBinding=isPrReviewReentryAgent?await readPrReviewReentryBindingContext(directory,input.sessionID):null,resolvedTaskId=await resolveEvidenceTaskId(args2,stageBSession,directory,evidenceTaskResolutionOptions(targetAgent,activePrReviewBinding?!1:void 0)),candidateTaskIds=new Set;if(resolvedTaskId)candidateTaskIds.add(resolvedTaskId);let dispatchPlan=await loadPlanJsonOnly(directory);if(dispatchPlan&&!isExplicitTaskEvidenceAgent(targetAgent)){let knownIds=new Set(dispatchPlan.phases.flatMap((phase)=>phase.tasks.map((task)=>task.id))),dispatchText=[args2.prompt,args2.description,args2.task,args2.input].filter((value)=>typeof value==="string").join(`
|
|
1265
1265
|
`);for(let match of dispatchText.matchAll(/(?:task-)?(\d+\.\d+(?:\.\d+)*)/gi))if(match[1]&&knownIds.has(match[1]))candidateTaskIds.add(match[1])}let generations=new Map,{getTaskWorkflowSnapshot:getTaskWorkflowSnapshot3,readTaskEvidence:readTaskEvidence3}=await Promise.resolve().then(() => (init_gate_evidence(),exports_gate_evidence));if(activePrReviewBinding&&!resolvedTaskId&&isPrReviewReentryAgent){if(stageBSession.taskWorkflowStates.size>0||dispatchPlan)throw Error(`TASK_WORKFLOW_TASK_ID_REQUIRED: cannot dispatch ${targetAgent} for PR-review re-entry without an explicit task_id or task identifier in the prompt while a plan or task workflow state exists. Bind the re-entry to the exact task before dispatching; refusing to guess from session or plan state protects parallel tasks from cross-attribution.`);let{reserveActivePrReviewReentryAuthorization}=await Promise.resolve().then(() => (init_pr_workflow_gate(),exports_pr_workflow_gate));if(await reserveActivePrReviewReentryAuthorization(directory,input.sessionID,{role:targetAgent==="test_engineer"?"test_engineer":"reviewer",callID:input.callID})){rememberStageBDispatchGenerations(input.callID,input.sessionID,generations),gateDispatchPrimaryTaskByCallID.set(input.callID,null),stageBDispatchContextByCallID.set(input.callID,{taskIds:new Set(generations.keys()),expectedVerdictKind:targetAgent==="test_engineer"?"TESTED":"REVIEWED",standalonePrReviewReentry:!0}),bindReviewRouteSlots(input.callID,input.sessionID,targetAgent,generations.keys());return}if(await readPrReviewReentryBindingContext(directory,input.sessionID))throw Error(`TASK_WORKFLOW_STAGE_A_REQUIRED: cannot dispatch ${targetAgent} without a task workflow because its one-use PR-review re-entry authorization was already consumed or is unavailable. Issue a fresh authorization immediately before the direct Task dispatch.`)}for(let taskId of candidateTaskIds){let workflow=getTaskWorkflowSnapshot3(await readTaskEvidence3(directory,taskId));if(taskId===resolvedTaskId&&await isCouncilGateActive(directory,config3.council)){if(!stageBSession.taskCouncilWorkflowGeneration)stageBSession.taskCouncilWorkflowGeneration=new Map;if(!stageBSession.taskCouncilWorkflowGeneration.has(taskId))stageBSession.taskCouncilWorkflowGeneration.set(taskId,workflow.generation)}if(targetAgent!=="reviewer"&&targetAgent!=="test_engineer"){generations.set(taskId,workflow.generation);continue}if(workflow.authoritative&&(workflow.state==="pre_check_passed"||workflow.state==="reviewer_run")){if(generations.set(taskId,workflow.generation),isRepairableStageBView(stageBSession.taskWorkflowStates.get(taskId),workflow.state))stageBSession.taskWorkflowStates.set(taskId,workflow.state),updateTaskWorkflowCache(stageBSession,taskId,workflow);continue}if(taskId===resolvedTaskId){let{reserveActivePrReviewReentryAuthorization}=await Promise.resolve().then(() => (init_pr_workflow_gate(),exports_pr_workflow_gate));if(await reserveActivePrReviewReentryAuthorization(directory,input.sessionID,{role:targetAgent==="test_engineer"?"test_engineer":"reviewer",callID:input.callID})){rememberStageBDispatchGenerations(input.callID,input.sessionID,generations),gateDispatchPrimaryTaskByCallID.set(input.callID,resolvedTaskId),stageBDispatchContextByCallID.set(input.callID,{taskIds:new Set(generations.keys()),expectedVerdictKind:targetAgent==="test_engineer"?"TESTED":"REVIEWED"}),bindReviewRouteSlots(input.callID,input.sessionID,targetAgent,generations.keys());return}let stageARemediation=workflow.state==="rework_required"?"Remediation: if the Stage B verdict did not require a code change, call recover_rework_task for task "+taskId+" (architect-only, audited; requires green secretscan AND sast_scan evidence newer than the verdict — normally from a fresh pre_check_batch run; unavailable when SAST is disabled), then re-dispatch. "+"Otherwise delegate the coder to repair the code, re-run pre_check_batch, and re-dispatch once stage_a_passed has fired.":`Remediation: run pre_check_batch on the task's changed files first. If pre_check_batch passes but the task remains coder_delegated (typical after /swarm reset-session), run /swarm recover ${taskId} to repair Stage A attribution, then re-dispatch.`;throw Error(`TASK_WORKFLOW_STAGE_A_REQUIRED: cannot dispatch ${targetAgent} for task ${taskId} from ${workflow.state}. Stage B (${targetAgent}) requires the task to be at pre_check_passed (or later) — a state written only by the stage_a_passed transition, which is emitted when pre_check_batch completes with the task correctly attributed. `+stageARemediation+(targetAgent==="reviewer"||targetAgent==="test_engineer"?" For PR-review re-entry outside the task workflow, issue a one-use authorization with authorize_pr_review_reentry immediately before the Task dispatch.":""))}}rememberStageBDispatchGenerations(input.callID,input.sessionID,generations),gateDispatchPrimaryTaskByCallID.set(input.callID,resolvedTaskId),stageBDispatchContextByCallID.set(input.callID,{taskIds:new Set(generations.keys()),expectedVerdictKind:targetAgent==="test_engineer"?"TESTED":"REVIEWED"}),bindReviewRouteSlots(input.callID,input.sessionID,targetAgent,generations.keys());return}if(targetAgent!=="coder")return;let session=ensureAgentSession(input.sessionID,void 0,directory);if(!session||!session.taskWorkflowStates)return;let{getTaskWorkflowSnapshot:getTaskWorkflowSnapshot2,readTaskEvidence:readTaskEvidence2,readTaskEvidenceState:readTaskEvidenceState2,transitionTaskWorkflowEvidence:transitionTaskWorkflowEvidence2}=await Promise.resolve().then(() => (init_gate_evidence(),exports_gate_evidence)),requestedScopeTaskId=typeof args2.task_id==="string"?args2.task_id.trim():typeof args2.taskId==="string"?args2.taskId.trim():"",classifiedFeedbackScope=isStrictTaskId(requestedScopeTaskId)?await resolvePrFeedbackScopeDeclaration(directory,input.sessionID,requestedScopeTaskId):null,resolvedPreflightTaskId=classifiedFeedbackScope?null:await resolveEvidenceTaskId(args2,session,directory),preflightPlan=classifiedFeedbackScope?null:await loadPlanJsonOnly(directory),preflightTaskId=resolvedPreflightTaskId&&preflightPlan?.phases.some((phase)=>phase.tasks.some((task)=>task.id===resolvedPreflightTaskId))?resolvedPreflightTaskId:null,preflightEvidenceState=preflightTaskId?await readTaskEvidenceState2(directory,preflightTaskId):null;if(preflightEvidenceState?.kind==="unparseable"){let errorName=preflightEvidenceState.error instanceof Error?preflightEvidenceState.error.name:"UnknownError";throw Error(`TASK_EVIDENCE_UNREADABLE: Task ${preflightTaskId} evidence at ${preflightEvidenceState.evidencePath} is corrupt or from an incompatible build (${errorName}); refusing to treat it as idle. Repair or remove the evidence file (repair_gate_evidence) before dispatching.`)}let preflightEvidence=preflightEvidenceState?.kind==="ok"?preflightEvidenceState.evidence:null,preflightWorkflow=getTaskWorkflowSnapshot2(preflightEvidence);if(preflightTaskId){if(await enforceCoderRetryEscalation({directory,taskId:preflightTaskId,generation:preflightWorkflow.generation,retryEpoch:preflightWorkflow.retryEpoch,retryCount:preflightWorkflow.retryCount,retryHistory:preflightWorkflow.retryHistory,criticSatisfied:preflightEvidence?.gates.critic_sounding_board!=null}),preflightWorkflow.state==="coder_delegated"){if(!(hasActiveTurboMode(input.sessionID)&&!preflightTaskId.startsWith("3.")))throw Error(`STAGE_A_REQUIRED: Task ${preflightTaskId} has an accepted coder mutation that has not passed pre_check_batch. Run Stage A first. If Stage A fails, the task becomes rework_required and the same-task coder may repair it. Do not send known-broken output to reviewer.`)}}let preparedScope;try{preparedScope=await prepareCoderScope(directory,input,args2)}catch(error93){if(preflightTaskId){let transitionId=`coder-preflight:${input.callID}`,explicitEmptyPlanScope=error93 instanceof Error&&error93.message.includes("coder delegation has no complete, valid, non-empty scope.")&&!extractTaskFileDirectives(args2).present&&await hasExplicitEmptyPlanScope(directory,preflightTaskId),settled=null;if(explicitEmptyPlanScope&&preflightWorkflow.generation===0)try{settled=await settleRejectedEmptyPlanScope(directory,input,preflightTaskId,preflightWorkflow.generation)}catch(settlementError){criticalWarn(`[delegation-gate] empty-scope preflight settlement failed for ${preflightTaskId}: ${settlementError instanceof Error?settlementError.message:String(settlementError)}`)}let failedWorkflow=getTaskWorkflowSnapshot2(settled?.evidence??await transitionTaskWorkflowEvidence2(directory,preflightTaskId,{type:"dispatch_no_mutation",agentType:"coder",expectedGeneration:preflightWorkflow.generation,transitionId}));if(failedWorkflow.retryCount>=3)await emitCoderRetryEscalation(directory,{taskId:preflightTaskId,generation:failedWorkflow.generation,retryEpoch:failedWorkflow.retryEpoch,rejectionCount:failedWorkflow.retryCount,rejectionHistory:failedWorkflow.retryHistory,action:"sounding_board_consultation"})}throw error93}let{taskId:incomingCoderTaskId}=preparedScope;if(incomingCoderTaskId)session.lastCoderDelegationTaskId=incomingCoderTaskId;let coderEvidence=incomingCoderTaskId?await readTaskEvidence2(directory,incomingCoderTaskId):null,coderWorkflow=getTaskWorkflowSnapshot2(coderEvidence),coderDispatchGeneration=coderWorkflow.generation;if(incomingCoderTaskId){if(incomingCoderTaskId!==preflightTaskId)await enforceCoderRetryEscalation({directory,taskId:incomingCoderTaskId,generation:coderWorkflow.generation,retryEpoch:coderWorkflow.retryEpoch,retryCount:coderWorkflow.retryCount,retryHistory:coderWorkflow.retryHistory,criticSatisfied:coderEvidence?.gates.critic_sounding_board!=null})}let reserveBackgroundCoderIfNeeded=async(maxConcurrent2)=>{if(!backgroundSubagentsEnabled||!isBackgroundTrue(args2.background))return;try{await _internals84.maintainBackgroundDelegationsForDispatch(directory,{lockTimeoutMs:1000,reason:"admission"})}catch(error93){warn(`[delegation-gate] pre-admission background maintenance skipped: ${error93 instanceof Error?error93.message:String(error93)}`)}let occupiedTaskIds=[...session.taskWorkflowStates.entries()].filter(([,state2])=>state2==="coder_delegated").map(([taskId])=>taskId),claim=await _internals84.reserveBackgroundCoderSlotForDispatch(directory,{parentSessionId:input.sessionID,planTaskId:incomingCoderTaskId||null,callID:input.callID,maxConcurrent:maxConcurrent2,occupiedTaskIds});if(!claim.ok){let detail=claim.detail?` ${claim.detail}`:"",code=claim.reason==="capacity"?"PARALLEL_SLOTS_EXHAUSTED":claim.reason==="duplicate_task"||claim.reason==="duplicate_call"?"BACKGROUND_CODER_TASK_RESERVED":"BACKGROUND_CODER_RESERVATION_UNCERTAIN";throw Error(`${code}: background coder admission was blocked (${claim.reason}).${detail}`)}backgroundCoderReservationByCallID.set(input.callID,claim.reservation)};if(preparedScope.kind==="pr_feedback"){await reserveBackgroundCoderIfNeeded(1);try{if(shouldRememberCoderTaskChangeContext(preparedScope.declaredFiles,args2.background))await rememberCoderTaskChangeContext(input.callID,preparedScope.declaredFiles,directory,coderDispatchGeneration);await publishScopeBinding(input.callID,directory,preparedScope.binding),await beginForegroundCoderSettlementIfNeeded(input,incomingCoderTaskId,args2.background)}catch(error93){throw await releasePrelaunchBackgroundCoderReservation(input.callID),clearPublishedScopeBindings(input.callID),clearCoderTaskChangeContext(input.callID),error93}return}let plan=preparedScope.plan,profile=plan.execution_profile,parallelEnabled=profile?.parallelization_enabled===!0,maxConcurrent=profile?.max_concurrent_tasks??10,effectiveMaxConcurrent=session.maxConcurrencyOverride??maxConcurrent,scopeAllowsParallel=scopeVerdictAllowsParallel(directory,plan),standardWorktreeIsolationActive=parallelEnabled&&effectiveMaxConcurrent>1&&!hasActiveLeanTurbo(input.sessionID),parallelModeActive=standardWorktreeIsolationActive&&scopeAllowsParallel,criticPolicy=resolvePlanCriticPolicyForExecution(directory,plan,session.qaGateSessionOverrides??{});if(log(`[delegation-gate] critic_pre_plan policy task=${incomingCoderTaskId??"unknown"} required=${criticPolicy.required} source=${criticPolicy.source}`),criticPolicy.required)await assertPlanCriticApprovedForExecution(directory,plan);let{declaredFiles:incomingCoderDeclaredFiles,binding:correlatedBinding}=preparedScope;for(let task of plan.phases.flatMap((phase)=>phase.tasks)){let taskId=task.id,evidenceState=await readTaskEvidenceState2(directory,taskId);if(evidenceState.kind==="unparseable"){if(incomingCoderTaskId&&taskId===incomingCoderTaskId){let errorName=evidenceState.error instanceof Error?evidenceState.error.name:"UnknownError";throw Error(`TASK_EVIDENCE_UNREADABLE: Task ${taskId} evidence at ${evidenceState.evidencePath} is corrupt or from an incompatible build (${errorName}); refusing to treat it as idle. Repair or remove the evidence file (repair_gate_evidence) before dispatching.`)}warn(`[delegation-gate] Task ${taskId} evidence at ${evidenceState.evidencePath} is corrupt or from an incompatible build — treating as idle for this dispatch. Repair it before the task's next delegation.`)}let durableWorkflow=getTaskWorkflowSnapshot2(evidenceState.kind==="ok"?evidenceState.evidence:null),state2=durableWorkflow.authoritative?durableWorkflow.state:"idle";if(session.taskWorkflowStates.set(taskId,state2),updateTaskWorkflowCache(session,taskId,durableWorkflow),state2!=="coder_delegated")continue;let freshnessThreshold=session.sessionRehydratedAt>0?session.sessionRehydratedAt:session.lastPhaseCompleteTimestamp??0,hasCurrentSessionCoderDelegation=(swarmState.delegationChains.get(input.sessionID)??[]).some((d)=>stripKnownSwarmPrefix(d.to)==="coder"&&d.timestamp>freshnessThreshold);if(!durableWorkflow.authoritative&&!hasCurrentSessionCoderDelegation){session.taskWorkflowStates.set(taskId,"idle"),warn(`[delegation-gate] Reset stale coder_delegated state for task ${taskId} — `+"no coder delegation found in current session.");continue}if(hasActiveTurboMode(input.sessionID)){if(!taskId.startsWith("3."))continue}if(parallelModeActive&&incomingCoderTaskId&&taskId!==incomingCoderTaskId)continue;throw Error(`STAGE_A_REQUIRED: Task ${taskId} has an accepted coder mutation that has not passed pre_check_batch. Run Stage A first. If Stage A fails, the task becomes rework_required and the same-task coder may repair it. Do not send known-broken output to reviewer.`)}if(parallelModeActive){let coderDelegatedCount=0;for(let s of session.taskWorkflowStates.values())if(s==="coder_delegated")coderDelegatedCount++;if(coderDelegatedCount>=effectiveMaxConcurrent)throw Error(`PARALLEL_SLOTS_EXHAUSTED: ${coderDelegatedCount} coder task(s) are awaiting review (max_concurrent_tasks=${effectiveMaxConcurrent}). Dispatch reviewer/test_engineer for an in-flight coder task before starting another coder.`)}if(standardWorktreeSerializationSessions.has(input.sessionID)){if(checkStandardWorktreeSerializationRelease(input.sessionID,resolveWorktreeIsolationConfig(config3)),standardWorktreeSerializationSessions.has(input.sessionID))throw Error("STANDARD_WORKTREE_ISOLATION_SERIALIZED: prior standard worktree isolation setup failed in this session; wait for the active coder task to finish before dispatching another coder.")}await reserveBackgroundCoderIfNeeded(parallelModeActive?effectiveMaxConcurrent:1);try{if(!parallelModeActive){if(shouldRememberCoderTaskChangeContext(incomingCoderDeclaredFiles,args2.background))await rememberCoderTaskChangeContext(input.callID,incomingCoderDeclaredFiles,directory,coderDispatchGeneration)}if(!standardWorktreeIsolationActive){if(shouldRememberCoderTaskChangeContext(incomingCoderDeclaredFiles,args2.background))await rememberCoderTaskChangeContext(input.callID,incomingCoderDeclaredFiles,directory,coderDispatchGeneration);await publishScopeBinding(input.callID,directory,correlatedBinding),await beginForegroundCoderSettlementIfNeeded(input,incomingCoderTaskId,args2.background);return}let resolvedTaskId=incomingCoderTaskId,laneScope=correlatedBinding.files;await precreateStandardWorktreeSession({config:config3,directory,parentSessionID:input.sessionID,callID:input.callID,taskId:resolvedTaskId??sanitizeWorktreeTaskId(input.callID),planTaskId:resolvedTaskId??void 0,reservationId:backgroundCoderReservationByCallID.get(input.callID)?.reservationId??buildBackgroundCoderReservationId({parentSessionId:input.sessionID,planTaskId:resolvedTaskId,callID:input.callID}),generation:coderDispatchGeneration,description:typeof args2.description==="string"?args2.description:void 0,outputArgs:args2,scope:laneScope&&laneScope.length>0&&resolvedTaskId?{taskId:resolvedTaskId,files:laneScope}:void 0});let standardDispatch=standardWorktreeByCallID.get(input.callID);if(standardDispatch){if(resolvedTaskId)try{let childSessionId=typeof args2.task_id==="string"?args2.task_id.trim():"";if(!childSessionId||childSessionId===input.sessionID)throw Error("SCOPE_CHILD_IDENTITY_MISSING: worktree dispatch did not return a distinct child session id");await savePlan(standardDispatch.handle.worktreePath,plan,{preserveCompletedStatuses:!1});let childBinding=deriveChildScopeBinding(correlatedBinding,{childDirectory:standardDispatch.handle.worktreePath,childSessionId,parentCallId:input.callID});await publishScopeBinding(input.callID,standardDispatch.handle.worktreePath,childBinding);let childSession=ensureAgentSession(childSessionId,"coder",standardDispatch.handle.worktreePath);childSession.currentTaskId=childBinding.taskId,childSession.declaredCoderScope=[...childBinding.files]}catch(error93){throw clearPublishedScopeBindings(input.callID),await cleanupStandardWorktreeForCallId(input.callID,"denied",directory,resolveWorktreeIsolationConfig(config3).worktree_dir),error93}if(shouldRememberCoderTaskChangeContext(incomingCoderDeclaredFiles,args2.background))await rememberCoderTaskChangeContext(input.callID,incomingCoderDeclaredFiles,standardDispatch.handle.worktreePath,coderDispatchGeneration)}else{if(shouldRememberCoderTaskChangeContext(incomingCoderDeclaredFiles,args2.background))await rememberCoderTaskChangeContext(input.callID,incomingCoderDeclaredFiles,directory,coderDispatchGeneration);let degradation=getStandardWorktreeDegradationReason(input.sessionID);if(degradation)try{appendCoreEventSync(directory,{type:"worktree_isolation_degraded",timestamp:new Date().toISOString(),sessionId:input.sessionID,callId:input.callID,taskId:incomingCoderTaskId,reason:degradation.reason.length>500?`${degradation.reason.slice(0,500)}… (truncated)`:degradation.reason,degradedAt:new Date(degradation.at).toISOString()})}catch(eventError){log(`[delegation-gate] worktree_isolation_degraded event write failed: ${eventError instanceof Error?eventError.message:String(eventError)}`)}await publishScopeBinding(input.callID,directory,correlatedBinding)}await beginForegroundCoderSettlementIfNeeded(input,incomingCoderTaskId,args2.background,standardDispatch?{callID:standardDispatch.callID,parentSessionId:standardDispatch.parentSessionID,taskId:incomingCoderTaskId,planTaskId:standardDispatch.planTaskId??null,worktreePath:standardDispatch.handle.worktreePath,branchName:standardDispatch.handle.branchName,worktreeId:standardDispatch.handle.id,worktreeSessionId:standardDispatch.handle.sessionId,mergeStrategy:standardDispatch.mergeStrategy,laneIndex:standardDispatch.laneIndex,worktreeDir:standardDispatch.worktree_dir??null,provisioningOwner:exactProvisioningOwnerForBackgroundDescriptor(standardDispatch.provisioningOwner)}:void 0)}catch(error93){throw await releasePrelaunchBackgroundCoderReservation(input.callID),clearPublishedScopeBindings(input.callID),clearCoderTaskChangeContext(input.callID),error93}},messagesTransform:async(_input,output)=>{let messages=output.messages;if(!messages||messages.length===0)return;let lastUserMessageIndex=-1;for(let i=messages.length-1;i>=0;i--)if(messages[i]?.info?.role==="user"){lastUserMessageIndex=i;break}if(lastUserMessageIndex===-1)return;let lastUserMessage=messages[lastUserMessageIndex];if(!lastUserMessage?.parts)return;let agent=lastUserMessage.info?.agent;if(agent==="")return;let strippedAgent=agent?stripKnownSwarmPrefix(agent):void 0;if(strippedAgent&&strippedAgent!=="architect")return;let textPartIndex=lastUserMessage.parts.findIndex((p)=>p?.type==="text"&&p.text!==void 0);if(textPartIndex===-1)return;let textPart=lastUserMessage.parts[textPartIndex],text=textPart.text??"",taskDisclosureSessionID=lastUserMessage.info?.sessionID;if(taskDisclosureSessionID){let currentTaskIdForWindow=ensureAgentSession(taskDisclosureSessionID,void 0,directory).currentTaskId;if(currentTaskIdForWindow){let taskLineRegex=/^[ \t]*-[ \t]*(?:\[[ x]\][ \t]+)?(\d+\.\d+(?:\.\d+)*)[:. ].*/gm,taskLines=[];taskLineRegex.lastIndex=0;let regexMatch=taskLineRegex.exec(text);while(regexMatch!==null)taskLines.push({line:regexMatch[0],taskId:regexMatch[1],index:regexMatch.index}),regexMatch=taskLineRegex.exec(text);if(taskLines.length>5){let currentIdx=taskLines.findIndex((t)=>t.taskId===currentTaskIdForWindow),windowStart=Math.max(0,currentIdx-2),windowEnd=Math.min(taskLines.length-1,currentIdx+3),visibleTasks=taskLines.slice(windowStart,windowEnd+1),hiddenBefore=windowStart,hiddenAfter=taskLines.length-1-windowEnd,totalTasks=taskLines.length,visibleCount=visibleTasks.length,firstTaskIndex=taskLines[0].index,lastTask=taskLines[taskLines.length-1],lastTaskEnd=lastTask.index+lastTask.line.length,before=text.slice(0,firstTaskIndex),after=text.slice(lastTaskEnd),visibleLines=visibleTasks.map((t)=>t.line).join(`
|
|
@@ -1289,7 +1289,7 @@ ${warnings.map((w)=>`Detected signal: ${w}`).join(`
|
|
|
1289
1289
|
`).filter((line)=>line.trim().length>0).length,bytes:stat9.size}}catch{return{lines:0,bytes:0}}}function compactTerminalRecords(view,checkpoint2){let now=Date.now(),terminals=Object.entries(view).filter(([,rec])=>rec.status!=="active").sort((a,b)=>b[1].updatedAt-a[1].updatedAt);if(terminals.length===0)return null;if(!terminals.some(([,rec])=>now-rec.updatedAt>PR_SUBSCRIPTION_LIMITS.terminalMaxAgeMs)&&terminals.length<=PR_SUBSCRIPTION_LIMITS.terminalRecordsHigh)return null;let kept=0;for(let[key2,rec]of terminals)if(now-rec.updatedAt>PR_SUBSCRIPTION_LIMITS.terminalMaxAgeMs||kept>=PR_SUBSCRIPTION_LIMITS.terminalRecordsLow){if(rec.status==="removed")checkpoint2.terminalSummary.removed+=1;else checkpoint2.terminalSummary.expired+=1;checkpoint2.terminalSummary.lastTerminalAt=Math.max(checkpoint2.terminalSummary.lastTerminalAt??0,rec.updatedAt),delete view[key2]}else kept+=1;return checkpoint2.maintenance.compactions+=1,checkpoint2.maintenance.lastCompactedAt=now,{kind:"compact"}}function maybeArchiveLegacy(directory,checkpoint2){let migration=checkpoint2.migration;if(!migration||!migration.done||migration.archived)return null;let legacy=storePath3(directory),stat9;try{stat9=_internals85.archiveStatSync(legacy)}catch(err){if(err.code==="ENOENT")migration.archived=!0;else log(`[pr-monitor] legacy archive inspection deferred: ${storageErrorCode(err)}`);return null}if(stat9.size!==migration.sourceBytes||stat9.mtimeMs!==migration.sourceMtimeMs)return null;_internals85.beforeArchiveLegacy(directory);try{stat9=_internals85.archiveStatSync(legacy)}catch{return null}if(stat9.size!==migration.sourceBytes||stat9.mtimeMs!==migration.sourceMtimeMs)return null;let archive=legacyArchivePath(directory),next=legacyArchiveNextPath(directory),previous=legacyArchivePreviousPath(directory);try{_internals85.beforeArchiveRename(directory);try{fs61.unlinkSync(next)}catch{}_internals85.renameWithRetry(legacy,next);let archivedStat=_internals85.archiveStatSync(next);if(archivedStat.size!==migration.sourceBytes||archivedStat.mtimeMs!==migration.sourceMtimeMs)return _internals85.renameWithRetry(next,legacy),null;let archivedAt=new Date;fs61.utimesSync(next,archivedAt,archivedAt);let movedPrevious=!1;try{fs61.unlinkSync(previous)}catch{}try{_internals85.renameWithRetry(archive,previous),movedPrevious=!0}catch(err){if(err.code!=="ENOENT")throw err}try{_internals85.renameWithRetry(next,archive)}catch(err){if(movedPrevious)_internals85.renameWithRetry(previous,archive);throw _internals85.renameWithRetry(next,legacy),err}if(movedPrevious)try{fs61.unlinkSync(previous)}catch{}}catch(err){try{if(fs61.existsSync(next)&&!fs61.existsSync(legacy))_internals85.renameWithRetry(next,legacy)}catch{}return log(`[pr-monitor] legacy archive deferred: ${storageErrorCode(err)}`),null}try{let now=Date.now()/1000;fs61.utimesSync(legacyArchivePath(directory),now,now)}catch{}return migration.archived=!0,{kind:"archive"}}function reconcileLegacyArchiveStaging(directory,migration){let legacy=storePath3(directory),archive=legacyArchivePath(directory),next=legacyArchiveNextPath(directory),previous=legacyArchivePreviousPath(directory),legacyExists=fileExistsStrict(legacy),archiveExists=fileExistsStrict(archive),nextExists=fileExistsStrict(next),previousExists=fileExistsStrict(previous);if(!nextExists&&!previousExists)return;if(legacyExists){if(!archiveExists&&previousExists)_internals85.renameWithRetry(previous,archive),archiveExists=!0,previousExists=!1;if(!archiveExists&&nextExists){let candidate=fs61.statSync(next);if(migration.done&&candidate.size===migration.sourceBytes&&candidate.mtimeMs===migration.sourceMtimeMs)_internals85.renameWithRetry(next,archive),archiveExists=!0,nextExists=!1}if(archiveExists&&previousExists)fs61.unlinkSync(previous);if(nextExists)fs61.unlinkSync(next);return}if(archiveExists){if(nextExists)_internals85.renameWithRetry(next,legacy),migration.archived=!1,legacyExists=!0,nextExists=!1;if(previousExists)fs61.unlinkSync(previous);return}if(previousExists){if(_internals85.renameWithRetry(previous,archive),archiveExists=!0,previousExists=!1,nextExists)fs61.unlinkSync(next),legacyExists=!0,nextExists=!1;return}if(nextExists){let candidate=fs61.statSync(next);if(migration.done&&candidate.size===migration.sourceBytes&&candidate.mtimeMs===migration.sourceMtimeMs)_internals85.renameWithRetry(next,archive);else _internals85.renameWithRetry(next,legacy),migration.archived=!1}}function cleanupStaleLegacyArchive(directory){try{let stat9=fs61.statSync(legacyArchivePath(directory));if(Date.now()-stat9.mtimeMs>PR_SUBSCRIPTION_LIMITS.legacyArchiveTtlMs)fs61.unlinkSync(legacyArchivePath(directory))}catch{}}function emitHealthTelemetry(directory,trigger,checkpoint2){let records=Object.values(checkpoint2.records),healthPayload={trigger,active_count:records.filter((r)=>r.status==="active").length,terminal_count:records.filter((r)=>r.status!=="active").length,compactions:checkpoint2.maintenance.compactions,corrupt_count:checkpoint2.maintenance.corruptLegacyRecords,dropped_audit_count:checkpoint2.maintenance.droppedAuditTransitions,checkpoint_bytes:Buffer.byteLength(`${JSON.stringify(checkpoint2)}
|
|
1290
1290
|
`,"utf-8"),limit_bytes:PR_SUBSCRIPTION_LIMITS.maxCheckpointBytes,recovery_resets:checkpoint2.maintenance.resets};telemetry.prSubscriptionHealth(healthPayload),observeStoreHealth({directory,kind:"pr_subscription_health",payload:healthPayload})}function warnLegacyOverLimit(directory,size){let key2=canonicalRootKey(directory);if(legacyOverLimitWarned.has(key2))return;if(legacyOverLimitWarned.size>=32)legacyOverLimitWarned.delete(legacyOverLimitWarned.keys().next().value);legacyOverLimitWarned.set(key2,!0),log(`[pr-monitor] legacy subscriptions.jsonl is ${size} bytes (>${PR_SUBSCRIPTION_LIMITS.legacySourceMaxBytes}); refusing to fold it — archive or split the file so its subscriptions can be re-subscribed, then remove it (reported via /swarm pr status)`)}function warnMigrationCapacity(directory,records){let key2=canonicalRootKey(directory);if(migrationCapacityWarned.has(key2))return;if(migrationCapacityWarned.size>=32)migrationCapacityWarned.delete(migrationCapacityWarned.keys().next().value);migrationCapacityWarned.set(key2,!0),log(`[pr-monitor] legacy subscriptions.jsonl folds to ${records} records (>checkpoint capacity ${PR_SUBSCRIPTION_LIMITS.maxCheckpointRecords}); migration refused — archive or split the file so its subscriptions can be re-subscribed, then remove it`)}function overlayLegacy(directory,checkpoint2){let view={...checkpoint2.records},legacy=storePath3(directory),stat9=null;try{stat9=fs61.statSync(legacy)}catch{}if(stat9===null)return{view,usedLegacy:!1,absorbed:0,corruptLines:0,overLimit:!1,aborted:!1};if(stat9.size>PR_SUBSCRIPTION_LIMITS.legacySourceMaxBytes)return warnLegacyOverLimit(directory,stat9.size),{view,usedLegacy:!1,absorbed:0,corruptLines:0,overLimit:!0,aborted:!1};let migration=checkpoint2.migration;if(migration===null||!migration.done){let baselineRecords=migration?.baselineRecords??{...checkpoint2.records},sameGeneration=migration!==null&&stat9.size===migration.sourceBytes&&stat9.mtimeMs===migration.sourceMtimeMs,cursor=sameGeneration?migration.scannedBytes:0,discardingOversizeLine=sameGeneration?migration.discardingOversizeLine:!1;if(!sameGeneration&&migration!==null)view={...baselineRecords};let fold2=foldLegacyRegion(legacy,cursor,Number.MAX_SAFE_INTEGER,discardingOversizeLine);if(fold2.ioError)return{view,usedLegacy:!1,absorbed:0,corruptLines:0,overLimit:!1,aborted:!0};let absorbed2=mergeFoldedRecords(view,fold2.folded);return{view,usedLegacy:!0,absorbed:absorbed2,corruptLines:fold2.corruptLines,overLimit:!1,aborted:fold2.aborted}}if(stat9.size===migration.sourceBytes&&stat9.mtimeMs===migration.sourceMtimeMs)return{view,usedLegacy:!1,absorbed:0,corruptLines:0,overLimit:!1,aborted:!1};let fold=foldLegacyRegion(legacy,0,Number.MAX_SAFE_INTEGER);if(fold.ioError)return{view,usedLegacy:!1,absorbed:0,corruptLines:0,overLimit:!1,aborted:!0};let absorbed=mergeFoldedRecords(view,fold.folded);return{view,usedLegacy:!0,absorbed,corruptLines:fold.corruptLines,overLimit:!1,aborted:fold.aborted}}async function loadViewForRead(directory){if(ensurePrSubscriptionCoordinationImported(directory,!1)){let coordinationView=readCoordinationSubscriptions(directory)??{},checkpointRead=readCheckpoint(directory);if(checkpointRead.kind==="ok"&&sameProjectRoot(checkpointRead.value.rootPath,directory)&&checkpointRead.value.migration?.done===!1){let pendingCheckpoint=cloneCheckpoint(checkpointRead.value);pendingCheckpoint.records={...pendingCheckpoint.records,...coordinationView};let overlaid=overlayLegacy(directory,pendingCheckpoint);return{view:overlaid.view,recoverySource:overlaid.usedLegacy?"checkpoint+legacy":"checkpoint"}}return{view:coordinationView,recoverySource:"checkpoint"}}let read=readCheckpoint(directory),pendingCoordination=readCoordinationSubscriptions(directory);if(read.kind==="ok"&&sameProjectRoot(read.value.rootPath,directory)&&read.value.migration?.done===!1&&pendingCoordination!==null&&Object.keys(pendingCoordination).length>0){let pendingCheckpoint=cloneCheckpoint(read.value);pendingCheckpoint.records={...pendingCheckpoint.records,...pendingCoordination};let overlaid=overlayLegacy(directory,pendingCheckpoint);return{view:overlaid.view,recoverySource:overlaid.usedLegacy?"checkpoint+legacy":"checkpoint"}}if(read.kind==="ok"){if(!sameProjectRoot(read.value.rootPath,directory))return{view:{},recoverySource:"foreign"};if(read.value.migration?.done===!0){if(!legacyProjectionFingerprintMatches(directory,read.value)){if(fileExistsStrict(legacyArchivePath(directory)))return retireAuthoritativeLegacyShadow(directory),{view:{...read.value.records},recoverySource:"checkpoint"};let overlaid2=overlayLegacy(directory,read.value);if(overlaid2.usedLegacy&&!overlaid2.aborted)return{view:overlaid2.view,recoverySource:"checkpoint+legacy"}}return{view:{...read.value.records},recoverySource:"checkpoint"}}let overlaid=overlayLegacy(directory,read.value);return{view:overlaid.view,recoverySource:overlaid.usedLegacy?"checkpoint+legacy":"checkpoint"}}if(read.kind==="invalid"){let legacy=storePath3(directory),view2={},size=fileSizeOrNull(legacy);if(size!==null&&size<=PR_SUBSCRIPTION_LIMITS.legacySourceMaxBytes){let fold2=foldLegacyRegion(legacy,0,Number.MAX_SAFE_INTEGER);if(!fold2.ioError)mergeFoldedRecords(view2,fold2.folded)}else if(size!==null)warnLegacyOverLimit(directory,size);return{view:view2,recoverySource:"corrupt-recovered"}}let legacyPath=storePath3(directory),legacyStat;try{legacyStat=fs61.statSync(legacyPath)}catch{return{view:{},recoverySource:"empty"}}let legacySize=legacyStat.size;if(legacySize>PR_SUBSCRIPTION_LIMITS.legacySourceMaxBytes)return warnLegacyOverLimit(directory,legacySize),{view:{},recoverySource:"legacy-log"};let fold=foldLegacyRegion(legacyPath,0,Number.MAX_SAFE_INTEGER),view={};if(fold.ioError)return{view,recoverySource:"legacy-log"};if(mergeFoldedRecords(view,fold.folded),!fold.aborted)_internals85.beforeBootstrapLock(directory),await bootstrapCheckpointFromLegacy(directory);return{view,recoverySource:"legacy-log"}}async function bootstrapCheckpointFromLegacy(directory){let key2=canonicalRootKeyFresh(directory);if(bootstrapAttempted.has(key2))return;if(bootstrapAttempted.size>=32)bootstrapAttempted.delete(bootstrapAttempted.keys().next().value);bootstrapAttempted.set(key2,!0);try{await withEvidenceLock(directory,PR_SUBSCRIPTIONS_FILE,STORE_LOCK_AGENT,STORE_LOCK_TASK,async()=>{if(readCheckpoint(directory).kind!=="absent")return;let beforeFold;try{beforeFold=fs61.statSync(storePath3(directory))}catch{return}let lockedFold=foldLegacyRegion(storePath3(directory),0,PR_SUBSCRIPTION_LIMITS.legacySourceMaxBytes);if(lockedFold.ioError)return;let afterFold;try{afterFold=fs61.statSync(storePath3(directory))}catch{return}if(afterFold.size!==beforeFold.size||afterFold.mtimeMs!==beforeFold.mtimeMs)return;let foldedView={};mergeFoldedRecords(foldedView,lockedFold.folded);let checkpoint2=freshCheckpoint(directory);checkpoint2.records={...foldedView};let terminals=Object.values(foldedView).filter((rec)=>rec.status!=="active");checkpoint2.terminalSummary.lastTerminalAt=terminals.length?Math.max(...terminals.map((rec)=>rec.updatedAt)):null,checkpoint2.maintenance.corruptLegacyRecords=lockedFold.corruptLines,checkpoint2.migration={scannedBytes:lockedFold.nextByte,sourceBytes:beforeFold.size,sourceMtimeMs:beforeFold.mtimeMs,corruptLines:lockedFold.corruptLines,discardingOversizeLine:!1,baselineRecords:{},baselineTerminalSummary:{removed:0,expired:0,lastTerminalAt:null},done:!0,archived:!1,startedAt:Date.now()},checkpoint2.sequence=1,checkpoint2.updatedAt=Date.now();let auditCompaction=prepareAuditCompaction(directory);persistCheckpointWithAuditCompaction(directory,checkpoint2,auditCompaction);let archiveEvent=maybeArchiveLegacy(directory,checkpoint2);if(archiveEvent)checkpoint2.sequence+=1,checkpoint2.updatedAt=Date.now(),_internals85.writeCheckpointFile(directory,checkpoint2);if(flushAuditEvents(directory,[{kind:"migrate-complete"},...archiveEvent?[archiveEvent]:[]],checkpoint2.sequence,checkpoint2.maintenance),emitHealthTelemetry(directory,"migrate-complete",checkpoint2),archiveEvent)emitHealthTelemetry(directory,"archive",checkpoint2)},PR_SUBSCRIPTION_LIMITS.bootstrapLockTimeoutMs)}catch(err){log(`[pr-monitor] read-bootstrap skipped: ${storageErrorCode(err)}`)}}function loadViewForWrite(directory){let audit=[],dirty=!1,reboundForeign=!1,checkpoint2,read=readCheckpoint(directory),archiveDeferredForExternalRewrite=!1;if(read.kind==="ok"&&sameProjectRoot(read.value.rootPath,directory))checkpoint2=cloneCheckpoint(read.value);else if(read.kind==="ok"){let displaced=Object.keys(read.value.records).length,legacy2=storePath3(directory),foreignLegacyExists=!1;try{_internals85.statSync(legacy2),foreignLegacyExists=!0}catch(err){if(err.code!=="ENOENT")throw Error(`PR subscription foreign legacy log could not be inspected; refusing to rebind (${storageErrorCode(err)})`)}if(foreignLegacyExists){let foreignLegacy=foreignLegacySlotPath(directory);try{try{fs61.unlinkSync(foreignLegacy)}catch{}_internals85.renameWithRetry(legacy2,foreignLegacy)}catch(err){throw Error(`PR subscription foreign legacy log could not be quarantined; refusing to rebind (${storageErrorCode(err)})`)}}if(!quarantineCheckpoint(directory,"foreign"))throw Error("PR subscription foreign checkpoint could not be quarantined; refusing to rebind");checkpoint2=freshCheckpoint(directory),checkpoint2.maintenance.resets+=read.value.maintenance.resets+1,audit.push({kind:"foreign-rebind"}),dirty=!0,log(`[pr-monitor] foreign checkpoint quarantined (${displaced} displaced records, recorded root ${read.value.rootPath}); store rebound to ${directory}`),reboundForeign=!0}else if(read.kind==="invalid")quarantineCheckpoint(directory,"corrupt"),checkpoint2=freshCheckpoint(directory),checkpoint2.maintenance.resets+=1,audit.push({kind:"corrupt-quarantine"}),dirty=!0,log(`[pr-monitor] corrupt checkpoint quarantined; store rebound to ${directory}`);else checkpoint2=freshCheckpoint(directory);if(!reboundForeign&&checkpoint2.migration!==null)try{reconcileLegacyArchiveStaging(directory,checkpoint2.migration)}catch(err){throw Error(`PR subscription legacy archive staging could not be reconciled; refusing mutation (${storageErrorCode(err)})`)}let legacy=storePath3(directory),legacyStat=null;try{legacyStat=_internals85.statSync(legacy)}catch(err){if(err.code!=="ENOENT")throw Error(`PR subscription legacy store could not be inspected; refusing mutation (${storageErrorCode(err)})`)}let view;if(reboundForeign)legacyStat=null;if(legacyStat===null){view={...checkpoint2.records};let importedShadowExists=fileExistsStrict(importedShadowPath(legacy)),archiveExists=fileExistsStrict(legacyArchivePath(directory));if(checkpoint2.migration?.done&&!checkpoint2.migration.archived&&(archiveExists||!importedShadowExists))checkpoint2.migration.archived=!0,dirty=!0;return{checkpoint:checkpoint2,view,audit,dirty}}if(legacyStat.size>PR_SUBSCRIPTION_LIMITS.legacySourceMaxBytes)throw warnLegacyOverLimit(directory,legacyStat.size),Error(`PR subscription legacy store exceeds the ${PR_SUBSCRIPTION_LIMITS.legacySourceMaxBytes}-byte migration ceiling; refusing mutation until the file is archived or split`);if(checkpoint2.migration?.done===!0&&checkpoint2.migration.archived&&legacyProjectionFingerprintMatches(directory,checkpoint2))checkpoint2.migration.archived=!1,dirty=!0;if(checkpoint2.migration?.done===!0&&!legacyProjectionFingerprintMatches(directory,checkpoint2)){try{fs61.unlinkSync(projectionMarkerPath(legacy))}catch(error93){if(error93.code!=="ENOENT")throw error93}checkpoint2.migration=null,dirty=!0,archiveDeferredForExternalRewrite=!0}let{size:legacySize,mtimeMs:legacyMtime}=legacyStat,migration=checkpoint2.migration;if(migration===null||!migration.done){let baselineRecords=migration?.baselineRecords??{...checkpoint2.records},baselineTerminalSummary=migration?.baselineTerminalSummary??{...checkpoint2.terminalSummary},sameGeneration=migration!==null&&legacySize===migration.sourceBytes&&legacyMtime===migration.sourceMtimeMs,cursor=sameGeneration?migration.scannedBytes:0,startedAt=sameGeneration?migration.startedAt:Date.now(),corruptTotal=sameGeneration?migration.corruptLines:0,discardingOversizeLine=sameGeneration?migration.discardingOversizeLine:!1;if(!sameGeneration&&migration!==null)checkpoint2.records={...baselineRecords},checkpoint2.terminalSummary={...baselineTerminalSummary},checkpoint2.maintenance.corruptLegacyRecords=Math.max(0,checkpoint2.maintenance.corruptLegacyRecords-migration.corruptLines);view={...checkpoint2.records};let capacityRefused=!1,foldedThisOperation=0;while(!0){let chunkStart=cursor,remainingOperationBytes=Math.max(1,PR_SUBSCRIPTION_LIMITS.migrationMaxBytesPerOperation-foldedThisOperation),fold=foldLegacyRegion(legacy,cursor,Math.min(PR_SUBSCRIPTION_LIMITS.migrationChunkBytes,remainingOperationBytes),discardingOversizeLine);if(fold.ioError)throw Error("PR subscription legacy migration read failed (I/O error)");if(mergeFoldedRecords(view,fold.folded),checkpoint2.maintenance.corruptLegacyRecords+=fold.corruptLines,corruptTotal+=fold.corruptLines,discardingOversizeLine=fold.discardingOversizeLine,cursor=fold.nextByte,foldedThisOperation+=Math.max(0,cursor-chunkStart),fold.aborted){let progress=cloneCheckpoint(checkpoint2);return progress.records={...view},progress.migration={scannedBytes:cursor,sourceBytes:legacySize,sourceMtimeMs:legacyMtime,corruptLines:corruptTotal,discardingOversizeLine,baselineRecords:{...baselineRecords},baselineTerminalSummary:{...baselineTerminalSummary},done:!1,archived:!1,startedAt},progress.updatedAt=Date.now(),progress.sequence+=1,writeCheckpointFile(directory,progress),checkpoint2.sequence=progress.sequence,log(`[pr-monitor] legacy scan aborted by an I/O error after ${cursor} bytes — migration stays incomplete and will retry`),dirty=!0,{checkpoint:checkpoint2,view,audit,dirty}}let compactEvent=compactTerminalRecords(view,checkpoint2);if(compactEvent)audit.push(compactEvent);if(Object.keys(view).length>PR_SUBSCRIPTION_LIMITS.maxCheckpointRecords){capacityRefused=!0,warnMigrationCapacity(directory,Object.keys(view).length);break}let deferLargeInitialGeneration=!sameGeneration&&legacySize>PR_SUBSCRIPTION_LIMITS.migrationMaxBytesPerOperation&&foldedThisOperation>=PR_SUBSCRIPTION_LIMITS.migrationMaxBytesPerOperation;if(!fold.eof||deferLargeInitialGeneration){let progress=cloneCheckpoint(checkpoint2);if(progress.records={...view},progress.migration={scannedBytes:cursor,sourceBytes:legacySize,sourceMtimeMs:legacyMtime,corruptLines:corruptTotal,discardingOversizeLine,baselineRecords:{...baselineRecords},baselineTerminalSummary:{...baselineTerminalSummary},done:!1,archived:!1,startedAt},progress.updatedAt=Date.now(),progress.sequence+=1,writeCheckpointFile(directory,progress),checkpoint2.sequence=progress.sequence,dirty=!0,foldedThisOperation>=PR_SUBSCRIPTION_LIMITS.migrationMaxBytesPerOperation)throw Error(`PR subscription legacy migration is in progress (${cursor}/${legacySize} bytes); retry the operation to continue`);continue}checkpoint2.migration={scannedBytes:cursor,sourceBytes:legacySize,sourceMtimeMs:legacyMtime,corruptLines:corruptTotal,discardingOversizeLine:!1,baselineRecords:{},baselineTerminalSummary:{removed:0,expired:0,lastTerminalAt:null},done:!0,archived:archiveDeferredForExternalRewrite,startedAt},audit.push({kind:"migrate-complete"}),dirty=!0;break}if(capacityRefused)return{checkpoint:checkpoint2,view,audit,dirty:!1};return{checkpoint:checkpoint2,view,audit,dirty}}if(!legacyProjectionFingerprintMatches(directory,checkpoint2)){let legacyPath=storePath3(directory);if(fileExistsStrict(projectionMarkerPath(legacyPath))){let overlaid=overlayLegacy(directory,checkpoint2);return{checkpoint:checkpoint2,view:overlaid.view,audit,dirty}}retireAuthoritativeLegacyShadow(directory)}return{checkpoint:checkpoint2,view:{...checkpoint2.records},audit,dirty}}function finalizeWrite(directory,loaded,opAudit){let{checkpoint:checkpoint2}=loaded,events=[...loaded.audit,...opAudit],compactEvent=compactTerminalRecords(loaded.view,checkpoint2);if(compactEvent)events.push(compactEvent);if(!loaded.dirty&&events.length===0){let archiveEvent2=maybeArchiveLegacy(directory,checkpoint2);if(!archiveEvent2)return;checkpoint2.updatedAt=Date.now(),checkpoint2.sequence+=1;let auditCompaction2=prepareAuditCompaction(directory);persistCheckpointWithAuditCompaction(directory,checkpoint2,auditCompaction2),flushAuditEvents(directory,[archiveEvent2],checkpoint2.sequence,checkpoint2.maintenance),cleanupStaleLegacyArchive(directory),emitHealthTelemetry(directory,"archive",checkpoint2);return}checkpoint2.records=loaded.view,checkpoint2.updatedAt=Date.now(),checkpoint2.rootPath=path99.resolve(directory),checkpoint2.sequence+=1;let auditCompaction=prepareAuditCompaction(directory);if(persistCheckpointWithAuditCompaction(directory,checkpoint2,auditCompaction),checkpoint2.migration?.done===!0){let legacyPath=storePath3(directory);try{let legacyStat=fs61.statSync(legacyPath);if(legacyStat.size!==checkpoint2.migration.sourceBytes||legacyStat.mtimeMs!==checkpoint2.migration.sourceMtimeMs){let legacyPayload=Object.values(checkpoint2.records).map((entry)=>JSON.stringify(entry)).join(`
|
|
1291
1291
|
`)+(Object.keys(checkpoint2.records).length>0?`
|
|
1292
|
-
`:"");writeLegacyStoreFile(legacyPath,legacyPayload),fs61.writeFileSync(projectionMarkerPath(legacyPath),"","utf-8"),legacyStat=fs61.statSync(legacyPath)}checkpoint2.migration.sourceBytes=legacyStat.size,checkpoint2.migration.scannedBytes=legacyStat.size,checkpoint2.migration.sourceMtimeMs=legacyStat.mtimeMs}catch{}}flushAuditEvents(directory,events,checkpoint2.sequence,checkpoint2.maintenance);let archiveEvent=maybeArchiveLegacy(directory,checkpoint2);if(archiveEvent)events.push(archiveEvent),checkpoint2.sequence+=1,_internals85.writeCheckpointFile(directory,checkpoint2),flushAuditEvents(directory,[archiveEvent],checkpoint2.sequence,checkpoint2.maintenance);cleanupStaleLegacyArchive(directory);let coordinationView=readCoordinationSubscriptions(directory);if(coordinationView!==null&&!isDeepStrictEqualByJson(coordinationView,loaded.view))persistCoordinationSubscriptions(directory,{...loaded.view});for(let kind of["compact","migrate-complete","archive","foreign-rebind","corrupt-quarantine"])if(events.some((event)=>event.kind===kind))emitHealthTelemetry(directory,kind,checkpoint2)}async function subscribe(directory,input){if(!directory||directory.trim()==="")throw Error("directory is required");if(!input.sessionID||input.sessionID.trim()==="")throw Error("sessionID is required and must be non-empty");if(!input.repoFullName||input.repoFullName.trim()==="")throw Error("repoFullName is required and must be non-empty");if(!input.prUrl||input.prUrl.trim()==="")throw Error("prUrl is required and must be non-empty");if(!input.prNumber||!Number.isInteger(input.prNumber)||input.prNumber<=0)throw Error("prNumber is required and must be a positive integer");let correlationId=buildCorrelationId(input.sessionID,input.repoFullName,input.prNumber),now=Date.now();return withEvidenceLock(directory,PR_SUBSCRIPTIONS_FILE,STORE_LOCK_AGENT,STORE_LOCK_TASK,async()=>{if(canUseCoordinationWritePath(directory)){let view=readCoordinationSubscriptions(directory)??{},match2=Object.values(view).find((r)=>r.correlationId===correlationId&&r.status==="active");if(match2)return onSubscriptionCreated?.(directory,match2),match2;if(input.maxSubscriptions===void 0||input.maxSubscriptions>0){let limit=input.maxSubscriptions!==void 0?input.maxSubscriptions:PR_SUBSCRIPTION_LIMITS.defaultMaxActiveSubscriptions,activeCount=Object.values(view).filter((r)=>r.status==="active").length;if(activeCount>=limit)throw Error(`PR subscription limit reached: ${activeCount}/${limit}`)}let record4={correlationId,sessionID:input.sessionID,prNumber:input.prNumber,repoFullName:input.repoFullName,prUrl:input.prUrl,...input.forge?{forge:input.forge}:{},lastCheckedAt:now,isWatching:!0,hasUnaddressedEvents:!1,status:"active",createdAt:now,updatedAt:now,errorCount:0};return validateRecord3(record4),view[correlationId]=record4,persistCoordinationSubscriptions(directory,view,!0,[{kind:"subscribe",correlationId}]),onSubscriptionCreated?.(directory,record4),record4}let loaded=loadViewForWrite(directory),match=Object.values(loaded.view).find((r)=>r.correlationId===correlationId&&r.status==="active");if(match)return onSubscriptionCreated?.(directory,match),finalizeWrite(directory,loaded,[]),match;if(input.maxSubscriptions===void 0||input.maxSubscriptions>0){let limit=input.maxSubscriptions!==void 0?input.maxSubscriptions:PR_SUBSCRIPTION_LIMITS.defaultMaxActiveSubscriptions,activeCount=Object.values(loaded.view).filter((r)=>r.status==="active").length;if(activeCount>=limit)throw Error(`PR subscription limit reached: ${activeCount}/${limit}`)}let record3={correlationId,sessionID:input.sessionID,prNumber:input.prNumber,repoFullName:input.repoFullName,prUrl:input.prUrl,...input.forge?{forge:input.forge}:{},lastCheckedAt:now,isWatching:!0,hasUnaddressedEvents:!1,status:"active",createdAt:now,updatedAt:now,errorCount:0};return validateRecord3(record3),loaded.view[correlationId]=record3,loaded.dirty=!0,finalizeWrite(directory,loaded,[{kind:"subscribe",correlationId}]),onSubscriptionCreated?.(directory,record3),record3})}async function unsubscribe(directory,correlationId){if(!correlationId)return null;return withEvidenceLock(directory,PR_SUBSCRIPTIONS_FILE,STORE_LOCK_AGENT,STORE_LOCK_TASK,async()=>{if(canUseCoordinationWritePath(directory)){let view=readCoordinationSubscriptions(directory)??{},match2=Object.values(view).find((r)=>r.correlationId===correlationId&&r.status==="active");if(!match2)return null;let removed2={...match2,status:"removed",isWatching:!1,updatedAt:Date.now()};return view[correlationId]=removed2,persistCoordinationSubscriptions(directory,view,!0,[{kind:"unsubscribe",correlationId}]),removed2}let loaded=loadViewForWrite(directory),match=Object.values(loaded.view).find((r)=>r.correlationId===correlationId&&r.status==="active");if(!match)return finalizeWrite(directory,loaded,[]),null;let now=Date.now(),removed={...match,status:"removed",isWatching:!1,updatedAt:now};return loaded.view[correlationId]=removed,loaded.dirty=!0,finalizeWrite(directory,loaded,[{kind:"unsubscribe",correlationId}]),removed})}async function listActive(directory){let{view}=await loadViewForRead(directory);return Object.values(view).filter((r)=>r.status==="active")}async function lookupByPr(directory,repoFullName,prNumber){let{view}=await loadViewForRead(directory);for(let record3 of Object.values(view))if(record3.status==="active"&&record3.repoFullName===repoFullName&&record3.prNumber===prNumber)return record3;return null}async function findSubscriptionRecordForPrUrl(directory,key2){if(key2.repoFullName!==void 0&&key2.prNumber!==void 0){let record3=await lookupByPr(directory,key2.repoFullName,key2.prNumber);if(record3&&(!key2.sessionID||record3.sessionID===key2.sessionID)&&(key2.prUrl===void 0||record3.prUrl===key2.prUrl||subscriptionPrUrlMatches(record3,key2.prUrl)))return record3;if(!key2.sessionID)return null}if(key2.prUrl===void 0&&key2.repoFullName===void 0)return null;if(key2.prUrl===void 0){let active2=await listActive(directory);for(let record3 of active2){if(key2.sessionID&&record3.sessionID!==key2.sessionID)continue;if(record3.repoFullName===key2.repoFullName&&record3.prNumber===key2.prNumber)return record3}return null}let active=await listActive(directory);for(let record3 of active){if(key2.sessionID&&record3.sessionID!==key2.sessionID)continue;if(record3.prUrl===key2.prUrl||subscriptionPrUrlMatches(record3,key2.prUrl))return record3}return null}function subscriptionPrUrlMatches(record3,prUrl){let left=canonicalForgePrUrl(record3.prUrl,record3.forge),right=canonicalForgePrUrl(prUrl,record3.forge);return left!==null&&left===right}async function updateSnapshot(directory,correlationId,updates){if(!correlationId)return null;return withEvidenceLock(directory,PR_SUBSCRIPTIONS_FILE,STORE_LOCK_AGENT,STORE_LOCK_TASK,async()=>{let existingCoordination=readCoordinationSubscriptions(directory);if(existingCoordination!==null&&!fileExistsStrict(storePath3(directory))&&!hasLegacyReconciliationArtifacts(directory)){let match2=Object.values(existingCoordination).find((r)=>r.correlationId===correlationId&&r.status==="active");if(!match2)return null;if(!snapshotUpdateHasChanges(match2,updates))return match2;let updated2={...match2,...updates,correlationId,sessionID:match2.sessionID,repoFullName:match2.repoFullName,prNumber:match2.prNumber,prUrl:match2.prUrl,createdAt:match2.createdAt,updatedAt:Date.now()};return validateRecord3(updated2),existingCoordination[correlationId]=updated2,persistCoordinationSubscriptions(directory,existingCoordination),updated2}if(canUseCoordinationWritePath(directory)){let view=readCoordinationSubscriptions(directory)??{},match2=Object.values(view).find((r)=>r.correlationId===correlationId&&r.status==="active");if(!match2)return null;if(!snapshotUpdateHasChanges(match2,updates))return match2;let updated2={...match2,...updates,correlationId,sessionID:match2.sessionID,repoFullName:match2.repoFullName,prNumber:match2.prNumber,prUrl:match2.prUrl,createdAt:match2.createdAt,updatedAt:Date.now()};return validateRecord3(updated2),view[correlationId]=updated2,persistCoordinationSubscriptions(directory,view),updated2}let loaded=loadViewForWrite(directory),match=Object.values(loaded.view).find((r)=>r.correlationId===correlationId&&r.status==="active");if(!match)return finalizeWrite(directory,loaded,[]),null;if(!snapshotUpdateHasChanges(match,updates))return finalizeWrite(directory,loaded,[]),match;let updated={...match,...updates,correlationId,sessionID:match.sessionID,repoFullName:match.repoFullName,prNumber:match.prNumber,prUrl:match.prUrl,createdAt:match.createdAt,updatedAt:Date.now()};return validateRecord3(updated),loaded.view[correlationId]=updated,loaded.dirty=!0,finalizeWrite(directory,loaded,[]),updated})}async function sweepStale(directory,ttlDays,mergedPrs){if(!ttlDays||ttlDays<=0)return 0;let ttlMs=ttlDays*86400000,now=Date.now();try{return await withEvidenceLock(directory,PR_SUBSCRIPTIONS_FILE,STORE_LOCK_AGENT,STORE_LOCK_TASK,async()=>{if(canUseCoordinationWritePath(directory)){let view=readCoordinationSubscriptions(directory)??{},swept2=0,expiredCorrelationIds=[],now2=Date.now();for(let record3 of Object.values(view)){if(record3.status!=="active")continue;let prKey=`${record3.repoFullName}::${record3.prNumber}`,isMerged=mergedPrs?.has(prKey)??!1,isStale=now2-record3.updatedAt>ttlMs;if(isMerged||isStale&&!record3.hasUnaddressedEvents)view[record3.correlationId]={...record3,status:"expired",isWatching:!1,updatedAt:now2},expiredCorrelationIds.push(record3.correlationId),swept2+=1}if(swept2>0)persistCoordinationSubscriptions(directory,view,!0,expiredCorrelationIds.map((correlationId)=>({kind:"expired",correlationId})));return swept2}let loaded=loadViewForWrite(directory),opAudit=[],swept=0;for(let record3 of Object.values(loaded.view)){if(record3.status!=="active")continue;let prKey=`${record3.repoFullName}::${record3.prNumber}`,isMerged=mergedPrs?.has(prKey)??!1,isStale=now-record3.updatedAt>ttlMs;if(isMerged){loaded.view[record3.correlationId]={...record3,status:"expired",isWatching:!1,updatedAt:now},swept+=1,opAudit.push({kind:"expired",correlationId:record3.correlationId}),loaded.dirty=!0,log(`[pr-monitor] Swept subscription: merged/closed: ${prKey}`);continue}if(isStale&&!record3.hasUnaddressedEvents)loaded.view[record3.correlationId]={...record3,status:"expired",isWatching:!1,updatedAt:now},swept+=1,opAudit.push({kind:"expired",correlationId:record3.correlationId}),loaded.dirty=!0,log(`[pr-monitor] Swept subscription: stale (TTL ${ttlDays}d): ${prKey}`)}return finalizeWrite(directory,loaded,opAudit),swept})}catch(err){return log(`[pr-monitor] sweepStale failed: ${err instanceof Error?err.message:String(err)}`),0}}async function getPrSubscriptionHealth(directory){try{let coordinationView=readCoordinationSubscriptions(directory),read=readCheckpoint(directory),migrationPending=read.kind==="ok"&&sameProjectRoot(read.value.rootPath,directory)&&read.value.migration?.done===!1;if(coordinationView!==null&&Object.keys(coordinationView).length>0&&!migrationPending){let audit2=auditStats(directory),archiveBytes2=fileSizeOrNull(legacyArchivePath(directory))??0,checkpointBytes2=fileSizeOrNull(checkpointPath(directory))??0,health2=healthFromView(coordinationView,buildCoordinationProjectionCheckpoint(directory,coordinationView));return health2.recoverySource="checkpoint",applyFileStats(health2,checkpointBytes2,audit2,archiveBytes2),health2}let audit=auditStats(directory),archiveBytes=fileSizeOrNull(legacyArchivePath(directory))??0,checkpointBytes=fileSizeOrNull(checkpointPath(directory))??0,legacySize=fileSizeOrNull(storePath3(directory)),legacyOverLimit=legacySize!==null&&legacySize>PR_SUBSCRIPTION_LIMITS.legacySourceMaxBytes,health;if(read.kind==="ok"&&!sameProjectRoot(read.value.rootPath,directory))health=emptyHealth2(),health.recoverySource="foreign";else if(read.kind==="invalid"){if(legacySize!==null&&!legacyOverLimit){let fold=foldLegacyRegion(storePath3(directory),0,Number.MAX_SAFE_INTEGER),view={};if(!fold.ioError)mergeFoldedRecords(view,fold.folded);health=healthFromView(view,freshCheckpoint(directory)),health.corruptLegacyRecords=fold.corruptLines}else health=emptyHealth2();health.recoverySource="corrupt-recovered"}else if(read.kind==="absent"){if(legacySize===null||legacyOverLimit)health=emptyHealth2();else{let fold=foldLegacyRegion(storePath3(directory),0,Number.MAX_SAFE_INTEGER),view={};if(!fold.ioError)mergeFoldedRecords(view,fold.folded);health=healthFromView(view,freshCheckpoint(directory)),health.corruptLegacyRecords=fold.corruptLines}health.recoverySource=legacySize===null?"empty":"legacy-log"}else{let pendingCheckpoint=migrationPending&&coordinationView!==null?(()=>{let merged=cloneCheckpoint(read.value);return merged.records={...merged.records,...coordinationView},merged})():read.value,overlaid=overlayLegacy(directory,pendingCheckpoint);health=healthFromView(overlaid.view,read.value),health.recoverySource=overlaid.usedLegacy?"checkpoint+legacy":"checkpoint"}return health.legacyOverLimit=legacyOverLimit,applyFileStats(health,checkpointBytes,audit,archiveBytes),health}catch(err){return log(`[pr-monitor] getPrSubscriptionHealth failed: ${storageErrorCode(err)}`),emptyHealth2()}}function applyFileStats(health,checkpointBytes,audit,archiveBytes){health.checkpointBytes=checkpointBytes,health.pressurePct=checkpointBytes===0?0:Math.round(checkpointBytes/health.checkpointLimitBytes*1000)/10,health.auditLines=audit.lines,health.auditBytes=audit.bytes,health.legacyArchiveBytes=archiveBytes}function emptyHealth2(){return{schemaVersion:1,sequence:0,checkpointAgeMs:null,checkpointBytes:0,checkpointLimitBytes:PR_SUBSCRIPTION_LIMITS.maxCheckpointBytes,pressurePct:0,activeCount:0,removedCount:0,expiredCount:0,terminalSummary:{removed:0,expired:0,lastTerminalAt:null},auditLines:0,auditBytes:0,auditLimitBytes:PR_SUBSCRIPTION_LIMITS.auditMaxBytesHigh,compactions:0,corruptLegacyRecords:0,droppedAuditTransitions:0,resets:0,recoverySource:"empty",migration:null,legacyArchiveBytes:0,legacyOverLimit:!1}}function healthFromView(view,checkpoint2){let records=Object.values(view),health=emptyHealth2();return health.sequence=checkpoint2.sequence,health.checkpointAgeMs=checkpoint2.sequence>0?Date.now()-checkpoint2.updatedAt:null,health.activeCount=records.filter((r)=>r.status==="active").length,health.removedCount=records.filter((r)=>r.status==="removed").length,health.expiredCount=records.filter((r)=>r.status==="expired").length,health.terminalSummary={...checkpoint2.terminalSummary},health.compactions=checkpoint2.maintenance.compactions,health.corruptLegacyRecords=checkpoint2.maintenance.corruptLegacyRecords,health.droppedAuditTransitions=checkpoint2.maintenance.droppedAuditTransitions,health.resets=checkpoint2.maintenance.resets,health.migration=checkpoint2.migration?{done:checkpoint2.migration.done,scannedBytes:checkpoint2.migration.scannedBytes,sourceBytes:checkpoint2.migration.sourceBytes}:null,health}var PR_SUBSCRIPTIONS_FILE="pr-monitor/subscriptions.jsonl",PR_SUBSCRIPTIONS_CHECKPOINT_FILE="pr-monitor/subscriptions.checkpoint.json",PR_SUBSCRIPTIONS_AUDIT_FILE="pr-monitor/subscriptions.audit.jsonl",LEGACY_ARCHIVE_FILE="pr-monitor/subscriptions.legacy.jsonl",FOREIGN_CHECKPOINT_FILE="pr-monitor/subscriptions.checkpoint.foreign.json",CORRUPT_CHECKPOINT_FILE="pr-monitor/subscriptions.checkpoint.corrupt.json",FOREIGN_LEGACY_FILE="pr-monitor/subscriptions.legacy.foreign.jsonl",PR_SUBSCRIPTION_COORDINATION_NAMESPACE="background.pr-subscription",STORE_LOCK_AGENT="pr-monitor",STORE_LOCK_TASK="pr-subscriptions",PR_SUBSCRIPTION_LIMITS,onSubscriptionCreated=null,prMonitorWorkerHandlers,MAX_PR_MONITOR_WORKER_HANDLERS=64,RecordSchema,TerminalSummarySchema,MigrationSchema,MaintenanceSchema,CheckpointSchema,PrSubscriptionCapacityError,legacyOverLimitWarned,migrationCapacityWarned,bootstrapAttempted,_internals85;var init_pr_subscriptions=__esm(()=>{init_zod();init_db();init_lock();init_learning_health();init_utils2();init_forge_provider();init_telemetry();init_utils();init_atomic_write();init_canonical_root();PR_SUBSCRIPTION_LIMITS={readChunkBytes:65536,maxRecordBytes:65536,migrationChunkBytes:1048576,migrationMaxBytesPerOperation:8388608,legacySourceMaxBytes:67108864,defaultMaxActiveSubscriptions:20,maxCheckpointRecords:512,maxCheckpointBytes:262144,checkpointHardReadBytes:1048576,terminalRecordsHigh:60,terminalRecordsLow:30,terminalMaxAgeMs:2592000000,auditMaxLinesHigh:500,auditMaxLinesLow:250,auditMaxBytesHigh:131072,auditMaxBytesLow:65536,legacyArchiveTtlMs:604800000,bootstrapLockTimeoutMs:5000};prMonitorWorkerHandlers=new Map;RecordSchema=exports_external.object({correlationId:exports_external.string().min(1),sessionID:exports_external.string().min(1),prNumber:exports_external.number().int().positive(),repoFullName:exports_external.string().regex(/^[^/\s]+(?:\/[^/\s]+)+$/,"Must be owner/repo format (GitLab nested namespaces allowed)"),prUrl:exports_external.string().min(1),forge:exports_external.object({provider:exports_external.literal("gitlab"),host:exports_external.string().min(1)}).optional(),headRefOid:exports_external.string().optional(),lastCheckedAt:exports_external.number(),lastCommentId:exports_external.string().optional(),lastCheckRunSet:exports_external.string().optional(),mergeableState:exports_external.string().optional(),mergeGroupRunStatus:exports_external.string().optional(),mergeGroupRunConclusion:exports_external.string().optional(),mergeGroupRunHtmlUrl:exports_external.string().optional(),isWatching:exports_external.boolean(),hasUnaddressedEvents:exports_external.boolean(),status:exports_external.enum(["active","removed","expired"]),createdAt:exports_external.number(),updatedAt:exports_external.number(),errorCount:exports_external.number().int().min(0),customPollIntervalSeconds:exports_external.number().int().positive().optional(),customFailureThreshold:exports_external.number().int().min(0).optional(),customCooldownSeconds:exports_external.number().int().min(0).optional()}).strict().superRefine((record3,ctx)=>{if(isForgePrUrl(record3.prUrl))return;if(record3.forge&&isForgePrUrl(record3.prUrl,{provider:record3.forge.provider,host:record3.forge.host}))return;ctx.addIssue({code:exports_external.ZodIssueCode.custom,path:["prUrl"],message:"Must be a valid PR URL (GitHub /pull/N or GitLab /-/merge_requests/N)"})}),TerminalSummarySchema=exports_external.object({removed:exports_external.number().int().min(0),expired:exports_external.number().int().min(0),lastTerminalAt:exports_external.number().int().nullable()}).strict(),MigrationSchema=exports_external.object({scannedBytes:exports_external.number().int().nonnegative(),sourceBytes:exports_external.number().int().nonnegative(),sourceMtimeMs:exports_external.number().nonnegative(),corruptLines:exports_external.number().int().nonnegative(),discardingOversizeLine:exports_external.boolean().optional().default(!1),baselineRecords:exports_external.record(exports_external.string(),RecordSchema).optional().default({}),baselineTerminalSummary:TerminalSummarySchema.optional().default({removed:0,expired:0,lastTerminalAt:null}),done:exports_external.boolean(),archived:exports_external.boolean(),startedAt:exports_external.number().int().nonnegative()}).strict(),MaintenanceSchema=exports_external.object({compactions:exports_external.number().int().nonnegative(),droppedAuditTransitions:exports_external.number().int().nonnegative(),corruptLegacyRecords:exports_external.number().int().nonnegative(),lastCompactedAt:exports_external.number().int().nullable(),resets:exports_external.number().int().nonnegative()}).strict(),CheckpointSchema=exports_external.object({schemaVersion:exports_external.literal(1),sequence:exports_external.number().int().positive(),rootPath:exports_external.string().min(1).max(4096),updatedAt:exports_external.number().int().nonnegative(),records:exports_external.record(exports_external.string(),RecordSchema),terminalSummary:TerminalSummarySchema,migration:MigrationSchema.nullable(),maintenance:MaintenanceSchema}).strict();PrSubscriptionCapacityError=class PrSubscriptionCapacityError extends Error{constructor(message){super(message);this.name="PrSubscriptionCapacityError"}};legacyOverLimitWarned=new Map;migrationCapacityWarned=new Map;bootstrapAttempted=new Map;_internals85={afterCheckpointFstat:(_filePath)=>{},archiveStatSync:fs61.statSync,auditCompactionWrite:atomicWriteSwarmFileSync,beforeBootstrapLock:(_directory2)=>{},beforeArchiveLegacy:(_directory2)=>{},beforeArchiveRename:(_directory2)=>{},foldLegacyRegion,legacyCloseSync:fs61.closeSync,legacyFstatSync:fs61.fstatSync,mergeFoldedRecords,readSync:fs61.readSync,renameWithRetry:renameWithRetry5,sameProjectRoot,statSync:fs61.statSync,writeCheckpointFile}});var exports_state={};__export(exports_state,{updateTaskWorkflowCache:()=>updateTaskWorkflowCache,updateAgentEventTime:()=>updateAgentEventTime,takeReviewerScopeGeneration:()=>takeReviewerScopeGeneration,sweepStaleSessions:()=>sweepStaleSessions,swarmState:()=>swarmState,startReviewerScopeGeneration:()=>startReviewerScopeGeneration,startAgentSession:()=>startAgentSession,settleReviewerScopeMergeback:()=>settleReviewerScopeMergeback,setSessionEnvironment:()=>setSessionEnvironment,setSessionBudget:()=>setSessionBudget,setLiveContextWindow:()=>setLiveContextWindow,setFinalPromptPressure:()=>setFinalPromptPressure,setFinalAccountingWarningBand:()=>setFinalAccountingWarningBand,setCriticalShownIds:()=>setCriticalShownIds,reviewerScopeGenerationHasDeclaredOverlap:()=>reviewerScopeGenerationHasDeclaredOverlap,resolveSessionWorkspaceDirectory:()=>resolveSessionWorkspaceDirectory,resolveInitialTurboMode:()=>resolveInitialTurboMode,resetSwarmStatePreservingSingletons:()=>resetSwarmStatePreservingSingletons,resetSwarmState:()=>resetSwarmState,resetModifiedFilesForTask:()=>resetModifiedFilesForTask,reserveStageBRouteEvidence:()=>reserveStageBRouteEvidence,rehydrateSessionFromDisk:()=>rehydrateSessionFromDisk,rehydratePrSubscriptions:()=>rehydratePrSubscriptions,recordStageBRouteEvidence:()=>recordStageBRouteEvidence,recordStageBCompletion:()=>recordStageBCompletion,recordSessionWorkspaceRoot:()=>recordSessionWorkspaceRoot,recordReviewerScopeGenerationFileFingerprint:()=>recordReviewerScopeGenerationFileFingerprint,recordReviewerScopeGenerationFile:()=>recordReviewerScopeGenerationFile,recordReviewerScopeGenerationCaptureFailure:()=>recordReviewerScopeGenerationCaptureFailure,recordPhaseAgentDispatch:()=>recordPhaseAgentDispatch,recordModifiedFilesForTask:()=>recordModifiedFilesForTask,recordModifiedFileForTask:()=>recordModifiedFileForTask,pruneOldWindows:()=>pruneOldWindows,peekReviewerScopeGenerationClaim:()=>peekReviewerScopeGenerationClaim,peekReviewerScopeGenerationByStatus:()=>peekReviewerScopeGenerationByStatus,peekReadyReviewerScopeGeneration:()=>peekReadyReviewerScopeGeneration,maybeSweepStaleSessions:()=>maybeSweepStaleSessions,markStageBRouteRequired:()=>markStageBRouteRequired,markReviewerScopeGenerationReady:()=>markReviewerScopeGenerationReady,markReviewerScopeGenerationNoChange:()=>markReviewerScopeGenerationNoChange,markReviewerScopeGenerationMergebackPending:()=>markReviewerScopeGenerationMergebackPending,isStageBRouteRequired:()=>isStageBRouteRequired,isReviewerScopeGenerationCurrent:()=>isReviewerScopeGenerationCurrent,isCouncilGateActive:()=>isCouncilGateActive,incrementGateDenialCount:()=>incrementGateDenialCount,hasModifiedFilesForTask:()=>hasModifiedFilesForTask,hasBothStageBCompletions:()=>hasBothStageBCompletions,hasActiveTurboMode:()=>hasActiveTurboMode,hasActiveLeanTurbo:()=>hasActiveLeanTurbo,hasActiveFullAuto:()=>hasActiveFullAuto,hasActiveEpicMode:()=>hasActiveEpicMode,getTaskState:()=>getTaskState,getStageBRouteEvidence:()=>getStageBRouteEvidence,getSessionEnvironment:()=>getSessionEnvironment,getSessionBudgetTokens:()=>getSessionBudgetTokens,getSessionBudgetPct:()=>getSessionBudgetPct,getRunContext:()=>getRunContext,getReviewerScopeOwnershipHistory:()=>getReviewerScopeOwnershipHistory,getReviewerScopeGenerationForCoderCall:()=>getReviewerScopeGenerationForCoderCall,getResolvedAutoProceed:()=>getResolvedAutoProceed,getRehydrationCache:()=>getRehydrationCache,getModifiedFilesForTask:()=>getModifiedFilesForTask,getLiveContextWindow:()=>getLiveContextWindow,getLiveContextModelIdentity:()=>getLiveContextModelIdentity,getFinalPromptPressure:()=>getFinalPromptPressure,getFinalAccountingWarningBand:()=>getFinalAccountingWarningBand,getDisplayFinalPromptPressure:()=>getDisplayFinalPromptPressure,getDisplayBudget:()=>getDisplayBudget,getAgentSession:()=>getAgentSession,getActiveWindow:()=>getActiveWindow,getActiveFullAutoSessionID:()=>getActiveFullAutoSessionID,ensureSessionEnvironment:()=>ensureSessionEnvironment,ensureAgentSession:()=>ensureAgentSession,endAgentSession:()=>endAgentSession,discardReviewerScopeGenerationForCoderCall:()=>discardReviewerScopeGenerationForCoderCall,discardReviewerScopeGenerationClaim:()=>discardReviewerScopeGenerationClaim,defaultRunContext:()=>defaultRunContext,completeModifiedFilesForTask:()=>completeModifiedFilesForTask,clearStageBRouteRequired:()=>clearStageBRouteRequired,clearStageBRouteEvidence:()=>clearStageBRouteEvidence,clearGateDenialCount:()=>clearGateDenialCount,clearFinalAccountingWarningBands:()=>clearFinalAccountingWarningBands,clearCriticalShownIds:()=>clearCriticalShownIds,claimReviewerScopeGeneration:()=>claimReviewerScopeGeneration,canAdvanceTaskState:()=>canAdvanceTaskState,buildRehydrationCache:()=>buildRehydrationCache,buildGateDenialDirectiveKey:()=>buildGateDenialDirectiveKey,beginInvocation:()=>beginInvocation,attachReviewerScopeGenerationDispatchSnapshot:()=>attachReviewerScopeGenerationDispatchSnapshot,applyRehydrationCache:()=>applyRehydrationCache,advanceTaskStateAndPersist:()=>advanceTaskStateAndPersist,advanceTaskState:()=>advanceTaskState,addKnowledgeAckDedup:()=>addKnowledgeAckDedup,_resetCouncilDisagreementWarnings:()=>_resetCouncilDisagreementWarnings,_internals:()=>_internals86,REVIEWER_SCOPE_GENERATION_TTL_MS:()=>REVIEWER_SCOPE_GENERATION_TTL_MS,MAX_TRACKED_TASK_FILE_ATTRIBUTIONS:()=>MAX_TRACKED_TASK_FILE_ATTRIBUTIONS,MAX_TRACKED_KNOWLEDGE_ACKS:()=>MAX_TRACKED_KNOWLEDGE_ACKS,MAX_TRACKED_GATE_DENIALS:()=>MAX_TRACKED_GATE_DENIALS,MAX_TRACKED_CRITICAL_SHOWN:()=>MAX_TRACKED_CRITICAL_SHOWN,MAX_TRACKED_CONTEXT_WINDOWS:()=>MAX_TRACKED_CONTEXT_WINDOWS,MAX_TRACKED_BUDGET_SESSIONS:()=>MAX_TRACKED_BUDGET_SESSIONS,MAX_REVIEWER_SCOPE_OWNERSHIP_HISTORY:()=>MAX_REVIEWER_SCOPE_OWNERSHIP_HISTORY,MAX_REVIEWER_SCOPE_GENERATION_FILES:()=>MAX_REVIEWER_SCOPE_GENERATION_FILES,MAX_REVIEWER_SCOPE_GENERATIONS:()=>MAX_REVIEWER_SCOPE_GENERATIONS,AgentRunContext:()=>AgentRunContext});import{randomUUID as randomUUID13}from"node:crypto";import*as fs62 from"node:fs/promises";import*as path100 from"node:path";function compareWorkflowStatePrecedence(left,right){return compareTaskWorkflowStateRank(left,right)}function cloneReviewerScopeGeneration(generation){return{...generation,declaredFiles:[...generation.declaredFiles],modifiedFiles:[...generation.modifiedFiles],modifiedFileFingerprints:generation.modifiedFileFingerprints.map((entry)=>({...entry})),captureFailures:generation.captureFailures.map((entry)=>({...entry})),reviewerDispatchScope:generation.reviewerDispatchScope?{...generation.reviewerDispatchScope,files:[...generation.reviewerDispatchScope.files]}:void 0}}function cloneReviewerScopeOwnershipTombstone(tombstone){return{...tombstone,declaredFiles:[...tombstone.declaredFiles],modifiedFiles:[...tombstone.modifiedFiles],modifiedFileFingerprints:tombstone.modifiedFileFingerprints.map((fingerprint2)=>({...fingerprint2}))}}function createNonTransientCircuitState(agentName,invocationId){return{ownerAgent:stripKnownSwarmPrefix(agentName),ownerInvocationId:invocationId,category:null,sameCategoryCount:0,hardStop:!1,lastSignal:null}}function getRunContext(runId){if(!runId)return defaultRunContext;return _runContexts.get(runId)??defaultRunContext}function resetSwarmState(){swarmState.activeToolCalls.clear(),swarmState.toolAggregates.clear(),swarmState.activeAgent.clear(),swarmState.delegationChains.clear(),swarmState.pendingEvents=0,swarmState.lastBudgetBySession.clear(),swarmState.finalPromptPressureBySession.clear(),clearAllTurnLedgers(),swarmState.finalAccountingWarningBandsBySession.clear(),swarmState.liveContextWindows.clear(),swarmState.agentSessions.clear(),clearSnapshotSessionOwnerships(),_lastIdleSweepAtMs=0,clearTrajectoryCache(),clearTrajectoryStepCounters(),swarmState.pendingRehydrations.clear(),swarmState.opencodeClient=null,swarmState.curatorInitAgentNames=[],swarmState.curatorPhaseAgentNames=[],swarmState.curatorPostmortemAgentNames=[],swarmState.curatorConsolidationAgentNames=[],swarmState.skillImproverAgentNames=[],swarmState.specWriterAgentNames=[],swarmState.currentCriticalShownIds.clear(),swarmState.knowledgeAckDedup.clear(),swarmState.gateDenialCounts.clear(),swarmState.generatedAgentNames=[],clearHydrationOwnershipState(),swarmState.fullAutoEnabledInConfig=!1,swarmState.environmentProfiles.clear(),clearAllActionCircuits(),clearAllTaskModelRoutingState(),clearPendingCoderScope();for(let binding of clearScopeBindings())clearScopeBindingFromDisk({directory:binding.workspaceIdentity,binding});resetStandardWorktreeIsolationState(),resetRealtimeLearningNudgeState(),_councilDisagreementWarned.clear()}function resetSwarmStatePreservingSingletons(){let{opencodeClient:preservedOpencodeClient,fullAutoEnabledInConfig:preservedFullAutoEnabledInConfig,curatorInitAgentNames:preservedCuratorInitAgentNames,curatorPhaseAgentNames:preservedCuratorPhaseAgentNames,curatorPostmortemAgentNames:preservedCuratorPostmortemAgentNames,curatorConsolidationAgentNames:preservedCuratorConsolidationAgentNames,skillImproverAgentNames:preservedSkillImproverAgentNames,specWriterAgentNames:preservedSpecWriterAgentNames,generatedAgentNames:preservedGeneratedAgentNames}=swarmState;resetSwarmState(),swarmState.opencodeClient=preservedOpencodeClient,swarmState.fullAutoEnabledInConfig=preservedFullAutoEnabledInConfig,swarmState.curatorInitAgentNames=preservedCuratorInitAgentNames,swarmState.curatorPhaseAgentNames=preservedCuratorPhaseAgentNames,swarmState.curatorPostmortemAgentNames=preservedCuratorPostmortemAgentNames,swarmState.curatorConsolidationAgentNames=preservedCuratorConsolidationAgentNames,swarmState.skillImproverAgentNames=preservedSkillImproverAgentNames,swarmState.specWriterAgentNames=preservedSpecWriterAgentNames,swarmState.generatedAgentNames=preservedGeneratedAgentNames}function isBoundedGenerationValue(value,maxLength){return value.length>0&&value.length<=maxLength&&!Array.from(value).some((char)=>{let code=char.charCodeAt(0);return code<=31||code===127})}function reviewerScopeGenerationKey(taskId,coderCallID,generation){return`${taskId}\x00${coderCallID}\x00${generation}`}function reviewerScopeOwnershipKey(taskId,coderCallID,generation,sessionIncarnation){return`${taskId}\x00${coderCallID}\x00${generation}\x00${sessionIncarnation}`}function ensureReviewerScopeGenerationState(session){return session.reviewerScopeGenerations??=new Map,session.reviewerScopeGenerationCounter??=0,session.reviewerScopeIncarnation??=randomUUID13(),session.reviewerScopeLatestGenerationByTask??=new Map,session.reviewerScopeOwnershipHistory??=new Map,{generations:session.reviewerScopeGenerations,counter:session.reviewerScopeGenerationCounter,incarnation:session.reviewerScopeIncarnation,latestByTask:session.reviewerScopeLatestGenerationByTask,ownershipHistory:session.reviewerScopeOwnershipHistory}}function sweepReviewerScopeGenerations(session,now){let{generations}=ensureReviewerScopeGenerationState(session);for(let[key2,entry]of generations){if(entry.status==="claimed"||entry.status==="mergeback_pending"||entry.status==="mergeback_mismatch")continue;if(!Number.isFinite(entry.createdAt)||now<entry.createdAt||now-entry.createdAt>REVIEWER_SCOPE_GENERATION_TTL_MS)generations.delete(key2)}}function startReviewerScopeGeneration(input){let session=swarmState.agentSessions.get(input.parentSessionID);if(!session||!isBoundedGenerationValue(input.taskId,512)||!isBoundedGenerationValue(input.coderCallID,512)||!input.captureDirectory.trim()||!input.workspaceIdentity.trim())return null;let now=input.createdAt??Date.now();sweepReviewerScopeGenerations(session,now);let{generations,counter,incarnation,latestByTask}=ensureReviewerScopeGenerationState(session);for(let[key3,entry]of generations)if(entry.taskId===input.taskId&&entry.status!=="claimed")generations.delete(key3);while(generations.size>=MAX_REVIEWER_SCOPE_GENERATIONS){let oldestUnclaimed=[...generations.entries()].find(([,entry])=>entry.status!=="claimed")?.[0];if(!oldestUnclaimed)return null;generations.delete(oldestUnclaimed)}session.reviewerScopeGenerationCounter=counter>=Number.MAX_SAFE_INTEGER?1:counter+1;let generation={taskId:input.taskId,coderCallID:input.coderCallID,generation:session.reviewerScopeGenerationCounter,sessionIncarnation:incarnation,background:input.background===!0,captureDirectory:input.captureDirectory,workspaceIdentity:input.workspaceIdentity,declaredFiles:[...new Set(input.declaredFiles??[])],modifiedFiles:[],modifiedFileFingerprints:[],captureFailures:[],status:"collecting",createdAt:now};if(!latestByTask.has(generation.taskId))while(latestByTask.size>=MAX_REVIEWER_SCOPE_GENERATIONS){let oldestTask=latestByTask.keys().next().value;if(!oldestTask)break;latestByTask.delete(oldestTask)}latestByTask.delete(generation.taskId),latestByTask.set(generation.taskId,{generation:generation.generation,coderCallID:generation.coderCallID,sessionIncarnation:generation.sessionIncarnation});let key2=reviewerScopeGenerationKey(generation.taskId,generation.coderCallID,generation.generation);return generations.set(key2,generation),cloneReviewerScopeGeneration(generation)}function recordReviewerScopeGenerationFile(input){let session=swarmState.agentSessions.get(input.parentSessionID);if(!session||!isBoundedGenerationValue(input.file,4096)||!isBoundedGenerationValue(input.taskId,512)||!isBoundedGenerationValue(input.coderCallID,512))return!1;sweepReviewerScopeGenerations(session,input.now??Date.now());let{generations}=ensureReviewerScopeGenerationState(session),matches=[...generations.values()].filter((entry)=>entry.taskId===input.taskId&&entry.coderCallID===input.coderCallID&&entry.status==="collecting");if(matches.length!==1)return!1;let generation=matches[0];if(generation.modifiedFiles.includes(input.file))return!0;if(generation.modifiedFiles.length>=MAX_REVIEWER_SCOPE_GENERATION_FILES){let key2=reviewerScopeGenerationKey(generation.taskId,generation.coderCallID,generation.generation);return generations.delete(key2),!1}return generation.modifiedFiles.push(input.file),!0}function recordReviewerScopeGenerationFileFingerprint(input){let session=swarmState.agentSessions.get(input.parentSessionID);if(!session)return!1;let{generations}=ensureReviewerScopeGenerationState(session),matches=[...generations.values()].filter((entry)=>entry.taskId===input.taskId&&entry.coderCallID===input.coderCallID&&entry.status==="collecting");if(matches.length!==1)return!1;let generation=matches[0];if(!generation.modifiedFiles.includes(input.fingerprint.file))return!1;generation.captureFailures=generation.captureFailures.filter((entry)=>entry.file!==input.fingerprint.file);let existingIndex=generation.modifiedFileFingerprints.findIndex((entry)=>entry.file===input.fingerprint.file);if(existingIndex>=0)return generation.modifiedFileFingerprints[existingIndex]={...input.fingerprint},!0;if(generation.modifiedFileFingerprints.length>=MAX_REVIEWER_SCOPE_GENERATION_FILES)return!1;return generation.modifiedFileFingerprints.push({...input.fingerprint}),!0}function recordReviewerScopeGenerationCaptureFailure(input){let session=swarmState.agentSessions.get(input.parentSessionID);if(!session||!isBoundedGenerationValue(input.file,4096))return!1;let{generations}=ensureReviewerScopeGenerationState(session),matches=[...generations.values()].filter((entry)=>entry.taskId===input.taskId&&entry.coderCallID===input.coderCallID&&entry.status==="collecting");if(matches.length!==1)return!1;let generation=matches[0],now=input.at??Date.now();generation.modifiedFileFingerprints=generation.modifiedFileFingerprints.filter((entry)=>entry.file!==input.file);let existingIndex=generation.captureFailures.findIndex((entry)=>entry.file===input.file);if(existingIndex>=0){let existing=generation.captureFailures[existingIndex];return generation.captureFailures[existingIndex]={...existing,code:input.code,retryable:input.retryable,attempts:existing.attempts+1,at:now},!0}if(generation.captureFailures.length>=MAX_REVIEWER_SCOPE_GENERATION_FILES)generation.captureFailures.shift();return generation.captureFailures.push({file:input.file,code:input.code,retryable:input.retryable,attempts:1,at:now}),!0}function markReviewerScopeGenerationReady(input){let session=swarmState.agentSessions.get(input.parentSessionID);if(!session)return!1;let now=input.readyAt??Date.now();sweepReviewerScopeGenerations(session,now);let{generations}=ensureReviewerScopeGenerationState(session),matches=[...generations.values()].filter((entry)=>entry.taskId===input.taskId&&entry.coderCallID===input.coderCallID&&(entry.status==="collecting"||entry.status==="ready"));if(matches.length!==1)return!1;let generation=matches[0];if(generation.status==="ready")return!0;if(input.primaryWorkspaceIdentity&&generation.workspaceIdentity!==input.primaryWorkspaceIdentity)return!1;if(!(generation.modifiedFiles.length===generation.modifiedFileFingerprints.length&&generation.modifiedFiles.every((file3)=>generation.modifiedFileFingerprints.some((entry)=>entry.file===file3))))return!1;return generation.status="ready",generation.readyAt=now,!0}function markReviewerScopeGenerationNoChange(input){let session=swarmState.agentSessions.get(input.parentSessionID);if(!session)return!1;let now=input.at??Date.now();sweepReviewerScopeGenerations(session,now);let{generations}=ensureReviewerScopeGenerationState(session),matches=[...generations.values()].filter((entry)=>entry.taskId===input.taskId&&entry.coderCallID===input.coderCallID&&entry.status==="collecting");if(matches.length!==1)return!1;let generation=matches[0];if(generation.modifiedFiles.length!==0)return!1;return generation.status="no_change",generation.readyAt=now,!0}function markReviewerScopeGenerationMergebackPending(input){let session=swarmState.agentSessions.get(input.parentSessionID);if(!session)return!1;let{generations}=ensureReviewerScopeGenerationState(session),matches=[...generations.values()].filter((entry)=>(input.taskId===void 0||entry.taskId===input.taskId)&&entry.coderCallID===input.coderCallID&&(entry.status==="collecting"||entry.status==="ready"));if(matches.length!==1)return!1;if(matches[0].status==="mergeback_pending")return!0;return matches[0].status="mergeback_pending",!0}function settleReviewerScopeMergeback(input){let session=swarmState.agentSessions.get(input.parentSessionID);if(!session)return!1;let{generations}=ensureReviewerScopeGenerationState(session),matches=[...generations.values()].filter((entry)=>(input.taskId===void 0||entry.taskId===input.taskId)&&entry.coderCallID===input.coderCallID&&entry.status==="mergeback_pending");if(matches.length!==1)return!1;let generation=matches[0],now=input.outcome.at??Date.now();if(input.outcome.verified){if(generation.status="ready",generation.readyAt===void 0)generation.readyAt=now;return generation.mergeback={verifiedAt:now,primaryWorkspaceIdentity:input.outcome.primaryWorkspaceIdentity},generation.captureDirectory=input.outcome.primaryDirectory,generation.workspaceIdentity=input.outcome.primaryWorkspaceIdentity,!0}return generation.status="mergeback_mismatch",generation.mergeback={failedAt:now,reason:input.outcome.reason},!0}function getReviewerScopeGenerationForCoderCall(input){let session=swarmState.agentSessions.get(input.parentSessionID);if(!session)return null;sweepReviewerScopeGenerations(session,input.now??Date.now());let{generations}=ensureReviewerScopeGenerationState(session),matches=[...generations.values()].filter((entry)=>entry.coderCallID===input.coderCallID&&(input.taskId===void 0||entry.taskId===input.taskId));return matches.length===1?cloneReviewerScopeGeneration(matches[0]):null}function peekReadyReviewerScopeGeneration(input){let session=swarmState.agentSessions.get(input.parentSessionID);if(!session)return null;sweepReviewerScopeGenerations(session,input.now??Date.now());let{generations}=ensureReviewerScopeGenerationState(session),matches=[...generations.values()].filter((entry)=>entry.taskId===input.taskId&&entry.status==="ready");return matches.length===1?cloneReviewerScopeGeneration(matches[0]):null}function peekReviewerScopeGenerationByStatus(input){let session=swarmState.agentSessions.get(input.parentSessionID);if(!session)return null;sweepReviewerScopeGenerations(session,input.now??Date.now());let{generations}=ensureReviewerScopeGenerationState(session),matches=[...generations.values()].filter((entry)=>entry.taskId===input.taskId&&entry.status===input.status);return matches.length===1?cloneReviewerScopeGeneration(matches[0]):null}function claimReviewerScopeGeneration(input){let session=swarmState.agentSessions.get(input.parentSessionID);if(!session||!isBoundedGenerationValue(input.taskId,512)||!isBoundedGenerationValue(input.reviewerCallID,512))return null;sweepReviewerScopeGenerations(session,input.now??Date.now());let{generations}=ensureReviewerScopeGenerationState(session),matches=[...generations.values()].filter((entry)=>entry.taskId===input.taskId&&entry.status==="ready");if(matches.length!==1)return null;return matches[0].status="claimed",matches[0].reviewerCallID=input.reviewerCallID,cloneReviewerScopeGeneration(matches[0])}function attachReviewerScopeGenerationDispatchSnapshot(input){let session=swarmState.agentSessions.get(input.parentSessionID);if(!session)return!1;let{generations}=ensureReviewerScopeGenerationState(session),matches=[...generations.values()].filter((entry)=>entry.taskId===input.taskId&&entry.reviewerCallID===input.reviewerCallID&&entry.status==="claimed"&&entry.coderCallID===input.snapshot.coderCallID&&entry.generation===input.snapshot.generation&&entry.sessionIncarnation===input.snapshot.sessionIncarnation);if(matches.length!==1)return!1;return matches[0].reviewerDispatchScope={...input.snapshot,files:[...input.snapshot.files]},!0}function takeReviewerScopeGeneration(input){let session=swarmState.agentSessions.get(input.parentSessionID);if(!session)return null;sweepReviewerScopeGenerations(session,input.now??Date.now());let{generations}=ensureReviewerScopeGenerationState(session),matches=[...generations.entries()].filter(([,entry])=>entry.taskId===input.taskId&&entry.reviewerCallID===input.reviewerCallID&&entry.status==="claimed");if(matches.length!==1)return null;let[key2,generation]=matches[0];if(generation.background===!0&&generation.readyAt!==void 0&&Number.isFinite(generation.createdAt)&&Number.isFinite(generation.readyAt)){let{ownershipHistory}=ensureReviewerScopeGenerationState(session);while(ownershipHistory.size>=MAX_REVIEWER_SCOPE_OWNERSHIP_HISTORY){let oldestKey=ownershipHistory.keys().next().value;if(!oldestKey)break;ownershipHistory.delete(oldestKey)}let tombstone={parentSessionID:input.parentSessionID,taskId:generation.taskId,coderCallID:generation.coderCallID,generation:generation.generation,sessionIncarnation:generation.sessionIncarnation,background:!0,captureDirectory:generation.captureDirectory,workspaceIdentity:generation.workspaceIdentity,declaredFiles:[...generation.declaredFiles],modifiedFiles:[...generation.modifiedFiles],modifiedFileFingerprints:generation.modifiedFileFingerprints.map((fingerprint2)=>({...fingerprint2})),createdAt:generation.createdAt,readyAt:generation.readyAt??input.now??Date.now(),consumedAt:input.now??Date.now()};ownershipHistory.set(reviewerScopeOwnershipKey(tombstone.taskId,tombstone.coderCallID,tombstone.generation,tombstone.sessionIncarnation),tombstone)}return generations.delete(key2),cloneReviewerScopeGeneration(generation)}function getReviewerScopeOwnershipHistory(input){let session=swarmState.agentSessions.get(input.parentSessionID);if(!session)return[];let{ownershipHistory}=ensureReviewerScopeGenerationState(session);return[...ownershipHistory.values()].map(cloneReviewerScopeOwnershipTombstone)}function peekReviewerScopeGenerationClaim(input){let session=swarmState.agentSessions.get(input.parentSessionID);if(!session)return null;sweepReviewerScopeGenerations(session,input.now??Date.now());let{generations}=ensureReviewerScopeGenerationState(session),matches=[...generations.values()].filter((entry)=>entry.taskId===input.taskId&&entry.reviewerCallID===input.reviewerCallID&&entry.status==="claimed");return matches.length===1?cloneReviewerScopeGeneration(matches[0]):null}function discardReviewerScopeGenerationClaim(input){let session=swarmState.agentSessions.get(input.parentSessionID);if(!session)return!1;let{generations}=ensureReviewerScopeGenerationState(session),matches=[...generations.entries()].filter(([,entry])=>(input.taskId===void 0||entry.taskId===input.taskId)&&entry.reviewerCallID===input.reviewerCallID&&entry.status==="claimed");if(matches.length!==1)return!1;return generations.delete(matches[0][0]),!0}function reviewerScopeGenerationHasDeclaredOverlap(input){let session=swarmState.agentSessions.get(input.parentSessionID);if(!session)return!1;let{generations}=ensureReviewerScopeGenerationState(session),declared=new Set(input.declaredFiles);return[...generations.values()].some((entry)=>entry.status==="collecting"&&(entry.taskId!==input.taskId||entry.coderCallID!==input.coderCallID)&&entry.declaredFiles.some((file3)=>declared.has(file3)))}function discardReviewerScopeGenerationForCoderCall(input){let session=swarmState.agentSessions.get(input.parentSessionID);if(!session)return!1;let{generations}=ensureReviewerScopeGenerationState(session),matches=[...generations.entries()].filter(([,entry])=>(input.taskId===void 0||entry.taskId===input.taskId)&&entry.coderCallID===input.coderCallID&&entry.status!=="claimed");if(matches.length!==1)return!1;return generations.delete(matches[0][0]),!0}function isReviewerScopeGenerationCurrent(input){let session=swarmState.agentSessions.get(input.parentSessionID);if(!session)return!1;let{incarnation,latestByTask}=ensureReviewerScopeGenerationState(session),latest=latestByTask.get(input.taskId);return incarnation===input.sessionIncarnation&&latest?.generation===input.generation&&latest.coderCallID===input.coderCallID&&latest.sessionIncarnation===input.sessionIncarnation}function sweepStaleSessions(staleDurationMs=STALE_SESSION_TTL_MS,now=Date.now(),directory){let staleIds=[];for(let[id,session]of swarmState.agentSessions)if(now-session.lastToolCallTime>staleDurationMs){if(directory&&isSnapshotSessionOwnedLocally(id)&&!isSnapshotSessionAuthoritativelyStale(directory,id,staleDurationMs,now))continue;staleIds.push(id)}for(let id of staleIds){if(directory&&isSnapshotSessionOwnedLocally(id)){try{deleteSnapshotSessionRows(directory,id,"stale")}catch(error93){warn("[state] durable stale-session teardown failed:",error93 instanceof Error?error93.message:String(error93))}try{clearOverrideForSession(directory,id)}catch(error93){warn("[state] durable stale-session override teardown failed:",error93 instanceof Error?error93.message:String(error93))}}releaseSnapshotSessionOwnership(id),swarmState.agentSessions.delete(id),swarmState.delegationChains.delete(id),swarmState.activeAgent.delete(id)}return staleIds}function maybeSweepStaleSessions(staleDurationMs=STALE_SESSION_TTL_MS,now=Date.now(),directory){if(now-_lastIdleSweepAtMs<IDLE_SWEEP_COOLDOWN_MS)return[];return _lastIdleSweepAtMs=now,sweepStaleSessions(staleDurationMs,now,directory)}function resolveInitialTurboMode(directory){if(!directory)return!1;try{return _internals86.loadPluginConfigWithMeta(directory).config.turbo_mode===!0}catch{return!1}}function startAgentSession(sessionId,agentName,staleDurationMs=STALE_SESSION_TTL_MS,directory){let now=Date.now();claimSnapshotSessionOwnership(sessionId,!0);let owningProjectKey=directory?hydrationProjectKey(directory):void 0,hydrationAuthority=owningProjectKey?captureCurrentHydrationAuthority(owningProjectKey):void 0,hydrationStamp=owningProjectKey?nextSessionHydrationStamp(owningProjectKey):void 0,hydrationAuthorityEpoch2=hydrationAuthority?.authorityEpoch;sweepStaleSessions(staleDurationMs,now,directory);let initialTurboMode=resolveInitialTurboMode(directory),sessionState={agentName,lastToolCallTime:now,lastAgentEventTime:now,delegationActive:!1,activeInvocationId:0,lastInvocationIdByAgent:{},windows:{},nonTransientCircuit:createNonTransientCircuitState(agentName,0),pendingToolExecutions:new Map,lastCompactionHint:0,architectWriteCount:0,lastCoderDelegationTaskId:null,currentTaskId:null,gateLog:new Map,reviewerCallCount:new Map,lastGateFailure:null,partialGateWarningsIssuedForTask:new Set,completionGateWarnedForTask:new Set,selfFixAttempted:!1,selfCodingWarnedAtCount:0,catastrophicPhaseWarnings:new Set,lastPhaseCompleteTimestamp:0,lastPhaseCompletePhase:0,phaseAgentsDispatched:new Set,lastCompletedPhaseAgentsDispatched:new Set,qaSkipCount:0,qaSkipTaskIds:[],taskWorkflowStates:new Map,taskWorkflowCache:new Map,stageBCompletion:new Map,stageBRouteEvidence:new Map,stageBRouteRequiredTasks:new Set,taskCouncilApproved:new Map,taskCouncilWorkflowGeneration:new Map,pendingCouncilRequirements:new Map,lastGateOutcome:null,declaredCoderScope:null,lastScopeViolation:null,scopeViolationDetected:!1,modifiedFilesByTask:new Map,modifiedFilesThisCoderTask:[],reviewerScopeGenerations:new Map,reviewerScopeGenerationCounter:0,reviewerScopeIncarnation:randomUUID13(),reviewerScopeLatestGenerationByTask:new Map,reviewerScopeOwnershipHistory:new Map,turboMode:initialTurboMode,turboStrategy:void 0,leanTurboActive:!1,leanTurboCurrentPhase:void 0,maxConcurrencyOverride:void 0,epicModeActive:!1,qaGateSessionOverrides:{},fullAutoMode:!1,fullAutoInteractionCount:0,fullAutoDeadlockCount:0,fullAutoLastQuestionHash:null,model_fallback_index:0,modelFallbackExhausted:!1,coderRevisions:0,revisionLimitHit:!1,loopDetectionWindow:[],pendingAdvisoryMessages:[],sessionRehydratedAt:0,owningProjectKey,hydrationStamp,hydrationAuthorityEpoch:hydrationAuthorityEpoch2,prmPatternCounts:new Map,prmEscalationLevel:0,prmLastPatternDetected:null,prmTrajectoryStep:0,prmHardStopPending:!1,prmHardStopInjectPending:!1,prmInjectedAdvisoryKeys:new Set,prmStruckEpisodes:new Map,prmLadderCounts:new Map,prmEpisodes:new Map,prmEpisodeGeneration:0,executionEpisodeArmed:!1,prSubscriptions:new Map};if(swarmState.agentSessions.set(sessionId,sessionState),directory){try{recordSessionStart(directory,now)}catch{}queueMicrotask(()=>{maybeSuggestWorktreeLink(directory,sessionId)})}if(telemetry.sessionStarted(sessionId,agentName),swarmState.activeAgent.set(sessionId,agentName),_internals86.applyRehydrationCache(sessionState),directory){let liveSession=sessionState,shouldCommitRehydration=()=>hydrationAuthority!==void 0&&isHydrationAuthorityCurrent(hydrationAuthority)&&swarmState.agentSessions.get(sessionId)===liveSession,rehydrationPromise;rehydrationPromise=_internals86.rehydrateSessionFromDisk(directory,sessionState,shouldCommitRehydration).then(async()=>{if(!shouldCommitRehydration())return;try{let subscriptions=await _internals86.rehydratePrSubscriptions(sessionId,directory);if(!shouldCommitRehydration())return;sessionState.prSubscriptions=subscriptions}catch(err){warn("[state] PR subscription rehydration failed, starting with empty subscriptions:",err instanceof Error?err.message:String(err))}}).catch((err)=>{warn("[state] Rehydration failed:",err instanceof Error?err.message:String(err))}).finally(()=>{swarmState.pendingRehydrations.delete(rehydrationPromise)}),swarmState.pendingRehydrations.add(rehydrationPromise)}}function endAgentSession(sessionId,directory){if(directory){try{deleteSnapshotSessionRows(directory,sessionId)}catch(error93){warn("[state] durable snapshot session teardown failed:",error93 instanceof Error?error93.message:String(error93))}try{clearOverrideForSession(directory,sessionId)}catch(error93){warn("[state] durable session override teardown failed:",error93 instanceof Error?error93.message:String(error93))}}releaseSnapshotSessionOwnership(sessionId);let removedBindings=clearScopeBindings((binding)=>binding.ownerSessionId===sessionId||binding.parentOwnerSessionId===sessionId);for(let binding of removedBindings)clearScopeBindingFromDisk({directory:binding.workspaceIdentity,binding});swarmState.agentSessions.delete(sessionId),swarmState.activeAgent.delete(sessionId),swarmState.delegationChains.delete(sessionId),clearRealtimeLearningNudgeSession(sessionId),resetSessionQueue(sessionId),resetPrmPatternSupport(sessionId)}function getAgentSession(sessionId){return swarmState.agentSessions.get(sessionId)}function ensureAgentSession(sessionId,agentName,directory){let now=Date.now();claimSnapshotSessionOwnership(sessionId,!0);let session=swarmState.agentSessions.get(sessionId);if(session){if(agentName&&agentName!==session.agentName){let oldName=session.agentName;if(session.agentName=agentName,telemetry.agentActivated(sessionId,agentName,oldName),session.delegationActive=!1,session.lastAgentEventTime=now,session.nonTransientCircuit=createNonTransientCircuitState(agentName,0),!session.windows)session.activeInvocationId=0,session.lastInvocationIdByAgent={},session.windows={}}if(!session.windows)session.activeInvocationId=0,session.lastInvocationIdByAgent={},session.windows={};if(session.nonTransientCircuit===void 0)session.nonTransientCircuit=createNonTransientCircuitState(session.agentName,session.activeInvocationId??0);if(session.pendingToolExecutions===void 0)session.pendingToolExecutions=new Map;if(session.lastCompactionHint===void 0)session.lastCompactionHint=0;if(session.architectWriteCount===void 0)session.architectWriteCount=0;if(session.lastCoderDelegationTaskId===void 0)session.lastCoderDelegationTaskId=null;if(session.currentTaskId===void 0)session.currentTaskId=null;if(!session.gateLog)session.gateLog=new Map;if(!session.reviewerCallCount)session.reviewerCallCount=new Map;if(session.lastGateFailure===void 0)session.lastGateFailure=null;if(!session.partialGateWarningsIssuedForTask)session.partialGateWarningsIssuedForTask=new Set;if(!session.completionGateWarnedForTask)session.completionGateWarnedForTask=new Set;if(session.selfFixAttempted===void 0)session.selfFixAttempted=!1;if(session.selfCodingWarnedAtCount===void 0)session.selfCodingWarnedAtCount=0;if(!session.catastrophicPhaseWarnings)session.catastrophicPhaseWarnings=new Set;if(session.lastPhaseCompleteTimestamp===void 0)session.lastPhaseCompleteTimestamp=0;if(session.lastPhaseCompletePhase===void 0)session.lastPhaseCompletePhase=0;if(!session.phaseAgentsDispatched)session.phaseAgentsDispatched=new Set;if(!session.lastCompletedPhaseAgentsDispatched)session.lastCompletedPhaseAgentsDispatched=new Set;if(session.qaSkipCount===void 0)session.qaSkipCount=0;if(!session.qaSkipTaskIds)session.qaSkipTaskIds=[];if(!session.taskWorkflowStates)session.taskWorkflowStates=new Map;if(!session.taskWorkflowCache)session.taskWorkflowCache=new Map;if(!session.stageBCompletion)session.stageBCompletion=new Map;if(!session.stageBRouteEvidence)session.stageBRouteEvidence=new Map;if(!session.stageBRouteRequiredTasks)session.stageBRouteRequiredTasks=new Set;if(!session.taskCouncilApproved)session.taskCouncilApproved=new Map;if(!session.pendingCouncilRequirements)session.pendingCouncilRequirements=new Map;if(session.lastGateOutcome===void 0)session.lastGateOutcome=null;if(session.declaredCoderScope===void 0)session.declaredCoderScope=null;if(session.lastScopeViolation===void 0)session.lastScopeViolation=null;if(!(session.modifiedFilesByTask instanceof Map)){if(session.modifiedFilesByTask=new Map,isValidTaskId2(session.currentTaskId)&&Array.isArray(session.modifiedFilesThisCoderTask)&&session.modifiedFilesThisCoderTask.length>0)session.modifiedFilesByTask.set(session.currentTaskId,[...new Set(session.modifiedFilesThisCoderTask)])}if(projectModifiedFilesForActiveTask(session),!session.reviewerScopeGenerations)session.reviewerScopeGenerations=new Map;if(session.reviewerScopeGenerationCounter===void 0)session.reviewerScopeGenerationCounter=0;if(!session.reviewerScopeIncarnation)session.reviewerScopeIncarnation=randomUUID13();if(!session.reviewerScopeLatestGenerationByTask)session.reviewerScopeLatestGenerationByTask=new Map;if(!session.reviewerScopeOwnershipHistory)session.reviewerScopeOwnershipHistory=new Map;if(session.scopeViolationDetected===void 0)session.scopeViolationDetected=!1;if(session.turboMode===void 0)session.turboMode=!1;if(session.turboStrategy===void 0)session.turboStrategy=void 0;if(session.leanTurboActive===void 0)session.leanTurboActive=!1;if(session.leanTurboCurrentPhase===void 0)session.leanTurboCurrentPhase=void 0;if(session.epicModeActive===void 0)session.epicModeActive=!1;if(session.qaGateSessionOverrides===void 0)session.qaGateSessionOverrides={};if(session.model_fallback_index===void 0)session.model_fallback_index=0;if(session.modelFallbackExhausted===void 0)session.modelFallbackExhausted=!1;if(session.loopDetectionWindow===void 0)session.loopDetectionWindow=[];if(session.pendingAdvisoryMessages===void 0)session.pendingAdvisoryMessages=[];if(session.coderRevisions===void 0)session.coderRevisions=0;if(session.revisionLimitHit===void 0)session.revisionLimitHit=!1;if(session.sessionRehydratedAt===void 0)session.sessionRehydratedAt=0;if(session.prmPatternCounts===void 0)session.prmPatternCounts=new Map;if(session.prmEscalationLevel===void 0)session.prmEscalationLevel=0;if(session.prmLastPatternDetected===void 0)session.prmLastPatternDetected=null;if(session.prmTrajectoryStep===void 0)session.prmTrajectoryStep=0;if(session.prmHardStopPending===void 0)session.prmHardStopPending=!1;if(session.prmHardStopInjectPending===void 0)session.prmHardStopInjectPending=!1;if(!session.prmInjectedAdvisoryKeys)session.prmInjectedAdvisoryKeys=new Set;if(!session.prmStruckEpisodes)session.prmStruckEpisodes=new Map;if(!session.prmLadderCounts)session.prmLadderCounts=new Map;if(session.executionEpisodeArmed===void 0)session.executionEpisodeArmed=!1;if(!session.prSubscriptions)session.prSubscriptions=new Map;return session.lastToolCallTime=now,maybeSweepStaleSessions(STALE_SESSION_TTL_MS,now,directory),session}if(_internals86.startAgentSession(sessionId,agentName??"unknown",7200000,directory),session=swarmState.agentSessions.get(sessionId),!session)throw Error(`Failed to create guardrail session for ${sessionId}`);return session}function recordSessionWorkspaceRoot(sessionId,laneRoot){let trimmed=laneRoot.trim();if(!trimmed)return;let session=swarmState.agentSessions.get(sessionId);if(!session)return;session.workspaceDirectory=trimmed}function resolveSessionWorkspaceDirectory(sessionId,fallbackDirectory){let recorded=swarmState.agentSessions.get(sessionId)?.workspaceDirectory;if(recorded?.trim())return recorded;return fallbackDirectory}function updateAgentEventTime(sessionId){let session=swarmState.agentSessions.get(sessionId);if(session)session.lastAgentEventTime=Date.now()}function beginInvocation(sessionId,agentName){let session=swarmState.agentSessions.get(sessionId);if(!session)throw Error(`Cannot begin invocation: session ${sessionId} does not exist`);let stripped=stripKnownSwarmPrefix(agentName),lastId=session.lastInvocationIdByAgent[stripped]||0;if(lastId>0)clearInvocationActionCircuits(sessionId,lastId),clearPendingTaskModelRoutesForSession(sessionId,"invocation");let newId=lastId+1;if(session.lastInvocationIdByAgent[stripped]=newId,session.activeInvocationId=newId,session.nonTransientCircuit=createNonTransientCircuitState(stripped,newId),stripped===ORCHESTRATOR_NAME)return null;let now=Date.now(),window2={id:newId,agentName:stripped,startedAtMs:now,toolCalls:0,consecutiveErrors:0,hardLimitHit:!1,lastSuccessTimeMs:now,recentToolCalls:[],warningIssued:!1,warningReason:"",transientRetryCount:0},key2=`${stripped}:${newId}`;return session.windows[key2]=window2,pruneOldWindows(sessionId,86400000,50),window2}function getActiveWindow(sessionId){let session=swarmState.agentSessions.get(sessionId);if(!session||!session.windows)return;let key2=`${stripKnownSwarmPrefix(session.agentName)}:${session.activeInvocationId}`;return session.windows[key2]}function pruneOldWindows(sessionId,maxAgeMs=86400000,maxWindows=50){let session=swarmState.agentSessions.get(sessionId);if(!session||!session.windows)return;let now=Date.now(),toKeep=Object.entries(session.windows).filter(([_,window2])=>now-window2.startedAtMs<maxAgeMs).sort((a,b)=>b[1].startedAtMs-a[1].startedAtMs).slice(0,maxWindows);session.windows=Object.fromEntries(toKeep)}function recordPhaseAgentDispatch(sessionId,agentName){let session=swarmState.agentSessions.get(sessionId);if(!session)return;if(!session.phaseAgentsDispatched)session.phaseAgentsDispatched=new Set;let normalizedName=stripKnownSwarmPrefix(agentName);session.phaseAgentsDispatched.add(normalizedName)}function ensureModifiedFilesByTask(session){if(!(session.modifiedFilesByTask instanceof Map))session.modifiedFilesByTask=new Map;return session.modifiedFilesByTask}function projectModifiedFilesForActiveTask(session){let taskId=session.currentTaskId;session.modifiedFilesThisCoderTask=isValidTaskId2(taskId)&&session.modifiedFilesByTask instanceof Map?[...session.modifiedFilesByTask.get(taskId)??[]]:[]}function ensureModifiedFileTaskSlot(session,taskId){if(!isValidTaskId2(taskId))return!1;let entries=ensureModifiedFilesByTask(session);if(entries.has(taskId))return!0;while(entries.size>=MAX_TRACKED_TASK_FILE_ATTRIBUTIONS){let reclaimable=[...entries.keys()].find((candidate)=>candidate!==taskId&&session.taskWorkflowStates?.get(candidate)==="complete");if(!reclaimable)return!1;entries.delete(reclaimable)}return entries.set(taskId,[]),!0}function recordModifiedFilesForTask(session,taskId,files,workspaceDirectory){if(!ensureModifiedFileTaskSlot(session,taskId))return!1;let normalized=[...new Set(files.map((file3)=>canonicalAttributionPath(file3,workspaceDirectory)).filter((file3)=>file3!==null))];if(session.modifiedFilesByTask.set(taskId,normalized),session.currentTaskId===taskId)projectModifiedFilesForActiveTask(session);return!0}function recordModifiedFileForTask(session,taskId,file3,workspaceDirectory){if(typeof file3!=="string"||file3.trim().length===0)return!1;if(!ensureModifiedFileTaskSlot(session,taskId))return!1;let canonical=canonicalAttributionPath(file3,workspaceDirectory);if(canonical===null)return!0;let entries=ensureModifiedFilesByTask(session),current=entries.get(taskId)??[];if(current.includes(canonical))return!0;if(entries.set(taskId,[...current,canonical]),session.currentTaskId===taskId)projectModifiedFilesForActiveTask(session);return!0}function hasModifiedFilesForTask(session,taskId){if(!session)return!1;if(!isValidTaskId2(taskId))return!1;if(!(session.modifiedFilesByTask instanceof Map))return!1;return session.modifiedFilesByTask.has(taskId)}function getModifiedFilesForTask(session,taskId){if(!isValidTaskId2(taskId))return[];return[...ensureModifiedFilesByTask(session).get(taskId)??[]]}function resetModifiedFilesForTask(session,taskId,options){if(!isValidTaskId2(taskId))return!1;let entries=ensureModifiedFilesByTask(session);if(options?.remove)entries.delete(taskId);else{if(!ensureModifiedFileTaskSlot(session,taskId))return!1;entries.set(taskId,[])}if(session.currentTaskId===taskId)projectModifiedFilesForActiveTask(session);return!0}function completeModifiedFilesForTask(session,taskId){if(!session.epicModeActive)resetModifiedFilesForTask(session,taskId,{remove:!0})}function isValidTaskId2(taskId){if(taskId===null||taskId===void 0)return!1;if(typeof taskId!=="string")return!1;return taskId.trim().length>0}function ensureTaskWorkflowCache(session){if(!session.taskWorkflowCache)session.taskWorkflowCache=new Map;return session.taskWorkflowCache}function updateTaskWorkflowCache(session,taskId,overrides2){let cache2=ensureTaskWorkflowCache(session),existing=cache2.get(taskId);cache2.set(taskId,{generation:overrides2.generation??existing?.generation??0,retryCount:overrides2.retryCount??existing?.retryCount??0,lastOutcome:overrides2.lastOutcome??existing?.lastOutcome??"none",lastTransitionId:overrides2.lastTransitionId??existing?.lastTransitionId??null,updatedAt:overrides2.updatedAt??existing?.updatedAt??""})}function advanceTaskState(session,taskId,newState2,options,councilConfig){if(!isValidTaskId2(taskId))return;if(!session||!(session.taskWorkflowStates instanceof Map))throw Error("INVALID_SESSION: session.taskWorkflowStates must be a Map instance");let current=session.taskWorkflowStates.get(taskId)??"idle",currentIndex=LINEAR_STATE_ORDER.indexOf(current),newIndex=LINEAR_STATE_ORDER.indexOf(newState2);if(currentIndex===-1||newIndex===-1||newIndex<=currentIndex)throw Error(`INVALID_TASK_STATE_TRANSITION: ${taskId} ${current} → ${newState2}`);if(newState2==="complete"&¤t!=="tests_run"){let councilEntry=session.taskCouncilApproved?.get(taskId),effectiveMinimum=councilConfig?.requireAllMembers?5:councilConfig?.minimumMembers??3,councilApproved=councilEntry?.verdict==="APPROVE"&&(councilEntry.quorumSize??0)>=effectiveMinimum,pastPreCheck=currentIndex>=LINEAR_STATE_ORDER.indexOf("pre_check_passed");if(!councilApproved||!pastPreCheck)throw Error(`INVALID_TASK_STATE_TRANSITION: ${taskId} cannot reach complete from ${current} — must pass through tests_run first (or have council APPROVE after pre_check)`)}if(session.taskWorkflowStates.set(taskId,newState2),updateTaskWorkflowCache(session,taskId,{updatedAt:new Date().toISOString()}),newState2==="complete")session.stageBCompletion?.delete(taskId),clearStageBRouteEvidence(session,taskId),clearStageBRouteRequired(session,taskId),completeModifiedFilesForTask(session,taskId);if(options?.emitTelemetry!==!1)telemetry.taskStateChanged(options?.telemetrySessionId??session.agentName,taskId,newState2,current)}function canAdvanceTaskState(session,taskId,newState2,councilConfig){if(!isValidTaskId2(taskId))return!1;if(!session||!(session.taskWorkflowStates instanceof Map))return!1;let current=session.taskWorkflowStates.get(taskId)??"idle",currentIndex=LINEAR_STATE_ORDER.indexOf(current),newIndex=LINEAR_STATE_ORDER.indexOf(newState2);if(currentIndex===-1||newIndex===-1||newIndex<=currentIndex)return!1;if(newState2==="complete"&¤t!=="tests_run"){let councilEntry=session.taskCouncilApproved?.get(taskId),effectiveMinimum=councilConfig?.requireAllMembers?5:councilConfig?.minimumMembers??3,councilApproved=councilEntry?.verdict==="APPROVE"&&(councilEntry.quorumSize??0)>=effectiveMinimum,pastPreCheck=currentIndex>=LINEAR_STATE_ORDER.indexOf("pre_check_passed");if(!councilApproved||!pastPreCheck)return!1}return!0}async function advanceTaskStateAndPersist(session,taskId,newState2,_directory2,options,councilConfig){if(newState2==="coder_delegated"||newState2==="complete")throw Error(`TASK_WORKFLOW_CENTRAL_TRANSACTION_REQUIRED: ${taskId} → ${newState2} must use exact-task durable transition APIs`);advanceTaskState(session,taskId,newState2,options,councilConfig)}function getTaskState(session,taskId){if(!isValidTaskId2(taskId))return"idle";if(!session.taskWorkflowStates)session.taskWorkflowStates=new Map;return session.taskWorkflowStates.get(taskId)??"idle"}function recordStageBCompletion(session,taskId,agent){if(!isValidTaskId2(taskId))return;if(!session.stageBCompletion)session.stageBCompletion=new Map;let existing=session.stageBCompletion.get(taskId);if(existing)existing.add(agent);else session.stageBCompletion.set(taskId,new Set([agent]))}function reserveStageBRouteEvidence(session,taskId,evidence){if(!isValidTaskId2(taskId))return null;if(!session.stageBRouteEvidence)session.stageBRouteEvidence=new Map;let entries=session.stageBRouteEvidence.get(taskId)??[],dispatchIdentity=(entry)=>{if(!entry.callId||!entry.childSessionId||typeof entry.generation!=="number")return null;return[entry.role,entry.sessionId??"",entry.taskId??"",entry.callId,entry.childSessionId,String(entry.generation)].join("\x00")},incomingDispatchIdentity=dispatchIdentity(evidence),existingIndex=entries.findIndex((entry)=>entry.role===evidence.role&&(incomingDispatchIdentity!==null&&dispatchIdentity(entry)===incomingDispatchIdentity||incomingDispatchIdentity===null&&dispatchIdentity(entry)===null&&entry.identity===evidence.identity));if(existingIndex>=0){let previousEntry=entries[existingIndex],reservedEntry2={...evidence};return entries[existingIndex]=reservedEntry2,session.stageBRouteEvidence.set(taskId,entries),()=>{if(session.stageBRouteEvidence?.get(taskId)!==entries)return;let reservedIndex=entries.indexOf(reservedEntry2);if(reservedIndex<0)return;entries[reservedIndex]=previousEntry}}if(entries.length>=32)return null;let reservedEntry={...evidence};return entries.push(reservedEntry),session.stageBRouteEvidence.set(taskId,entries),()=>{if(session.stageBRouteEvidence?.get(taskId)!==entries)return;let reservedIndex=entries.indexOf(reservedEntry);if(reservedIndex<0)return;if(entries.splice(reservedIndex,1),entries.length===0)session.stageBRouteEvidence?.delete(taskId)}}function recordStageBRouteEvidence(session,taskId,evidence){return reserveStageBRouteEvidence(session,taskId,evidence)!==null}function getStageBRouteEvidence(session,taskId){return(session.stageBRouteEvidence?.get(taskId)??[]).map((entry)=>({...entry}))}function clearStageBRouteEvidence(session,taskId){session.stageBRouteEvidence?.delete(taskId)}function markStageBRouteRequired(session,taskId){if(!session.stageBRouteRequiredTasks)session.stageBRouteRequiredTasks=new Set;session.stageBRouteRequiredTasks.add(taskId)}function isStageBRouteRequired(session,taskId){return session.stageBRouteRequiredTasks?.has(taskId)===!0}function clearStageBRouteRequired(session,taskId){session.stageBRouteRequiredTasks?.delete(taskId)}function hasBothStageBCompletions(session,taskId){if(!isValidTaskId2(taskId))return!1;let completions=session.stageBCompletion?.get(taskId);if(!completions)return!1;return completions.has("reviewer")&&completions.has("test_engineer")}async function isCouncilGateActive(directory,council,sessionOverrides={}){let enabled=council?.enabled===!0,plan=null;try{plan=await loadPlanJsonOnly(directory)}catch{plan=null}if(!plan)return!1;let planId=derivePlanId(plan),lookup=null;try{lookup=getProfileLookupForIdentity(directory,plan)}catch(err){let msg=err instanceof Error?err.message:String(err);if(!(msg.includes("SQLITE_CANTOPEN")||msg.includes("ENOENT")))warn(`[isCouncilGateActive] getProfile threw unexpectedly for plan ${planId}: ${msg}. Treating council as inactive.`);lookup=null}if(!lookup||lookup.kind==="missing")return!1;if(lookup.kind==="unbound_legacy")return enabled&&lookup.profile.gates.council_mode===!0;let profile=lookup.profile,councilMode=getEffectiveGates(profile,sessionOverrides).council_mode===!0;if(enabled&&councilMode)return!0;if(enabled!==councilMode&&!_councilDisagreementWarned.has(planId))_councilDisagreementWarned.add(planId),warn(`[delegation-gate] Council mode mismatch for plan ${planId}: pluginConfig.council.enabled=${enabled}, QaGates.council_mode=${councilMode}. Falling back to Stage B (non-council) per-task advancement.`);return!1}function _resetCouncilDisagreementWarnings(){_councilDisagreementWarned.clear()}function planStatusToWorkflowState(status){switch(status){case"in_progress":return"idle";case"completed":return"complete";case"blocked":return"blocked";case"closed":return"closed";default:return"idle"}}function evidenceToWorkflowState(evidence){let snapshot=getTaskWorkflowSnapshot(evidence);return{state:snapshot.state,generation:snapshot.generation,authoritative:snapshot.authoritative,retryCount:snapshot.retryCount,lastOutcome:snapshot.lastOutcome,lastTransitionId:snapshot.lastTransitionId,updatedAt:snapshot.updatedAt}}async function readPlanFromDisk(directory){try{let planPath=path100.join(directory,".swarm","plan.json"),content=await fs62.readFile(planPath,"utf-8"),parsed=JSON.parse(content);return PlanSchema.parse(parsed)}catch{return null}}async function readGateEvidenceFromDisk(directory){let evidenceMap=new Map;try{let evidenceDir=path100.join(directory,".swarm","evidence"),entries=await fs62.readdir(evidenceDir,{withFileTypes:!0});for(let entry of entries){if(!entry.isFile()||!entry.name.endsWith(".json"))continue;let taskId=entry.name.replace(/\.json$/,"");if(!/^\d+\.\d+(\.\d+)*$/.test(taskId))continue;try{let filePath=path100.join(evidenceDir,entry.name),content=await fs62.readFile(filePath,"utf-8"),parsed=parseTaskEvidence(content,taskId);evidenceMap.set(taskId,parsed)}catch{}}}catch{}return evidenceMap}async function buildRehydrationCache(directory,options){let projectKey=hydrationProjectKey(directory),buildAuthority=captureCurrentHydrationAuthority(projectKey),planTaskStates=new Map,plan=options&&Object.hasOwn(options,"planOverride")?options.planOverride:await readPlanFromDisk(directory),cachePlan=plan??null;if(plan)for(let phase of plan.phases??[])for(let task of phase.tasks??[])planTaskStates.set(task.id,planStatusToWorkflowState(task.status));let evidenceMap=await readGateEvidenceFromDisk(directory),councilConfig;try{councilConfig=loadPluginConfig(directory).council}catch{councilConfig=void 0}if(options?.shouldCommit&&!options.shouldCommit()||!isHydrationAuthorityCurrent(buildAuthority))return{committed:!1,reason:"superseded"};return setRehydrationCache(projectKey,{planTaskStates,evidenceMap,taskIdentityContext:{plan:cachePlan,councilConfig}},buildAuthority)?{committed:!0}:{committed:!1,reason:"superseded"}}function applyRehydrationCache(session,projectKey){let resolvedKey=projectKey??session.owningProjectKey;if(!resolvedKey)return;let cache2=getRehydrationCache(resolvedKey);if(!cache2)return;if(!session.taskWorkflowStates)session.taskWorkflowStates=new Map;if(!session.taskWorkflowCache)session.taskWorkflowCache=new Map;if(!session.taskCouncilApproved)session.taskCouncilApproved=new Map;let{planTaskStates,evidenceMap,taskIdentityContext}=cache2;for(let[taskId,planState]of planTaskStates){let existingState=session.taskWorkflowStates.get(taskId),existingCache=ensureTaskWorkflowCache(session).get(taskId),evidence=evidenceMap.get(taskId);if(evidence){let derivedWorkflow=evidenceToWorkflowState(evidence);if(derivedWorkflow.authoritative){session.taskWorkflowStates.set(taskId,derivedWorkflow.state),updateTaskWorkflowCache(session,taskId,{generation:derivedWorkflow.generation,retryCount:derivedWorkflow.retryCount,lastOutcome:derivedWorkflow.lastOutcome,lastTransitionId:derivedWorkflow.lastTransitionId,updatedAt:derivedWorkflow.updatedAt});continue}}if((existingCache?.generation??0)>0)continue;if(existingState==null||compareWorkflowStatePrecedence(planState,existingState)>0)session.taskWorkflowStates.set(taskId,planState)}let VALID_COUNCIL_VERDICTS=new Set(["APPROVE","REJECT","CONCERNS"]);for(let[taskId,evidence]of evidenceMap){let council=evidence.gates?.council;if(!council){session.taskCouncilApproved.delete(taskId);continue}let rawIdentityDigest=council.identity_digest;if(typeof rawIdentityDigest!=="string"||!/^[a-f0-9]{64}$/.test(rawIdentityDigest)){session.taskCouncilApproved.delete(taskId);continue}let expectedIdentity=computeCouncilReviewIdentity({level:"task",scope:{kind:"task",taskId},plan:taskIdentityContext.plan,config:taskIdentityContext.councilConfig});if(rawIdentityDigest!==expectedIdentity.identityDigest){session.taskCouncilApproved.delete(taskId);continue}let councilWorkflow=getTaskWorkflowSnapshot(evidence);if(!councilWorkflow.authoritative||council.workflowGeneration!==councilWorkflow.generation||councilWorkflow.state!=="pre_check_passed"){session.taskCouncilApproved.delete(taskId);continue}let rawVerdict=council.verdict;if(!rawVerdict||typeof rawVerdict!=="string")continue;if(!VALID_COUNCIL_VERDICTS.has(rawVerdict))continue;let verdict=rawVerdict,roundNumber=council.roundNumber;if(typeof roundNumber!=="number"||!Number.isFinite(roundNumber))roundNumber=1;let rawQuorumSize=council.quorumSize,quorumSize=typeof rawQuorumSize==="number"&&Number.isFinite(rawQuorumSize)&&rawQuorumSize>=1?rawQuorumSize:1;session.taskCouncilApproved.set(taskId,{verdict,roundNumber,quorumSize})}}async function rehydrateSessionFromDisk(directory,session,shouldCommit){let cacheBuild=shouldCommit?await _internals86.buildRehydrationCache(directory,{shouldCommit}):await _internals86.buildRehydrationCache(directory);if(cacheBuild&&!cacheBuild.committed)return;if(shouldCommit&&!shouldCommit())return;_internals86.applyRehydrationCache(session,hydrationProjectKey(directory))}function hasActiveTurboMode(sessionID){if(sessionID)return swarmState.agentSessions.get(sessionID)?.turboMode===!0;for(let[_sessionId,session]of swarmState.agentSessions)if(session.turboMode===!0)return!0;return!1}function hasActiveFullAuto(sessionID){if(sessionID)return swarmState.agentSessions.get(sessionID)?.fullAutoMode===!0;for(let[_sessionId,session]of swarmState.agentSessions)if(session.fullAutoMode===!0)return!0;return!1}function getActiveFullAutoSessionID(){let activeId,activeLastToolCall=-1;for(let[id,session]of swarmState.agentSessions){if(session.fullAutoMode!==!0)continue;let lastToolCall=session.lastToolCallTime??0;if(activeId===void 0||lastToolCall>activeLastToolCall)activeId=id,activeLastToolCall=lastToolCall}return activeId}function hasActiveLeanTurbo(sessionID){if(sessionID){let session=swarmState.agentSessions.get(sessionID);return session?.turboMode===!0&&session?.turboStrategy==="lean"&&session?.leanTurboActive===!0}for(let[_sessionId,session]of swarmState.agentSessions)if(session.turboMode===!0&&session.turboStrategy==="lean"&&session.leanTurboActive===!0)return!0;return!1}function hasActiveEpicMode(sessionID){if(sessionID)return swarmState.agentSessions.get(sessionID)?.epicModeActive===!0;for(let[_sessionId,session]of swarmState.agentSessions)if(session.epicModeActive===!0)return!0;return!1}function getResolvedAutoProceed(session,planAutoProceed){return session.autoProceedOverride??planAutoProceed??!1}function setSessionEnvironment(sessionId,profile){swarmState.environmentProfiles.set(sessionId,profile)}function getSessionEnvironment(sessionId){return swarmState.environmentProfiles.get(sessionId)}function ensureSessionEnvironment(sessionId){let existing=swarmState.environmentProfiles.get(sessionId);if(existing)return existing;let profile=detectEnvironmentProfile();return swarmState.environmentProfiles.set(sessionId,profile),Promise.resolve().then(() => (init_telemetry(),exports_telemetry)).then(({telemetry:telemetry2})=>{telemetry2.environmentDetected(sessionId,profile.hostOS,profile.shellFamily,profile.executionMode)}).catch(()=>{}),profile}function setLiveContextWindow(sessionID,tokens,identity){if(!sessionID)return;let map3=swarmState.liveContextWindows,modelID=trimLiveContextIdentity(identity?.modelID),providerID=trimLiveContextIdentity(identity?.providerID),hasIdentity=Boolean(modelID||providerID),existing=map3.get(sessionID);if(!(typeof tokens==="number"&&Number.isFinite(tokens)&&tokens>=1)){if(!hasIdentity)return;if(existing&&liveContextIdentityMatches(existing,{modelID,providerID})&&existing.tokens!==void 0)return;if(map3.has(sessionID))map3.delete(sessionID);map3.set(sessionID,{modelID,providerID}),evictOldestLiveContextWindow(map3,sessionID);return}if(!hasIdentity&&existing&&(existing.modelID||existing.providerID))return;if(map3.has(sessionID))map3.delete(sessionID);map3.set(sessionID,{tokens:Math.floor(tokens),modelID,providerID}),evictOldestLiveContextWindow(map3,sessionID)}function getLiveContextWindow(sessionID,identity){if(!sessionID)return;let cached3=swarmState.liveContextWindows.get(sessionID);if(!cached3)return;if(identity&&!liveContextIdentityMatches(cached3,identity))return;return cached3.tokens}function getLiveContextModelIdentity(sessionID){if(!sessionID)return;let cached3=swarmState.liveContextWindows.get(sessionID);if(!cached3)return;return{modelID:cached3.modelID,providerID:cached3.providerID}}function evictOldestLiveContextWindow(map3,sessionID){if(map3.size<=MAX_TRACKED_CONTEXT_WINDOWS)return;let oldest=map3.keys().next().value;if(oldest!==void 0&&oldest!==sessionID)map3.delete(oldest)}function trimLiveContextIdentity(value){let trimmed=value?.trim();return trimmed?trimmed:void 0}function normalizeLiveContextIdentity(value){return trimLiveContextIdentity(value)?.toLowerCase()??""}function liveContextIdentityMatches(left,right){return normalizeLiveContextIdentity(left.modelID)===normalizeLiveContextIdentity(right.modelID)&&normalizeLiveContextIdentity(left.providerID)===normalizeLiveContextIdentity(right.providerID)}function setSessionBudget(sessionID,pct,tokens){let map3=swarmState.lastBudgetBySession;if(map3.has(sessionID))map3.delete(sessionID);if(map3.set(sessionID,{pct,tokens}),map3.size>MAX_TRACKED_BUDGET_SESSIONS){let oldest=map3.keys().next().value;if(oldest!==void 0&&oldest!==sessionID)map3.delete(oldest)}}function setFinalPromptPressure(sessionID,snapshot){let map3=swarmState.finalPromptPressureBySession;if(map3.has(sessionID))map3.delete(sessionID);if(map3.set(sessionID,snapshot),map3.size>MAX_TRACKED_BUDGET_SESSIONS){let oldest=map3.keys().next().value;if(oldest!==void 0&&oldest!==sessionID)map3.delete(oldest)}}function getFinalPromptPressure(sessionID){if(!sessionID)return;return swarmState.finalPromptPressureBySession.get(sessionID)}function setFinalAccountingWarningBand(sessionID,band){let map3=swarmState.finalAccountingWarningBandsBySession,entry=map3.get(sessionID)??{warn:!1,critical:!1};if(map3.has(sessionID))map3.delete(sessionID);if(band==="critical")entry.critical=!0;else entry.warn=!0;if(map3.set(sessionID,entry),map3.size>MAX_TRACKED_BUDGET_SESSIONS){let oldest=map3.keys().next().value;if(oldest!==void 0&&oldest!==sessionID)map3.delete(oldest)}}function getFinalAccountingWarningBand(sessionID,band){if(!sessionID)return!1;let entry=swarmState.finalAccountingWarningBandsBySession.get(sessionID);if(!entry)return!1;return band==="critical"?entry.critical:entry.warn}function clearFinalAccountingWarningBands(){swarmState.finalAccountingWarningBandsBySession.clear()}function getSessionBudgetPct(sessionID){if(!sessionID)return 0;return swarmState.lastBudgetBySession.get(sessionID)?.pct??0}function getSessionBudgetTokens(sessionID){if(!sessionID)return 0;return swarmState.lastBudgetBySession.get(sessionID)?.tokens??0}function getDisplayBudget(){let best=null;for(let entry of swarmState.lastBudgetBySession.values())if(entry.pct>0&&(best===null||entry.pct>best.pct))best=entry;return best}function getDisplayFinalPromptPressure(){let best=null;for(let entry of swarmState.finalPromptPressureBySession.values())if(entry.pct>0&&(best===null||entry.pct>best.pct))best=entry;return best}function setCriticalShownIds(sessionID,value){let map3=swarmState.currentCriticalShownIds;if(map3.has(sessionID))map3.delete(sessionID);if(map3.set(sessionID,value),map3.size>MAX_TRACKED_CRITICAL_SHOWN){let oldest=map3.keys().next().value;if(oldest!==void 0&&oldest!==sessionID)map3.delete(oldest)}}function clearCriticalShownIds(sessionID){return swarmState.currentCriticalShownIds.delete(sessionID)}function buildGateDenialDirectiveKey(ids){return[...ids].sort().join(",")}function incrementGateDenialCount(sessionID,directiveKey){let map3=swarmState.gateDenialCounts,existing=map3.get(sessionID),count=existing&&existing.directiveKey===directiveKey?existing.count+1:1;if(map3.has(sessionID))map3.delete(sessionID);if(map3.set(sessionID,{count,directiveKey}),map3.size>MAX_TRACKED_GATE_DENIALS){let oldest=map3.keys().next().value;if(oldest!==void 0&&oldest!==sessionID)map3.delete(oldest)}return count}function clearGateDenialCount(sessionID){swarmState.gateDenialCounts.delete(sessionID)}function addKnowledgeAckDedup(key2){let set3=swarmState.knowledgeAckDedup;if(set3.has(key2))return;if(set3.add(key2),set3.size>MAX_TRACKED_KNOWLEDGE_ACKS){let oldest=set3.values().next().value;if(oldest!==void 0)set3.delete(oldest)}}async function rehydratePrSubscriptions(sessionID,directory){let map3=new Map;try{let{listActive:listActive2}=await Promise.resolve().then(() => (init_pr_subscriptions(),exports_pr_subscriptions)),records=await listActive2(directory);for(let record3 of records){if(record3.sessionID!==sessionID)continue;let key2=`${record3.repoFullName}::${record3.prNumber}`;map3.set(key2,{prNumber:record3.prNumber,repoFullName:record3.repoFullName,prUrl:record3.prUrl,lastKnownStatus:record3.mergeableState??"unknown",lastPollTime:record3.lastCheckedAt,errorCount:record3.errorCount,isWatching:record3.isWatching})}}catch(err){warn(`[state] rehydratePrSubscriptions failed for session ${sessionID}: ${err instanceof Error?err.message:String(err)}`)}return map3}var _councilDisagreementWarned,MAX_TRACKED_TASK_FILE_ATTRIBUTIONS=128,LINEAR_STATE_ORDER,_toolAggregates,defaultRunContext,_runContexts,swarmState,STALE_SESSION_TTL_MS=7200000,MAX_REVIEWER_SCOPE_GENERATION_FILES=256,MAX_REVIEWER_SCOPE_GENERATIONS=256,MAX_REVIEWER_SCOPE_OWNERSHIP_HISTORY=256,REVIEWER_SCOPE_GENERATION_TTL_MS,IDLE_SWEEP_COOLDOWN_MS=60000,_lastIdleSweepAtMs=0,MAX_TRACKED_BUDGET_SESSIONS=500,MAX_TRACKED_CRITICAL_SHOWN=500,MAX_TRACKED_KNOWLEDGE_ACKS=5000,MAX_TRACKED_GATE_DENIALS=500,MAX_TRACKED_CONTEXT_WINDOWS=500,_internals86;var init_state2=__esm(()=>{init_constants();init_loader();init_plan_schema();init_schema();init_council_review_identity();init_qa_gate_profile();init_qa_gate_session_override();init_action_circuit();init_gate_evidence();init_delegation_gate();init_realtime_learning_nudge();init_trajectory_step_state();init_candidate_queue();init_prm_pattern_support();init_task_model_routing();init_manager();init_utils3();init_trajectory_store();init_scope_binding();init_scope_persistence();init_injection_budget();init_hydration_ownership();init_session_start_store();init_snapshot_store();init_worktree_link_suggestion();init_telemetry();init_logger();init_path();_councilDisagreementWarned=new Set,LINEAR_STATE_ORDER=["idle","coder_delegated","pre_check_passed","reviewer_run","tests_run","complete"];_toolAggregates=new Map,defaultRunContext=new AgentRunContext("default",_toolAggregates),_runContexts=new Map;swarmState={activeToolCalls:defaultRunContext.activeToolCalls,toolAggregates:defaultRunContext.toolAggregates,activeAgent:defaultRunContext.activeAgent,delegationChains:defaultRunContext.delegationChains,pendingEvents:0,opencodeClient:null,curatorInitAgentNames:[],curatorPhaseAgentNames:[],curatorPostmortemAgentNames:[],curatorConsolidationAgentNames:[],skillImproverAgentNames:[],specWriterAgentNames:[],currentCriticalShownIds:new Map,knowledgeAckDedup:new Set,gateDenialCounts:new Map,generatedAgentNames:[],lastBudgetBySession:new Map,finalPromptPressureBySession:new Map,finalAccountingWarningBandsBySession:new Map,liveContextWindows:new Map,agentSessions:defaultRunContext.agentSessions,pendingRehydrations:new Set,fullAutoEnabledInConfig:!1,environmentProfiles:defaultRunContext.environmentProfiles};REVIEWER_SCOPE_GENERATION_TTL_MS=STALE_SESSION_TTL_MS;_internals86={swarmState,resetSwarmState,ensureAgentSession,startAgentSession,loadPluginConfigWithMeta,resolveInitialTurboMode,getAgentSession,beginInvocation,getActiveWindow,advanceTaskState,getTaskState,hasActiveFullAuto,hasActiveTurboMode,hasActiveLeanTurbo,hasActiveEpicMode,buildRehydrationCache,applyRehydrationCache,rehydrateSessionFromDisk,rehydratePrSubscriptions,isCouncilGateActive,defaultRunContext}});async function boundedSessionCall(call,timeoutMs,timeoutLabel,failureLabel,sessionId){let timer;try{await Promise.race([call(),new Promise((_resolve,reject)=>{timer=setTimeout(()=>reject(Error(`${timeoutLabel} after ${timeoutMs}ms`)),Math.max(1,timeoutMs))})])}catch(error93){_internals87.log(`${failureLabel} for ephemeral session`,{sessionId,error:error93 instanceof Error?error93.message:String(error93)})}finally{if(timer)clearTimeout(timer)}}async function boundedAbortEphemeralSession(session,sessionId,timeoutMs=DEFAULT_EPHEMERAL_ABORT_TIMEOUT_MS){if(typeof session.abort!=="function")return;await _internals87.boundedSessionCall(()=>session.abort({path:{id:sessionId}}),timeoutMs,"ephemeral session abort timed out","ephemeral session abort failed",sessionId)}async function boundedDeleteEphemeralSession(session,sessionId,timeoutMs=DEFAULT_EPHEMERAL_TEARDOWN_DELETE_TIMEOUT_MS){await _internals87.boundedSessionCall(()=>session.delete({path:{id:sessionId}}),timeoutMs,"ephemeral session delete timed out","ephemeral session delete failed",sessionId)}async function teardownEphemeralSession(session,sessionId,options={}){let abortTimeoutMs=options.abortTimeoutMs??DEFAULT_EPHEMERAL_ABORT_TIMEOUT_MS,deleteTimeoutMs=options.deleteTimeoutMs??DEFAULT_EPHEMERAL_TEARDOWN_DELETE_TIMEOUT_MS;if(!(options.skipAbort??!1))await _internals87.boundedAbort(session,sessionId,abortTimeoutMs);await _internals87.boundedDelete(session,sessionId,deleteTimeoutMs)}async function sessionExists(session,sessionId,verifyTimeoutMs){if(typeof session.get!=="function")return!0;try{let body=(await withTimeout(session.get({path:{id:sessionId}}),verifyTimeoutMs,Error(`ephemeral session verify timed out after ${verifyTimeoutMs}ms`)))?.data;if(body===void 0||body===null)return!1;return!0}catch{return!1}}async function teardownEphemeralSessionVerified(session,sessionId,options={}){let verifyTimeoutMs=options.verifyTimeoutMs??DEFAULT_EPHEMERAL_VERIFY_TIMEOUT_MS,attempts=Math.min(6,Math.max(2,options.maxDeleteAttempts??DEFAULT_EPHEMERAL_MAX_DELETE_ATTEMPTS));if(typeof session.get!=="function")return await teardownEphemeralSession(session,sessionId,options),{ok:!1,sessionId,attempts:1,kind:"ephemeral-session-teardown-unverified",reason:"get-unavailable"};let deleteAttempts=0;for(;;){if(await teardownEphemeralSession(session,sessionId,{...options,skipAbort:deleteAttempts>0?!0:options.skipAbort}),deleteAttempts+=1,!await _internals87.sessionExists(session,sessionId,verifyTimeoutMs))return{ok:!0,sessionId,attempts:deleteAttempts};if(deleteAttempts>=attempts)return{ok:!1,sessionId,attempts:deleteAttempts,kind:"ephemeral-session-teardown-unverified",reason:"session-survived-bounded-retries"}}}var DEFAULT_EPHEMERAL_ABORT_TIMEOUT_MS=5000,DEFAULT_EPHEMERAL_TEARDOWN_DELETE_TIMEOUT_MS=2000,DEFAULT_EPHEMERAL_VERIFY_TIMEOUT_MS=2000,DEFAULT_EPHEMERAL_MAX_DELETE_ATTEMPTS=3,_internals87;var init_ephemeral_session_teardown=__esm(()=>{init_logger();init_timeout();_internals87={boundedSessionCall,boundedAbort:boundedAbortEphemeralSession,boundedDelete:boundedDeleteEphemeralSession,sessionExists,log}});var init_worktree=__esm(()=>{init_core3();init_merge2()});function verifyReviewerScopeGenerationMergeBack(input){try{let generation=getReviewerScopeGenerationForCoderCall({parentSessionID:input.parentSessionID,taskId:input.taskId,coderCallID:input.coderCallID,now:input.now});if(!generation||generation.modifiedFiles.length===0)return;if(generation.status!=="collecting"&&generation.status!=="mergeback_pending")return;if(generation.status==="collecting"){if(!markReviewerScopeGenerationMergebackPending({parentSessionID:input.parentSessionID,taskId:input.taskId,coderCallID:input.coderCallID,at:input.now}))return}let session=ensureAgentSession(input.parentSessionID),deadlineAt=(input.now??Date.now())+REVIEWER_SCOPE_CAPTURE_BATCH_DEADLINE_MS;for(let file3 of generation.modifiedFiles){let stored=generation.modifiedFileFingerprints.find((entry)=>entry.file===file3);if(!stored){settleReviewerScopeMergeback({parentSessionID:input.parentSessionID,taskId:input.taskId,coderCallID:input.coderCallID,outcome:{verified:!1,reason:`incomplete fingerprints: ${file3} has no stored capture`,at:input.now}}),pushAdvisory(session,`REVIEWER_SCOPE_MERGEBACK_MISMATCH: task ${input.taskId}: merge-back verification found no stored fingerprint for ${file3}. ACTION[architect]: re-dispatch the coder for this task`);return}let captured=captureReviewerScopeFileFingerprint(input.primaryDirectory,file3,{deadlineAt});if(captured.kind==="capture_failed"){settleReviewerScopeMergeback({parentSessionID:input.parentSessionID,taskId:input.taskId,coderCallID:input.coderCallID,outcome:{verified:!1,reason:`capture ${captured.code} on ${captured.file}`,at:input.now}}),pushAdvisory(session,`REVIEWER_SCOPE_MERGEBACK_MISMATCH: task ${input.taskId}: primary-checkout capture failed for ${captured.file} (${captured.code}). ACTION[architect]: verify the primary checkout, then re-dispatch the reviewer`);return}let capturedFingerprint=reviewerScopeCaptureToFingerprint(captured);if(!capturedFingerprint||!reviewerScopeFileFingerprintsEqual(stored,capturedFingerprint)){settleReviewerScopeMergeback({parentSessionID:input.parentSessionID,taskId:input.taskId,coderCallID:input.coderCallID,outcome:{verified:!1,reason:`primary bytes differ from lane manifest on ${file3}`,at:input.now}}),pushAdvisory(session,`REVIEWER_SCOPE_MERGEBACK_MISMATCH: task ${input.taskId}: primary-checkout bytes differ from the lane manifest on ${file3}; lane evidence retained. ACTION[architect]: resolve the merge conflict or re-dispatch the coder`);return}}let primaryIdentity=canonicalWorkspaceIdentity(input.primaryDirectory);settleReviewerScopeMergeback({parentSessionID:input.parentSessionID,taskId:input.taskId,coderCallID:input.coderCallID,outcome:{verified:!0,primaryWorkspaceIdentity:primaryIdentity??input.primaryDirectory,primaryDirectory:input.primaryDirectory,at:input.now}}),pushAdvisory(session,`REVIEWER_SCOPE_MERGEBACK_VERIFIED: task ${input.taskId}: primary checkout matches the lane manifest exactly; reviewer dispatch is enabled`)}catch(error93){try{let session=ensureAgentSession(input.parentSessionID);pushAdvisory(session,`REVIEWER_SCOPE_MERGEBACK_MISMATCH: task ${input.taskId}: merge-back verification errored (${String(error93).slice(0,200)}). ACTION[architect]: re-dispatch the reviewer to retry verification`),settleReviewerScopeMergeback({parentSessionID:input.parentSessionID,taskId:input.taskId,coderCallID:input.coderCallID,outcome:{verified:!1,reason:"verification error",at:input.now}})}catch{}}}var init_reviewer_scope_mergeback=__esm(()=>{init_scope_binding();init_state2();init_reviewer_scope_file_fingerprint()});import{createHash as createHash45,randomBytes as randomBytes7}from"node:crypto";import*as fs63 from"node:fs";import*as path101 from"node:path";function nowMs2(input){return input??Date.now()}function sha2565(input){return createHash45("sha256").update(input).digest("hex")}function storePath4(directory){return path101.join(directory,STORE_RELATIVE_PATH)}function journalPath2(directory){return path101.join(directory,JOURNAL_RELATIVE_PATH)}function credentialPath(directory,authorityDigest){return path101.join(directory,CREDENTIAL_DIRECTORY,`${authorityDigest}.json`)}function readAuthorityLockRecord(lockPath){try{let parsed=JSON.parse(fs63.readFileSync(lockPath,"utf8"));if(typeof parsed?.nonce==="string"&&typeof parsed?.acquiredAt==="number"&&Number.isFinite(parsed.acquiredAt)&&typeof parsed?.pid==="number"&&Number.isInteger(parsed.pid))return{nonce:parsed.nonce,acquiredAt:parsed.acquiredAt,pid:parsed.pid}}catch{}return}function writeAuthorityLockRecord(lockPath,record3){try{return fs63.writeFileSync(lockPath,JSON.stringify(record3,null,2),{flag:"wx"}),!0}catch{return!1}}function isProcessAlive2(pid){if(!Number.isSafeInteger(pid)||pid<=0)return!1;try{return process.kill(pid,0),!0}catch{return!1}}function acquireAuthorityLock(directory){let lockPath=path101.join(directory,AUTHORITY_LOCK_RELATIVE_PATH);fs63.mkdirSync(path101.dirname(lockPath),{recursive:!0});let nonce=randomBytes7(16).toString("hex"),acquiredAt=Date.now(),attempt=()=>writeAuthorityLockRecord(lockPath,{nonce,acquiredAt,pid:process.pid});if(!attempt())try{let observed=readAuthorityLockRecord(lockPath);if(!observed)return;if(Date.now()-fs63.statSync(lockPath).mtimeMs>AUTHORITY_LOCK_STALE_MS){if(isProcessAlive2(observed.pid))return;let reread=readAuthorityLockRecord(lockPath);if(reread&&reread.nonce===observed.nonce&&reread.acquiredAt===observed.acquiredAt&&reread.pid===observed.pid){if(fs63.unlinkSync(lockPath),!attempt())return}}}catch{return}let acquired=readAuthorityLockRecord(lockPath);if(!acquired||acquired.nonce!==nonce)return;let released=!1;return()=>{if(released)return;released=!0;try{if(readAuthorityLockRecord(lockPath)?.nonce===nonce)fs63.unlinkSync(lockPath)}catch{}}}function taskKey(parentSessionId,taskId){return`${parentSessionId}::${taskId}`}function stableStringify(value){if(Array.isArray(value))return`[${value.map((item)=>stableStringify(item)).join(",")}]`;if(value&&typeof value==="object")return`{${Object.entries(value).sort(([left],[right])=>left.localeCompare(right)).map(([key2,item])=>`${JSON.stringify(key2)}:${stableStringify(item)}`).join(",")}}`;return JSON.stringify(value)}function digestAuthorityIdentity(input){return sha2565(stableStringify({originalCallID:input.originalCallID,parentSessionId:input.parentSessionId,taskId:input.taskId,reservationId:input.reservationId,generation:input.generation,canonicalBranch:input.canonicalBranch,canonicalPath:input.canonicalPath,laneBranch:input.laneBranch,lanePath:input.lanePath,expectedPrimaryHead:input.expectedPrimaryHead,sourceBaseOid:input.sourceBaseOid,sourceHeadOid:input.sourceHeadOid,targetHeadOid:input.targetHeadOid,strategy:input.strategy,declaredConflictFiles:input.declaredConflictFiles??[]}))}function nonEmpty(value){return typeof value==="string"&&value.length>0&&value.length<=4096}function isHex40(value){return typeof value==="string"&&HEX_40_RE.test(value)}function isOidArray(value){return Array.isArray(value)&&value.length<=4096&&value.every(isHex40)}function isSettlementEvidence(value){if(!value||typeof value!=="object"||Array.isArray(value))return!1;let candidate=value;return isOidArray(candidate.sourceCommitOrder)&&isOidArray(candidate.rewrittenCommitOrder)&&candidate.sourceCommitOrder.length===candidate.rewrittenCommitOrder.length}function isStrategy(value){return value==="merge"||value==="rebase"||value==="cherry-pick"}function isImmutableIdentity(value){if(!value||typeof value!=="object"||Array.isArray(value))return!1;let candidate=value;return nonEmpty(candidate.originalCallID)&&nonEmpty(candidate.parentSessionId)&&nonEmpty(candidate.taskId)&&nonEmpty(candidate.reservationId)&&typeof candidate.generation==="number"&&Number.isInteger(candidate.generation)&&candidate.generation>0&&nonEmpty(candidate.canonicalBranch)&&nonEmpty(candidate.canonicalPath)&&nonEmpty(candidate.laneBranch)&&nonEmpty(candidate.lanePath)&&isHex40(candidate.expectedPrimaryHead)&&isHex40(candidate.sourceBaseOid)&&isHex40(candidate.sourceHeadOid)&&isHex40(candidate.targetHeadOid)&&isStrategy(candidate.strategy)&&(candidate.declaredConflictFiles===void 0||Array.isArray(candidate.declaredConflictFiles)&&candidate.declaredConflictFiles.every((item)=>nonEmpty(item)))&&typeof candidate.createdAt==="number"&&Number.isFinite(candidate.createdAt)&&candidate.createdAt>=0}function isClaimState(value){if(!value||typeof value!=="object"||Array.isArray(value))return!1;let candidate=value;return nonEmpty(candidate.claimantCallID)&&nonEmpty(candidate.claimantSessionId)&&nonEmpty(candidate.childSessionId)&&typeof candidate.claimRevision==="number"&&Number.isInteger(candidate.claimRevision)&&candidate.claimRevision>0&&typeof candidate.attempt==="number"&&Number.isInteger(candidate.attempt)&&candidate.attempt>0&&typeof candidate.leaseExpiresAt==="number"&&Number.isFinite(candidate.leaseExpiresAt)&&candidate.leaseExpiresAt>=0&&nonEmpty(candidate.claimTokenDigest)&&typeof candidate.claimedAt==="number"&&Number.isFinite(candidate.claimedAt)&&candidate.claimedAt>=0}function isAuthority(value){if(!value||typeof value!=="object"||Array.isArray(value))return!1;let candidate=value,claimCursor=candidate.claimCursor&&typeof candidate.claimCursor==="object"?candidate.claimCursor:void 0,validStatus=candidate.status==="preserved"||candidate.status==="claimed"||candidate.status==="released"||candidate.status==="finalized";return candidate.schemaVersion===2&&nonEmpty(candidate.authorityDigest)&&isImmutableIdentity(candidate.immutable)&&validStatus&&(candidate.claim===void 0||isClaimState(candidate.claim))&&(claimCursor===void 0||typeof claimCursor.lastClaimRevision==="number"&&Number.isInteger(claimCursor.lastClaimRevision)&&claimCursor.lastClaimRevision>0&&typeof claimCursor.lastAttempt==="number"&&Number.isInteger(claimCursor.lastAttempt)&&claimCursor.lastAttempt>0)&&(candidate.status!=="claimed"||candidate.claim!==void 0)&&(candidate.finalizedAt===void 0||typeof candidate.finalizedAt==="number"&&Number.isFinite(candidate.finalizedAt)&&candidate.finalizedAt>=0)&&(candidate.settlement===void 0||isSettlementEvidence(candidate.settlement))}function isJournalEntry(value){if(!value||typeof value!=="object"||Array.isArray(value))return!1;let candidate=value,validState=candidate.state==="PREPARED"||candidate.state==="COMMITTED"||candidate.state==="CLAIM_RENEWED"||candidate.state==="ABORTED"||candidate.state==="RELEASED"||candidate.state==="FINALIZED";return candidate.schemaVersion===1&&nonEmpty(candidate.authorityDigest)&&validState&&nonEmpty(candidate.claimantCallID)&&nonEmpty(candidate.claimantSessionId)&&(candidate.childSessionId===void 0||nonEmpty(candidate.childSessionId))&&typeof candidate.claimRevision==="number"&&Number.isInteger(candidate.claimRevision)&&candidate.claimRevision>0&&typeof candidate.attempt==="number"&&Number.isInteger(candidate.attempt)&&candidate.attempt>0&&typeof candidate.leaseExpiresAt==="number"&&Number.isFinite(candidate.leaseExpiresAt)&&candidate.leaseExpiresAt>=0&&nonEmpty(candidate.claimTokenDigest)&&typeof candidate.preparedAt==="number"&&Number.isFinite(candidate.preparedAt)&&candidate.preparedAt>=0&&(candidate.credentialInstalledAt===void 0||typeof candidate.credentialInstalledAt==="number"&&Number.isFinite(candidate.credentialInstalledAt)&&candidate.credentialInstalledAt>=0)&&(candidate.committedAt===void 0||typeof candidate.committedAt==="number"&&Number.isFinite(candidate.committedAt)&&candidate.committedAt>=0)&&(candidate.abortedAt===void 0||typeof candidate.abortedAt==="number"&&Number.isFinite(candidate.abortedAt)&&candidate.abortedAt>=0)&&(candidate.reason===void 0||nonEmpty(candidate.reason))}function isCredential(value){if(!value||typeof value!=="object"||Array.isArray(value))return!1;let candidate=value;return candidate.schemaVersion===1&&nonEmpty(candidate.authorityDigest)&&nonEmpty(candidate.claimantCallID)&&nonEmpty(candidate.claimantSessionId)&&nonEmpty(candidate.childSessionId)&&typeof candidate.claimRevision==="number"&&Number.isInteger(candidate.claimRevision)&&candidate.claimRevision>0&&nonEmpty(candidate.rawToken)&&typeof candidate.leaseExpiresAt==="number"&&Number.isFinite(candidate.leaseExpiresAt)&&candidate.leaseExpiresAt>=0&&typeof candidate.createdAt==="number"&&Number.isFinite(candidate.createdAt)&&candidate.createdAt>=0}function rebuildIndex(authorities){let bySessionTask={};for(let authority of[...authorities].sort((left,right)=>right.immutable.generation-left.immutable.generation||right.immutable.createdAt-left.immutable.createdAt)){let key2=taskKey(authority.immutable.parentSessionId,authority.immutable.taskId),digests=bySessionTask[key2]??[];digests.push(authority.authorityDigest),bySessionTask[key2]=digests}return{bySessionTask}}function emptyJournal(){return{schemaVersion:1,entries:[]}}function readBoundedJsonFile2(filePath,maxBytes){try{if(fs63.statSync(filePath).size>maxBytes)return{ok:!1,reason:`${path101.basename(filePath)} exceeds the ${maxBytes}-byte safety bound`};let raw=fs63.readFileSync(filePath,"utf8");if(Buffer.byteLength(raw,"utf8")>maxBytes)return{ok:!1,reason:`${path101.basename(filePath)} changed beyond the ${maxBytes}-byte safety bound`};return{ok:!0,value:JSON.parse(raw)}}catch(error93){if(error93.code==="ENOENT")return{ok:!0,value:void 0};return{ok:!1,reason:`${path101.basename(filePath)} is unreadable or malformed: ${error93 instanceof Error?error93.message:String(error93)}`}}}function loadStoreStrict(directory){let loaded=readBoundedJsonFile2(storePath4(directory),MAX_STORE_BYTES);if(!loaded.ok)return{status:"uncertain",reason:loaded.reason};if(loaded.value===void 0)return{status:"ok",authorities:[]};let parsed=loaded.value;if(parsed.schemaVersion===1)return{status:"unsupported-legacy",reason:"worktree recovery v1 records are unsupported for claim mutation"};if(parsed.schemaVersion!==2)return{status:"uncertain",reason:`unknown worktree recovery schema version: ${String(parsed.schemaVersion)}`};if(!Array.isArray(parsed.authorities))return{status:"uncertain",reason:"worktree recovery store does not contain an authorities array"};if(parsed.authorities.length>MAX_STORE_AUTHORITIES)return{status:"uncertain",reason:`worktree recovery authority count exceeds the ${MAX_STORE_AUTHORITIES}-record safety bound`};for(let authority of parsed.authorities)if(!isAuthority(authority))return{status:"uncertain",reason:"worktree recovery store contains an invalid authority record"};return{status:"ok",authorities:[...parsed.authorities]}}function loadStoreWritable(directory){let scanned=loadStoreStrict(directory);if(scanned.status==="unsupported-legacy")return{ok:!1,code:"unsupported_legacy",reason:scanned.reason};if(scanned.status==="uncertain")return{ok:!1,code:"uncertain_store",reason:scanned.reason};return{schemaVersion:2,authorities:scanned.authorities,index:rebuildIndex(scanned.authorities)}}function loadJournal(directory){let loaded=readBoundedJsonFile2(journalPath2(directory),MAX_JOURNAL_BYTES2);if(!loaded.ok||loaded.value===void 0)return emptyJournal();let parsed=loaded.value;if(parsed.schemaVersion!==1||!Array.isArray(parsed.entries))return emptyJournal();let entries=[];for(let entry of parsed.entries)if(isJournalEntry(entry))entries.push(entry);return{schemaVersion:1,entries:entries.slice(-MAX_JOURNAL_ENTRIES)}}function updateStore(store,authorities){return store.authorities=authorities,store.index=rebuildIndex(authorities),store}function currentClaimMatches(authority,request){if(!authority.claim)return!1;return authority.claim.claimantCallID===request.claimantCallID&&authority.claim.claimRevision===request.claimRevision&&authority.claim.claimTokenDigest===sha2565(request.rawToken)}function latestJournalEntriesByAuthority(journal){let latest=new Map;for(let entry of journal.entries)latest.set(entry.authorityDigest,entry);return[...latest.values()]}function recordJournalEntry(directory,entry){let journal=loadJournal(directory);if(journal.entries.push(entry),journal.entries.length>MAX_JOURNAL_ENTRIES)journal.entries=journal.entries.slice(-MAX_JOURNAL_ENTRIES);return _internals88.writeClaimJournal(journalPath2(directory),journal),journal}function writeCredential(directory,credential){let targetPath=credentialPath(directory,credential.authorityDigest);_internals88.writeCredentialFile(targetPath,credential);try{fs63.chmodSync(targetPath,384)}catch{}return targetPath}function readCredential(directory,authorityDigest){let loaded=readBoundedJsonFile2(credentialPath(directory,authorityDigest),MAX_CREDENTIAL_BYTES);if(!loaded.ok||loaded.value===void 0)return;return isCredential(loaded.value)?loaded.value:void 0}function removeCredentialIfMatch(directory,entry){let credential=readCredential(directory,entry.authorityDigest);if(credential&&credential.claimRevision===entry.claimRevision&&credential.claimantCallID===entry.claimantCallID)try{fs63.unlinkSync(credentialPath(directory,entry.authorityDigest))}catch{}}function baseMutationFailure(code,reason){return{ok:!1,code,reason}}function publishWorktreeRecoveryAuthorityUnlocked(directory,input){let store=loadStoreWritable(directory);if("ok"in store)return store;let immutable={...input,createdAt:nowMs2()};if(!isImmutableIdentity(immutable))return baseMutationFailure("uncertain_store","invalid immutable recovery authority input");let authorityDigest=digestAuthorityIdentity(input),existing=store.authorities.find((authority2)=>authority2.authorityDigest===authorityDigest);if(existing)return{ok:!0,authority:existing};let authority={schemaVersion:2,authorityDigest,immutable,status:"preserved"},nextAuthorities=[...store.authorities,authority];if(nextAuthorities.length>MAX_STORE_AUTHORITIES)return baseMutationFailure("uncertain_store",`worktree recovery authority count exceeds the ${MAX_STORE_AUTHORITIES}-record safety bound`);return _internals88.writeRecoveryStore(storePath4(directory),updateStore(store,nextAuthorities),"publish"),{ok:!0,authority}}function publishWorktreeRecoveryAuthority(directory,input){let release=acquireAuthorityLock(directory);if(!release)return baseMutationFailure("busy","worktree recovery authority store is locked");try{return publishWorktreeRecoveryAuthorityUnlocked(directory,input)}finally{release()}}function scanWorktreeRecoveryAuthoritiesForRecovery(directory){return loadStoreStrict(directory)}function lookupWorktreeRecoveryAuthoritiesByTask(directory,query){let scanned=loadStoreStrict(directory);if(scanned.status!=="ok")return scanned;return{status:"ok",authorities:scanned.authorities.filter((authority)=>authority.immutable.parentSessionId===query.parentSessionId&&authority.immutable.taskId===query.taskId).sort((left,right)=>right.immutable.generation-left.immutable.generation||right.immutable.createdAt-left.immutable.createdAt)}}async function claimWorktreeRecoveryAuthorityUnlocked(directory,request){let store=loadStoreWritable(directory);if("ok"in store)return store;let authorityIndex=store.authorities.findIndex((authority2)=>authority2.authorityDigest===request.authorityDigest);if(authorityIndex===-1)return baseMutationFailure("not_found","worktree recovery authority not found");let authority=store.authorities[authorityIndex];if(authority.status==="finalized")return baseMutationFailure("finalized","finalized worktree recovery authority cannot be claimed again");let currentTime=nowMs2(request.now),previousClaim=authority.claim;if(previousClaim&&previousClaim.leaseExpiresAt>currentTime)return baseMutationFailure("busy","worktree recovery authority is already claimed");if(previousClaim&&previousClaim.leaseExpiresAt<=currentTime){if(!request.revalidateExpiredClaim)return baseMutationFailure("revalidation_required","expired worktree recovery claims require full revalidation before transfer");let verdict=await request.revalidateExpiredClaim({authority,previousClaim});if(!verdict.ok)return baseMutationFailure("revalidation_failed",verdict.reason)}let nextAttempt=(previousClaim?.attempt??authority.claimCursor?.lastAttempt??0)+1,maxAttempts=request.maxAttempts??DEFAULT_MAX_ATTEMPTS;if(nextAttempt>maxAttempts)return baseMutationFailure("retry_cap_exceeded",`worktree recovery claim attempt ${nextAttempt} exceeds the ${maxAttempts}-attempt safety cap`);let nextRevision=(previousClaim?.claimRevision??authority.claimCursor?.lastClaimRevision??0)+1,rawToken=_internals88.generateRawToken(),claimTokenDigest=sha2565(rawToken);recordJournalEntry(directory,{schemaVersion:1,authorityDigest:authority.authorityDigest,state:"PREPARED",claimantCallID:request.claimantCallID,claimantSessionId:request.claimantSessionId,claimRevision:nextRevision,attempt:nextAttempt,leaseExpiresAt:currentTime+request.leaseMs,claimTokenDigest,preparedAt:currentTime});let childSessionId=await request.createChildSession(),refreshedStore=loadStoreWritable(directory);if("ok"in refreshedStore)throw Error(`worktree recovery authority could not be revalidated: ${refreshedStore.reason}`);let refreshedAuthority=refreshedStore.authorities.find((candidate)=>candidate.authorityDigest===request.authorityDigest);if(!refreshedAuthority||stableStringify({status:refreshedAuthority.status,claim:refreshedAuthority.claim,claimCursor:refreshedAuthority.claimCursor,immutable:refreshedAuthority.immutable})!==stableStringify({status:authority.status,claim:authority.claim,claimCursor:authority.claimCursor,immutable:authority.immutable}))throw recordJournalEntry(directory,{schemaVersion:1,authorityDigest:authority.authorityDigest,state:"ABORTED",claimantCallID:request.claimantCallID,claimantSessionId:request.claimantSessionId,childSessionId,claimRevision:nextRevision,attempt:nextAttempt,leaseExpiresAt:currentTime+request.leaseMs,claimTokenDigest,preparedAt:currentTime,abortedAt:nowMs2(),reason:"authority changed while child session was being created"}),Error("worktree recovery authority changed while child session was being created");recordJournalEntry(directory,{schemaVersion:1,authorityDigest:authority.authorityDigest,state:"PREPARED",claimantCallID:request.claimantCallID,claimantSessionId:request.claimantSessionId,childSessionId,claimRevision:nextRevision,attempt:nextAttempt,leaseExpiresAt:currentTime+request.leaseMs,claimTokenDigest,preparedAt:currentTime});let credential={schemaVersion:1,authorityDigest:authority.authorityDigest,claimantCallID:request.claimantCallID,claimantSessionId:request.claimantSessionId,childSessionId,claimRevision:nextRevision,rawToken,leaseExpiresAt:currentTime+request.leaseMs,createdAt:currentTime},writtenCredentialPath=writeCredential(directory,credential);recordJournalEntry(directory,{schemaVersion:1,authorityDigest:authority.authorityDigest,state:"PREPARED",claimantCallID:request.claimantCallID,claimantSessionId:request.claimantSessionId,childSessionId,claimRevision:nextRevision,attempt:nextAttempt,leaseExpiresAt:currentTime+request.leaseMs,claimTokenDigest,preparedAt:currentTime,credentialInstalledAt:currentTime});let claimedAuthority={...authority,status:"claimed",claim:{claimantCallID:request.claimantCallID,claimantSessionId:request.claimantSessionId,childSessionId,claimRevision:nextRevision,attempt:nextAttempt,leaseExpiresAt:currentTime+request.leaseMs,claimTokenDigest,claimedAt:currentTime},claimCursor:{lastClaimRevision:nextRevision,lastAttempt:nextAttempt}},nextAuthorities=[...store.authorities];return nextAuthorities[authorityIndex]=claimedAuthority,_internals88.writeRecoveryStore(storePath4(directory),updateStore(store,nextAuthorities),"claim-commit"),recordJournalEntry(directory,{schemaVersion:1,authorityDigest:authority.authorityDigest,state:"COMMITTED",claimantCallID:request.claimantCallID,claimantSessionId:request.claimantSessionId,childSessionId,claimRevision:nextRevision,attempt:nextAttempt,leaseExpiresAt:currentTime+request.leaseMs,claimTokenDigest,preparedAt:currentTime,credentialInstalledAt:currentTime,committedAt:currentTime}),{ok:!0,authority:claimedAuthority,rawToken,credentialPath:writtenCredentialPath}}async function claimWorktreeRecoveryAuthority(directory,request){let release=acquireAuthorityLock(directory);if(!release)return baseMutationFailure("busy","worktree recovery authority store is locked");try{return await claimWorktreeRecoveryAuthorityUnlocked(directory,request)}finally{release()}}function renewWorktreeRecoveryClaimUnlocked(directory,request){let store=loadStoreWritable(directory);if("ok"in store)return store;let index=store.authorities.findIndex((authority2)=>authority2.authorityDigest===request.authorityDigest);if(index===-1)return baseMutationFailure("not_found","worktree recovery authority not found");let authority=store.authorities[index];if(!currentClaimMatches(authority,request))return baseMutationFailure("stale_claim","worktree recovery claim is stale or does not match the current claimant");let renewed={...authority,claim:{...authority.claim,leaseExpiresAt:nowMs2(request.now)+request.leaseMs}},nextAuthorities=[...store.authorities];return nextAuthorities[index]=renewed,_internals88.writeRecoveryStore(storePath4(directory),updateStore(store,nextAuthorities),"claim-renew"),writeCredential(directory,{schemaVersion:1,authorityDigest:renewed.authorityDigest,claimantCallID:renewed.claim.claimantCallID,claimantSessionId:renewed.claim.claimantSessionId,childSessionId:renewed.claim.childSessionId,claimRevision:renewed.claim.claimRevision,rawToken:request.rawToken,leaseExpiresAt:renewed.claim.leaseExpiresAt,createdAt:renewed.claim.claimedAt}),recordJournalEntry(directory,{schemaVersion:1,authorityDigest:renewed.authorityDigest,state:"CLAIM_RENEWED",claimantCallID:renewed.claim.claimantCallID,claimantSessionId:renewed.claim.claimantSessionId,childSessionId:renewed.claim.childSessionId,claimRevision:renewed.claim.claimRevision,attempt:renewed.claim.attempt,leaseExpiresAt:renewed.claim.leaseExpiresAt,claimTokenDigest:renewed.claim.claimTokenDigest,preparedAt:renewed.claim.claimedAt,committedAt:nowMs2(request.now),reason:"claim lease renewed"}),{ok:!0,authority:renewed}}function renewWorktreeRecoveryClaim(directory,request){let release=acquireAuthorityLock(directory);if(!release)return baseMutationFailure("busy","worktree recovery authority store is locked");try{return renewWorktreeRecoveryClaimUnlocked(directory,request)}finally{release()}}function releaseWorktreeRecoveryClaimUnlocked(directory,request){let store=loadStoreWritable(directory);if("ok"in store)return store;let index=store.authorities.findIndex((authority2)=>authority2.authorityDigest===request.authorityDigest);if(index===-1)return baseMutationFailure("not_found","worktree recovery authority not found");let authority=store.authorities[index];if(!currentClaimMatches(authority,request))return baseMutationFailure("stale_claim","worktree recovery claim is stale or does not match the current claimant");let released={...authority,status:"preserved",claim:void 0,claimCursor:authority.claim?{lastClaimRevision:authority.claim.claimRevision,lastAttempt:authority.claim.attempt}:authority.claimCursor},nextAuthorities=[...store.authorities];return nextAuthorities[index]=released,_internals88.writeRecoveryStore(storePath4(directory),updateStore(store,nextAuthorities),"claim-release"),recordJournalEntry(directory,{schemaVersion:1,authorityDigest:authority.authorityDigest,state:"RELEASED",claimantCallID:authority.claim.claimantCallID,claimantSessionId:authority.claim.claimantSessionId,childSessionId:authority.claim.childSessionId,claimRevision:authority.claim.claimRevision,attempt:authority.claim.attempt,leaseExpiresAt:authority.claim.leaseExpiresAt,claimTokenDigest:authority.claim.claimTokenDigest,preparedAt:authority.claim.claimedAt,committedAt:nowMs2(request.now),reason:"claim released after preserved settlement"}),removeCredentialIfMatch(directory,request),{ok:!0,authority:released}}function releaseWorktreeRecoveryClaim(directory,request){let release=acquireAuthorityLock(directory);if(!release)return baseMutationFailure("busy","worktree recovery authority store is locked");try{return releaseWorktreeRecoveryClaimUnlocked(directory,request)}finally{release()}}function finalizeWorktreeRecoveryAuthorityUnlocked(directory,request){let store=loadStoreWritable(directory);if("ok"in store)return store;let index=store.authorities.findIndex((authority2)=>authority2.authorityDigest===request.authorityDigest);if(index===-1)return baseMutationFailure("not_found","worktree recovery authority not found");let authority=store.authorities[index];if(!currentClaimMatches(authority,request))return baseMutationFailure("stale_claim","worktree recovery claim is stale or does not match the current claimant");let finalized={...authority,status:"finalized",claim:void 0,claimCursor:authority.claim?{lastClaimRevision:authority.claim.claimRevision,lastAttempt:authority.claim.attempt}:authority.claimCursor,finalizedAt:nowMs2(request.now),settlement:request.settlement},nextAuthorities=[...store.authorities];return nextAuthorities[index]=finalized,_internals88.writeRecoveryStore(storePath4(directory),updateStore(store,nextAuthorities),"claim-finalize"),recordJournalEntry(directory,{schemaVersion:1,authorityDigest:authority.authorityDigest,state:"FINALIZED",claimantCallID:authority.claim.claimantCallID,claimantSessionId:authority.claim.claimantSessionId,childSessionId:authority.claim.childSessionId,claimRevision:authority.claim.claimRevision,attempt:authority.claim.attempt,leaseExpiresAt:authority.claim.leaseExpiresAt,claimTokenDigest:authority.claim.claimTokenDigest,preparedAt:authority.claim.claimedAt,committedAt:nowMs2(request.now),reason:"claim finalized after landed settlement"}),removeCredentialIfMatch(directory,request),{ok:!0,authority:finalized}}function finalizeWorktreeRecoveryAuthority(directory,request){let release=acquireAuthorityLock(directory);if(!release)return baseMutationFailure("busy","worktree recovery authority store is locked");try{return finalizeWorktreeRecoveryAuthorityUnlocked(directory,request)}finally{release()}}function replayWorktreeRecoveryClaimJournalUnlocked(directory,options){let outcomes=[],storeScan=loadStoreStrict(directory),authorities=new Map((storeScan.status==="ok"?storeScan.authorities:[]).map((authority)=>[authority.authorityDigest,authority]));for(let entry of latestJournalEntriesByAuthority(loadJournal(directory))){if(entry.state==="ABORTED"||entry.state==="CLAIM_RENEWED"||entry.state==="RELEASED"||entry.state==="FINALIZED"){outcomes.push({authorityDigest:entry.authorityDigest,outcome:"noop"});continue}if(entry.state==="COMMITTED"){let current2=authorities.get(entry.authorityDigest);if(current2&&!current2.claim&¤t2.claimCursor?.lastClaimRevision===entry.claimRevision&&(current2.status==="preserved"||current2.status==="finalized")){recordJournalEntry(directory,{...entry,state:current2.status==="finalized"?"FINALIZED":"RELEASED",reason:"repaired terminal claim journal after interrupted settlement"}),removeCredentialIfMatch(directory,entry),outcomes.push({authorityDigest:entry.authorityDigest,outcome:"repaired_terminal_claim"});continue}if(current2?.claim&¤t2.claim.claimRevision===entry.claimRevision&¤t2.claim.claimTokenDigest===entry.claimTokenDigest){let credential2=readCredential(directory,entry.authorityDigest),released=credential2?releaseWorktreeRecoveryClaimUnlocked(directory,{authorityDigest:entry.authorityDigest,claimantCallID:entry.claimantCallID,claimRevision:entry.claimRevision,rawToken:credential2.rawToken}):void 0;outcomes.push({authorityDigest:entry.authorityDigest,outcome:released?.ok?"released_orphaned_committed_claim":"uncertain_committed_without_authority"})}else outcomes.push({authorityDigest:entry.authorityDigest,outcome:"uncertain_committed_without_authority"});continue}let current=authorities.get(entry.authorityDigest);if(current?.claim&¤t.claim.claimRevision===entry.claimRevision&¤t.claim.claimTokenDigest===entry.claimTokenDigest){recordJournalEntry(directory,{...entry,state:"COMMITTED",committedAt:nowMs2()}),outcomes.push({authorityDigest:entry.authorityDigest,outcome:"committed_claim_stable"});continue}let credential=readCredential(directory,entry.authorityDigest);if(credential&&credential.claimRevision===entry.claimRevision&&credential.claimantCallID===entry.claimantCallID){removeCredentialIfMatch(directory,entry),recordJournalEntry(directory,{...entry,state:"ABORTED",abortedAt:nowMs2(),reason:"removed uncommitted credential during replay"}),options?.onAbortPreparedClaim?.(entry),outcomes.push({authorityDigest:entry.authorityDigest,outcome:"removed_uncommitted_credential"});continue}recordJournalEntry(directory,{...entry,state:"ABORTED",abortedAt:nowMs2(),reason:"prepared claim never reached credential install or commit"}),options?.onAbortPreparedClaim?.(entry),outcomes.push({authorityDigest:entry.authorityDigest,outcome:"aborted_prepared_claim"})}return outcomes}function replayWorktreeRecoveryClaimJournal(directory,options){let release=acquireAuthorityLock(directory);if(!release)throw Error("worktree recovery authority store is locked");try{return replayWorktreeRecoveryClaimJournalUnlocked(directory,options)}finally{release()}}var STORE_RELATIVE_PATH,JOURNAL_RELATIVE_PATH,CREDENTIAL_DIRECTORY,AUTHORITY_LOCK_RELATIVE_PATH,AUTHORITY_LOCK_STALE_MS=600000,MAX_STORE_BYTES=2097152,MAX_STORE_AUTHORITIES=512,MAX_JOURNAL_BYTES2=2097152,MAX_JOURNAL_ENTRIES=512,MAX_CREDENTIAL_BYTES=16384,DEFAULT_MAX_ATTEMPTS=8,HEX_40_RE,_internals88;var init_worktree_recovery_authority=__esm(()=>{init_atomic_write();STORE_RELATIVE_PATH=path101.join(".swarm","worktree-merge-recovery-v2.json"),JOURNAL_RELATIVE_PATH=path101.join(".swarm","worktree-merge-recovery-v2-journal.json"),CREDENTIAL_DIRECTORY=path101.join(".swarm","worktree-recovery-claims"),AUTHORITY_LOCK_RELATIVE_PATH=path101.join(".swarm","locks","worktree-recovery-authority.lock"),HEX_40_RE=/^[0-9a-f]{40}$/i;_internals88={generateRawToken:()=>randomBytes7(32).toString("hex"),writeRecoveryStore:(targetPath,store,_phase)=>{atomicWriteSwarmFileSync(targetPath,JSON.stringify(store,null,2))},writeClaimJournal:(targetPath,journal)=>{atomicWriteSwarmFileSync(targetPath,JSON.stringify(journal,null,2))},writeCredentialFile:(targetPath,credential)=>{atomicWriteSwarmFileSync(targetPath,JSON.stringify(credential,null,2),{mode:384})},getRecoveryStorePath:storePath4,getClaimJournalPath:journalPath2,getCredentialPath:credentialPath,acquireAuthorityLock,readClaimJournal(directory){return loadJournal(directory)},resetForTest(){}}});import*as fs64 from"node:fs";import*as path102 from"node:path";function decodeTagPart(value){if(!value||!/^[A-Za-z0-9_-]+$/.test(value))return null;let decoded=Buffer.from(value,"base64url").toString("utf8");return decoded&&Buffer.from(decoded,"utf8").toString("base64url")===value?decoded:null}async function scanBackgroundWorktreeOwnershipTagsForRecovery(directory){try{fs64.statSync(path102.join(directory,".git"))}catch(error93){if(error93.code==="ENOENT")return{status:"ok",owners:[]};return{status:"uncertain",reason:`Git metadata could not be inspected: ${error93 instanceof Error?error93.message:String(error93)}`}}let proc;try{proc=bunSpawn([resolveGitExecutable(),"-C",directory,"for-each-ref",`--count=${MAX_OWNERSHIP_TAGS+1}`,"--format=%(refname:strip=2)%00%(objectname)","refs/tags/swarm-preserved-owner/"],{stdin:"ignore",stdout:"pipe",stderr:"ignore",timeout:OWNERSHIP_TAG_SCAN_TIMEOUT_MS});let exitCode=await proc.exited;if(exitCode!==0)return{status:"uncertain",reason:`ownership tag scan exited ${exitCode}`};let lines=(await proc.stdout.text()).split(/\r?\n/).map((line)=>line.trim()).filter(Boolean);if(lines.length>MAX_OWNERSHIP_TAGS)return{status:"uncertain",reason:`ownership tag scan exceeded the ${MAX_OWNERSHIP_TAGS}-tag safety bound`};let owners=[];for(let line of lines){let[tag,ref,...extra]=line.split("\x00"),segments=tag?.split("/")??[],sessionId=decodeTagPart(segments[1]??""),laneId=decodeTagPart(segments[2]??""),callDigest=segments[3];if(extra.length>0||segments.length!==4||segments[0]!=="swarm-preserved-owner"||!sessionId||!laneId||!callDigest||!/^[0-9a-f]{12}$/.test(callDigest)||!ref||!/^[0-9a-f]{40,64}$/i.test(ref))return{status:"uncertain",reason:`malformed background ownership tag entry "${tag??""}"`};owners.push({sessionId,laneId,callDigest,ref})}return{status:"ok",owners}}catch(error93){return{status:"uncertain",reason:`ownership tag scan failed: ${error93 instanceof Error?error93.message:String(error93)}`}}finally{try{proc?.kill()}catch{}}}var OWNERSHIP_TAG_SCAN_TIMEOUT_MS=2000,MAX_OWNERSHIP_TAGS=512;var init_worktree_ownership_tag=__esm(()=>{init_bun_compat();init_git_executable()});var exports_worktree_collision_ownership={};__export(exports_worktree_collision_ownership,{inspectStandardWorktreeCollisionOwnership:()=>inspectStandardWorktreeCollisionOwnership,_internals:()=>_internals89});import*as fs65 from"node:fs";function descriptorCoordinateMatch(descriptor,identity){let branchMatches=descriptor.branchName===identity.branchName,pathMatches2=canonicalRootKeyFresh(descriptor.worktreePath)===canonicalRootKeyFresh(identity.worktreePath);if(!branchMatches&&!pathMatches2)return"none";if(!branchMatches||!pathMatches2||descriptor.parentSessionId!==identity.parentSessionId||descriptor.taskId!==identity.taskId)return"uncertain";return"exact"}function isProvenSettled(record3){let settlement=record3.coderSettlement;return settlement?.state==="settled"&&settlement.outcome?.kind==="standard-worktree"&&(settlement.outcome.result==="merged"||settlement.outcome.result==="unchanged")}function classifyRecord(record3,identity,ownerKind){if(!record3.worktree)return null;let coordinates=descriptorCoordinateMatch(record3.worktree,identity);if(coordinates==="none")return null;if(coordinates==="uncertain")return{status:"uncertain",reason:`${ownerKind} background owner has conflicting identity for branch "${identity.branchName}"`};if(isProvenSettled(record3))return null;let lifecycle=record3.coderSettlement?.state==="preserved"?"preserved":"active";return{status:"protected",ownerKind,lifecycle,reason:`${ownerKind} background owner ${record3.correlationId} is ${record3.status}`+(record3.coderSettlement?` with coder settlement ${record3.coderSettlement.state}`:" without a settled workspace outcome")}}async function inspectStandardWorktreeCollisionOwnership(identity){let provisioning=scanWorktreeProvisioningOwnersForRecovery(identity.directory);if(provisioning.status==="uncertain")return provisioning;let now=Date.now();for(let owner of provisioning.owners){if(!(owner.parentSessionId===identity.parentSessionId||owner.worktreeSessionId===identity.parentSessionId))continue;if(owner.schemaVersion===1||owner.taskId===identity.taskId){let leaseIsLive=now-owner.createdAt<=WORKTREE_PROVISIONING_OWNER_LEASE_MS;if(!leaseIsLive)try{_internals89.statSync(identity.worktreePath)}catch(error93){let code=error93.code;if(code!=="ENOENT"&&code!=="ENOTDIR")return{status:"uncertain",reason:`expired provisioning owner ${owner.callID} lane liveness is unreadable: ${error93 instanceof Error?error93.message:String(error93)}`};if(!_internals89.removeWorktreeProvisioningOwner(identity.directory,owner.callID,owner.schemaVersion===3?{reservationId:owner.reservationId,generation:owner.generation,branchName:owner.branchName}:void 0))return{status:"uncertain",reason:`expired provisioning owner ${owner.callID} could not be removed`};continue}return{status:"protected",ownerKind:"provisioning",lifecycle:"active",reason:!leaseIsLive?`provisioning owner ${owner.callID} lease expired, but its exact lane path still exists`:owner.schemaVersion===1?`legacy provisioning owner ${owner.callID} cannot disprove ownership of this same-session lane`:`provisioning owner ${owner.callID} is active for task ${identity.taskId}`}}}let fallback=await scanDelegationFallbacksForRecovery(identity.directory);if(fallback.status==="uncertain")return fallback;for(let artifact of fallback.owners){let classified=classifyRecord(artifact.record,identity,"fallback");if(classified)return classified}let primary=scanDelegationsForRecovery(identity.directory);if(primary.status==="uncertain")return primary;for(let record3 of primary.owners){let classified=classifyRecord(record3,identity,"primary");if(classified)return classified}let tags=await scanBackgroundWorktreeOwnershipTagsForRecovery(identity.directory);if(tags.status==="uncertain")return tags;for(let owner of tags.owners)if(owner.sessionId===identity.parentSessionId&&owner.laneId===identity.taskId)return{status:"protected",ownerKind:"ownership-tag",lifecycle:"preserved",reason:`durable ownership tag ${owner.callDigest} preserves this same-session lane`};let mergeStatus=scanWorktreeMergeFailuresForRecovery(identity.directory);if(mergeStatus.status==="uncertain")return mergeStatus;for(let[,failure]of mergeStatus.failures){let branchMatches=failure.branch===identity.branchName,pathMatches2=typeof failure.worktreePath==="string"&&canonicalRootKeyFresh(failure.worktreePath)===canonicalRootKeyFresh(identity.worktreePath);if(!branchMatches&&!pathMatches2)continue;if(!branchMatches||!pathMatches2)return{status:"uncertain",reason:`merge-status owner has conflicting identity for branch "${identity.branchName}"`};return{status:"protected",ownerKind:"merge-status",lifecycle:"preserved",reason:`merge-status records ${failure.outcome} at stage ${failure.stage}`}}return{status:"unowned"}}var _internals89;var init_worktree_collision_ownership=__esm(()=>{init_pending_delegations();init_canonical_root();init_worktree_merge_status();init_worktree_ownership_tag();init_worktree_provisioning_owner();_internals89={statSync:fs65.statSync,removeWorktreeProvisioningOwner}});var exports_worktree_isolation={};__export(exports_worktree_isolation,{standardWorktreeSerializationSessions:()=>standardWorktreeSerializationSessions,standardWorktreeByCallID:()=>standardWorktreeByCallID,sanitizeWorktreeTaskId:()=>sanitizeWorktreeTaskId,resolveWorktreeIsolationConfig:()=>resolveWorktreeIsolationConfig,resetStandardWorktreeIsolationState:()=>resetStandardWorktreeIsolationState,readLaneEnvFileFromDisk:()=>readLaneEnvFileFromDisk,preserveDirtyWorktreeForCallId:()=>preserveDirtyWorktreeForCallId,preserveDirtyWorktreeAtPath:()=>preserveDirtyWorktreeAtPath,preserveBackgroundWorktreeOwnershipForCallId:()=>preserveBackgroundWorktreeOwnershipForCallId,precreateStandardWorktreeSession:()=>precreateStandardWorktreeSession,preProvisionCollisionCheck:()=>preProvisionCollisionCheck,parseLeanLaneIndex:()=>parseLeanLaneIndex,isLaneOwnedByCurrentSession:()=>isLaneOwnedByCurrentSession,getStandardWorktreeDegradationReason:()=>getStandardWorktreeDegradationReason,finishStandardWorktreeDispatch:()=>finishStandardWorktreeDispatch,computeLaneRuntimeProfile:()=>computeLaneRuntimeProfile,cleanupStandardWorktreeForCallId:()=>cleanupStandardWorktreeForCallId,checkStandardWorktreeSerializationRelease:()=>checkStandardWorktreeSerializationRelease,awaitingMergeByCallID:()=>awaitingMergeByCallID,abortStandardWorktreeDispatch:()=>abortStandardWorktreeDispatch,_internals:()=>_internals83,MAX_TRACKED_STANDARD_WORKTREE_CALLS:()=>MAX_TRACKED_STANDARD_WORKTREE_CALLS});import{createHash as createHash46}from"node:crypto";import*as fs66 from"node:fs/promises";import*as path103 from"node:path";function parseLeanLaneIndex(laneId){let match=/^lane-(\d+)$/.exec(laneId);if(match){let n=parseInt(match[1],10);return Number.isNaN(n)?0:n-1}return 0}function computeLaneRuntimeProfile(runtime,laneIndex,worktreePath){if(!runtime?.enabled)return;let portStride=runtime.port_stride??1,envOverrides={};if(runtime.port_base!==void 0){let portBase=runtime.port_base,port=Math.min(portBase+laneIndex*portStride,65535);envOverrides.PORT=String(port)}if(runtime.env_overrides)Object.assign(envOverrides,runtime.env_overrides);if(runtime.cache_redirects)for(let[envName,basePath]of Object.entries(runtime.cache_redirects)){let laneSuffix=path103.join(basePath,`lane-${laneIndex}`);envOverrides[envName]=laneSuffix}return{laneIndex,worktreePath,envOverrides}}function allocateStandardLaneIndex(parentSessionID){let current=standardWorktreeLaneIndexBySession.get(parentSessionID)??0;return standardWorktreeLaneIndexBySession.set(parentSessionID,current+1),current}async function createSessionWithinBudget(promise3,label,onLateResolve,timeoutMs=_internals83.worktreeSessionCreateTimeoutMs){let settled=new Promise((resolveState)=>{promise3.then((result)=>resolveState({status:"fulfilled",result}),()=>resolveState({status:"rejected"}))});try{return await withTimeout(promise3,timeoutMs,Error(`${label} deadline expired after ${timeoutMs}ms (worktree.session_create_timeout_ms)`))}catch(error93){let teardown=settled.then(async(state2)=>{if(state2.status==="fulfilled")await onLateResolve?.(state2.result)},()=>{}).catch((teardownError)=>{log(`[worktree-isolation] ${label} late-settle teardown failed: ${teardownError instanceof Error?teardownError.message:String(teardownError)}`)});throw await withTimeout(teardown,_internals83.worktreeSessionCreateSettleGraceMs,Error(`${label} settle grace expired`)).catch(()=>{}),error93}}function resolveSessionCreateTimeoutMs(args2){return args2.config?.worktree?.session_create_timeout_ms??_internals83.worktreeSessionCreateTimeoutMs}async function handleStrandedLane(lane){recordDeadLaneReclaim(lane.directory,{lanePath:lane.lanePath,branchName:lane.branchName,parentSessionId:lane.parentSessionID,taskId:lane.taskId,reason:lane.reason});let session=ensureAgentSession(lane.parentSessionID);pushAdvisory(session,`WORKTREE_LANE_STRANDED: lane ${lane.lanePath} could not be removed (${lane.reason}). A child session or system process may hold .swarm/swarm.db (WAL); its DB handle was released via closeProjectDb before this attempt. reclaim scheduled at next start.`)}function rememberStandardWorktreeDispatch(dispatch){standardWorktreeByCallID.set(dispatch.callID,dispatch)}function resolveRecoveryTaskId(input){return input.planTaskId??input.taskId}function toRecoveryStrategy(strategy){return strategy}function hasStandardWorktreeDispatchCapacity(){return standardWorktreeByCallID.size<MAX_TRACKED_STANDARD_WORKTREE_CALLS}function hasInFlightStandardWorktreeDispatch(parentSessionID){for(let dispatch of standardWorktreeByCallID.values())if(dispatch.parentSessionID===parentSessionID)return!0;for(let record3 of awaitingMergeByCallID.values())if(record3.parentSessionID===parentSessionID)return!0;return!1}function handleStandardWorktreeFailure(parentSessionID,policy,message){if(policy==="required")throw new StandardWorktreeLifecycleError(message);if(hasInFlightStandardWorktreeDispatch(parentSessionID))throw new StandardWorktreeLifecycleError(`STANDARD_WORKTREE_ISOLATION_UNSAFE: ${message} Sibling coder task(s) are isolated in worktrees for this session, so dispatching this coder un-isolated in the main tree would risk a merge-back collision. Wait for in-flight coder task(s) to be reviewed and merged, then retry.`);serializeStandardWorktreeDispatches(parentSessionID,message)}function hardStopStandardWorktreeLifecycle(parentSessionID,message){let session=ensureAgentSession(parentSessionID);throw pushAdvisory(session,message),new StandardWorktreeLifecycleError(message)}function serializeStandardWorktreeDispatches(sessionID,message){if(!rememberStandardWorktreeSerializationSession(sessionID)){let session2=ensureAgentSession(sessionID);pushAdvisory(session2,`${message} Serialization tracking is at capacity (256 sessions active); continuing in normal parallel mode.`);return}standardWorktreeDegradationReasonBySession.set(sessionID,{reason:message,at:Date.now()});let session=ensureAgentSession(sessionID);session.maxConcurrencyOverride=1,pushAdvisory(session,`${message} Serializing standard coder dispatches for this session.`)}function getStandardWorktreeDegradationReason(sessionID){return standardWorktreeDegradationReasonBySession.get(sessionID)}function resetStandardWorktreeIsolationState(){standardWorktreeByCallID.clear(),standardWorktreeSerializationSessions.clear(),serializationStateBySessionID.clear(),standardWorktreeDegradationReasonBySession.clear(),awaitingMergeByCallID.clear(),standardWorktreeMergeQueue=Promise.resolve(),standardWorktreeLaneIndexBySession.clear()}function releaseStandardWorktreeSerialization(sessionID){if(!standardWorktreeSerializationSessions.has(sessionID))return!1;standardWorktreeSerializationSessions.delete(sessionID),serializationStateBySessionID.delete(sessionID),standardWorktreeDegradationReasonBySession.delete(sessionID);let session=ensureAgentSession(sessionID);return session.maxConcurrencyOverride=void 0,pushAdvisory(session,`WORKTREE_SERIALIZATION_RELEASED: ${sessionID} regains parallel dispatch eligibility (release-after-dispatches or TTL).`),!0}function checkStandardWorktreeSerializationRelease(sessionID,config3){let state2=serializationStateBySessionID.get(sessionID);if(!state2)return;let count=config3.serialization_release_after_dispatches??5,ttl=config3.serialization_release_after_ms??60000;if(state2.successfulDispatchesSince>=count){releaseStandardWorktreeSerialization(sessionID);return}if(Date.now()-state2.serializedAt>=ttl)releaseStandardWorktreeSerialization(sessionID)}function rememberStandardWorktreeSerializationSession(sessionID){if(standardWorktreeSerializationSessions.size>=MAX_TRACKED_STANDARD_WORKTREE_CALLS){let evicted=!1;for(let key2 of serializationStateBySessionID.keys())if(!hasInFlightStandardWorktreeDispatch(key2)){standardWorktreeSerializationSessions.delete(key2),serializationStateBySessionID.delete(key2),standardWorktreeDegradationReasonBySession.delete(key2),evicted=!0;break}if(!evicted)return log(`[worktree-isolation] serialization set at cap with all sessions active; refusing eviction for ${sessionID}`),!1}if(standardWorktreeSerializationSessions.add(sessionID),!serializationStateBySessionID.has(sessionID))serializationStateBySessionID.set(sessionID,{sessionID,serializedAt:Date.now(),successfulDispatchesSince:0});return!0}function sanitizeWorktreeTaskId(raw){return raw.replace(/[^A-Za-z0-9._-]/g,"-").slice(0,64)||"task"}async function preProvisionCollisionCheck(taskId,directory,_sessionId){let proc;try{proc=_internals83.bunSpawn([_internals83.resolveGitExecutable(),"-C",directory,"worktree","list","--porcelain"],{stdin:"ignore",stdout:"pipe",stderr:"pipe",timeout:WORKTREE_LIST_TIMEOUT_MS})}catch(error93){let detail=`git worktree list could not start in ${directory}: ${error93 instanceof Error?error93.message:String(error93)}`;return log(`[swarm] preProvisionCollisionCheck: ${detail}`),{collision:!1,uncertainty:detail}}let stdout="",stderr="";try{let exitCode=await proc.exited;if(stdout=await proc.stdout.text(),stderr=await proc.stderr.text(),exitCode!==0){if(stderr.toLowerCase().includes("not a git repository"))return{collision:!1};return log(`[swarm] preProvisionCollisionCheck: git worktree list failed (exit ${exitCode}): ${stderr}`),{collision:!1,uncertainty:stderr.trim()||`git worktree list exited ${exitCode}`}}}finally{try{proc.kill()}catch{}}let entries=[],current={path:"",branch:void 0,prunable:!1};for(let rawLine of stdout.split(`
|
|
1292
|
+
`:"");writeLegacyStoreFile(legacyPath,legacyPayload),fs61.writeFileSync(projectionMarkerPath(legacyPath),"","utf-8"),legacyStat=fs61.statSync(legacyPath)}checkpoint2.migration.sourceBytes=legacyStat.size,checkpoint2.migration.scannedBytes=legacyStat.size,checkpoint2.migration.sourceMtimeMs=legacyStat.mtimeMs}catch{}}flushAuditEvents(directory,events,checkpoint2.sequence,checkpoint2.maintenance);let archiveEvent=maybeArchiveLegacy(directory,checkpoint2);if(archiveEvent)events.push(archiveEvent),checkpoint2.sequence+=1,_internals85.writeCheckpointFile(directory,checkpoint2),flushAuditEvents(directory,[archiveEvent],checkpoint2.sequence,checkpoint2.maintenance);cleanupStaleLegacyArchive(directory);let coordinationView=readCoordinationSubscriptions(directory);if(coordinationView!==null&&!isDeepStrictEqualByJson(coordinationView,loaded.view))persistCoordinationSubscriptions(directory,{...loaded.view});for(let kind of["compact","migrate-complete","archive","foreign-rebind","corrupt-quarantine"])if(events.some((event)=>event.kind===kind))emitHealthTelemetry(directory,kind,checkpoint2)}async function subscribe(directory,input){if(!directory||directory.trim()==="")throw Error("directory is required");if(!input.sessionID||input.sessionID.trim()==="")throw Error("sessionID is required and must be non-empty");if(!input.repoFullName||input.repoFullName.trim()==="")throw Error("repoFullName is required and must be non-empty");if(!input.prUrl||input.prUrl.trim()==="")throw Error("prUrl is required and must be non-empty");if(!input.prNumber||!Number.isInteger(input.prNumber)||input.prNumber<=0)throw Error("prNumber is required and must be a positive integer");let correlationId=buildCorrelationId(input.sessionID,input.repoFullName,input.prNumber),now=Date.now();return withEvidenceLock(directory,PR_SUBSCRIPTIONS_FILE,STORE_LOCK_AGENT,STORE_LOCK_TASK,async()=>{if(canUseCoordinationWritePath(directory)){let view=readCoordinationSubscriptions(directory)??{},match2=Object.values(view).find((r)=>r.correlationId===correlationId&&r.status==="active");if(match2)return onSubscriptionCreated?.(directory,match2),match2;if(input.maxSubscriptions===void 0||input.maxSubscriptions>0){let limit=input.maxSubscriptions!==void 0?input.maxSubscriptions:PR_SUBSCRIPTION_LIMITS.defaultMaxActiveSubscriptions,activeCount=Object.values(view).filter((r)=>r.status==="active").length;if(activeCount>=limit)throw Error(`PR subscription limit reached: ${activeCount}/${limit}`)}let record4={correlationId,sessionID:input.sessionID,prNumber:input.prNumber,repoFullName:input.repoFullName,prUrl:input.prUrl,...input.forge?{forge:input.forge}:{},lastCheckedAt:now,isWatching:!0,hasUnaddressedEvents:!1,status:"active",createdAt:now,updatedAt:now,errorCount:0};return validateRecord3(record4),view[correlationId]=record4,persistCoordinationSubscriptions(directory,view,!0,[{kind:"subscribe",correlationId}]),onSubscriptionCreated?.(directory,record4),record4}let loaded=loadViewForWrite(directory),match=Object.values(loaded.view).find((r)=>r.correlationId===correlationId&&r.status==="active");if(match)return onSubscriptionCreated?.(directory,match),finalizeWrite(directory,loaded,[]),match;if(input.maxSubscriptions===void 0||input.maxSubscriptions>0){let limit=input.maxSubscriptions!==void 0?input.maxSubscriptions:PR_SUBSCRIPTION_LIMITS.defaultMaxActiveSubscriptions,activeCount=Object.values(loaded.view).filter((r)=>r.status==="active").length;if(activeCount>=limit)throw Error(`PR subscription limit reached: ${activeCount}/${limit}`)}let record3={correlationId,sessionID:input.sessionID,prNumber:input.prNumber,repoFullName:input.repoFullName,prUrl:input.prUrl,...input.forge?{forge:input.forge}:{},lastCheckedAt:now,isWatching:!0,hasUnaddressedEvents:!1,status:"active",createdAt:now,updatedAt:now,errorCount:0};return validateRecord3(record3),loaded.view[correlationId]=record3,loaded.dirty=!0,finalizeWrite(directory,loaded,[{kind:"subscribe",correlationId}]),onSubscriptionCreated?.(directory,record3),record3})}async function unsubscribe(directory,correlationId){if(!correlationId)return null;return withEvidenceLock(directory,PR_SUBSCRIPTIONS_FILE,STORE_LOCK_AGENT,STORE_LOCK_TASK,async()=>{if(canUseCoordinationWritePath(directory)){let view=readCoordinationSubscriptions(directory)??{},match2=Object.values(view).find((r)=>r.correlationId===correlationId&&r.status==="active");if(!match2)return null;let removed2={...match2,status:"removed",isWatching:!1,updatedAt:Date.now()};return view[correlationId]=removed2,persistCoordinationSubscriptions(directory,view,!0,[{kind:"unsubscribe",correlationId}]),removed2}let loaded=loadViewForWrite(directory),match=Object.values(loaded.view).find((r)=>r.correlationId===correlationId&&r.status==="active");if(!match)return finalizeWrite(directory,loaded,[]),null;let now=Date.now(),removed={...match,status:"removed",isWatching:!1,updatedAt:now};return loaded.view[correlationId]=removed,loaded.dirty=!0,finalizeWrite(directory,loaded,[{kind:"unsubscribe",correlationId}]),removed})}async function listActive(directory){let{view}=await loadViewForRead(directory);return Object.values(view).filter((r)=>r.status==="active")}async function lookupByPr(directory,repoFullName,prNumber){let{view}=await loadViewForRead(directory);for(let record3 of Object.values(view))if(record3.status==="active"&&record3.repoFullName===repoFullName&&record3.prNumber===prNumber)return record3;return null}async function findSubscriptionRecordForPrUrl(directory,key2){if(key2.repoFullName!==void 0&&key2.prNumber!==void 0){let record3=await lookupByPr(directory,key2.repoFullName,key2.prNumber);if(record3&&(!key2.sessionID||record3.sessionID===key2.sessionID)&&(key2.prUrl===void 0||record3.prUrl===key2.prUrl||subscriptionPrUrlMatches(record3,key2.prUrl)))return record3;if(!key2.sessionID)return null}if(key2.prUrl===void 0&&key2.repoFullName===void 0)return null;if(key2.prUrl===void 0){let active2=await listActive(directory);for(let record3 of active2){if(key2.sessionID&&record3.sessionID!==key2.sessionID)continue;if(record3.repoFullName===key2.repoFullName&&record3.prNumber===key2.prNumber)return record3}return null}let active=await listActive(directory);for(let record3 of active){if(key2.sessionID&&record3.sessionID!==key2.sessionID)continue;if(record3.prUrl===key2.prUrl||subscriptionPrUrlMatches(record3,key2.prUrl))return record3}return null}function subscriptionPrUrlMatches(record3,prUrl){let left=canonicalForgePrUrl(record3.prUrl,record3.forge),right=canonicalForgePrUrl(prUrl,record3.forge);return left!==null&&left===right}async function updateSnapshot(directory,correlationId,updates){if(!correlationId)return null;return withEvidenceLock(directory,PR_SUBSCRIPTIONS_FILE,STORE_LOCK_AGENT,STORE_LOCK_TASK,async()=>{let existingCoordination=readCoordinationSubscriptions(directory);if(existingCoordination!==null&&!fileExistsStrict(storePath3(directory))&&!hasLegacyReconciliationArtifacts(directory)){let match2=Object.values(existingCoordination).find((r)=>r.correlationId===correlationId&&r.status==="active");if(!match2)return null;if(!snapshotUpdateHasChanges(match2,updates))return match2;let updated2={...match2,...updates,correlationId,sessionID:match2.sessionID,repoFullName:match2.repoFullName,prNumber:match2.prNumber,prUrl:match2.prUrl,createdAt:match2.createdAt,updatedAt:Date.now()};return validateRecord3(updated2),existingCoordination[correlationId]=updated2,persistCoordinationSubscriptions(directory,existingCoordination),updated2}if(canUseCoordinationWritePath(directory)){let view=readCoordinationSubscriptions(directory)??{},match2=Object.values(view).find((r)=>r.correlationId===correlationId&&r.status==="active");if(!match2)return null;if(!snapshotUpdateHasChanges(match2,updates))return match2;let updated2={...match2,...updates,correlationId,sessionID:match2.sessionID,repoFullName:match2.repoFullName,prNumber:match2.prNumber,prUrl:match2.prUrl,createdAt:match2.createdAt,updatedAt:Date.now()};return validateRecord3(updated2),view[correlationId]=updated2,persistCoordinationSubscriptions(directory,view),updated2}let loaded=loadViewForWrite(directory),match=Object.values(loaded.view).find((r)=>r.correlationId===correlationId&&r.status==="active");if(!match)return finalizeWrite(directory,loaded,[]),null;if(!snapshotUpdateHasChanges(match,updates))return finalizeWrite(directory,loaded,[]),match;let updated={...match,...updates,correlationId,sessionID:match.sessionID,repoFullName:match.repoFullName,prNumber:match.prNumber,prUrl:match.prUrl,createdAt:match.createdAt,updatedAt:Date.now()};return validateRecord3(updated),loaded.view[correlationId]=updated,loaded.dirty=!0,finalizeWrite(directory,loaded,[]),updated})}async function sweepStale(directory,ttlDays,mergedPrs){if(!ttlDays||ttlDays<=0)return 0;let ttlMs=ttlDays*86400000,now=Date.now();try{return await withEvidenceLock(directory,PR_SUBSCRIPTIONS_FILE,STORE_LOCK_AGENT,STORE_LOCK_TASK,async()=>{if(canUseCoordinationWritePath(directory)){let view=readCoordinationSubscriptions(directory)??{},swept2=0,expiredCorrelationIds=[],now2=Date.now();for(let record3 of Object.values(view)){if(record3.status!=="active")continue;let prKey=`${record3.repoFullName}::${record3.prNumber}`,isMerged=mergedPrs?.has(prKey)??!1,isStale=now2-record3.updatedAt>ttlMs;if(isMerged||isStale&&!record3.hasUnaddressedEvents)view[record3.correlationId]={...record3,status:"expired",isWatching:!1,updatedAt:now2},expiredCorrelationIds.push(record3.correlationId),swept2+=1}if(swept2>0)persistCoordinationSubscriptions(directory,view,!0,expiredCorrelationIds.map((correlationId)=>({kind:"expired",correlationId})));return swept2}let loaded=loadViewForWrite(directory),opAudit=[],swept=0;for(let record3 of Object.values(loaded.view)){if(record3.status!=="active")continue;let prKey=`${record3.repoFullName}::${record3.prNumber}`,isMerged=mergedPrs?.has(prKey)??!1,isStale=now-record3.updatedAt>ttlMs;if(isMerged){loaded.view[record3.correlationId]={...record3,status:"expired",isWatching:!1,updatedAt:now},swept+=1,opAudit.push({kind:"expired",correlationId:record3.correlationId}),loaded.dirty=!0,log(`[pr-monitor] Swept subscription: merged/closed: ${prKey}`);continue}if(isStale&&!record3.hasUnaddressedEvents)loaded.view[record3.correlationId]={...record3,status:"expired",isWatching:!1,updatedAt:now},swept+=1,opAudit.push({kind:"expired",correlationId:record3.correlationId}),loaded.dirty=!0,log(`[pr-monitor] Swept subscription: stale (TTL ${ttlDays}d): ${prKey}`)}return finalizeWrite(directory,loaded,opAudit),swept})}catch(err){return log(`[pr-monitor] sweepStale failed: ${err instanceof Error?err.message:String(err)}`),0}}async function getPrSubscriptionHealth(directory){try{let coordinationView=readCoordinationSubscriptions(directory),read=readCheckpoint(directory),migrationPending=read.kind==="ok"&&sameProjectRoot(read.value.rootPath,directory)&&read.value.migration?.done===!1;if(coordinationView!==null&&Object.keys(coordinationView).length>0&&!migrationPending){let audit2=auditStats(directory),archiveBytes2=fileSizeOrNull(legacyArchivePath(directory))??0,checkpointBytes2=fileSizeOrNull(checkpointPath(directory))??0,health2=healthFromView(coordinationView,buildCoordinationProjectionCheckpoint(directory,coordinationView));return health2.recoverySource="checkpoint",applyFileStats(health2,checkpointBytes2,audit2,archiveBytes2),health2}let audit=auditStats(directory),archiveBytes=fileSizeOrNull(legacyArchivePath(directory))??0,checkpointBytes=fileSizeOrNull(checkpointPath(directory))??0,legacySize=fileSizeOrNull(storePath3(directory)),legacyOverLimit=legacySize!==null&&legacySize>PR_SUBSCRIPTION_LIMITS.legacySourceMaxBytes,health;if(read.kind==="ok"&&!sameProjectRoot(read.value.rootPath,directory))health=emptyHealth2(),health.recoverySource="foreign";else if(read.kind==="invalid"){if(legacySize!==null&&!legacyOverLimit){let fold=foldLegacyRegion(storePath3(directory),0,Number.MAX_SAFE_INTEGER),view={};if(!fold.ioError)mergeFoldedRecords(view,fold.folded);health=healthFromView(view,freshCheckpoint(directory)),health.corruptLegacyRecords=fold.corruptLines}else health=emptyHealth2();health.recoverySource="corrupt-recovered"}else if(read.kind==="absent"){if(legacySize===null||legacyOverLimit)health=emptyHealth2();else{let fold=foldLegacyRegion(storePath3(directory),0,Number.MAX_SAFE_INTEGER),view={};if(!fold.ioError)mergeFoldedRecords(view,fold.folded);health=healthFromView(view,freshCheckpoint(directory)),health.corruptLegacyRecords=fold.corruptLines}health.recoverySource=legacySize===null?"empty":"legacy-log"}else{let pendingCheckpoint=migrationPending&&coordinationView!==null?(()=>{let merged=cloneCheckpoint(read.value);return merged.records={...merged.records,...coordinationView},merged})():read.value,overlaid=overlayLegacy(directory,pendingCheckpoint);health=healthFromView(overlaid.view,read.value),health.recoverySource=overlaid.usedLegacy?"checkpoint+legacy":"checkpoint"}return health.legacyOverLimit=legacyOverLimit,applyFileStats(health,checkpointBytes,audit,archiveBytes),health}catch(err){return log(`[pr-monitor] getPrSubscriptionHealth failed: ${storageErrorCode(err)}`),emptyHealth2()}}function applyFileStats(health,checkpointBytes,audit,archiveBytes){health.checkpointBytes=checkpointBytes,health.pressurePct=checkpointBytes===0?0:Math.round(checkpointBytes/health.checkpointLimitBytes*1000)/10,health.auditLines=audit.lines,health.auditBytes=audit.bytes,health.legacyArchiveBytes=archiveBytes}function emptyHealth2(){return{schemaVersion:1,sequence:0,checkpointAgeMs:null,checkpointBytes:0,checkpointLimitBytes:PR_SUBSCRIPTION_LIMITS.maxCheckpointBytes,pressurePct:0,activeCount:0,removedCount:0,expiredCount:0,terminalSummary:{removed:0,expired:0,lastTerminalAt:null},auditLines:0,auditBytes:0,auditLimitBytes:PR_SUBSCRIPTION_LIMITS.auditMaxBytesHigh,compactions:0,corruptLegacyRecords:0,droppedAuditTransitions:0,resets:0,recoverySource:"empty",migration:null,legacyArchiveBytes:0,legacyOverLimit:!1}}function healthFromView(view,checkpoint2){let records=Object.values(view),health=emptyHealth2();return health.sequence=checkpoint2.sequence,health.checkpointAgeMs=checkpoint2.sequence>0?Date.now()-checkpoint2.updatedAt:null,health.activeCount=records.filter((r)=>r.status==="active").length,health.removedCount=records.filter((r)=>r.status==="removed").length,health.expiredCount=records.filter((r)=>r.status==="expired").length,health.terminalSummary={...checkpoint2.terminalSummary},health.compactions=checkpoint2.maintenance.compactions,health.corruptLegacyRecords=checkpoint2.maintenance.corruptLegacyRecords,health.droppedAuditTransitions=checkpoint2.maintenance.droppedAuditTransitions,health.resets=checkpoint2.maintenance.resets,health.migration=checkpoint2.migration?{done:checkpoint2.migration.done,scannedBytes:checkpoint2.migration.scannedBytes,sourceBytes:checkpoint2.migration.sourceBytes}:null,health}var PR_SUBSCRIPTIONS_FILE="pr-monitor/subscriptions.jsonl",PR_SUBSCRIPTIONS_CHECKPOINT_FILE="pr-monitor/subscriptions.checkpoint.json",PR_SUBSCRIPTIONS_AUDIT_FILE="pr-monitor/subscriptions.audit.jsonl",LEGACY_ARCHIVE_FILE="pr-monitor/subscriptions.legacy.jsonl",FOREIGN_CHECKPOINT_FILE="pr-monitor/subscriptions.checkpoint.foreign.json",CORRUPT_CHECKPOINT_FILE="pr-monitor/subscriptions.checkpoint.corrupt.json",FOREIGN_LEGACY_FILE="pr-monitor/subscriptions.legacy.foreign.jsonl",PR_SUBSCRIPTION_COORDINATION_NAMESPACE="background.pr-subscription",STORE_LOCK_AGENT="pr-monitor",STORE_LOCK_TASK="pr-subscriptions",PR_SUBSCRIPTION_LIMITS,onSubscriptionCreated=null,prMonitorWorkerHandlers,MAX_PR_MONITOR_WORKER_HANDLERS=64,RecordSchema,TerminalSummarySchema,MigrationSchema,MaintenanceSchema,CheckpointSchema,PrSubscriptionCapacityError,legacyOverLimitWarned,migrationCapacityWarned,bootstrapAttempted,_internals85;var init_pr_subscriptions=__esm(()=>{init_zod();init_db();init_lock();init_learning_health();init_utils2();init_forge_provider();init_telemetry();init_utils();init_atomic_write();init_canonical_root();PR_SUBSCRIPTION_LIMITS={readChunkBytes:65536,maxRecordBytes:65536,migrationChunkBytes:1048576,migrationMaxBytesPerOperation:8388608,legacySourceMaxBytes:67108864,defaultMaxActiveSubscriptions:20,maxCheckpointRecords:512,maxCheckpointBytes:262144,checkpointHardReadBytes:1048576,terminalRecordsHigh:60,terminalRecordsLow:30,terminalMaxAgeMs:2592000000,auditMaxLinesHigh:500,auditMaxLinesLow:250,auditMaxBytesHigh:131072,auditMaxBytesLow:65536,legacyArchiveTtlMs:604800000,bootstrapLockTimeoutMs:5000};prMonitorWorkerHandlers=new Map;RecordSchema=exports_external.object({correlationId:exports_external.string().min(1),sessionID:exports_external.string().min(1),prNumber:exports_external.number().int().positive(),repoFullName:exports_external.string().regex(/^[^/\s]+(?:\/[^/\s]+)+$/,"Must be owner/repo format (GitLab nested namespaces allowed)"),prUrl:exports_external.string().min(1),forge:exports_external.object({provider:exports_external.literal("gitlab"),host:exports_external.string().min(1)}).optional(),headRefOid:exports_external.string().optional(),lastCheckedAt:exports_external.number(),lastCommentId:exports_external.string().optional(),lastCheckRunSet:exports_external.string().optional(),mergeableState:exports_external.string().optional(),mergeGroupRunStatus:exports_external.string().optional(),mergeGroupRunConclusion:exports_external.string().optional(),mergeGroupRunHtmlUrl:exports_external.string().optional(),isWatching:exports_external.boolean(),hasUnaddressedEvents:exports_external.boolean(),status:exports_external.enum(["active","removed","expired"]),createdAt:exports_external.number(),updatedAt:exports_external.number(),errorCount:exports_external.number().int().min(0),customPollIntervalSeconds:exports_external.number().int().positive().optional(),customFailureThreshold:exports_external.number().int().min(0).optional(),customCooldownSeconds:exports_external.number().int().min(0).optional()}).strict().superRefine((record3,ctx)=>{if(isForgePrUrl(record3.prUrl))return;if(record3.forge&&isForgePrUrl(record3.prUrl,{provider:record3.forge.provider,host:record3.forge.host}))return;ctx.addIssue({code:exports_external.ZodIssueCode.custom,path:["prUrl"],message:"Must be a valid PR URL (GitHub /pull/N or GitLab /-/merge_requests/N)"})}),TerminalSummarySchema=exports_external.object({removed:exports_external.number().int().min(0),expired:exports_external.number().int().min(0),lastTerminalAt:exports_external.number().int().nullable()}).strict(),MigrationSchema=exports_external.object({scannedBytes:exports_external.number().int().nonnegative(),sourceBytes:exports_external.number().int().nonnegative(),sourceMtimeMs:exports_external.number().nonnegative(),corruptLines:exports_external.number().int().nonnegative(),discardingOversizeLine:exports_external.boolean().optional().default(!1),baselineRecords:exports_external.record(exports_external.string(),RecordSchema).optional().default({}),baselineTerminalSummary:TerminalSummarySchema.optional().default({removed:0,expired:0,lastTerminalAt:null}),done:exports_external.boolean(),archived:exports_external.boolean(),startedAt:exports_external.number().int().nonnegative()}).strict(),MaintenanceSchema=exports_external.object({compactions:exports_external.number().int().nonnegative(),droppedAuditTransitions:exports_external.number().int().nonnegative(),corruptLegacyRecords:exports_external.number().int().nonnegative(),lastCompactedAt:exports_external.number().int().nullable(),resets:exports_external.number().int().nonnegative()}).strict(),CheckpointSchema=exports_external.object({schemaVersion:exports_external.literal(1),sequence:exports_external.number().int().positive(),rootPath:exports_external.string().min(1).max(4096),updatedAt:exports_external.number().int().nonnegative(),records:exports_external.record(exports_external.string(),RecordSchema),terminalSummary:TerminalSummarySchema,migration:MigrationSchema.nullable(),maintenance:MaintenanceSchema}).strict();PrSubscriptionCapacityError=class PrSubscriptionCapacityError extends Error{constructor(message){super(message);this.name="PrSubscriptionCapacityError"}};legacyOverLimitWarned=new Map;migrationCapacityWarned=new Map;bootstrapAttempted=new Map;_internals85={afterCheckpointFstat:(_filePath)=>{},archiveStatSync:fs61.statSync,auditCompactionWrite:atomicWriteSwarmFileSync,beforeBootstrapLock:(_directory2)=>{},beforeArchiveLegacy:(_directory2)=>{},beforeArchiveRename:(_directory2)=>{},foldLegacyRegion,legacyCloseSync:fs61.closeSync,legacyFstatSync:fs61.fstatSync,mergeFoldedRecords,readSync:fs61.readSync,renameWithRetry:renameWithRetry5,sameProjectRoot,statSync:fs61.statSync,writeCheckpointFile}});var exports_state={};__export(exports_state,{updateTaskWorkflowCache:()=>updateTaskWorkflowCache,updateAgentEventTime:()=>updateAgentEventTime,takeReviewerScopeGeneration:()=>takeReviewerScopeGeneration,sweepStaleSessions:()=>sweepStaleSessions,swarmState:()=>swarmState,startReviewerScopeGeneration:()=>startReviewerScopeGeneration,startAgentSession:()=>startAgentSession,settleReviewerScopeMergeback:()=>settleReviewerScopeMergeback,setSessionEnvironment:()=>setSessionEnvironment,setSessionBudget:()=>setSessionBudget,setLiveContextWindow:()=>setLiveContextWindow,setFinalPromptPressure:()=>setFinalPromptPressure,setFinalAccountingWarningBand:()=>setFinalAccountingWarningBand,setDispatchParent:()=>setDispatchParent,setCriticalShownIds:()=>setCriticalShownIds,reviewerScopeGenerationHasDeclaredOverlap:()=>reviewerScopeGenerationHasDeclaredOverlap,resolveSessionWorkspaceDirectory:()=>resolveSessionWorkspaceDirectory,resolveInitialTurboMode:()=>resolveInitialTurboMode,resolveDispatchParent:()=>resolveDispatchParent,resetSwarmStatePreservingSingletons:()=>resetSwarmStatePreservingSingletons,resetSwarmState:()=>resetSwarmState,resetModifiedFilesForTask:()=>resetModifiedFilesForTask,reserveStageBRouteEvidence:()=>reserveStageBRouteEvidence,rehydrateSessionFromDisk:()=>rehydrateSessionFromDisk,rehydratePrSubscriptions:()=>rehydratePrSubscriptions,recordStageBRouteEvidence:()=>recordStageBRouteEvidence,recordStageBCompletion:()=>recordStageBCompletion,recordSessionWorkspaceRoot:()=>recordSessionWorkspaceRoot,recordReviewerScopeGenerationFileFingerprint:()=>recordReviewerScopeGenerationFileFingerprint,recordReviewerScopeGenerationFile:()=>recordReviewerScopeGenerationFile,recordReviewerScopeGenerationCaptureFailure:()=>recordReviewerScopeGenerationCaptureFailure,recordPhaseAgentDispatch:()=>recordPhaseAgentDispatch,recordPendingDispatchAuthorization:()=>recordPendingDispatchAuthorization,recordModifiedFilesForTask:()=>recordModifiedFilesForTask,recordModifiedFileForTask:()=>recordModifiedFileForTask,pruneOldWindows:()=>pruneOldWindows,peekReviewerScopeGenerationClaim:()=>peekReviewerScopeGenerationClaim,peekReviewerScopeGenerationByStatus:()=>peekReviewerScopeGenerationByStatus,peekReadyReviewerScopeGeneration:()=>peekReadyReviewerScopeGeneration,maybeSweepStaleSessions:()=>maybeSweepStaleSessions,markStageBRouteRequired:()=>markStageBRouteRequired,markReviewerScopeGenerationReady:()=>markReviewerScopeGenerationReady,markReviewerScopeGenerationNoChange:()=>markReviewerScopeGenerationNoChange,markReviewerScopeGenerationMergebackPending:()=>markReviewerScopeGenerationMergebackPending,isStageBRouteRequired:()=>isStageBRouteRequired,isReviewerScopeGenerationCurrent:()=>isReviewerScopeGenerationCurrent,isCouncilGateActive:()=>isCouncilGateActive,incrementGateDenialCount:()=>incrementGateDenialCount,hasModifiedFilesForTask:()=>hasModifiedFilesForTask,hasBothStageBCompletions:()=>hasBothStageBCompletions,hasActiveTurboMode:()=>hasActiveTurboMode,hasActiveLeanTurbo:()=>hasActiveLeanTurbo,hasActiveFullAuto:()=>hasActiveFullAuto,hasActiveEpicMode:()=>hasActiveEpicMode,getTaskState:()=>getTaskState,getStageBRouteEvidence:()=>getStageBRouteEvidence,getSessionEnvironment:()=>getSessionEnvironment,getSessionBudgetTokens:()=>getSessionBudgetTokens,getSessionBudgetPct:()=>getSessionBudgetPct,getRunContext:()=>getRunContext,getReviewerScopeOwnershipHistory:()=>getReviewerScopeOwnershipHistory,getReviewerScopeGenerationForCoderCall:()=>getReviewerScopeGenerationForCoderCall,getResolvedAutoProceed:()=>getResolvedAutoProceed,getRehydrationCache:()=>getRehydrationCache,getModifiedFilesForTask:()=>getModifiedFilesForTask,getLiveContextWindow:()=>getLiveContextWindow,getLiveContextModelIdentity:()=>getLiveContextModelIdentity,getFinalPromptPressure:()=>getFinalPromptPressure,getFinalAccountingWarningBand:()=>getFinalAccountingWarningBand,getDisplayFinalPromptPressure:()=>getDisplayFinalPromptPressure,getDisplayBudget:()=>getDisplayBudget,getAgentSession:()=>getAgentSession,getActiveWindow:()=>getActiveWindow,getActiveFullAutoSessionID:()=>getActiveFullAutoSessionID,ensureSessionEnvironment:()=>ensureSessionEnvironment,ensureAgentSession:()=>ensureAgentSession,endAgentSession:()=>endAgentSession,discardReviewerScopeGenerationForCoderCall:()=>discardReviewerScopeGenerationForCoderCall,discardReviewerScopeGenerationClaim:()=>discardReviewerScopeGenerationClaim,defaultRunContext:()=>defaultRunContext,completeModifiedFilesForTask:()=>completeModifiedFilesForTask,clearStageBRouteRequired:()=>clearStageBRouteRequired,clearStageBRouteEvidence:()=>clearStageBRouteEvidence,clearGateDenialCount:()=>clearGateDenialCount,clearFinalAccountingWarningBands:()=>clearFinalAccountingWarningBands,clearDispatchLineageForSession:()=>clearDispatchLineageForSession,clearCriticalShownIds:()=>clearCriticalShownIds,claimReviewerScopeGeneration:()=>claimReviewerScopeGeneration,canAdvanceTaskState:()=>canAdvanceTaskState,buildRehydrationCache:()=>buildRehydrationCache,buildGateDenialDirectiveKey:()=>buildGateDenialDirectiveKey,beginInvocation:()=>beginInvocation,attachReviewerScopeGenerationDispatchSnapshot:()=>attachReviewerScopeGenerationDispatchSnapshot,applyRehydrationCache:()=>applyRehydrationCache,advanceTaskStateAndPersist:()=>advanceTaskStateAndPersist,advanceTaskState:()=>advanceTaskState,addKnowledgeAckDedup:()=>addKnowledgeAckDedup,_resetCouncilDisagreementWarnings:()=>_resetCouncilDisagreementWarnings,_internals:()=>_internals86,REVIEWER_SCOPE_GENERATION_TTL_MS:()=>REVIEWER_SCOPE_GENERATION_TTL_MS,PENDING_DISPATCH_AUTHORIZATION_TTL_MS:()=>PENDING_DISPATCH_AUTHORIZATION_TTL_MS,MAX_TRACKED_TASK_FILE_ATTRIBUTIONS:()=>MAX_TRACKED_TASK_FILE_ATTRIBUTIONS,MAX_TRACKED_KNOWLEDGE_ACKS:()=>MAX_TRACKED_KNOWLEDGE_ACKS,MAX_TRACKED_GATE_DENIALS:()=>MAX_TRACKED_GATE_DENIALS,MAX_TRACKED_DISPATCH_PARENTS:()=>MAX_TRACKED_DISPATCH_PARENTS,MAX_TRACKED_CRITICAL_SHOWN:()=>MAX_TRACKED_CRITICAL_SHOWN,MAX_TRACKED_CONTEXT_WINDOWS:()=>MAX_TRACKED_CONTEXT_WINDOWS,MAX_TRACKED_BUDGET_SESSIONS:()=>MAX_TRACKED_BUDGET_SESSIONS,MAX_REVIEWER_SCOPE_OWNERSHIP_HISTORY:()=>MAX_REVIEWER_SCOPE_OWNERSHIP_HISTORY,MAX_REVIEWER_SCOPE_GENERATION_FILES:()=>MAX_REVIEWER_SCOPE_GENERATION_FILES,MAX_REVIEWER_SCOPE_GENERATIONS:()=>MAX_REVIEWER_SCOPE_GENERATIONS,AgentRunContext:()=>AgentRunContext});import{randomUUID as randomUUID13}from"node:crypto";import*as fs62 from"node:fs/promises";import*as path100 from"node:path";function compareWorkflowStatePrecedence(left,right){return compareTaskWorkflowStateRank(left,right)}function cloneReviewerScopeGeneration(generation){return{...generation,declaredFiles:[...generation.declaredFiles],modifiedFiles:[...generation.modifiedFiles],modifiedFileFingerprints:generation.modifiedFileFingerprints.map((entry)=>({...entry})),captureFailures:generation.captureFailures.map((entry)=>({...entry})),reviewerDispatchScope:generation.reviewerDispatchScope?{...generation.reviewerDispatchScope,files:[...generation.reviewerDispatchScope.files]}:void 0}}function cloneReviewerScopeOwnershipTombstone(tombstone){return{...tombstone,declaredFiles:[...tombstone.declaredFiles],modifiedFiles:[...tombstone.modifiedFiles],modifiedFileFingerprints:tombstone.modifiedFileFingerprints.map((fingerprint2)=>({...fingerprint2}))}}function createNonTransientCircuitState(agentName,invocationId){return{ownerAgent:stripKnownSwarmPrefix(agentName),ownerInvocationId:invocationId,category:null,sameCategoryCount:0,hardStop:!1,lastSignal:null}}function getRunContext(runId){if(!runId)return defaultRunContext;return _runContexts.get(runId)??defaultRunContext}function resetSwarmState(){swarmState.activeToolCalls.clear(),swarmState.toolAggregates.clear(),swarmState.activeAgent.clear(),swarmState.delegationChains.clear(),swarmState.pendingEvents=0,swarmState.lastBudgetBySession.clear(),swarmState.finalPromptPressureBySession.clear(),clearAllTurnLedgers(),swarmState.finalAccountingWarningBandsBySession.clear(),swarmState.liveContextWindows.clear(),swarmState.agentSessions.clear(),clearSnapshotSessionOwnerships(),_lastIdleSweepAtMs=0,clearTrajectoryCache(),clearTrajectoryStepCounters(),swarmState.pendingRehydrations.clear(),swarmState.opencodeClient=null,swarmState.curatorInitAgentNames=[],swarmState.curatorPhaseAgentNames=[],swarmState.curatorPostmortemAgentNames=[],swarmState.curatorConsolidationAgentNames=[],swarmState.skillImproverAgentNames=[],swarmState.specWriterAgentNames=[],swarmState.currentCriticalShownIds.clear(),swarmState.knowledgeAckDedup.clear(),swarmState.gateDenialCounts.clear(),swarmState.generatedAgentNames=[],swarmState.dispatchParentByChildSession.clear(),swarmState.pendingDispatchAuthorizations=[],clearHydrationOwnershipState(),swarmState.fullAutoEnabledInConfig=!1,swarmState.environmentProfiles.clear(),clearAllActionCircuits(),clearAllTaskModelRoutingState(),clearPendingCoderScope();for(let binding of clearScopeBindings())clearScopeBindingFromDisk({directory:binding.workspaceIdentity,binding});resetStandardWorktreeIsolationState(),resetRealtimeLearningNudgeState(),_councilDisagreementWarned.clear()}function resetSwarmStatePreservingSingletons(){let{opencodeClient:preservedOpencodeClient,fullAutoEnabledInConfig:preservedFullAutoEnabledInConfig,curatorInitAgentNames:preservedCuratorInitAgentNames,curatorPhaseAgentNames:preservedCuratorPhaseAgentNames,curatorPostmortemAgentNames:preservedCuratorPostmortemAgentNames,curatorConsolidationAgentNames:preservedCuratorConsolidationAgentNames,skillImproverAgentNames:preservedSkillImproverAgentNames,specWriterAgentNames:preservedSpecWriterAgentNames,generatedAgentNames:preservedGeneratedAgentNames}=swarmState;resetSwarmState(),swarmState.opencodeClient=preservedOpencodeClient,swarmState.fullAutoEnabledInConfig=preservedFullAutoEnabledInConfig,swarmState.curatorInitAgentNames=preservedCuratorInitAgentNames,swarmState.curatorPhaseAgentNames=preservedCuratorPhaseAgentNames,swarmState.curatorPostmortemAgentNames=preservedCuratorPostmortemAgentNames,swarmState.curatorConsolidationAgentNames=preservedCuratorConsolidationAgentNames,swarmState.skillImproverAgentNames=preservedSkillImproverAgentNames,swarmState.specWriterAgentNames=preservedSpecWriterAgentNames,swarmState.generatedAgentNames=preservedGeneratedAgentNames}function pruneExpiredPendingDispatchAuthorizations(now){let pendings=swarmState.pendingDispatchAuthorizations;if(pendings.length===0)return;let alive=pendings.filter((pending)=>now-pending.recordedAt<=PENDING_DISPATCH_AUTHORIZATION_TTL_MS);if(alive.length!==pendings.length)swarmState.pendingDispatchAuthorizations=alive}function recordPendingDispatchAuthorization(parentSessionId,agentName){if(!parentSessionId||!agentName)return;let now=Date.now();if(pruneExpiredPendingDispatchAuthorizations(now),swarmState.pendingDispatchAuthorizations.push({parentSessionId,agentName:stripKnownSwarmPrefix(agentName).toLowerCase(),recordedAt:now}),swarmState.pendingDispatchAuthorizations.length>MAX_TRACKED_DISPATCH_PARENTS)swarmState.pendingDispatchAuthorizations.splice(0,swarmState.pendingDispatchAuthorizations.length-MAX_TRACKED_DISPATCH_PARENTS)}function setDispatchParentEntry(childSessionId,parentSessionId){if(!childSessionId||!parentSessionId)return;if(swarmState.dispatchParentByChildSession.delete(childSessionId),swarmState.dispatchParentByChildSession.set(childSessionId,parentSessionId),swarmState.dispatchParentByChildSession.size>MAX_TRACKED_DISPATCH_PARENTS){let oldestKey=swarmState.dispatchParentByChildSession.keys().next().value;if(oldestKey!==void 0)swarmState.dispatchParentByChildSession.delete(oldestKey)}}function setDispatchParent(childSessionId,parentSessionId){if(!childSessionId||!parentSessionId)return;setDispatchParentEntry(childSessionId,parentSessionId);let now=Date.now();pruneExpiredPendingDispatchAuthorizations(now);let normalizedParent=parentSessionId,pendings=swarmState.pendingDispatchAuthorizations,matchIndex=pendings.findIndex((pending)=>pending.parentSessionId===normalizedParent);if(matchIndex>=0)pendings.splice(matchIndex,1)}function resolveDispatchParent(childSessionId){return swarmState.dispatchParentByChildSession.get(childSessionId)}function adoptPendingDispatchAuthorization(newSessionId,agentName){if(swarmState.dispatchParentByChildSession.has(newSessionId))return;let normalizedRole=stripKnownSwarmPrefix(agentName).toLowerCase();if(!normalizedRole)return;let now=Date.now();pruneExpiredPendingDispatchAuthorizations(now);let pendings=swarmState.pendingDispatchAuthorizations,matchIndex=pendings.findIndex((pending)=>pending.agentName===normalizedRole);if(matchIndex<0)return;let[adopted]=pendings.splice(matchIndex,1);if(!adopted)return;setDispatchParentEntry(newSessionId,adopted.parentSessionId)}function clearDispatchLineageForSession(sessionId){swarmState.dispatchParentByChildSession.delete(sessionId);for(let[child,parent]of swarmState.dispatchParentByChildSession)if(parent===sessionId)swarmState.dispatchParentByChildSession.delete(child);swarmState.pendingDispatchAuthorizations=swarmState.pendingDispatchAuthorizations.filter((pending)=>pending.parentSessionId!==sessionId)}function isBoundedGenerationValue(value,maxLength){return value.length>0&&value.length<=maxLength&&!Array.from(value).some((char)=>{let code=char.charCodeAt(0);return code<=31||code===127})}function reviewerScopeGenerationKey(taskId,coderCallID,generation){return`${taskId}\x00${coderCallID}\x00${generation}`}function reviewerScopeOwnershipKey(taskId,coderCallID,generation,sessionIncarnation){return`${taskId}\x00${coderCallID}\x00${generation}\x00${sessionIncarnation}`}function ensureReviewerScopeGenerationState(session){return session.reviewerScopeGenerations??=new Map,session.reviewerScopeGenerationCounter??=0,session.reviewerScopeIncarnation??=randomUUID13(),session.reviewerScopeLatestGenerationByTask??=new Map,session.reviewerScopeOwnershipHistory??=new Map,{generations:session.reviewerScopeGenerations,counter:session.reviewerScopeGenerationCounter,incarnation:session.reviewerScopeIncarnation,latestByTask:session.reviewerScopeLatestGenerationByTask,ownershipHistory:session.reviewerScopeOwnershipHistory}}function sweepReviewerScopeGenerations(session,now){let{generations}=ensureReviewerScopeGenerationState(session);for(let[key2,entry]of generations){if(entry.status==="claimed"||entry.status==="mergeback_pending"||entry.status==="mergeback_mismatch")continue;if(!Number.isFinite(entry.createdAt)||now<entry.createdAt||now-entry.createdAt>REVIEWER_SCOPE_GENERATION_TTL_MS)generations.delete(key2)}}function startReviewerScopeGeneration(input){let session=swarmState.agentSessions.get(input.parentSessionID);if(!session||!isBoundedGenerationValue(input.taskId,512)||!isBoundedGenerationValue(input.coderCallID,512)||!input.captureDirectory.trim()||!input.workspaceIdentity.trim())return null;let now=input.createdAt??Date.now();sweepReviewerScopeGenerations(session,now);let{generations,counter,incarnation,latestByTask}=ensureReviewerScopeGenerationState(session);for(let[key3,entry]of generations)if(entry.taskId===input.taskId&&entry.status!=="claimed")generations.delete(key3);while(generations.size>=MAX_REVIEWER_SCOPE_GENERATIONS){let oldestUnclaimed=[...generations.entries()].find(([,entry])=>entry.status!=="claimed")?.[0];if(!oldestUnclaimed)return null;generations.delete(oldestUnclaimed)}session.reviewerScopeGenerationCounter=counter>=Number.MAX_SAFE_INTEGER?1:counter+1;let generation={taskId:input.taskId,coderCallID:input.coderCallID,generation:session.reviewerScopeGenerationCounter,sessionIncarnation:incarnation,background:input.background===!0,captureDirectory:input.captureDirectory,workspaceIdentity:input.workspaceIdentity,declaredFiles:[...new Set(input.declaredFiles??[])],modifiedFiles:[],modifiedFileFingerprints:[],captureFailures:[],status:"collecting",createdAt:now};if(!latestByTask.has(generation.taskId))while(latestByTask.size>=MAX_REVIEWER_SCOPE_GENERATIONS){let oldestTask=latestByTask.keys().next().value;if(!oldestTask)break;latestByTask.delete(oldestTask)}latestByTask.delete(generation.taskId),latestByTask.set(generation.taskId,{generation:generation.generation,coderCallID:generation.coderCallID,sessionIncarnation:generation.sessionIncarnation});let key2=reviewerScopeGenerationKey(generation.taskId,generation.coderCallID,generation.generation);return generations.set(key2,generation),cloneReviewerScopeGeneration(generation)}function recordReviewerScopeGenerationFile(input){let session=swarmState.agentSessions.get(input.parentSessionID);if(!session||!isBoundedGenerationValue(input.file,4096)||!isBoundedGenerationValue(input.taskId,512)||!isBoundedGenerationValue(input.coderCallID,512))return!1;sweepReviewerScopeGenerations(session,input.now??Date.now());let{generations}=ensureReviewerScopeGenerationState(session),matches=[...generations.values()].filter((entry)=>entry.taskId===input.taskId&&entry.coderCallID===input.coderCallID&&entry.status==="collecting");if(matches.length!==1)return!1;let generation=matches[0];if(generation.modifiedFiles.includes(input.file))return!0;if(generation.modifiedFiles.length>=MAX_REVIEWER_SCOPE_GENERATION_FILES){let key2=reviewerScopeGenerationKey(generation.taskId,generation.coderCallID,generation.generation);return generations.delete(key2),!1}return generation.modifiedFiles.push(input.file),!0}function recordReviewerScopeGenerationFileFingerprint(input){let session=swarmState.agentSessions.get(input.parentSessionID);if(!session)return!1;let{generations}=ensureReviewerScopeGenerationState(session),matches=[...generations.values()].filter((entry)=>entry.taskId===input.taskId&&entry.coderCallID===input.coderCallID&&entry.status==="collecting");if(matches.length!==1)return!1;let generation=matches[0];if(!generation.modifiedFiles.includes(input.fingerprint.file))return!1;generation.captureFailures=generation.captureFailures.filter((entry)=>entry.file!==input.fingerprint.file);let existingIndex=generation.modifiedFileFingerprints.findIndex((entry)=>entry.file===input.fingerprint.file);if(existingIndex>=0)return generation.modifiedFileFingerprints[existingIndex]={...input.fingerprint},!0;if(generation.modifiedFileFingerprints.length>=MAX_REVIEWER_SCOPE_GENERATION_FILES)return!1;return generation.modifiedFileFingerprints.push({...input.fingerprint}),!0}function recordReviewerScopeGenerationCaptureFailure(input){let session=swarmState.agentSessions.get(input.parentSessionID);if(!session||!isBoundedGenerationValue(input.file,4096))return!1;let{generations}=ensureReviewerScopeGenerationState(session),matches=[...generations.values()].filter((entry)=>entry.taskId===input.taskId&&entry.coderCallID===input.coderCallID&&entry.status==="collecting");if(matches.length!==1)return!1;let generation=matches[0],now=input.at??Date.now();generation.modifiedFileFingerprints=generation.modifiedFileFingerprints.filter((entry)=>entry.file!==input.file);let existingIndex=generation.captureFailures.findIndex((entry)=>entry.file===input.file);if(existingIndex>=0){let existing=generation.captureFailures[existingIndex];return generation.captureFailures[existingIndex]={...existing,code:input.code,retryable:input.retryable,attempts:existing.attempts+1,at:now},!0}if(generation.captureFailures.length>=MAX_REVIEWER_SCOPE_GENERATION_FILES)generation.captureFailures.shift();return generation.captureFailures.push({file:input.file,code:input.code,retryable:input.retryable,attempts:1,at:now}),!0}function markReviewerScopeGenerationReady(input){let session=swarmState.agentSessions.get(input.parentSessionID);if(!session)return!1;let now=input.readyAt??Date.now();sweepReviewerScopeGenerations(session,now);let{generations}=ensureReviewerScopeGenerationState(session),matches=[...generations.values()].filter((entry)=>entry.taskId===input.taskId&&entry.coderCallID===input.coderCallID&&(entry.status==="collecting"||entry.status==="ready"));if(matches.length!==1)return!1;let generation=matches[0];if(generation.status==="ready")return!0;if(input.primaryWorkspaceIdentity&&generation.workspaceIdentity!==input.primaryWorkspaceIdentity)return!1;if(!(generation.modifiedFiles.length===generation.modifiedFileFingerprints.length&&generation.modifiedFiles.every((file3)=>generation.modifiedFileFingerprints.some((entry)=>entry.file===file3))))return!1;return generation.status="ready",generation.readyAt=now,!0}function markReviewerScopeGenerationNoChange(input){let session=swarmState.agentSessions.get(input.parentSessionID);if(!session)return!1;let now=input.at??Date.now();sweepReviewerScopeGenerations(session,now);let{generations}=ensureReviewerScopeGenerationState(session),matches=[...generations.values()].filter((entry)=>entry.taskId===input.taskId&&entry.coderCallID===input.coderCallID&&entry.status==="collecting");if(matches.length!==1)return!1;let generation=matches[0];if(generation.modifiedFiles.length!==0)return!1;return generation.status="no_change",generation.readyAt=now,!0}function markReviewerScopeGenerationMergebackPending(input){let session=swarmState.agentSessions.get(input.parentSessionID);if(!session)return!1;let{generations}=ensureReviewerScopeGenerationState(session),matches=[...generations.values()].filter((entry)=>(input.taskId===void 0||entry.taskId===input.taskId)&&entry.coderCallID===input.coderCallID&&(entry.status==="collecting"||entry.status==="ready"));if(matches.length!==1)return!1;if(matches[0].status==="mergeback_pending")return!0;return matches[0].status="mergeback_pending",!0}function settleReviewerScopeMergeback(input){let session=swarmState.agentSessions.get(input.parentSessionID);if(!session)return!1;let{generations}=ensureReviewerScopeGenerationState(session),matches=[...generations.values()].filter((entry)=>(input.taskId===void 0||entry.taskId===input.taskId)&&entry.coderCallID===input.coderCallID&&entry.status==="mergeback_pending");if(matches.length!==1)return!1;let generation=matches[0],now=input.outcome.at??Date.now();if(input.outcome.verified){if(generation.status="ready",generation.readyAt===void 0)generation.readyAt=now;return generation.mergeback={verifiedAt:now,primaryWorkspaceIdentity:input.outcome.primaryWorkspaceIdentity},generation.captureDirectory=input.outcome.primaryDirectory,generation.workspaceIdentity=input.outcome.primaryWorkspaceIdentity,!0}return generation.status="mergeback_mismatch",generation.mergeback={failedAt:now,reason:input.outcome.reason},!0}function getReviewerScopeGenerationForCoderCall(input){let session=swarmState.agentSessions.get(input.parentSessionID);if(!session)return null;sweepReviewerScopeGenerations(session,input.now??Date.now());let{generations}=ensureReviewerScopeGenerationState(session),matches=[...generations.values()].filter((entry)=>entry.coderCallID===input.coderCallID&&(input.taskId===void 0||entry.taskId===input.taskId));return matches.length===1?cloneReviewerScopeGeneration(matches[0]):null}function peekReadyReviewerScopeGeneration(input){let session=swarmState.agentSessions.get(input.parentSessionID);if(!session)return null;sweepReviewerScopeGenerations(session,input.now??Date.now());let{generations}=ensureReviewerScopeGenerationState(session),matches=[...generations.values()].filter((entry)=>entry.taskId===input.taskId&&entry.status==="ready");return matches.length===1?cloneReviewerScopeGeneration(matches[0]):null}function peekReviewerScopeGenerationByStatus(input){let session=swarmState.agentSessions.get(input.parentSessionID);if(!session)return null;sweepReviewerScopeGenerations(session,input.now??Date.now());let{generations}=ensureReviewerScopeGenerationState(session),matches=[...generations.values()].filter((entry)=>entry.taskId===input.taskId&&entry.status===input.status);return matches.length===1?cloneReviewerScopeGeneration(matches[0]):null}function claimReviewerScopeGeneration(input){let session=swarmState.agentSessions.get(input.parentSessionID);if(!session||!isBoundedGenerationValue(input.taskId,512)||!isBoundedGenerationValue(input.reviewerCallID,512))return null;sweepReviewerScopeGenerations(session,input.now??Date.now());let{generations}=ensureReviewerScopeGenerationState(session),matches=[...generations.values()].filter((entry)=>entry.taskId===input.taskId&&entry.status==="ready");if(matches.length!==1)return null;return matches[0].status="claimed",matches[0].reviewerCallID=input.reviewerCallID,cloneReviewerScopeGeneration(matches[0])}function attachReviewerScopeGenerationDispatchSnapshot(input){let session=swarmState.agentSessions.get(input.parentSessionID);if(!session)return!1;let{generations}=ensureReviewerScopeGenerationState(session),matches=[...generations.values()].filter((entry)=>entry.taskId===input.taskId&&entry.reviewerCallID===input.reviewerCallID&&entry.status==="claimed"&&entry.coderCallID===input.snapshot.coderCallID&&entry.generation===input.snapshot.generation&&entry.sessionIncarnation===input.snapshot.sessionIncarnation);if(matches.length!==1)return!1;return matches[0].reviewerDispatchScope={...input.snapshot,files:[...input.snapshot.files]},!0}function takeReviewerScopeGeneration(input){let session=swarmState.agentSessions.get(input.parentSessionID);if(!session)return null;sweepReviewerScopeGenerations(session,input.now??Date.now());let{generations}=ensureReviewerScopeGenerationState(session),matches=[...generations.entries()].filter(([,entry])=>entry.taskId===input.taskId&&entry.reviewerCallID===input.reviewerCallID&&entry.status==="claimed");if(matches.length!==1)return null;let[key2,generation]=matches[0];if(generation.background===!0&&generation.readyAt!==void 0&&Number.isFinite(generation.createdAt)&&Number.isFinite(generation.readyAt)){let{ownershipHistory}=ensureReviewerScopeGenerationState(session);while(ownershipHistory.size>=MAX_REVIEWER_SCOPE_OWNERSHIP_HISTORY){let oldestKey=ownershipHistory.keys().next().value;if(!oldestKey)break;ownershipHistory.delete(oldestKey)}let tombstone={parentSessionID:input.parentSessionID,taskId:generation.taskId,coderCallID:generation.coderCallID,generation:generation.generation,sessionIncarnation:generation.sessionIncarnation,background:!0,captureDirectory:generation.captureDirectory,workspaceIdentity:generation.workspaceIdentity,declaredFiles:[...generation.declaredFiles],modifiedFiles:[...generation.modifiedFiles],modifiedFileFingerprints:generation.modifiedFileFingerprints.map((fingerprint2)=>({...fingerprint2})),createdAt:generation.createdAt,readyAt:generation.readyAt??input.now??Date.now(),consumedAt:input.now??Date.now()};ownershipHistory.set(reviewerScopeOwnershipKey(tombstone.taskId,tombstone.coderCallID,tombstone.generation,tombstone.sessionIncarnation),tombstone)}return generations.delete(key2),cloneReviewerScopeGeneration(generation)}function getReviewerScopeOwnershipHistory(input){let session=swarmState.agentSessions.get(input.parentSessionID);if(!session)return[];let{ownershipHistory}=ensureReviewerScopeGenerationState(session);return[...ownershipHistory.values()].map(cloneReviewerScopeOwnershipTombstone)}function peekReviewerScopeGenerationClaim(input){let session=swarmState.agentSessions.get(input.parentSessionID);if(!session)return null;sweepReviewerScopeGenerations(session,input.now??Date.now());let{generations}=ensureReviewerScopeGenerationState(session),matches=[...generations.values()].filter((entry)=>entry.taskId===input.taskId&&entry.reviewerCallID===input.reviewerCallID&&entry.status==="claimed");return matches.length===1?cloneReviewerScopeGeneration(matches[0]):null}function discardReviewerScopeGenerationClaim(input){let session=swarmState.agentSessions.get(input.parentSessionID);if(!session)return!1;let{generations}=ensureReviewerScopeGenerationState(session),matches=[...generations.entries()].filter(([,entry])=>(input.taskId===void 0||entry.taskId===input.taskId)&&entry.reviewerCallID===input.reviewerCallID&&entry.status==="claimed");if(matches.length!==1)return!1;return generations.delete(matches[0][0]),!0}function reviewerScopeGenerationHasDeclaredOverlap(input){let session=swarmState.agentSessions.get(input.parentSessionID);if(!session)return!1;let{generations}=ensureReviewerScopeGenerationState(session),declared=new Set(input.declaredFiles);return[...generations.values()].some((entry)=>entry.status==="collecting"&&(entry.taskId!==input.taskId||entry.coderCallID!==input.coderCallID)&&entry.declaredFiles.some((file3)=>declared.has(file3)))}function discardReviewerScopeGenerationForCoderCall(input){let session=swarmState.agentSessions.get(input.parentSessionID);if(!session)return!1;let{generations}=ensureReviewerScopeGenerationState(session),matches=[...generations.entries()].filter(([,entry])=>(input.taskId===void 0||entry.taskId===input.taskId)&&entry.coderCallID===input.coderCallID&&entry.status!=="claimed");if(matches.length!==1)return!1;return generations.delete(matches[0][0]),!0}function isReviewerScopeGenerationCurrent(input){let session=swarmState.agentSessions.get(input.parentSessionID);if(!session)return!1;let{incarnation,latestByTask}=ensureReviewerScopeGenerationState(session),latest=latestByTask.get(input.taskId);return incarnation===input.sessionIncarnation&&latest?.generation===input.generation&&latest.coderCallID===input.coderCallID&&latest.sessionIncarnation===input.sessionIncarnation}function sweepStaleSessions(staleDurationMs=STALE_SESSION_TTL_MS,now=Date.now(),directory){let staleIds=[];for(let[id,session]of swarmState.agentSessions)if(now-session.lastToolCallTime>staleDurationMs){if(directory&&isSnapshotSessionOwnedLocally(id)&&!isSnapshotSessionAuthoritativelyStale(directory,id,staleDurationMs,now))continue;staleIds.push(id)}for(let id of staleIds){if(directory&&isSnapshotSessionOwnedLocally(id)){try{deleteSnapshotSessionRows(directory,id,"stale")}catch(error93){warn("[state] durable stale-session teardown failed:",error93 instanceof Error?error93.message:String(error93))}try{clearOverrideForSession(directory,id)}catch(error93){warn("[state] durable stale-session override teardown failed:",error93 instanceof Error?error93.message:String(error93))}}releaseSnapshotSessionOwnership(id),swarmState.agentSessions.delete(id),swarmState.delegationChains.delete(id),clearDispatchLineageForSession(id),swarmState.activeAgent.delete(id)}return staleIds}function maybeSweepStaleSessions(staleDurationMs=STALE_SESSION_TTL_MS,now=Date.now(),directory){if(now-_lastIdleSweepAtMs<IDLE_SWEEP_COOLDOWN_MS)return[];return _lastIdleSweepAtMs=now,sweepStaleSessions(staleDurationMs,now,directory)}function resolveInitialTurboMode(directory){if(!directory)return!1;try{return _internals86.loadPluginConfigWithMeta(directory).config.turbo_mode===!0}catch{return!1}}function startAgentSession(sessionId,agentName,staleDurationMs=STALE_SESSION_TTL_MS,directory){let now=Date.now();claimSnapshotSessionOwnership(sessionId,!0);let owningProjectKey=directory?hydrationProjectKey(directory):void 0,hydrationAuthority=owningProjectKey?captureCurrentHydrationAuthority(owningProjectKey):void 0,hydrationStamp=owningProjectKey?nextSessionHydrationStamp(owningProjectKey):void 0,hydrationAuthorityEpoch2=hydrationAuthority?.authorityEpoch;sweepStaleSessions(staleDurationMs,now,directory);let initialTurboMode=resolveInitialTurboMode(directory),sessionState={agentName,lastToolCallTime:now,lastAgentEventTime:now,delegationActive:!1,activeInvocationId:0,lastInvocationIdByAgent:{},windows:{},nonTransientCircuit:createNonTransientCircuitState(agentName,0),pendingToolExecutions:new Map,lastCompactionHint:0,architectWriteCount:0,lastCoderDelegationTaskId:null,currentTaskId:null,gateLog:new Map,reviewerCallCount:new Map,lastGateFailure:null,partialGateWarningsIssuedForTask:new Set,completionGateWarnedForTask:new Set,selfFixAttempted:!1,selfCodingWarnedAtCount:0,catastrophicPhaseWarnings:new Set,lastPhaseCompleteTimestamp:0,lastPhaseCompletePhase:0,phaseAgentsDispatched:new Set,lastCompletedPhaseAgentsDispatched:new Set,qaSkipCount:0,qaSkipTaskIds:[],taskWorkflowStates:new Map,taskWorkflowCache:new Map,stageBCompletion:new Map,stageBRouteEvidence:new Map,stageBRouteRequiredTasks:new Set,taskCouncilApproved:new Map,taskCouncilWorkflowGeneration:new Map,pendingCouncilRequirements:new Map,lastGateOutcome:null,declaredCoderScope:null,lastScopeViolation:null,scopeViolationDetected:!1,modifiedFilesByTask:new Map,modifiedFilesThisCoderTask:[],reviewerScopeGenerations:new Map,reviewerScopeGenerationCounter:0,reviewerScopeIncarnation:randomUUID13(),reviewerScopeLatestGenerationByTask:new Map,reviewerScopeOwnershipHistory:new Map,turboMode:initialTurboMode,turboStrategy:void 0,leanTurboActive:!1,leanTurboCurrentPhase:void 0,maxConcurrencyOverride:void 0,epicModeActive:!1,qaGateSessionOverrides:{},fullAutoMode:!1,fullAutoInteractionCount:0,fullAutoDeadlockCount:0,fullAutoLastQuestionHash:null,model_fallback_index:0,modelFallbackExhausted:!1,coderRevisions:0,revisionLimitHit:!1,loopDetectionWindow:[],pendingAdvisoryMessages:[],sessionRehydratedAt:0,owningProjectKey,hydrationStamp,hydrationAuthorityEpoch:hydrationAuthorityEpoch2,prmPatternCounts:new Map,prmEscalationLevel:0,prmLastPatternDetected:null,prmTrajectoryStep:0,prmHardStopPending:!1,prmHardStopInjectPending:!1,prmInjectedAdvisoryKeys:new Set,prmStruckEpisodes:new Map,prmLadderCounts:new Map,prmEpisodes:new Map,prmEpisodeGeneration:0,executionEpisodeArmed:!1,prSubscriptions:new Map};if(swarmState.agentSessions.set(sessionId,sessionState),directory){try{recordSessionStart(directory,now)}catch{}queueMicrotask(()=>{maybeSuggestWorktreeLink(directory,sessionId)})}if(telemetry.sessionStarted(sessionId,agentName),swarmState.activeAgent.set(sessionId,agentName),_internals86.applyRehydrationCache(sessionState),directory){let liveSession=sessionState,shouldCommitRehydration=()=>hydrationAuthority!==void 0&&isHydrationAuthorityCurrent(hydrationAuthority)&&swarmState.agentSessions.get(sessionId)===liveSession,rehydrationPromise;rehydrationPromise=_internals86.rehydrateSessionFromDisk(directory,sessionState,shouldCommitRehydration).then(async()=>{if(!shouldCommitRehydration())return;try{let subscriptions=await _internals86.rehydratePrSubscriptions(sessionId,directory);if(!shouldCommitRehydration())return;sessionState.prSubscriptions=subscriptions}catch(err){warn("[state] PR subscription rehydration failed, starting with empty subscriptions:",err instanceof Error?err.message:String(err))}}).catch((err)=>{warn("[state] Rehydration failed:",err instanceof Error?err.message:String(err))}).finally(()=>{swarmState.pendingRehydrations.delete(rehydrationPromise)}),swarmState.pendingRehydrations.add(rehydrationPromise)}}function endAgentSession(sessionId,directory){if(directory){try{deleteSnapshotSessionRows(directory,sessionId)}catch(error93){warn("[state] durable snapshot session teardown failed:",error93 instanceof Error?error93.message:String(error93))}try{clearOverrideForSession(directory,sessionId)}catch(error93){warn("[state] durable session override teardown failed:",error93 instanceof Error?error93.message:String(error93))}}releaseSnapshotSessionOwnership(sessionId);let removedBindings=clearScopeBindings((binding)=>binding.ownerSessionId===sessionId||binding.parentOwnerSessionId===sessionId);for(let binding of removedBindings)clearScopeBindingFromDisk({directory:binding.workspaceIdentity,binding});swarmState.agentSessions.delete(sessionId),swarmState.activeAgent.delete(sessionId),swarmState.delegationChains.delete(sessionId),clearDispatchLineageForSession(sessionId),clearRealtimeLearningNudgeSession(sessionId),resetSessionQueue(sessionId),resetPrmPatternSupport(sessionId)}function getAgentSession(sessionId){return swarmState.agentSessions.get(sessionId)}function ensureAgentSession(sessionId,agentName,directory){let now=Date.now();claimSnapshotSessionOwnership(sessionId,!0);let session=swarmState.agentSessions.get(sessionId);if(session){if(agentName&&agentName!==session.agentName){let oldName=session.agentName;if(session.agentName=agentName,telemetry.agentActivated(sessionId,agentName,oldName),session.delegationActive=!1,session.lastAgentEventTime=now,session.nonTransientCircuit=createNonTransientCircuitState(agentName,0),!session.windows)session.activeInvocationId=0,session.lastInvocationIdByAgent={},session.windows={}}if(!session.windows)session.activeInvocationId=0,session.lastInvocationIdByAgent={},session.windows={};if(session.nonTransientCircuit===void 0)session.nonTransientCircuit=createNonTransientCircuitState(session.agentName,session.activeInvocationId??0);if(session.pendingToolExecutions===void 0)session.pendingToolExecutions=new Map;if(session.lastCompactionHint===void 0)session.lastCompactionHint=0;if(session.architectWriteCount===void 0)session.architectWriteCount=0;if(session.lastCoderDelegationTaskId===void 0)session.lastCoderDelegationTaskId=null;if(session.currentTaskId===void 0)session.currentTaskId=null;if(!session.gateLog)session.gateLog=new Map;if(!session.reviewerCallCount)session.reviewerCallCount=new Map;if(session.lastGateFailure===void 0)session.lastGateFailure=null;if(!session.partialGateWarningsIssuedForTask)session.partialGateWarningsIssuedForTask=new Set;if(!session.completionGateWarnedForTask)session.completionGateWarnedForTask=new Set;if(session.selfFixAttempted===void 0)session.selfFixAttempted=!1;if(session.selfCodingWarnedAtCount===void 0)session.selfCodingWarnedAtCount=0;if(!session.catastrophicPhaseWarnings)session.catastrophicPhaseWarnings=new Set;if(session.lastPhaseCompleteTimestamp===void 0)session.lastPhaseCompleteTimestamp=0;if(session.lastPhaseCompletePhase===void 0)session.lastPhaseCompletePhase=0;if(!session.phaseAgentsDispatched)session.phaseAgentsDispatched=new Set;if(!session.lastCompletedPhaseAgentsDispatched)session.lastCompletedPhaseAgentsDispatched=new Set;if(session.qaSkipCount===void 0)session.qaSkipCount=0;if(!session.qaSkipTaskIds)session.qaSkipTaskIds=[];if(!session.taskWorkflowStates)session.taskWorkflowStates=new Map;if(!session.taskWorkflowCache)session.taskWorkflowCache=new Map;if(!session.stageBCompletion)session.stageBCompletion=new Map;if(!session.stageBRouteEvidence)session.stageBRouteEvidence=new Map;if(!session.stageBRouteRequiredTasks)session.stageBRouteRequiredTasks=new Set;if(!session.taskCouncilApproved)session.taskCouncilApproved=new Map;if(!session.pendingCouncilRequirements)session.pendingCouncilRequirements=new Map;if(session.lastGateOutcome===void 0)session.lastGateOutcome=null;if(session.declaredCoderScope===void 0)session.declaredCoderScope=null;if(session.lastScopeViolation===void 0)session.lastScopeViolation=null;if(!(session.modifiedFilesByTask instanceof Map)){if(session.modifiedFilesByTask=new Map,isValidTaskId2(session.currentTaskId)&&Array.isArray(session.modifiedFilesThisCoderTask)&&session.modifiedFilesThisCoderTask.length>0)session.modifiedFilesByTask.set(session.currentTaskId,[...new Set(session.modifiedFilesThisCoderTask)])}if(projectModifiedFilesForActiveTask(session),!session.reviewerScopeGenerations)session.reviewerScopeGenerations=new Map;if(session.reviewerScopeGenerationCounter===void 0)session.reviewerScopeGenerationCounter=0;if(!session.reviewerScopeIncarnation)session.reviewerScopeIncarnation=randomUUID13();if(!session.reviewerScopeLatestGenerationByTask)session.reviewerScopeLatestGenerationByTask=new Map;if(!session.reviewerScopeOwnershipHistory)session.reviewerScopeOwnershipHistory=new Map;if(session.scopeViolationDetected===void 0)session.scopeViolationDetected=!1;if(session.turboMode===void 0)session.turboMode=!1;if(session.turboStrategy===void 0)session.turboStrategy=void 0;if(session.leanTurboActive===void 0)session.leanTurboActive=!1;if(session.leanTurboCurrentPhase===void 0)session.leanTurboCurrentPhase=void 0;if(session.epicModeActive===void 0)session.epicModeActive=!1;if(session.qaGateSessionOverrides===void 0)session.qaGateSessionOverrides={};if(session.model_fallback_index===void 0)session.model_fallback_index=0;if(session.modelFallbackExhausted===void 0)session.modelFallbackExhausted=!1;if(session.loopDetectionWindow===void 0)session.loopDetectionWindow=[];if(session.pendingAdvisoryMessages===void 0)session.pendingAdvisoryMessages=[];if(session.coderRevisions===void 0)session.coderRevisions=0;if(session.revisionLimitHit===void 0)session.revisionLimitHit=!1;if(session.sessionRehydratedAt===void 0)session.sessionRehydratedAt=0;if(session.prmPatternCounts===void 0)session.prmPatternCounts=new Map;if(session.prmEscalationLevel===void 0)session.prmEscalationLevel=0;if(session.prmLastPatternDetected===void 0)session.prmLastPatternDetected=null;if(session.prmTrajectoryStep===void 0)session.prmTrajectoryStep=0;if(session.prmHardStopPending===void 0)session.prmHardStopPending=!1;if(session.prmHardStopInjectPending===void 0)session.prmHardStopInjectPending=!1;if(!session.prmInjectedAdvisoryKeys)session.prmInjectedAdvisoryKeys=new Set;if(!session.prmStruckEpisodes)session.prmStruckEpisodes=new Map;if(!session.prmLadderCounts)session.prmLadderCounts=new Map;if(session.executionEpisodeArmed===void 0)session.executionEpisodeArmed=!1;if(!session.prSubscriptions)session.prSubscriptions=new Map;return session.lastToolCallTime=now,maybeSweepStaleSessions(STALE_SESSION_TTL_MS,now,directory),session}if(_internals86.startAgentSession(sessionId,agentName??"unknown",7200000,directory),session=swarmState.agentSessions.get(sessionId),!session)throw Error(`Failed to create guardrail session for ${sessionId}`);if(agentName&&agentName!=="unknown")adoptPendingDispatchAuthorization(sessionId,agentName);return session}function recordSessionWorkspaceRoot(sessionId,laneRoot){let trimmed=laneRoot.trim();if(!trimmed)return;let session=swarmState.agentSessions.get(sessionId);if(!session)return;session.workspaceDirectory=trimmed}function resolveSessionWorkspaceDirectory(sessionId,fallbackDirectory){let recorded=swarmState.agentSessions.get(sessionId)?.workspaceDirectory;if(recorded?.trim())return recorded;return fallbackDirectory}function updateAgentEventTime(sessionId){let session=swarmState.agentSessions.get(sessionId);if(session)session.lastAgentEventTime=Date.now()}function beginInvocation(sessionId,agentName){let session=swarmState.agentSessions.get(sessionId);if(!session)throw Error(`Cannot begin invocation: session ${sessionId} does not exist`);let stripped=stripKnownSwarmPrefix(agentName),lastId=session.lastInvocationIdByAgent[stripped]||0;if(lastId>0)clearInvocationActionCircuits(sessionId,lastId),clearPendingTaskModelRoutesForSession(sessionId,"invocation");let newId=lastId+1;if(session.lastInvocationIdByAgent[stripped]=newId,session.activeInvocationId=newId,session.nonTransientCircuit=createNonTransientCircuitState(stripped,newId),stripped===ORCHESTRATOR_NAME)return null;let now=Date.now(),window2={id:newId,agentName:stripped,startedAtMs:now,toolCalls:0,consecutiveErrors:0,hardLimitHit:!1,lastSuccessTimeMs:now,recentToolCalls:[],warningIssued:!1,warningReason:"",transientRetryCount:0},key2=`${stripped}:${newId}`;return session.windows[key2]=window2,pruneOldWindows(sessionId,86400000,50),window2}function getActiveWindow(sessionId){let session=swarmState.agentSessions.get(sessionId);if(!session||!session.windows)return;let key2=`${stripKnownSwarmPrefix(session.agentName)}:${session.activeInvocationId}`;return session.windows[key2]}function pruneOldWindows(sessionId,maxAgeMs=86400000,maxWindows=50){let session=swarmState.agentSessions.get(sessionId);if(!session||!session.windows)return;let now=Date.now(),toKeep=Object.entries(session.windows).filter(([_,window2])=>now-window2.startedAtMs<maxAgeMs).sort((a,b)=>b[1].startedAtMs-a[1].startedAtMs).slice(0,maxWindows);session.windows=Object.fromEntries(toKeep)}function recordPhaseAgentDispatch(sessionId,agentName){let session=swarmState.agentSessions.get(sessionId);if(!session)return;if(!session.phaseAgentsDispatched)session.phaseAgentsDispatched=new Set;let normalizedName=stripKnownSwarmPrefix(agentName);session.phaseAgentsDispatched.add(normalizedName)}function ensureModifiedFilesByTask(session){if(!(session.modifiedFilesByTask instanceof Map))session.modifiedFilesByTask=new Map;return session.modifiedFilesByTask}function projectModifiedFilesForActiveTask(session){let taskId=session.currentTaskId;session.modifiedFilesThisCoderTask=isValidTaskId2(taskId)&&session.modifiedFilesByTask instanceof Map?[...session.modifiedFilesByTask.get(taskId)??[]]:[]}function ensureModifiedFileTaskSlot(session,taskId){if(!isValidTaskId2(taskId))return!1;let entries=ensureModifiedFilesByTask(session);if(entries.has(taskId))return!0;while(entries.size>=MAX_TRACKED_TASK_FILE_ATTRIBUTIONS){let reclaimable=[...entries.keys()].find((candidate)=>candidate!==taskId&&session.taskWorkflowStates?.get(candidate)==="complete");if(!reclaimable)return!1;entries.delete(reclaimable)}return entries.set(taskId,[]),!0}function recordModifiedFilesForTask(session,taskId,files,workspaceDirectory){if(!ensureModifiedFileTaskSlot(session,taskId))return!1;let normalized=[...new Set(files.map((file3)=>canonicalAttributionPath(file3,workspaceDirectory)).filter((file3)=>file3!==null))];if(session.modifiedFilesByTask.set(taskId,normalized),session.currentTaskId===taskId)projectModifiedFilesForActiveTask(session);return!0}function recordModifiedFileForTask(session,taskId,file3,workspaceDirectory){if(typeof file3!=="string"||file3.trim().length===0)return!1;if(!ensureModifiedFileTaskSlot(session,taskId))return!1;let canonical=canonicalAttributionPath(file3,workspaceDirectory);if(canonical===null)return!0;let entries=ensureModifiedFilesByTask(session),current=entries.get(taskId)??[];if(current.includes(canonical))return!0;if(entries.set(taskId,[...current,canonical]),session.currentTaskId===taskId)projectModifiedFilesForActiveTask(session);return!0}function hasModifiedFilesForTask(session,taskId){if(!session)return!1;if(!isValidTaskId2(taskId))return!1;if(!(session.modifiedFilesByTask instanceof Map))return!1;return session.modifiedFilesByTask.has(taskId)}function getModifiedFilesForTask(session,taskId){if(!isValidTaskId2(taskId))return[];return[...ensureModifiedFilesByTask(session).get(taskId)??[]]}function resetModifiedFilesForTask(session,taskId,options){if(!isValidTaskId2(taskId))return!1;let entries=ensureModifiedFilesByTask(session);if(options?.remove)entries.delete(taskId);else{if(!ensureModifiedFileTaskSlot(session,taskId))return!1;entries.set(taskId,[])}if(session.currentTaskId===taskId)projectModifiedFilesForActiveTask(session);return!0}function completeModifiedFilesForTask(session,taskId){if(!session.epicModeActive)resetModifiedFilesForTask(session,taskId,{remove:!0})}function isValidTaskId2(taskId){if(taskId===null||taskId===void 0)return!1;if(typeof taskId!=="string")return!1;return taskId.trim().length>0}function ensureTaskWorkflowCache(session){if(!session.taskWorkflowCache)session.taskWorkflowCache=new Map;return session.taskWorkflowCache}function updateTaskWorkflowCache(session,taskId,overrides2){let cache2=ensureTaskWorkflowCache(session),existing=cache2.get(taskId);cache2.set(taskId,{generation:overrides2.generation??existing?.generation??0,retryCount:overrides2.retryCount??existing?.retryCount??0,lastOutcome:overrides2.lastOutcome??existing?.lastOutcome??"none",lastTransitionId:overrides2.lastTransitionId??existing?.lastTransitionId??null,updatedAt:overrides2.updatedAt??existing?.updatedAt??""})}function advanceTaskState(session,taskId,newState2,options,councilConfig){if(!isValidTaskId2(taskId))return;if(!session||!(session.taskWorkflowStates instanceof Map))throw Error("INVALID_SESSION: session.taskWorkflowStates must be a Map instance");let current=session.taskWorkflowStates.get(taskId)??"idle",currentIndex=LINEAR_STATE_ORDER.indexOf(current),newIndex=LINEAR_STATE_ORDER.indexOf(newState2);if(currentIndex===-1||newIndex===-1||newIndex<=currentIndex)throw Error(`INVALID_TASK_STATE_TRANSITION: ${taskId} ${current} → ${newState2}`);if(newState2==="complete"&¤t!=="tests_run"){let councilEntry=session.taskCouncilApproved?.get(taskId),effectiveMinimum=councilConfig?.requireAllMembers?5:councilConfig?.minimumMembers??3,councilApproved=councilEntry?.verdict==="APPROVE"&&(councilEntry.quorumSize??0)>=effectiveMinimum,pastPreCheck=currentIndex>=LINEAR_STATE_ORDER.indexOf("pre_check_passed");if(!councilApproved||!pastPreCheck)throw Error(`INVALID_TASK_STATE_TRANSITION: ${taskId} cannot reach complete from ${current} — must pass through tests_run first (or have council APPROVE after pre_check)`)}if(session.taskWorkflowStates.set(taskId,newState2),updateTaskWorkflowCache(session,taskId,{updatedAt:new Date().toISOString()}),newState2==="complete")session.stageBCompletion?.delete(taskId),clearStageBRouteEvidence(session,taskId),clearStageBRouteRequired(session,taskId),completeModifiedFilesForTask(session,taskId);if(options?.emitTelemetry!==!1)telemetry.taskStateChanged(options?.telemetrySessionId??session.agentName,taskId,newState2,current)}function canAdvanceTaskState(session,taskId,newState2,councilConfig){if(!isValidTaskId2(taskId))return!1;if(!session||!(session.taskWorkflowStates instanceof Map))return!1;let current=session.taskWorkflowStates.get(taskId)??"idle",currentIndex=LINEAR_STATE_ORDER.indexOf(current),newIndex=LINEAR_STATE_ORDER.indexOf(newState2);if(currentIndex===-1||newIndex===-1||newIndex<=currentIndex)return!1;if(newState2==="complete"&¤t!=="tests_run"){let councilEntry=session.taskCouncilApproved?.get(taskId),effectiveMinimum=councilConfig?.requireAllMembers?5:councilConfig?.minimumMembers??3,councilApproved=councilEntry?.verdict==="APPROVE"&&(councilEntry.quorumSize??0)>=effectiveMinimum,pastPreCheck=currentIndex>=LINEAR_STATE_ORDER.indexOf("pre_check_passed");if(!councilApproved||!pastPreCheck)return!1}return!0}async function advanceTaskStateAndPersist(session,taskId,newState2,_directory2,options,councilConfig){if(newState2==="coder_delegated"||newState2==="complete")throw Error(`TASK_WORKFLOW_CENTRAL_TRANSACTION_REQUIRED: ${taskId} → ${newState2} must use exact-task durable transition APIs`);advanceTaskState(session,taskId,newState2,options,councilConfig)}function getTaskState(session,taskId){if(!isValidTaskId2(taskId))return"idle";if(!session.taskWorkflowStates)session.taskWorkflowStates=new Map;return session.taskWorkflowStates.get(taskId)??"idle"}function recordStageBCompletion(session,taskId,agent){if(!isValidTaskId2(taskId))return;if(!session.stageBCompletion)session.stageBCompletion=new Map;let existing=session.stageBCompletion.get(taskId);if(existing)existing.add(agent);else session.stageBCompletion.set(taskId,new Set([agent]))}function reserveStageBRouteEvidence(session,taskId,evidence){if(!isValidTaskId2(taskId))return null;if(!session.stageBRouteEvidence)session.stageBRouteEvidence=new Map;let entries=session.stageBRouteEvidence.get(taskId)??[],dispatchIdentity=(entry)=>{if(!entry.callId||!entry.childSessionId||typeof entry.generation!=="number")return null;return[entry.role,entry.sessionId??"",entry.taskId??"",entry.callId,entry.childSessionId,String(entry.generation)].join("\x00")},incomingDispatchIdentity=dispatchIdentity(evidence),existingIndex=entries.findIndex((entry)=>entry.role===evidence.role&&(incomingDispatchIdentity!==null&&dispatchIdentity(entry)===incomingDispatchIdentity||incomingDispatchIdentity===null&&dispatchIdentity(entry)===null&&entry.identity===evidence.identity));if(existingIndex>=0){let previousEntry=entries[existingIndex],reservedEntry2={...evidence};return entries[existingIndex]=reservedEntry2,session.stageBRouteEvidence.set(taskId,entries),()=>{if(session.stageBRouteEvidence?.get(taskId)!==entries)return;let reservedIndex=entries.indexOf(reservedEntry2);if(reservedIndex<0)return;entries[reservedIndex]=previousEntry}}if(entries.length>=32)return null;let reservedEntry={...evidence};return entries.push(reservedEntry),session.stageBRouteEvidence.set(taskId,entries),()=>{if(session.stageBRouteEvidence?.get(taskId)!==entries)return;let reservedIndex=entries.indexOf(reservedEntry);if(reservedIndex<0)return;if(entries.splice(reservedIndex,1),entries.length===0)session.stageBRouteEvidence?.delete(taskId)}}function recordStageBRouteEvidence(session,taskId,evidence){return reserveStageBRouteEvidence(session,taskId,evidence)!==null}function getStageBRouteEvidence(session,taskId){return(session.stageBRouteEvidence?.get(taskId)??[]).map((entry)=>({...entry}))}function clearStageBRouteEvidence(session,taskId){session.stageBRouteEvidence?.delete(taskId)}function markStageBRouteRequired(session,taskId){if(!session.stageBRouteRequiredTasks)session.stageBRouteRequiredTasks=new Set;session.stageBRouteRequiredTasks.add(taskId)}function isStageBRouteRequired(session,taskId){return session.stageBRouteRequiredTasks?.has(taskId)===!0}function clearStageBRouteRequired(session,taskId){session.stageBRouteRequiredTasks?.delete(taskId)}function hasBothStageBCompletions(session,taskId){if(!isValidTaskId2(taskId))return!1;let completions=session.stageBCompletion?.get(taskId);if(!completions)return!1;return completions.has("reviewer")&&completions.has("test_engineer")}async function isCouncilGateActive(directory,council,sessionOverrides={}){let enabled=council?.enabled===!0,plan=null;try{plan=await loadPlanJsonOnly(directory)}catch{plan=null}if(!plan)return!1;let planId=derivePlanId(plan),lookup=null;try{lookup=getProfileLookupForIdentity(directory,plan)}catch(err){let msg=err instanceof Error?err.message:String(err);if(!(msg.includes("SQLITE_CANTOPEN")||msg.includes("ENOENT")))warn(`[isCouncilGateActive] getProfile threw unexpectedly for plan ${planId}: ${msg}. Treating council as inactive.`);lookup=null}if(!lookup||lookup.kind==="missing")return!1;if(lookup.kind==="unbound_legacy")return enabled&&lookup.profile.gates.council_mode===!0;let profile=lookup.profile,councilMode=getEffectiveGates(profile,sessionOverrides).council_mode===!0;if(enabled&&councilMode)return!0;if(enabled!==councilMode&&!_councilDisagreementWarned.has(planId))_councilDisagreementWarned.add(planId),warn(`[delegation-gate] Council mode mismatch for plan ${planId}: pluginConfig.council.enabled=${enabled}, QaGates.council_mode=${councilMode}. Falling back to Stage B (non-council) per-task advancement.`);return!1}function _resetCouncilDisagreementWarnings(){_councilDisagreementWarned.clear()}function planStatusToWorkflowState(status){switch(status){case"in_progress":return"idle";case"completed":return"complete";case"blocked":return"blocked";case"closed":return"closed";default:return"idle"}}function evidenceToWorkflowState(evidence){let snapshot=getTaskWorkflowSnapshot(evidence);return{state:snapshot.state,generation:snapshot.generation,authoritative:snapshot.authoritative,retryCount:snapshot.retryCount,lastOutcome:snapshot.lastOutcome,lastTransitionId:snapshot.lastTransitionId,updatedAt:snapshot.updatedAt}}async function readPlanFromDisk(directory){try{let planPath=path100.join(directory,".swarm","plan.json"),content=await fs62.readFile(planPath,"utf-8"),parsed=JSON.parse(content);return PlanSchema.parse(parsed)}catch{return null}}async function readGateEvidenceFromDisk(directory){let evidenceMap=new Map;try{let evidenceDir=path100.join(directory,".swarm","evidence"),entries=await fs62.readdir(evidenceDir,{withFileTypes:!0});for(let entry of entries){if(!entry.isFile()||!entry.name.endsWith(".json"))continue;let taskId=entry.name.replace(/\.json$/,"");if(!/^\d+\.\d+(\.\d+)*$/.test(taskId))continue;try{let filePath=path100.join(evidenceDir,entry.name),content=await fs62.readFile(filePath,"utf-8"),parsed=parseTaskEvidence(content,taskId);evidenceMap.set(taskId,parsed)}catch{}}}catch{}return evidenceMap}async function buildRehydrationCache(directory,options){let projectKey=hydrationProjectKey(directory),buildAuthority=captureCurrentHydrationAuthority(projectKey),planTaskStates=new Map,plan=options&&Object.hasOwn(options,"planOverride")?options.planOverride:await readPlanFromDisk(directory),cachePlan=plan??null;if(plan)for(let phase of plan.phases??[])for(let task of phase.tasks??[])planTaskStates.set(task.id,planStatusToWorkflowState(task.status));let evidenceMap=await readGateEvidenceFromDisk(directory),councilConfig;try{councilConfig=loadPluginConfig(directory).council}catch{councilConfig=void 0}if(options?.shouldCommit&&!options.shouldCommit()||!isHydrationAuthorityCurrent(buildAuthority))return{committed:!1,reason:"superseded"};return setRehydrationCache(projectKey,{planTaskStates,evidenceMap,taskIdentityContext:{plan:cachePlan,councilConfig}},buildAuthority)?{committed:!0}:{committed:!1,reason:"superseded"}}function applyRehydrationCache(session,projectKey){let resolvedKey=projectKey??session.owningProjectKey;if(!resolvedKey)return;let cache2=getRehydrationCache(resolvedKey);if(!cache2)return;if(!session.taskWorkflowStates)session.taskWorkflowStates=new Map;if(!session.taskWorkflowCache)session.taskWorkflowCache=new Map;if(!session.taskCouncilApproved)session.taskCouncilApproved=new Map;let{planTaskStates,evidenceMap,taskIdentityContext}=cache2;for(let[taskId,planState]of planTaskStates){let existingState=session.taskWorkflowStates.get(taskId),existingCache=ensureTaskWorkflowCache(session).get(taskId),evidence=evidenceMap.get(taskId);if(evidence){let derivedWorkflow=evidenceToWorkflowState(evidence);if(derivedWorkflow.authoritative){session.taskWorkflowStates.set(taskId,derivedWorkflow.state),updateTaskWorkflowCache(session,taskId,{generation:derivedWorkflow.generation,retryCount:derivedWorkflow.retryCount,lastOutcome:derivedWorkflow.lastOutcome,lastTransitionId:derivedWorkflow.lastTransitionId,updatedAt:derivedWorkflow.updatedAt});continue}}if((existingCache?.generation??0)>0)continue;if(existingState==null||compareWorkflowStatePrecedence(planState,existingState)>0)session.taskWorkflowStates.set(taskId,planState)}let VALID_COUNCIL_VERDICTS=new Set(["APPROVE","REJECT","CONCERNS"]);for(let[taskId,evidence]of evidenceMap){let council=evidence.gates?.council;if(!council){session.taskCouncilApproved.delete(taskId);continue}let rawIdentityDigest=council.identity_digest;if(typeof rawIdentityDigest!=="string"||!/^[a-f0-9]{64}$/.test(rawIdentityDigest)){session.taskCouncilApproved.delete(taskId);continue}let expectedIdentity=computeCouncilReviewIdentity({level:"task",scope:{kind:"task",taskId},plan:taskIdentityContext.plan,config:taskIdentityContext.councilConfig});if(rawIdentityDigest!==expectedIdentity.identityDigest){session.taskCouncilApproved.delete(taskId);continue}let councilWorkflow=getTaskWorkflowSnapshot(evidence);if(!councilWorkflow.authoritative||council.workflowGeneration!==councilWorkflow.generation||councilWorkflow.state!=="pre_check_passed"){session.taskCouncilApproved.delete(taskId);continue}let rawVerdict=council.verdict;if(!rawVerdict||typeof rawVerdict!=="string")continue;if(!VALID_COUNCIL_VERDICTS.has(rawVerdict))continue;let verdict=rawVerdict,roundNumber=council.roundNumber;if(typeof roundNumber!=="number"||!Number.isFinite(roundNumber))roundNumber=1;let rawQuorumSize=council.quorumSize,quorumSize=typeof rawQuorumSize==="number"&&Number.isFinite(rawQuorumSize)&&rawQuorumSize>=1?rawQuorumSize:1;session.taskCouncilApproved.set(taskId,{verdict,roundNumber,quorumSize})}}async function rehydrateSessionFromDisk(directory,session,shouldCommit){let cacheBuild=shouldCommit?await _internals86.buildRehydrationCache(directory,{shouldCommit}):await _internals86.buildRehydrationCache(directory);if(cacheBuild&&!cacheBuild.committed)return;if(shouldCommit&&!shouldCommit())return;_internals86.applyRehydrationCache(session,hydrationProjectKey(directory))}function hasActiveTurboMode(sessionID){if(sessionID)return swarmState.agentSessions.get(sessionID)?.turboMode===!0;for(let[_sessionId,session]of swarmState.agentSessions)if(session.turboMode===!0)return!0;return!1}function hasActiveFullAuto(sessionID){if(sessionID)return swarmState.agentSessions.get(sessionID)?.fullAutoMode===!0;for(let[_sessionId,session]of swarmState.agentSessions)if(session.fullAutoMode===!0)return!0;return!1}function getActiveFullAutoSessionID(){let activeId,activeLastToolCall=-1;for(let[id,session]of swarmState.agentSessions){if(session.fullAutoMode!==!0)continue;let lastToolCall=session.lastToolCallTime??0;if(activeId===void 0||lastToolCall>activeLastToolCall)activeId=id,activeLastToolCall=lastToolCall}return activeId}function hasActiveLeanTurbo(sessionID){if(sessionID){let session=swarmState.agentSessions.get(sessionID);return session?.turboMode===!0&&session?.turboStrategy==="lean"&&session?.leanTurboActive===!0}for(let[_sessionId,session]of swarmState.agentSessions)if(session.turboMode===!0&&session.turboStrategy==="lean"&&session.leanTurboActive===!0)return!0;return!1}function hasActiveEpicMode(sessionID){if(sessionID)return swarmState.agentSessions.get(sessionID)?.epicModeActive===!0;for(let[_sessionId,session]of swarmState.agentSessions)if(session.epicModeActive===!0)return!0;return!1}function getResolvedAutoProceed(session,planAutoProceed){return session.autoProceedOverride??planAutoProceed??!1}function setSessionEnvironment(sessionId,profile){swarmState.environmentProfiles.set(sessionId,profile)}function getSessionEnvironment(sessionId){return swarmState.environmentProfiles.get(sessionId)}function ensureSessionEnvironment(sessionId){let existing=swarmState.environmentProfiles.get(sessionId);if(existing)return existing;let profile=detectEnvironmentProfile();return swarmState.environmentProfiles.set(sessionId,profile),Promise.resolve().then(() => (init_telemetry(),exports_telemetry)).then(({telemetry:telemetry2})=>{telemetry2.environmentDetected(sessionId,profile.hostOS,profile.shellFamily,profile.executionMode)}).catch(()=>{}),profile}function setLiveContextWindow(sessionID,tokens,identity){if(!sessionID)return;let map3=swarmState.liveContextWindows,modelID=trimLiveContextIdentity(identity?.modelID),providerID=trimLiveContextIdentity(identity?.providerID),hasIdentity=Boolean(modelID||providerID),existing=map3.get(sessionID);if(!(typeof tokens==="number"&&Number.isFinite(tokens)&&tokens>=1)){if(!hasIdentity)return;if(existing&&liveContextIdentityMatches(existing,{modelID,providerID})&&existing.tokens!==void 0)return;if(map3.has(sessionID))map3.delete(sessionID);map3.set(sessionID,{modelID,providerID}),evictOldestLiveContextWindow(map3,sessionID);return}if(!hasIdentity&&existing&&(existing.modelID||existing.providerID))return;if(map3.has(sessionID))map3.delete(sessionID);map3.set(sessionID,{tokens:Math.floor(tokens),modelID,providerID}),evictOldestLiveContextWindow(map3,sessionID)}function getLiveContextWindow(sessionID,identity){if(!sessionID)return;let cached3=swarmState.liveContextWindows.get(sessionID);if(!cached3)return;if(identity&&!liveContextIdentityMatches(cached3,identity))return;return cached3.tokens}function getLiveContextModelIdentity(sessionID){if(!sessionID)return;let cached3=swarmState.liveContextWindows.get(sessionID);if(!cached3)return;return{modelID:cached3.modelID,providerID:cached3.providerID}}function evictOldestLiveContextWindow(map3,sessionID){if(map3.size<=MAX_TRACKED_CONTEXT_WINDOWS)return;let oldest=map3.keys().next().value;if(oldest!==void 0&&oldest!==sessionID)map3.delete(oldest)}function trimLiveContextIdentity(value){let trimmed=value?.trim();return trimmed?trimmed:void 0}function normalizeLiveContextIdentity(value){return trimLiveContextIdentity(value)?.toLowerCase()??""}function liveContextIdentityMatches(left,right){return normalizeLiveContextIdentity(left.modelID)===normalizeLiveContextIdentity(right.modelID)&&normalizeLiveContextIdentity(left.providerID)===normalizeLiveContextIdentity(right.providerID)}function setSessionBudget(sessionID,pct,tokens){let map3=swarmState.lastBudgetBySession;if(map3.has(sessionID))map3.delete(sessionID);if(map3.set(sessionID,{pct,tokens}),map3.size>MAX_TRACKED_BUDGET_SESSIONS){let oldest=map3.keys().next().value;if(oldest!==void 0&&oldest!==sessionID)map3.delete(oldest)}}function setFinalPromptPressure(sessionID,snapshot){let map3=swarmState.finalPromptPressureBySession;if(map3.has(sessionID))map3.delete(sessionID);if(map3.set(sessionID,snapshot),map3.size>MAX_TRACKED_BUDGET_SESSIONS){let oldest=map3.keys().next().value;if(oldest!==void 0&&oldest!==sessionID)map3.delete(oldest)}}function getFinalPromptPressure(sessionID){if(!sessionID)return;return swarmState.finalPromptPressureBySession.get(sessionID)}function setFinalAccountingWarningBand(sessionID,band){let map3=swarmState.finalAccountingWarningBandsBySession,entry=map3.get(sessionID)??{warn:!1,critical:!1};if(map3.has(sessionID))map3.delete(sessionID);if(band==="critical")entry.critical=!0;else entry.warn=!0;if(map3.set(sessionID,entry),map3.size>MAX_TRACKED_BUDGET_SESSIONS){let oldest=map3.keys().next().value;if(oldest!==void 0&&oldest!==sessionID)map3.delete(oldest)}}function getFinalAccountingWarningBand(sessionID,band){if(!sessionID)return!1;let entry=swarmState.finalAccountingWarningBandsBySession.get(sessionID);if(!entry)return!1;return band==="critical"?entry.critical:entry.warn}function clearFinalAccountingWarningBands(){swarmState.finalAccountingWarningBandsBySession.clear()}function getSessionBudgetPct(sessionID){if(!sessionID)return 0;return swarmState.lastBudgetBySession.get(sessionID)?.pct??0}function getSessionBudgetTokens(sessionID){if(!sessionID)return 0;return swarmState.lastBudgetBySession.get(sessionID)?.tokens??0}function getDisplayBudget(){let best=null;for(let entry of swarmState.lastBudgetBySession.values())if(entry.pct>0&&(best===null||entry.pct>best.pct))best=entry;return best}function getDisplayFinalPromptPressure(){let best=null;for(let entry of swarmState.finalPromptPressureBySession.values())if(entry.pct>0&&(best===null||entry.pct>best.pct))best=entry;return best}function setCriticalShownIds(sessionID,value){let map3=swarmState.currentCriticalShownIds;if(map3.has(sessionID))map3.delete(sessionID);if(map3.set(sessionID,value),map3.size>MAX_TRACKED_CRITICAL_SHOWN){let oldest=map3.keys().next().value;if(oldest!==void 0&&oldest!==sessionID)map3.delete(oldest)}}function clearCriticalShownIds(sessionID){return swarmState.currentCriticalShownIds.delete(sessionID)}function buildGateDenialDirectiveKey(ids){return[...ids].sort().join(",")}function incrementGateDenialCount(sessionID,directiveKey){let map3=swarmState.gateDenialCounts,existing=map3.get(sessionID),count=existing&&existing.directiveKey===directiveKey?existing.count+1:1;if(map3.has(sessionID))map3.delete(sessionID);if(map3.set(sessionID,{count,directiveKey}),map3.size>MAX_TRACKED_GATE_DENIALS){let oldest=map3.keys().next().value;if(oldest!==void 0&&oldest!==sessionID)map3.delete(oldest)}return count}function clearGateDenialCount(sessionID){swarmState.gateDenialCounts.delete(sessionID)}function addKnowledgeAckDedup(key2){let set3=swarmState.knowledgeAckDedup;if(set3.has(key2))return;if(set3.add(key2),set3.size>MAX_TRACKED_KNOWLEDGE_ACKS){let oldest=set3.values().next().value;if(oldest!==void 0)set3.delete(oldest)}}async function rehydratePrSubscriptions(sessionID,directory){let map3=new Map;try{let{listActive:listActive2}=await Promise.resolve().then(() => (init_pr_subscriptions(),exports_pr_subscriptions)),records=await listActive2(directory);for(let record3 of records){if(record3.sessionID!==sessionID)continue;let key2=`${record3.repoFullName}::${record3.prNumber}`;map3.set(key2,{prNumber:record3.prNumber,repoFullName:record3.repoFullName,prUrl:record3.prUrl,lastKnownStatus:record3.mergeableState??"unknown",lastPollTime:record3.lastCheckedAt,errorCount:record3.errorCount,isWatching:record3.isWatching})}}catch(err){warn(`[state] rehydratePrSubscriptions failed for session ${sessionID}: ${err instanceof Error?err.message:String(err)}`)}return map3}var _councilDisagreementWarned,MAX_TRACKED_TASK_FILE_ATTRIBUTIONS=128,LINEAR_STATE_ORDER,_toolAggregates,defaultRunContext,_runContexts,swarmState,STALE_SESSION_TTL_MS=7200000,MAX_REVIEWER_SCOPE_GENERATION_FILES=256,MAX_REVIEWER_SCOPE_GENERATIONS=256,MAX_REVIEWER_SCOPE_OWNERSHIP_HISTORY=256,REVIEWER_SCOPE_GENERATION_TTL_MS,MAX_TRACKED_DISPATCH_PARENTS=200,PENDING_DISPATCH_AUTHORIZATION_TTL_MS=600000,IDLE_SWEEP_COOLDOWN_MS=60000,_lastIdleSweepAtMs=0,MAX_TRACKED_BUDGET_SESSIONS=500,MAX_TRACKED_CRITICAL_SHOWN=500,MAX_TRACKED_KNOWLEDGE_ACKS=5000,MAX_TRACKED_GATE_DENIALS=500,MAX_TRACKED_CONTEXT_WINDOWS=500,_internals86;var init_state2=__esm(()=>{init_constants();init_loader();init_plan_schema();init_schema();init_council_review_identity();init_qa_gate_profile();init_qa_gate_session_override();init_action_circuit();init_gate_evidence();init_delegation_gate();init_realtime_learning_nudge();init_trajectory_step_state();init_candidate_queue();init_prm_pattern_support();init_task_model_routing();init_manager();init_utils3();init_trajectory_store();init_scope_binding();init_scope_persistence();init_injection_budget();init_hydration_ownership();init_session_start_store();init_snapshot_store();init_worktree_link_suggestion();init_telemetry();init_logger();init_path();_councilDisagreementWarned=new Set,LINEAR_STATE_ORDER=["idle","coder_delegated","pre_check_passed","reviewer_run","tests_run","complete"];_toolAggregates=new Map,defaultRunContext=new AgentRunContext("default",_toolAggregates),_runContexts=new Map;swarmState={activeToolCalls:defaultRunContext.activeToolCalls,toolAggregates:defaultRunContext.toolAggregates,activeAgent:defaultRunContext.activeAgent,delegationChains:defaultRunContext.delegationChains,pendingEvents:0,opencodeClient:null,curatorInitAgentNames:[],curatorPhaseAgentNames:[],curatorPostmortemAgentNames:[],curatorConsolidationAgentNames:[],skillImproverAgentNames:[],specWriterAgentNames:[],currentCriticalShownIds:new Map,knowledgeAckDedup:new Set,gateDenialCounts:new Map,generatedAgentNames:[],lastBudgetBySession:new Map,finalPromptPressureBySession:new Map,finalAccountingWarningBandsBySession:new Map,liveContextWindows:new Map,dispatchParentByChildSession:new Map,pendingDispatchAuthorizations:[],agentSessions:defaultRunContext.agentSessions,pendingRehydrations:new Set,fullAutoEnabledInConfig:!1,environmentProfiles:defaultRunContext.environmentProfiles};REVIEWER_SCOPE_GENERATION_TTL_MS=STALE_SESSION_TTL_MS;_internals86={swarmState,resetSwarmState,ensureAgentSession,startAgentSession,loadPluginConfigWithMeta,resolveInitialTurboMode,getAgentSession,beginInvocation,getActiveWindow,advanceTaskState,getTaskState,hasActiveFullAuto,hasActiveTurboMode,hasActiveLeanTurbo,hasActiveEpicMode,buildRehydrationCache,applyRehydrationCache,rehydrateSessionFromDisk,rehydratePrSubscriptions,isCouncilGateActive,defaultRunContext}});async function boundedSessionCall(call,timeoutMs,timeoutLabel,failureLabel,sessionId){let timer;try{await Promise.race([call(),new Promise((_resolve,reject)=>{timer=setTimeout(()=>reject(Error(`${timeoutLabel} after ${timeoutMs}ms`)),Math.max(1,timeoutMs))})])}catch(error93){_internals87.log(`${failureLabel} for ephemeral session`,{sessionId,error:error93 instanceof Error?error93.message:String(error93)})}finally{if(timer)clearTimeout(timer)}}async function boundedAbortEphemeralSession(session,sessionId,timeoutMs=DEFAULT_EPHEMERAL_ABORT_TIMEOUT_MS){if(typeof session.abort!=="function")return;await _internals87.boundedSessionCall(()=>session.abort({path:{id:sessionId}}),timeoutMs,"ephemeral session abort timed out","ephemeral session abort failed",sessionId)}async function boundedDeleteEphemeralSession(session,sessionId,timeoutMs=DEFAULT_EPHEMERAL_TEARDOWN_DELETE_TIMEOUT_MS){await _internals87.boundedSessionCall(()=>session.delete({path:{id:sessionId}}),timeoutMs,"ephemeral session delete timed out","ephemeral session delete failed",sessionId)}async function teardownEphemeralSession(session,sessionId,options={}){let abortTimeoutMs=options.abortTimeoutMs??DEFAULT_EPHEMERAL_ABORT_TIMEOUT_MS,deleteTimeoutMs=options.deleteTimeoutMs??DEFAULT_EPHEMERAL_TEARDOWN_DELETE_TIMEOUT_MS;if(!(options.skipAbort??!1))await _internals87.boundedAbort(session,sessionId,abortTimeoutMs);await _internals87.boundedDelete(session,sessionId,deleteTimeoutMs)}async function sessionExists(session,sessionId,verifyTimeoutMs){if(typeof session.get!=="function")return!0;try{let body=(await withTimeout(session.get({path:{id:sessionId}}),verifyTimeoutMs,Error(`ephemeral session verify timed out after ${verifyTimeoutMs}ms`)))?.data;if(body===void 0||body===null)return!1;return!0}catch{return!1}}async function teardownEphemeralSessionVerified(session,sessionId,options={}){let verifyTimeoutMs=options.verifyTimeoutMs??DEFAULT_EPHEMERAL_VERIFY_TIMEOUT_MS,attempts=Math.min(6,Math.max(2,options.maxDeleteAttempts??DEFAULT_EPHEMERAL_MAX_DELETE_ATTEMPTS));if(typeof session.get!=="function")return await teardownEphemeralSession(session,sessionId,options),{ok:!1,sessionId,attempts:1,kind:"ephemeral-session-teardown-unverified",reason:"get-unavailable"};let deleteAttempts=0;for(;;){if(await teardownEphemeralSession(session,sessionId,{...options,skipAbort:deleteAttempts>0?!0:options.skipAbort}),deleteAttempts+=1,!await _internals87.sessionExists(session,sessionId,verifyTimeoutMs))return{ok:!0,sessionId,attempts:deleteAttempts};if(deleteAttempts>=attempts)return{ok:!1,sessionId,attempts:deleteAttempts,kind:"ephemeral-session-teardown-unverified",reason:"session-survived-bounded-retries"}}}var DEFAULT_EPHEMERAL_ABORT_TIMEOUT_MS=5000,DEFAULT_EPHEMERAL_TEARDOWN_DELETE_TIMEOUT_MS=2000,DEFAULT_EPHEMERAL_VERIFY_TIMEOUT_MS=2000,DEFAULT_EPHEMERAL_MAX_DELETE_ATTEMPTS=3,_internals87;var init_ephemeral_session_teardown=__esm(()=>{init_logger();init_timeout();_internals87={boundedSessionCall,boundedAbort:boundedAbortEphemeralSession,boundedDelete:boundedDeleteEphemeralSession,sessionExists,log}});var init_worktree=__esm(()=>{init_core3();init_merge2()});function verifyReviewerScopeGenerationMergeBack(input){try{let generation=getReviewerScopeGenerationForCoderCall({parentSessionID:input.parentSessionID,taskId:input.taskId,coderCallID:input.coderCallID,now:input.now});if(!generation||generation.modifiedFiles.length===0)return;if(generation.status!=="collecting"&&generation.status!=="mergeback_pending")return;if(generation.status==="collecting"){if(!markReviewerScopeGenerationMergebackPending({parentSessionID:input.parentSessionID,taskId:input.taskId,coderCallID:input.coderCallID,at:input.now}))return}let session=ensureAgentSession(input.parentSessionID),deadlineAt=(input.now??Date.now())+REVIEWER_SCOPE_CAPTURE_BATCH_DEADLINE_MS;for(let file3 of generation.modifiedFiles){let stored=generation.modifiedFileFingerprints.find((entry)=>entry.file===file3);if(!stored){settleReviewerScopeMergeback({parentSessionID:input.parentSessionID,taskId:input.taskId,coderCallID:input.coderCallID,outcome:{verified:!1,reason:`incomplete fingerprints: ${file3} has no stored capture`,at:input.now}}),pushAdvisory(session,`REVIEWER_SCOPE_MERGEBACK_MISMATCH: task ${input.taskId}: merge-back verification found no stored fingerprint for ${file3}. ACTION[architect]: re-dispatch the coder for this task`);return}let captured=captureReviewerScopeFileFingerprint(input.primaryDirectory,file3,{deadlineAt});if(captured.kind==="capture_failed"){settleReviewerScopeMergeback({parentSessionID:input.parentSessionID,taskId:input.taskId,coderCallID:input.coderCallID,outcome:{verified:!1,reason:`capture ${captured.code} on ${captured.file}`,at:input.now}}),pushAdvisory(session,`REVIEWER_SCOPE_MERGEBACK_MISMATCH: task ${input.taskId}: primary-checkout capture failed for ${captured.file} (${captured.code}). ACTION[architect]: verify the primary checkout, then re-dispatch the reviewer`);return}let capturedFingerprint=reviewerScopeCaptureToFingerprint(captured);if(!capturedFingerprint||!reviewerScopeFileFingerprintsEqual(stored,capturedFingerprint)){settleReviewerScopeMergeback({parentSessionID:input.parentSessionID,taskId:input.taskId,coderCallID:input.coderCallID,outcome:{verified:!1,reason:`primary bytes differ from lane manifest on ${file3}`,at:input.now}}),pushAdvisory(session,`REVIEWER_SCOPE_MERGEBACK_MISMATCH: task ${input.taskId}: primary-checkout bytes differ from the lane manifest on ${file3}; lane evidence retained. ACTION[architect]: resolve the merge conflict or re-dispatch the coder`);return}}let primaryIdentity=canonicalWorkspaceIdentity(input.primaryDirectory);settleReviewerScopeMergeback({parentSessionID:input.parentSessionID,taskId:input.taskId,coderCallID:input.coderCallID,outcome:{verified:!0,primaryWorkspaceIdentity:primaryIdentity??input.primaryDirectory,primaryDirectory:input.primaryDirectory,at:input.now}}),pushAdvisory(session,`REVIEWER_SCOPE_MERGEBACK_VERIFIED: task ${input.taskId}: primary checkout matches the lane manifest exactly; reviewer dispatch is enabled`)}catch(error93){try{let session=ensureAgentSession(input.parentSessionID);pushAdvisory(session,`REVIEWER_SCOPE_MERGEBACK_MISMATCH: task ${input.taskId}: merge-back verification errored (${String(error93).slice(0,200)}). ACTION[architect]: re-dispatch the reviewer to retry verification`),settleReviewerScopeMergeback({parentSessionID:input.parentSessionID,taskId:input.taskId,coderCallID:input.coderCallID,outcome:{verified:!1,reason:"verification error",at:input.now}})}catch{}}}var init_reviewer_scope_mergeback=__esm(()=>{init_scope_binding();init_state2();init_reviewer_scope_file_fingerprint()});import{createHash as createHash45,randomBytes as randomBytes7}from"node:crypto";import*as fs63 from"node:fs";import*as path101 from"node:path";function nowMs2(input){return input??Date.now()}function sha2565(input){return createHash45("sha256").update(input).digest("hex")}function storePath4(directory){return path101.join(directory,STORE_RELATIVE_PATH)}function journalPath2(directory){return path101.join(directory,JOURNAL_RELATIVE_PATH)}function credentialPath(directory,authorityDigest){return path101.join(directory,CREDENTIAL_DIRECTORY,`${authorityDigest}.json`)}function readAuthorityLockRecord(lockPath){try{let parsed=JSON.parse(fs63.readFileSync(lockPath,"utf8"));if(typeof parsed?.nonce==="string"&&typeof parsed?.acquiredAt==="number"&&Number.isFinite(parsed.acquiredAt)&&typeof parsed?.pid==="number"&&Number.isInteger(parsed.pid))return{nonce:parsed.nonce,acquiredAt:parsed.acquiredAt,pid:parsed.pid}}catch{}return}function writeAuthorityLockRecord(lockPath,record3){try{return fs63.writeFileSync(lockPath,JSON.stringify(record3,null,2),{flag:"wx"}),!0}catch{return!1}}function isProcessAlive2(pid){if(!Number.isSafeInteger(pid)||pid<=0)return!1;try{return process.kill(pid,0),!0}catch{return!1}}function acquireAuthorityLock(directory){let lockPath=path101.join(directory,AUTHORITY_LOCK_RELATIVE_PATH);fs63.mkdirSync(path101.dirname(lockPath),{recursive:!0});let nonce=randomBytes7(16).toString("hex"),acquiredAt=Date.now(),attempt=()=>writeAuthorityLockRecord(lockPath,{nonce,acquiredAt,pid:process.pid});if(!attempt())try{let observed=readAuthorityLockRecord(lockPath);if(!observed)return;if(Date.now()-fs63.statSync(lockPath).mtimeMs>AUTHORITY_LOCK_STALE_MS){if(isProcessAlive2(observed.pid))return;let reread=readAuthorityLockRecord(lockPath);if(reread&&reread.nonce===observed.nonce&&reread.acquiredAt===observed.acquiredAt&&reread.pid===observed.pid){if(fs63.unlinkSync(lockPath),!attempt())return}}}catch{return}let acquired=readAuthorityLockRecord(lockPath);if(!acquired||acquired.nonce!==nonce)return;let released=!1;return()=>{if(released)return;released=!0;try{if(readAuthorityLockRecord(lockPath)?.nonce===nonce)fs63.unlinkSync(lockPath)}catch{}}}function taskKey(parentSessionId,taskId){return`${parentSessionId}::${taskId}`}function stableStringify(value){if(Array.isArray(value))return`[${value.map((item)=>stableStringify(item)).join(",")}]`;if(value&&typeof value==="object")return`{${Object.entries(value).sort(([left],[right])=>left.localeCompare(right)).map(([key2,item])=>`${JSON.stringify(key2)}:${stableStringify(item)}`).join(",")}}`;return JSON.stringify(value)}function digestAuthorityIdentity(input){return sha2565(stableStringify({originalCallID:input.originalCallID,parentSessionId:input.parentSessionId,taskId:input.taskId,reservationId:input.reservationId,generation:input.generation,canonicalBranch:input.canonicalBranch,canonicalPath:input.canonicalPath,laneBranch:input.laneBranch,lanePath:input.lanePath,expectedPrimaryHead:input.expectedPrimaryHead,sourceBaseOid:input.sourceBaseOid,sourceHeadOid:input.sourceHeadOid,targetHeadOid:input.targetHeadOid,strategy:input.strategy,declaredConflictFiles:input.declaredConflictFiles??[]}))}function nonEmpty(value){return typeof value==="string"&&value.length>0&&value.length<=4096}function isHex40(value){return typeof value==="string"&&HEX_40_RE.test(value)}function isOidArray(value){return Array.isArray(value)&&value.length<=4096&&value.every(isHex40)}function isSettlementEvidence(value){if(!value||typeof value!=="object"||Array.isArray(value))return!1;let candidate=value;return isOidArray(candidate.sourceCommitOrder)&&isOidArray(candidate.rewrittenCommitOrder)&&candidate.sourceCommitOrder.length===candidate.rewrittenCommitOrder.length}function isStrategy(value){return value==="merge"||value==="rebase"||value==="cherry-pick"}function isImmutableIdentity(value){if(!value||typeof value!=="object"||Array.isArray(value))return!1;let candidate=value;return nonEmpty(candidate.originalCallID)&&nonEmpty(candidate.parentSessionId)&&nonEmpty(candidate.taskId)&&nonEmpty(candidate.reservationId)&&typeof candidate.generation==="number"&&Number.isInteger(candidate.generation)&&candidate.generation>0&&nonEmpty(candidate.canonicalBranch)&&nonEmpty(candidate.canonicalPath)&&nonEmpty(candidate.laneBranch)&&nonEmpty(candidate.lanePath)&&isHex40(candidate.expectedPrimaryHead)&&isHex40(candidate.sourceBaseOid)&&isHex40(candidate.sourceHeadOid)&&isHex40(candidate.targetHeadOid)&&isStrategy(candidate.strategy)&&(candidate.declaredConflictFiles===void 0||Array.isArray(candidate.declaredConflictFiles)&&candidate.declaredConflictFiles.every((item)=>nonEmpty(item)))&&typeof candidate.createdAt==="number"&&Number.isFinite(candidate.createdAt)&&candidate.createdAt>=0}function isClaimState(value){if(!value||typeof value!=="object"||Array.isArray(value))return!1;let candidate=value;return nonEmpty(candidate.claimantCallID)&&nonEmpty(candidate.claimantSessionId)&&nonEmpty(candidate.childSessionId)&&typeof candidate.claimRevision==="number"&&Number.isInteger(candidate.claimRevision)&&candidate.claimRevision>0&&typeof candidate.attempt==="number"&&Number.isInteger(candidate.attempt)&&candidate.attempt>0&&typeof candidate.leaseExpiresAt==="number"&&Number.isFinite(candidate.leaseExpiresAt)&&candidate.leaseExpiresAt>=0&&nonEmpty(candidate.claimTokenDigest)&&typeof candidate.claimedAt==="number"&&Number.isFinite(candidate.claimedAt)&&candidate.claimedAt>=0}function isAuthority(value){if(!value||typeof value!=="object"||Array.isArray(value))return!1;let candidate=value,claimCursor=candidate.claimCursor&&typeof candidate.claimCursor==="object"?candidate.claimCursor:void 0,validStatus=candidate.status==="preserved"||candidate.status==="claimed"||candidate.status==="released"||candidate.status==="finalized";return candidate.schemaVersion===2&&nonEmpty(candidate.authorityDigest)&&isImmutableIdentity(candidate.immutable)&&validStatus&&(candidate.claim===void 0||isClaimState(candidate.claim))&&(claimCursor===void 0||typeof claimCursor.lastClaimRevision==="number"&&Number.isInteger(claimCursor.lastClaimRevision)&&claimCursor.lastClaimRevision>0&&typeof claimCursor.lastAttempt==="number"&&Number.isInteger(claimCursor.lastAttempt)&&claimCursor.lastAttempt>0)&&(candidate.status!=="claimed"||candidate.claim!==void 0)&&(candidate.finalizedAt===void 0||typeof candidate.finalizedAt==="number"&&Number.isFinite(candidate.finalizedAt)&&candidate.finalizedAt>=0)&&(candidate.settlement===void 0||isSettlementEvidence(candidate.settlement))}function isJournalEntry(value){if(!value||typeof value!=="object"||Array.isArray(value))return!1;let candidate=value,validState=candidate.state==="PREPARED"||candidate.state==="COMMITTED"||candidate.state==="CLAIM_RENEWED"||candidate.state==="ABORTED"||candidate.state==="RELEASED"||candidate.state==="FINALIZED";return candidate.schemaVersion===1&&nonEmpty(candidate.authorityDigest)&&validState&&nonEmpty(candidate.claimantCallID)&&nonEmpty(candidate.claimantSessionId)&&(candidate.childSessionId===void 0||nonEmpty(candidate.childSessionId))&&typeof candidate.claimRevision==="number"&&Number.isInteger(candidate.claimRevision)&&candidate.claimRevision>0&&typeof candidate.attempt==="number"&&Number.isInteger(candidate.attempt)&&candidate.attempt>0&&typeof candidate.leaseExpiresAt==="number"&&Number.isFinite(candidate.leaseExpiresAt)&&candidate.leaseExpiresAt>=0&&nonEmpty(candidate.claimTokenDigest)&&typeof candidate.preparedAt==="number"&&Number.isFinite(candidate.preparedAt)&&candidate.preparedAt>=0&&(candidate.credentialInstalledAt===void 0||typeof candidate.credentialInstalledAt==="number"&&Number.isFinite(candidate.credentialInstalledAt)&&candidate.credentialInstalledAt>=0)&&(candidate.committedAt===void 0||typeof candidate.committedAt==="number"&&Number.isFinite(candidate.committedAt)&&candidate.committedAt>=0)&&(candidate.abortedAt===void 0||typeof candidate.abortedAt==="number"&&Number.isFinite(candidate.abortedAt)&&candidate.abortedAt>=0)&&(candidate.reason===void 0||nonEmpty(candidate.reason))}function isCredential(value){if(!value||typeof value!=="object"||Array.isArray(value))return!1;let candidate=value;return candidate.schemaVersion===1&&nonEmpty(candidate.authorityDigest)&&nonEmpty(candidate.claimantCallID)&&nonEmpty(candidate.claimantSessionId)&&nonEmpty(candidate.childSessionId)&&typeof candidate.claimRevision==="number"&&Number.isInteger(candidate.claimRevision)&&candidate.claimRevision>0&&nonEmpty(candidate.rawToken)&&typeof candidate.leaseExpiresAt==="number"&&Number.isFinite(candidate.leaseExpiresAt)&&candidate.leaseExpiresAt>=0&&typeof candidate.createdAt==="number"&&Number.isFinite(candidate.createdAt)&&candidate.createdAt>=0}function rebuildIndex(authorities){let bySessionTask={};for(let authority of[...authorities].sort((left,right)=>right.immutable.generation-left.immutable.generation||right.immutable.createdAt-left.immutable.createdAt)){let key2=taskKey(authority.immutable.parentSessionId,authority.immutable.taskId),digests=bySessionTask[key2]??[];digests.push(authority.authorityDigest),bySessionTask[key2]=digests}return{bySessionTask}}function emptyJournal(){return{schemaVersion:1,entries:[]}}function readBoundedJsonFile2(filePath,maxBytes){try{if(fs63.statSync(filePath).size>maxBytes)return{ok:!1,reason:`${path101.basename(filePath)} exceeds the ${maxBytes}-byte safety bound`};let raw=fs63.readFileSync(filePath,"utf8");if(Buffer.byteLength(raw,"utf8")>maxBytes)return{ok:!1,reason:`${path101.basename(filePath)} changed beyond the ${maxBytes}-byte safety bound`};return{ok:!0,value:JSON.parse(raw)}}catch(error93){if(error93.code==="ENOENT")return{ok:!0,value:void 0};return{ok:!1,reason:`${path101.basename(filePath)} is unreadable or malformed: ${error93 instanceof Error?error93.message:String(error93)}`}}}function loadStoreStrict(directory){let loaded=readBoundedJsonFile2(storePath4(directory),MAX_STORE_BYTES);if(!loaded.ok)return{status:"uncertain",reason:loaded.reason};if(loaded.value===void 0)return{status:"ok",authorities:[]};let parsed=loaded.value;if(parsed.schemaVersion===1)return{status:"unsupported-legacy",reason:"worktree recovery v1 records are unsupported for claim mutation"};if(parsed.schemaVersion!==2)return{status:"uncertain",reason:`unknown worktree recovery schema version: ${String(parsed.schemaVersion)}`};if(!Array.isArray(parsed.authorities))return{status:"uncertain",reason:"worktree recovery store does not contain an authorities array"};if(parsed.authorities.length>MAX_STORE_AUTHORITIES)return{status:"uncertain",reason:`worktree recovery authority count exceeds the ${MAX_STORE_AUTHORITIES}-record safety bound`};for(let authority of parsed.authorities)if(!isAuthority(authority))return{status:"uncertain",reason:"worktree recovery store contains an invalid authority record"};return{status:"ok",authorities:[...parsed.authorities]}}function loadStoreWritable(directory){let scanned=loadStoreStrict(directory);if(scanned.status==="unsupported-legacy")return{ok:!1,code:"unsupported_legacy",reason:scanned.reason};if(scanned.status==="uncertain")return{ok:!1,code:"uncertain_store",reason:scanned.reason};return{schemaVersion:2,authorities:scanned.authorities,index:rebuildIndex(scanned.authorities)}}function loadJournal(directory){let loaded=readBoundedJsonFile2(journalPath2(directory),MAX_JOURNAL_BYTES2);if(!loaded.ok||loaded.value===void 0)return emptyJournal();let parsed=loaded.value;if(parsed.schemaVersion!==1||!Array.isArray(parsed.entries))return emptyJournal();let entries=[];for(let entry of parsed.entries)if(isJournalEntry(entry))entries.push(entry);return{schemaVersion:1,entries:entries.slice(-MAX_JOURNAL_ENTRIES)}}function updateStore(store,authorities){return store.authorities=authorities,store.index=rebuildIndex(authorities),store}function currentClaimMatches(authority,request){if(!authority.claim)return!1;return authority.claim.claimantCallID===request.claimantCallID&&authority.claim.claimRevision===request.claimRevision&&authority.claim.claimTokenDigest===sha2565(request.rawToken)}function latestJournalEntriesByAuthority(journal){let latest=new Map;for(let entry of journal.entries)latest.set(entry.authorityDigest,entry);return[...latest.values()]}function recordJournalEntry(directory,entry){let journal=loadJournal(directory);if(journal.entries.push(entry),journal.entries.length>MAX_JOURNAL_ENTRIES)journal.entries=journal.entries.slice(-MAX_JOURNAL_ENTRIES);return _internals88.writeClaimJournal(journalPath2(directory),journal),journal}function writeCredential(directory,credential){let targetPath=credentialPath(directory,credential.authorityDigest);_internals88.writeCredentialFile(targetPath,credential);try{fs63.chmodSync(targetPath,384)}catch{}return targetPath}function readCredential(directory,authorityDigest){let loaded=readBoundedJsonFile2(credentialPath(directory,authorityDigest),MAX_CREDENTIAL_BYTES);if(!loaded.ok||loaded.value===void 0)return;return isCredential(loaded.value)?loaded.value:void 0}function removeCredentialIfMatch(directory,entry){let credential=readCredential(directory,entry.authorityDigest);if(credential&&credential.claimRevision===entry.claimRevision&&credential.claimantCallID===entry.claimantCallID)try{fs63.unlinkSync(credentialPath(directory,entry.authorityDigest))}catch{}}function baseMutationFailure(code,reason){return{ok:!1,code,reason}}function publishWorktreeRecoveryAuthorityUnlocked(directory,input){let store=loadStoreWritable(directory);if("ok"in store)return store;let immutable={...input,createdAt:nowMs2()};if(!isImmutableIdentity(immutable))return baseMutationFailure("uncertain_store","invalid immutable recovery authority input");let authorityDigest=digestAuthorityIdentity(input),existing=store.authorities.find((authority2)=>authority2.authorityDigest===authorityDigest);if(existing)return{ok:!0,authority:existing};let authority={schemaVersion:2,authorityDigest,immutable,status:"preserved"},nextAuthorities=[...store.authorities,authority];if(nextAuthorities.length>MAX_STORE_AUTHORITIES)return baseMutationFailure("uncertain_store",`worktree recovery authority count exceeds the ${MAX_STORE_AUTHORITIES}-record safety bound`);return _internals88.writeRecoveryStore(storePath4(directory),updateStore(store,nextAuthorities),"publish"),{ok:!0,authority}}function publishWorktreeRecoveryAuthority(directory,input){let release=acquireAuthorityLock(directory);if(!release)return baseMutationFailure("busy","worktree recovery authority store is locked");try{return publishWorktreeRecoveryAuthorityUnlocked(directory,input)}finally{release()}}function scanWorktreeRecoveryAuthoritiesForRecovery(directory){return loadStoreStrict(directory)}function lookupWorktreeRecoveryAuthoritiesByTask(directory,query){let scanned=loadStoreStrict(directory);if(scanned.status!=="ok")return scanned;return{status:"ok",authorities:scanned.authorities.filter((authority)=>authority.immutable.parentSessionId===query.parentSessionId&&authority.immutable.taskId===query.taskId).sort((left,right)=>right.immutable.generation-left.immutable.generation||right.immutable.createdAt-left.immutable.createdAt)}}async function claimWorktreeRecoveryAuthorityUnlocked(directory,request){let store=loadStoreWritable(directory);if("ok"in store)return store;let authorityIndex=store.authorities.findIndex((authority2)=>authority2.authorityDigest===request.authorityDigest);if(authorityIndex===-1)return baseMutationFailure("not_found","worktree recovery authority not found");let authority=store.authorities[authorityIndex];if(authority.status==="finalized")return baseMutationFailure("finalized","finalized worktree recovery authority cannot be claimed again");let currentTime=nowMs2(request.now),previousClaim=authority.claim;if(previousClaim&&previousClaim.leaseExpiresAt>currentTime)return baseMutationFailure("busy","worktree recovery authority is already claimed");if(previousClaim&&previousClaim.leaseExpiresAt<=currentTime){if(!request.revalidateExpiredClaim)return baseMutationFailure("revalidation_required","expired worktree recovery claims require full revalidation before transfer");let verdict=await request.revalidateExpiredClaim({authority,previousClaim});if(!verdict.ok)return baseMutationFailure("revalidation_failed",verdict.reason)}let nextAttempt=(previousClaim?.attempt??authority.claimCursor?.lastAttempt??0)+1,maxAttempts=request.maxAttempts??DEFAULT_MAX_ATTEMPTS;if(nextAttempt>maxAttempts)return baseMutationFailure("retry_cap_exceeded",`worktree recovery claim attempt ${nextAttempt} exceeds the ${maxAttempts}-attempt safety cap`);let nextRevision=(previousClaim?.claimRevision??authority.claimCursor?.lastClaimRevision??0)+1,rawToken=_internals88.generateRawToken(),claimTokenDigest=sha2565(rawToken);recordJournalEntry(directory,{schemaVersion:1,authorityDigest:authority.authorityDigest,state:"PREPARED",claimantCallID:request.claimantCallID,claimantSessionId:request.claimantSessionId,claimRevision:nextRevision,attempt:nextAttempt,leaseExpiresAt:currentTime+request.leaseMs,claimTokenDigest,preparedAt:currentTime});let childSessionId=await request.createChildSession(),refreshedStore=loadStoreWritable(directory);if("ok"in refreshedStore)throw Error(`worktree recovery authority could not be revalidated: ${refreshedStore.reason}`);let refreshedAuthority=refreshedStore.authorities.find((candidate)=>candidate.authorityDigest===request.authorityDigest);if(!refreshedAuthority||stableStringify({status:refreshedAuthority.status,claim:refreshedAuthority.claim,claimCursor:refreshedAuthority.claimCursor,immutable:refreshedAuthority.immutable})!==stableStringify({status:authority.status,claim:authority.claim,claimCursor:authority.claimCursor,immutable:authority.immutable}))throw recordJournalEntry(directory,{schemaVersion:1,authorityDigest:authority.authorityDigest,state:"ABORTED",claimantCallID:request.claimantCallID,claimantSessionId:request.claimantSessionId,childSessionId,claimRevision:nextRevision,attempt:nextAttempt,leaseExpiresAt:currentTime+request.leaseMs,claimTokenDigest,preparedAt:currentTime,abortedAt:nowMs2(),reason:"authority changed while child session was being created"}),Error("worktree recovery authority changed while child session was being created");recordJournalEntry(directory,{schemaVersion:1,authorityDigest:authority.authorityDigest,state:"PREPARED",claimantCallID:request.claimantCallID,claimantSessionId:request.claimantSessionId,childSessionId,claimRevision:nextRevision,attempt:nextAttempt,leaseExpiresAt:currentTime+request.leaseMs,claimTokenDigest,preparedAt:currentTime});let credential={schemaVersion:1,authorityDigest:authority.authorityDigest,claimantCallID:request.claimantCallID,claimantSessionId:request.claimantSessionId,childSessionId,claimRevision:nextRevision,rawToken,leaseExpiresAt:currentTime+request.leaseMs,createdAt:currentTime},writtenCredentialPath=writeCredential(directory,credential);recordJournalEntry(directory,{schemaVersion:1,authorityDigest:authority.authorityDigest,state:"PREPARED",claimantCallID:request.claimantCallID,claimantSessionId:request.claimantSessionId,childSessionId,claimRevision:nextRevision,attempt:nextAttempt,leaseExpiresAt:currentTime+request.leaseMs,claimTokenDigest,preparedAt:currentTime,credentialInstalledAt:currentTime});let claimedAuthority={...authority,status:"claimed",claim:{claimantCallID:request.claimantCallID,claimantSessionId:request.claimantSessionId,childSessionId,claimRevision:nextRevision,attempt:nextAttempt,leaseExpiresAt:currentTime+request.leaseMs,claimTokenDigest,claimedAt:currentTime},claimCursor:{lastClaimRevision:nextRevision,lastAttempt:nextAttempt}},nextAuthorities=[...store.authorities];return nextAuthorities[authorityIndex]=claimedAuthority,_internals88.writeRecoveryStore(storePath4(directory),updateStore(store,nextAuthorities),"claim-commit"),recordJournalEntry(directory,{schemaVersion:1,authorityDigest:authority.authorityDigest,state:"COMMITTED",claimantCallID:request.claimantCallID,claimantSessionId:request.claimantSessionId,childSessionId,claimRevision:nextRevision,attempt:nextAttempt,leaseExpiresAt:currentTime+request.leaseMs,claimTokenDigest,preparedAt:currentTime,credentialInstalledAt:currentTime,committedAt:currentTime}),{ok:!0,authority:claimedAuthority,rawToken,credentialPath:writtenCredentialPath}}async function claimWorktreeRecoveryAuthority(directory,request){let release=acquireAuthorityLock(directory);if(!release)return baseMutationFailure("busy","worktree recovery authority store is locked");try{return await claimWorktreeRecoveryAuthorityUnlocked(directory,request)}finally{release()}}function renewWorktreeRecoveryClaimUnlocked(directory,request){let store=loadStoreWritable(directory);if("ok"in store)return store;let index=store.authorities.findIndex((authority2)=>authority2.authorityDigest===request.authorityDigest);if(index===-1)return baseMutationFailure("not_found","worktree recovery authority not found");let authority=store.authorities[index];if(!currentClaimMatches(authority,request))return baseMutationFailure("stale_claim","worktree recovery claim is stale or does not match the current claimant");let renewed={...authority,claim:{...authority.claim,leaseExpiresAt:nowMs2(request.now)+request.leaseMs}},nextAuthorities=[...store.authorities];return nextAuthorities[index]=renewed,_internals88.writeRecoveryStore(storePath4(directory),updateStore(store,nextAuthorities),"claim-renew"),writeCredential(directory,{schemaVersion:1,authorityDigest:renewed.authorityDigest,claimantCallID:renewed.claim.claimantCallID,claimantSessionId:renewed.claim.claimantSessionId,childSessionId:renewed.claim.childSessionId,claimRevision:renewed.claim.claimRevision,rawToken:request.rawToken,leaseExpiresAt:renewed.claim.leaseExpiresAt,createdAt:renewed.claim.claimedAt}),recordJournalEntry(directory,{schemaVersion:1,authorityDigest:renewed.authorityDigest,state:"CLAIM_RENEWED",claimantCallID:renewed.claim.claimantCallID,claimantSessionId:renewed.claim.claimantSessionId,childSessionId:renewed.claim.childSessionId,claimRevision:renewed.claim.claimRevision,attempt:renewed.claim.attempt,leaseExpiresAt:renewed.claim.leaseExpiresAt,claimTokenDigest:renewed.claim.claimTokenDigest,preparedAt:renewed.claim.claimedAt,committedAt:nowMs2(request.now),reason:"claim lease renewed"}),{ok:!0,authority:renewed}}function renewWorktreeRecoveryClaim(directory,request){let release=acquireAuthorityLock(directory);if(!release)return baseMutationFailure("busy","worktree recovery authority store is locked");try{return renewWorktreeRecoveryClaimUnlocked(directory,request)}finally{release()}}function releaseWorktreeRecoveryClaimUnlocked(directory,request){let store=loadStoreWritable(directory);if("ok"in store)return store;let index=store.authorities.findIndex((authority2)=>authority2.authorityDigest===request.authorityDigest);if(index===-1)return baseMutationFailure("not_found","worktree recovery authority not found");let authority=store.authorities[index];if(!currentClaimMatches(authority,request))return baseMutationFailure("stale_claim","worktree recovery claim is stale or does not match the current claimant");let released={...authority,status:"preserved",claim:void 0,claimCursor:authority.claim?{lastClaimRevision:authority.claim.claimRevision,lastAttempt:authority.claim.attempt}:authority.claimCursor},nextAuthorities=[...store.authorities];return nextAuthorities[index]=released,_internals88.writeRecoveryStore(storePath4(directory),updateStore(store,nextAuthorities),"claim-release"),recordJournalEntry(directory,{schemaVersion:1,authorityDigest:authority.authorityDigest,state:"RELEASED",claimantCallID:authority.claim.claimantCallID,claimantSessionId:authority.claim.claimantSessionId,childSessionId:authority.claim.childSessionId,claimRevision:authority.claim.claimRevision,attempt:authority.claim.attempt,leaseExpiresAt:authority.claim.leaseExpiresAt,claimTokenDigest:authority.claim.claimTokenDigest,preparedAt:authority.claim.claimedAt,committedAt:nowMs2(request.now),reason:"claim released after preserved settlement"}),removeCredentialIfMatch(directory,request),{ok:!0,authority:released}}function releaseWorktreeRecoveryClaim(directory,request){let release=acquireAuthorityLock(directory);if(!release)return baseMutationFailure("busy","worktree recovery authority store is locked");try{return releaseWorktreeRecoveryClaimUnlocked(directory,request)}finally{release()}}function finalizeWorktreeRecoveryAuthorityUnlocked(directory,request){let store=loadStoreWritable(directory);if("ok"in store)return store;let index=store.authorities.findIndex((authority2)=>authority2.authorityDigest===request.authorityDigest);if(index===-1)return baseMutationFailure("not_found","worktree recovery authority not found");let authority=store.authorities[index];if(!currentClaimMatches(authority,request))return baseMutationFailure("stale_claim","worktree recovery claim is stale or does not match the current claimant");let finalized={...authority,status:"finalized",claim:void 0,claimCursor:authority.claim?{lastClaimRevision:authority.claim.claimRevision,lastAttempt:authority.claim.attempt}:authority.claimCursor,finalizedAt:nowMs2(request.now),settlement:request.settlement},nextAuthorities=[...store.authorities];return nextAuthorities[index]=finalized,_internals88.writeRecoveryStore(storePath4(directory),updateStore(store,nextAuthorities),"claim-finalize"),recordJournalEntry(directory,{schemaVersion:1,authorityDigest:authority.authorityDigest,state:"FINALIZED",claimantCallID:authority.claim.claimantCallID,claimantSessionId:authority.claim.claimantSessionId,childSessionId:authority.claim.childSessionId,claimRevision:authority.claim.claimRevision,attempt:authority.claim.attempt,leaseExpiresAt:authority.claim.leaseExpiresAt,claimTokenDigest:authority.claim.claimTokenDigest,preparedAt:authority.claim.claimedAt,committedAt:nowMs2(request.now),reason:"claim finalized after landed settlement"}),removeCredentialIfMatch(directory,request),{ok:!0,authority:finalized}}function finalizeWorktreeRecoveryAuthority(directory,request){let release=acquireAuthorityLock(directory);if(!release)return baseMutationFailure("busy","worktree recovery authority store is locked");try{return finalizeWorktreeRecoveryAuthorityUnlocked(directory,request)}finally{release()}}function replayWorktreeRecoveryClaimJournalUnlocked(directory,options){let outcomes=[],storeScan=loadStoreStrict(directory),authorities=new Map((storeScan.status==="ok"?storeScan.authorities:[]).map((authority)=>[authority.authorityDigest,authority]));for(let entry of latestJournalEntriesByAuthority(loadJournal(directory))){if(entry.state==="ABORTED"||entry.state==="CLAIM_RENEWED"||entry.state==="RELEASED"||entry.state==="FINALIZED"){outcomes.push({authorityDigest:entry.authorityDigest,outcome:"noop"});continue}if(entry.state==="COMMITTED"){let current2=authorities.get(entry.authorityDigest);if(current2&&!current2.claim&¤t2.claimCursor?.lastClaimRevision===entry.claimRevision&&(current2.status==="preserved"||current2.status==="finalized")){recordJournalEntry(directory,{...entry,state:current2.status==="finalized"?"FINALIZED":"RELEASED",reason:"repaired terminal claim journal after interrupted settlement"}),removeCredentialIfMatch(directory,entry),outcomes.push({authorityDigest:entry.authorityDigest,outcome:"repaired_terminal_claim"});continue}if(current2?.claim&¤t2.claim.claimRevision===entry.claimRevision&¤t2.claim.claimTokenDigest===entry.claimTokenDigest){let credential2=readCredential(directory,entry.authorityDigest),released=credential2?releaseWorktreeRecoveryClaimUnlocked(directory,{authorityDigest:entry.authorityDigest,claimantCallID:entry.claimantCallID,claimRevision:entry.claimRevision,rawToken:credential2.rawToken}):void 0;outcomes.push({authorityDigest:entry.authorityDigest,outcome:released?.ok?"released_orphaned_committed_claim":"uncertain_committed_without_authority"})}else outcomes.push({authorityDigest:entry.authorityDigest,outcome:"uncertain_committed_without_authority"});continue}let current=authorities.get(entry.authorityDigest);if(current?.claim&¤t.claim.claimRevision===entry.claimRevision&¤t.claim.claimTokenDigest===entry.claimTokenDigest){recordJournalEntry(directory,{...entry,state:"COMMITTED",committedAt:nowMs2()}),outcomes.push({authorityDigest:entry.authorityDigest,outcome:"committed_claim_stable"});continue}let credential=readCredential(directory,entry.authorityDigest);if(credential&&credential.claimRevision===entry.claimRevision&&credential.claimantCallID===entry.claimantCallID){removeCredentialIfMatch(directory,entry),recordJournalEntry(directory,{...entry,state:"ABORTED",abortedAt:nowMs2(),reason:"removed uncommitted credential during replay"}),options?.onAbortPreparedClaim?.(entry),outcomes.push({authorityDigest:entry.authorityDigest,outcome:"removed_uncommitted_credential"});continue}recordJournalEntry(directory,{...entry,state:"ABORTED",abortedAt:nowMs2(),reason:"prepared claim never reached credential install or commit"}),options?.onAbortPreparedClaim?.(entry),outcomes.push({authorityDigest:entry.authorityDigest,outcome:"aborted_prepared_claim"})}return outcomes}function replayWorktreeRecoveryClaimJournal(directory,options){let release=acquireAuthorityLock(directory);if(!release)throw Error("worktree recovery authority store is locked");try{return replayWorktreeRecoveryClaimJournalUnlocked(directory,options)}finally{release()}}var STORE_RELATIVE_PATH,JOURNAL_RELATIVE_PATH,CREDENTIAL_DIRECTORY,AUTHORITY_LOCK_RELATIVE_PATH,AUTHORITY_LOCK_STALE_MS=600000,MAX_STORE_BYTES=2097152,MAX_STORE_AUTHORITIES=512,MAX_JOURNAL_BYTES2=2097152,MAX_JOURNAL_ENTRIES=512,MAX_CREDENTIAL_BYTES=16384,DEFAULT_MAX_ATTEMPTS=8,HEX_40_RE,_internals88;var init_worktree_recovery_authority=__esm(()=>{init_atomic_write();STORE_RELATIVE_PATH=path101.join(".swarm","worktree-merge-recovery-v2.json"),JOURNAL_RELATIVE_PATH=path101.join(".swarm","worktree-merge-recovery-v2-journal.json"),CREDENTIAL_DIRECTORY=path101.join(".swarm","worktree-recovery-claims"),AUTHORITY_LOCK_RELATIVE_PATH=path101.join(".swarm","locks","worktree-recovery-authority.lock"),HEX_40_RE=/^[0-9a-f]{40}$/i;_internals88={generateRawToken:()=>randomBytes7(32).toString("hex"),writeRecoveryStore:(targetPath,store,_phase)=>{atomicWriteSwarmFileSync(targetPath,JSON.stringify(store,null,2))},writeClaimJournal:(targetPath,journal)=>{atomicWriteSwarmFileSync(targetPath,JSON.stringify(journal,null,2))},writeCredentialFile:(targetPath,credential)=>{atomicWriteSwarmFileSync(targetPath,JSON.stringify(credential,null,2),{mode:384})},getRecoveryStorePath:storePath4,getClaimJournalPath:journalPath2,getCredentialPath:credentialPath,acquireAuthorityLock,readClaimJournal(directory){return loadJournal(directory)},resetForTest(){}}});import*as fs64 from"node:fs";import*as path102 from"node:path";function decodeTagPart(value){if(!value||!/^[A-Za-z0-9_-]+$/.test(value))return null;let decoded=Buffer.from(value,"base64url").toString("utf8");return decoded&&Buffer.from(decoded,"utf8").toString("base64url")===value?decoded:null}async function scanBackgroundWorktreeOwnershipTagsForRecovery(directory){try{fs64.statSync(path102.join(directory,".git"))}catch(error93){if(error93.code==="ENOENT")return{status:"ok",owners:[]};return{status:"uncertain",reason:`Git metadata could not be inspected: ${error93 instanceof Error?error93.message:String(error93)}`}}let proc;try{proc=bunSpawn([resolveGitExecutable(),"-C",directory,"for-each-ref",`--count=${MAX_OWNERSHIP_TAGS+1}`,"--format=%(refname:strip=2)%00%(objectname)","refs/tags/swarm-preserved-owner/"],{stdin:"ignore",stdout:"pipe",stderr:"ignore",timeout:OWNERSHIP_TAG_SCAN_TIMEOUT_MS});let exitCode=await proc.exited;if(exitCode!==0)return{status:"uncertain",reason:`ownership tag scan exited ${exitCode}`};let lines=(await proc.stdout.text()).split(/\r?\n/).map((line)=>line.trim()).filter(Boolean);if(lines.length>MAX_OWNERSHIP_TAGS)return{status:"uncertain",reason:`ownership tag scan exceeded the ${MAX_OWNERSHIP_TAGS}-tag safety bound`};let owners=[];for(let line of lines){let[tag,ref,...extra]=line.split("\x00"),segments=tag?.split("/")??[],sessionId=decodeTagPart(segments[1]??""),laneId=decodeTagPart(segments[2]??""),callDigest=segments[3];if(extra.length>0||segments.length!==4||segments[0]!=="swarm-preserved-owner"||!sessionId||!laneId||!callDigest||!/^[0-9a-f]{12}$/.test(callDigest)||!ref||!/^[0-9a-f]{40,64}$/i.test(ref))return{status:"uncertain",reason:`malformed background ownership tag entry "${tag??""}"`};owners.push({sessionId,laneId,callDigest,ref})}return{status:"ok",owners}}catch(error93){return{status:"uncertain",reason:`ownership tag scan failed: ${error93 instanceof Error?error93.message:String(error93)}`}}finally{try{proc?.kill()}catch{}}}var OWNERSHIP_TAG_SCAN_TIMEOUT_MS=2000,MAX_OWNERSHIP_TAGS=512;var init_worktree_ownership_tag=__esm(()=>{init_bun_compat();init_git_executable()});var exports_worktree_collision_ownership={};__export(exports_worktree_collision_ownership,{inspectStandardWorktreeCollisionOwnership:()=>inspectStandardWorktreeCollisionOwnership,_internals:()=>_internals89});import*as fs65 from"node:fs";function descriptorCoordinateMatch(descriptor,identity){let branchMatches=descriptor.branchName===identity.branchName,pathMatches2=canonicalRootKeyFresh(descriptor.worktreePath)===canonicalRootKeyFresh(identity.worktreePath);if(!branchMatches&&!pathMatches2)return"none";if(!branchMatches||!pathMatches2||descriptor.parentSessionId!==identity.parentSessionId||descriptor.taskId!==identity.taskId)return"uncertain";return"exact"}function isProvenSettled(record3){let settlement=record3.coderSettlement;return settlement?.state==="settled"&&settlement.outcome?.kind==="standard-worktree"&&(settlement.outcome.result==="merged"||settlement.outcome.result==="unchanged")}function classifyRecord(record3,identity,ownerKind){if(!record3.worktree)return null;let coordinates=descriptorCoordinateMatch(record3.worktree,identity);if(coordinates==="none")return null;if(coordinates==="uncertain")return{status:"uncertain",reason:`${ownerKind} background owner has conflicting identity for branch "${identity.branchName}"`};if(isProvenSettled(record3))return null;let lifecycle=record3.coderSettlement?.state==="preserved"?"preserved":"active";return{status:"protected",ownerKind,lifecycle,reason:`${ownerKind} background owner ${record3.correlationId} is ${record3.status}`+(record3.coderSettlement?` with coder settlement ${record3.coderSettlement.state}`:" without a settled workspace outcome")}}async function inspectStandardWorktreeCollisionOwnership(identity){let provisioning=scanWorktreeProvisioningOwnersForRecovery(identity.directory);if(provisioning.status==="uncertain")return provisioning;let now=Date.now();for(let owner of provisioning.owners){if(!(owner.parentSessionId===identity.parentSessionId||owner.worktreeSessionId===identity.parentSessionId))continue;if(owner.schemaVersion===1||owner.taskId===identity.taskId){let leaseIsLive=now-owner.createdAt<=WORKTREE_PROVISIONING_OWNER_LEASE_MS;if(!leaseIsLive)try{_internals89.statSync(identity.worktreePath)}catch(error93){let code=error93.code;if(code!=="ENOENT"&&code!=="ENOTDIR")return{status:"uncertain",reason:`expired provisioning owner ${owner.callID} lane liveness is unreadable: ${error93 instanceof Error?error93.message:String(error93)}`};if(!_internals89.removeWorktreeProvisioningOwner(identity.directory,owner.callID,owner.schemaVersion===3?{reservationId:owner.reservationId,generation:owner.generation,branchName:owner.branchName}:void 0))return{status:"uncertain",reason:`expired provisioning owner ${owner.callID} could not be removed`};continue}return{status:"protected",ownerKind:"provisioning",lifecycle:"active",reason:!leaseIsLive?`provisioning owner ${owner.callID} lease expired, but its exact lane path still exists`:owner.schemaVersion===1?`legacy provisioning owner ${owner.callID} cannot disprove ownership of this same-session lane`:`provisioning owner ${owner.callID} is active for task ${identity.taskId}`}}}let fallback=await scanDelegationFallbacksForRecovery(identity.directory);if(fallback.status==="uncertain")return fallback;for(let artifact of fallback.owners){let classified=classifyRecord(artifact.record,identity,"fallback");if(classified)return classified}let primary=scanDelegationsForRecovery(identity.directory);if(primary.status==="uncertain")return primary;for(let record3 of primary.owners){let classified=classifyRecord(record3,identity,"primary");if(classified)return classified}let tags=await scanBackgroundWorktreeOwnershipTagsForRecovery(identity.directory);if(tags.status==="uncertain")return tags;for(let owner of tags.owners)if(owner.sessionId===identity.parentSessionId&&owner.laneId===identity.taskId)return{status:"protected",ownerKind:"ownership-tag",lifecycle:"preserved",reason:`durable ownership tag ${owner.callDigest} preserves this same-session lane`};let mergeStatus=scanWorktreeMergeFailuresForRecovery(identity.directory);if(mergeStatus.status==="uncertain")return mergeStatus;for(let[,failure]of mergeStatus.failures){let branchMatches=failure.branch===identity.branchName,pathMatches2=typeof failure.worktreePath==="string"&&canonicalRootKeyFresh(failure.worktreePath)===canonicalRootKeyFresh(identity.worktreePath);if(!branchMatches&&!pathMatches2)continue;if(!branchMatches||!pathMatches2)return{status:"uncertain",reason:`merge-status owner has conflicting identity for branch "${identity.branchName}"`};return{status:"protected",ownerKind:"merge-status",lifecycle:"preserved",reason:`merge-status records ${failure.outcome} at stage ${failure.stage}`}}return{status:"unowned"}}var _internals89;var init_worktree_collision_ownership=__esm(()=>{init_pending_delegations();init_canonical_root();init_worktree_merge_status();init_worktree_ownership_tag();init_worktree_provisioning_owner();_internals89={statSync:fs65.statSync,removeWorktreeProvisioningOwner}});var exports_worktree_isolation={};__export(exports_worktree_isolation,{standardWorktreeSerializationSessions:()=>standardWorktreeSerializationSessions,standardWorktreeByCallID:()=>standardWorktreeByCallID,sanitizeWorktreeTaskId:()=>sanitizeWorktreeTaskId,resolveWorktreeIsolationConfig:()=>resolveWorktreeIsolationConfig,resetStandardWorktreeIsolationState:()=>resetStandardWorktreeIsolationState,readLaneEnvFileFromDisk:()=>readLaneEnvFileFromDisk,preserveDirtyWorktreeForCallId:()=>preserveDirtyWorktreeForCallId,preserveDirtyWorktreeAtPath:()=>preserveDirtyWorktreeAtPath,preserveBackgroundWorktreeOwnershipForCallId:()=>preserveBackgroundWorktreeOwnershipForCallId,precreateStandardWorktreeSession:()=>precreateStandardWorktreeSession,preProvisionCollisionCheck:()=>preProvisionCollisionCheck,parseLeanLaneIndex:()=>parseLeanLaneIndex,isLaneOwnedByCurrentSession:()=>isLaneOwnedByCurrentSession,getStandardWorktreeDegradationReason:()=>getStandardWorktreeDegradationReason,finishStandardWorktreeDispatch:()=>finishStandardWorktreeDispatch,computeLaneRuntimeProfile:()=>computeLaneRuntimeProfile,cleanupStandardWorktreeForCallId:()=>cleanupStandardWorktreeForCallId,checkStandardWorktreeSerializationRelease:()=>checkStandardWorktreeSerializationRelease,awaitingMergeByCallID:()=>awaitingMergeByCallID,abortStandardWorktreeDispatch:()=>abortStandardWorktreeDispatch,_internals:()=>_internals83,MAX_TRACKED_STANDARD_WORKTREE_CALLS:()=>MAX_TRACKED_STANDARD_WORKTREE_CALLS});import{createHash as createHash46}from"node:crypto";import*as fs66 from"node:fs/promises";import*as path103 from"node:path";function parseLeanLaneIndex(laneId){let match=/^lane-(\d+)$/.exec(laneId);if(match){let n=parseInt(match[1],10);return Number.isNaN(n)?0:n-1}return 0}function computeLaneRuntimeProfile(runtime,laneIndex,worktreePath){if(!runtime?.enabled)return;let portStride=runtime.port_stride??1,envOverrides={};if(runtime.port_base!==void 0){let portBase=runtime.port_base,port=Math.min(portBase+laneIndex*portStride,65535);envOverrides.PORT=String(port)}if(runtime.env_overrides)Object.assign(envOverrides,runtime.env_overrides);if(runtime.cache_redirects)for(let[envName,basePath]of Object.entries(runtime.cache_redirects)){let laneSuffix=path103.join(basePath,`lane-${laneIndex}`);envOverrides[envName]=laneSuffix}return{laneIndex,worktreePath,envOverrides}}function allocateStandardLaneIndex(parentSessionID){let current=standardWorktreeLaneIndexBySession.get(parentSessionID)??0;return standardWorktreeLaneIndexBySession.set(parentSessionID,current+1),current}async function createSessionWithinBudget(promise3,label,onLateResolve,timeoutMs=_internals83.worktreeSessionCreateTimeoutMs){let settled=new Promise((resolveState)=>{promise3.then((result)=>resolveState({status:"fulfilled",result}),()=>resolveState({status:"rejected"}))});try{return await withTimeout(promise3,timeoutMs,Error(`${label} deadline expired after ${timeoutMs}ms (worktree.session_create_timeout_ms)`))}catch(error93){let teardown=settled.then(async(state2)=>{if(state2.status==="fulfilled")await onLateResolve?.(state2.result)},()=>{}).catch((teardownError)=>{log(`[worktree-isolation] ${label} late-settle teardown failed: ${teardownError instanceof Error?teardownError.message:String(teardownError)}`)});throw await withTimeout(teardown,_internals83.worktreeSessionCreateSettleGraceMs,Error(`${label} settle grace expired`)).catch(()=>{}),error93}}function resolveSessionCreateTimeoutMs(args2){return args2.config?.worktree?.session_create_timeout_ms??_internals83.worktreeSessionCreateTimeoutMs}async function handleStrandedLane(lane){recordDeadLaneReclaim(lane.directory,{lanePath:lane.lanePath,branchName:lane.branchName,parentSessionId:lane.parentSessionID,taskId:lane.taskId,reason:lane.reason});let session=ensureAgentSession(lane.parentSessionID);pushAdvisory(session,`WORKTREE_LANE_STRANDED: lane ${lane.lanePath} could not be removed (${lane.reason}). A child session or system process may hold .swarm/swarm.db (WAL); its DB handle was released via closeProjectDb before this attempt. reclaim scheduled at next start.`)}function rememberStandardWorktreeDispatch(dispatch){standardWorktreeByCallID.set(dispatch.callID,dispatch)}function resolveRecoveryTaskId(input){return input.planTaskId??input.taskId}function toRecoveryStrategy(strategy){return strategy}function hasStandardWorktreeDispatchCapacity(){return standardWorktreeByCallID.size<MAX_TRACKED_STANDARD_WORKTREE_CALLS}function hasInFlightStandardWorktreeDispatch(parentSessionID){for(let dispatch of standardWorktreeByCallID.values())if(dispatch.parentSessionID===parentSessionID)return!0;for(let record3 of awaitingMergeByCallID.values())if(record3.parentSessionID===parentSessionID)return!0;return!1}function handleStandardWorktreeFailure(parentSessionID,policy,message){if(policy==="required")throw new StandardWorktreeLifecycleError(message);if(hasInFlightStandardWorktreeDispatch(parentSessionID))throw new StandardWorktreeLifecycleError(`STANDARD_WORKTREE_ISOLATION_UNSAFE: ${message} Sibling coder task(s) are isolated in worktrees for this session, so dispatching this coder un-isolated in the main tree would risk a merge-back collision. Wait for in-flight coder task(s) to be reviewed and merged, then retry.`);serializeStandardWorktreeDispatches(parentSessionID,message)}function hardStopStandardWorktreeLifecycle(parentSessionID,message){let session=ensureAgentSession(parentSessionID);throw pushAdvisory(session,message),new StandardWorktreeLifecycleError(message)}function serializeStandardWorktreeDispatches(sessionID,message){if(!rememberStandardWorktreeSerializationSession(sessionID)){let session2=ensureAgentSession(sessionID);pushAdvisory(session2,`${message} Serialization tracking is at capacity (256 sessions active); continuing in normal parallel mode.`);return}standardWorktreeDegradationReasonBySession.set(sessionID,{reason:message,at:Date.now()});let session=ensureAgentSession(sessionID);session.maxConcurrencyOverride=1,pushAdvisory(session,`${message} Serializing standard coder dispatches for this session.`)}function getStandardWorktreeDegradationReason(sessionID){return standardWorktreeDegradationReasonBySession.get(sessionID)}function resetStandardWorktreeIsolationState(){standardWorktreeByCallID.clear(),standardWorktreeSerializationSessions.clear(),serializationStateBySessionID.clear(),standardWorktreeDegradationReasonBySession.clear(),awaitingMergeByCallID.clear(),standardWorktreeMergeQueue=Promise.resolve(),standardWorktreeLaneIndexBySession.clear()}function releaseStandardWorktreeSerialization(sessionID){if(!standardWorktreeSerializationSessions.has(sessionID))return!1;standardWorktreeSerializationSessions.delete(sessionID),serializationStateBySessionID.delete(sessionID),standardWorktreeDegradationReasonBySession.delete(sessionID);let session=ensureAgentSession(sessionID);return session.maxConcurrencyOverride=void 0,pushAdvisory(session,`WORKTREE_SERIALIZATION_RELEASED: ${sessionID} regains parallel dispatch eligibility (release-after-dispatches or TTL).`),!0}function checkStandardWorktreeSerializationRelease(sessionID,config3){let state2=serializationStateBySessionID.get(sessionID);if(!state2)return;let count=config3.serialization_release_after_dispatches??5,ttl=config3.serialization_release_after_ms??60000;if(state2.successfulDispatchesSince>=count){releaseStandardWorktreeSerialization(sessionID);return}if(Date.now()-state2.serializedAt>=ttl)releaseStandardWorktreeSerialization(sessionID)}function rememberStandardWorktreeSerializationSession(sessionID){if(standardWorktreeSerializationSessions.size>=MAX_TRACKED_STANDARD_WORKTREE_CALLS){let evicted=!1;for(let key2 of serializationStateBySessionID.keys())if(!hasInFlightStandardWorktreeDispatch(key2)){standardWorktreeSerializationSessions.delete(key2),serializationStateBySessionID.delete(key2),standardWorktreeDegradationReasonBySession.delete(key2),evicted=!0;break}if(!evicted)return log(`[worktree-isolation] serialization set at cap with all sessions active; refusing eviction for ${sessionID}`),!1}if(standardWorktreeSerializationSessions.add(sessionID),!serializationStateBySessionID.has(sessionID))serializationStateBySessionID.set(sessionID,{sessionID,serializedAt:Date.now(),successfulDispatchesSince:0});return!0}function sanitizeWorktreeTaskId(raw){return raw.replace(/[^A-Za-z0-9._-]/g,"-").slice(0,64)||"task"}async function preProvisionCollisionCheck(taskId,directory,_sessionId){let proc;try{proc=_internals83.bunSpawn([_internals83.resolveGitExecutable(),"-C",directory,"worktree","list","--porcelain"],{stdin:"ignore",stdout:"pipe",stderr:"pipe",timeout:WORKTREE_LIST_TIMEOUT_MS})}catch(error93){let detail=`git worktree list could not start in ${directory}: ${error93 instanceof Error?error93.message:String(error93)}`;return log(`[swarm] preProvisionCollisionCheck: ${detail}`),{collision:!1,uncertainty:detail}}let stdout="",stderr="";try{let exitCode=await proc.exited;if(stdout=await proc.stdout.text(),stderr=await proc.stderr.text(),exitCode!==0){if(stderr.toLowerCase().includes("not a git repository"))return{collision:!1};return log(`[swarm] preProvisionCollisionCheck: git worktree list failed (exit ${exitCode}): ${stderr}`),{collision:!1,uncertainty:stderr.trim()||`git worktree list exited ${exitCode}`}}}finally{try{proc.kill()}catch{}}let entries=[],current={path:"",branch:void 0,prunable:!1};for(let rawLine of stdout.split(`
|
|
1293
1293
|
`)){let line=rawLine.trim();if(line.startsWith("worktree ")){if(current.path)entries.push(current);current={path:line.slice(9),branch:void 0,prunable:!1}}else if(line.startsWith("branch "))current.branch=line.slice(7);else if(line==="prunable"||line.startsWith("prunable "))current.prunable=!0}if(current.path)entries.push(current);for(let entry of entries){if(!entry.branch)continue;if(entry.prunable)continue;let branchName=entry.branch.startsWith("refs/heads/")?entry.branch.slice(11):entry.branch,segments=branchName.split("/");if(segments.length>=4&&segments[0]==="swarm"&&segments[1]==="lane"){if(segments[3]===taskId){let ownerSessionId=segments[2];return{collision:!0,existingBranch:branchName,ownerSessionId,worktreePath:entry.path}}}if(segments.length>=3&&segments[0]==="swarm-lane"){if(segments[2]===taskId){let ownerSessionId=segments[1];return{collision:!0,existingBranch:branchName,ownerSessionId,worktreePath:entry.path}}}}return{collision:!1}}function isLaneOwnedByCurrentSession(branchName,expectedSessionId){return _internals35.extractSessionId(branchName)===expectedSessionId}async function inspectStandardWorktreeCollisionOwnership2(identity){return(await Promise.resolve().then(() => (init_worktree_collision_ownership(),exports_worktree_collision_ownership))).inspectStandardWorktreeCollisionOwnership(identity)}async function runRecoveryGit(directory,args2,timeoutMs=15000){let proc;try{proc=_internals83.bunSpawn([_internals83.resolveGitExecutable(),"-C",directory,...args2],{stdin:"ignore",stdout:"pipe",stderr:"pipe",timeout:timeoutMs,env:{...process.env,LC_ALL:"C"}});let exitCode=await proc.exited,stdout=await proc.stdout.text(),stderr=await proc.stderr.text();return{exitCode,stdout,stderr}}catch(error93){return{exitCode:1,stdout:"",stderr:error93 instanceof Error?error93.message:String(error93)}}finally{try{proc?.kill()}catch{}}}async function pathExists3(targetPath){try{return await fs66.stat(targetPath),!0}catch{return!1}}async function buildWorktreeRecoveryPublishIdentity(input){let mergeBase=await runRecoveryGit(input.directory,["merge-base",input.provenance.targetHeadBefore,input.provenance.sourceHead]),mergeBaseOid=mergeBase.stdout.trim();if(mergeBase.exitCode!==0||!/^[0-9a-f]{40}$|^[0-9a-f]{64}$/.test(mergeBaseOid))return;let targetHead=await runRecoveryGit(input.directory,["rev-parse","HEAD"]),targetHeadOid=targetHead.stdout.trim();if(targetHead.exitCode!==0||!/^[0-9a-f]{40}$|^[0-9a-f]{64}$/.test(targetHeadOid))return;return{originalCallID:input.dispatch.callID,parentSessionId:input.dispatch.parentSessionID,taskId:input.taskId,reservationId:input.dispatch.reservationId??`worktree:${input.dispatch.parentSessionID}:${input.taskId}`,generation:input.dispatch.generation??1,canonicalBranch:input.dispatch.canonicalBranch??input.dispatch.handle.branchName,canonicalPath:input.dispatch.canonicalPath??input.dispatch.handle.worktreePath,laneBranch:input.dispatch.handle.branchName,lanePath:input.dispatch.handle.worktreePath,expectedPrimaryHead:input.provenance.targetHeadBefore,sourceBaseOid:mergeBaseOid,sourceHeadOid:input.provenance.sourceHead,targetHeadOid,strategy:toRecoveryStrategy(input.provenance.strategy),...input.conflictFiles&&input.conflictFiles.length>0?{declaredConflictFiles:input.conflictFiles}:{}}}async function publishRecoveryAuthorityForSettlement(input){if(input.dispatch.recoveryClaim||!input.provenance)return{ok:!0};let identity=await _internals83.buildWorktreeRecoveryPublishIdentity({directory:input.directory,dispatch:input.dispatch,taskId:input.taskId,provenance:input.provenance,conflictFiles:input.conflictFiles});if(!identity)return{ok:!1,code:"identity_unavailable",reason:"worktree recovery publish identity could not be derived from the merge provenance"};let published=_internals83.publishWorktreeRecoveryAuthority(input.directory,identity);return published.ok?{ok:!0}:{ok:!1,code:published.code,reason:published.reason}}function isExactRecoveryClaimantStillActive(authority){let claim=authority.claim;if(!claim)return!1;if(standardWorktreeByCallID.has(claim.claimantCallID)||awaitingMergeByCallID.has(claim.claimantCallID))return!0;let childSession=swarmState.agentSessions.get(claim.childSessionId);if(!childSession?.workspaceDirectory?.trim())return!1;return sameProjectRoot(childSession.workspaceDirectory,authority.immutable.lanePath)}function describeRecoveryMutationFailure(input){return`recovery claim ${input.action} failed (${input.code}): ${input.reason}`}function maybeSelectRecoverableAuthority(lookup,collision){if(lookup.status!=="ok")return{status:"uncertain",reason:lookup.reason};let authority=lookup.authorities.find((candidate)=>candidate.status!=="finalized"&&candidate.immutable.laneBranch===collision.existingBranch&&candidate.immutable.lanePath===collision.worktreePath);return authority?{status:"match",authority}:{status:"none"}}async function precreateStandardWorktreeSession(args2){let worktreeConfig=resolveWorktreeIsolationConfig(args2.config);if(worktreeConfig.policy==="disabled")return;if(standardWorktreeSerializationSessions.has(args2.parentSessionID)){if(checkStandardWorktreeSerializationRelease(args2.parentSessionID,worktreeConfig),!standardWorktreeSerializationSessions.has(args2.parentSessionID))return}if(!hasStandardWorktreeDispatchCapacity()){if(worktreeConfig.policy==="required")throw Error("STANDARD_WORKTREE_TRACKING_CAP_EXCEEDED: too many standard worktree coder dispatches are already awaiting merge-back.");serializeStandardWorktreeDispatches(args2.parentSessionID,"STANDARD_WORKTREE_TRACKING_CAP_EXCEEDED: too many standard worktree coder dispatches are already awaiting merge-back.");return}let client=swarmState.opencodeClient;if(!client){handleStandardWorktreeFailure(args2.parentSessionID,worktreeConfig.policy,"STANDARD_WORKTREE_ISOLATION_UNAVAILABLE: OpenCode SDK client is unavailable; standard parallel coder work cannot be isolated.");return}let laneIndex=allocateStandardLaneIndex(args2.parentSessionID),provisioningOwnerIdentity={reservationId:args2.reservationId??`foreground:${args2.parentSessionID}:${resolveRecoveryTaskId(args2)}:${args2.callID}`,generation:Math.max(1,args2.generation??1),branchName:makeWorktreeBranchName(args2.parentSessionID,args2.taskId,{purpose:"lane"})},recoveryLaunch,lifecycleLock=await _internals83.tryAcquireWorktreeLifecycleLock(args2.directory,WORKTREE_LIFECYCLE_LOCK_FILE,"worktree-provisioning",args2.taskId);if(!lifecycleLock.acquired)hardStopStandardWorktreeLifecycle(args2.parentSessionID,"STANDARD_WORKTREE_LIFECYCLE_BUSY: init orphan recovery is active; retry this coder dispatch after recovery completes.");try{let collision=await _internals83.preProvisionCollisionCheck(args2.taskId,args2.directory,args2.parentSessionID);if(collision.uncertainty)hardStopStandardWorktreeLifecycle(args2.parentSessionID,`STANDARD_WORKTREE_COLLISION_SCAN_UNCERTAIN: ${collision.uncertainty}. Destructive cleanup and provisioning were blocked.`);if(collision.collision){if(!collision.existingBranch||!collision.worktreePath||!isLaneOwnedByCurrentSession(collision.existingBranch,args2.parentSessionID)){let ownerInfo=collision.ownerSessionId?` owned by session ${collision.ownerSessionId}`:" with uncertain ownership";hardStopStandardWorktreeLifecycle(args2.parentSessionID,`PREPROVISION_COLLISION: task ${args2.taskId} already has a lane on branch ${collision.existingBranch??"unknown"}${ownerInfo}; cleanup and provisioning were blocked.`)}for(let dispatch of _internals83.standardWorktreeByCallID.values())if(dispatch.handle.branchName===collision.existingBranch)hardStopStandardWorktreeLifecycle(args2.parentSessionID,`PREPROVISION_COLLISION_ACTIVE: branch ${collision.existingBranch} is still tracked by an active standard-worktree dispatch.`);for(let record3 of _internals83.awaitingMergeByCallID.values())if(record3.branch===collision.existingBranch)hardStopStandardWorktreeLifecycle(args2.parentSessionID,`PREPROVISION_COLLISION_AWAITING_MERGE: branch ${collision.existingBranch} is still awaiting merge-back.`);let recoveryCandidate=maybeSelectRecoverableAuthority(_internals83.lookupWorktreeRecoveryAuthoritiesByTask(args2.directory,{parentSessionId:args2.parentSessionID,taskId:resolveRecoveryTaskId(args2)}),collision);if(recoveryCandidate.status==="uncertain")hardStopStandardWorktreeLifecycle(args2.parentSessionID,`STANDARD_WORKTREE_RECOVERY_AUTHORITY_UNCERTAIN: ${recoveryCandidate.reason}. Recovery re-dispatch was blocked.`);if(recoveryCandidate.status==="match"){let recoveredChildSessionId="",claimed;try{claimed=await _internals83.claimWorktreeRecoveryAuthority(args2.directory,{authorityDigest:recoveryCandidate.authority.authorityDigest,claimantCallID:args2.callID,claimantSessionId:args2.parentSessionID,leaseMs:WORKTREE_RECOVERY_CLAIM_LEASE_MS,createChildSession:async()=>{let createResult=await createSessionWithinBudget(client.session.create({body:{parentID:args2.parentSessionID,title:`${args2.description??args2.taskId} (worktree recovery lane)`},query:{directory:collision.worktreePath}}),"STANDARD_WORKTREE_RECOVERY_SESSION_CREATE",async(result)=>{let lateChildSessionId=result.data?.id;if(lateChildSessionId){let verification=await teardownEphemeralSessionVerified(client.session,lateChildSessionId);if(!verification.ok)pushAdvisory(ensureAgentSession(args2.parentSessionID),`WORKTREE_RECOVERY_CHILD_SESSION_LEAKED: recovery child session ${lateChildSessionId} survived verified teardown (${verification.reason}); it holds the lane swarm.db at ${collision.worktreePath}. Retry the dispatch or restart the host to release it.`)}},resolveSessionCreateTimeoutMs(args2));if(recoveredChildSessionId=createResult.data?.id??"",!recoveredChildSessionId){let createError=createResult.error;throw Error(typeof createError==="string"?createError:JSON.stringify(createError??"missing session id"))}return recoveredChildSessionId},revalidateExpiredClaim:async({authority})=>{if(isExactRecoveryClaimantStillActive(authority))return{ok:!1,reason:"expired recovery claim still belongs to a live claimant session or dispatch"};if(authority.immutable.laneBranch!==collision.existingBranch||authority.immutable.lanePath!==collision.worktreePath)return{ok:!1,reason:"preserved lane coordinates drifted before claim transfer"};try{await fs66.stat(authority.immutable.lanePath)}catch{return{ok:!1,reason:"preserved lane path is no longer live"}}let laneHead=await runRecoveryGit(args2.directory,["rev-parse",`${authority.immutable.laneBranch}^{commit}`]);if(laneHead.exitCode!==0||laneHead.stdout.trim()!==authority.immutable.sourceHeadOid)return{ok:!1,reason:"preserved lane head changed since authority publication"};return{ok:!0}}})}catch(error93){if(_internals83.replayWorktreeRecoveryClaimJournal(args2.directory),recoveredChildSessionId){let verification=await teardownEphemeralSessionVerified(client.session,recoveredChildSessionId);if(!verification.ok)pushAdvisory(ensureAgentSession(args2.parentSessionID),`WORKTREE_RECOVERY_CHILD_SESSION_LEAKED: recovery child session ${recoveredChildSessionId} survived verified teardown (${verification.reason}); it holds the lane swarm.db at ${collision.worktreePath}. Retry the dispatch or restart the host to release it.`)}hardStopStandardWorktreeLifecycle(args2.parentSessionID,`STANDARD_WORKTREE_RECOVERY_SESSION_CREATE_FAILED: ${error93 instanceof Error?error93.message:String(error93)}. The PREPARED claim was rolled back and recovery re-dispatch was blocked.`)}if(!claimed.ok)hardStopStandardWorktreeLifecycle(args2.parentSessionID,`STANDARD_WORKTREE_RECOVERY_CLAIM_FAILED: ${claimed.reason}. The recovery child session ${recoveredChildSessionId} was created but the preserved lane was not reassigned.`);recoveryLaunch={childSessionId:recoveredChildSessionId,worktreePath:collision.worktreePath,branchName:collision.existingBranch,strategy:recoveryCandidate.authority.immutable.strategy,reservationId:recoveryCandidate.authority.immutable.reservationId,generation:recoveryCandidate.authority.immutable.generation,provisioningOwner:{reservationId:recoveryCandidate.authority.immutable.reservationId,generation:recoveryCandidate.authority.immutable.generation,branchName:collision.existingBranch},canonicalBranch:recoveryCandidate.authority.immutable.canonicalBranch,canonicalPath:recoveryCandidate.authority.immutable.canonicalPath,recoveryClaim:{authorityDigest:recoveryCandidate.authority.authorityDigest,claimRevision:claimed.authority.claim?.claimRevision??recoveryCandidate.authority.claimCursor?.lastClaimRevision??1,rawToken:claimed.rawToken,coordinates:{sourceBaseOid:recoveryCandidate.authority.immutable.sourceBaseOid,sourceHeadOid:recoveryCandidate.authority.immutable.sourceHeadOid,targetHeadOid:recoveryCandidate.authority.immutable.targetHeadOid,strategy:recoveryCandidate.authority.immutable.strategy}}}}if(!recoveryLaunch){let ownership=await _internals83.inspectStandardWorktreeCollisionOwnership({directory:args2.directory,parentSessionId:args2.parentSessionID,taskId:args2.taskId,branchName:collision.existingBranch,worktreePath:collision.worktreePath});if(ownership.status==="uncertain")hardStopStandardWorktreeLifecycle(args2.parentSessionID,`STANDARD_WORKTREE_OWNERSHIP_UNCERTAIN: ${ownership.reason}. Destructive cleanup and provisioning were blocked.`);if(ownership.status==="protected")hardStopStandardWorktreeLifecycle(args2.parentSessionID,`STANDARD_WORKTREE_OWNER_PROTECTED: ${ownership.ownerKind} owner is ${ownership.lifecycle}; ${ownership.reason}. Destructive cleanup and provisioning were blocked.`);let collisionPathExists=!0;try{await fs66.stat(collision.worktreePath)}catch(error93){let code=error93.code;if(code==="ENOENT"||code==="ENOTDIR")collisionPathExists=!1;else hardStopStandardWorktreeLifecycle(args2.parentSessionID,`STANDARD_WORKTREE_COLLISION_PATH_STAT_FAILED: ${error93 instanceof Error?error93.message:String(error93)}. Destructive cleanup and provisioning were blocked.`)}if(collisionPathExists){let preserveResult=await _internals83.preserveDirtyWorktreeAtPath(collision.worktreePath,collision.existingBranch,"denied",args2.directory,worktreeConfig.worktree_dir);if(preserveResult.outcome==="preserve-failed")hardStopStandardWorktreeLifecycle(args2.parentSessionID,`STANDARD_WORKTREE_PRESERVATION_FAILED_ABORT_CLEANUP: pre-provision collision for task ${args2.taskId} could not be preserved (${preserveResult.error}). Cleanup and provisioning were blocked.`);closeProjectDb(collision.worktreePath);let removeResult=await _internals83.removeWorktree(collision.worktreePath,args2.directory,{force:!0,worktreeDir:worktreeConfig.worktree_dir});if("error"in removeResult)hardStopStandardWorktreeLifecycle(args2.parentSessionID,`STANDARD_WORKTREE_COLLISION_REMOVE_FAILED: ${removeResult.error}. Provisioning was blocked.`);let cleanupResult=await _internals83.postMergeCleanup(args2.directory,collision.existingBranch);if("error"in cleanupResult)hardStopStandardWorktreeLifecycle(args2.parentSessionID,`STANDARD_WORKTREE_COLLISION_BRANCH_CLEANUP_FAILED: ${cleanupResult.error}. Provisioning was blocked.`)}else{let pruneResult=await _internals83.pruneStaleWorktreeMetadata(args2.directory);if("error"in pruneResult)hardStopStandardWorktreeLifecycle(args2.parentSessionID,`STANDARD_WORKTREE_COLLISION_PRUNE_FAILED: ${pruneResult.error}. Provisioning was blocked without deleting the lane branch.`)}let verification=await _internals83.preProvisionCollisionCheck(args2.taskId,args2.directory,args2.parentSessionID);if(verification.uncertainty||verification.collision)hardStopStandardWorktreeLifecycle(args2.parentSessionID,`STANDARD_WORKTREE_COLLISION_CLEANUP_UNVERIFIED: ${verification.uncertainty??"git still reports the colliding lane after cleanup"}. Provisioning was blocked.`)}}_internals83.recordWorktreeProvisioningOwner(args2.directory,{callID:args2.callID,parentSessionId:args2.parentSessionID,worktreeSessionId:args2.parentSessionID,taskId:args2.taskId,...provisioningOwnerIdentity})}catch(error93){if(error93 instanceof StandardWorktreeLifecycleError)throw error93;hardStopStandardWorktreeLifecycle(args2.parentSessionID,`STANDARD_WORKTREE_OWNER_PERSIST_FAILED: ${error93 instanceof Error?error93.message:String(error93)}.`)}finally{try{await lifecycleLock.lock._release?.()}catch{}}let childSessionId="",handle,mergeStrategy,reservationId,generation,canonicalBranch,canonicalPath,recoveryClaim;if(recoveryLaunch)childSessionId=recoveryLaunch.childSessionId,handle={worktreePath:recoveryLaunch.worktreePath,branchName:recoveryLaunch.branchName,purpose:"lane",id:sanitizeWorktreeTaskId(args2.taskId),sessionId:args2.parentSessionID},mergeStrategy=recoveryLaunch.strategy,reservationId=recoveryLaunch.reservationId,generation=recoveryLaunch.generation,provisioningOwnerIdentity=recoveryLaunch.provisioningOwner,canonicalBranch=recoveryLaunch.canonicalBranch,canonicalPath=recoveryLaunch.canonicalPath,recoveryClaim=recoveryLaunch.recoveryClaim;else{reservationId=args2.reservationId??`foreground:${args2.parentSessionID}:${resolveRecoveryTaskId(args2)}:${args2.callID}`,generation=provisioningOwnerIdentity.generation,canonicalPath=args2.directory;let provisionResult;try{provisionResult=await _internals83.provisionWorktree(args2.directory,args2.taskId,args2.parentSessionID,{purpose:"lane",worktreeDir:worktreeConfig.worktree_dir,mergeStrategy:worktreeConfig.merge_strategy,depsStrategy:worktreeConfig.deps_strategy,scope:args2.scope})}catch(error93){throw _internals83.removeWorktreeProvisioningOwner(args2.directory,args2.callID,provisioningOwnerIdentity),error93}if("error"in provisionResult){_internals83.removeWorktreeProvisioningOwner(args2.directory,args2.callID,provisioningOwnerIdentity);let message=`STANDARD_WORKTREE_PROVISION_FAILED: ${provisionResult.error}.`;handleStandardWorktreeFailure(args2.parentSessionID,worktreeConfig.policy,message);return}handle=provisionResult,mergeStrategy=worktreeConfig.merge_strategy,recordLiveLaneOwner(args2.directory,{lanePath:handle.worktreePath,branchName:handle.branchName,sessionId:args2.parentSessionID,taskId:args2.taskId})}let originalPrompt=typeof args2.outputArgs.prompt==="string"?args2.outputArgs.prompt:"";args2.outputArgs.prompt=["<worktree_lane_context>",`authoritative_lane_root: ${JSON.stringify(handle.worktreePath)}`,"All FILE declarations and scope-bound edit/write paths must be workspace-relative to authoritative_lane_root.","Remain in authoritative_lane_root: do not change directory into, or edit/write through, the primary checkout or any other worktree.","Example: FILE: src/example.ts means <authoritative_lane_root>/src/example.ts, never <primary-checkout>/src/example.ts.","Do not declare project-root absolute paths; resolve and operate inside this lane root.","</worktree_lane_context>","",originalPrompt].join(`
|
|
1294
1294
|
`);let laneProfile=computeLaneRuntimeProfile(worktreeConfig.runtime_isolation,laneIndex,handle.worktreePath);if(laneProfile)try{let{writeLaneProfileToDiskReal:writeLaneProfileToDiskReal2}=await Promise.resolve().then(() => (init_core3(),exports_core3));await writeLaneProfileToDiskReal2(handle.worktreePath,laneProfile.laneIndex,laneProfile.envOverrides)}catch{}if((worktreeConfig.deps_strategy??"skip")==="skip"){let desc=(args2.description??args2.taskId??"").toLowerCase();if(/\btests?\b/.test(desc)||/\bbuild(ing|s)?\b/.test(desc)||/\blint(ing|er)?\b/.test(desc)||/\bchecks?\b/.test(desc)){let session=ensureAgentSession(args2.parentSessionID);pushAdvisory(session,`WORKTREE_DEPS_SKIP: task ${args2.taskId} was provisioned with deps_strategy: 'skip' (default). This task's gates appear to include test/build commands; the lane may lack node_modules. Set worktree.deps_strategy to 'copy' or 'link' (or use a non-worktree lane) if the task requires host dependencies.`)}}if(!recoveryLaunch){let createResult;try{createResult=await createSessionWithinBudget(client.session.create({body:{parentID:args2.parentSessionID,title:`${args2.description??args2.taskId} (worktree lane)`},query:{directory:handle.worktreePath}}),"STANDARD_WORKTREE_SESSION_CREATE",async(result)=>{let lateChildSessionId=result.data?.id;if(lateChildSessionId){let verification=await teardownEphemeralSessionVerified(client.session,lateChildSessionId);if(!verification.ok)await handleStrandedLane({directory:args2.directory,parentSessionID:args2.parentSessionID,lanePath:handle.worktreePath,branchName:handle.branchName,taskId:args2.taskId,reason:`late child session ${lateChildSessionId} survived verified teardown (${verification.reason})`})}},resolveSessionCreateTimeoutMs(args2))}catch(error93){closeProjectDb(handle.worktreePath);let removal=await _internals83.removeWorktree(handle.worktreePath,args2.directory,{force:!0,worktreeDir:worktreeConfig.worktree_dir}).catch((cleanupError)=>({error:cleanupError instanceof Error?cleanupError.message:String(cleanupError)})),removalError=typeof removal==="object"&&removal!==null&&"error"in removal&&typeof removal.error==="string"?removal.error:void 0;if(removalError)log(`[worktree-isolation] session-create failure cleanup could not remove lane ${handle.worktreePath}: ${removalError}`),await handleStrandedLane({directory:args2.directory,parentSessionID:args2.parentSessionID,lanePath:handle.worktreePath,branchName:handle.branchName,taskId:args2.taskId,reason:removalError});_internals83.removeWorktreeProvisioningOwner(args2.directory,args2.callID,provisioningOwnerIdentity);let message=`STANDARD_WORKTREE_SESSION_CREATE_FAILED: ${error93 instanceof Error?error93.message:String(error93)}.`;handleStandardWorktreeFailure(args2.parentSessionID,worktreeConfig.policy,message);return}if(!createResult?.data?.id){closeProjectDb(handle.worktreePath);let removal=await _internals83.removeWorktree(handle.worktreePath,args2.directory,{force:!0,worktreeDir:worktreeConfig.worktree_dir}).catch((cleanupError)=>({error:cleanupError instanceof Error?cleanupError.message:String(cleanupError)})),removalError=typeof removal==="object"&&removal!==null&&"error"in removal&&typeof removal.error==="string"?removal.error:void 0;if(removalError)log(`[worktree-isolation] session-create failure cleanup could not remove lane ${handle.worktreePath}: ${removalError}`),await handleStrandedLane({directory:args2.directory,parentSessionID:args2.parentSessionID,lanePath:handle.worktreePath,branchName:handle.branchName,taskId:args2.taskId,reason:removalError});_internals83.removeWorktreeProvisioningOwner(args2.directory,args2.callID,provisioningOwnerIdentity);let createError=createResult.error,message=`STANDARD_WORKTREE_SESSION_CREATE_FAILED: ${typeof createError==="string"?createError:JSON.stringify(createError??"missing session id")}.`;handleStandardWorktreeFailure(args2.parentSessionID,worktreeConfig.policy,message);return}childSessionId=createResult.data.id}if(!childSessionId)throw Error("STANDARD_WORKTREE_SESSION_CREATE_FAILED: missing child session id.");args2.outputArgs.task_id=childSessionId,ensureAgentSession(childSessionId,"coder",handle.worktreePath),recordSessionWorkspaceRoot(childSessionId,handle.worktreePath),rememberStandardWorktreeDispatch({callID:args2.callID,parentSessionID:args2.parentSessionID,taskId:args2.taskId,planTaskId:args2.planTaskId,reservationId,generation,provisioningOwner:provisioningOwnerIdentity,canonicalBranch,canonicalPath,handle,mergeStrategy,recoveryClaim,laneIndex,worktree_dir:worktreeConfig.worktree_dir})}async function preserveBackgroundWorktreeOwnershipForCallId(callID){let dispatch=standardWorktreeByCallID.get(callID);if(!dispatch)return{outcome:"not-found"};let refProc;try{refProc=_internals83.bunSpawn([_internals83.resolveGitExecutable(),"-C",dispatch.handle.worktreePath,"rev-parse","HEAD"],{stdin:"ignore",stdout:"pipe",stderr:"pipe",timeout:PRESERVE_COMMIT_TIMEOUT_MS})}catch(error93){return{outcome:"preserve-failed",error:`git rev-parse could not start: ${error93 instanceof Error?error93.message:String(error93)}`}}let ref="";try{let exitCode=await refProc.exited;if(exitCode!==0)return{outcome:"preserve-failed",error:await refProc.stderr.text()||`git rev-parse exited ${exitCode}`};ref=(await refProc.stdout.text()).trim()}finally{try{refProc.kill()}catch{}}if(!ref)return{outcome:"preserve-failed",error:"git rev-parse returned empty"};let session=Buffer.from(dispatch.handle.sessionId,"utf8").toString("base64url"),lane=Buffer.from(dispatch.handle.id,"utf8").toString("base64url"),callDigest=createHash46("sha256").update(callID).digest("hex").slice(0,12),tag=`swarm-preserved-owner/${session}/${lane}/${callDigest}`,tagProc;try{tagProc=_internals83.bunSpawn([_internals83.resolveGitExecutable(),"-C",dispatch.handle.worktreePath,"tag",tag,ref],{stdin:"ignore",stdout:"pipe",stderr:"pipe",timeout:PRESERVE_COMMIT_TIMEOUT_MS})}catch(error93){return{outcome:"preserve-failed",error:`git tag could not start: ${error93 instanceof Error?error93.message:String(error93)}`}}try{let exitCode=await tagProc.exited;if(exitCode!==0)return{outcome:"preserve-failed",error:await tagProc.stderr.text()||`git tag exited ${exitCode}`}}finally{try{tagProc.kill()}catch{}}return{outcome:"preserved",tag,ref}}async function preserveDirtyWorktreeForCallId(callID,reason,_directory2,_worktree_dir){let dispatch=standardWorktreeByCallID.get(callID),worktreePath,parentSessionID;if(dispatch)worktreePath=dispatch.handle.worktreePath,parentSessionID=dispatch.parentSessionID;else{let awaiting=awaitingMergeByCallID.get(callID);if(!awaiting)return{outcome:"clean",preserved:!1};worktreePath=awaiting.worktreePath,parentSessionID=awaiting.parentSessionID}let statusProc;try{statusProc=_internals83.bunSpawn([_internals83.resolveGitExecutable(),"-C",worktreePath,"status","--porcelain"],{stdin:"ignore",stdout:"pipe",stderr:"pipe",timeout:PRESERVE_COMMIT_TIMEOUT_MS})}catch(error93){return{outcome:"preserve-failed",preserved:!1,error:`git status could not start: ${error93 instanceof Error?error93.message:String(error93)}`}}let statusStdout="",statusStderr="";try{let exitCode=await statusProc.exited;if(statusStdout=await statusProc.stdout.text(),statusStderr=await statusProc.stderr.text(),exitCode!==0)return log(`[swarm] preserveDirtyWorktreeForCallId: git status failed for ${callID}: ${statusStderr}`),{outcome:"preserve-failed",preserved:!1,error:`git status failed: ${statusStderr||`exit ${exitCode}`}`}}finally{try{statusProc.kill()}catch{}}if(statusStdout.trim()==="")return{outcome:"clean",preserved:!1};let addProc;try{addProc=_internals83.bunSpawn([_internals83.resolveGitExecutable(),"-C",worktreePath,"add","-A"],{stdin:"ignore",stdout:"pipe",stderr:"pipe",timeout:PRESERVE_COMMIT_TIMEOUT_MS})}catch(error93){return{outcome:"preserve-failed",preserved:!1,error:`git add could not start: ${error93 instanceof Error?error93.message:String(error93)}`}}try{let addExit=await addProc.exited;if(addExit!==0){let addErr=await addProc.stderr.text();return log(`[swarm] preserveDirtyWorktreeForCallId: git add failed for ${callID}: ${addErr}`),{outcome:"preserve-failed",preserved:!1,error:`git add failed: ${addErr||`exit ${addExit}`}`}}}finally{try{addProc.kill()}catch{}}let isoDate=new Date().toISOString(),sanitizedCallID=callID.replace(/[^A-Za-z0-9._-]/g,"-").slice(0,64),commitMessage=`swarm-preserved: ${reason} for callID ${sanitizedCallID} at ${isoDate}`,commitProc;try{commitProc=_internals83.bunSpawn([_internals83.resolveGitExecutable(),"-C",worktreePath,"commit","-m",commitMessage],{stdin:"ignore",stdout:"pipe",stderr:"pipe",timeout:PRESERVE_COMMIT_TIMEOUT_MS})}catch(error93){return{outcome:"preserve-failed",preserved:!1,error:`git commit could not start: ${error93 instanceof Error?error93.message:String(error93)}`}}let commitHash="";try{let commitExit=await commitProc.exited;if(commitExit!==0){let commitErr=await commitProc.stderr.text();return log(`[swarm] preserveDirtyWorktreeForCallId: git commit failed for ${callID}: ${commitErr}`),{outcome:"preserve-failed",preserved:!1,error:`git commit failed: ${commitErr||`exit ${commitExit}`}`}}}finally{try{commitProc.kill()}catch{}}let hashProc;try{hashProc=_internals83.bunSpawn([_internals83.resolveGitExecutable(),"-C",worktreePath,"rev-parse","HEAD"],{stdin:"ignore",stdout:"pipe",stderr:"pipe",timeout:PRESERVE_COMMIT_TIMEOUT_MS})}catch(error93){return{outcome:"preserve-failed",preserved:!1,error:`git rev-parse could not start: ${error93 instanceof Error?error93.message:String(error93)}`}}try{let hashExit=await hashProc.exited;if(hashExit!==0){let hashErr=await hashProc.stderr.text();return log(`[swarm] preserveDirtyWorktreeForCallId: git rev-parse failed for ${callID}: ${hashErr}`),{outcome:"preserve-failed",preserved:!1,error:`git rev-parse failed: ${hashErr||`exit ${hashExit}`}`}}commitHash=(await hashProc.stdout.text()).trim()}finally{try{hashProc.kill()}catch{}}if(!commitHash)return{outcome:"preserve-failed",preserved:!1,error:"git rev-parse returned empty hash"};let shortHash=commitHash.slice(0,8),tagName=`swarm-preserved-${sanitizedCallID}-${shortHash}`,tagProc;try{tagProc=_internals83.bunSpawn([_internals83.resolveGitExecutable(),"-C",worktreePath,"tag",tagName],{stdin:"ignore",stdout:"pipe",stderr:"pipe",timeout:PRESERVE_COMMIT_TIMEOUT_MS})}catch(error93){return{outcome:"preserve-failed",preserved:!1,error:`git tag could not start: ${error93 instanceof Error?error93.message:String(error93)}`}}try{let tagExit=await tagProc.exited;if(tagExit!==0){let tagErr=await tagProc.stderr.text();return log(`[swarm] preserveDirtyWorktreeForCallId: git tag failed for ${callID}: ${tagErr}`),{outcome:"preserve-failed",preserved:!1,error:`git tag failed: ${tagErr||`exit ${tagExit}`}`}}}finally{try{tagProc.kill()}catch{}}let session=ensureAgentSession(parentSessionID);return pushAdvisory(session,`STANDARD_WORKTREE_PRESERVED: dispatch ${callID} dirty work preserved as commit ${commitHash} (tag: ${tagName}; reason: ${reason}); worktree will be cleaned.`),{outcome:"preserved",preserved:!0,ref:commitHash}}async function preserveDirtyWorktreeAtPath(worktreePath,branchName,reason,_directory2,_worktree_dir){let statusProc;try{statusProc=_internals83.bunSpawn([_internals83.resolveGitExecutable(),"-C",worktreePath,"status","--porcelain"],{stdin:"ignore",stdout:"pipe",stderr:"pipe",timeout:PRESERVE_COMMIT_TIMEOUT_MS})}catch(error93){return{outcome:"preserve-failed",preserved:!1,error:`git status could not start: ${error93 instanceof Error?error93.message:String(error93)}`}}let statusStdout="",statusStderr="";try{let exitCode=await statusProc.exited;if(statusStdout=await statusProc.stdout.text(),statusStderr=await statusProc.stderr.text(),exitCode!==0)return log(`[swarm] preserveDirtyWorktreeAtPath: git status failed for ${worktreePath}: ${statusStderr}`),{outcome:"preserve-failed",preserved:!1,error:`git status failed: ${statusStderr||`exit ${exitCode}`}`}}finally{try{statusProc.kill()}catch{}}if(statusStdout.trim()==="")return{outcome:"clean",preserved:!1};let addProc;try{addProc=_internals83.bunSpawn([_internals83.resolveGitExecutable(),"-C",worktreePath,"add","-A"],{stdin:"ignore",stdout:"pipe",stderr:"pipe",timeout:PRESERVE_COMMIT_TIMEOUT_MS})}catch(error93){return{outcome:"preserve-failed",preserved:!1,error:`git add could not start: ${error93 instanceof Error?error93.message:String(error93)}`}}try{let addExit=await addProc.exited;if(addExit!==0){let addErr=await addProc.stderr.text();return log(`[swarm] preserveDirtyWorktreeAtPath: git add failed for ${worktreePath}: ${addErr}`),{outcome:"preserve-failed",preserved:!1,error:`git add failed: ${addErr||`exit ${addExit}`}`}}}finally{try{addProc.kill()}catch{}}let isoDate=new Date().toISOString(),sanitizedPath=worktreePath.replace(/[^A-Za-z0-9._-]/g,"-").slice(0,64),sanitizedBranch=branchName.replace(/[^A-Za-z0-9._-]/g,"-").slice(0,64),commitMessage=`swarm-preserved: ${reason} for worktree ${sanitizedPath} at ${isoDate}`,commitProc;try{commitProc=_internals83.bunSpawn([_internals83.resolveGitExecutable(),"-C",worktreePath,"commit","-m",commitMessage],{stdin:"ignore",stdout:"pipe",stderr:"pipe",timeout:PRESERVE_COMMIT_TIMEOUT_MS})}catch(error93){return{outcome:"preserve-failed",preserved:!1,error:`git commit could not start: ${error93 instanceof Error?error93.message:String(error93)}`}}let commitHash="";try{let commitExit=await commitProc.exited;if(commitExit!==0){let commitErr=await commitProc.stderr.text();return log(`[swarm] preserveDirtyWorktreeAtPath: git commit failed for ${worktreePath}: ${commitErr}`),{outcome:"preserve-failed",preserved:!1,error:`git commit failed: ${commitErr||`exit ${commitExit}`}`}}}finally{try{commitProc.kill()}catch{}}let hashProc;try{hashProc=_internals83.bunSpawn([_internals83.resolveGitExecutable(),"-C",worktreePath,"rev-parse","HEAD"],{stdin:"ignore",stdout:"pipe",stderr:"pipe",timeout:PRESERVE_COMMIT_TIMEOUT_MS})}catch(error93){return{outcome:"preserve-failed",preserved:!1,error:`git rev-parse could not start: ${error93 instanceof Error?error93.message:String(error93)}`}}try{let hashExit=await hashProc.exited;if(hashExit!==0){let hashErr=await hashProc.stderr.text();return log(`[swarm] preserveDirtyWorktreeAtPath: git rev-parse failed for ${worktreePath}: ${hashErr}`),{outcome:"preserve-failed",preserved:!1,error:`git rev-parse failed: ${hashErr||`exit ${hashExit}`}`}}commitHash=(await hashProc.stdout.text()).trim()}finally{try{hashProc.kill()}catch{}}if(!commitHash)return{outcome:"preserve-failed",preserved:!1,error:"git rev-parse returned empty hash"};let shortHash=commitHash.slice(0,8),tagName=`swarm-preserved-worktree-${sanitizedBranch}-${shortHash}`,tagProc;try{tagProc=_internals83.bunSpawn([_internals83.resolveGitExecutable(),"-C",worktreePath,"tag",tagName],{stdin:"ignore",stdout:"pipe",stderr:"pipe",timeout:PRESERVE_COMMIT_TIMEOUT_MS})}catch(error93){return{outcome:"preserve-failed",preserved:!1,error:`git tag could not start: ${error93 instanceof Error?error93.message:String(error93)}`}}try{let tagExit=await tagProc.exited;if(tagExit!==0){let tagErr=await tagProc.stderr.text();return log(`[swarm] preserveDirtyWorktreeAtPath: git tag failed for ${worktreePath}: ${tagErr}`),{outcome:"preserve-failed",preserved:!1,error:`git tag failed: ${tagErr||`exit ${tagExit}`}`}}}finally{try{tagProc.kill()}catch{}}return{outcome:"preserved",preserved:!0,ref:commitHash}}async function cleanupStandardWorktreeForCallId(callID,reason,directory,worktree_dir,options){let dispatch=standardWorktreeByCallID.get(callID),worktreePath,branchName,parentSessionID;if(dispatch)worktreePath=dispatch.handle.worktreePath,branchName=dispatch.handle.branchName,parentSessionID=dispatch.parentSessionID;else{let awaiting=awaitingMergeByCallID.get(callID);if(!awaiting)return{removedWorktree:!1,cleanedBranch:!1,preservedRecoveryLane:!1};worktreePath=awaiting.worktreePath,branchName=awaiting.branch,parentSessionID=awaiting.parentSessionID}if(dispatch?.recoveryClaim&&(reason==="denied"||reason==="cancelled")){let renewResult=_internals83.renewWorktreeRecoveryClaim(directory,{authorityDigest:dispatch.recoveryClaim.authorityDigest,claimantCallID:callID,claimRevision:dispatch.recoveryClaim.claimRevision,rawToken:dispatch.recoveryClaim.rawToken,leaseMs:WORKTREE_RECOVERY_CLAIM_LEASE_MS});if(!renewResult.ok){let message=`STANDARD_WORKTREE_RECOVERY_ABORT_RELEASE_FAILED: dispatch ${callID} preserved lane ${worktreePath} (${branchName}) after ${reason}, but ${describeRecoveryMutationFailure({action:"renew",code:renewResult.code,reason:renewResult.reason})}. No tracking teardown was performed.`,session3=ensureAgentSession(parentSessionID);throw pushAdvisory(session3,message),Error(message)}let releaseResult=_internals83.releaseWorktreeRecoveryClaim(directory,{authorityDigest:dispatch.recoveryClaim.authorityDigest,claimantCallID:callID,claimRevision:dispatch.recoveryClaim.claimRevision,rawToken:dispatch.recoveryClaim.rawToken});if(!releaseResult.ok){let message=`STANDARD_WORKTREE_RECOVERY_ABORT_RELEASE_FAILED: dispatch ${callID} preserved lane ${worktreePath} (${branchName}) after ${reason}, but ${describeRecoveryMutationFailure({action:"release",code:releaseResult.code,reason:releaseResult.reason})}. No tracking teardown was performed.`,session3=ensureAgentSession(parentSessionID);throw pushAdvisory(session3,message),Error(message)}standardWorktreeByCallID.delete(callID),awaitingMergeByCallID.delete(callID);let session2=ensureAgentSession(parentSessionID);return pushAdvisory(session2,`STANDARD_WORKTREE_RECOVERY_ABORT_PRESERVED: dispatch ${callID} released its recovery claim and preserved lane ${worktreePath} (${branchName}) after ${reason}.`),{removedWorktree:!1,cleanedBranch:!1,preservedRecoveryLane:!0}}let preserveResult;if(reason==="denied"||reason==="cancelled"){try{preserveResult=await _internals83.preserveDirtyWorktreeForCallId(callID,reason,directory,worktree_dir)}catch(err){log(`[swarm] cleanupStandardWorktreeForCallId: preserveDirtyWorktreeForCallId threw for ${callID}: ${err}`),preserveResult={outcome:"preserve-failed",preserved:!1,error:String(err)}}if(preserveResult.outcome==="clean")try{preserveResult=await _internals83.preserveDirtyWorktreeForCallId(callID,reason,directory,worktree_dir)}catch(err){log(`[swarm] cleanupStandardWorktreeForCallId: final preservation check threw for ${callID}: ${err}`),preserveResult={outcome:"preserve-failed",preserved:!1,error:String(err)}}}if(preserveResult&&preserveResult.outcome==="preserve-failed"){standardWorktreeByCallID.delete(callID),awaitingMergeByCallID.delete(callID);let session2=ensureAgentSession(parentSessionID);return pushAdvisory(session2,`STANDARD_WORKTREE_PRESERVATION_FAILED_ABORT_CLEANUP: dispatch ${callID} has dirty uncommitted work but preservation failed (${preserveResult.error}). Cleanup aborted to protect uncommitted work. Investigate and resolve manually. Worktree=${worktreePath}; branch=${branchName}.`),{removedWorktree:!1,cleanedBranch:!1,preservedRecoveryLane:!1}}let removedWorktree=!1;try{closeProjectDb(worktreePath);let result=await _internals83.removeWorktree(worktreePath,directory,{force:!0,worktreeDir:worktree_dir});if(!("error"in result))removedWorktree=!0;else if(result.error.includes("is not a working tree")&&await pathExists3(worktreePath)&&isPathUnderSwarmWorktreeBase(worktreePath,directory,worktree_dir?[worktree_dir]:[]))try{await fs66.rm(worktreePath,{recursive:!0,force:!0}),removedWorktree=!await pathExists3(worktreePath)}catch(err){log(`[swarm] cleanupStandardWorktreeForCallId: residual directory cleanup failed for ${callID}: ${err}`)}}catch(err){log(`[swarm] cleanupStandardWorktreeForCallId: removeWorktree failed for ${callID}: ${err}`)}let cleanedBranch=!1;if(options?.retainBranch){let retainedSession=ensureAgentSession(parentSessionID);pushAdvisory(retainedSession,`STANDARD_WORKTREE_BRANCH_RETAINED: dispatch ${callID} removed worktree ${worktreePath} but retained branch ${branchName} (unstaged landing); the branch is the recovery backup until the landed changes are committed.`)}else try{cleanedBranch=!("error"in await _internals83.postMergeCleanup(directory,branchName))}catch(err){log(`[swarm] cleanupStandardWorktreeForCallId: postMergeCleanup failed for ${callID}: ${err}`)}standardWorktreeByCallID.delete(callID),awaitingMergeByCallID.delete(callID);let session=ensureAgentSession(parentSessionID);return pushAdvisory(session,`STANDARD_WORKTREE_CLEANUP: dispatch ${callID} cleaned up (reason: ${reason}); worktree=${worktreePath}; branch=${branchName}.`),{removedWorktree,cleanedBranch,preservedRecoveryLane:!1}}async function abortStandardWorktreeDispatch(callID,reason,directory){let dispatch=standardWorktreeByCallID.get(callID);if(!dispatch){let session=ensureAgentSession("unknown");pushAdvisory(session,`STANDARD_WORKTREE_ABORT_NOOP: dispatch ${callID} has no tracked worktree to abort (reason: ${reason}).`);return}await cleanupStandardWorktreeForCallId(callID,reason,directory,dispatch.worktree_dir)}async function finishStandardWorktreeDispatch(directory,dispatch,config3,callID,settlement={}){let wtConfig=config3?resolveWorktreeIsolationConfig(config3):DEFAULT_WORKTREE_ISOLATION_CONFIG,resolvedCallID=callID??dispatch.callID,run=async()=>{let statusKey=dispatch.planTaskId??dispatch.taskId,failRecoverySettlement=(stage,message,provenance)=>{recordWorktreeMergeFailure(statusKey,{outcome:"failed",stage,message,worktreePath:dispatch.handle.worktreePath,branch:dispatch.handle.branchName,completedAt:Date.now()});let session=ensureAgentSession(dispatch.parentSessionID);return pushAdvisory(session,`STANDARD_WORKTREE_RECOVERY_MUTATION_FAILED: task ${dispatch.taskId} preserved at ${dispatch.handle.worktreePath}; ${message}.`),{outcome:"failed",stage,message,provenance}},renewRecoveryClaimLease=(phase,provenance)=>{if(!dispatch.recoveryClaim)return;let renewed=_internals83.renewWorktreeRecoveryClaim(directory,{authorityDigest:dispatch.recoveryClaim.authorityDigest,claimantCallID:resolvedCallID,claimRevision:dispatch.recoveryClaim.claimRevision,rawToken:dispatch.recoveryClaim.rawToken,leaseMs:WORKTREE_RECOVERY_CLAIM_LEASE_MS});if(renewed.ok)return;return failRecoverySettlement("recovery-claim-renew",`The live recovery lane could not extend its lease ${phase}; ${describeRecoveryMutationFailure({action:"renew",code:renewed.code,reason:renewed.reason})}`,provenance)},releaseRecoveryClaim=(provenance)=>{if(!dispatch.recoveryClaim)return;let released=_internals83.releaseWorktreeRecoveryClaim(directory,{authorityDigest:dispatch.recoveryClaim.authorityDigest,claimantCallID:resolvedCallID,claimRevision:dispatch.recoveryClaim.claimRevision,rawToken:dispatch.recoveryClaim.rawToken});if(released.ok)return;return failRecoverySettlement("recovery-claim-release",`The preserved recovery lane could not release its exact claim after settlement; ${describeRecoveryMutationFailure({action:"release",code:released.code,reason:released.reason})}`,provenance)},publishRecoveryAuthority=async(provenance,conflictFiles)=>{let published=await publishRecoveryAuthorityForSettlement({directory,dispatch,taskId:statusKey,provenance,conflictFiles});if(published.ok)return;return failRecoverySettlement("recovery-authority-publish",`The preserved original lane could not publish recoverable authority; ${describeRecoveryMutationFailure({action:"publish",code:published.code,reason:published.reason})}`,provenance)},preMergeRenewFailure=renewRecoveryClaimLease("before merge-back");if(preMergeRenewFailure)return preMergeRenewFailure;let mergeResult=await(async()=>{if(!dispatch.recoveryClaim)return _internals83.attemptMergeBackFromDirty(dispatch.handle.worktreePath,dispatch.handle.branchName,directory,getMergeStrategy({merge_strategy:dispatch.mergeStrategy}),{operationId:settlement.operationId,resume:settlement.resume,onBeforeMerge:settlement.onBeforeMerge,commitLanding:settlement.commitLanding});let coordinates=dispatch.recoveryClaim.coordinates;if(!coordinates)return{failed:!0,stage:"recovery-coordinates",message:"Claimed recovery lane is missing immutable Git coordinates"};let provenance={operationId:settlement.operationId??`recovery:${dispatch.recoveryClaim.authorityDigest}`,sourceHead:coordinates.sourceHeadOid,targetHeadBefore:coordinates.targetHeadOid,branchName:dispatch.handle.branchName,strategy:coordinates.strategy};if(settlement.onBeforeMerge)await settlement.onBeforeMerge(provenance);let recovered=await _internals83.recoverMergeBackFromImmutableCoordinates(directory,coordinates);if("merged"in recovered&&recovered.merged){if(recovered.sourceCommitOrder&&recovered.rewrittenCommitOrder)dispatch.recoveryClaim.settlement={sourceCommitOrder:recovered.sourceCommitOrder,rewrittenCommitOrder:recovered.rewrittenCommitOrder};return{merged:!0,strategy:recovered.strategy,autoCommitted:!1,cleaned:!0,reconciled:!1,provenance}}if("conflict"in recovered&&recovered.conflict)return{partial:!0,stage:"conflict",autoCommitted:!1,cleaned:!0,message:recovered.message,conflictFiles:recovered.files,provenance};return{failed:!0,stage:"recovery",message:"error"in recovered?recovered.error:"Immutable recovery returned an unexpected result",provenance}})();if("merged"in mergeResult&&mergeResult.merged){let mergedSettlement={outcome:"merged",strategy:mergeResult.strategy,autoCommitted:mergeResult.autoCommitted??!1,cleaned:mergeResult.cleaned??!1,reconciled:mergeResult.reconciled??!1,provenance:mergeResult.provenance};if(settlement.onMerged)try{await settlement.onMerged(mergedSettlement)}catch(error93){let failedSettlement={outcome:"failed",stage:"settlement-persist",message:`Git merge-back succeeded but settlement persistence failed: ${String(error93)}`,provenance:mergeResult.provenance},publishFailure=await publishRecoveryAuthority(mergeResult.provenance);if(publishFailure)failedSettlement.message=`${failedSettlement.message} ${publishFailure.message}`;let releaseFailure=releaseRecoveryClaim(mergeResult.provenance);if(releaseFailure)failedSettlement.message=`${failedSettlement.message} ${releaseFailure.message}`;recordWorktreeMergeFailure(statusKey,{outcome:"failed",stage:failedSettlement.stage,message:failedSettlement.message,worktreePath:dispatch.handle.worktreePath,branch:dispatch.handle.branchName,completedAt:Date.now()});let session=ensureAgentSession(dispatch.parentSessionID);return pushAdvisory(session,`STANDARD_WORKTREE_SETTLEMENT_PERSIST_FAILED: task ${dispatch.taskId} landed in ${directory}, but settlement persistence failed; worktree and branch preserved at ${dispatch.handle.worktreePath} (${dispatch.handle.branchName}).`),failedSettlement}let preCleanupRenewFailure=renewRecoveryClaimLease("before cleanup/finalization",mergeResult.provenance);if(preCleanupRenewFailure)return preCleanupRenewFailure;let cleanupResult=await cleanupStandardWorktreeForCallId(resolvedCallID,"success",directory,dispatch.worktree_dir,{retainBranch:mergeResult.strategy==="squash-unstaged"});if(dispatch.recoveryClaim){let request={authorityDigest:dispatch.recoveryClaim.authorityDigest,claimantCallID:resolvedCallID,claimRevision:dispatch.recoveryClaim.claimRevision,rawToken:dispatch.recoveryClaim.rawToken,settlement:dispatch.recoveryClaim.settlement};if(cleanupResult.removedWorktree&&cleanupResult.cleanedBranch){let finalized=_internals83.finalizeWorktreeRecoveryAuthority(directory,request);if(!finalized.ok)return failRecoverySettlement("recovery-claim-finalize",`The merged recovery lane was cleaned up but could not finalize its exact claim; ${describeRecoveryMutationFailure({action:"finalize",code:finalized.code,reason:finalized.reason})}`,mergeResult.provenance)}else{let releaseFailure=releaseRecoveryClaim(mergeResult.provenance);if(releaseFailure)return releaseFailure}}clearWorktreeMergeStatus(statusKey);try{let{removeLaneProfileFromDiskReal:removeLaneProfileFromDiskReal2}=await Promise.resolve().then(() => (init_core3(),exports_core3));await removeLaneProfileFromDiskReal2(dispatch.handle.worktreePath,dispatch.laneIndex)}catch{}let state2=serializationStateBySessionID.get(dispatch.parentSessionID);if(state2)state2.successfulDispatchesSince++,checkStandardWorktreeSerializationRelease(dispatch.parentSessionID,wtConfig);try{verifyReviewerScopeGenerationMergeBack({parentSessionID:dispatch.parentSessionID,taskId:statusKey,coderCallID:resolvedCallID,primaryDirectory:directory})}catch{}return mergedSettlement}if("partial"in mergeResult){let publishFailure=await publishRecoveryAuthority(mergeResult.provenance,mergeResult.conflictFiles);if(publishFailure)return publishFailure;let releaseFailure=releaseRecoveryClaim(mergeResult.provenance);if(releaseFailure)return releaseFailure;recordWorktreeMergeFailure(statusKey,{outcome:"partial",stage:mergeResult.stage,message:mergeResult.message,worktreePath:dispatch.handle.worktreePath,branch:dispatch.handle.branchName,completedAt:Date.now()});let session=ensureAgentSession(dispatch.parentSessionID);pushAdvisory(session,`STANDARD_WORKTREE_MERGE_PARTIAL: task ${dispatch.taskId} preserved at ${dispatch.handle.worktreePath}; stage: ${mergeResult.stage}; ${mergeResult.message}`+(mergeResult.code?` (code: ${mergeResult.code})`:"")+(mergeResult.recoveryHint?` ${mergeResult.recoveryHint}`:""));try{markReviewerScopeGenerationMergebackPending({parentSessionID:dispatch.parentSessionID,taskId:statusKey,coderCallID:resolvedCallID})}catch{}return{outcome:"partial",stage:mergeResult.stage,message:mergeResult.message,autoCommitted:mergeResult.autoCommitted,cleaned:mergeResult.cleaned,conflictFiles:mergeResult.conflictFiles,code:mergeResult.code,recoveryHint:mergeResult.recoveryHint,provenance:mergeResult.provenance}}if("failed"in mergeResult){let publishFailure=await publishRecoveryAuthority(mergeResult.provenance);if(publishFailure)return publishFailure;let releaseFailure=releaseRecoveryClaim(mergeResult.provenance);if(releaseFailure)return releaseFailure;recordWorktreeMergeFailure(statusKey,{outcome:"failed",stage:mergeResult.stage,message:mergeResult.message,worktreePath:dispatch.handle.worktreePath,branch:dispatch.handle.branchName,completedAt:Date.now()});let session=ensureAgentSession(dispatch.parentSessionID),location=mergeResult.stage===SOURCE_WORKTREE_GONE_STAGE||mergeResult.stage===SOURCE_WORKTREE_UNCERTAIN_STAGE?`lane worktree ${dispatch.handle.worktreePath} no longer exists`:`preserved at ${dispatch.handle.worktreePath}`;pushAdvisory(session,`STANDARD_WORKTREE_MERGE_FAILED: task ${dispatch.taskId} ${location}; stage: ${mergeResult.stage}; ${mergeResult.message}.`);try{markReviewerScopeGenerationMergebackPending({parentSessionID:dispatch.parentSessionID,taskId:statusKey,coderCallID:resolvedCallID})}catch{}return{outcome:"failed",stage:mergeResult.stage,message:mergeResult.message,provenance:mergeResult.provenance}}return{outcome:"failed",stage:"merge",message:"Merge-back returned an unexpected result"}},queuedRun=standardWorktreeMergeQueue.then(run,run);standardWorktreeMergeQueue=queuedRun;let result;try{result=await queuedRun}catch(error93){if(standardWorktreeByCallID.delete(resolvedCallID),awaitingMergeByCallID.delete(resolvedCallID),dispatch.recoveryClaim)try{_internals83.releaseWorktreeRecoveryClaim(directory,{authorityDigest:dispatch.recoveryClaim.authorityDigest,claimantCallID:resolvedCallID,claimRevision:dispatch.recoveryClaim.claimRevision,rawToken:dispatch.recoveryClaim.rawToken})}catch{}let message=`Unexpected worktree settlement failure: ${error93 instanceof Error?error93.message:String(error93)}`;recordWorktreeMergeFailure(dispatch.planTaskId??dispatch.taskId,{outcome:"failed",stage:"merge",message,worktreePath:dispatch.handle.worktreePath,branch:dispatch.handle.branchName,completedAt:Date.now()});let session=ensureAgentSession(dispatch.parentSessionID);return pushAdvisory(session,`STANDARD_WORKTREE_SETTLEMENT_FAILED: task ${dispatch.taskId} preserved at ${dispatch.handle.worktreePath}; ${message}.`),{outcome:"failed",stage:"merge",message}}if(resolvedCallID)awaitingMergeByCallID.delete(resolvedCallID);return result}async function readLaneEnvFileFromDisk(worktreePath,laneIndex){let envPath=path103.join(worktreePath,".swarm","lanes",`${laneIndex}.env`),content;try{content=await fs66.readFile(envPath,"utf-8")}catch(err){if(err.code==="ENOENT")return{};return log(`[worktree-isolation] failed to read lane env file ${envPath}: ${err.message}`),{}}let result={};for(let rawLine of content.split(`
|
|
1295
1295
|
`)){let line=rawLine.trim();if(!line||line.startsWith("#"))continue;let eqIdx=line.indexOf("=");if(eqIdx<0)continue;let k=line.slice(0,eqIdx),v=line.slice(eqIdx+1);if(!isValidEnvKey(k))continue;if(isUntrustedEnvKey(k))continue;result[k]=v}return result}var MAX_TRACKED_STANDARD_WORKTREE_CALLS=256,awaitingMergeByCallID,standardWorktreeByCallID,standardWorktreeSerializationSessions,standardWorktreeMergeQueue,standardWorktreeLaneIndexBySession,serializationStateBySessionID,WORKTREE_RECOVERY_CLAIM_LEASE_MS=300000,WORKTREE_SESSION_CREATE_TIMEOUT_MS=30000,WORKTREE_SESSION_CREATE_SETTLE_GRACE_MS=5000,StandardWorktreeLifecycleError,standardWorktreeDegradationReasonBySession,WORKTREE_LIST_TIMEOUT_MS=15000,PRESERVE_COMMIT_TIMEOUT_MS=30000,_internals83;var init_worktree_isolation=__esm(()=>{init_constants();init_project_db();init_file_locks();init_lane_owners();init_executor();init_state2();init_bun_compat();init_canonical_root();init_ephemeral_session_teardown();init_git_executable();init_logger();init_timeout();init_worktree();init_merge2();init_reviewer_scope_mergeback();init_dead_lane_reclaim();init_worktree_merge_status();init_worktree_provisioning_owner();init_worktree_recovery_authority();init_worktree_isolation_config();awaitingMergeByCallID=new Map,standardWorktreeByCallID=new Map,standardWorktreeSerializationSessions=new Set,standardWorktreeMergeQueue=Promise.resolve(),standardWorktreeLaneIndexBySession=new Map,serializationStateBySessionID=new Map;StandardWorktreeLifecycleError=class StandardWorktreeLifecycleError extends Error{kind="standard-worktree-lifecycle";constructor(message){super(message);this.name="StandardWorktreeLifecycleError"}};standardWorktreeDegradationReasonBySession=new Map;_internals83={provisionWorktree,removeWorktree,attemptMergeBackFromDirty,recoverMergeBackFromImmutableCoordinates,postMergeCleanup,pruneStaleWorktreeMetadata,readLaneEnvFileFromDisk,serializationStateBySessionID,rememberStandardWorktreeSerializationSession,awaitingMergeByCallID,startupOrphanRecovery,cleanupOrphanedBranches,cleanupStandardWorktreeForCallId,preserveDirtyWorktreeForCallId,preserveBackgroundWorktreeOwnershipForCallId,tryAcquireWorktreeLifecycleLock:tryAcquireLock,recordWorktreeProvisioningOwner,removeWorktreeProvisioningOwner,lookupWorktreeRecoveryAuthoritiesByTask,claimWorktreeRecoveryAuthority,renewWorktreeRecoveryClaim,releaseWorktreeRecoveryClaim,finalizeWorktreeRecoveryAuthority,publishWorktreeRecoveryAuthority,replayWorktreeRecoveryClaimJournal,buildWorktreeRecoveryPublishIdentity,preserveDirtyWorktreeAtPath,worktreeSessionCreateTimeoutMs:WORKTREE_SESSION_CREATE_TIMEOUT_MS,worktreeSessionCreateSettleGraceMs:WORKTREE_SESSION_CREATE_SETTLE_GRACE_MS,createSessionWithinBudget,abortStandardWorktreeDispatch,standardWorktreeByCallID,preProvisionCollisionCheck,inspectStandardWorktreeCollisionOwnership:inspectStandardWorktreeCollisionOwnership2,isLaneOwnedByCurrentSession,bunSpawn,resolveGitExecutable}});var exports_coder_settlement={};__export(exports_coder_settlement,{transferCoderSettlementToBackground:()=>transferCoderSettlementToBackground,settleCoderDispatch:()=>settleCoderDispatch,releaseCoderDispatchOwnership:()=>releaseCoderDispatchOwnership,recoverStaleCoderSettlements:()=>recoverStaleCoderSettlements,recoverCoderSettlement:()=>recoverCoderSettlement,recordCoderMergeProvenance:()=>recordCoderMergeProvenance,listCoderSettlementWalStates:()=>listCoderSettlementWalStates,hasUnattributedEmptyScopeMutation:()=>hasUnattributedEmptyScopeMutation,completeCoderSettlementCleanup:()=>completeCoderSettlementCleanup,beginCoderSettlement:()=>beginCoderSettlement,assertNoUnsettledCoderDispatch:()=>assertNoUnsettledCoderDispatch,abortCoderSettlementIfDoomed:()=>abortCoderSettlementIfDoomed,abortCoderSettlement:()=>abortCoderSettlement,_internals:()=>_internals90});import{spawnSync as spawnSync13}from"node:child_process";import{randomUUID as randomUUID14}from"node:crypto";import{existsSync as existsSync54}from"node:fs";import{readdir as readdir6}from"node:fs/promises";function dispatchKey(directory,taskId,transitionId){return`${canonicalRootKeyFresh(directory)}\x00${taskId}\x00${transitionId}`}function walPath(directory,taskId){return validateSwarmPath(directory,`coder-settlements/${taskId}.json`)}async function readWal2(filePath,taskId){return readWorkflowWalFile("coder-settlement",filePath,taskId)}async function withSettlementLock(directory,taskId,actor,operation){let target=`coder-settlements/${taskId}.json`,lock=await tryAcquireLock(directory,target,actor,`coder-settlement-${taskId}-${Date.now()}`);if(!lock.acquired)throw Error(`CODER_SETTLEMENT_LOCKED: task ${taskId}`);try{return await operation()}finally{await lock.lock._release?.().catch(()=>{return})}}async function writeWal3(filePath,wal){await writeWorkflowWalFile("coder-settlement",filePath,wal)}async function appendSettlementEvent(directory,action,wal,extra){try{appendCoreEventSync(directory,{type:"coder_settlement",action,timestamp:new Date().toISOString(),taskId:wal.taskId,transitionId:wal.transitionId,actor:wal.actor,...extra??{}})}catch(error93){criticalWarn(`[coder-settlement] lifecycle event write failed (${action} ${wal.taskId}): ${error93 instanceof Error?error93.message:String(error93)}`)}}function baselineAttributionDoomed(baseline){if(baseline.gitHead===null)return!0;return Array.isArray(baseline.changedFiles)&&baseline.changedFiles.length>0}function hasUnattributedEmptyScopeMutation(declaredFiles,rawObservedFiles){return Array.isArray(declaredFiles)&&declaredFiles.length===0&&Array.isArray(rawObservedFiles)&&rawObservedFiles.length>0}function doomedReason(baseline){if(baseline.gitHead===null)return"launch workspace has no git baseline (not a git repository, or git unavailable at dispatch)";return`launch baseline was dirty with ${String(baseline.changedFiles?.length??0)} pre-existing uncommitted/untracked change(s)`}function isProcessAlive3(processId){if(processId===process.pid)return!0;try{return process.kill(processId,0),!0}catch(error93){return error93.code==="EPERM"}}async function scopedObservedFiles(directory,context){let baseline={...context.baseline,directory},observed=await changedFilesSinceSnapshotAsync(directory,baseline);if(!observed||!context.declaredFiles)return null;if(hasUnattributedEmptyScopeMutation(context.declaredFiles,observed))return observed;return observed.filter((filePath)=>isPathWithinDeclaredScope(filePath,context.declaredFiles??[],directory))}function settlementTransitionEvent(wal){return wal.accepted?{type:"accepted_mutation",agentType:"coder",context:{testEngineerExempt:wal.testEngineerExempt===!0,settlementFailed:wal.settlementFailed===!0},expectedGeneration:wal.expectedGeneration,transitionId:wal.transitionId}:{type:"dispatch_no_mutation",agentType:"coder",context:{declaredFiles:wal.context.declaredFiles,settlementTransitionId:wal.transitionId},expectedGeneration:wal.expectedGeneration,transitionId:wal.transitionId}}function withLandedUnstaged(worktree,landedUnstaged){if(worktree===void 0||landedUnstaged===void 0)return worktree;return{...worktree,landedUnstaged}}async function commitPrepared(directory,wal,options){return withTaskEvidenceTransaction(directory,wal.taskId,wal.actor,async(transaction)=>{let lockedWal=await readWal2(walPath(directory,wal.taskId),wal.taskId);if(lockedWal===null)throw Error("CODER_SETTLEMENT_WAL_MISSING");if(lockedWal.transitionId!==wal.transitionId)throw Error("CODER_SETTLEMENT_WAL_REPLACED");let transitionEvent=settlementTransitionEvent(lockedWal),snapshot=getTaskWorkflowSnapshot(transaction.read());if(lockedWal.accepted===!0?snapshot.authoritative&&snapshot.state===(lockedWal.settlementFailed===!0?"rework_required":"coder_delegated")&&snapshot.generation===lockedWal.expectedGeneration+1&&snapshot.lastOutcome===(lockedWal.settlementFailed===!0?"accepted_mutation_failed":"accepted_mutation")&&snapshot.lastTransitionId===lockedWal.transitionId:snapshot.authoritative&&snapshot.generation===lockedWal.expectedGeneration&&(lockedWal.context.declaredFiles?.length===0?snapshot.noMutationSettlement?.transitionId===lockedWal.transitionId:snapshot.lastOutcome==="dispatch_no_mutation"&&snapshot.lastTransitionId===lockedWal.transitionId)){let evidence2=transaction.read();if(lockedWal.accepted===!0)await ensureTaskGateRequirementsReceiptForSettledTransition(directory,lockedWal.taskId,evidence2,transitionEvent);if(lockedWal.state!=="COMMITTED")lockedWal={...lockedWal,state:"COMMITTED",cleanupComplete:lockedWal.worktree===void 0,worktree:withLandedUnstaged(lockedWal.worktree,options?.landedUnstaged)},await writeWal3(walPath(directory,wal.taskId),lockedWal),await appendSettlementEvent(directory,"settled",lockedWal,{resumed:!0});return{evidence:evidence2,accepted:lockedWal.accepted===!0,alreadyApplied:!0}}if(lockedWal.state!=="PREPARED"&&!(lockedWal.state==="COMMITTED"&&lockedWal.accepted!==!0&&snapshot.state==="idle"))throw Error("CODER_SETTLEMENT_NOT_PREPARED");let evidence=await transaction.transition(transitionEvent);return lockedWal={...lockedWal,state:"COMMITTED",cleanupComplete:lockedWal.worktree===void 0,worktree:withLandedUnstaged(lockedWal.worktree,options?.landedUnstaged)},await writeWal3(walPath(directory,wal.taskId),lockedWal),await appendSettlementEvent(directory,"settled",lockedWal),{evidence,accepted:lockedWal.accepted===!0,alreadyApplied:!1}})}async function beginCoderSettlement(options){if(options.context.baseline.gitHead===null){if((await captureWorkspaceSnapshotAsync(options.directory)).gitHead!==null)throw Error(`CODER_SETTLEMENT_BASELINE_UNAVAILABLE: the launch baseline for task ${options.taskId} has no git HEAD — the observation directory (${options.context.baseline.directory}) is not a git repository or git is unavailable there. An unregistered worktree lane (a lane directory that git worktree list does not know) produces exactly this. The task was not dispatched and no settlement state was created; retry the dispatch, or set worktree.policy "disabled" to run coders in the primary tree.`)}let filePath=walPath(options.directory,options.taskId),ownsActiveDispatch=!1;if(await withSettlementLock(options.directory,options.taskId,options.actor,()=>withTaskEvidenceTransaction(options.directory,options.taskId,options.actor,async(transaction)=>{let snapshot=getTaskWorkflowSnapshot(transaction.read());if(snapshot.generation!==options.expectedGeneration)throw Error(`TASK_WORKFLOW_GENERATION_MISMATCH: expected ${options.expectedGeneration}, found ${snapshot.generation}`);let existing=await readWal2(filePath,options.taskId);if(existing!==null){if((existing.state==="DISPATCHED"||existing.state==="PREPARED")&&existing.transitionId!==options.transitionId)throw Error(`CODER_SETTLEMENT_IN_PROGRESS: transition ${existing.transitionId} owns task ${options.taskId}, so transition ${options.transitionId} cannot dispatch it (${filePath}, state ${existing.state}). Wait for the owning transition to settle or run /swarm recover ${options.taskId} (or /swarm reset-session), then retry; do not remove the WAL by hand.`);if(existing.transitionId===options.transitionId){if(!(existing.actor===options.actor&&existing.expectedGeneration===options.expectedGeneration&&JSON.stringify(existing.context)===JSON.stringify(options.context)&&JSON.stringify(existing.worktree)===JSON.stringify(options.worktree)))throw Error("CODER_SETTLEMENT_IDEMPOTENCY_CONFLICT");if(existing.state==="ABORTED")throw Error("CODER_SETTLEMENT_IDEMPOTENCY_CONFLICT");ownsActiveDispatch=existing.state==="DISPATCHED"&&existing.runtimeId===runtimeId;return}}await transaction.transition({type:"dispatch_attempted",agentType:"coder",expectedGeneration:options.expectedGeneration,transitionId:options.transitionId}),await writeWal3(filePath,{version:1,state:"DISPATCHED",taskId:options.taskId,transitionId:options.transitionId,actor:options.actor,processId:process.pid,runtimeId,expectedGeneration:options.expectedGeneration,context:options.context,...options.worktree?{worktree:options.worktree}:{},recordedAt:new Date().toISOString()}),ownsActiveDispatch=!0,await appendSettlementEvent(options.directory,"dispatched",{taskId:options.taskId,transitionId:options.transitionId,actor:options.actor})})),ownsActiveDispatch){let key2=dispatchKey(options.directory,options.taskId,options.transitionId);if(!liveDispatches.has(key2)&&liveDispatches.size>=MAX_LIVE_DISPATCHES)throw Error("CODER_SETTLEMENT_CAPACITY_EXCEEDED");liveDispatches.add(key2)}}async function settleCoderDispatch(options){return withSettlementLock(options.directory,options.taskId,"coder-settlement",async()=>{let filePath=walPath(options.directory,options.taskId),wal=await readWal2(filePath,options.taskId);if(wal===null)throw Error("CODER_SETTLEMENT_WAL_MISSING");if(wal.transitionId!==options.transitionId)throw Error("CODER_SETTLEMENT_WAL_REPLACED");let unattributedEmptyScopeMutation=hasUnattributedEmptyScopeMutation(wal.context.declaredFiles,options.observedFiles),accepted=options.accepted||unattributedEmptyScopeMutation,settlementFailed=options.settlementFailed===!0||unattributedEmptyScopeMutation;if(wal.state==="COMMITTED"){if(wal.accepted!==accepted||wal.testEngineerExempt!==options.testEngineerExempt||wal.settlementFailed!==settlementFailed)throw Error("CODER_SETTLEMENT_IDEMPOTENCY_CONFLICT");return commitPrepared(options.directory,wal,{landedUnstaged:options.landedUnstaged})}if(wal.state==="ABORTED")throw Error("CODER_SETTLEMENT_IDEMPOTENCY_CONFLICT");if(wal.state==="PREPARED"&&(wal.accepted!==accepted||wal.testEngineerExempt!==options.testEngineerExempt||wal.settlementFailed!==settlementFailed))throw Error("CODER_SETTLEMENT_IDEMPOTENCY_CONFLICT");let prepared={...wal,state:"PREPARED",accepted,testEngineerExempt:options.testEngineerExempt,settlementFailed};if(wal.state!=="PREPARED")await writeWal3(filePath,prepared);liveDispatches.delete(dispatchKey(options.directory,options.taskId,options.transitionId));try{return await commitPrepared(options.directory,prepared,{landedUnstaged:options.landedUnstaged})}finally{let finalWal=await readWal2(filePath,options.taskId);if(finalWal!==null&&finalWal.state==="COMMITTED")liveDispatches.delete(dispatchKey(options.directory,options.taskId,options.transitionId))}})}async function abortCoderSettlement(options){let{outcome,worktree}=await withSettlementLock(options.directory,options.taskId,"coder-abort",async()=>abortDispatchedWalUnderLock(options.directory,options.taskId,options.transitionId,options.reason));if(worktree&&outcome!=="not-dispatched")try{await completeCoderSettlementCleanup(options.directory,options.taskId,options.transitionId)}catch(error93){criticalWarn(`[coder-settlement] aborted settlement worktree cleanup failed for task ${options.taskId}: ${error93 instanceof Error?error93.message:String(error93)}`)}return outcome}async function transferCoderSettlementToBackground(options){return withSettlementLock(options.directory,options.taskId,"coder-background-transfer",async()=>{let filePath=walPath(options.directory,options.taskId),wal=await readWal2(filePath,options.taskId);if(wal===null)return"missing";if(wal.taskId!==options.taskId||wal.transitionId!==options.transitionId)throw Error("CODER_SETTLEMENT_WAL_REPLACED");if(wal.state==="PREPARED")throw Error("CODER_SETTLEMENT_IN_PROGRESS");if(wal.state!=="DISPATCHED")return liveDispatches.delete(dispatchKey(options.directory,options.taskId,options.transitionId)),"already-terminal";let reason="ownership transferred to durable background completion";return await writeWal3(filePath,{...wal,state:"ABORTED",abortReason:reason,cleanupComplete:!0}),liveDispatches.delete(dispatchKey(options.directory,options.taskId,options.transitionId)),await appendSettlementEvent(options.directory,"aborted",wal,{reason,ownership:"background-delegation"}),"transferred"})}async function abortDispatchedWalUnderLock(directory,taskId,transitionId,reason){let filePath=walPath(directory,taskId),wal=await readWal2(filePath,taskId);if(wal===null)throw Error("CODER_SETTLEMENT_WAL_MISSING");if(wal.transitionId!==transitionId)throw Error("CODER_SETTLEMENT_WAL_REPLACED");if(wal.state==="ABORTED")return{outcome:"already-aborted",worktree:wal.worktree!==void 0};if(wal.state!=="DISPATCHED")return{outcome:"not-dispatched",worktree:!1};return await writeWal3(filePath,{...wal,state:"ABORTED",abortReason:reason}),liveDispatches.delete(dispatchKey(directory,taskId,transitionId)),await appendSettlementEvent(directory,"aborted",wal,{reason}),{outcome:"aborted",worktree:wal.worktree!==void 0}}async function abortCoderSettlementIfDoomed(options){let filePath=walPath(options.directory,options.taskId),wal;try{wal=await readWal2(filePath,options.taskId)}catch{return"not-doomed"}if(wal===null)return"not-doomed";if(wal.state==="ABORTED")return"already-aborted";if(wal.transitionId!==options.transitionId||wal.state!=="DISPATCHED")return"not-doomed";if(!baselineAttributionDoomed(wal.context.baseline))return"not-doomed";let outcome=await abortCoderSettlement({directory:options.directory,taskId:options.taskId,transitionId:options.transitionId,reason:doomedReason(wal.context.baseline)});return outcome==="aborted"||outcome==="already-aborted"?outcome:"not-doomed"}async function recordCoderMergeProvenance(options){await withSettlementLock(options.directory,options.taskId,"coder-merge-provenance",async()=>{let filePath=walPath(options.directory,options.taskId),wal=await readWal2(filePath,options.taskId);if(wal===null)throw Error("CODER_SETTLEMENT_WAL_MISSING");if(wal.taskId!==options.taskId||wal.transitionId!==options.transitionId)throw Error("CODER_SETTLEMENT_WAL_REPLACED");if(wal.state!=="DISPATCHED"){if(!(JSON.stringify(wal.mergeProvenance)===JSON.stringify(options.provenance)&&JSON.stringify(wal.observedFiles)===JSON.stringify(options.observedFiles)))throw Error("CODER_SETTLEMENT_IDEMPOTENCY_CONFLICT");return}await writeWal3(filePath,{...wal,mergeProvenance:options.provenance,observedFiles:[...options.observedFiles]})})}function probeBranchExists(directory,branchName){let result=spawnSync13(resolveGitExecutable(),["-C",directory,"show-ref","--verify","--quiet",`refs/heads/${branchName}`],{cwd:directory,stdio:["ignore","ignore","ignore"],timeout:5000,windowsHide:!0});if(result.error)throw result.error;if(result.status===0)return!0;if(result.status===1)return!1;throw Error(`CODER_SETTLEMENT_CLEANUP_UNCERTAIN: git show-ref exited with status ${String(result.status)}`)}async function cleanupRecoveredWorktree(directory,descriptor,options){let retainBranch=options?.retainBranch??descriptor.landedUnstaged===!0,branchExists=()=>_internals90.branchExists(directory,descriptor.branchName),hasResidue=existsSync54(descriptor.worktreePath)||branchExists(),{awaitingMergeByCallID:awaitingMergeByCallID2,cleanupStandardWorktreeForCallId:cleanupStandardWorktreeForCallId2,standardWorktreeByCallID:standardWorktreeByCallID2}=await Promise.resolve().then(() => (init_worktree_isolation(),exports_worktree_isolation));if(standardWorktreeByCallID2.delete(descriptor.callID),hasResidue)awaitingMergeByCallID2.set(descriptor.callID,{callID:descriptor.callID,parentSessionID:descriptor.parentSessionId,taskId:descriptor.taskId,...descriptor.planTaskId?{planTaskId:descriptor.planTaskId}:{},branch:descriptor.branchName,worktreePath:descriptor.worktreePath,mergeStrategy:descriptor.mergeStrategy,queuedAt:Date.now()});if(hasResidue)await cleanupStandardWorktreeForCallId2(descriptor.callID,"success",directory,descriptor.worktreeDir??void 0,retainBranch?{retainBranch:!0}:void 0);if(existsSync54(descriptor.worktreePath)||branchExists()&&!retainBranch)throw Error("CODER_SETTLEMENT_WORKTREE_CLEANUP_UNVERIFIED");let provisioningOwner=descriptor.provisioningOwner??(descriptor.reservationId!==void 0&&descriptor.generation!==void 0?{reservationId:descriptor.reservationId,generation:descriptor.generation,branchName:descriptor.branchName}:void 0);if(!_internals90.removeWorktreeProvisioningOwner(directory,descriptor.callID,provisioningOwner))throw Error("CODER_SETTLEMENT_OWNER_CLEANUP_FAILED")}async function completeCoderSettlementCleanup(directory,taskId,transitionId){await withSettlementLock(directory,taskId,"coder-cleanup",async()=>{let filePath=walPath(directory,taskId),wal=await readWal2(filePath,taskId);if(wal===null)throw Error("CODER_SETTLEMENT_WAL_MISSING");if(wal.taskId!==taskId||wal.transitionId!==transitionId)throw Error("CODER_SETTLEMENT_WAL_REPLACED");if(wal.state!=="COMMITTED"&&wal.state!=="ABORTED")throw Error("CODER_SETTLEMENT_NOT_COMMITTED");if(!wal.worktree||wal.cleanupComplete===!0)return;await cleanupRecoveredWorktree(directory,wal.worktree),await writeWal3(filePath,{...wal,cleanupComplete:!0})})}async function selfHealMissingLaneWorktree(directory,filePath,taskId,transitionId,descriptor,detail){if(existsSync54(descriptor.worktreePath))return!1;if(_internals90.branchExists(directory,descriptor.branchName))return!1;let reason=`CODER_SETTLEMENT_SELF_HEALED_MISSING_WORKTREE: ${detail}`;if((await abortDispatchedWalUnderLock(directory,taskId,transitionId,reason)).outcome==="not-dispatched")return!1;try{await cleanupRecoveredWorktree(directory,descriptor);let healedWal=await readWal2(filePath,taskId);if(healedWal!==null)await writeWal3(filePath,{...healedWal,cleanupComplete:!0})}catch(error93){criticalWarn(`[coder-settlement] self-healed task ${taskId} but residual cleanup failed: ${error93 instanceof Error?error93.message:String(error93)}`)}let message=`STALE_CODER_SETTLEMENT_SELF_HEALED: task ${taskId} was blocked by a coder settlement whose lane worktree "${descriptor.worktreePath}" and lane branch "${descriptor.branchName}" no longer exist. Nothing was recoverable, so the write-ahead log at "${filePath}" was marked terminal (ABORTED) and the task was unblocked. Re-dispatch the task if its work still needs doing.`;return criticalWarn(message),advisoryWarn(message),!0}async function recoverCoderSettlement(directory,taskId){return withSettlementLock(directory,taskId,"coder-recovery",async()=>{let filePath=walPath(directory,taskId),existingWal=await readWal2(filePath,taskId);if(existingWal===null)return null;let wal=existingWal;if(wal.state==="ABORTED")return null;if(wal.state==="COMMITTED"){if(wal.worktree&&wal.cleanupComplete!==!0)await cleanupRecoveredWorktree(directory,wal.worktree),await writeWal3(filePath,{...wal,cleanupComplete:!0});return null}let key2=dispatchKey(directory,taskId,wal.transitionId);if(liveDispatches.has(key2)||wal.processId!==process.pid&&isProcessAlive3(wal.processId))throw Error(`CODER_DISPATCH_IN_PROGRESS: transition ${wal.transitionId} still owns task ${taskId} (${filePath}, state ${wal.state}, pid ${wal.processId}). Wait for that dispatch to settle or run /swarm recover ${taskId} (or /swarm reset-session) to unwedge it; do not remove the WAL by hand.`);if(wal.state==="DISPATCHED"){if(wal.worktree){let worktree=wal.worktree,observed2=wal.observedFiles??await scopedObservedFiles(worktree.worktreePath,wal.context);if(observed2===null)throw Error(`CODER_SETTLEMENT_RECOVERY_UNCERTAIN: transition ${wal.transitionId} for isolated task ${taskId} could not attribute worktree changes to the declared scope (${filePath}, state ${wal.state}). Run /swarm recover ${taskId} (or /swarm reset-session), then retry; do not remove the WAL by hand.`);let unattributedEmptyScopeMutation2=hasUnattributedEmptyScopeMutation(wal.context.declaredFiles,observed2),accepted=observed2.length>0||unattributedEmptyScopeMutation2,settlementFailed=wal.settlementFailed===!0||unattributedEmptyScopeMutation2;if(wal.mergeProvenance){let landed=await reconcileLandedMerge(directory,wal.mergeProvenance);if(landed.landed){let landedUnstaged=landed.method==="worktree-match";wal={...wal,state:"PREPARED",observedFiles:observed2,accepted,settlementFailed,testEngineerExempt:isMarkdownOnlyTaskChange(wal.context.declaredFiles,observed2)},await writeWal3(filePath,wal);let committed2=await commitPrepared(directory,wal,{landedUnstaged});await cleanupRecoveredWorktree(directory,worktree,{retainBranch:landedUnstaged});let reconciledWal=await readWal2(filePath,taskId);if(reconciledWal===null)throw Error("CODER_SETTLEMENT_WAL_MISSING");return await writeWal3(filePath,{...reconciledWal,cleanupComplete:!0}),committed2}if(landed.error)throw Error(`CODER_SETTLEMENT_RECOVERY_UNCERTAIN: transition ${wal.transitionId} for task ${taskId} could not reconcile the landed merge (${filePath}, state ${wal.state}): ${landed.error}. Run /swarm recover ${taskId} (or /swarm reset-session), then retry; do not remove the WAL by hand.`)}let{awaitingMergeByCallID:awaitingMergeByCallID2,finishStandardWorktreeDispatch:finishStandardWorktreeDispatch2,standardWorktreeByCallID:standardWorktreeByCallID2}=await Promise.resolve().then(() => (init_worktree_isolation(),exports_worktree_isolation)),descriptor=wal.worktree,reconstructedDispatch={callID:descriptor.callID,parentSessionID:descriptor.parentSessionId,taskId:descriptor.taskId,...descriptor.planTaskId?{planTaskId:descriptor.planTaskId}:{},handle:{worktreePath:descriptor.worktreePath,branchName:descriptor.branchName,purpose:"lane",id:descriptor.worktreeId,sessionId:descriptor.worktreeSessionId},mergeStrategy:descriptor.mergeStrategy,laneIndex:descriptor.laneIndex,...descriptor.worktreeDir?{worktree_dir:descriptor.worktreeDir}:{}};standardWorktreeByCallID2.delete(descriptor.callID),awaitingMergeByCallID2.set(descriptor.callID,{callID:descriptor.callID,parentSessionID:descriptor.parentSessionId,taskId:descriptor.taskId,...descriptor.planTaskId?{planTaskId:descriptor.planTaskId}:{},branch:descriptor.branchName,worktreePath:descriptor.worktreePath,mergeStrategy:descriptor.mergeStrategy,queuedAt:Date.now()});let recovered=null,mergeResult=await finishStandardWorktreeDispatch2(directory,reconstructedDispatch,void 0,descriptor.callID,{operationId:wal.transitionId,...wal.mergeProvenance?{resume:wal.mergeProvenance}:{},onBeforeMerge:async(provenance)=>{wal={...wal,mergeProvenance:provenance,observedFiles:observed2},await writeWal3(filePath,wal)},onMerged:async(mergedResult)=>{wal={...wal,state:"PREPARED",accepted,settlementFailed,testEngineerExempt:isMarkdownOnlyTaskChange(wal.context.declaredFiles,observed2)},await writeWal3(filePath,wal),recovered=await commitPrepared(directory,wal,{landedUnstaged:mergedResult.strategy==="squash-unstaged"})}});if(mergeResult.outcome!=="merged"||recovered===null){if(mergeResult.outcome==="failed"&&mergeResult.stage===SOURCE_WORKTREE_GONE_STAGE&&await selfHealMissingLaneWorktree(directory,filePath,taskId,wal.transitionId,descriptor,mergeResult.message))return null;throw Error(`CODER_SETTLEMENT_MERGE_RECOVERY_REQUIRED: transition ${wal.transitionId} for task ${taskId} worktree merge-back did not reach merged (${filePath}, state ${wal.state}, outcome ${mergeResult.outcome}${mergeResult.outcome==="failed"&&mergeResult.message?`: ${mergeResult.message}`:""}). Run /swarm recover ${taskId} (or /swarm reset-session), then retry; do not remove the WAL by hand.`)}await cleanupRecoveredWorktree(directory,descriptor,{retainBranch:mergeResult.strategy==="squash-unstaged"});let committedWal=await readWal2(filePath,taskId);if(committedWal===null)throw Error("CODER_SETTLEMENT_WAL_MISSING");return await writeWal3(filePath,{...committedWal,cleanupComplete:!0}),recovered}let rawObserved=await changedFilesSinceSnapshotAsync(directory,wal.context.baseline),unattributedEmptyScopeMutation=hasUnattributedEmptyScopeMutation(wal.context.declaredFiles,rawObserved),observed;if(rawObserved===null){if(baselineAttributionDoomed(wal.context.baseline)){let aborted3=await abortDispatchedWalUnderLock(directory,taskId,wal.transitionId,doomedReason(wal.context.baseline));if(aborted3.outcome==="aborted"||aborted3.outcome==="already-aborted")return null}observed=null}else if(wal.context.declaredFiles===null)observed=[];else observed=unattributedEmptyScopeMutation?rawObserved:rawObserved.filter((filePath2)=>isPathWithinDeclaredScope(filePath2,wal.context.declaredFiles??[],directory));if(observed===null)throw Error(`CODER_SETTLEMENT_RECOVERY_UNCERTAIN: transition ${wal.transitionId} for task ${taskId} workspace changes could not be attributed to the declared scope (${filePath}, state ${wal.state}). Run /swarm recover ${taskId} (or /swarm reset-session), then retry; do not remove the WAL by hand.`);wal={...wal,state:"PREPARED",accepted:observed.length>0,settlementFailed:wal.settlementFailed===!0||unattributedEmptyScopeMutation,testEngineerExempt:isMarkdownOnlyTaskChange(wal.context.declaredFiles,observed)},await writeWal3(filePath,wal)}let committed=await commitPrepared(directory,wal);if(wal.worktree){await cleanupRecoveredWorktree(directory,wal.worktree);let committedWal=await readWal2(filePath,taskId);if(committedWal===null)throw Error("CODER_SETTLEMENT_WAL_MISSING");await writeWal3(filePath,{...committedWal,cleanupComplete:!0})}return committed})}function releaseCoderDispatchOwnership(directory,taskId,transitionId){liveDispatches.delete(dispatchKey(directory,taskId,transitionId))}async function assertNoUnsettledCoderDispatch(directory,taskId){let filePath=walPath(directory,taskId),wal=await readWal2(filePath,taskId);if(wal===null)return;if(wal.state==="DISPATCHED"||wal.state==="PREPARED")throw Error(`CODER_SETTLEMENT_RECOVERY_REQUIRED: transition ${wal.transitionId} must settle before task ${taskId} can change plan status (${filePath}, state ${wal.state}). Run /swarm recover ${taskId} (or /swarm reset-session), then retry.`)}async function listCoderSettlementWalStates(directory){let entries;try{let dirPath=validateSwarmPath(directory,"coder-settlements");entries=await readdir6(dirPath)}catch{return{states:[],truncated:!1}}let matching=entries.filter((entry)=>SETTLEMENT_WAL_FILE_PATTERN.test(entry)),states=[];for(let entry of matching.sort().slice(0,MAX_SETTLEMENT_WAL_SCAN)){let taskId=entry.slice(0,-5);try{let wal=await readWal2(walPath(directory,taskId),taskId);if(wal===null)continue;states.push({taskId,state:wal.state,transitionId:wal.transitionId,processId:wal.processId,recordedAt:wal.recordedAt,accepted:wal.accepted===!0?!0:void 0,declaredFiles:wal.context?.declaredFiles??null,expectedGeneration:wal.expectedGeneration,ownedInProcess:liveDispatches.has(dispatchKey(directory,taskId,wal.transitionId)),ownedByLiveForeignPid:wal.processId!==process.pid&&isProcessAlive3(wal.processId)})}catch{states.push({taskId,state:"unreadable",ownedInProcess:!1,ownedByLiveForeignPid:!1})}}return{states,truncated:matching.length>MAX_SETTLEMENT_WAL_SCAN}}async function recoverStaleCoderSettlements(directory,options){let{states:listed,truncated}=await listCoderSettlementWalStates(directory),filter=options?.taskIds?new Set(options.taskIds):void 0,results=[];for(let entry of listed){if(filter&&!filter.has(entry.taskId))continue;if(entry.state==="unreadable"){results.push({taskId:entry.taskId,outcome:"unreadable_wal"});continue}if(entry.state==="ABORTED"||entry.state==="COMMITTED"){try{await _internals90.recoverCoderSettlement(directory,entry.taskId),results.push({taskId:entry.taskId,outcome:"already_terminal",state:entry.state})}catch(error93){results.push({taskId:entry.taskId,outcome:"error",message:error93 instanceof Error?error93.message:String(error93)})}continue}if(entry.ownedInProcess&&options?.force!==!0){results.push({taskId:entry.taskId,outcome:"owned_in_process",transitionId:entry.transitionId??""});continue}if(entry.ownedByLiveForeignPid){results.push({taskId:entry.taskId,outcome:"owned_by_live_foreign_pid",processId:entry.processId??-1});continue}let forced=entry.ownedInProcess&&options?.force===!0;if(forced&&entry.transitionId)releaseCoderDispatchOwnership(directory,entry.taskId,entry.transitionId),await appendSettlementEvent(directory,"recovered",{taskId:entry.taskId,transitionId:entry.transitionId,actor:"swarm-recovery"},{forced:!0,stage:"ownership-release"});try{let recovered=await _internals90.recoverCoderSettlement(directory,entry.taskId);if(recovered===null){let current=null;try{current=await readWal2(walPath(directory,entry.taskId),entry.taskId)}catch{current=null}if(current&&(current.state==="COMMITTED"||current.state==="ABORTED")){results.push({taskId:entry.taskId,outcome:"already_terminal",state:current.state});continue}results.push({taskId:entry.taskId,outcome:"error",message:"settlement WAL disappeared during recovery"});continue}await appendSettlementEvent(directory,"recovered",{taskId:entry.taskId,transitionId:entry.transitionId??"",actor:"swarm-recovery"},{forced,accepted:recovered.accepted,previousTransitionId:entry.transitionId??"",previousState:entry.state,...typeof entry.expectedGeneration==="number"?{expectedGeneration:entry.expectedGeneration}:{}}),results.push({taskId:entry.taskId,outcome:"recovered",accepted:recovered.accepted,forced})}catch(error93){let message=error93 instanceof Error?error93.message:String(error93);await appendSettlementEvent(directory,"recovery-failed",{taskId:entry.taskId,transitionId:entry.transitionId??"",actor:"swarm-recovery"},{forced,error:message}),results.push({taskId:entry.taskId,outcome:"error",message})}}return{results,truncated}}var LIVE_DISPATCHES_SYMBOL,globalRegistry3,liveDispatches,runtimeId,MAX_LIVE_DISPATCHES=512,MAX_SETTLEMENT_WAL_SCAN=200,SETTLEMENT_WAL_FILE_PATTERN,_internals90;var init_coder_settlement=__esm(()=>{init_workspace_snapshot();init_core_events();init_gate_evidence();init_gate_evidence_classification();init_worktree_provisioning_owner();init_utils2();init_file_locks();init_path_identity();init_warning_buffer();init_canonical_root();init_git_executable();init_logger();init_merge2();init_workflow_wal_file();LIVE_DISPATCHES_SYMBOL=Symbol.for("opencode-swarm.workflow.coder-settlement.live-dispatches"),globalRegistry3=globalThis;if(!globalRegistry3[LIVE_DISPATCHES_SYMBOL])globalRegistry3[LIVE_DISPATCHES_SYMBOL]=new Set;liveDispatches=globalRegistry3[LIVE_DISPATCHES_SYMBOL],runtimeId=randomUUID14();SETTLEMENT_WAL_FILE_PATTERN=/^[\w.\-:]+\.json$/;_internals90={liveDispatches,removeWorktreeProvisioningOwner,branchExists:probeBranchExists,recoverCoderSettlement}});var exports_pending_delegations={};__export(exports_pending_delegations,{writeDelegationFallback:()=>writeDelegationFallback,updateCoderSettlement:()=>updateCoderSettlement,sweepStaleDelegations:()=>sweepStaleDelegations,scanDelegationsForRecovery:()=>scanDelegationsForRecovery,scanDelegationFallbacksForRecovery:()=>scanDelegationFallbacksForRecovery,scanBackgroundCoderReservationsForAdmission:()=>scanBackgroundCoderReservationsForAdmission,reserveBackgroundCoderSlot:()=>reserveBackgroundCoderSlot,replacePendingBackgroundAdvisory:()=>replacePendingBackgroundAdvisory,removeDelegationFallback:()=>removeDelegationFallback,releasePreparedBackgroundAdvisories:()=>releasePreparedBackgroundAdvisories,releaseBackgroundCoderReservation:()=>releaseBackgroundCoderReservation,registerStaleSweepObserver:()=>registerStaleSweepObserver,registerLegacyCoderSettlementReconciler:()=>registerLegacyCoderSettlementReconciler,recordPendingDelegationDetailed:()=>recordPendingDelegationDetailed,recordPendingDelegation:()=>recordPendingDelegation,recordDelegationIngestionResult:()=>recordDelegationIngestionResult,readDelegationsDetailed:()=>readDelegationsDetailed,readDelegations:()=>readDelegations,readDelegationFallback:()=>readDelegationFallback,putPendingBackgroundAdvisory:()=>putPendingBackgroundAdvisory,publishPrReviewResultReceipt:()=>publishPrReviewResultReceipt,promoteDelegationFallback:()=>promoteDelegationFallback,preparePendingBackgroundAdvisories:()=>preparePendingBackgroundAdvisories,normalizeBackgroundObservedFiles:()=>normalizeBackgroundObservedFiles,markLegacyCoderSettlementTransferPending:()=>markLegacyCoderSettlementTransferPending,maintainBackgroundDelegations:()=>maintainBackgroundDelegations,listDelegationFallbacks:()=>listDelegationFallbacks,isUnsettledWorktreeOwner:()=>isUnsettledWorktreeOwner,isTerminalDelegationStatus:()=>isTerminalDelegationStatus,findOpenAsyncLaneBatches:()=>findOpenAsyncLaneBatches,findDelegationForCompletion:()=>findDelegationForCompletion,findByCorrelationIdDetailed:()=>findByCorrelationIdDetailed,findByCorrelationId:()=>findByCorrelationId,findByBatchIdDetailed:()=>findByBatchIdDetailed,findByBatchId:()=>findByBatchId,compactBackgroundDelegations:()=>compactBackgroundDelegations,clearLegacyCoderSettlementTransferPending:()=>clearLegacyCoderSettlementTransferPending,claimTerminalResult:()=>claimTerminalResult,claimDelegationIngestion:()=>claimDelegationIngestion,claimCoderSettlement:()=>claimCoderSettlement,buildTypedDelegationTerminal:()=>buildTypedDelegationTerminal,buildPromptSnapshot:()=>buildPromptSnapshot,buildBackgroundCompletionEventId:()=>buildBackgroundCompletionEventId,buildBackgroundCoderReservationId:()=>buildBackgroundCoderReservationId,bindBackgroundCoderReservation:()=>bindBackgroundCoderReservation,appendDelegationTransition:()=>appendDelegationTransition,acknowledgeObservedBackgroundAdvisories:()=>acknowledgeObservedBackgroundAdvisories,_internals:()=>_internals91,_checkpointInternals:()=>_checkpointInternals,TOMBSTONE_MIN_AGE_MS:()=>TOMBSTONE_MIN_AGE_MS,MAX_RECOVERY_LEDGER_BYTES:()=>MAX_RECOVERY_LEDGER_BYTES,MAX_LIVE_BACKGROUND_FALLBACKS:()=>MAX_LIVE_BACKGROUND_FALLBACKS,MAX_LIVE_BACKGROUND_CODER_RESERVATIONS:()=>MAX_LIVE_BACKGROUND_CODER_RESERVATIONS,MAX_CHECKPOINT_RECORDS:()=>MAX_CHECKPOINT_RECORDS,MAX_CHECKPOINT_BYTES:()=>MAX_CHECKPOINT_BYTES,MAX_BACKGROUND_OBSERVED_FILES:()=>MAX_BACKGROUND_OBSERVED_FILES,MAX_BACKGROUND_ADVISORY_CHARS:()=>MAX_BACKGROUND_ADVISORY_CHARS,LEGACY_CODER_SETTLEMENT_PENDING_ADVISORY_MARKER:()=>LEGACY_CODER_SETTLEMENT_PENDING_ADVISORY_MARKER,DELEGATION_READ_RETRY_DELAY_MS:()=>DELEGATION_READ_RETRY_DELAY_MS,DELEGATION_COMPACTION_LOW_WATER_BYTES:()=>DELEGATION_COMPACTION_LOW_WATER_BYTES,DELEGATION_COMPACTION_HIGH_WATER_BYTES:()=>DELEGATION_COMPACTION_HIGH_WATER_BYTES,DEFAULT_SWEEPABLE_DELEGATION_STATUSES:()=>DEFAULT_SWEEPABLE_DELEGATION_STATUSES,DEFAULT_STALE_DELEGATION_TIMEOUT_MS:()=>DEFAULT_STALE_DELEGATION_TIMEOUT_MS,BACKGROUND_INGESTION_LEASE_MS:()=>BACKGROUND_INGESTION_LEASE_MS,BACKGROUND_DELEGATION_FALLBACK_DIR:()=>BACKGROUND_DELEGATION_FALLBACK_DIR,BACKGROUND_DELEGATIONS_MANIFEST_FILE:()=>BACKGROUND_DELEGATIONS_MANIFEST_FILE,BACKGROUND_DELEGATIONS_FILE:()=>BACKGROUND_DELEGATIONS_FILE,BACKGROUND_DELEGATIONS_CHECKPOINT_FILE:()=>BACKGROUND_DELEGATIONS_CHECKPOINT_FILE,BACKGROUND_CODER_RESERVATION_LEASE_MS:()=>BACKGROUND_CODER_RESERVATION_LEASE_MS,BACKGROUND_CODER_RESERVATION_LEASE_MIN_MS:()=>BACKGROUND_CODER_RESERVATION_LEASE_MIN_MS,BACKGROUND_CODER_RESERVATION_LEASE_MAX_MS:()=>BACKGROUND_CODER_RESERVATION_LEASE_MAX_MS,BACKGROUND_CODER_RESERVATIONS_FILE:()=>BACKGROUND_CODER_RESERVATIONS_FILE});import{createHash as createHash47}from"node:crypto";import*as fs67 from"node:fs";import*as path104 from"node:path";import{isDeepStrictEqual}from"node:util";function clampReservationLeaseMs(leaseMs){if(leaseMs===void 0)return BACKGROUND_CODER_RESERVATION_LEASE_MS;if(!Number.isFinite(leaseMs))return BACKGROUND_CODER_RESERVATION_LEASE_MS;return Math.min(Math.max(Math.round(leaseMs),BACKGROUND_CODER_RESERVATION_LEASE_MIN_MS),BACKGROUND_CODER_RESERVATION_LEASE_MAX_MS)}function isValidReservationGeneration(generation){return generation===void 0||Number.isInteger(generation)&&generation>=1&&generation<=MAX_BACKGROUND_DELEGATION_GENERATION}function storePath5(directory){return validateSwarmPath(directory,BACKGROUND_DELEGATIONS_FILE)}function checkpointPath2(directory){return validateSwarmPath(directory,BACKGROUND_DELEGATIONS_CHECKPOINT_FILE)}function manifestPath(directory){return validateSwarmPath(directory,BACKGROUND_DELEGATIONS_MANIFEST_FILE)}function importedShadowPath2(filePath){return`${filePath}.imported`}function projectionMarkerPath2(filePath){return`${filePath}.sqlite-projection`}function coordinationReservationLeaseKey(reservation){return{namespace:RESERVATION_LEASE_NAMESPACE,entityKey:reservation.reservationId,generation:reservation.generation??1,ownerToken:reservation.reservationId}}function releaseReservationLeaseIfPresent(directory,reservation){let leaseKey=coordinationReservationLeaseKey(reservation),existing=getCoordinationLease(directory,leaseKey.namespace,leaseKey.entityKey);if(!existing)return;if(existing.generation!==leaseKey.generation||existing.ownerToken!==leaseKey.ownerToken||!releaseCoordinationLease(directory,leaseKey.namespace,leaseKey.entityKey,leaseKey.generation,leaseKey.ownerToken))throw Error(`reservation lease authority mismatch for ${reservation.reservationId}`)}function coordinationRowsToDelegations(directory){if(!projectDbExists(directory))return null;try{let rows=listCoordinationStates(directory,DELEGATION_COORDINATION_NAMESPACE,MAX_COORDINATION_STATE_LIST_ROWS);if(rows.length>=MAX_COORDINATION_STATE_LIST_ROWS)throw Error(`delegation coordination read reached its ${MAX_COORDINATION_STATE_LIST_ROWS}-row safety bound`);return rows.map((row)=>{let parsed=RecordSchema2.safeParse(JSON.parse(row.payload));if(!parsed.success)throw Error(`delegation coordination row failed schema validation for ${row.entityKey}`);if(parsed.data.correlationId!==row.entityKey)throw Error(`delegation coordination row authority binding mismatch: payload correlationId does not equal entity key ${row.entityKey}`);if(Math.max(parsed.data.generation??1,1)!==row.generation)throw Error(`delegation coordination row authority binding mismatch: payload generation does not equal row generation for ${row.entityKey}`);if(parsed.data.status!==row.status)throw Error(`delegation coordination row authority binding mismatch: payload status does not equal row status for ${row.entityKey}`);return parsed.data}).sort((left,right)=>left.createdAt===right.createdAt?left.correlationId.localeCompare(right.correlationId):left.createdAt-right.createdAt)}catch(error93){return recordLedgerUncertainty(directory,error93 instanceof Error?error93.message:String(error93),"coordination-read"),null}}function archiveShadowFileBestEffort2(filePath){if(!fs67.existsSync(filePath))return;let importedPath=importedShadowPath2(filePath);try{if(fs67.existsSync(importedPath))return;fs67.renameSync(filePath,importedPath)}catch(error93){warn(`[background] shadow archive failed for ${path104.basename(filePath)}: ${error93 instanceof Error?error93.message:String(error93)}`)}}function writeDelegationShadowProjection(directory,records){ensureSwarmDir4(directory);let payload=records.map((record3)=>JSON.stringify(record3)).join(`
|
|
@@ -4100,8 +4100,8 @@ Actionability (direct text only; required unless knowledge.promotion_require_act
|
|
|
4100
4100
|
`)}
|
|
4101
4101
|
`,"utf-8"),invalidateCachedArtifact(filePath)}catch{}}function deriveAction(tool3){let toolLower=normalizeToolNameLowerCase(tool3??"");if(isTaskToolId(tool3))return"delegate";if(["write","edit","apply_patch","swarm_apply_patch"].includes(toolLower))return"edit";if(["read","glob","grep","search"].includes(toolLower))return"read";if(["bash","shell"].includes(toolLower))return"execute";if(toolLower==="test_runner")return"test";return"tool_use"}function fnv1aHex(text){let hash5=2166136261;for(let i=0;i<text.length;i++)hash5^=text.charCodeAt(i),hash5=Math.imul(hash5,16777619)>>>0;return hash5.toString(16).padStart(8,"0")}function redactCommandSecrets(text){let redacted=redactSecrets(text).replace(URL_CREDENTIALS_PATTERN,"$1[REDACTED:url_credentials]@"),beginMarker=redacted.search(/-----BEGIN [A-Z ]*PRIVATE KEY-----/);return beginMarker===-1?redacted:`${redacted.slice(0,beginMarker)}[REDACTED:private_key_block]`}function normalizeCommandTarget(command){let normalized=command.trim().replace(/\s+/g," "),bounded=normalized.length>MAX_COMMAND_TARGET_LENGTH?`${normalized.slice(0,MAX_COMMAND_TARGET_LENGTH-3)}...`:normalized,redacted=redactCommandSecrets(bounded);if(redacted===bounded)return redacted;let prefix=`#${fnv1aHex(bounded)} `,room=MAX_COMMAND_TARGET_LENGTH-prefix.length,body=redacted.length>room?`${redacted.slice(0,room-3)}...`:redacted;return`${prefix}${body}`}function extractTarget(tool3,args2){if(!args2)return"";if(tool3.toLowerCase()==="task"){let subagentType=args2.subagent_type;if(typeof subagentType==="string"&&subagentType.length>0)return subagentType}let targetFields=["filePath","path","file","target"];for(let field of targetFields){let value=args2[field];if(typeof value==="string"&&value.length>0)return value}let toolLower=tool3.toLowerCase();if(toolLower==="bash"||toolLower==="shell"||toolLower==="execute"||toolLower==="command"){let command=args2.command;if(typeof command==="string"&&command.trim().length>0)return normalizeCommandTarget(command);let description=args2.description;if(typeof description==="string"&&description.length>0){let safeDescription=redactCommandSecrets(description.slice(0,REDACTION_SCAN_WINDOW));return safeDescription.length>30?`${safeDescription.slice(0,27)}...`:safeDescription}let argsStr=args2.args;if(typeof argsStr==="string"&&argsStr.trim().length>0)return normalizeCommandTarget(argsStr)}return""}function extractIntent(tool3,args2){if(!args2)return"";if(tool3.toLowerCase()==="task"){let{prompt,description}=args2,safeText=redactCommandSecrets((typeof prompt==="string"?prompt:typeof description==="string"?description:"").slice(0,REDACTION_SCAN_WINDOW));if(safeText.length>100)return`${safeText.slice(0,97)}...`;return safeText}let intentFields=["description","task"];for(let field of intentFields){let value=args2[field];if(typeof value==="string"&&value.length>0){let safe=redactCommandSecrets(value.slice(0,REDACTION_SCAN_WINDOW));return safe.length>200?`${safe.slice(0,197)}...`:safe}}return""}function mapResult(verdict){if(verdict==="success")return"success";if(verdict==="failure")return"failure";return"pending"}function stepSeedKey(sessionId,directory){return`${trajectoryStepGeneration()}:${compositeSessionKey(directory,sessionId)}`}function markStepSeedGate(gateKey){if(stepSeedGate.has(gateKey))return;while(stepSeedGate.size>=MAX_STEP_SEED_GATE_SESSIONS){let oldest=stepSeedGate.keys().next().value;if(oldest===void 0)break;stepSeedGate.delete(oldest)}stepSeedGate.set(gateKey,!0)}async function ensureSessionStepSeeded(sessionId,directory){let gateKey=stepSeedKey(sessionId,directory);if(stepSeedGate.has(gateKey))return;let inFlight=stepSeedPromises.get(gateKey);if(inFlight!==void 0){await inFlight;return}let promise3=(async()=>{let lastStep=await getCurrentStep(sessionId,directory);if(lastStep>0)seedTrajectoryStepCounter(sessionId,directory,lastStep);markStepSeedGate(gateKey)})().catch(()=>{markStepSeedGate(gateKey)}).finally(()=>{stepSeedPromises.delete(gateKey)});stepSeedPromises.set(gateKey,promise3),await promise3}function invalidateStepSeedGate(sessionId){if(sessionId===void 0){stepSeedGate.clear();return}let suffix=sessionKeySuffix(sessionId);for(let gateKey of stepSeedGate.keys())if(gateKey.endsWith(suffix))stepSeedGate.delete(gateKey)}function createTrajectoryLoggerHook(config3,_directory2){let enabled=config3.enabled??!0,maxLines=config3.max_lines??500;return{toolAfter:async(input,output)=>{if(!enabled)return;let sessionId=input.sessionID;if(consumeDeniedCallMarker(sessionId,input.callID)){callStartTimes.delete(`${sessionId}:${input.callID}`);return}let session=swarmState.agentSessions.get(sessionId);if(!session?.delegationActive)return;let taskId=session.currentTaskId;if(!taskId)return;let startKey=`${sessionId}:${input.callID}`,startTime=callStartTimes.get(startKey)??Date.now();callStartTimes.delete(startKey);let elapsed_ms=Date.now()-startTime,agentName=swarmState.activeAgent.get(sessionId)??session?.agentName??"unknown",args_summary=summarizeArgs(input.args,200),verdict=deriveVerdict(output);await ensureSessionStepSeeded(sessionId,_directory2);let step=nextTrajectoryStep(sessionId,_directory2),action2=deriveAction(input.tool),target=extractTarget(input.tool,input.args),intent=extractIntent(input.tool,input.args),result=mapResult(verdict),entry={step,agent:agentName,action:action2,target,intent,timestamp:new Date().toISOString(),result,tool:input.tool,args_summary,verdict,elapsed_ms},sanitized=sanitizeTaskId2(taskId),relativePath2=path254.join("evidence",sanitized,"trajectory.jsonl"),trajectoryPath=validateSwarmPath(_directory2,relativePath2);try{await fs143.mkdir(path254.dirname(trajectoryPath),{recursive:!0});let line=`${JSON.stringify(entry)}
|
|
4102
4102
|
`;await fs143.appendFile(trajectoryPath,line,"utf-8"),await truncateTrajectoryFile(trajectoryPath,maxLines)}catch{}try{await appendTrajectoryEntry(sessionId,entry,_directory2,maxLines)}catch{}}}}function markDeniedCall(sessionId,callID){if(!callID)return;let now2=Date.now();for(let[key3,expiresAt]of deniedCallMarkers)if(expiresAt<=now2)deniedCallMarkers.delete(key3);let key2=`${sessionId}:${callID}`;deniedCallMarkers.delete(key2),deniedCallMarkers.set(key2,now2+DENIED_CALL_TTL_MS);while(deniedCallMarkers.size>MAX_DENIED_CALL_MARKERS){let oldest=deniedCallMarkers.keys().next().value;if(oldest===void 0||oldest===key2)break;deniedCallMarkers.delete(oldest)}}function consumeDeniedCallMarker(sessionId,callID){if(!callID)return!1;let key2=`${sessionId}:${callID}`,expiresAt=deniedCallMarkers.get(key2);if(expiresAt===void 0)return!1;return deniedCallMarkers.delete(key2),expiresAt>Date.now()}async function recordDeniedToolCall(sessionID,input,errorMessage2,directory,options){try{let session=swarmState.agentSessions.get(sessionID);if(!session?.delegationActive)return;let maxLines=options?.maxLines??500,startKey=`${sessionID}:${input.callID}`,startTime=callStartTimes.get(startKey);if(startTime!==void 0)callStartTimes.delete(startKey);let elapsed_ms=startTime===void 0?0:Date.now()-startTime,agentName=swarmState.activeAgent.get(sessionID)??session.agentName??"unknown",code=deriveGateDenialCode(errorMessage2);await ensureSessionStepSeeded(sessionID,directory);let entry={step:nextTrajectoryStep(sessionID,directory),agent:agentName,action:deriveAction(input.tool),target:extractTarget(input.tool,input.args),intent:`denied: ${code}`,timestamp:new Date().toISOString(),result:"failure",tool:input.tool,args_summary:summarizeArgs(input.args,200),verdict:"failure",elapsed_ms,callID:input.callID};markDeniedCall(sessionID,input.callID);try{await appendTrajectoryEntry(sessionID,entry,directory,maxLines)}catch{}let taskId=session.currentTaskId;if(!taskId)return;try{let relativePath2=path254.join("evidence",sanitizeTaskId2(taskId),"trajectory.jsonl"),trajectoryPath=validateSwarmPath(directory,relativePath2);await fs143.mkdir(path254.dirname(trajectoryPath),{recursive:!0}),await fs143.appendFile(trajectoryPath,`${JSON.stringify(entry)}
|
|
4103
|
-
`,"utf-8"),await truncateTrajectoryFile(trajectoryPath,maxLines)}catch{}}catch{}}function clearTrajectoryStep(sessionId){clearTrajectoryStepCounters(sessionId),invalidateStepSeedGate(sessionId)}function summarizeArgs(args2,maxLength){if(!args2||Object.keys(args2).length===0)return"";let summaries=[];for(let[key2,value]of Object.entries(args2)){if(SENSITIVE_FIELDS.has(key2)||isSensitiveKey(key2)){summaries.push(`${key2}:[REDACTED]`);continue}if(value===null||value===void 0)summaries.push(`${key2}:null`);else if(typeof value==="string"){let window2=value.slice(0,REDACTION_SCAN_WINDOW),redacted=redactCommandSecrets(window2),truncated=redacted.length>50?`${redacted.slice(0,50)}...`:redacted;summaries.push(`${key2}:"${truncated}"`)}else if(typeof value==="number"||typeof value==="boolean")summaries.push(`${key2}:${String(value)}`);else if(Array.isArray(value)){let itemSummary=value.length>3?`${value.slice(0,3).map(String).join(",")},...(+${value.length-3})`:value.map(String).join(",");summaries.push(`${key2}:[${itemSummary}]`)}else if(typeof value==="object"){let keys=Object.keys(value);summaries.push(`${key2}:{${keys.join(",")}}`)}else summaries.push(`${key2}:${typeof value}`)}let summary=summaries.join(" ");return summary.length>maxLength?`${summary.slice(0,maxLength-3)}...`:summary}function deriveVerdict(output){if(output.metadata&&typeof output.metadata==="object"&&!Array.isArray(output.metadata)){let meta3=output.metadata;if(typeof meta3.verdict==="string"&&meta3.verdict.length>0)return meta3.verdict;if(meta3.success===!1||meta3.passed===!1)return"failure";if(meta3.success===!0||meta3.passed===!0)return"success"}let outputStr=String(output.output??"");if(outputStr.startsWith("Error:")||outputStr.startsWith("error:")||outputStr.startsWith("Error: "))return"failure";return"success"}var callStartTimes,SENSITIVE_FIELDS,SENSITIVE_SUBSTRINGS,URL_CREDENTIALS_PATTERN,REDACTION_SCAN_WINDOW=4096,MAX_COMMAND_TARGET_LENGTH=200,stepSeedGate,MAX_STEP_SEED_GATE_SESSIONS=500,stepSeedPromises,MAX_DENIED_CALL_MARKERS=500,DENIED_CALL_TTL_MS=300000,deniedCallMarkers;var init_trajectory_logger=__esm(()=>{init_manager2();init_redaction();init_trajectory_store();init_state2();init_canonical_root();init_swarm_artifact_cache();init_gate_denial_tracker();init_normalize_tool_name();init_trajectory_step_state();init_utils2();callStartTimes=new Map,SENSITIVE_FIELDS=new Set(["password","token","secret","api_key","apikey","authorization","access_token","refresh_token","private_key","secret_key","credential","auth","bearer","x-api-key","session_id","cookie"]),SENSITIVE_SUBSTRINGS=["key","secret","token","password","auth","credential","private","certificate","bearer","session","cookie"];URL_CREDENTIALS_PATTERN=/\b([a-zA-Z][a-zA-Z0-9+.-]*:\/\/)[^\s/@:]+:[^\s/@]+@/g;stepSeedGate=new Map,stepSeedPromises=new Map;deniedCallMarkers=new Map});import*as fs144 from"node:fs";import*as path255 from"node:path";function errorMessage2(err){if(err instanceof Error)return err.message;return String(err)}async function releaseKnowledgeGateObligations(directory,sessionID){let results=[],live;try{live=await _internals202.queryLiveMemberships(directory,{session_id:sessionID,include_terminal:!0})}catch(err){return[`⚠️ Knowledge gate state not cleared: receipt authority unavailable (${errorMessage2(err)})`]}if(!live.ok)return[`⚠️ Knowledge gate state not cleared: receipt authority unavailable (${live.code})`];let pending=live.memberships.filter((membership)=>membership.exposure_kind==="architect_directive"&&!membership.application_marker&&membership.gate_release?.membership_event_id!==membership.membership_event_id);if(pending.length===0)return["⏭️ No pending knowledge gate obligations for this session"];let byTrace=new Map;for(let membership of pending){let group=byTrace.get(membership.trace_id)??[];group.push(membership),byTrace.set(membership.trace_id,group)}let committedCount=0,releasedPairs=[];for(let[traceId,group]of byTrace){let committed=await _internals202.commitGateReleaseBatch(directory,{trace_id:traceId,session_id:sessionID,items:group.map((membership)=>({entry_id:membership.entry_id,source:"application_gate_session_reset_release",reason:"/swarm reset-session operator escape (#2398)"}))});if(!committed.ok){results.push(`⚠️ Failed to release knowledge gate obligations on trace ${sanitizeDiagnosticText(traceId,64)}: ${committed.code}`);continue}committedCount+=committed.committed.length;for(let item of committed.committed)releasedPairs.push(`${traceId}/${item.entry_id}`);if(committed.rejected.length>0)results.push(`⚠️ Partially released trace ${sanitizeDiagnosticText(traceId,64)}: ${
|
|
4104
|
-
`);throw snapshotResetGuard.closeError}}catch(err){results.push(`⚠️ Snapshot coordination close failed (continuing with reset): ${errorMessage2(err)}`)}try{let backup=_internals202.backupSwarmStateBeforeReset(directory,"reset-session",["session"]);if(backup.backupDir&&backup.copied.length>0){let rel=path255.relative(directory,backup.backupDir);results.push(`\uD83D\uDCE6 Backed up session state to ${rel}/ (restore by copying files back into .swarm/session/)`)}for(let w of backup.warnings)results.push(`⚠️ Backup warning: ${w}`)}catch(err){results.push(`⚠️ Auto-backup failed (continuing with reset): ${err instanceof Error?err.message:String(err)}`)}let snapshotAuthorityCleared=!1;try{let removed=_internals202.clearSnapshotRows(directory);snapshotAuthorityCleared=!0,results.push(removed>0?`✅ Deleted ${removed} authoritative session snapshot row(s)`:"⏭️ SQLite session snapshot already clean")}catch(err){results.push(`❌ Failed to clear SQLite session snapshot: ${errorMessage2(err)}`)}let snapshotProjectionCleared=!0;try{let projectionPath=validateSwarmPath(directory,SNAPSHOT_PROJECTION_FILE);if(fs144.existsSync(projectionPath))fs144.unlinkSync(projectionPath),results.push(`✅ Deleted .swarm/${SNAPSHOT_PROJECTION_FILE}`)}catch(err){snapshotProjectionCleared=!1,results.push(`❌ Failed to delete ${SNAPSHOT_PROJECTION_FILE}: ${errorMessage2(err)}`)}let statePath3,legacySnapshotCleared=!0;try{if(statePath3=validateSwarmPath(directory,"session/state.json"),fs144.existsSync(statePath3))fs144.unlinkSync(statePath3),results.push("✅ Deleted .swarm/session/state.json");else results.push("⏭️ state.json not found (already clean)")}catch{legacySnapshotCleared=!1,results.push("❌ Failed to delete state.json")}let sessionDir=statePath3?path255.dirname(statePath3):void 0,sessionFiles=[];if(sessionDir&&fs144.existsSync(sessionDir))try{sessionFiles=fs144.readdirSync(sessionDir)}catch(err){results.push(`❌ Failed to read session directory: ${errorMessage2(err)}`)}for(let file3 of sessionFiles){if(file3==="state.json"||file3===path255.basename(SNAPSHOT_PROJECTION_FILE))continue;let filePath=path255.join(sessionDir,file3);try{if(!fs144.existsSync(filePath))continue;if(!fs144.lstatSync(filePath).isFile())continue;fs144.unlinkSync(filePath),results.push(`✓ Deleted ${file3}`)}catch(err){results.push(`❌ Failed to delete ${file3}: ${errorMessage2(err)}`)}}let sessionCount=swarmState.agentSessions.size;for(let[sessionId,session]of swarmState.agentSessions)resetPrmSessionState(session,sessionId),clearTrajectoryStep(sessionId);swarmState.agentSessions.clear(),clearSnapshotSessionOwnerships(),results.push(`✅ Cleared ${sessionCount} in-memory agent session(s)`);try{let swept=clearAllSessionOverrides(directory);if(swept>0)results.push(`✅ Cleared ${swept} durable session QA override row(s)`)}catch(err){results.push(`⚠️ Durable session QA override sweep failed: ${errorMessage2(err)}`)}if(sessionID)clearSessionActionCircuits(sessionID),results.push("✅ Released this session’s guardrail circuit(s) (audited; re-delegate to re-arm)");let chainCount=swarmState.delegationChains.size;swarmState.delegationChains.clear(),results.push(`✅ Cleared ${chainCount} delegation chain(s)`);let activeAgentCount=swarmState.activeAgent.size;if(swarmState.activeAgent.clear(),results.push(`✅ Cleared ${activeAgentCount} active-agent mapping(s)`),snapshotResetGuard&&snapshotAuthorityCleared&&snapshotProjectionCleared&&legacySnapshotCleared)snapshotResetGuard.release();if(sessionID)try{results.push(...await _internals202.releaseKnowledgeGateObligations(directory,sessionID))}catch(err){results.push(`⚠️ Knowledge gate state not cleared: ${errorMessage2(err)}`)}else results.push("⚠️ Knowledge gate obligations not released: no session context on this invocation");if(sessionID)try{let{existsSync:existsSync133,rmSync:rmSync32}=await import("node:fs"),sessionBindingDir=validateSwarmPath(directory,`${STAGE_B_BINDINGS_DIR}/${stageBSessionDirName(sessionID)}`);if(existsSync133(sessionBindingDir))rmSync32(sessionBindingDir,{recursive:!0,force:!0}),results.push("✅ Deleted stage-b-dispatch-bindings for this session")}catch{results.push("⚠️ Stage B durable bindings not cleared (best-effort; TTL prune collects them)")}swarmState.gateDenialCounts.clear(),swarmState.currentCriticalShownIds.clear(),results.push("✅ Cleared in-memory knowledge gate denial state");let preserveWorktrees=!1;try{let{results:settlementResults,truncated}=await _internals202.recoverStaleCoderSettlements(directory,{force:!0});if(settlementResults.length===0)results.push("⏭️ No coder settlements to recover");for(let outcome of settlementResults)switch(outcome.outcome){case"recovered":results.push(`✅ Recovered coder settlement ${outcome.taskId} (${outcome.accepted?"changes attributed":"no workspace change to attribute"})`);break;case"already_terminal":results.push(`⏭️ Coder settlement ${outcome.taskId} already ${outcome.state}`);break;case"owned_in_process":results.push(`ℹ️ Coder settlement ${outcome.taskId} still registered in flight (${sanitizeDiagnosticText(outcome.transitionId)}) — its dispatch may be genuinely running; not force-recovered`);break;case"owned_by_live_foreign_pid":results.push(`ℹ️ Coder settlement ${outcome.taskId} owned by live process pid ${outcome.processId} (another OpenCode instance) — not touched; run /swarm recover there after closing it`);break;case"unreadable_wal":results.push(`⚠️ Coder settlement WAL ${outcome.taskId} is unreadable — inspect .swarm/coder-settlements/${outcome.taskId}.json`);break;case"error":results.push(`⚠️ Coder settlement ${outcome.taskId} recovery failed: ${sanitizeDiagnosticText(outcome.message,512)}`);break;default:results.push(`⚠️ Coder settlement ${outcome.taskId}: unknown outcome`);break}if(truncated)results.push("⚠️ More settlement WALs exist than the recovery scan cap (200) — older settlements were NOT recovered. Re-run /swarm reset-session after the tasks above are settled.");let forcedRecovered=settlementResults.filter((outcome)=>outcome.outcome==="recovered"&&outcome.forced).length;if(forcedRecovered>0)results.push(`⚠️ Released in-process ownership for ${forcedRecovered} dispatch(es) before recovery — if any was genuinely still running, its completion will report CODER_SETTLEMENT_IDEMPOTENCY_CONFLICT (safe to ignore; the settlement is already recovered).`);if(preserveWorktrees=settlementResults.some((outcome)=>outcome.outcome==="error"||outcome.outcome==="unreadable_wal"),preserveWorktrees)results.push("⚠️ Preserved .swarm-worktrees/ because at least one settlement recovery failed — a worktree referenced by an unsettled WAL would become unrecoverable if deleted. Resolve the failures above (re-run /swarm reset-session or /swarm recover) before clearing worktrees.")}catch(err){preserveWorktrees=!0,results.push(`⚠️ Coder settlement recovery failed (continuing with reset): ${errorMessage2(err)}`)}try{if(preserveWorktrees)results.push("⏭️ Skipped worktree reclamation (see above)");else{let confirmArg=args2.find((a)=>a.startsWith("--confirm=")),confirmToken=confirmArg?confirmArg.slice(10):void 0,candidates=[];for(let base of resolveWorktreeEnumerationBases(directory)){if(!fs144.existsSync(base))continue;for(let sessionEntry of fs144.readdirSync(base,{withFileTypes:!0})){if(!sessionEntry.isDirectory())continue;let sessionDir2=path255.join(base,sessionEntry.name);for(let laneEntry of fs144.readdirSync(sessionDir2,{withFileTypes:!0}))if(laneEntry.isDirectory())candidates.push(path255.join(sessionDir2,laneEntry.name))}}if(candidates.length===0)results.push("⏭️ No worktree lanes to reclaim");else{for(let lane of candidates)closeProjectDb(lane);let livePaths=new Set(_internals202.listLiveLaneOwners(directory).live.map((owner)=>owner.lanePath)),own=[],foreign=[],unprovable=[];for(let candidate2 of candidates){let marker=probeGitMarker(path255.join(candidate2,".git"));if(marker==="uncertain"){unprovable.push(candidate2);continue}if(marker==="gitless"){if(isPathUnderSwarmWorktreeBase(candidate2,directory))own.push(candidate2);else unprovable.push(candidate2);continue}if(resolveWorktreeRepoOwnership(candidate2,directory).owned)own.push(candidate2);else foreign.push(candidate2)}for(let lane of foreign)results.push(`ℹ️ Preserved "${lane}" — owned by a different repository; never deleted by this project.`);for(let lane of unprovable)results.push(`ℹ️ Preserved "${lane}" — ownership unprovable (git-less outside the project worktree base, or unreadable metadata); never deleted by this project.`);if(confirmToken){let scope=own.filter((lane)=>probeGitMarker(path255.join(lane,".git"))==="present"||isPathUnderSwarmWorktreeBase(lane,directory)).map((lane)=>({path:lane,reason:"confirmed reset-session purge"})),execution=executeDestructivePurge(own[0]??"",directory,confirmToken,{candidates:scope});if(execution.ok)results.push(`✅ Removed ${execution.purged?.length??0} confirmed worktree lane(s)`);else results.push(`⚠️ Confirmed purge rejected: ${execution.reason}`)}else{let removedCount=0,preservedOwn=[];for(let lane of own){if(livePaths.has(lane)){preservedOwn.push(lane);continue}if((await _internals202.removeOwnedWorktreeDir(lane,directory)).status==="removed")removedCount++;else preservedOwn.push(lane)}if(removedCount>0)results.push(`✅ Removed ${removedCount} clean worktree lane(s)`);if(preservedOwn.length>0){let scope=preservedOwn.map((lane)=>({path:lane,reason:"uncommitted or live-owned work"})),preview=previewDestructivePurge(preservedOwn[0],directory,{candidates:scope});for(let line of preview.previewLines)results.push(` ${line}`);let token=issueConfirmToken(preservedOwn[0],directory,{candidates:scope});results.push(`\uD83D\uDD10 Preserved ${preservedOwn.length} lane(s) containing uncommitted or live work. Destroying them requires confirmation: re-run /swarm reset-session with --confirm=${token} (valid 15 minutes).`)}}}}}catch(err){results.push(`⚠️ Failed to reclaim worktree lanes: ${errorMessage2(err)}`)}try{let branchResult=await _internals202.cleanupOrphanedBranches(directory,[]);if(branchResult.removed.length>0)results.push(`✅ Removed ${branchResult.removed.length} orphan swarm-lane branch(es)`);if(branchResult.errors.length>0)results.push(`⚠️ Failed to remove ${branchResult.errors.length} branch(es): ${branchResult.errors.map((e)=>e.error).join("; ")}`);if(branchResult.skippedRecoveryBranches&&branchResult.skippedRecoveryBranches.length>0)results.push(`ℹ️ Preserved ${branchResult.skippedRecoveryBranches.length} branch(es) with unresolved merge-back recovery records (run /swarm status to inspect)`);if(branchResult.recoveryReadError)results.push("⚠️ Skipped all lane-branch deletions: .swarm/recovery/ was unreadable (fail-safe). Resolve or clear corrupt recovery records and re-run.")}catch(err){results.push(`⚠️ Failed to cleanup orphan branches: ${errorMessage2(err)}`)}return["## Session State Reset","",...results,"","Session state cleared. Plan, evidence, and knowledge preserved.","","In-memory circuit breakers and revision limits have been cleared. Durable per-task retry gates (the coder retry circuit breaker, bound to commit settlement in the events audit log and .swarm/evidence/) intentionally survive this reset. If a task is blocked with TASK_RETRY_CRITIC_REQUIRED waiting for a critic_sounding_board APPROVED verdict that was already obtained, have the architect record it with the approve_retry_sounding_board tool. A task left at rework_required also survives this reset; when the Stage B verdict did not require a code change, the architect can exit it with the recover_rework_task tool (issue #2755)."].join(`
|
|
4103
|
+
`,"utf-8"),await truncateTrajectoryFile(trajectoryPath,maxLines)}catch{}}catch{}}function clearTrajectoryStep(sessionId){clearTrajectoryStepCounters(sessionId),invalidateStepSeedGate(sessionId)}function summarizeArgs(args2,maxLength){if(!args2||Object.keys(args2).length===0)return"";let summaries=[];for(let[key2,value]of Object.entries(args2)){if(SENSITIVE_FIELDS.has(key2)||isSensitiveKey(key2)){summaries.push(`${key2}:[REDACTED]`);continue}if(value===null||value===void 0)summaries.push(`${key2}:null`);else if(typeof value==="string"){let window2=value.slice(0,REDACTION_SCAN_WINDOW),redacted=redactCommandSecrets(window2),truncated=redacted.length>50?`${redacted.slice(0,50)}...`:redacted;summaries.push(`${key2}:"${truncated}"`)}else if(typeof value==="number"||typeof value==="boolean")summaries.push(`${key2}:${String(value)}`);else if(Array.isArray(value)){let itemSummary=value.length>3?`${value.slice(0,3).map(String).join(",")},...(+${value.length-3})`:value.map(String).join(",");summaries.push(`${key2}:[${itemSummary}]`)}else if(typeof value==="object"){let keys=Object.keys(value);summaries.push(`${key2}:{${keys.join(",")}}`)}else summaries.push(`${key2}:${typeof value}`)}let summary=summaries.join(" ");return summary.length>maxLength?`${summary.slice(0,maxLength-3)}...`:summary}function deriveVerdict(output){if(output.metadata&&typeof output.metadata==="object"&&!Array.isArray(output.metadata)){let meta3=output.metadata;if(typeof meta3.verdict==="string"&&meta3.verdict.length>0)return meta3.verdict;if(meta3.success===!1||meta3.passed===!1)return"failure";if(meta3.success===!0||meta3.passed===!0)return"success"}let outputStr=String(output.output??"");if(outputStr.startsWith("Error:")||outputStr.startsWith("error:")||outputStr.startsWith("Error: "))return"failure";return"success"}var callStartTimes,SENSITIVE_FIELDS,SENSITIVE_SUBSTRINGS,URL_CREDENTIALS_PATTERN,REDACTION_SCAN_WINDOW=4096,MAX_COMMAND_TARGET_LENGTH=200,stepSeedGate,MAX_STEP_SEED_GATE_SESSIONS=500,stepSeedPromises,MAX_DENIED_CALL_MARKERS=500,DENIED_CALL_TTL_MS=300000,deniedCallMarkers;var init_trajectory_logger=__esm(()=>{init_manager2();init_redaction();init_trajectory_store();init_state2();init_canonical_root();init_swarm_artifact_cache();init_gate_denial_tracker();init_normalize_tool_name();init_trajectory_step_state();init_utils2();callStartTimes=new Map,SENSITIVE_FIELDS=new Set(["password","token","secret","api_key","apikey","authorization","access_token","refresh_token","private_key","secret_key","credential","auth","bearer","x-api-key","session_id","cookie"]),SENSITIVE_SUBSTRINGS=["key","secret","token","password","auth","credential","private","certificate","bearer","session","cookie"];URL_CREDENTIALS_PATTERN=/\b([a-zA-Z][a-zA-Z0-9+.-]*:\/\/)[^\s/@:]+:[^\s/@]+@/g;stepSeedGate=new Map,stepSeedPromises=new Map;deniedCallMarkers=new Map});import*as fs144 from"node:fs";import*as path255 from"node:path";function errorMessage2(err){if(err instanceof Error)return err.message;return String(err)}async function releaseKnowledgeGateObligations(directory,sessionID){let results=[],live;try{live=await _internals202.queryLiveMemberships(directory,{session_id:sessionID,include_terminal:!0})}catch(err){return[`⚠️ Knowledge gate state not cleared: receipt authority unavailable (${errorMessage2(err)})`]}if(!live.ok)return[`⚠️ Knowledge gate state not cleared: receipt authority unavailable (${live.code})`];let pending=live.memberships.filter((membership)=>membership.exposure_kind==="architect_directive"&&!membership.application_marker&&membership.gate_release?.membership_event_id!==membership.membership_event_id);if(pending.length===0)return["⏭️ No pending knowledge gate obligations for this session"];let byTrace=new Map;for(let membership of pending){let group=byTrace.get(membership.trace_id)??[];group.push(membership),byTrace.set(membership.trace_id,group)}let committedCount=0,releasedPairs=[];for(let[traceId,group]of byTrace){let committed=await _internals202.commitGateReleaseBatch(directory,{trace_id:traceId,session_id:sessionID,items:group.map((membership)=>({entry_id:membership.entry_id,source:"application_gate_session_reset_release",reason:"/swarm reset-session operator escape (#2398)"}))});if(!committed.ok){results.push(`⚠️ Failed to release knowledge gate obligations on trace ${sanitizeDiagnosticText(traceId,64)}: ${committed.code}`);continue}committedCount+=committed.committed.length;for(let item of committed.committed)releasedPairs.push(`${traceId}/${item.entry_id}`);if(committed.rejected.length>0){let reasons=committed.rejected.map((item)=>item.reason).join("; "),hasWrongSession=committed.rejected.some((item)=>item.reason==="wrong_session");results.push(`⚠️ Partially released trace ${sanitizeDiagnosticText(traceId,64)}: ${reasons}`+(hasWrongSession?" — a re-dispatched child session is an authorized filer for its dispatch's stamps, or surface fresh knowledge via knowledge_recall for a new trace":""))}}if(committedCount===0)return results;if(committedCount<pending.length)results.push(`⚠️ Released ${committedCount} of ${pending.length} pending knowledge gate obligation(s) — ${pending.length-committedCount} not released; see warnings above`);else results.push(`✅ Released ${committedCount} pending knowledge gate obligation(s) for this session`);try{appendCoreEventSync(directory,{timestamp:new Date().toISOString(),event:"knowledge_application_gate_session_reset_clear",sessionID,released_pairs:releasedPairs})}catch{}return results}async function handleResetSessionCommand(directory,args2,sessionID){let results=[],snapshotResetGuard;try{if(snapshotResetGuard=await _internals202.beginSnapshotCoordinationReset(directory),snapshotResetGuard.closeError){if(snapshotResetGuard.priorUnsettled)return results.push(`❌ Snapshot coordination close timed out; reset aborted to avoid racing an in-flight initializer: ${errorMessage2(snapshotResetGuard.closeError)}`),snapshotResetGuard.release(),results.join(`
|
|
4104
|
+
`);throw snapshotResetGuard.closeError}}catch(err){results.push(`⚠️ Snapshot coordination close failed (continuing with reset): ${errorMessage2(err)}`)}try{let backup=_internals202.backupSwarmStateBeforeReset(directory,"reset-session",["session"]);if(backup.backupDir&&backup.copied.length>0){let rel=path255.relative(directory,backup.backupDir);results.push(`\uD83D\uDCE6 Backed up session state to ${rel}/ (restore by copying files back into .swarm/session/)`)}for(let w of backup.warnings)results.push(`⚠️ Backup warning: ${w}`)}catch(err){results.push(`⚠️ Auto-backup failed (continuing with reset): ${err instanceof Error?err.message:String(err)}`)}let snapshotAuthorityCleared=!1;try{let removed=_internals202.clearSnapshotRows(directory);snapshotAuthorityCleared=!0,results.push(removed>0?`✅ Deleted ${removed} authoritative session snapshot row(s)`:"⏭️ SQLite session snapshot already clean")}catch(err){results.push(`❌ Failed to clear SQLite session snapshot: ${errorMessage2(err)}`)}let snapshotProjectionCleared=!0;try{let projectionPath=validateSwarmPath(directory,SNAPSHOT_PROJECTION_FILE);if(fs144.existsSync(projectionPath))fs144.unlinkSync(projectionPath),results.push(`✅ Deleted .swarm/${SNAPSHOT_PROJECTION_FILE}`)}catch(err){snapshotProjectionCleared=!1,results.push(`❌ Failed to delete ${SNAPSHOT_PROJECTION_FILE}: ${errorMessage2(err)}`)}let statePath3,legacySnapshotCleared=!0;try{if(statePath3=validateSwarmPath(directory,"session/state.json"),fs144.existsSync(statePath3))fs144.unlinkSync(statePath3),results.push("✅ Deleted .swarm/session/state.json");else results.push("⏭️ state.json not found (already clean)")}catch{legacySnapshotCleared=!1,results.push("❌ Failed to delete state.json")}let sessionDir=statePath3?path255.dirname(statePath3):void 0,sessionFiles=[];if(sessionDir&&fs144.existsSync(sessionDir))try{sessionFiles=fs144.readdirSync(sessionDir)}catch(err){results.push(`❌ Failed to read session directory: ${errorMessage2(err)}`)}for(let file3 of sessionFiles){if(file3==="state.json"||file3===path255.basename(SNAPSHOT_PROJECTION_FILE))continue;let filePath=path255.join(sessionDir,file3);try{if(!fs144.existsSync(filePath))continue;if(!fs144.lstatSync(filePath).isFile())continue;fs144.unlinkSync(filePath),results.push(`✓ Deleted ${file3}`)}catch(err){results.push(`❌ Failed to delete ${file3}: ${errorMessage2(err)}`)}}let sessionCount=swarmState.agentSessions.size;for(let[sessionId,session]of swarmState.agentSessions)resetPrmSessionState(session,sessionId),clearTrajectoryStep(sessionId);swarmState.agentSessions.clear(),swarmState.dispatchParentByChildSession.clear(),swarmState.pendingDispatchAuthorizations=[],clearSnapshotSessionOwnerships(),results.push(`✅ Cleared ${sessionCount} in-memory agent session(s)`);try{let swept=clearAllSessionOverrides(directory);if(swept>0)results.push(`✅ Cleared ${swept} durable session QA override row(s)`)}catch(err){results.push(`⚠️ Durable session QA override sweep failed: ${errorMessage2(err)}`)}if(sessionID)clearSessionActionCircuits(sessionID),results.push("✅ Released this session’s guardrail circuit(s) (audited; re-delegate to re-arm)");let chainCount=swarmState.delegationChains.size;swarmState.delegationChains.clear(),results.push(`✅ Cleared ${chainCount} delegation chain(s)`);let activeAgentCount=swarmState.activeAgent.size;if(swarmState.activeAgent.clear(),results.push(`✅ Cleared ${activeAgentCount} active-agent mapping(s)`),snapshotResetGuard&&snapshotAuthorityCleared&&snapshotProjectionCleared&&legacySnapshotCleared)snapshotResetGuard.release();if(sessionID)try{results.push(...await _internals202.releaseKnowledgeGateObligations(directory,sessionID))}catch(err){results.push(`⚠️ Knowledge gate state not cleared: ${errorMessage2(err)}`)}else results.push("⚠️ Knowledge gate obligations not released: no session context on this invocation");if(sessionID)try{let{existsSync:existsSync133,rmSync:rmSync32}=await import("node:fs"),sessionBindingDir=validateSwarmPath(directory,`${STAGE_B_BINDINGS_DIR}/${stageBSessionDirName(sessionID)}`);if(existsSync133(sessionBindingDir))rmSync32(sessionBindingDir,{recursive:!0,force:!0}),results.push("✅ Deleted stage-b-dispatch-bindings for this session")}catch{results.push("⚠️ Stage B durable bindings not cleared (best-effort; TTL prune collects them)")}swarmState.gateDenialCounts.clear(),swarmState.currentCriticalShownIds.clear(),results.push("✅ Cleared in-memory knowledge gate denial state");let preserveWorktrees=!1;try{let{results:settlementResults,truncated}=await _internals202.recoverStaleCoderSettlements(directory,{force:!0});if(settlementResults.length===0)results.push("⏭️ No coder settlements to recover");for(let outcome of settlementResults)switch(outcome.outcome){case"recovered":results.push(`✅ Recovered coder settlement ${outcome.taskId} (${outcome.accepted?"changes attributed":"no workspace change to attribute"})`);break;case"already_terminal":results.push(`⏭️ Coder settlement ${outcome.taskId} already ${outcome.state}`);break;case"owned_in_process":results.push(`ℹ️ Coder settlement ${outcome.taskId} still registered in flight (${sanitizeDiagnosticText(outcome.transitionId)}) — its dispatch may be genuinely running; not force-recovered`);break;case"owned_by_live_foreign_pid":results.push(`ℹ️ Coder settlement ${outcome.taskId} owned by live process pid ${outcome.processId} (another OpenCode instance) — not touched; run /swarm recover there after closing it`);break;case"unreadable_wal":results.push(`⚠️ Coder settlement WAL ${outcome.taskId} is unreadable — inspect .swarm/coder-settlements/${outcome.taskId}.json`);break;case"error":results.push(`⚠️ Coder settlement ${outcome.taskId} recovery failed: ${sanitizeDiagnosticText(outcome.message,512)}`);break;default:results.push(`⚠️ Coder settlement ${outcome.taskId}: unknown outcome`);break}if(truncated)results.push("⚠️ More settlement WALs exist than the recovery scan cap (200) — older settlements were NOT recovered. Re-run /swarm reset-session after the tasks above are settled.");let forcedRecovered=settlementResults.filter((outcome)=>outcome.outcome==="recovered"&&outcome.forced).length;if(forcedRecovered>0)results.push(`⚠️ Released in-process ownership for ${forcedRecovered} dispatch(es) before recovery — if any was genuinely still running, its completion will report CODER_SETTLEMENT_IDEMPOTENCY_CONFLICT (safe to ignore; the settlement is already recovered).`);if(preserveWorktrees=settlementResults.some((outcome)=>outcome.outcome==="error"||outcome.outcome==="unreadable_wal"),preserveWorktrees)results.push("⚠️ Preserved .swarm-worktrees/ because at least one settlement recovery failed — a worktree referenced by an unsettled WAL would become unrecoverable if deleted. Resolve the failures above (re-run /swarm reset-session or /swarm recover) before clearing worktrees.")}catch(err){preserveWorktrees=!0,results.push(`⚠️ Coder settlement recovery failed (continuing with reset): ${errorMessage2(err)}`)}try{if(preserveWorktrees)results.push("⏭️ Skipped worktree reclamation (see above)");else{let confirmArg=args2.find((a)=>a.startsWith("--confirm=")),confirmToken=confirmArg?confirmArg.slice(10):void 0,candidates=[];for(let base of resolveWorktreeEnumerationBases(directory)){if(!fs144.existsSync(base))continue;for(let sessionEntry of fs144.readdirSync(base,{withFileTypes:!0})){if(!sessionEntry.isDirectory())continue;let sessionDir2=path255.join(base,sessionEntry.name);for(let laneEntry of fs144.readdirSync(sessionDir2,{withFileTypes:!0}))if(laneEntry.isDirectory())candidates.push(path255.join(sessionDir2,laneEntry.name))}}if(candidates.length===0)results.push("⏭️ No worktree lanes to reclaim");else{for(let lane of candidates)closeProjectDb(lane);let livePaths=new Set(_internals202.listLiveLaneOwners(directory).live.map((owner)=>owner.lanePath)),own=[],foreign=[],unprovable=[];for(let candidate2 of candidates){let marker=probeGitMarker(path255.join(candidate2,".git"));if(marker==="uncertain"){unprovable.push(candidate2);continue}if(marker==="gitless"){if(isPathUnderSwarmWorktreeBase(candidate2,directory))own.push(candidate2);else unprovable.push(candidate2);continue}if(resolveWorktreeRepoOwnership(candidate2,directory).owned)own.push(candidate2);else foreign.push(candidate2)}for(let lane of foreign)results.push(`ℹ️ Preserved "${lane}" — owned by a different repository; never deleted by this project.`);for(let lane of unprovable)results.push(`ℹ️ Preserved "${lane}" — ownership unprovable (git-less outside the project worktree base, or unreadable metadata); never deleted by this project.`);if(confirmToken){let scope=own.filter((lane)=>probeGitMarker(path255.join(lane,".git"))==="present"||isPathUnderSwarmWorktreeBase(lane,directory)).map((lane)=>({path:lane,reason:"confirmed reset-session purge"})),execution=executeDestructivePurge(own[0]??"",directory,confirmToken,{candidates:scope});if(execution.ok)results.push(`✅ Removed ${execution.purged?.length??0} confirmed worktree lane(s)`);else results.push(`⚠️ Confirmed purge rejected: ${execution.reason}`)}else{let removedCount=0,preservedOwn=[];for(let lane of own){if(livePaths.has(lane)){preservedOwn.push(lane);continue}if((await _internals202.removeOwnedWorktreeDir(lane,directory)).status==="removed")removedCount++;else preservedOwn.push(lane)}if(removedCount>0)results.push(`✅ Removed ${removedCount} clean worktree lane(s)`);if(preservedOwn.length>0){let scope=preservedOwn.map((lane)=>({path:lane,reason:"uncommitted or live-owned work"})),preview=previewDestructivePurge(preservedOwn[0],directory,{candidates:scope});for(let line of preview.previewLines)results.push(` ${line}`);let token=issueConfirmToken(preservedOwn[0],directory,{candidates:scope});results.push(`\uD83D\uDD10 Preserved ${preservedOwn.length} lane(s) containing uncommitted or live work. Destroying them requires confirmation: re-run /swarm reset-session with --confirm=${token} (valid 15 minutes).`)}}}}}catch(err){results.push(`⚠️ Failed to reclaim worktree lanes: ${errorMessage2(err)}`)}try{let branchResult=await _internals202.cleanupOrphanedBranches(directory,[]);if(branchResult.removed.length>0)results.push(`✅ Removed ${branchResult.removed.length} orphan swarm-lane branch(es)`);if(branchResult.errors.length>0)results.push(`⚠️ Failed to remove ${branchResult.errors.length} branch(es): ${branchResult.errors.map((e)=>e.error).join("; ")}`);if(branchResult.skippedRecoveryBranches&&branchResult.skippedRecoveryBranches.length>0)results.push(`ℹ️ Preserved ${branchResult.skippedRecoveryBranches.length} branch(es) with unresolved merge-back recovery records (run /swarm status to inspect)`);if(branchResult.recoveryReadError)results.push("⚠️ Skipped all lane-branch deletions: .swarm/recovery/ was unreadable (fail-safe). Resolve or clear corrupt recovery records and re-run.")}catch(err){results.push(`⚠️ Failed to cleanup orphan branches: ${errorMessage2(err)}`)}return["## Session State Reset","",...results,"","Session state cleared. Plan, evidence, and knowledge preserved.","","In-memory circuit breakers and revision limits have been cleared. Durable per-task retry gates (the coder retry circuit breaker, bound to commit settlement in the events audit log and .swarm/evidence/) intentionally survive this reset. If a task is blocked with TASK_RETRY_CRITIC_REQUIRED waiting for a critic_sounding_board APPROVED verdict that was already obtained, have the architect record it with the approve_retry_sounding_board tool. A task left at rework_required also survives this reset; when the Stage B verdict did not require a code change, the architect can exit it with the recover_rework_task tool (issue #2755)."].join(`
|
|
4105
4105
|
`)}var _internals202;var init_reset_session=__esm(()=>{init_stage_b_dispatch_binding_store();init_lane_context();init_project_db();init_qa_gate_session_override();init_core_events();init_action_circuit();init_init_orphan_recovery();init_knowledge_receipt_ledger();init_trajectory_logger();init_utils2();init_lane_owners();init_prm();init_path_identity();init_snapshot_coordination_init();init_snapshot_store();init_snapshot_writer();init_state2();init_coder_settlement();init_core3();init_merge2();init_ownership();init_destructive_purge();init_reset_backup();_internals202={cleanupOrphanedBranches,removeOwnedWorktreeDir,listLiveLaneOwners,backupSwarmStateBeforeReset,recoverStaleCoderSettlements,queryLiveMemberships,commitGateReleaseBatch,beginSnapshotCoordinationReset,clearSnapshotRows,releaseKnowledgeGateObligations}});async function handleRetrieveCommand(directory,args2){let summaryId=args2[0];if(!summaryId)return["## Swarm Retrieve","","Usage: `/swarm retrieve <id>`","","Example: `/swarm retrieve S1`","","Retrieves the full output that was replaced by a summary."].join(`
|
|
4106
4106
|
`);try{let fullOutput=await loadFullOutput(directory,summaryId);if(fullOutput===null)return`## Summary Not Found
|
|
4107
4107
|
|
|
@@ -7183,7 +7183,7 @@ ${modeSignal}`:message,usePromptDelivery=config3.event_delivery==="prompt"&&_int
|
|
|
7183
7183
|
`),constraints=[];for(let line of lines){if(constraints.length>=MAX_CONSTRAINTS_PER_DOC)break;let trimmed=line.trim();if(!trimmed)continue;if(isConstraintLine(trimmed)){let cleaned=stripMarkdown(trimmed),len=cleaned.length;if(len>=MIN_LESSON_LENGTH&&len<=MAX_CONSTRAINT_LENGTH)constraints.push(cleaned)}}return constraints}async function extractDocConstraints(directory,taskFiles,taskDescription){let manifestPath2=path295.join(directory,".swarm","doc-manifest.json"),manifest;try{let content=await readFile55(manifestPath2,"utf-8");manifest=JSON.parse(content)}catch{manifest=(await scanDocIndex(directory)).manifest}let knowledgePath=resolveSwarmKnowledgePath(directory),existingEntries=await readKnowledge(knowledgePath),taskContext=[...taskFiles,taskDescription].join(" "),taskBigrams=wordBigrams(normalize4(taskContext)),extractedCount=0,skippedCount=0,details=[];for(let docFile of manifest.files){let docContext=`${docFile.path} ${docFile.title} ${docFile.summary}`,docBigrams=wordBigrams(normalize4(docContext)),score=jaccardBigram(taskBigrams,docBigrams);if(score<=RELEVANCE_THRESHOLD){skippedCount++;continue}let fullContent;try{fullContent=await readFile55(path295.join(directory,docFile.path),"utf-8")}catch{skippedCount++;continue}let constraints=extractConstraintsFromContent(fullContent);if(constraints.length===0){skippedCount++;continue}let docDetails={path:docFile.path,score,constraints:[]};for(let constraint of constraints)if(!findNearDuplicate(constraint,existingEntries,DEDUP_THRESHOLD2)){let entry={id:crypto14.randomUUID(),tier:"swarm",lesson:constraint,category:"architecture",tags:["doc-scan",path295.basename(docFile.path)],scope:"global",confidence:0.5,status:"candidate",confirmed_by:[],project_name:"",retrieval_outcomes:{applied_count:0,succeeded_after_count:0,failed_after_count:0},schema_version:1,created_at:new Date().toISOString(),updated_at:new Date().toISOString(),auto_generated:!0,hive_eligible:!1};await appendKnowledge(knowledgePath,entry),existingEntries.push(entry),extractedCount++,docDetails.constraints.push(constraint)}if(docDetails.constraints.length>0)details.push(docDetails);else skippedCount++}return{extracted:extractedCount,skipped:skippedCount,details}}var SKIP_DIRECTORIES3,SKIP_PATTERNS,MAX_SUMMARY_LENGTH=200,MAX_INDEXED_FILES=100,READ_LINES_LIMIT=30,MIN_LESSON_LENGTH=15,MAX_CONSTRAINTS_PER_DOC=5,MAX_CONSTRAINT_LENGTH=200,RELEVANCE_THRESHOLD=0.1,DEDUP_THRESHOLD2=0.6,CONSTRAINT_PATTERNS,ACTION_WORDS,doc_scan,doc_extract;var init_doc_scan=__esm(()=>{init_zod();init_schema();init_knowledge_store();init_create_tool();SKIP_DIRECTORIES3=new Set(["node_modules",".git",".swarm",".swarm-worktrees","dist","build",".next","vendor","bazel-out","bazel-bin","bazel-genfiles","bazel-testlogs",".gradle","target"]),SKIP_PATTERNS=[/\.test\./,/\.spec\./,/\.d\.ts$/];CONSTRAINT_PATTERNS=[/\bMUST\b/,/\bMUST NOT\b/,/\bSHOULD\b/,/\bSHOULD NOT\b/,/\bDO NOT\b/,/\bALWAYS\b/,/\bNEVER\b/,/\bREQUIRED\b/],ACTION_WORDS=/\b(must|should|don't|avoid|ensure|use|follow)\b/i;doc_scan=createSwarmTool({description:"Scan project documentation files and build an index manifest. Caches results in .swarm/doc-manifest.json for fast subsequent scans.",args:{force:exports_external.boolean().optional().describe("Force re-scan even if cache is valid")},execute:async(args2,directory)=>{let force=!1;try{if(args2&&typeof args2==="object"){if(args2.force===!0)force=!0}}catch{}if(force){let manifestPath2=path295.join(directory,".swarm","doc-manifest.json");try{fs168.unlinkSync(manifestPath2)}catch{}}let{manifest,cached:cached3}=await scanDocIndex(directory);return JSON.stringify({success:!0,files_count:manifest.files.length,cached:cached3,manifest},null,2)}}),doc_extract=createSwarmTool({description:"Extract actionable constraints from project documentation relevant to the current task. Scans docs via doc-manifest, scores relevance via Jaccard bigram similarity, and stores non-duplicate constraints in .swarm/knowledge.jsonl.",args:{task_files:exports_external.array(exports_external.string()).describe("List of file paths involved in the current task"),task_description:exports_external.string().describe("Description of the current task")},execute:async(args2,directory)=>{let taskFiles=[],taskDescription="";try{if(args2&&typeof args2==="object"){let obj=args2;if(Array.isArray(obj.task_files))taskFiles=obj.task_files.filter((f)=>typeof f==="string");if(typeof obj.task_description==="string")taskDescription=obj.task_description}}catch{}if(taskFiles.length===0&&!taskDescription)return JSON.stringify({success:!1,error:"task_files or task_description is required"});let result=await extractDocConstraints(directory,taskFiles,taskDescription);return JSON.stringify({success:!0,...result},null,2)}})});var exports_knowledge_recall={};__export(exports_knowledge_recall,{knowledge_recall:()=>knowledge_recall,_internals:()=>_internals236});var knowledge_recall,_internals236;var init_knowledge_recall=__esm(()=>{init_zod();init_config();init_schema();init_knowledge_events();init_knowledge_receipt_ledger();init_knowledge_types();init_search_knowledge();init_knowledge_diagnostics();init_logger();init_create_tool();knowledge_recall=createSwarmTool({allowWorkingDirectoryOverride:!0,description:"Performs semantic natural-language search across the knowledge base for relevant past decisions, patterns, and lessons learned. Returns ranked results via the unified hybrid retrieval service and a trace_id for knowledge_receipt. This is the tool to use when the user has a QUESTION about what the knowledge base contains. For structured filter-based retrieval (by category, status, or score), use `knowledge_query` instead.",args:{query:exports_external.string().min(3).describe("Natural language search query"),top_n:exports_external.number().int().min(1).max(20).optional().describe("Maximum results to return (default: 5)"),tier:exports_external.enum(["all","swarm","hive"]).optional().describe("Knowledge tier to search (default: 'all')"),debug:exports_external.boolean().optional().describe("Include path/version/health debug metadata in the response"),repair_re_evaluation:exports_external.object({repair_id:exports_external.string().uuid(),phase:exports_external.string().min(1).max(256),task_id:exports_external.string().min(1).max(256).optional(),scope_complete:exports_external.boolean()}).optional().describe("Architect-only explicit completion of a repaired receipt scope. The query must comprehensively re-evaluate the exact affected phase/session scope.")},execute:async(args2,directory,ctx)=>{let queryInput,topNInput,tierInput,debugInput,repairInput;try{if(args2&&typeof args2==="object"){let obj=args2;queryInput=obj.query,topNInput=obj.top_n,tierInput=obj.tier,debugInput=obj.debug,repairInput=obj.repair_re_evaluation}}catch{}let wantDebug=debugInput===!0,repairReevaluation;if(repairInput!==void 0){if(stripKnownSwarmPrefix(ctx?.agent??"")!=="architect"||typeof repairInput!=="object"||repairInput===null)return JSON.stringify({results:[],total:0,unverifiable:!0,code:"RECEIPT_REEVALUATION_ARCHITECT_ONLY",error:"Only the architect may complete an explicit receipt repair re-evaluation."});let candidate2=repairInput;if(typeof candidate2.repair_id!=="string"||!candidate2.repair_id||typeof candidate2.phase!=="string"||!candidate2.phase||candidate2.scope_complete!==!0||candidate2.task_id!==void 0&&typeof candidate2.task_id!=="string")return JSON.stringify({results:[],total:0,unverifiable:!0,code:"RECEIPT_REEVALUATION_PROOF_INVALID",error:"Explicit re-evaluation requires repair_id, exact phase, and scope_complete=true."});repairReevaluation={repair_id:candidate2.repair_id,phase:candidate2.phase,scope_complete:!0,...typeof candidate2.task_id==="string"?{task_id:candidate2.task_id}:{}}}if(typeof queryInput!=="string"||queryInput.length<3)return JSON.stringify({results:[],total:0,error:"query must be a string with at least 3 characters"});let topN=5;if(typeof topNInput==="number"&&Number.isInteger(topNInput))topN=Math.max(1,Math.min(20,topNInput));let tier="all";if(tierInput==="swarm"||tierInput==="hive")tier=tierInput;let knowledgeConfig=KnowledgeConfigSchema.parse({});try{let{config:config3}=loadPluginConfigWithMeta(directory);knowledgeConfig=KnowledgeConfigSchema.parse(config3.knowledge??{})}catch{}let{trace_id,results}=await searchKnowledge({directory,config:knowledgeConfig,query:queryInput,mode:"manual",agent:ctx?.agent??"unknown",sessionId:ctx?.sessionID??"unknown",tier,maxResults:topN,applyScopeFilter:!1,forceReadHive:!0,applyRoleScope:!1,emitEvent:!1}),sessionId=ctx?.sessionID??"unknown";if(results.length>0){let membership=await commitDisplayedMembership(directory,{trace_id,session_id:sessionId,exposure_kind:"manual_recall",agent:ctx?.agent??"unknown",grace_days:knowledgeConfig.receipt_close_grace_days,phase:repairReevaluation?.phase,task_id:repairReevaluation?.task_id,repair_re_evaluation:repairReevaluation,entries:results.map((entry,index)=>({entry_id:entry.id,critical:entry.directive_priority==="critical"&&isActiveStatus(entry.status),rank:index+1,score:entry.finalScore}))});if(!membership.ok||membership.memberships.some((item)=>item.terminal))return JSON.stringify({results:[],total:0,unverifiable:!0,code:membership.ok?"terminal_trace_reuse":membership.code,error:membership.ok?"retrieval trace was already terminalized":membership.detail})}else{let empty=await commitEmptyRetrieval(directory,{trace_id,session_id:sessionId,agent:ctx?.agent??"unknown",grace_days:knowledgeConfig.receipt_close_grace_days,phase:repairReevaluation?.phase,task_id:repairReevaluation?.task_id,repair_re_evaluation:repairReevaluation});if(!empty.ok)return JSON.stringify({results:[],total:0,unverifiable:!0,code:empty.code,error:empty.detail});if(!empty.terminal_event_id)return JSON.stringify({results:[],total:0,unverifiable:!0,code:"store_unavailable",error:"empty retrieval terminal did not commit"})}let ranks=Object.fromEntries(results.map((entry,index)=>[entry.id,index+1])),scores=Object.fromEntries(results.map((entry)=>[entry.id,entry.finalScore]));await recordKnowledgeEvent(directory,{type:"retrieved",trace_id,session_id:sessionId,agent:ctx?.agent??"unknown",query:queryInput,retrieval_mode:"manual",result_ids:results.map((entry)=>entry.id),ranks,scores});let scored=results.map((e)=>({id:e.id,confidence:e.confidence,category:e.category,lesson:e.lesson,score:e.finalScore,score_breakdown:e.score_breakdown}));log("[knowledge_recall] completed",{agent:ctx?.agent??"unknown",session_id:ctx?.sessionID??"unknown",query:queryInput,tier,result_count:scored.length,trace_id});let result={results:scored,total:scored.length,trace_id};if(wantDebug)result.debug=await computeKnowledgeDebug(directory);return JSON.stringify(result)}}),_internals236={knowledge_recall}});var exports_prompt_renderer={};__export(exports_prompt_renderer,{renderEnvironmentPrompt:()=>renderEnvironmentPrompt});function renderEnvironmentPrompt(profile,audience){let policy=deriveCommandPolicy(profile),header=["RUNTIME ENVIRONMENT",`- Host OS: ${profile.hostOS}`,`- Shell family: ${profile.shellFamily}`,`- Execution mode: ${profile.executionMode}`,`- Path style: ${profile.pathStyle}`].join(`
|
|
7184
7184
|
`);if(audience==="coder")return[header,policy.avoidPosixExamples?"- Command policy: Prefer PowerShell-native commands and Node.js APIs. Do not start with POSIX commands (ls, grep, rm, cat, export, pwd) unless the environment profile indicates Docker, WSL, or a POSIX shell.":"- Command policy: Use POSIX-native commands and Node.js APIs.","","EXECUTION ENVIRONMENT AWARENESS","- This session includes a runtime environment profile. Follow it exactly.","- Decision ladder when shell commands are necessary:"," 1. Prefer swarm tools and Node.js fs/path APIs."," 2. Use shell only when the task truly requires it."," 3. When shell commands are needed, match the active shell family above."].join(`
|
|
7185
7185
|
`);return[header,"- Test execution policy: Always execute tests via the swarm test runner tool.",policy.avoidPosixExamples?" Do not describe POSIX shell setup commands unless the profile indicates Docker, WSL, or POSIX shell.":" Use POSIX semantics for test commands.","","ENVIRONMENT-SPECIFIC TEST EXECUTION RULES",profile.isWindowsNative?"- Native Windows + PowerShell: Assume PowerShell semantics for paths and env vars. Prefer Pester for PowerShell modules where appropriate.":profile.isWindowsDocker?"- Windows + Docker: Host paths are Windows-style; in-container operations use POSIX semantics.":"- Linux/macOS: Use POSIX semantics for all shell-related reasoning.","- In all modes: prefer the swarm test runner over ad hoc shell commands.","- When tests are skipped due to environment issues, explicitly mention the environment profile assumptions in your verdict."].join(`
|
|
7186
|
-
`)}var init_prompt_renderer=()=>{};function reject(reason,detail,rejected_items){return{ok:!1,rejected:!0,reason,detail,rejected_items}}async function validateReceipt(ctx){let{items,no_relevant_knowledge:noRelevant}=ctx;if(items.length===0&&!noRelevant)return reject("empty_receipt","no items and no_relevant_knowledge is false");if(noRelevant&&items.length>0)return reject("invalid_outcome","no_relevant_knowledge cannot be combined with items");for(let item of items)if(!VALID_OUTCOMES.has(item.outcome))return reject("invalid_outcome",`item ${item.id}: outcome ${item.outcome}`);let traceId=ctx.trace_id||NO_TRACE_SENTINEL;if(traceId===NO_TRACE_SENTINEL){if(items.length>0)return reject("trace_not_found","items filed against the none sentinel trace");let empty=await commitEmptyRetrieval(ctx.directory,{trace_id:traceId,session_id:ctx.session_id,phase:ctx.phase,task_id:ctx.task_id,agent:ctx.agent,grace_days:ctx.grace_days});if(!empty.ok)return reject(empty.code,empty.detail);return{ok:!0,accepted:[],idempotent_skips:[],trace:null,closes_no_relevant:!0,authoritative_event_ids:{},no_relevant_event_id:empty.terminal_event_id}}let committed=await validateAndCommitTerminalBatch(ctx.directory,{trace_id:traceId,session_id:ctx.session_id,phase:ctx.phase,task_id:ctx.task_id,agent:ctx.agent,cohort_id:ctx.cohort_id,source_link_id:ctx.source_link_id,grace_days:ctx.grace_days,items:items.map((item)=>({entry_id:item.id,outcome:item.outcome,reason:item.reason,source:ctx.source.trim()||"unknown"})),no_relevant_knowledge:noRelevant});if(!committed.ok)return reject(committed.code,committed.detail);let remainingItems=[...items],takeItem=(id,outcome)=>{let index=remainingItems.findIndex((item)=>item.id===id&&(outcome===void 0||item.outcome===outcome));if(index<0)return;return remainingItems.splice(index,1)[0]},accepted=committed.accepted.map((item)=>takeItem(item.entry_id,item.outcome)).filter((item)=>item!==void 0),idempotent_skips=committed.idempotent.map((id)=>takeItem(id)).filter((item)=>item!==void 0),rejected_items=committed.rejected.map((item)=>({item:takeItem(item.entry_id)??{id:item.entry_id,outcome:"ignored"},reason:item.reason}));if(rejected_items.length&&accepted.length===0&&idempotent_skips.length===0)return reject(rejected_items[0].reason,`${rejected_items[0].reason} for id ${rejected_items[0].item.id}`,rejected_items);let queried=await queryLiveMemberships(ctx.directory,{session_id:ctx.session_id,include_terminal:!0,grace_days:ctx.grace_days}),memberships=queried.ok?queried.memberships.filter((membership)=>membership.trace_id===traceId):[],trace=memberships.length?{type:"retrieved",event_id:memberships[0].membership_event_id,trace_id:traceId,timestamp:memberships[0].committed_at,session_id:ctx.session_id,phase:memberships[0].phase,task_id:memberships[0].task_id,agent:memberships[0].agent??ctx.agent,query:"",retrieval_mode:"manual",result_ids:memberships.map((membership)=>membership.entry_id),ranks:Object.fromEntries(memberships.map((membership,index)=>[membership.entry_id,membership.rank??index+1])),scores:Object.fromEntries(memberships.map((membership)=>[membership.entry_id,membership.score??0]))}:null;return{ok:!0,accepted,idempotent_skips,trace,closes_no_relevant:committed.closes_no_relevant,authoritative_event_ids:Object.fromEntries(committed.accepted.map((item)=>[item.entry_id,item.event_id])),...committed.terminal_event_id?{no_relevant_event_id:committed.terminal_event_id}:{},...rejected_items.length?{rejected_items}:{}}}var NO_TRACE_SENTINEL="none",VALID_OUTCOMES;var init_knowledge_receipt_validator=__esm(()=>{init_knowledge_receipt_ledger();VALID_OUTCOMES=RECEIPT_TERMINAL_OUTCOMES});function isTaskTool3(tool3){return tool3==="Task"||tool3==="task"}function resolveDelegateAckTaskId(args2,knownPlanTaskIds,planContextOverLimit=!1){let resolved=resolveDelegateAckTaskIdResult(args2,knownPlanTaskIds,planContextOverLimit);return resolved.status==="resolved"?resolved.taskId:void 0}function resolveDelegateAckTaskIdResult(args2,knownPlanTaskIds,planContextOverLimit=!1){return resolveTaskId(args2,{policy:"attribution",knownPlanTaskIds,planContextOverLimit})}async function appendUnacknowledgedCritical(directory,record3){let filePath=validateSwarmPath(directory,"unacknowledged-criticals.jsonl");await appendCappedJsonl(filePath,JSON.stringify(record3),{maxEntries:resolveRetentionCap("MAX_UNACKNOWLEDGED_CRITICALS",MAX_UNACKNOWLEDGED_CRITICALS),onPrune:(dropped)=>{warn(`unacknowledged-criticals audit at cap: dropped ${dropped} oldest ${dropped===1?"entry":"entries"} (FIFO bound MAX_UNACKNOWLEDGED_CRITICALS)`)}})}async function reconcileShownDirectives(params){let result={emitted:[],unacknowledgedCriticals:[],unacknowledgedNonCritical:[]};try{let shown=params.shown;if(shown.length===0)return result;let shownById=new Map(shown.map((d)=>[d.id,d])),criticalIds=shown.filter((d)=>d.priority==="critical").map((d)=>d.id),acks=parseAcknowledgments(params.transcript),ackedIds=new Set,violatedIds=new Set,sessionId=params.sessionId,taskId=params.taskId,traceId=params.traceId??"legacy-unverifiable",isLegacyPrompt=params.traceId===void 0,cohortId,linkId;try{cohortId=await ensureCohortIdCached(params.directory,sessionId),linkId=readLinkPointer(params.directory)?.linkId}catch{}let ackItems=[],ackByItemId=new Map;for(let ack of acks){if(!shownById.has(ack.id))continue;if(ackedIds.add(ack.id),!isLegacyPrompt&&ack.trace_id!==traceId)continue;if(ack.result==="applied"||ack.result==="ignored"||ack.result==="violated"||ack.result==="n_a"||ack.result==="contradicted")ackItems.push({id:ack.id,outcome:ack.result,reason:ack.reason}),ackByItemId.set(ack.id,ack)}let eventIdByKnowledgeId=new Map;if(isLegacyPrompt)for(let ack of acks){if(!shownById.has(ack.id))continue;if(!ackByItemId.has(ack.id))continue;ackedIds.add(ack.id)}else{let validation2=await validateReceipt({directory:params.directory,trace_id:traceId,session_id:sessionId,task_id:taskId,agent:params.agent,source:"delegate",cohort_id:cohortId,source_link_id:linkId,items:ackItems,no_relevant_knowledge:!1});if(validation2.ok){for(let item of validation2.accepted){let ack=ackByItemId.get(item.id);if(!ack)continue;ackedIds.add(item.id),await recordKnowledgeEvent(params.directory,{type:item.outcome,trace_id:traceId,knowledge_id:item.id,session_id:sessionId,task_id:taskId,agent:params.agent,source:"delegate",reason:ack.reason});let authoritativeEventId=validation2.authoritative_event_ids[item.id];if(authoritativeEventId)eventIdByKnowledgeId.set(item.id,authoritativeEventId);if(item.outcome==="violated")violatedIds.add(item.id);result.emitted.push({id:item.id,type:item.outcome})}for(let item of validation2.idempotent_skips)ackedIds.add(item.id);for(let rejected2 of validation2.rejected_items??[])ackedIds.add(rejected2.item.id)}if(!validation2.ok)for(let id of ackByItemId.keys())ackedIds.add(id)}try{let now2=new Date().toISOString(),evidenceRecords=[];for(let[kid,eid]of eventIdByKnowledgeId){let ack=ackByItemId.get(kid);if(!ack||!cohortId)continue;let outcome=ack.result;if(outcome!=="applied"&&outcome!=="violated"&&outcome!=="contradicted")continue;evidenceRecords.push({cohort_id:cohortId,source_link_id:linkId,entry_id:kid,retrieval_trace_id:traceId,receipt_outcome:outcome,receipt_source:"delegate",receipt_event_id:eid,phase:void 0,timestamp:now2})}await appendPromotionEvidence(params.directory,evidenceRecords)}catch{}let missingCriticalIds=criticalIds.filter((id)=>!ackedIds.has(id)),committedMissingCriticalIds=new Set;if(!isLegacyPrompt&&missingCriticalIds.length>0){let committed=await validateAndCommitTerminalBatch(params.directory,{trace_id:traceId,session_id:sessionId,task_id:taskId,agent:params.agent,cohort_id:cohortId,source_link_id:linkId,items:missingCriticalIds.map((entry_id)=>({entry_id,outcome:"violated",source:"delegate",reason:"unacknowledged"}))});if(committed.ok)committedMissingCriticalIds=new Set(committed.committed.map((item)=>item.entry_id))}for(let id of missingCriticalIds){if(!committedMissingCriticalIds.has(id))continue;result.unacknowledgedCriticals.push(id),await recordKnowledgeEvent(params.directory,{type:"violated",trace_id:traceId,knowledge_id:id,session_id:sessionId,task_id:taskId,agent:params.agent,source:"delegate",reason:"unacknowledged"}),violatedIds.add(id),result.emitted.push({id,type:"violated"});try{await appendUnacknowledgedCritical(params.directory,{timestamp:new Date().toISOString(),knowledge_id:id,agent:params.agent,session_id:sessionId,task_id:taskId,reason:"unacknowledged"})}catch{}}let silentEvents=[];for(let[id,directive]of shownById){if(directive.priority==="critical")continue;if(ackedIds.has(id))continue;if(params.replay===!0)continue;result.unacknowledgedNonCritical.push(id),silentEvents.push({type:"unacknowledged",trace_id:traceId,knowledge_id:id,session_id:sessionId,task_id:taskId,agent:params.agent,source:"delegate",reason:"no_ack_marker"}),result.emitted.push({id,type:"unacknowledged"})}if(silentEvents.length>0)await recordKnowledgeEventsBatch(params.directory,silentEvents);if(violatedIds.size>0)await escalateViolatedEntries(params.directory,[...violatedIds])}catch{}return result}async function collectDelegateAcks(params){let shown=parseDelegateDirectiveBlock(params.prompt);if(shown.length===0)return{emitted:[],unacknowledgedCriticals:[],unacknowledgedNonCritical:[]};let sessionId=params.sessionId;if(!sessionId)return{emitted:[],unacknowledgedCriticals:[],unacknowledgedNonCritical:[],unverifiable:{code:"missing_session_id",detail:"Delegate acknowledgments require a real host session id"}};let traceId=parseDelegateDirectiveTraceId(params.prompt)??void 0,taskId=params.taskIdResolution?params.taskIdResolution.status==="resolved"?params.taskIdResolution.taskId:void 0:params.taskId??resolveDelegateAckTaskId({prompt:params.prompt});return reconcileShownDirectives({directory:params.directory,shown,traceId,transcript:params.transcript,agent:params.agent,sessionId,taskId})}async function collectLaneDelegateAcks(params){let empty={emitted:[],unacknowledgedCriticals:[],unacknowledgedNonCritical:[],phases:[]};try{let memberships=await queryLiveMemberships(params.directory,{session_id:params.sessionId,exposure_kind:"delegate_directive",include_terminal:!0});if(!memberships.ok)return empty;let byTrace=new Map,phases=new Set;for(let membership of memberships.memberships){let group=byTrace.get(membership.trace_id)??[];if(group.push(membership),byTrace.set(membership.trace_id,group),membership.phase)phases.add(membership.phase)}let combined={emitted:[],unacknowledgedCriticals:[],unacknowledgedNonCritical:[]};for(let[traceId,group]of byTrace){let taskId=group.find((m)=>m.task_id)?.task_id,outcome=await reconcileShownDirectives({directory:params.directory,shown:group.map((m)=>({id:m.entry_id,priority:m.critical?"critical":"medium"})),traceId,transcript:params.transcript,agent:params.agent,sessionId:params.sessionId,taskId,replay:params.replay});if(combined.emitted.push(...outcome.emitted),combined.unacknowledgedCriticals.push(...outcome.unacknowledgedCriticals),combined.unacknowledgedNonCritical.push(...outcome.unacknowledgedNonCritical),outcome.unverifiable)combined.unverifiable=outcome.unverifiable}return{...combined,phases:[...phases]}}catch{return empty}}async function collectDelegateAcksAfter(directory,input,output){if(!isTaskTool3(input.tool))return;let argsRecord=input.args&&typeof input.args==="object"?input.args:null,prompt=argsRecord&&typeof argsRecord.prompt==="string"?argsRecord.prompt:"";if(!prompt)return;let transcript=typeof output.output==="string"?output.output:"";if(!transcript)return;let agent=parseDelegationArgs(input.args)?.targetAgent??"unknown",sessionId=typeof input.sessionID==="string"?input.sessionID:void 0,planTaskIdOptions=toTaskIdPlanContextOptions(await loadPlanTaskIdContext(directory)),taskIdResolution=resolveDelegateAckTaskIdResult(argsRecord??{prompt},planTaskIdOptions.knownPlanTaskIds,planTaskIdOptions.planContextOverLimit);await collectDelegateAcks({directory,prompt,transcript,agent,sessionId,taskIdResolution})}var MAX_UNACKNOWLEDGED_CRITICALS=500;var init_delegate_ack_collector=__esm(()=>{init_caps();init_jsonl_cap();init_logger();init_cohort_cache();init_knowledge_application();init_knowledge_escalator();init_knowledge_events();init_knowledge_injector();init_knowledge_link();init_knowledge_receipt_ledger();init_knowledge_receipt_validator();init_plan_task_id_context();init_promotion_evidence_store();init_skill_propagation_gate();init_task_id_resolver();init_utils2()});import{existsSync as existsSync160,readdirSync as readdirSync47,readFileSync as readFileSync131,statSync as statSync93}from"node:fs";import*as path301 from"node:path";function validateRepoRelativeGlob(directory,value){let v=value.trim();if(!v)return null;if(v.includes("\x00"))return null;if(v.startsWith("/")||/^[A-Za-z]:[\\/]/.test(v)||v.startsWith("\\"))return null;if(v.split(/[/\\]/).some((s)=>s===".."))return null;let globStart=v.search(/[*?{[]/),concrete=globStart===-1?v:v.slice(0,globStart);if(concrete){let baseDir=path301.resolve(directory),resolved=path301.resolve(baseDir,concrete),rel3=path301.relative(baseDir,resolved);if(rel3.startsWith("..")||path301.isAbsolute(rel3))return null}return v}function findBinaryInPath(binary){let candidates=process.platform==="win32"?[`${binary}.exe`,`${binary}.cmd`,`${binary}.bat`,binary]:[binary];for(let dir of(process.env.PATH??"").split(path301.delimiter)){if(!dir)continue;for(let name of candidates){let candidate2=path301.join(dir,name);if(existsSync160(candidate2))return candidate2}}return null}function safeChildEnv(){let env={};if(process.env.PATH)env.PATH=process.env.PATH;if(process.env.HOME)env.HOME=process.env.HOME;if(process.env.SystemRoot)env.SystemRoot=process.env.SystemRoot;if(process.env.TEMP)env.TEMP=process.env.TEMP;if(process.env.TMP)env.TMP=process.env.TMP;return env}async function runArgv(argv,cwd){let proc=bunSpawn(argv,{stdin:"ignore",stdout:"pipe",stderr:"pipe",cwd,env:safeChildEnv()}),finished=!1;try{let timeout=new Promise((resolve116)=>setTimeout(()=>resolve116("timeout"),PREDICATE_TIMEOUT_MS));if(await Promise.race([proc.exited,timeout])==="timeout")return{exitCode:null,stdout:"",stderr:"",timedOut:!0};let[stdout,stderr]=await Promise.all([proc.stdout.text().catch(()=>""),proc.stderr.text().catch(()=>"")]);return finished=!0,{exitCode:proc.exitCode,stdout,stderr,timedOut:!1}}finally{if(!finished)try{proc.kill()}catch{}}}async function runGrepPredicate(rest,directory){let lastColon=rest.lastIndexOf(":");if(lastColon<=0||lastColon===rest.length-1)return{result:"error",detail:"grep: expected <regex>:<path-glob>"};let regex=rest.slice(0,lastColon),rawGlob=rest.slice(lastColon+1),glob=validateRepoRelativeGlob(directory,rawGlob);if(glob===null)return{result:"error",detail:`grep: unsafe or empty path-glob "${rawGlob}"`};let pattern;try{pattern=new RegExp(regex,"m")}catch(err){return{result:"error",detail:`grep: invalid regex ${err instanceof Error?err.message:String(err)}`}}let matcher=import_picomatch2.default(glob,{dot:!0}),visited=0,matches=0,walk=(dir)=>{if(visited>=GREP_MAX_FILES)return;let entries2;try{entries2=readdirSync47(dir,{withFileTypes:!0})}catch{return}for(let entry of entries2){if(visited>=GREP_MAX_FILES)return;let fullPath=path301.join(dir,entry.name),relPath=path301.relative(directory,fullPath).replace(/\\/g,"/");if(entry.isDirectory()){if(!GREP_SKIP_DIRECTORIES.has(entry.name))walk(fullPath);continue}if(!entry.isFile())continue;if(visited++,!matcher(relPath))continue;try{if(statSync93(fullPath).size>GREP_MAX_BYTES_PER_FILE)continue;let found=readFileSync131(fullPath,"utf-8").match(pattern);if(found)matches+=found.length}catch{}}};if(walk(directory),visited>=GREP_MAX_FILES)return{result:"error",detail:`grep: file scan exceeded ${GREP_MAX_FILES} files`};if(matches===0)return{result:"pass",detail:"grep: zero matches"};return{result:"fail",detail:`grep: ${matches} match(es) found`}}async function runToolPredicate(rest,directory){let raw=rest.trim();if(!raw)return{result:"error",detail:"tool: empty command"};if(raw.includes("\x00"))return{result:"error",detail:"tool: null byte in command"};let argvParts=raw.split(/\s+/).filter((p)=>p.length>0);if(argvParts.length===0)return{result:"error",detail:"tool: empty command"};let binary=argvParts[0];if(binary.includes("/")||binary.includes("\\"))return{result:"error",detail:`tool: path-qualified binary "${binary}" is not allowed`};if(!TOOL_BINARY_ALLOWLIST.has(binary))return{result:"error",detail:`tool: binary "${binary}" is not on the allowlist`};let resolved=findBinaryInPath(binary);if(!resolved)return{result:"error",detail:`tool: binary "${binary}" not found`};let res=await runArgv([resolved,...argvParts.slice(1)],directory);if(res.timedOut)return{result:"error",detail:"tool: timed out"};if(res.exitCode===0)return{result:"pass",detail:"tool: exit 0"};return{result:"fail",detail:`tool: exit ${res.exitCode} ${res.stderr.slice(0,200)}`}}async function changedPaths(directory){let git2=findBinaryInPath("git");if(!git2)return null;let res=await runArgv([git2,"status","--porcelain","-z"],directory);if(res.timedOut||res.exitCode!==0)return null;let out=new Set;for(let entry of res.stdout.split("\x00")){if(entry.length<=3)continue;let p=entry.slice(3);if(p)out.add(path301.normalize(p))}return out}async function runFileModifiedPredicate(rest,directory,expectModified){let label=expectModified?"file_modified":"file_not_modified",safe2=validateRepoRelativeGlob(directory,rest);if(safe2===null)return{result:"error",detail:`${label}: unsafe or empty path "${rest}"`};let changed2=await changedPaths(directory);if(changed2===null)return{result:"error",detail:`${label}: git unavailable or failed`};let target=path301.normalize(safe2),isChanged=changed2.has(target);return{result:(expectModified?isChanged:!isChanged)?"pass":"fail",detail:`${label}: ${target} ${isChanged?"changed":"unchanged"}`}}async function runDirectivePredicate(predicate,directory){try{if(typeof predicate!=="string"||!predicate.trim())return{result:"error",detail:"predicate: empty"};let trimmed=predicate.trim(),firstColon=trimmed.indexOf(":");if(firstColon<=0)return{result:"error",detail:"predicate: missing handler prefix (expected <handler>:...)"};let handler=trimmed.slice(0,firstColon),rest=trimmed.slice(firstColon+1);switch(handler){case"grep":return await runGrepPredicate(rest,directory);case"tool":return await runToolPredicate(rest,directory);case"file_not_modified":return await runFileModifiedPredicate(rest,directory,!1);case"file_modified":return await runFileModifiedPredicate(rest,directory,!0);default:return{result:"error",detail:`predicate: unknown handler "${handler}"`}}}catch(err){return warn(`[directive-predicate-runner] unexpected error: ${err instanceof Error?err.message:String(err)}`),{result:"error",detail:"predicate: unexpected error (fail-closed)"}}}var import_picomatch2,PREDICATE_TIMEOUT_MS=15000,GREP_MAX_FILES=1e4,GREP_MAX_BYTES_PER_FILE=1e6,GREP_SKIP_DIRECTORIES,TOOL_BINARY_ALLOWLIST;var init_directive_predicate_runner=__esm(()=>{init_bun_compat();init_logger();import_picomatch2=__toESM(require_picomatch2(),1),GREP_SKIP_DIRECTORIES=new Set([".git",".swarm","node_modules","dist","coverage"]),TOOL_BINARY_ALLOWLIST=new Set(["rg","grep","git","biome","eslint","tsc","ruff"])});function parseReviewerDirectiveCompliance(text){if(!text||typeof text!=="string")return[];let out=[];for(let m of text.matchAll(VERDICT_PATTERN)){let verb=m[1].toUpperCase(),traceId=decodeDirectiveCorrelationId(m[2]),entryId=decodeDirectiveCorrelationId(m[3]);if(!traceId||!entryId)continue;let evidence2=m[4]?.trim().slice(0,280),verdict=verb==="VERIFIED"?"verified":verb==="VIOLATED"?"violated":"n_a";out.push({trace_id:traceId,entry_id:entryId,verdict,evidence:evidence2})}return out}function verdictToEventType(v){return v==="verified"?"applied":v==="violated"?"violated":"n_a"}function pairKey2(traceId,entryId){return JSON.stringify([traceId,entryId])}async function reconcileReviewerVerdicts(params){let result={emitted:[],omittedCriticals:[],uncertainties:[]},verifyByPair=new Map(params.directivesToVerify.map((d)=>[pairKey2(d.trace_id,d.entry_id),d]));if(verifyByPair.size===0)return result;let verdictsByPair=new Map;for(let verdict of parseReviewerDirectiveCompliance(params.transcript)){let key2=pairKey2(verdict.trace_id,verdict.entry_id);if(!verifyByPair.has(key2))continue;let existing=verdictsByPair.get(key2)??[];existing.push(verdict),verdictsByPair.set(key2,existing)}let pending=[];for(let[key2,directive]of verifyByPair){let matching=verdictsByPair.get(key2)??[];if(matching.length>1){result.uncertainties.push({trace_id:directive.trace_id,entry_id:directive.entry_id,code:"duplicate_verdict",uncertainty:"Reviewer emitted more than one verdict for the exact pair"});continue}if(matching.length===0){if(directive.priority!=="critical")continue;result.omittedCriticals.push({trace_id:directive.trace_id,entry_id:directive.entry_id}),pending.push({directive,type:"violated",reason:"reviewer_omitted"});continue}let verdict=matching[0];if(verdict.verdict==="verified"&&!verdict.evidence?.trim()){if(result.uncertainties.push({trace_id:directive.trace_id,entry_id:directive.entry_id,code:"reviewer_missing_evidence",uncertainty:"VERIFIED requires nonempty evidence"}),directive.priority==="critical")result.omittedCriticals.push({trace_id:directive.trace_id,entry_id:directive.entry_id}),pending.push({directive,type:"violated",reason:"reviewer_missing_evidence"});continue}let item={directive,type:verdictToEventType(verdict.verdict),reason:verdict.evidence};if(verdict.verdict==="violated"&&directive.verification_predicate)try{let outcome=await _internals245.runDirectivePredicate(directive.verification_predicate,params.directory);item.predicate_check={predicate:directive.verification_predicate,result:outcome.result,detail:outcome.detail}}catch(error93){item.predicate_check={predicate:directive.verification_predicate,result:"error",detail:error93 instanceof Error?error93.message:String(error93)}}pending.push(item)}let groups=new Map;for(let item of pending){let groupKey=JSON.stringify([item.directive.trace_id,item.directive.session_id,item.directive.cohort_id,item.directive.source_link_id,item.directive.prior_terminal_outcome,item.directive.prior_terminal_event_id]),group=groups.get(groupKey)??[];group.push(item),groups.set(groupKey,group)}let violatedIds=new Set,agent=params.agent??"reviewer";for(let group of groups.values()){let first=group[0].directive,remediationAuthorization=(first.prior_terminal_outcome==="violated"||first.prior_terminal_outcome==="contradicted")&&first.prior_terminal_event_id&&group.some((item)=>item.type!=="violated")?{actor:"reviewer-remediation",reason:"reviewer_verified_remediation",expected_event_id:first.prior_terminal_event_id,expected_outcome:first.prior_terminal_outcome}:void 0,committedEntries;try{let committed=await _internals245.validateAndCommitTerminalBatch(params.directory,{trace_id:first.trace_id,session_id:first.session_id,cohort_id:first.cohort_id,source_link_id:first.source_link_id,authorization:remediationAuthorization,items:group.map((item)=>({entry_id:item.directive.entry_id,outcome:item.type,source:"reviewer",reason:item.reason}))});if(!committed.ok){for(let item of group)result.uncertainties.push({trace_id:item.directive.trace_id,entry_id:item.directive.entry_id,code:committed.code,uncertainty:committed.detail});continue}committedEntries=new Set(committed.accepted.map((terminal)=>terminal.entry_id));for(let rejected2 of committed.rejected)result.uncertainties.push({trace_id:first.trace_id,entry_id:rejected2.entry_id||void 0,code:rejected2.reason,uncertainty:"Authoritative ledger rejected reviewer terminal"})}catch(error93){for(let item of group)result.uncertainties.push({trace_id:item.directive.trace_id,entry_id:item.directive.entry_id,code:"ledger_exception",uncertainty:error93 instanceof Error?error93.message:String(error93)});continue}for(let item of group){if(!committedEntries.has(item.directive.entry_id))continue;try{if(await _internals245.recordKnowledgeEvent(params.directory,{type:item.type,trace_id:item.directive.trace_id,knowledge_id:item.directive.entry_id,session_id:item.directive.session_id,task_id:params.taskId,phase:params.phase,agent,source:"reviewer",reason:item.reason,predicate_check:item.predicate_check}),result.emitted.push({trace_id:item.directive.trace_id,entry_id:item.directive.entry_id,id:item.directive.entry_id,type:item.type,source:"reviewer"}),item.type==="violated")violatedIds.add(item.directive.entry_id)}catch(error93){result.uncertainties.push({trace_id:item.directive.trace_id,entry_id:item.directive.entry_id,code:"diagnostic_event_failed",uncertainty:error93 instanceof Error?error93.message:String(error93)})}}}if(violatedIds.size>0)try{await _internals245.escalateViolatedEntries(params.directory,[...violatedIds])}catch(error93){result.uncertainties.push({trace_id:"",code:"escalation_failed",uncertainty:error93 instanceof Error?error93.message:String(error93)})}return result}function isTaskTool7(tool3){return tool3==="Task"||tool3==="task"}async function collectReviewerVerdictsAfter(directory,input,output){if(!isTaskTool7(input.tool))return;let parsedArgs=parseDelegationArgs(input.args);if(!parsedArgs)return;if(stripKnownSwarmPrefix(parsedArgs.targetAgent).toLowerCase()!=="reviewer")return;let argsRecord=input.args&&typeof input.args==="object"?input.args:null,prompt=argsRecord&&typeof argsRecord.prompt==="string"?argsRecord.prompt:"";if(!prompt)return;let transcript=typeof output.output==="string"?output.output:"";if(!transcript)return;let directivesToVerify=parseDirectivesToVerifyBlock(prompt);if(directivesToVerify.length===0)return;let sessionId=typeof input.sessionID==="string"?input.sessionID:void 0;await reconcileReviewerVerdicts({directory,transcript,directivesToVerify,sessionId,agent:"reviewer"})}var _internals245,VERDICT_PATTERN;var init_reviewer_verdict_parser=__esm(()=>{init_reviewer_directive_compliance();init_schema();init_directive_predicate_runner();init_knowledge_escalator();init_knowledge_events();init_knowledge_receipt_ledger();init_skill_propagation_gate();_internals245={validateAndCommitTerminalBatch,recordKnowledgeEvent,runDirectivePredicate,escalateViolatedEntries},VERDICT_PATTERN=/\b(VERIFIED|VIOLATED|N\/A)\s*:\s*([^:\s]{1,512})\s*:\s*([^:\s]{1,512})(?:\s+(?:evidence|reason)\s*=\s*([^\n\r]+?))?(?=$|[\n\r]|\s+(?:VERIFIED|VIOLATED|N\/A)\b)/gi});import{createHash as createHash102}from"node:crypto";function delegationCostRecordMaterial(record3){if(!record3.laneId)return`${record3.parentSessionId}\x00${record3.callID}`;return`${record3.parentSessionId}\x00${record3.callID}\x00lane:${record3.laneId}`}function buildDelegationTerminalIdentityFields(input){let material=delegationCostRecordMaterial(input.record);return{record_id:createHash102("sha256").update(`delegation-cost-id-v1\x00${material}`).digest("hex").slice(0,32),identity_fingerprint:createHash102("sha256").update(`delegation-cost-identity-v1\x00${material}\x00${input.record.swarmPrefixedAgent}\x00${input.model??""}`).digest("hex").slice(0,32),version:1,parent_session_digest:createHash102("sha256").update(`delegation-cost-parent-v1\x00${input.record.parentSessionId}`).digest("hex").slice(0,32),child_session_digest:createHash102("sha256").update(`delegation-cost-child-v1\x00${input.record.subagentSessionId}`).digest("hex").slice(0,32),...input.recovered?{recovered:!0}:{}}}var init_delegation_cost_identity=()=>{};var exports_delegation_lifecycle={};__export(exports_delegation_lifecycle,{settleDelegationTerminal:()=>settleDelegationTerminal,recoverTerminalLaneReceipts:()=>recoverTerminalLaneReceipts,isBenignSettleOutcome:()=>isBenignSettleOutcome,emitDelegationEventlessTerminalEnd:()=>emitDelegationEventlessTerminalEnd,emitDelegationBegin:()=>emitDelegationBegin,delegationCostRecordMaterial:()=>delegationCostRecordMaterial,buildDelegationTerminal:()=>buildDelegationTerminal,_internals:()=>_internals257,TERMINAL_LANE_RECEIPT_RECOVERY_DEADLINE_MS:()=>TERMINAL_LANE_RECEIPT_RECOVERY_DEADLINE_MS,MAX_TERMINAL_LANE_RECEIPT_RECOVERY:()=>MAX_TERMINAL_LANE_RECEIPT_RECOVERY});import*as fs180 from"node:fs";import*as path315 from"node:path";function isBenignSettleOutcome(kind){return kind==="duplicate"||kind==="conflict"||kind==="already_terminal_without_event"}function buildDelegationTerminal(record3,terminal,now2){return{eventId:buildBackgroundCompletionEventId({correlationId:record3.correlationId,jobId:record3.jobId,status:terminal.status,resultDigest:terminal.result.digest}),status:terminal.status,recordedAt:now2,result:terminal.result}}async function settleDelegationTerminal(directory,record3,terminal,observations={},now2=Date.now()){let claim=await _internals257.claimTerminalResult(directory,record3.correlationId,buildDelegationTerminal(record3,terminal,now2));if(claim){if(claim.disposition==="claimed")return await runDelegationTerminalObservations(directory,claim.record,terminal,observations,now2),{kind:"claimed",record:claim.record};if(claim.disposition==="duplicate"&&observations.transcript)await reconcileLaneKnowledgeReceipts(directory,claim.record,observations,!0);return{kind:"duplicate",record:claim.record}}let reread=_internals257.findByCorrelationIdDetailed(directory,record3.correlationId);if(reread.status==="uncertain")return{kind:"uncertain",reason:reread.reason};if(!reread.value)return{kind:"missing"};if(isTerminalDelegationStatus(reread.value.status)){if(reread.value.terminalResult)return{kind:"conflict",record:reread.value};return emitDelegationEventlessTerminalEnd(reread.value,reread.value.status),{kind:"already_terminal_without_event",record:reread.value}}return{kind:"not_open",record:reread.value}}function emitDelegationBegin(record3){try{_internals257.telemetry.delegationBegin(record3.parentSessionId,record3.swarmPrefixedAgent,record3.planTaskId??""),recordExecutionAttempt({sessionId:record3.parentSessionId,...record3.planTaskId?{taskId:record3.planTaskId}:{},attemptClass:"attempt",outcomeStatus:"unknown"})}catch{}}function terminalAttemptClass(status2){if(status2==="cancelled")return"cancelled";return"result"}function terminalAttemptOutcome(status2){if(status2==="completed")return"success";if(status2==="error"||status2==="failed")return"failure";return"unknown"}function emitDelegationCostObservation(record3,observations,terminalStatus,recovered=!1){try{let costFields=buildDelegationCostFields({raw:observations.costRaw,model:observations.model,pricing:observations.pricing});Object.assign(costFields,buildDelegationTerminalIdentityFields({record:record3,model:observations.model,recovered})),_internals257.telemetry.delegationEnd(record3.parentSessionId,record3.swarmPrefixedAgent,record3.planTaskId??"",terminalStatus,costFields);let usageAttested=costFields.cost_source==="reported";recordExecutionAttempt({sessionId:record3.parentSessionId,...record3.planTaskId?{taskId:record3.planTaskId}:{},...record3.callID?{callId:record3.callID}:{},...record3.laneId?{laneId:record3.laneId}:{},attemptClass:terminalAttemptClass(terminalStatus),outcomeStatus:terminalAttemptOutcome(terminalStatus),cost:{...observations.startedAt!==void 0?{latencyMs:Math.max(0,Date.now()-observations.startedAt)}:{},...usageAttested?{...typeof costFields.tokens_input==="number"?{inputTokens:costFields.tokens_input}:{},...typeof costFields.tokens_output==="number"?{outputTokens:costFields.tokens_output}:{},...typeof costFields.tokens_cache==="number"?{cacheReadTokens:costFields.tokens_cache}:{}}:{},...costFields.cost_source==="reported"&&costFields.cost_usd!==null?{billedCostUsd:costFields.cost_usd}:{},...costFields.cost_source==="estimated"&&costFields.cost_usd!==null?{estimatedCostUsd:costFields.cost_usd}:{}}})}catch(error93){log(`[delegation-lifecycle] cost observation skipped: ${error93 instanceof Error?error93.message:String(error93)}`)}}function emitDelegationEventlessTerminalEnd(record3,terminalStatus){emitDelegationCostObservation(record3,{},terminalStatus,!0)}async function appendDelegationTrajectoryObservation(directory,record3,terminalStatus,observations,now2){try{let lastStep=await getCurrentStep(record3.parentSessionId,directory);seedTrajectoryStepCounter(record3.parentSessionId,directory,lastStep);let entry={step:nextTrajectoryStep(record3.parentSessionId,directory),agent:record3.swarmPrefixedAgent,action:"delegate",target:record3.laneId??record3.correlationId,intent:`dispatch_lanes terminal ${terminalStatus}`,timestamp:new Date(now2).toISOString(),result:terminalStatus==="completed"?"success":"failure",tool:"dispatch_lanes",...observations.startedAt!==void 0?{elapsed_ms:Math.max(0,now2-observations.startedAt)}:{},...record3.batchId!==void 0?{batchId:record3.batchId}:{},laneId:record3.laneId??record3.correlationId,...record3.planTaskId?{taskId:record3.planTaskId}:{}};await appendTrajectoryEntry(record3.parentSessionId,entry,directory)}catch{}}async function reconcileLaneKnowledgeReceipts(directory,record3,observations,replay=!1){if(!observations.transcript)return;try{let ack=await collectLaneDelegateAcks({directory,sessionId:record3.subagentSessionId,agent:record3.swarmPrefixedAgent,transcript:observations.transcript,replay});if(record3.normalizedAgent!=="reviewer")return;let phase=ack.phases.find((value)=>Boolean(value));if(!phase)return;let directivesToVerify=await readPhaseDirectivesToVerify(directory,phase);if(directivesToVerify.length===0)return;await reconcileReviewerVerdicts({directory,transcript:observations.transcript,directivesToVerify,sessionId:record3.subagentSessionId,agent:"reviewer"})}catch{}}async function runDelegationTerminalObservations(directory,record3,terminal,observations,now2){emitDelegationCostObservation(record3,observations,terminal.status),await appendDelegationTrajectoryObservation(directory,record3,terminal.status,observations,now2),await reconcileLaneKnowledgeReceipts(directory,record3,observations)}function candidateAfter(record3,cursor){if(record3.updatedAt!==cursor.updatedAt)return record3.updatedAt>cursor.updatedAt;return record3.correlationId>cursor.correlationId}function readRecoveryCursor(directory){try{let filePath=path315.join(directory,".swarm",RECOVERY_CURSOR_FILE);if(!fs180.existsSync(filePath))return null;let parsed=JSON.parse(fs180.readFileSync(filePath,"utf-8"));if(typeof parsed.updatedAt==="number"&&Number.isFinite(parsed.updatedAt)&&typeof parsed.correlationId==="string"&&parsed.correlationId.length>0)return{updatedAt:parsed.updatedAt,correlationId:parsed.correlationId};return null}catch{return null}}function writeRecoveryCursor(directory,cursor){try{let swarmDir=path315.join(directory,".swarm");fs180.mkdirSync(swarmDir,{recursive:!0});let filePath=path315.join(swarmDir,RECOVERY_CURSOR_FILE);if(cursor===null)fs180.rmSync(filePath,{force:!0});else fs180.writeFileSync(filePath,JSON.stringify(cursor),"utf-8")}catch{}}function isRecoverableTerminalLaneRecord(record3){return Boolean(record3.laneId&&record3.terminalResult&&typeof record3.terminalResult.result.text==="string"&&record3.terminalResult.result.text.length>0)}async function recoverTerminalLaneReceipts(directory,records,options={}){let now2=options.now??Date.now,deadlineMs=options.deadlineMs??TERMINAL_LANE_RECEIPT_RECOVERY_DEADLINE_MS,deadline=now2()+deadlineMs;if(records!==void 0){let recovered2=0;for(let record3 of records){if(!isRecoverableTerminalLaneRecord(record3))continue;let transcript=record3.terminalResult?.result.text;if(!transcript)continue;if(now2()>=deadline)return{recovered:recovered2,exhaustedBudget:!0};try{await reconcileLaneKnowledgeReceipts(directory,record3,{transcript},!0),recovered2+=1}catch{}}return{recovered:recovered2,exhaustedBudget:!1}}let enumeration=readDelegationsDetailed(directory);if(enumeration.status==="uncertain")return warn(`[delegation-lifecycle] terminal-lane receipt recovery deferred: delegation store unreadable after ${enumeration.attempts} attempts (${enumeration.reason})`),{recovered:0,exhaustedBudget:!1};let candidates=enumeration.records.filter(isRecoverableTerminalLaneRecord).sort((left,right)=>{if(left.updatedAt!==right.updatedAt)return left.updatedAt-right.updatedAt;return left.correlationId<right.correlationId?-1:left.correlationId>right.correlationId?1:0});if(candidates.length===0)return{recovered:0,exhaustedBudget:!1};let cursor=readRecoveryCursor(directory),selected=cursor?candidates.filter((record3)=>candidateAfter(record3,cursor)):candidates,wrapped=!1;if(selected.length===0)selected=candidates,wrapped=!0;let recovered=0,lastProcessed=null;for(let record3 of selected){if(recovered>=MAX_TERMINAL_LANE_RECEIPT_RECOVERY)break;if(now2()>=deadline)break;let transcript=record3.terminalResult?.result.text;if(!transcript)continue;try{await reconcileLaneKnowledgeReceipts(directory,record3,{transcript},!0),recovered+=1,lastProcessed={updatedAt:record3.updatedAt,correlationId:record3.correlationId}}catch{lastProcessed={updatedAt:record3.updatedAt,correlationId:record3.correlationId}}}let lastCandidate=selected[selected.length-1],processedAll=selected.length>0&&lastProcessed!==null&&lastCandidate!==void 0&&lastProcessed.updatedAt===lastCandidate.updatedAt&&lastProcessed.correlationId===lastCandidate.correlationId,nextCursor=wrapped&&processedAll?null:lastProcessed??cursor??null;if(nextCursor?.correlationId!==cursor?.correlationId)writeRecoveryCursor(directory,nextCursor);return{recovered,exhaustedBudget:recovered<selected.length&&(now2()>=deadline||recovered>=MAX_TERMINAL_LANE_RECEIPT_RECOVERY)}}var MAX_TERMINAL_LANE_RECEIPT_RECOVERY=64,TERMINAL_LANE_RECEIPT_RECOVERY_DEADLINE_MS=5000,RECOVERY_CURSOR_FILE="lane-receipt-recovery-cursor.json",_internals257;var init_delegation_lifecycle=__esm(()=>{init_delegate_ack_collector();init_phase_directives();init_reviewer_verdict_parser();init_trajectory_step_state();init_trajectory_store();init_cost_accounting();init_execution_attempt();init_telemetry();init_logger();init_delegation_cost_identity();init_pending_delegations();init_delegation_cost_identity();registerStaleSweepObserver((record3)=>{emitDelegationEventlessTerminalEnd(record3,"stale")});_internals257={claimTerminalResult,findByCorrelationId,findByCorrelationIdDetailed,telemetry}});var exports_design_doc_drift={};__export(exports_design_doc_drift,{runDesignDocDriftCheck:()=>runDesignDocDriftCheck,_internals:()=>_internals287});import*as fs208 from"node:fs";import*as path346 from"node:path";function mtimeMsOrNull(absPath){try{return fs208.statSync(absPath).mtimeMs}catch{return null}}function resolveAnchorWithin(directory,anchor){if(!anchor||typeof anchor!=="string")return null;let root=path346.resolve(directory),resolved=path346.resolve(root,anchor),rel3=path346.relative(root,resolved);if(rel3.startsWith("..")||path346.isAbsolute(rel3))return null;return resolved}async function runDesignDocDriftCheck(directory,phase,outDir){try{let root=path346.resolve(directory),outAbs=path346.resolve(root,outDir),outRel=path346.relative(root,outAbs);if(outRel.startsWith("..")||path346.isAbsolute(outRel))return null;let docMtimes=new Map,checkedDocs=[],missingDocs=[];for(let[docName,relFile]of Object.entries(DESIGN_DOC_FILES)){let abs=path346.join(outAbs,relFile),mtime=mtimeMsOrNull(abs);if(docMtimes.set(docName,mtime),mtime===null)missingDocs.push(path346.join(outDir,relFile));else checkedDocs.push(path346.join(outDir,relFile))}let traceabilityAbs=path346.join(outAbs,TRACEABILITY_REL),registry4=null;try{if((await fs208.promises.stat(traceabilityAbs)).size<=MAX_TRACEABILITY_BYTES){let raw=await fs208.promises.readFile(traceabilityAbs,"utf-8"),parsed=JSON.parse(raw);registry4=parsed&&typeof parsed==="object"&&!Array.isArray(parsed)?parsed:null}}catch{registry4=null}let noDocs=checkedDocs.length===0||registry4===null,effectiveSpec=readEffectiveSpecSync(root),specMtime=effectiveSpec?.mtime?Date.parse(effectiveSpec.mtime):null,staleSections=[];if(!noDocs&&Array.isArray(registry4?.sections))for(let section2 of registry4.sections){if(!section2||typeof section2.section_id!=="string")continue;if(typeof section2.doc!=="string"||!docMtimes.has(section2.doc))continue;let docMtime=docMtimes.get(section2.doc)??null;if(docMtime===null){staleSections.push({section_id:section2.section_id,doc:section2.doc,reason:"owning design doc is missing"});continue}let flagged=!1;for(let anchor of section2.code_anchors??[]){let anchorAbs=resolveAnchorWithin(directory,anchor);if(anchorAbs===null)continue;let anchorMtime=mtimeMsOrNull(anchorAbs);if(anchorMtime!==null&&anchorMtime>docMtime){staleSections.push({section_id:section2.section_id,doc:section2.doc,reason:`code anchor ${anchor} changed after the doc`}),flagged=!0;break}}if(!flagged&&specMtime!==null&&specMtime>docMtime&&(section2.spec_frs?.length??0)>0)staleSections.push({section_id:section2.section_id,doc:section2.doc,reason:"effective spec changed after the doc"})}let verdict=noDocs?"NO_DOCS":staleSections.length>0?"DOC_STALE":"DOC_FRESH",report={schema_version:1,phase,timestamp:new Date().toISOString(),out_dir:outDir,verdict,stale_sections:staleSections,missing_docs:missingDocs,checked_docs:checkedDocs},locator=phaseReportLocator("design_doc_drift",phase);return await upsertPhaseReportDb(directory,"design_doc_drift",phase,JSON.stringify(report,null,2)),getGlobalEventBus().publish("curator.docdrift.completed",{phase,verdict,stale_count:staleSections.length,report_path:locator}),report}catch(err){try{getGlobalEventBus().publish("curator.error",{operation:"docdrift",phase,error:String(err)})}catch{}return warn(`[design-doc-drift] check failed for phase ${phase}: ${String(err)}`),null}}var MAX_TRACEABILITY_BYTES=1048576,DESIGN_DOC_FILES,TRACEABILITY_REL,_internals287;var init_design_doc_drift=__esm(()=>{init_event_bus();init_phase_report_store();init_effective_spec();init_logger();DESIGN_DOC_FILES={domain:"domain.md","technical-spec":"technical-spec.md","behavior-spec":"behavior-spec.md","reference-impl":path346.join("reference","reference-impl.md"),"idiom-notes":path346.join("reference","idiom-notes.md")},TRACEABILITY_REL=path346.join("reference","traceability.json");_internals287={mtimeMsOrNull,resolveAnchorWithin,DESIGN_DOC_FILES}});var exports_project_context={};__export(exports_project_context,{buildProjectContext:()=>buildProjectContext,_internals:()=>_internals320,LANG_BACKEND_DETECTION_TIMEOUT_MS:()=>LANG_BACKEND_DETECTION_TIMEOUT_MS});import*as fs236 from"node:fs";import*as path382 from"node:path";function detectFileExists2(directory,pattern){if(pattern.includes("*")||pattern.includes("?"))try{let files=fs236.readdirSync(directory),regex=new RegExp(`^${pattern.replace(/\./g,"\\.").replace(/\*/g,".*").replace(/\?/g,".")}$`);return files.some((f)=>regex.test(f))}catch{return!1}try{return fs236.accessSync(path382.join(directory,pattern)),!0}catch{return!1}}function selectTestCommandFromScriptsTest(backend,directory){let pkgRaw;try{pkgRaw=fs236.readFileSync(path382.join(directory,"package.json"),"utf-8")}catch{return null}let pkg;try{pkg=JSON.parse(pkgRaw)}catch{return null}let script=pkg.scripts?.test;if(!script)return null;let fwName=null;if(script.includes("vitest"))fwName="vitest";else if(script.includes("jest"))fwName="jest";else if(script.includes("mocha"))fwName="mocha";else if(script.includes("bun test"))fwName="bun:test";if(!fwName)return null;let fw=backend.test.frameworks.find((f)=>f.name===fwName);return fw?fw.cmd:null}function selectTestCommandFast(backend,directory){let fromScripts=selectTestCommandFromScriptsTest(backend,directory);if(fromScripts!==null)return fromScripts;let sorted2=[...backend.test.frameworks].sort((a,b)=>b.priority-a.priority);for(let fw of sorted2){if(!detectFileExists2(directory,fw.detect))continue;return fw.cmd}return null}function selectBuildCommandFast(backend,directory){let sorted2=[...backend.build.commands].sort((a,b)=>b.priority-a.priority);for(let cmd of sorted2){if(cmd.detectFile&&!detectFileExists2(directory,cmd.detectFile))continue;return cmd.cmd}return null}function selectLintCommand(backend,directory){let sorted2=[...backend.lint.linters].sort((a,b)=>b.priority-a.priority);for(let lint2 of sorted2){if(!detectFileExists2(directory,lint2.detect))continue;return lint2.cmd}return null}async function buildProjectContext(directory,signal2){let backend=await _internals320.pickBackend(directory,signal2);if(!backend)return null;let profiles=_internals320.pickedProfiles(directory),ctx=emptyProjectContext();ctx.PROJECT_LANGUAGE=backend.displayName;let buildCmd=selectBuildCommandFast(backend,directory);if(buildCmd)ctx.BUILD_CMD=buildCmd;let testCmd=selectTestCommandFast(backend,directory);if(testCmd)ctx.TEST_CMD=testCmd;let lintCmd=selectLintCommand(backend,directory);if(lintCmd)ctx.LINT_CMD=lintCmd;if(backend.id==="php"){let overlay=getLaravelCommandOverlay(directory);if(overlay){if(ctx.TEST_CMD=overlay.testCommand,overlay.lintCommand)ctx.LINT_CMD=overlay.lintCommand}}let[frameworkSel,entryPoints]=await Promise.all([backend.selectFramework?backend.selectFramework(directory).catch(()=>null):Promise.resolve(null),backend.selectEntryPoints?backend.selectEntryPoints(directory).catch(()=>[]):Promise.resolve([])]);if(frameworkSel)ctx.PROJECT_FRAMEWORK=frameworkSel.name;if(entryPoints.length>0)ctx.ENTRY_POINTS=entryPoints.join(", ");if(backend.prompts.coderConstraints.length>0)ctx.CODER_CONSTRAINTS=bulletList(backend.prompts.coderConstraints);if(backend.prompts.testConstraints&&backend.prompts.testConstraints.length>0)ctx.TEST_CONSTRAINTS=bulletList(backend.prompts.testConstraints);if(backend.prompts.reviewerChecklist.length>0)ctx.REVIEWER_CHECKLIST=bulletList(backend.prompts.reviewerChecklist);if(profiles.length>1)ctx.PROJECT_CONTEXT_SECONDARY_LANGUAGES=profiles.slice(1).map((p)=>p.id).join(", ");return ctx}var LANG_BACKEND_DETECTION_TIMEOUT_MS=300,_internals320;var init_project_context=__esm(()=>{init_dispatch();init_framework_detector();_internals320={pickBackend,pickedProfiles}});init_package();init_agents2();init_critic();import{createHash as createHash119}from"node:crypto";import{mkdirSync as mkdirSync101,writeFileSync as writeFileSync66}from"node:fs";import*as path383 from"node:path";import{performance as performance2}from"node:perf_hooks";import{fileURLToPath as fileURLToPath8}from"node:url";init_event_bus();init_evidence_summary_integration();init_manager4();init_manager();init_utils();import*as fs153 from"node:fs";import*as path278 from"node:path";class PlanSyncWorker{directory;debounceMs;pollIntervalMs;syncTimeoutMs;onSyncComplete;status="stopped";watcher=null;pollTimer=null;debounceTimer=null;syncing=!1;pendingSync=!1;lastStat=null;disposed=!1;constructor(options={}){this.directory=options.directory??"",this.debounceMs=options.debounceMs??500,this.pollIntervalMs=options.pollIntervalMs??2000,this.syncTimeoutMs=options.syncTimeoutMs??30000,this.onSyncComplete=options.onSyncComplete}getSwarmDir(){return path278.resolve(this.directory,".swarm")}getPlanJsonPath(){return path278.join(this.getSwarmDir(),"plan.json")}start(){if(this.disposed){log("[PlanSyncWorker] Cannot start - worker has been disposed");return}if(!this.directory){log("[PlanSyncWorker] Cannot start - no directory provided");return}if(this.status==="running"||this.status==="starting"){log("[PlanSyncWorker] Already running or starting");return}this.status="starting",log("[PlanSyncWorker] Starting..."),this.initializeStat(),this.setupPolling(),this.setupNativeWatcher(),this.status="running",log("[PlanSyncWorker] Started watching for plan.json changes")}stop(){if(this.status==="stopped"||this.status==="stopping")return;if(this.status="stopping",log("[PlanSyncWorker] Stopping..."),this.clearDebounce(),this.watcher)this.watcher.close(),this.watcher=null;if(this.pollTimer)clearInterval(this.pollTimer),this.pollTimer=null;this.status="stopped",log("[PlanSyncWorker] Stopped")}dispose(){this.stop(),this.disposed=!0,this.lastStat=null,log("[PlanSyncWorker] Disposed")}getStatus(){return this.status}isRunning(){return this.status==="running"}initializeStat(){try{let stats2=fs153.statSync(this.getPlanJsonPath());this.lastStat={mtimeMs:stats2.mtimeMs,size:stats2.size}}catch{this.lastStat=null}}setupNativeWatcher(){let swarmDir=this.getSwarmDir();try{if(!fs153.existsSync(swarmDir))return log("[PlanSyncWorker] Swarm directory does not exist yet"),!1;return this.watcher=fs153.watch(swarmDir,{persistent:!1},(_eventType,filename)=>{if(this.disposed||this.status!=="running")return;if(filename&&(filename.includes(".tmp.")||filename.endsWith(".rebuild")))return;if(filename==="plan.json"||filename===void 0)this.debouncedSync()}),this.watcher.on("error",(error93)=>{if(this.disposed||this.status!=="running")return;if(log("[PlanSyncWorker] Watcher error, falling back to polling",{error:error93.message}),this.watcher)this.watcher.close(),this.watcher=null;this.setupPolling()}),log("[PlanSyncWorker] Native fs.watch established"),!0}catch(error93){return log("[PlanSyncWorker] Failed to setup native watcher",{error:error93 instanceof Error?error93.message:String(error93)}),!1}}setupPolling(){if(this.pollTimer)clearInterval(this.pollTimer);if(this.pollTimer=setInterval(()=>{if(this.disposed||this.status!=="running")return;this.pollCheck()},this.pollIntervalMs),typeof this.pollTimer.unref==="function")this.pollTimer.unref();log("[PlanSyncWorker] Polling fallback established",{intervalMs:this.pollIntervalMs})}pollCheck(){try{let planPath=this.getPlanJsonPath();if(!fs153.existsSync(planPath)){if(this.lastStat!==null)this.lastStat=null,log("[PlanSyncWorker] plan.json deleted");return}let stats2=fs153.statSync(planPath),currentStat={mtimeMs:stats2.mtimeMs,size:stats2.size};if(this.lastStat===null||currentStat.mtimeMs!==this.lastStat.mtimeMs||currentStat.size!==this.lastStat.size)this.lastStat=currentStat,this.debouncedSync()}catch(error93){log("[PlanSyncWorker] Poll check error",{error:error93 instanceof Error?error93.message:String(error93)})}}debouncedSync(){if(this.disposed||this.status!=="running")return;if(this.debounceTimer)clearTimeout(this.debounceTimer);this.debounceTimer=setTimeout(()=>{if(this.disposed||this.status!=="running")return;this.debounceTimer=null,this.triggerSync()},this.debounceMs)}clearDebounce(){if(this.debounceTimer)clearTimeout(this.debounceTimer),this.debounceTimer=null}triggerSync(){if(this.syncing){this.pendingSync=!0,log("[PlanSyncWorker] Sync pending (in-flight)");return}this.executeSync()}async executeSync(){this.syncing=!0;try{log("[PlanSyncWorker] Syncing plan..."),this.checkForUnauthorizedWrite();let plan=await this.withTimeout(_internals56.loadPlanJsonOnly(this.directory),this.syncTimeoutMs,"Sync operation timed out");if(plan&&plan.phases.length>0)await _internals56.regeneratePlanMarkdown(this.directory,plan),log("[PlanSyncWorker] Sync complete",{title:plan.title,phase:plan.current_phase}),this.safeCallback(!0);else if(plan)log("[PlanSyncWorker] Plan has no phases, skipping markdown regeneration"),this.safeCallback(!0);else log("[PlanSyncWorker] No plan found to sync"),this.safeCallback(!0)}catch(error93){if(error93 instanceof Error&&error93.message.includes("timed out"))log("[PlanSyncWorker] Sync timed out after "+this.syncTimeoutMs+"ms, worker remains active");else log("[PlanSyncWorker] Sync failed",{error:error93 instanceof Error?error93.message:String(error93)});this.safeCallback(!1,error93 instanceof Error?error93:Error(String(error93)))}finally{if(this.syncing=!1,this.pendingSync&&!this.disposed&&this.status==="running")this.pendingSync=!1,log("[PlanSyncWorker] Executing pending sync"),this.executeSync()}}safeCallback(success3,error93){if(this.onSyncComplete)try{this.onSyncComplete(success3,error93)}catch(callbackError){log("[PlanSyncWorker] onSyncComplete callback threw error (ignored)",{callbackError:callbackError instanceof Error?callbackError.message:String(callbackError)})}}checkForUnauthorizedWrite(){try{let swarmDir=this.getSwarmDir(),planJsonPath=path278.join(swarmDir,"plan.json"),markerPath=path278.join(swarmDir,".plan-write-marker"),planStats=fs153.statSync(planJsonPath),planMtimeMs=Math.floor(planStats.mtimeMs),markerContent=fs153.readFileSync(markerPath,"utf8"),marker=JSON.parse(markerContent);if(marker.in_progress===!0){log("[PlanSyncWorker] Skipping unauthorized-write check - plan write in progress");return}let markerTimestampMs=new Date(marker.timestamp).getTime();if(planMtimeMs>markerTimestampMs+5000)log("[PlanSyncWorker] WARNING: plan.json may have been written outside save_plan/savePlan - unauthorized direct write suspected",{planMtimeMs,markerTimestampMs})}catch{}}withTimeout(promise3,ms,timeoutMessage2){return new Promise((resolve108,reject)=>{let timer=setTimeout(()=>{reject(Error(`${timeoutMessage2} (${ms}ms)`))},ms);promise3.then((result)=>{clearTimeout(timer),resolve108(result)}).catch((error93)=>{clearTimeout(timer),reject(error93)})})}}init_pr_event_subscribers();init_pr_feedback_loop_runtime();init_pr_monitor_worker();init_queue();init_status_artifact();init_trigger();init_worker();import{createHash as createHash98}from"node:crypto";init_zod();init_task_envelope();init_workspace_snapshot();init_plan_schema();init_schema();init_plan_task_id_context();init_task_id_resolver();init_task_result_classifier();init_utils2();init_ledger();init_manager();init_utils3();init_atomic_write();init_canonical_root();init_lock();init_task_file();import{createHash as createHash97}from"node:crypto";import*as fs155 from"node:fs";import*as path280 from"node:path";var PHASE_PARTICIPATION_FILE="evidence/phase-participation.json",PHASE_PARTICIPATION_QUARANTINE_DIR="evidence/phase-participation-quarantine",MAX_PHASE_PARTICIPATION_BYTES=262144,MAX_PHASE_PARTICIPATION_PENDING=128,MAX_PHASE_PARTICIPATION_RECEIPTS=128,MAX_PHASE_PARTICIPATION_QUARANTINE_FILES=16,MAX_PHASE_PARTICIPATION_QUARANTINE_BYTES=1048576,MAX_PHASE_PARTICIPATION_QUARANTINE_DIRECTORY_ENTRIES=64,MAX_PENDING_IN_MEMORY=128,MAX_ID_CHARS=256,WorkspaceSchema2=exports_external.object({directory:exports_external.string().max(4096),gitHead:exports_external.string().max(256).nullable(),prHeadSha:exports_external.string().max(256).nullable()}).strict(),BindingSchema=exports_external.object({role:exports_external.string().min(1).max(120),prefixedRole:exports_external.string().min(1).max(120),planId:exports_external.string().min(1).max(512),planIdentityHash:exports_external.string().length(64),planStructureHash:exports_external.string().length(64),phase:exports_external.number().int().nonnegative(),taskId:exports_external.string().min(1).max(120).nullable(),parentSessionId:exports_external.string().min(1).max(MAX_ID_CHARS),callId:exports_external.string().min(1).max(MAX_ID_CHARS),policyDigest:exports_external.string().length(64),workspace:WorkspaceSchema2,capturedAt:exports_external.number().int().nonnegative()}).strict(),PendingSchema=BindingSchema.extend({childSessionId:exports_external.string().min(1).max(MAX_ID_CHARS)}).strict(),ReceiptSchema=PendingSchema.extend({receiptId:exports_external.string().length(64),resultDigest:exports_external.string().length(64),completedAt:exports_external.number().int().nonnegative(),childIdentityAvailable:exports_external.boolean()}).strict(),StoreSchema=exports_external.object({schemaVersion:exports_external.literal(1),pending:exports_external.array(PendingSchema).max(MAX_PHASE_PARTICIPATION_PENDING),receipts:exports_external.array(ReceiptSchema).max(MAX_PHASE_PARTICIPATION_RECEIPTS)}).strict(),foregroundReservations=new Map;function emptyStore(){return{schemaVersion:1,pending:[],receipts:[]}}function correlationKey2(parentSessionId,callId){return`${parentSessionId}\x00${callId}`}function sha25610(value){return createHash97("sha256").update(value).digest("hex")}function policyDigest(policy){return sha25610(stableCanonicalStringify(policy??{}))}async function captureParticipationWorkspace(directory){let workspace=await captureWorkspaceSnapshotAsync(directory,{resolveCurrentPrHeadSha:!0});return{directory:workspace.directory,gitHead:workspace.gitHead,prHeadSha:workspace.prHeadSha}}function boundedPut(binding){let key2=correlationKey2(binding.parentSessionId,binding.callId);foregroundReservations.delete(key2),foregroundReservations.set(key2,binding);while(foregroundReservations.size>MAX_PENDING_IN_MEMORY){let oldest=foregroundReservations.keys().next().value;if(!oldest)break;foregroundReservations.delete(oldest)}}function takeBinding(parentSessionId,callId){let key2=correlationKey2(parentSessionId,callId),binding=foregroundReservations.get(key2)??null;return foregroundReservations.delete(key2),binding}async function persistWithBindingRecovery(directory,binding,operation){try{await withEvidenceLock(directory,PHASE_PARTICIPATION_FILE,"docs","phase-participation",operation)}catch(error93){throw boundedPut(binding),error93}}async function buildBinding(input){return{role:stripKnownSwarmPrefix(input.role),prefixedRole:input.role,planId:derivePlanId(input.plan),planIdentityHash:derivePlanIdentityHash(input.plan),planStructureHash:receiptStructureHash(input.plan),phase:input.phase,taskId:input.taskId,parentSessionId:input.parentSessionId,callId:input.callId,policyDigest:policyDigest(input.policy),workspace:await captureParticipationWorkspace(input.directory),capturedAt:Date.now()}}function extractPlanTaskId2(args2,plan){let context=collectPlanTaskIdContextFromPhases(plan.phases),result=resolveTaskId(args2,{policy:"plan",...toTaskIdPlanContextOptions(context)});if(result.status!=="resolved")return null;if(context.status==="over_limit"&&!plan.phases.some((phase)=>phase?.tasks?.some((task2)=>task2?.id===result.taskId)))return null;return result.taskId}function storePath6(directory){return validateSwarmPath(directory,PHASE_PARTICIPATION_FILE)}function readRawStore(directory){let filePath;try{filePath=storePath6(directory)}catch(error93){return{status:"unreadable",error:error93}}let descriptor,bytes;try{let pathStat=fs155.lstatSync(filePath);if(pathStat.isSymbolicLink()||!pathStat.isFile())return{status:"unreadable",error:Error("Participation projection is not a regular file")};if(pathStat.size>MAX_PHASE_PARTICIPATION_BYTES)return{status:"oversized",bytes:pathStat.size};descriptor=fs155.openSync(filePath,fs155.constants.O_RDONLY|(fs155.constants.O_NOFOLLOW??0));let openedStat=fs155.fstatSync(descriptor);if(!openedStat.isFile()||openedStat.dev!==pathStat.dev||openedStat.ino!==pathStat.ino)return{status:"unreadable",error:Error("Participation projection changed while it was being opened")};if(openedStat.size>MAX_PHASE_PARTICIPATION_BYTES)return{status:"oversized",bytes:openedStat.size};let bounded=Buffer.allocUnsafe(MAX_PHASE_PARTICIPATION_BYTES+1),offset=0;while(offset<bounded.byteLength){let read=fs155.readSync(descriptor,bounded,offset,bounded.byteLength-offset,null);if(read===0)break;offset+=read}if(offset>MAX_PHASE_PARTICIPATION_BYTES)return{status:"oversized",bytes:offset};bytes=bounded.subarray(0,offset)}catch(error93){if(error93.code==="ENOENT")return{status:"missing"};return{status:"unreadable",error:error93}}finally{if(descriptor!==void 0)try{fs155.closeSync(descriptor)}catch{}}try{return{status:"valid",store:StoreSchema.parse(JSON.parse(bytes.toString("utf8")))}}catch{return{status:"corrupt",bytes}}}async function atomicWriteBytes(filePath,bytes){await atomicWriteSwarmFile(filePath,bytes)}async function readBoundedRegularFile(filePath,maxBytes){let pathStat=await fs155.promises.lstat(filePath);if(pathStat.isSymbolicLink()||!pathStat.isFile()||pathStat.size>maxBytes)throw Error("bounded evidence artifact is not a permitted regular file");let handle=await fs155.promises.open(filePath,fs155.constants.O_RDONLY|(fs155.constants.O_NOFOLLOW??0));try{let openedStat=await handle.stat();if(!openedStat.isFile()||openedStat.dev!==pathStat.dev||openedStat.ino!==pathStat.ino||openedStat.size>maxBytes)throw Error("bounded evidence artifact changed while being opened");let bounded=Buffer.allocUnsafe(maxBytes+1),offset=0;while(offset<bounded.byteLength){let{bytesRead}=await handle.read(bounded,offset,bounded.byteLength-offset,null);if(bytesRead===0)break;offset+=bytesRead}if(offset>maxBytes)throw Error("bounded evidence artifact exceeds its byte limit");return bounded.subarray(0,offset)}finally{try{await handle.close()}catch{}}}function quarantineFullError(){return Error("PHASE_PARTICIPATION_QUARANTINE_FULL: preserved corrupt evidence reached its bounded retention limit; an operator must archive the quarantine before docs can be re-dispatched.")}async function quarantineCorruptBytes(directory,bytes){let digest4=sha25610(bytes),quarantineDir=validateSwarmPath(directory,PHASE_PARTICIPATION_QUARANTINE_DIR);await fs155.promises.mkdir(quarantineDir,{recursive:!0});let quarantineStat=await fs155.promises.lstat(quarantineDir);if(quarantineStat.isSymbolicLink()||!quarantineStat.isDirectory())throw Error("PHASE_PARTICIPATION_QUARANTINE_UNREADABLE: quarantine is not a regular directory.");let target=validateSwarmPath(directory,`${PHASE_PARTICIPATION_QUARANTINE_DIR}/${digest4}.bin`);try{if(!(await readBoundedRegularFile(target,MAX_PHASE_PARTICIPATION_BYTES)).equals(bytes))throw Error("hash-addressed quarantine content mismatch");return}catch(error93){if(error93.code!=="ENOENT")throw error93}let count=0,totalBytes=0,scanned=0,handle=await fs155.promises.opendir(quarantineDir,{bufferSize:16});try{for await(let entry of handle){if(scanned+=1,scanned>MAX_PHASE_PARTICIPATION_QUARANTINE_DIRECTORY_ENTRIES)throw quarantineFullError();if(!entry.isFile()||!/^[a-f0-9]{64}\.bin$/.test(entry.name))continue;count+=1;let candidate2=validateSwarmPath(directory,`${PHASE_PARTICIPATION_QUARANTINE_DIR}/${entry.name}`),candidateStat=await fs155.promises.lstat(candidate2);if(candidateStat.isSymbolicLink()||!candidateStat.isFile())throw Error("PHASE_PARTICIPATION_QUARANTINE_UNREADABLE: invalid quarantine artifact.");if(totalBytes+=candidateStat.size,count>=MAX_PHASE_PARTICIPATION_QUARANTINE_FILES||totalBytes+bytes.byteLength>MAX_PHASE_PARTICIPATION_QUARANTINE_BYTES)throw quarantineFullError()}}finally{try{await handle.close()}catch{}}await atomicWriteBytes(target,bytes)}async function loadWritableStoreUnderLock(directory){let read=readRawStore(directory);if(read.status==="missing")return emptyStore();if(read.status==="valid")return read.store;if(read.status==="corrupt")return await quarantineCorruptBytes(directory,read.bytes),emptyStore();if(read.status==="oversized")throw Error(`PHASE_PARTICIPATION_OVERSIZED: ${read.bytes} bytes exceeds ${MAX_PHASE_PARTICIPATION_BYTES}; operator action is required before docs can be re-dispatched.`);throw Error("PHASE_PARTICIPATION_UNREADABLE: operator action is required before docs can be re-dispatched.")}async function writeStore3(directory,store){let validatedStore=StoreSchema.parse(store);validatedStore.pending.sort((left,right)=>left.capturedAt-right.capturedAt),validatedStore.receipts.sort((left,right)=>left.completedAt-right.completedAt);let serialized3=JSON.stringify(validatedStore,null,2);while(Buffer.byteLength(serialized3,"utf8")>MAX_PHASE_PARTICIPATION_BYTES){let pendingTime=validatedStore.pending[0]?.capturedAt??1/0,receiptTime=validatedStore.receipts[0]?.completedAt??1/0;if(pendingTime===1/0&&receiptTime===1/0)throw Error("PHASE_PARTICIPATION_WRITE_OVERSIZED: even an empty participation store exceeds its byte limit.");if(pendingTime<=receiptTime)validatedStore.pending.shift();else validatedStore.receipts.shift();validatedStore=StoreSchema.parse(validatedStore),serialized3=JSON.stringify(validatedStore,null,2)}await fs155.promises.mkdir(path280.dirname(storePath6(directory)),{recursive:!0}),await atomicWriteFile(storePath6(directory),serialized3)}function receiptStructureHash(plan){return computePlanStructureHash({...plan,current_phase:void 0})}function samePlanIdentity(binding,plan){return binding.planId===derivePlanId(plan)&&binding.planIdentityHash===derivePlanIdentityHash(plan)&&binding.planStructureHash===receiptStructureHash(plan)}function bindingMatchesPlan(binding,plan,phase){return samePlanIdentity(binding,plan)&&binding.phase===phase}function workspaceIdentityIsFresh(expected,current){return sameProjectRoot(expected.directory,current.directory)&&expected.gitHead===current.gitHead&&expected.prHeadSha===current.prHeadSha}function resultText(output){if(!output||typeof output!=="object")return{text:"",childSessionId:null};let record3=output,rawOutput=typeof record3.output==="string"?record3.output:"",envelope=parseTaskEnvelope(rawOutput);if(envelope?.state==="completed")return{text:envelope.resultText??"",childSessionId:envelope.sessionId};return{text:rawOutput,childSessionId:null}}function envelopeFromOutput(output){if(typeof output==="string")return parseTaskEnvelope(output);if(!output||typeof output!=="object")return null;let rawOutput=output.output;return typeof rawOutput==="string"?parseTaskEnvelope(rawOutput):null}function validateMetadata(output,parentSessionId,childSessionId){if(!output||typeof output!=="object")return{valid:!0,childSessionId};let metadata=output.metadata;if(!metadata||typeof metadata!=="object")return{valid:!0,childSessionId};let meta3=metadata;if(typeof meta3.parentSessionId==="string"&&meta3.parentSessionId!==parentSessionId)return{valid:!1,childSessionId:null};let metadataChild=typeof meta3.sessionId==="string"&&meta3.sessionId.length>0?meta3.sessionId:null;if(childSessionId&&metadataChild&&childSessionId!==metadataChild)return{valid:!1,childSessionId:null};return{valid:!0,childSessionId:childSessionId??metadataChild}}function computeReceiptId(input){return sha25610(stableCanonicalStringify({parentSessionId:input.parentSessionId,callId:input.callId,childSessionId:input.childSessionId,planIdentityHash:input.planIdentityHash,planStructureHash:input.planStructureHash,phase:input.phase,role:input.role}))}function addReceipt(store,pending,text,childIdentityAvailable){let receiptId=computeReceiptId(pending),receipt={...pending,receiptId,resultDigest:sha25610(text),completedAt:Date.now(),childIdentityAvailable};store.receipts=store.receipts.filter((existing)=>existing.receiptId!==receiptId&&!(existing.planIdentityHash===receipt.planIdentityHash&&existing.planStructureHash===receipt.planStructureHash&&existing.phase===receipt.phase&&existing.role===receipt.role)),store.receipts.push(receipt),store.receipts=store.receipts.slice(-MAX_PHASE_PARTICIPATION_RECEIPTS)}async function reserveApprovedPhaseParticipation(input){if(input.tool.toLowerCase()!=="task")return;let rawRole=input.args.subagent_type;if(typeof rawRole!=="string"||stripKnownSwarmPrefix(rawRole)!=="docs")return;let plan=await loadPlan(input.directory);if(!plan)return;let binding=await buildBinding({plan,phase:getCurrentPhase(plan),role:rawRole,parentSessionId:input.parentSessionId,callId:input.callId,taskId:extractPlanTaskId2(input.args,plan),policy:input.policy,directory:input.directory});await withEvidenceLock(input.directory,PHASE_PARTICIPATION_FILE,"docs","phase-participation",async()=>{let store=await loadWritableStoreUnderLock(input.directory);await writeStore3(input.directory,store)}),boundedPut(binding)}async function observePhaseParticipationToolResult(input){if(input.tool.toLowerCase()!=="task")return;let binding=takeBinding(input.parentSessionId,input.callId);if(!binding)return;let envelope=envelopeFromOutput(input.output);if(envelope?.state==="running"){let{subagentSessionId}=extractDispatchIds(input.output);if(!subagentSessionId||subagentSessionId!==envelope.sessionId)return;let pending2={...binding,childSessionId:subagentSessionId};await persistWithBindingRecovery(input.directory,binding,async()=>{let store=await loadWritableStoreUnderLock(input.directory);store.pending=store.pending.filter((existing)=>existing.childSessionId!==pending2.childSessionId&&!(existing.parentSessionId===pending2.parentSessionId&&existing.callId===pending2.callId)),store.pending.push(pending2),store.pending=store.pending.slice(-MAX_PHASE_PARTICIPATION_PENDING),await writeStore3(input.directory,store)});return}if(envelope&&envelope.state!=="completed")return;if(classifyTaskResult(input.output)!=="success")return;let extracted=resultText(input.output),text=extracted.text.trim();if(!text)return;let metadata=validateMetadata(input.output,input.parentSessionId,extracted.childSessionId);if(!metadata.valid)return;let childSessionId=metadata.childSessionId,currentPlan=await loadPlan(input.directory);if(!currentPlan||!bindingMatchesPlan(binding,currentPlan,binding.phase))return;if(!workspaceIdentityIsFresh(binding.workspace,await captureParticipationWorkspace(input.directory)))return;let pending={...binding,childSessionId:childSessionId??`unavailable:${sha25610(correlationKey2(input.parentSessionId,input.callId))}`};await persistWithBindingRecovery(input.directory,binding,async()=>{let store=await loadWritableStoreUnderLock(input.directory);addReceipt(store,pending,text,childSessionId!==null),await writeStore3(input.directory,store)})}async function completeBackgroundPhaseParticipation(input){if(stripKnownSwarmPrefix(input.record.normalizedAgent)!=="docs")return!1;let text=input.resultText.trim();if(!text)return!1;return withEvidenceLock(input.directory,PHASE_PARTICIPATION_FILE,"docs","phase-participation",async()=>{let store=await loadWritableStoreUnderLock(input.directory),currentPlan=await loadPlan(input.directory),existingReceipt=store.receipts.find((receipt)=>receipt.childSessionId===input.record.subagentSessionId&&receipt.parentSessionId===input.record.parentSessionId&&receipt.callId===input.record.callID&&receipt.role===input.record.normalizedAgent&&receipt.prefixedRole===input.record.swarmPrefixedAgent&&receipt.taskId===input.record.planTaskId);if(existingReceipt&¤tPlan&&bindingMatchesPlan(existingReceipt,currentPlan,existingReceipt.phase))return!0;let pending=store.pending.find((candidate2)=>candidate2.childSessionId===input.record.subagentSessionId&&candidate2.parentSessionId===input.record.parentSessionId&&candidate2.callId===input.record.callID&&candidate2.role===input.record.normalizedAgent&&candidate2.prefixedRole===input.record.swarmPrefixedAgent&&candidate2.taskId===input.record.planTaskId);if(!pending)return!1;let plan=currentPlan;if(!plan||!bindingMatchesPlan(pending,plan,pending.phase))return!1;if(!workspaceIdentityIsFresh(pending.workspace,await captureParticipationWorkspace(input.directory)))return!1;if(pending.taskId!==null&&input.record.ingestion?.state!=="consumed")return!1;return addReceipt(store,pending,text,!0),store.pending=store.pending.filter((candidate2)=>candidate2.childSessionId!==pending.childSessionId),await writeStore3(input.directory,store),!0})}async function readPhaseParticipation(directory,plan,phase,role){let read=readRawStore(directory);if(read.status!=="valid")return{status:read.status,found:!1};let canonicalRole2=stripKnownSwarmPrefix(role),currentWorkspace=await captureParticipationWorkspace(directory),cursorPhase=getCurrentPhase(plan);return{status:"valid",found:read.store.receipts.some((receipt)=>receipt.role===canonicalRole2&&samePlanIdentity(receipt,plan)&&workspaceIdentityIsFresh(receipt.workspace,currentWorkspace)&&(receipt.phase===phase||receipt.phase===cursorPhase&&cursorPhase<phase))}}async function rebindCursorTaggedReceipts(directory,plan,phase,role){let canonicalRole2=stripKnownSwarmPrefix(role),cursorPhase=getCurrentPhase(plan),peek=readRawStore(directory);if(!(peek.status==="valid"&&peek.store.receipts.some((receipt)=>receipt.role===canonicalRole2&&samePlanIdentity(receipt,plan)&&receipt.phase===cursorPhase&&cursorPhase<phase)))return{rebound:0};return withEvidenceLock(directory,PHASE_PARTICIPATION_FILE,"docs","phase-participation",async()=>{let store=await loadWritableStoreUnderLock(directory),rebound=0;for(let receipt of store.receipts)if(receipt.role===canonicalRole2&&samePlanIdentity(receipt,plan)&&receipt.phase===cursorPhase&&cursorPhase<phase)receipt.phase=phase,receipt.receiptId=computeReceiptId(receipt),rebound+=1;if(rebound>0){let newestByKey=new Map;for(let receipt of store.receipts.slice().sort((left,right)=>left.completedAt-right.completedAt))newestByKey.set(`${receipt.planIdentityHash}\x00${receipt.planStructureHash}\x00${receipt.phase}\x00${receipt.role}`,receipt);store.receipts=[...newestByKey.values()],await writeStore3(directory,store)}return{rebound}})}init_gate_evidence();init_worktree_isolation();init_helpers();init_state2();init_canonical_root();init_logger();init_coder_settlement();init_merge2();init_pending_delegations();init_loader();init_task_gate_requirements();init_gate_evidence();init_gate_evidence_classification();init_review_receipt_collector();init_reviewer_scope_file_fingerprint();init_routing_enforcement();init_scope_binding();init_state2();init_logger();init_workspace_snapshot();var GATE_EVIDENCE_ROLES=new Set(["reviewer","test_engineer","docs","designer","critic","critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","critic_architecture_supervisor","explorer","sme"]);function structuredStageBVerdict(role,text,taskId){let escapedTaskId=taskId.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),match=(role==="reviewer"?new RegExp(`^\\[REVIEWED\\]\\s*\\|\\s*(?:task-)?${escapedTaskId}\\s*\\|\\s*(APPROVED|REJECTED|CONCERNS)\\s*\\|`,"im"):new RegExp(`^\\[TESTED\\]\\s*\\|\\s*(?:task-)?${escapedTaskId}\\s*\\|\\s*(PASS|FAIL|SKIPPED)\\s*\\|`,"im")).exec(text);if(!match)return null;if(match[1]==="APPROVED"||match[1]==="PASS")return"pass";if(match[1]==="SKIPPED")return"skip";return"fail"}function normalizeAttributionPath(file3){let normalized=file3.trim().replaceAll("\\","/").replace(/^\.\/+/,""),hasControlCharacter5=[...normalized].some((character)=>{let code=character.charCodeAt(0);return code<=31||code===127});if(!normalized||normalized.startsWith("/")||/^[A-Za-z]:\//.test(normalized)||normalized===".."||normalized.startsWith("../")||normalized.split("/").includes("..")||hasControlCharacter5)return null;return normalized}function normalizedPathSet(files){if(!files)return null;let normalized=new Set;for(let file3 of files){let candidate2=normalizeAttributionPath(file3);if(!candidate2)return null;normalized.add(candidate2)}return normalized}function pathSetsEqual(left,right){return left.size===right.size&&[...left].every((file3)=>right.has(file3))}function hasDistinctBackgroundOwner(input){if(!Number.isFinite(input.candidateCreatedAt)||!Number.isFinite(input.candidateCompletedAt)||input.candidateCreatedAt>input.candidateCompletedAt)return!1;let liveOwners=[...(swarmState.agentSessions.get(input.parentSessionID)?.reviewerScopeGenerations??new Map).values()].filter((generation)=>{if(generation.background!==!0||generation.taskId===input.taskId&&generation.coderCallID===input.coderCallID)return!1;let declared=normalizedPathSet(generation.declaredFiles),routed=normalizedPathSet(generation.modifiedFiles),fingerprints=generation.modifiedFileFingerprints.filter((entry)=>normalizeAttributionPath(entry.file)===input.file),ownerCompletedAt=generation.readyAt??input.candidateCompletedAt;return Number.isFinite(generation.createdAt)&&Number.isFinite(ownerCompletedAt)&&generation.createdAt<=input.candidateCompletedAt&&input.candidateCreatedAt<=ownerCompletedAt&&declared?.has(input.file)===!0&&routed?.has(input.file)===!0&&fingerprints.length===1&&reviewerScopeFileFingerprintsEqual(fingerprints[0],input.fingerprint)}),historicalOwners=getReviewerScopeOwnershipHistory({parentSessionID:input.parentSessionID}).filter((owner)=>{if(owner.taskId===input.taskId&&owner.coderCallID===input.coderCallID)return!1;let declared=normalizedPathSet(owner.declaredFiles),routed=normalizedPathSet(owner.modifiedFiles),fingerprints=owner.modifiedFileFingerprints.filter((entry)=>normalizeAttributionPath(entry.file)===input.file);return owner.parentSessionID===input.parentSessionID&&owner.background===!0&&Number.isFinite(owner.createdAt)&&Number.isFinite(owner.readyAt)&&owner.createdAt<=input.candidateCompletedAt&&input.candidateCreatedAt<=owner.readyAt&&declared?.has(input.file)===!0&&routed?.has(input.file)===!0&&fingerprints.length===1&&reviewerScopeFileFingerprintsEqual(fingerprints[0],input.fingerprint)});return liveOwners.length+historicalOwners.length===1}function isBackgroundGateBearingRecord(record3){return record3.batchId===void 0&&record3.evidenceTaskId!==null&&GATE_EVIDENCE_ROLES.has(record3.normalizedAgent)}function validateStageBWorkspace(directory,record3){let actualWorkspace=captureWorkspaceSnapshot(directory,{scope:record3.workspace?.scope??null,prHeadSha:record3.workspace?.prHeadSha??null,resolveCurrentPrHeadSha:record3.workspace?.prHeadSha!==null}),check3=compareStageBWorkspace(record3,actualWorkspace,directory);return{...check3,ok:!check3.stale}}var BARE_TASK_ID=/^\d+(?:\.\d+)*$/,SCOPE_CASE_FOLD=process.platform==="win32";function scopeMatchKey(normalized){return SCOPE_CASE_FOLD?normalized.toLowerCase():normalized}function deriveScopeFiles(scope){if(!scope)return null;let files=new Set;for(let fragment of scope.split(",")){let normalized=normalizeAttributionPath(fragment);if(normalized===null||BARE_TASK_ID.test(normalized))continue;files.add(scopeMatchKey(normalized))}return files.size>0?files:null}function scopeDirtySlice(files,scopeFiles){let slice=new Set;for(let file3 of files){let normalized=normalizeAttributionPath(file3);if(normalized!==null&&scopeFiles.has(scopeMatchKey(normalized)))slice.add(normalized)}return slice}function compareStageBWorkspace(record3,actualWorkspace,directory){let expectedWorkspace=record3.normalizedAgent==="docs"&&record3.workspace?{...record3.workspace,dirtyHash:null}:record3.workspace;if(!expectedWorkspace)return{stale:!1};if(record3.normalizedAgent==="docs")return compareWorkspaceSnapshots(expectedWorkspace,actualWorkspace);let scopeFiles=deriveScopeFiles(expectedWorkspace.scope),expectedHead=expectedWorkspace.gitHead,currentHead=actualWorkspace.gitHead,expectedChanged=expectedWorkspace.changedFiles,currentChanged=actualWorkspace.changedFiles;if(scopeFiles===null||expectedHead==null||currentHead==null||expectedChanged==null||currentChanged==null||directory===void 0)return compareWorkspaceSnapshots(expectedWorkspace,actualWorkspace);let identity=workspaceSnapshotMatches({...expectedWorkspace,gitHead:null,dirtyHash:null},{...actualWorkspace,gitHead:null,dirtyHash:null});if(!identity.ok)return{stale:!0,reason:identity.reason};let committed=committedFilesBetween(directory,expectedHead,currentHead);if(committed===null)return compareWorkspaceSnapshots(expectedWorkspace,actualWorkspace);let committedInScope=committed.filter((file3)=>scopeFiles.has(scopeMatchKey(normalizeAttributionPath(file3)??"")));if(committedInScope.length>0){let shown=committedInScope.slice(0,5).join(", "),extra=committedInScope.length>5?` (+${committedInScope.length-5} more)`:"";return{stale:!0,reason:`in-scope committed change: ${shown}${extra}`}}let dispatchDirty=scopeDirtySlice(expectedChanged,scopeFiles),currentDirty=scopeDirtySlice(currentChanged,scopeFiles),dirtied=[...currentDirty].filter((file3)=>!dispatchDirty.has(file3)),cleaned=[...dispatchDirty].filter((file3)=>!currentDirty.has(file3));if(dirtied.length>0||cleaned.length>0)return{stale:!0,reason:`in-scope dirty set changed: +[${dirtied.join(", ")}] -[${cleaned.join(", ")}]`};return{stale:!1}}async function ingestBackgroundStageBCompletion(args2){let taskId=args2.record.evidenceTaskId??args2.record.planTaskId;if(!taskId)return{ok:!0,consumed:!1};if(args2.record.normalizedAgent==="coder"){let taskChangeContext=args2.record.taskChangeContext,settledFiles=args2.record.coderSettlement?.state==="settled"?args2.record.coderSettlement.observedFiles:void 0,observedFiles=settledFiles!==void 0?settledFiles:taskChangeContext?changedFilesSinceSnapshot(taskChangeContext.baseline.directory,taskChangeContext.baseline):null;if(observedFiles===null)return{ok:!1,consumed:!1,stale:!0,reason:"background coder files could not be attributed to a clean immutable baseline"};try{let observedSet=normalizedPathSet(observedFiles),declaredSet=normalizedPathSet(taskChangeContext?.declaredFiles??null),completionTime=args2.record.completedAt??args2.record.updatedAt,attributedFiles=observedFiles??[];if(args2.reviewerReceiptOptions?.config?.enabled!==!0){if(observedSet&&declaredSet)attributedFiles=[...observedSet].filter((file3)=>declaredSet.has(file3))}if(args2.reviewerReceiptOptions?.config?.enabled===!0){if(!observedSet||!declaredSet)return{ok:!1,consumed:!1,reason:"background coder changed-file attribution could not be reconstructed exactly"};attributedFiles=[...observedSet].filter((file3)=>declaredSet.has(file3));let generation=getReviewerScopeGenerationForCoderCall({parentSessionID:args2.record.parentSessionId,taskId,coderCallID:args2.record.callID}),generationScope=normalizedPathSet(generation?.declaredFiles??null),routedFiles=normalizedPathSet(generation?.modifiedFiles??null),routedFingerprints=generation?.modifiedFileFingerprints??null;if(generation?.status==="collecting"&&generation.background===!0&&observedSet.size===0&&routedFiles?.size===0&&declaredSet){if(markReviewerScopeGenerationNoChange({parentSessionID:args2.record.parentSessionId,taskId,coderCallID:args2.record.callID}))return{ok:!0,consumed:!0}}let captureRoot=generation?.captureDirectory?.trim()||args2.directory,observedFingerprints=new Map;for(let file3 of observedSet){let captured=captureReviewerScopeFileFingerprint(captureRoot,file3);if(captured.kind==="capture_failed")return{ok:!1,consumed:!1,reason:`background coder post-write fingerprint could not be reconstructed exactly (${captured.code}${captured.retryable?" (retryable)":" (permanent)"} on ${captured.file})`};let fingerprint2=reviewerScopeCaptureToFingerprint(captured);if(!fingerprint2)return{ok:!1,consumed:!1,reason:"background coder post-write fingerprint returned an unusable result"};observedFingerprints.set(file3,fingerprint2)}let changedWithinDeclaredScope=new Set([...observedSet].filter((file3)=>declaredSet.has(file3)&&generationScope?.has(file3))),observedOutsideCurrentScope=[...observedSet].filter((file3)=>!generationScope?.has(file3));if(generation?.status!=="collecting"&&generation?.status!=="ready"||generation.background!==!0||!generationScope||!routedFiles||!routedFingerprints||routedFiles.size===0||!pathSetsEqual(declaredSet,generationScope)||!pathSetsEqual(routedFiles,changedWithinDeclaredScope)||reviewerScopeGenerationHasDeclaredOverlap({parentSessionID:args2.record.parentSessionId,taskId,coderCallID:args2.record.callID,declaredFiles:generation.declaredFiles})||observedOutsideCurrentScope.some((file3)=>!hasDistinctBackgroundOwner({parentSessionID:args2.record.parentSessionId,taskId,coderCallID:args2.record.callID,file:file3,fingerprint:observedFingerprints.get(file3),candidateCreatedAt:args2.record.createdAt,candidateCompletedAt:completionTime}))||[...routedFiles].some((file3)=>{let fingerprints=routedFingerprints.filter((entry)=>normalizeAttributionPath(entry.file)===file3),observedFingerprint=observedFingerprints.get(file3);return!observedSet.has(file3)||!declaredSet.has(file3)||!generationScope.has(file3)||fingerprints.length!==1||!observedFingerprint||!reviewerScopeFileFingerprintsEqual(fingerprints[0],observedFingerprint)}))return{ok:!1,consumed:!1,reason:"background coder scope handoff could not be reconstructed exactly"};attributedFiles=[...routedFiles];for(let file3 of routedFiles){let fingerprint2=observedFingerprints.get(file3);if(fingerprint2)recordReviewerScopeGenerationFileFingerprint({parentSessionID:args2.record.parentSessionId,taskId,coderCallID:args2.record.callID,fingerprint:fingerprint2})}}let parentSession=swarmState.agentSessions.get(args2.record.parentSessionId);if(parentSession){let state2=getTaskState(parentSession,taskId);if(state2!=="idle"&&state2!=="coder_delegated"&&state2!=="rework_required")return{ok:!1,consumed:!1,reason:`background coder completion is late for task ${taskId}: current state is ${state2}`}}let accepted=attributedFiles.length>0,expectedGeneration=args2.record.taskChangeContext?.workflowGeneration??0,transitionId=`background-coder:${args2.record.correlationId}`,existingEvidence=await readTaskEvidence(args2.directory,taskId),existingWorkflow=getTaskWorkflowSnapshot(existingEvidence),updated=existingWorkflow.authoritative&&existingWorkflow.lastTransitionId===transitionId&&existingWorkflow.lastOutcome===(accepted?"accepted_mutation":"dispatch_no_mutation")&&existingWorkflow.generation===expectedGeneration+(accepted?1:0)?existingEvidence:await transitionTaskWorkflowEvidence(args2.directory,taskId,accepted?{type:"accepted_mutation",agentType:"coder",context:{testEngineerExempt:isMarkdownOnlyTaskChange(taskChangeContext?.declaredFiles,attributedFiles)},expectedGeneration,transitionId}:{type:"dispatch_no_mutation",agentType:"coder",expectedGeneration,transitionId});if(accepted){let workflow=getTaskWorkflowSnapshot(updated),parentSession2=swarmState.agentSessions.get(args2.record.parentSessionId);if(parentSession2){if(!recordModifiedFilesForTask(parentSession2,taskId,attributedFiles,args2.directory))warn(`[background] durable coder mutation for ${taskId} exceeded session file-attribution capacity`);parentSession2.taskWorkflowStates.set(taskId,"coder_delegated"),parentSession2.stageBCompletion?.delete(taskId),parentSession2.taskCouncilApproved?.delete(taskId),parentSession2.taskCouncilWorkflowGeneration?.delete(taskId),updateTaskWorkflowCache(parentSession2,taskId,workflow)}}if(args2.reviewerReceiptOptions?.config?.enabled===!0){let laneGeneration=getReviewerScopeGenerationForCoderCall({parentSessionID:args2.record.parentSessionId,taskId,coderCallID:args2.record.callID});if(laneGeneration!==null&&laneGeneration.workspaceIdentity!==canonicalWorkspaceIdentity(args2.directory))return markReviewerScopeGenerationMergebackPending({parentSessionID:args2.record.parentSessionId,taskId,coderCallID:args2.record.callID}),{ok:!0,consumed:!0}}if(args2.reviewerReceiptOptions?.config?.enabled===!0&&!markReviewerScopeGenerationReady({parentSessionID:args2.record.parentSessionId,taskId,coderCallID:args2.record.callID,primaryWorkspaceIdentity:canonicalWorkspaceIdentity(args2.directory)??void 0}))return{ok:!1,consumed:!1,reason:"background coder scope handoff could not be marked ready after evidence persisted"};return{ok:!0,consumed:!0}}catch(err){return{ok:!1,consumed:!1,reason:`background coder evidence ingestion failed: ${err instanceof Error?err.message:String(err)}`}}}if(!isBackgroundGateBearingRecord(args2.record))return{ok:!0,consumed:!1};let workspaceCheck=validateStageBWorkspace(args2.directory,args2.record);if(workspaceCheck.stale)return{ok:!1,consumed:!1,stale:!0,reason:workspaceCheck.reason??"workspace changed while gate was running"};try{if(args2.record.workflowGeneration===void 0)return{ok:!1,consumed:!1,reason:`stage-b ingestion failed: TASK_WORKFLOW_GENERATION_REQUIRED for ${taskId}`};let existingEvidence=await readTaskEvidence(args2.directory,taskId),stageBRole=args2.record.normalizedAgent==="reviewer"||args2.record.normalizedAgent==="test_engineer"?args2.record.normalizedAgent:null,verdict=stageBRole?structuredStageBVerdict(stageBRole,args2.result.text??"",taskId):null;if(stageBRole&&verdict==="skip")return{ok:!1,consumed:!0,skipped:!0,reason:`background ${stageBRole} skipped task ${taskId} — tests not run; re-dispatch the test gate (task stays Stage B eligible; reviewer proof preserved)`};if(stageBRole&&verdict!=="pass"){let rejected2=await transitionTaskWorkflowEvidence(args2.directory,taskId,{type:"stage_b_failed",gate:stageBRole,expectedGeneration:args2.record.workflowGeneration,transitionId:`background-gate-failed:${args2.record.correlationId}`}),parentSession=swarmState.agentSessions.get(args2.record.parentSessionId);if(parentSession)parentSession.taskWorkflowStates.set(taskId,"rework_required"),parentSession.stageBCompletion?.delete(taskId),updateTaskWorkflowCache(parentSession,taskId,getTaskWorkflowSnapshot(rejected2));return{ok:!1,consumed:!0,reason:verdict==="fail"?`background ${stageBRole} rejected task ${taskId}`:`background ${stageBRole} returned no valid structured verdict for task ${taskId}`}}let preparedRoute,routeCompleteForPersistence;if(stageBRole){let parentSession=swarmState.agentSessions.get(args2.record.parentSessionId);if(parentSession){preparedRoute=resolveBackgroundStageBRoute({directory:args2.directory,taskId,parentSessionId:args2.record.parentSessionId,role:stageBRole,callId:args2.record.callID,childSessionId:args2.record.subagentSessionId,generation:args2.record.workflowGeneration,session:parentSession});let routeEnabled=(()=>{try{return loadPluginConfig(args2.directory).review_routing?.enforce_receipts??!0}catch{return!0}})(),routeDecision=enforcePersistedReviewRouteReceipt({projectRoot:args2.directory,sessionId:args2.record.parentSessionId,taskId,receipts:preparedRoute.prospective,enforcementEnabled:routeEnabled,legacyUnrouted:preparedRoute.legacyUnrouted,requireEvidenceBindings:!0,requireCompleteEvidence:!1,expectedDispatch:preparedRoute.binding?{role:preparedRoute.binding.role,identity:preparedRoute.binding.identity,callId:preparedRoute.binding.callId,childSessionId:preparedRoute.binding.childSessionId,generation:preparedRoute.binding.generation}:void 0});if(!routeDecision.canAdvance)return warn(`[background-stage-b] route receipt blocked before evidence publication for ${taskId}: ${routeDecision.reason??"unknown reason"}`),{ok:!1,consumed:!1,reason:`route receipt blocked before Stage-B evidence publication: ${routeDecision.reason??"unknown reason"}`};if(routeEnabled&&preparedRoute.route?.kind==="review_route_receipt")routeCompleteForPersistence=enforcePersistedReviewRouteReceipt({projectRoot:args2.directory,sessionId:args2.record.parentSessionId,taskId,receipts:preparedRoute.prospective,enforcementEnabled:!0,legacyUnrouted:preparedRoute.legacyUnrouted,requireEvidenceBindings:!0,requireCompleteEvidence:!0}).canAdvance}else{let route=readReviewRouteReceiptSync({projectRoot:args2.directory,sessionId:args2.record.parentSessionId,taskId});if(route?.kind!=="review_route_router_error"||route.sessionId!==args2.record.parentSessionId||route.taskId!==taskId)return{ok:!1,consumed:!1,reason:"route receipt blocked before Stage-B evidence publication: parent session is unavailable and recovery receipt is not identity-bound"}}}let routeEvidenceRollback=null;if(preparedRoute?.binding){let parentSession=swarmState.agentSessions.get(args2.record.parentSessionId);if(!parentSession)return warn(`[background-stage-b] route receipt blocked before evidence publication for ${taskId}: parent session unavailable`),{ok:!1,consumed:!1,reason:"route receipt blocked before Stage-B evidence publication: parent session unavailable"};if(routeEvidenceRollback=reserveStageBRouteEvidence(parentSession,taskId,preparedRoute.binding),!routeEvidenceRollback)return warn(`[background-stage-b] route receipt blocked before evidence publication for ${taskId}: bounded route evidence capacity exceeded`),{ok:!1,consumed:!1,reason:"route receipt blocked before Stage-B evidence publication: bounded route evidence capacity exceeded"}}try{await recordGateEvidence(args2.directory,taskId,args2.record.normalizedAgent,args2.record.subagentSessionId,hasActiveTurboMode(args2.record.parentSessionId),{expectedGeneration:args2.record.workflowGeneration,transitionId:`background-gate:${args2.record.correlationId}`,ensureDefaultStageB:existingEvidence?.test_engineer_exempt!==!0,routeBinding:preparedRoute?.binding,routeComplete:routeCompleteForPersistence})}catch(err){throw routeEvidenceRollback?.(),err}if(args2.record.normalizedAgent==="reviewer")await collectReviewerReceiptFromTranscript(args2.directory,{targetAgent:args2.record.swarmPrefixedAgent,prompt:args2.record.prompt?.text??"",transcript:args2.result.text??"",sessionID:args2.record.parentSessionId,taskId,reviewerCallID:args2.record.callID,consumeHandoff:!0},args2.reviewerReceiptOptions);if(args2.record.normalizedAgent==="reviewer"||args2.record.normalizedAgent==="test_engineer")applyStageBStateCompletion(taskId,args2.record.normalizedAgent,args2.record.parentSessionId,existingEvidence?.test_engineer_exempt===!0,args2.directory,args2.record.callID,args2.record.subagentSessionId,args2.record.workflowGeneration,preparedRoute);return{ok:!0,consumed:!0}}catch(err){let message=err instanceof Error?err.message:String(err);return warn(`[background-stage-b] ingestion failed: ${message}`),{ok:!1,consumed:!1,reason:`stage-b ingestion failed: ${message}`}}}function candidateSessions(parentSessionId){let parent=swarmState.agentSessions.get(parentSessionId);return parent?[parent]:[]}function routeDispatchKey(entry){if(!entry.callId||!entry.childSessionId||typeof entry.generation!=="number")return null;return[entry.role,entry.sessionId??"",entry.taskId??"",entry.callId,entry.childSessionId,String(entry.generation)].join("\x00")}function resolveBackgroundStageBRoute(input){let route=readReviewRouteReceiptSync({projectRoot:input.directory,sessionId:input.parentSessionId,taskId:input.taskId}),evidence2=getStageBRouteEvidence(input.session,input.taskId);if(evidence2.length===0)try{evidence2=routeEvidenceFromTaskGateRequirements(readTaskGateRequirementsReceiptsSync(input.directory,input.taskId))}catch{}let legacyUnrouted=route===null&&!isStageBRouteRequired(input.session,input.taskId)&&(()=>{try{let receipts=readTaskGateRequirementsReceiptsSync(input.directory,input.taskId);return receipts.length>0&&receipts.every((receipt)=>!receipt.routeBinding)}catch{return!1}})(),binding,prospective=evidence2;if(route?.kind==="review_route_receipt"){let identities=input.role==="reviewer"?route.identities.reviewers:route.identities.testEngineers,slots=input.role==="reviewer"?route.slots?.reviewers??identities:route.slots?.testEngineers??identities,dispatchKey2=[input.role,input.parentSessionId,input.taskId,input.callId,input.childSessionId,String(input.generation)].join("\x00"),retry=evidence2.find((entry)=>entry.role===input.role&&routeDispatchKey(entry)===dispatchKey2),usedSlots=new Set(evidence2.filter((entry)=>entry.role===input.role&&entry!==retry&&entry.slotId).map((entry)=>entry.slotId)),slotIndex=retry?slots.indexOf(retry.slotId??""):slots.findIndex((slot)=>!usedSlots.has(slot));if(slotIndex>=0&&slotIndex<identities.length){let slotId=slots[slotIndex],identity=identities[slotIndex];binding={role:input.role,identity,sessionId:input.parentSessionId,taskId:input.taskId,slotId,callId:input.callId,childSessionId:input.childSessionId,generation:input.generation},prospective=retry?evidence2.map((entry)=>entry===retry?binding:entry):[...evidence2,binding]}}return{route,binding,prospective,legacyUnrouted}}function applyStageBStateCompletion(taskId,agent,parentSessionId,testEngineerExempt,directory,callId,childSessionId,generation,preparedRoute){for(let session of candidateSessions(parentSessionId)){let resolvedRoute=preparedRoute??resolveBackgroundStageBRoute({directory,taskId,parentSessionId,role:agent,callId,childSessionId,generation:generation??-1,session}),{binding,prospective:routeEvidence,legacyUnrouted}=resolvedRoute,routeEnabled=(()=>{try{return loadPluginConfig(directory).review_routing?.enforce_receipts??!0}catch{return!0}})(),completionDecision=enforcePersistedReviewRouteReceipt({projectRoot:directory,sessionId:parentSessionId,taskId,receipts:routeEvidence,enforcementEnabled:routeEnabled,legacyUnrouted,requireEvidenceBindings:!0,requireCompleteEvidence:!1,expectedDispatch:binding?{role:binding.role,identity:binding.identity,callId:binding.callId,childSessionId:binding.childSessionId,generation:binding.generation}:void 0});if(!completionDecision.canAdvance){warn(`[background-stage-b] route receipt blocked ${taskId}: ${completionDecision.reason??"unknown reason"}`);continue}if(binding&&!recordStageBRouteEvidence(session,taskId,binding)){warn(`[background-stage-b] route receipt blocked before Stage-B evidence publication for ${taskId}: bounded route evidence capacity exceeded`);continue}recordStageBCompletion(session,taskId,agent);let state2=getTaskState(session,taskId);if(state2==="tests_run"||state2==="complete")continue;let routeComplete=enforcePersistedReviewRouteReceipt({projectRoot:directory,sessionId:parentSessionId,taskId,receipts:getStageBRouteEvidence(session,taskId),enforcementEnabled:routeEnabled,legacyUnrouted,requireEvidenceBindings:!0,requireCompleteEvidence:!0}).canAdvance;if(routeComplete&&(hasBothStageBCompletions(session,taskId)||testEngineerExempt&&agent==="reviewer")){try{if(state2==="coder_delegated"||state2==="pre_check_passed")advanceTaskState(session,taskId,"reviewer_run",{telemetrySessionId:parentSessionId});if(getTaskState(session,taskId)==="reviewer_run")advanceTaskState(session,taskId,"tests_run",{telemetrySessionId:parentSessionId})}catch(err){warn(`[background-stage-b] could not advance ${taskId} after ${agent}: ${err instanceof Error?err.message:String(err)}`)}continue}if(agent==="reviewer"&&(state2==="coder_delegated"||state2==="pre_check_passed"))try{advanceTaskState(session,taskId,"reviewer_run",{telemetrySessionId:parentSessionId})}catch(err){warn(`[background-stage-b] could not advance ${taskId} to reviewer_run: ${err instanceof Error?err.message:String(err)}`)}else if(routeComplete&&agent==="test_engineer"&&state2==="reviewer_run")try{advanceTaskState(session,taskId,"tests_run",{telemetrySessionId:parentSessionId})}catch(err){warn(`[background-stage-b] could not advance ${taskId} to tests_run: ${err instanceof Error?err.message:String(err)}`)}}}init_task_envelope();init_workspace_snapshot();var RETRYABLE_LEGACY_SETTLEMENT_TRANSFER_ERROR_CODES=new Set(["CODER_SETTLEMENT_LOCKED","EACCES","EBUSY","EIO","EPERM","ETIMEDOUT"]),observerInternals={transferCoderSettlementToBackground,markLegacyCoderSettlementTransferPending,sleep:(milliseconds)=>new Promise((resolve108)=>setTimeout(resolve108,milliseconds))};function createBackgroundCompletionObserver(opts){let{config:config3,directory}=opts,replayInProgress=!1,notifyLegacyCoderSettlementAdvisoryReplaced=(record3,replacement)=>{let session=swarmState.agentSessions.get(record3.parentSessionId);if(!session)return;if(removeQueuedLegacyTransferAdvisory(session.pendingAdvisoryMessages,replacement.advisory.eventId),replacement.replacedMessage)removeQueuedAdvisoryMessage(session.pendingAdvisoryMessages,[replacement.replacedMessage]);pushAdvisory(session,replacement.advisory.message)},event=async(input)=>{if(!config3.enabled)return;try{let pending,result,terminal,record3,text,isDuplicate=!1;if(input.trustedTerminal)pending=input.trustedTerminal.record,result=input.trustedTerminal.result,terminal=input.trustedTerminal.terminal,text=result.error??result.text??"",record3=pending,isDuplicate=!0;else{let evt=input?.event;if(!evt||evt.type!=="message.part.updated")return;let part=evt.properties?.part;if(!part||part.type!=="text"||part.synthetic!==!0||typeof part.text!=="string")return;let envelope=parseTaskEnvelope(part.text);if(!envelope||envelope.state!=="completed"&&envelope.state!=="error"&&envelope.state!=="cancelled")return;let parentSessionId=typeof part.sessionID==="string"?part.sessionID:"",lookup=await findDelegationForCompletion(directory,envelope.sessionId);if(lookup?.source==="uncertain"){warn(`[background] deferring terminal ingestion: delegation store unreadable for ${envelope.sessionId} (${lookup.uncertain})`);return}if(!lookup){log(`[background] trusted completion for ${envelope.sessionId} has no durable primary or fallback owner; ignored`);return}if(!parentSessionId||lookup.record.parentSessionId!==parentSessionId||lookup.record.subagentSessionId!==envelope.sessionId){warn(`[background] trusted completion identity mismatch for ${envelope.sessionId}; ignored`);return}if(pending=lookup.record,lookup.source==="fallback"){let promoted=await promoteDelegationFallback(directory,envelope.sessionId);if(!promoted){warn(`[background] fallback promotion failed for ${envelope.sessionId}; terminal work remains preserved`);return}pending=promoted.record}text=envelope.state==="error"||envelope.state==="cancelled"?envelope.errorText??"":envelope.resultText??"",result={...envelope.state==="error"?{error:text}:{text},chars:envelope.resultChars??text.length,truncated:envelope.resultTruncated??!1,digest:digest4(text)},terminal={eventId:buildBackgroundCompletionEventId({correlationId:pending.correlationId,jobId:pending.jobId,status:envelope.state,resultDigest:result.digest}),status:envelope.state,recordedAt:pending.terminalResult?.recordedAt??Date.now(),result};let terminalClaim=await claimTerminalResult(directory,pending.correlationId,terminal);if(!terminalClaim){warn(`[background] terminal claim failed for ${pending.correlationId}; ignored`);return}isDuplicate=terminalClaim.disposition==="duplicate",record3=terminalClaim.record}if(opts.onTerminalClaimed?.(record3),!input.trustedTerminal?.skipMaintenance)try{await maintainBackgroundDelegations(directory,{lockTimeoutMs:1000,reason:"trusted-terminal",onLegacyCoderSettlementReconciled:reconcilePending,onLegacyCoderSettlementAdvisoryReplaced:notifyLegacyCoderSettlementAdvisoryReplaced})}catch{}let legacyTransferPending=!1,legacyTransferRequiresManualRecovery=!1;if(terminal.status!=="completed"){if(isDuplicate&&record3.normalizedAgent!=="coder")return;if(record3.normalizedAgent==="coder"){let legacyTransfer=await transferLegacyCoderSettlement(directory,record3);if(legacyTransfer.disposition==="retry_pending")legacyTransferPending=!0;else if(legacyTransfer.disposition==="manual_recovery")legacyTransferRequiresManualRecovery=!0;if(record3.planTaskId){let expectedGeneration=record3.taskChangeContext?.workflowGeneration;if(expectedGeneration===void 0)warn(`[background] failed coder ${record3.correlationId} has no launch generation for task ${record3.planTaskId}`);else try{await transitionTaskWorkflowEvidence(directory,record3.planTaskId,{type:"dispatch_no_mutation",agentType:"coder",expectedGeneration,transitionId:`background-coder-terminal:${terminal.eventId}`})}catch(error93){warn(`[background] failed coder retry accounting was fenced for ${record3.planTaskId}: ${error93 instanceof Error?error93.message:String(error93)}`)}}try{await releaseCoderReservation(directory,record3,"recovered")}catch(error93){warn(`[background] failed coder reservation cleanup will be retried by admission reconciliation: ${error93 instanceof Error?error93.message:String(error93)}`)}if(record3.worktree){let descriptor=record3.worktree;if(!standardWorktreeByCallID.has(record3.callID))standardWorktreeByCallID.set(record3.callID,{callID:descriptor.callID,parentSessionID:descriptor.parentSessionId,taskId:descriptor.taskId,...descriptor.planTaskId?{planTaskId:descriptor.planTaskId}:{},handle:{worktreePath:descriptor.worktreePath,branchName:descriptor.branchName,purpose:"lane",id:descriptor.worktreeId,sessionId:descriptor.worktreeSessionId},mergeStrategy:descriptor.mergeStrategy,laneIndex:descriptor.laneIndex,...descriptor.worktreeDir?{worktree_dir:descriptor.worktreeDir}:{}});try{await abortStandardWorktreeDispatch(record3.callID,"cancelled",directory)}catch(error93){warn(`[background] failed coder worktree cleanup preserved the lane for manual recovery: ${error93 instanceof Error?error93.message:String(error93)}`)}}}if(discardScopeForRecord(record3),await publishAdvisory(directory,record3,terminal.eventId,legacyTransferPending?`${terminal.status==="cancelled"?"cancelled":"failed"}; legacy coder settlement transfer is pending; durable reconciliation will retry`:legacyTransferRequiresManualRecovery?`${terminal.status==="cancelled"?"cancelled":"failed"}; legacy coder settlement requires manual recovery; run /swarm recover for this task (or /swarm reset-session)`:terminal.status==="cancelled"?"cancelled":"failed"),!legacyTransferPending)await clearLegacyCoderSettlementTransferPending(directory,record3.correlationId);return}if(record3.normalizedAgent==="coder"){let settled=await settleCoder(directory,record3,terminal.eventId);if(record3=settled.record,!settled.ok){await publishAdvisory(directory,record3,terminal.eventId,settled.outcome);return}let legacyTransfer=await transferLegacyCoderSettlement(directory,record3);if(legacyTransfer.disposition==="retry_pending")legacyTransferPending=!0;else if(legacyTransfer.disposition==="manual_recovery")legacyTransferRequiresManualRecovery=!0}else if(!isDuplicate&&isBackgroundGateBearingRecord(record3)){if(validateStageBWorkspace(directory,record3).stale){await appendDelegationTransition(directory,record3.correlationId,{status:"stale"}),discardScopeForRecord(record3),await publishAdvisory(directory,record3,terminal.eventId,"stale");return}}if(record3.normalizedAgent==="coder"||isBackgroundGateBearingRecord(record3)){let ingestion=await claimDelegationIngestion(directory,record3.correlationId,{claimantId:terminal.eventId});if(ingestion?.disposition==="claimed"||ingestion?.disposition==="retry"){let applied2=await ingestBackgroundStageBCompletion({directory,record:ingestion.record,result:ingestion.record.result??result,reviewerReceiptOptions:opts.reviewerReceiptOptions}),claimToken=ingestion.record.ingestion?.claimToken;if(!claimToken){await publishAdvisory(directory,record3,terminal.eventId,"ingestion claim token missing");return}let ingestionCommit=await(opts.recordIngestionResult??recordDelegationIngestionResult)(directory,record3.correlationId,claimToken,applied2.ok);if(!ingestionCommit){warn(`[background] ingestion claim for ${record3.correlationId} expired or was fenced before commit; retry remains pending`);return}if(applied2.ok&&(ingestionCommit.status!=="consumed"||ingestionCommit.ingestion?.state!=="consumed"||ingestionCommit.ingestion.claimToken!==claimToken)){warn(`[background] ingestion commit for ${record3.correlationId} did not confirm the exact consumed claim; retry remains pending`);return}if(record3=ingestionCommit,record3=(await findDelegationForCompletion(directory,record3.correlationId))?.record??record3,!applied2.ok){await publishAdvisory(directory,record3,terminal.eventId,applied2.skipped?"skipped (tests not run) — re-dispatch the test gate; reviewer proof preserved; task remains Stage B eligible":legacyTransferPending?"ingestion failed; legacy coder settlement transfer is pending; durable reconciliation will retry":legacyTransferRequiresManualRecovery?"ingestion failed; legacy coder settlement requires manual recovery; run /swarm recover for this task (or /swarm reset-session)":applied2.stale?"stale":"ingestion failed");try{await maintainBackgroundDelegations(directory,{lockTimeoutMs:1000,reason:"ingestion-rejection",skipLegacyCoderSettlementReconciliation:legacyTransferPending,onLegacyCoderSettlementAdvisoryReplaced:notifyLegacyCoderSettlementAdvisoryReplaced})}catch{}return}}else if(ingestion?.disposition==="busy")return;else if(ingestion?.disposition!=="consumed"){await publishAdvisory(directory,record3,terminal.eventId,"ingestion pending");return}}if(record3.normalizedAgent==="docs")try{if(!await completeBackgroundPhaseParticipation({directory,record:record3,resultText:text}))warn(`[background] docs completion ${record3.correlationId} did not satisfy its durable phase-participation binding`)}catch(error93){warn(`[background] docs completion ${record3.correlationId} could not persist phase participation: ${error93 instanceof Error?error93.message:String(error93)}`)}if(record3.normalizedAgent==="reviewer")discardScopeForRecord(record3);if(record3.normalizedAgent==="coder"){if(await releaseCoderReservation(directory,record3,"consumed"),!legacyTransferPending)await clearLegacyCoderSettlementTransferPending(directory,record3.correlationId)}await publishAdvisory(directory,record3,terminal.eventId,record3.normalizedAgent==="coder"?legacyTransferPending?"completed and settled; legacy coder settlement transfer is pending; durable reconciliation will retry":legacyTransferRequiresManualRecovery?"completed and settled; legacy coder settlement requires manual recovery; run /swarm recover for this task (or /swarm reset-session)":"completed and settled":"completed"),log(`[background] trusted completion settled: agent=${record3.normalizedAgent} task=${taskLabel(record3)} parent=${record3.parentSessionId}`)}catch(err){warn(`[background] completion observer error: ${err instanceof Error?err.message:String(err)}`)}},reconcilePending=async(record3)=>{if(replayInProgress)return!1;let terminal=record3.terminalResult;if(!terminal)return!1;replayInProgress=!0;try{await event({event:void 0,trustedTerminal:{record:record3,terminal,result:terminal.result,skipMaintenance:!0}});let refreshed=await findDelegationForCompletion(directory,record3.subagentSessionId);return refreshed?.record?refreshed.record.status==="consumed":!1}finally{replayInProgress=!1}};if(config3.enabled)registerLegacyCoderSettlementReconciler(directory,reconcilePending);return{event,reconcilePending,notifyLegacyCoderSettlementAdvisoryReplaced,prepareAdvisories:async(parentSessionId)=>{if(!config3.enabled||!parentSessionId)return null;let preparationId=`bg-prepare:${cryptoRandomId()}`,entries2=await preparePendingBackgroundAdvisories(directory,parentSessionId,{preparationId});return entries2.length===0?null:{preparationId,eventIds:entries2.map((entry)=>entry.eventId),messages:entries2.map((entry)=>entry.message)}},ackObservedAdvisories:(parentSessionId,observedTexts)=>acknowledgeObservedBackgroundAdvisories(directory,parentSessionId,observedTexts),releaseAdvisories:(parentSessionId,prepared)=>releasePreparedBackgroundAdvisories(directory,parentSessionId,prepared.preparationId,prepared.eventIds)}}async function transferLegacyCoderSettlement(directory,record3){if(!record3.planTaskId)return{disposition:"ok",outcome:"no task-scoped legacy settlement"};let transfer={taskId:record3.planTaskId,transitionId:`coder:${record3.callID}`},detail="unknown transfer failure",lastErrorCode=null;for(let attempt=0;attempt<3;attempt+=1)try{return{disposition:"ok",outcome:await observerInternals.transferCoderSettlementToBackground({directory,taskId:transfer.taskId,transitionId:transfer.transitionId})}}catch(error93){if(lastErrorCode=errorCode2(error93),detail=error93 instanceof Error?error93.message:String(error93),attempt===2||!isRetryableLegacyTransferErrorCode(lastErrorCode))break;await observerInternals.sleep(50*(attempt+1))}if(warn(`[background] legacy coder settlement transfer failed for ${record3.planTaskId}: ${detail}`),!isRetryableLegacyTransferErrorCode(lastErrorCode))return{disposition:"manual_recovery",outcome:"legacy coder settlement requires manual recovery; run /swarm recover for this task (or /swarm reset-session)"};let pending=null;for(let markerAttempt=0;markerAttempt<3;markerAttempt+=1){try{pending=await observerInternals.markLegacyCoderSettlementTransferPending(directory,record3.correlationId,transfer)}catch{pending=null}if(hasExactPendingLegacyTransfer(pending,transfer))break;if(markerAttempt<2)await observerInternals.sleep(50*(markerAttempt+1))}if(hasExactPendingLegacyTransfer(pending,transfer))return{disposition:"retry_pending",outcome:"legacy coder settlement transfer is pending; retrying durable reconciliation"};return{disposition:"manual_recovery",outcome:"legacy coder settlement requires manual recovery; run /swarm recover for this task (or /swarm reset-session)"}}async function releaseCoderReservation(directory,record3,reason){if(!record3.coderReservationId)return;let bound=await bindBackgroundCoderReservation(directory,{reservationId:record3.coderReservationId,parentSessionId:record3.parentSessionId,planTaskId:record3.planTaskId,callID:record3.callID,correlationId:record3.correlationId});if(!bound){warn(`[background] coder reservation ${record3.coderReservationId} could not be bound for ${record3.correlationId}; admission remains fail-closed`);return}if(!await releaseBackgroundCoderReservation(directory,{...bound,generation:record3.generation??1,reason}))warn(`[background] coder reservation ${record3.coderReservationId} could not be released after ${reason}; the next admission will retry reconciliation`)}async function settleCoder(directory,record3,operationId){let context=record3.taskChangeContext;if(!context)return{ok:!1,record:record3,outcome:"stale: no coder baseline"};let claim=await claimCoderSettlement(directory,record3.correlationId,operationId);if(!claim)return{ok:!1,record:record3,outcome:"settlement claim failed"};if(claim.disposition==="settled")return{ok:!0,record:claim.record,outcome:"completed and settled"};if(claim.disposition==="preserved")return{ok:!1,record:claim.record,outcome:"settlement preserved"};if(record3=claim.record,!record3.worktree){let baseline=context.baseline,current=captureWorkspaceSnapshot(directory,{scope:baseline.scope,prHeadSha:baseline.prHeadSha,resolveCurrentPrHeadSha:baseline.prHeadSha!==null}),repositoryDelta=changedFilesSinceSnapshot(directory,baseline),declaredFiles=context.declaredFiles,observedFiles2=repositoryDelta&&declaredFiles&&declaredFiles.length>0?repositoryDelta.filter((file3)=>isInDeclaredScope(file3,declaredFiles,directory)):null,staleReason=!sameProjectRoot(baseline.directory,directory)?"shared-root directory identity changed":!baseline.gitHead||current.gitHead!==baseline.gitHead?"shared-root HEAD changed before coder completion":baseline.prHeadSha!==null&¤t.prHeadSha!==baseline.prHeadSha?"shared-root PR head changed before coder completion":observedFiles2===null?"shared-root coder files could not be attributed to a non-empty declared scope":null;if(staleReason||observedFiles2===null){let preserved2=await updateCoderSettlement(directory,record3.correlationId,{operationId,state:"preserved",observedFiles:null,outcome:{kind:"shared-root",result:"failed",reason:staleReason??"coder attribution failed"}});return await appendDelegationTransition(directory,record3.correlationId,{status:"stale"}),{ok:!1,record:preserved2??record3,outcome:`stale: ${staleReason??"coder attribution failed"}`}}let settled=await updateCoderSettlement(directory,record3.correlationId,{operationId,state:"settled",observedFiles:observedFiles2,outcome:{kind:"shared-root",result:"ready"}});return settled?{ok:!0,record:settled,outcome:"completed and settled"}:{ok:!1,record:record3,outcome:"settlement persistence failed"}}let descriptor=record3.worktree;if(descriptor.callID!==record3.callID||descriptor.parentSessionId!==record3.parentSessionId||descriptor.planTaskId!==record3.planTaskId||!sameProjectRoot(context.baseline.directory,descriptor.worktreePath))return{ok:!1,record:await updateCoderSettlement(directory,record3.correlationId,{operationId,state:"preserved",observedFiles:null,outcome:{kind:"standard-worktree",result:"failed",reason:"worktree recovery identity does not match the dispatch"}})??record3,outcome:"worktree settlement preserved: identity mismatch"};let observedFiles=changedFilesSinceSnapshot(descriptor.worktreePath,context.baseline);if(observedFiles===null)return{ok:!1,record:await updateCoderSettlement(directory,record3.correlationId,{operationId,state:"preserved",observedFiles:null,outcome:{kind:"standard-worktree",result:"failed",reason:"worktree files could not be attributed to the clean baseline"}})??record3,outcome:"worktree settlement preserved: attribution failed"};let dispatch=standardWorktreeByCallID.get(record3.callID)??{callID:descriptor.callID,parentSessionID:descriptor.parentSessionId,taskId:descriptor.taskId,...descriptor.planTaskId?{planTaskId:descriptor.planTaskId}:{},handle:{worktreePath:descriptor.worktreePath,branchName:descriptor.branchName,purpose:"lane",id:descriptor.worktreeId,sessionId:descriptor.worktreeSessionId},mergeStrategy:descriptor.mergeStrategy,laneIndex:descriptor.laneIndex,...descriptor.worktreeDir?{worktree_dir:descriptor.worktreeDir}:{}};standardWorktreeByCallID.delete(record3.callID),awaitingMergeByCallID.set(record3.callID,{callID:record3.callID,parentSessionID:descriptor.parentSessionId,taskId:descriptor.taskId,...descriptor.planTaskId?{planTaskId:descriptor.planTaskId}:{},branch:descriptor.branchName,worktreePath:descriptor.worktreePath,mergeStrategy:descriptor.mergeStrategy,queuedAt:Date.now()});let resume=settlementResume(record3),mergeResult=await finishStandardWorktreeDispatch(directory,dispatch,void 0,record3.callID,{operationId,...resume?{resume}:{},onBeforeMerge:async(provenance)=>{let persisted=await updateCoderSettlement(directory,record3.correlationId,{operationId,state:"settling",sourceHeadAfterCommit:provenance.sourceHead,targetHeadBeforeMerge:provenance.targetHeadBefore,observedFiles});if(!persisted)throw Error("could not persist pre-merge provenance");record3=persisted},onMerged:async(merged)=>{let provenance=merged.provenance??resume,persisted=await updateCoderSettlement(directory,record3.correlationId,{operationId,state:"settled",observedFiles,...provenance?{sourceHeadAfterCommit:provenance.sourceHead,targetHeadBeforeMerge:provenance.targetHeadBefore}:{},outcome:{kind:"standard-worktree",result:provenance&&provenance.sourceHead!==provenance.targetHeadBefore?"merged":"unchanged",sourceHeadAfterCommit:provenance?.sourceHead??null,targetHeadBeforeMerge:provenance?.targetHeadBefore??null,targetHeadAfterMerge:resolveCurrentGitHead(directory)}});if(!persisted)throw Error("could not persist merged settlement");record3=persisted}});if(mergeResult.outcome==="merged")return{ok:!0,record:(await findDelegationForCompletion(directory,record3.correlationId))?.record??record3,outcome:"completed and merged"};if(mergeResult.outcome==="failed"&&mergeResult.stage==="settlement-persist")return{ok:!1,record:record3,outcome:"worktree settlement persistence pending retry"};return{ok:!1,record:await updateCoderSettlement(directory,record3.correlationId,{operationId,state:"preserved",observedFiles,...mergeResult.provenance?{sourceHeadAfterCommit:mergeResult.provenance.sourceHead,targetHeadBeforeMerge:mergeResult.provenance.targetHeadBefore}:{},outcome:{kind:"standard-worktree",result:mergeResult.outcome,reason:mergeResult.message,sourceHeadAfterCommit:mergeResult.provenance?.sourceHead??null,targetHeadBeforeMerge:mergeResult.provenance?.targetHeadBefore??null}})??record3,outcome:`worktree settlement preserved: ${mergeResult.message}`}}function settlementResume(record3){let{coderSettlement:settlement,worktree}=record3;if(settlement?.state!=="settling"||!settlement.operationId||!settlement.sourceHeadAfterCommit||!settlement.targetHeadBeforeMerge||!GIT_OBJECT_ID_PATTERN.test(settlement.sourceHeadAfterCommit)||!GIT_OBJECT_ID_PATTERN.test(settlement.targetHeadBeforeMerge)||!worktree)return;return{operationId:settlement.operationId,sourceHead:settlement.sourceHeadAfterCommit,targetHeadBefore:settlement.targetHeadBeforeMerge,branchName:worktree.branchName,strategy:worktree.mergeStrategy}}async function publishAdvisory(directory,record3,eventId,outcome){let message=`[BACKGROUND COMPLETION ${eventId}] ${record3.normalizedAgent} task ${taskLabel(record3)} ${outcome}.`,input={eventId,parentSessionId:record3.parentSessionId,message},needsCorrection=!message.includes(LEGACY_CODER_SETTLEMENT_PENDING_ADVISORY_MARKER),replacement=(needsCorrection?await replacePendingBackgroundAdvisory(directory,record3.correlationId,input):null)??null,stored=replacement?.advisory??await putPendingBackgroundAdvisory(directory,record3.correlationId,input);if(!stored)return;let session=swarmState.agentSessions.get(record3.parentSessionId);if(session){if(needsCorrection){if(removeQueuedLegacyTransferAdvisory(session.pendingAdvisoryMessages,eventId),replacement?.replacedMessage)removeQueuedAdvisoryMessage(session.pendingAdvisoryMessages,[replacement.replacedMessage])}pushAdvisory(session,stored.message)}}function errorCode2(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}function hasExactPendingLegacyTransfer(record3,transfer){return record3?.legacyCoderSettlementTransfer?.taskId===transfer.taskId&&record3.legacyCoderSettlementTransfer.transitionId===transfer.transitionId}function isRetryableLegacyTransferErrorCode(code){return code!==null&&RETRYABLE_LEGACY_SETTLEMENT_TRANSFER_ERROR_CODES.has(code)}function removeQueuedAdvisoryMessage(queue,messagesToRemove){if(!queue||queue.length===0||messagesToRemove.length===0)return;let remove=new Set(messagesToRemove);for(let index=queue.length-1;index>=0;index-=1)if(remove.has(queue[index]))queue.splice(index,1)}function removeQueuedLegacyTransferAdvisory(queue,eventId){if(!queue||queue.length===0)return;let prefix=`[BACKGROUND COMPLETION ${eventId}]`;for(let index=queue.length-1;index>=0;index-=1){let message=queue[index];if(message?.startsWith(prefix)&&message.includes(LEGACY_CODER_SETTLEMENT_PENDING_ADVISORY_MARKER))queue.splice(index,1)}}function taskLabel(record3){return record3.evidenceTaskId??record3.planTaskId??"unknown"}function discardScopeForRecord(record3){let taskId=record3.evidenceTaskId??record3.planTaskId;if(!taskId)return;if(record3.normalizedAgent==="reviewer")discardReviewerScopeGenerationClaim({parentSessionID:record3.parentSessionId,taskId,reviewerCallID:record3.callID});else if(record3.normalizedAgent==="coder")discardReviewerScopeGenerationForCoderCall({parentSessionID:record3.parentSessionId,taskId,coderCallID:record3.callID})}function digest4(text){return createHash98("sha256").update(text).digest("hex")}function cryptoRandomId(){return createHash98("sha256").update(`${Date.now()}:${Math.random()}`).digest("hex").slice(0,24)}init_pr_subscriptions();init_commands();init_registry2();init_config();init_agent_model();init_bundled_skills();init_constants();init_config();init_package();init_constants();import*as fs156 from"node:fs";import*as path281 from"node:path";var CONFIG_SCHEMA_REF=`https://unpkg.com/opencode-swarm@${package_default.version}/opencode-swarm.schema.json`;function writeSwarmConfigExampleIfNew(projectDirectory){try{let swarmDir=path281.join(projectDirectory,".swarm"),dest=path281.join(swarmDir,"config.example.json");if(fs156.existsSync(dest))return;if(!fs156.existsSync(swarmDir))fs156.mkdirSync(swarmDir,{recursive:!0});let example={$schema:CONFIG_SCHEMA_REF,agents:Object.fromEntries(Object.entries(DEFAULT_MODELS).filter(([name])=>name!=="default").map(([name,model])=>[name,{model,fallback_models:DEFAULT_AGENT_CONFIGS.coder?.fallback_models??["opencode/big-pickle"]}])),max_iterations:5};fs156.writeFileSync(dest,`${JSON.stringify(example,null,2)}
|
|
7186
|
+
`)}var init_prompt_renderer=()=>{};function reject(reason,detail,rejected_items){return{ok:!1,rejected:!0,reason,detail,rejected_items}}async function validateReceipt(ctx){let{items,no_relevant_knowledge:noRelevant}=ctx;if(items.length===0&&!noRelevant)return reject("empty_receipt","no items and no_relevant_knowledge is false");if(noRelevant&&items.length>0)return reject("invalid_outcome","no_relevant_knowledge cannot be combined with items");for(let item of items)if(!VALID_OUTCOMES.has(item.outcome))return reject("invalid_outcome",`item ${item.id}: outcome ${item.outcome}`);let traceId=ctx.trace_id||NO_TRACE_SENTINEL;if(traceId===NO_TRACE_SENTINEL){if(items.length>0)return reject("trace_not_found","items filed against the none sentinel trace");let empty=await commitEmptyRetrieval(ctx.directory,{trace_id:traceId,session_id:ctx.session_id,phase:ctx.phase,task_id:ctx.task_id,agent:ctx.agent,grace_days:ctx.grace_days});if(!empty.ok)return reject(empty.code,empty.detail);return{ok:!0,accepted:[],idempotent_skips:[],trace:null,closes_no_relevant:!0,authoritative_event_ids:{},no_relevant_event_id:empty.terminal_event_id}}let committed=await validateAndCommitTerminalBatch(ctx.directory,{trace_id:traceId,session_id:ctx.session_id,phase:ctx.phase,task_id:ctx.task_id,agent:ctx.agent,cohort_id:ctx.cohort_id,source_link_id:ctx.source_link_id,grace_days:ctx.grace_days,authorized_filing_sessions:ctx.authorized_filing_sessions,items:items.map((item)=>({entry_id:item.id,outcome:item.outcome,reason:item.reason,source:ctx.source.trim()||"unknown"})),no_relevant_knowledge:noRelevant});if(!committed.ok)return reject(committed.code,committed.detail);let remainingItems=[...items],takeItem=(id,outcome)=>{let index=remainingItems.findIndex((item)=>item.id===id&&(outcome===void 0||item.outcome===outcome));if(index<0)return;return remainingItems.splice(index,1)[0]},accepted=committed.accepted.map((item)=>takeItem(item.entry_id,item.outcome)).filter((item)=>item!==void 0),idempotent_skips=committed.idempotent.map((id)=>takeItem(id)).filter((item)=>item!==void 0),wrongSessionStamps=committed.wrong_session_membership_sessions??{},wrongSessionDetail=(id)=>{let stamp=wrongSessionStamps[id];if(!stamp)return;return`wrong_session for id ${sanitizeDiagnosticText(id,64)}: knowledge captured in session ${sanitizeDiagnosticText(stamp,64)} but filed from ${sanitizeDiagnosticText(ctx.session_id,64)}; file from the capturing session or its dispatched child (after a reset-session, a re-dispatched child is authorized), or surface fresh knowledge via knowledge_recall`},rejected_items=committed.rejected.map((item)=>({item:takeItem(item.entry_id)??{id:item.entry_id,outcome:"ignored"},reason:item.reason}));if(rejected_items.length&&accepted.length===0&&idempotent_skips.length===0){let first=rejected_items[0];return reject(first.reason,wrongSessionDetail(first.item.id)??`${first.reason} for id ${first.item.id}`,rejected_items.map((entry)=>entry.reason==="wrong_session"?{...entry,detail:wrongSessionDetail(entry.item.id)}:entry))}let queried=await queryLiveMemberships(ctx.directory,{session_id:ctx.session_id,include_terminal:!0,grace_days:ctx.grace_days}),memberships=queried.ok?queried.memberships.filter((membership)=>membership.trace_id===traceId):[],trace=memberships.length?{type:"retrieved",event_id:memberships[0].membership_event_id,trace_id:traceId,timestamp:memberships[0].committed_at,session_id:ctx.session_id,phase:memberships[0].phase,task_id:memberships[0].task_id,agent:memberships[0].agent??ctx.agent,query:"",retrieval_mode:"manual",result_ids:memberships.map((membership)=>membership.entry_id),ranks:Object.fromEntries(memberships.map((membership,index)=>[membership.entry_id,membership.rank??index+1])),scores:Object.fromEntries(memberships.map((membership)=>[membership.entry_id,membership.score??0]))}:null;return{ok:!0,accepted,idempotent_skips,trace,closes_no_relevant:committed.closes_no_relevant,authoritative_event_ids:Object.fromEntries(committed.accepted.map((item)=>[item.entry_id,item.event_id])),...committed.terminal_event_id?{no_relevant_event_id:committed.terminal_event_id}:{},...rejected_items.length?{rejected_items:rejected_items.map((entry)=>entry.reason==="wrong_session"?{...entry,detail:wrongSessionDetail(entry.item.id)}:entry)}:{}}}var NO_TRACE_SENTINEL="none",VALID_OUTCOMES;var init_knowledge_receipt_validator=__esm(()=>{init_path_identity();init_knowledge_receipt_ledger();VALID_OUTCOMES=RECEIPT_TERMINAL_OUTCOMES});function isTaskTool3(tool3){return tool3==="Task"||tool3==="task"}function resolveDelegateAckTaskId(args2,knownPlanTaskIds,planContextOverLimit=!1){let resolved=resolveDelegateAckTaskIdResult(args2,knownPlanTaskIds,planContextOverLimit);return resolved.status==="resolved"?resolved.taskId:void 0}function resolveDelegateAckTaskIdResult(args2,knownPlanTaskIds,planContextOverLimit=!1){return resolveTaskId(args2,{policy:"attribution",knownPlanTaskIds,planContextOverLimit})}async function appendUnacknowledgedCritical(directory,record3){let filePath=validateSwarmPath(directory,"unacknowledged-criticals.jsonl");await appendCappedJsonl(filePath,JSON.stringify(record3),{maxEntries:resolveRetentionCap("MAX_UNACKNOWLEDGED_CRITICALS",MAX_UNACKNOWLEDGED_CRITICALS),onPrune:(dropped)=>{warn(`unacknowledged-criticals audit at cap: dropped ${dropped} oldest ${dropped===1?"entry":"entries"} (FIFO bound MAX_UNACKNOWLEDGED_CRITICALS)`)}})}async function reconcileShownDirectives(params){let result={emitted:[],unacknowledgedCriticals:[],unacknowledgedNonCritical:[]};try{let shown=params.shown;if(shown.length===0)return result;let shownById=new Map(shown.map((d)=>[d.id,d])),criticalIds=shown.filter((d)=>d.priority==="critical").map((d)=>d.id),acks=parseAcknowledgments(params.transcript),ackedIds=new Set,violatedIds=new Set,sessionId=params.sessionId,taskId=params.taskId,traceId=params.traceId??"legacy-unverifiable",isLegacyPrompt=params.traceId===void 0,cohortId,linkId;try{cohortId=await ensureCohortIdCached(params.directory,sessionId),linkId=readLinkPointer(params.directory)?.linkId}catch{}let ackItems=[],ackByItemId=new Map;for(let ack of acks){if(!shownById.has(ack.id))continue;if(ackedIds.add(ack.id),!isLegacyPrompt&&ack.trace_id!==traceId)continue;if(ack.result==="applied"||ack.result==="ignored"||ack.result==="violated"||ack.result==="n_a"||ack.result==="contradicted")ackItems.push({id:ack.id,outcome:ack.result,reason:ack.reason}),ackByItemId.set(ack.id,ack)}let eventIdByKnowledgeId=new Map;if(isLegacyPrompt)for(let ack of acks){if(!shownById.has(ack.id))continue;if(!ackByItemId.has(ack.id))continue;ackedIds.add(ack.id)}else{let validation2=await validateReceipt({directory:params.directory,trace_id:traceId,session_id:sessionId,task_id:taskId,agent:params.agent,source:"delegate",cohort_id:cohortId,source_link_id:linkId,items:ackItems,no_relevant_knowledge:!1});if(validation2.ok){for(let item of validation2.accepted){let ack=ackByItemId.get(item.id);if(!ack)continue;ackedIds.add(item.id),await recordKnowledgeEvent(params.directory,{type:item.outcome,trace_id:traceId,knowledge_id:item.id,session_id:sessionId,task_id:taskId,agent:params.agent,source:"delegate",reason:ack.reason});let authoritativeEventId=validation2.authoritative_event_ids[item.id];if(authoritativeEventId)eventIdByKnowledgeId.set(item.id,authoritativeEventId);if(item.outcome==="violated")violatedIds.add(item.id);result.emitted.push({id:item.id,type:item.outcome})}for(let item of validation2.idempotent_skips)ackedIds.add(item.id);for(let rejected2 of validation2.rejected_items??[])ackedIds.add(rejected2.item.id)}if(!validation2.ok)for(let id of ackByItemId.keys())ackedIds.add(id)}try{let now2=new Date().toISOString(),evidenceRecords=[];for(let[kid,eid]of eventIdByKnowledgeId){let ack=ackByItemId.get(kid);if(!ack||!cohortId)continue;let outcome=ack.result;if(outcome!=="applied"&&outcome!=="violated"&&outcome!=="contradicted")continue;evidenceRecords.push({cohort_id:cohortId,source_link_id:linkId,entry_id:kid,retrieval_trace_id:traceId,receipt_outcome:outcome,receipt_source:"delegate",receipt_event_id:eid,phase:void 0,timestamp:now2})}await appendPromotionEvidence(params.directory,evidenceRecords)}catch{}let missingCriticalIds=criticalIds.filter((id)=>!ackedIds.has(id)),committedMissingCriticalIds=new Set;if(!isLegacyPrompt&&missingCriticalIds.length>0){let committed=await validateAndCommitTerminalBatch(params.directory,{trace_id:traceId,session_id:sessionId,task_id:taskId,agent:params.agent,cohort_id:cohortId,source_link_id:linkId,items:missingCriticalIds.map((entry_id)=>({entry_id,outcome:"violated",source:"delegate",reason:"unacknowledged"}))});if(committed.ok)committedMissingCriticalIds=new Set(committed.committed.map((item)=>item.entry_id))}for(let id of missingCriticalIds){if(!committedMissingCriticalIds.has(id))continue;result.unacknowledgedCriticals.push(id),await recordKnowledgeEvent(params.directory,{type:"violated",trace_id:traceId,knowledge_id:id,session_id:sessionId,task_id:taskId,agent:params.agent,source:"delegate",reason:"unacknowledged"}),violatedIds.add(id),result.emitted.push({id,type:"violated"});try{await appendUnacknowledgedCritical(params.directory,{timestamp:new Date().toISOString(),knowledge_id:id,agent:params.agent,session_id:sessionId,task_id:taskId,reason:"unacknowledged"})}catch{}}let silentEvents=[];for(let[id,directive]of shownById){if(directive.priority==="critical")continue;if(ackedIds.has(id))continue;if(params.replay===!0)continue;result.unacknowledgedNonCritical.push(id),silentEvents.push({type:"unacknowledged",trace_id:traceId,knowledge_id:id,session_id:sessionId,task_id:taskId,agent:params.agent,source:"delegate",reason:"no_ack_marker"}),result.emitted.push({id,type:"unacknowledged"})}if(silentEvents.length>0)await recordKnowledgeEventsBatch(params.directory,silentEvents);if(violatedIds.size>0)await escalateViolatedEntries(params.directory,[...violatedIds])}catch{}return result}async function collectDelegateAcks(params){let shown=parseDelegateDirectiveBlock(params.prompt);if(shown.length===0)return{emitted:[],unacknowledgedCriticals:[],unacknowledgedNonCritical:[]};let sessionId=params.sessionId;if(!sessionId)return{emitted:[],unacknowledgedCriticals:[],unacknowledgedNonCritical:[],unverifiable:{code:"missing_session_id",detail:"Delegate acknowledgments require a real host session id"}};let traceId=parseDelegateDirectiveTraceId(params.prompt)??void 0,taskId=params.taskIdResolution?params.taskIdResolution.status==="resolved"?params.taskIdResolution.taskId:void 0:params.taskId??resolveDelegateAckTaskId({prompt:params.prompt});return reconcileShownDirectives({directory:params.directory,shown,traceId,transcript:params.transcript,agent:params.agent,sessionId,taskId})}async function collectLaneDelegateAcks(params){let empty={emitted:[],unacknowledgedCriticals:[],unacknowledgedNonCritical:[],phases:[]};try{let memberships=await queryLiveMemberships(params.directory,{session_id:params.sessionId,exposure_kind:"delegate_directive",include_terminal:!0});if(!memberships.ok)return empty;let byTrace=new Map,phases=new Set;for(let membership of memberships.memberships){let group=byTrace.get(membership.trace_id)??[];if(group.push(membership),byTrace.set(membership.trace_id,group),membership.phase)phases.add(membership.phase)}let combined={emitted:[],unacknowledgedCriticals:[],unacknowledgedNonCritical:[]};for(let[traceId,group]of byTrace){let taskId=group.find((m)=>m.task_id)?.task_id,outcome=await reconcileShownDirectives({directory:params.directory,shown:group.map((m)=>({id:m.entry_id,priority:m.critical?"critical":"medium"})),traceId,transcript:params.transcript,agent:params.agent,sessionId:params.sessionId,taskId,replay:params.replay});if(combined.emitted.push(...outcome.emitted),combined.unacknowledgedCriticals.push(...outcome.unacknowledgedCriticals),combined.unacknowledgedNonCritical.push(...outcome.unacknowledgedNonCritical),outcome.unverifiable)combined.unverifiable=outcome.unverifiable}return{...combined,phases:[...phases]}}catch{return empty}}async function collectDelegateAcksAfter(directory,input,output){if(!isTaskTool3(input.tool))return;let argsRecord=input.args&&typeof input.args==="object"?input.args:null,prompt=argsRecord&&typeof argsRecord.prompt==="string"?argsRecord.prompt:"";if(!prompt)return;let transcript=typeof output.output==="string"?output.output:"";if(!transcript)return;let agent=parseDelegationArgs(input.args)?.targetAgent??"unknown",sessionId=typeof input.sessionID==="string"?input.sessionID:void 0,planTaskIdOptions=toTaskIdPlanContextOptions(await loadPlanTaskIdContext(directory)),taskIdResolution=resolveDelegateAckTaskIdResult(argsRecord??{prompt},planTaskIdOptions.knownPlanTaskIds,planTaskIdOptions.planContextOverLimit);await collectDelegateAcks({directory,prompt,transcript,agent,sessionId,taskIdResolution})}var MAX_UNACKNOWLEDGED_CRITICALS=500;var init_delegate_ack_collector=__esm(()=>{init_caps();init_jsonl_cap();init_logger();init_cohort_cache();init_knowledge_application();init_knowledge_escalator();init_knowledge_events();init_knowledge_injector();init_knowledge_link();init_knowledge_receipt_ledger();init_knowledge_receipt_validator();init_plan_task_id_context();init_promotion_evidence_store();init_skill_propagation_gate();init_task_id_resolver();init_utils2()});import{existsSync as existsSync160,readdirSync as readdirSync47,readFileSync as readFileSync131,statSync as statSync93}from"node:fs";import*as path301 from"node:path";function validateRepoRelativeGlob(directory,value){let v=value.trim();if(!v)return null;if(v.includes("\x00"))return null;if(v.startsWith("/")||/^[A-Za-z]:[\\/]/.test(v)||v.startsWith("\\"))return null;if(v.split(/[/\\]/).some((s)=>s===".."))return null;let globStart=v.search(/[*?{[]/),concrete=globStart===-1?v:v.slice(0,globStart);if(concrete){let baseDir=path301.resolve(directory),resolved=path301.resolve(baseDir,concrete),rel3=path301.relative(baseDir,resolved);if(rel3.startsWith("..")||path301.isAbsolute(rel3))return null}return v}function findBinaryInPath(binary){let candidates=process.platform==="win32"?[`${binary}.exe`,`${binary}.cmd`,`${binary}.bat`,binary]:[binary];for(let dir of(process.env.PATH??"").split(path301.delimiter)){if(!dir)continue;for(let name of candidates){let candidate2=path301.join(dir,name);if(existsSync160(candidate2))return candidate2}}return null}function safeChildEnv(){let env={};if(process.env.PATH)env.PATH=process.env.PATH;if(process.env.HOME)env.HOME=process.env.HOME;if(process.env.SystemRoot)env.SystemRoot=process.env.SystemRoot;if(process.env.TEMP)env.TEMP=process.env.TEMP;if(process.env.TMP)env.TMP=process.env.TMP;return env}async function runArgv(argv,cwd){let proc=bunSpawn(argv,{stdin:"ignore",stdout:"pipe",stderr:"pipe",cwd,env:safeChildEnv()}),finished=!1;try{let timeout=new Promise((resolve116)=>setTimeout(()=>resolve116("timeout"),PREDICATE_TIMEOUT_MS));if(await Promise.race([proc.exited,timeout])==="timeout")return{exitCode:null,stdout:"",stderr:"",timedOut:!0};let[stdout,stderr]=await Promise.all([proc.stdout.text().catch(()=>""),proc.stderr.text().catch(()=>"")]);return finished=!0,{exitCode:proc.exitCode,stdout,stderr,timedOut:!1}}finally{if(!finished)try{proc.kill()}catch{}}}async function runGrepPredicate(rest,directory){let lastColon=rest.lastIndexOf(":");if(lastColon<=0||lastColon===rest.length-1)return{result:"error",detail:"grep: expected <regex>:<path-glob>"};let regex=rest.slice(0,lastColon),rawGlob=rest.slice(lastColon+1),glob=validateRepoRelativeGlob(directory,rawGlob);if(glob===null)return{result:"error",detail:`grep: unsafe or empty path-glob "${rawGlob}"`};let pattern;try{pattern=new RegExp(regex,"m")}catch(err){return{result:"error",detail:`grep: invalid regex ${err instanceof Error?err.message:String(err)}`}}let matcher=import_picomatch2.default(glob,{dot:!0}),visited=0,matches=0,walk=(dir)=>{if(visited>=GREP_MAX_FILES)return;let entries2;try{entries2=readdirSync47(dir,{withFileTypes:!0})}catch{return}for(let entry of entries2){if(visited>=GREP_MAX_FILES)return;let fullPath=path301.join(dir,entry.name),relPath=path301.relative(directory,fullPath).replace(/\\/g,"/");if(entry.isDirectory()){if(!GREP_SKIP_DIRECTORIES.has(entry.name))walk(fullPath);continue}if(!entry.isFile())continue;if(visited++,!matcher(relPath))continue;try{if(statSync93(fullPath).size>GREP_MAX_BYTES_PER_FILE)continue;let found=readFileSync131(fullPath,"utf-8").match(pattern);if(found)matches+=found.length}catch{}}};if(walk(directory),visited>=GREP_MAX_FILES)return{result:"error",detail:`grep: file scan exceeded ${GREP_MAX_FILES} files`};if(matches===0)return{result:"pass",detail:"grep: zero matches"};return{result:"fail",detail:`grep: ${matches} match(es) found`}}async function runToolPredicate(rest,directory){let raw=rest.trim();if(!raw)return{result:"error",detail:"tool: empty command"};if(raw.includes("\x00"))return{result:"error",detail:"tool: null byte in command"};let argvParts=raw.split(/\s+/).filter((p)=>p.length>0);if(argvParts.length===0)return{result:"error",detail:"tool: empty command"};let binary=argvParts[0];if(binary.includes("/")||binary.includes("\\"))return{result:"error",detail:`tool: path-qualified binary "${binary}" is not allowed`};if(!TOOL_BINARY_ALLOWLIST.has(binary))return{result:"error",detail:`tool: binary "${binary}" is not on the allowlist`};let resolved=findBinaryInPath(binary);if(!resolved)return{result:"error",detail:`tool: binary "${binary}" not found`};let res=await runArgv([resolved,...argvParts.slice(1)],directory);if(res.timedOut)return{result:"error",detail:"tool: timed out"};if(res.exitCode===0)return{result:"pass",detail:"tool: exit 0"};return{result:"fail",detail:`tool: exit ${res.exitCode} ${res.stderr.slice(0,200)}`}}async function changedPaths(directory){let git2=findBinaryInPath("git");if(!git2)return null;let res=await runArgv([git2,"status","--porcelain","-z"],directory);if(res.timedOut||res.exitCode!==0)return null;let out=new Set;for(let entry of res.stdout.split("\x00")){if(entry.length<=3)continue;let p=entry.slice(3);if(p)out.add(path301.normalize(p))}return out}async function runFileModifiedPredicate(rest,directory,expectModified){let label=expectModified?"file_modified":"file_not_modified",safe2=validateRepoRelativeGlob(directory,rest);if(safe2===null)return{result:"error",detail:`${label}: unsafe or empty path "${rest}"`};let changed2=await changedPaths(directory);if(changed2===null)return{result:"error",detail:`${label}: git unavailable or failed`};let target=path301.normalize(safe2),isChanged=changed2.has(target);return{result:(expectModified?isChanged:!isChanged)?"pass":"fail",detail:`${label}: ${target} ${isChanged?"changed":"unchanged"}`}}async function runDirectivePredicate(predicate,directory){try{if(typeof predicate!=="string"||!predicate.trim())return{result:"error",detail:"predicate: empty"};let trimmed=predicate.trim(),firstColon=trimmed.indexOf(":");if(firstColon<=0)return{result:"error",detail:"predicate: missing handler prefix (expected <handler>:...)"};let handler=trimmed.slice(0,firstColon),rest=trimmed.slice(firstColon+1);switch(handler){case"grep":return await runGrepPredicate(rest,directory);case"tool":return await runToolPredicate(rest,directory);case"file_not_modified":return await runFileModifiedPredicate(rest,directory,!1);case"file_modified":return await runFileModifiedPredicate(rest,directory,!0);default:return{result:"error",detail:`predicate: unknown handler "${handler}"`}}}catch(err){return warn(`[directive-predicate-runner] unexpected error: ${err instanceof Error?err.message:String(err)}`),{result:"error",detail:"predicate: unexpected error (fail-closed)"}}}var import_picomatch2,PREDICATE_TIMEOUT_MS=15000,GREP_MAX_FILES=1e4,GREP_MAX_BYTES_PER_FILE=1e6,GREP_SKIP_DIRECTORIES,TOOL_BINARY_ALLOWLIST;var init_directive_predicate_runner=__esm(()=>{init_bun_compat();init_logger();import_picomatch2=__toESM(require_picomatch2(),1),GREP_SKIP_DIRECTORIES=new Set([".git",".swarm","node_modules","dist","coverage"]),TOOL_BINARY_ALLOWLIST=new Set(["rg","grep","git","biome","eslint","tsc","ruff"])});function parseReviewerDirectiveCompliance(text){if(!text||typeof text!=="string")return[];let out=[];for(let m of text.matchAll(VERDICT_PATTERN)){let verb=m[1].toUpperCase(),traceId=decodeDirectiveCorrelationId(m[2]),entryId=decodeDirectiveCorrelationId(m[3]);if(!traceId||!entryId)continue;let evidence2=m[4]?.trim().slice(0,280),verdict=verb==="VERIFIED"?"verified":verb==="VIOLATED"?"violated":"n_a";out.push({trace_id:traceId,entry_id:entryId,verdict,evidence:evidence2})}return out}function verdictToEventType(v){return v==="verified"?"applied":v==="violated"?"violated":"n_a"}function pairKey2(traceId,entryId){return JSON.stringify([traceId,entryId])}async function reconcileReviewerVerdicts(params){let result={emitted:[],omittedCriticals:[],uncertainties:[]},verifyByPair=new Map(params.directivesToVerify.map((d)=>[pairKey2(d.trace_id,d.entry_id),d]));if(verifyByPair.size===0)return result;let verdictsByPair=new Map;for(let verdict of parseReviewerDirectiveCompliance(params.transcript)){let key2=pairKey2(verdict.trace_id,verdict.entry_id);if(!verifyByPair.has(key2))continue;let existing=verdictsByPair.get(key2)??[];existing.push(verdict),verdictsByPair.set(key2,existing)}let pending=[];for(let[key2,directive]of verifyByPair){let matching=verdictsByPair.get(key2)??[];if(matching.length>1){result.uncertainties.push({trace_id:directive.trace_id,entry_id:directive.entry_id,code:"duplicate_verdict",uncertainty:"Reviewer emitted more than one verdict for the exact pair"});continue}if(matching.length===0){if(directive.priority!=="critical")continue;result.omittedCriticals.push({trace_id:directive.trace_id,entry_id:directive.entry_id}),pending.push({directive,type:"violated",reason:"reviewer_omitted"});continue}let verdict=matching[0];if(verdict.verdict==="verified"&&!verdict.evidence?.trim()){if(result.uncertainties.push({trace_id:directive.trace_id,entry_id:directive.entry_id,code:"reviewer_missing_evidence",uncertainty:"VERIFIED requires nonempty evidence"}),directive.priority==="critical")result.omittedCriticals.push({trace_id:directive.trace_id,entry_id:directive.entry_id}),pending.push({directive,type:"violated",reason:"reviewer_missing_evidence"});continue}let item={directive,type:verdictToEventType(verdict.verdict),reason:verdict.evidence};if(verdict.verdict==="violated"&&directive.verification_predicate)try{let outcome=await _internals245.runDirectivePredicate(directive.verification_predicate,params.directory);item.predicate_check={predicate:directive.verification_predicate,result:outcome.result,detail:outcome.detail}}catch(error93){item.predicate_check={predicate:directive.verification_predicate,result:"error",detail:error93 instanceof Error?error93.message:String(error93)}}pending.push(item)}let groups=new Map;for(let item of pending){let groupKey=JSON.stringify([item.directive.trace_id,item.directive.session_id,item.directive.cohort_id,item.directive.source_link_id,item.directive.prior_terminal_outcome,item.directive.prior_terminal_event_id]),group=groups.get(groupKey)??[];group.push(item),groups.set(groupKey,group)}let violatedIds=new Set,agent=params.agent??"reviewer";for(let group of groups.values()){let first=group[0].directive,remediationAuthorization=(first.prior_terminal_outcome==="violated"||first.prior_terminal_outcome==="contradicted")&&first.prior_terminal_event_id&&group.some((item)=>item.type!=="violated")?{actor:"reviewer-remediation",reason:"reviewer_verified_remediation",expected_event_id:first.prior_terminal_event_id,expected_outcome:first.prior_terminal_outcome}:void 0,committedEntries;try{let committed=await _internals245.validateAndCommitTerminalBatch(params.directory,{trace_id:first.trace_id,session_id:first.session_id,cohort_id:first.cohort_id,source_link_id:first.source_link_id,authorization:remediationAuthorization,items:group.map((item)=>({entry_id:item.directive.entry_id,outcome:item.type,source:"reviewer",reason:item.reason}))});if(!committed.ok){for(let item of group)result.uncertainties.push({trace_id:item.directive.trace_id,entry_id:item.directive.entry_id,code:committed.code,uncertainty:committed.detail});continue}committedEntries=new Set(committed.accepted.map((terminal)=>terminal.entry_id));for(let rejected2 of committed.rejected)result.uncertainties.push({trace_id:first.trace_id,entry_id:rejected2.entry_id||void 0,code:rejected2.reason,uncertainty:"Authoritative ledger rejected reviewer terminal"})}catch(error93){for(let item of group)result.uncertainties.push({trace_id:item.directive.trace_id,entry_id:item.directive.entry_id,code:"ledger_exception",uncertainty:error93 instanceof Error?error93.message:String(error93)});continue}for(let item of group){if(!committedEntries.has(item.directive.entry_id))continue;try{if(await _internals245.recordKnowledgeEvent(params.directory,{type:item.type,trace_id:item.directive.trace_id,knowledge_id:item.directive.entry_id,session_id:item.directive.session_id,task_id:params.taskId,phase:params.phase,agent,source:"reviewer",reason:item.reason,predicate_check:item.predicate_check}),result.emitted.push({trace_id:item.directive.trace_id,entry_id:item.directive.entry_id,id:item.directive.entry_id,type:item.type,source:"reviewer"}),item.type==="violated")violatedIds.add(item.directive.entry_id)}catch(error93){result.uncertainties.push({trace_id:item.directive.trace_id,entry_id:item.directive.entry_id,code:"diagnostic_event_failed",uncertainty:error93 instanceof Error?error93.message:String(error93)})}}}if(violatedIds.size>0)try{await _internals245.escalateViolatedEntries(params.directory,[...violatedIds])}catch(error93){result.uncertainties.push({trace_id:"",code:"escalation_failed",uncertainty:error93 instanceof Error?error93.message:String(error93)})}return result}function isTaskTool7(tool3){return tool3==="Task"||tool3==="task"}async function collectReviewerVerdictsAfter(directory,input,output){if(!isTaskTool7(input.tool))return;let parsedArgs=parseDelegationArgs(input.args);if(!parsedArgs)return;if(stripKnownSwarmPrefix(parsedArgs.targetAgent).toLowerCase()!=="reviewer")return;let argsRecord=input.args&&typeof input.args==="object"?input.args:null,prompt=argsRecord&&typeof argsRecord.prompt==="string"?argsRecord.prompt:"";if(!prompt)return;let transcript=typeof output.output==="string"?output.output:"";if(!transcript)return;let directivesToVerify=parseDirectivesToVerifyBlock(prompt);if(directivesToVerify.length===0)return;let sessionId=typeof input.sessionID==="string"?input.sessionID:void 0;await reconcileReviewerVerdicts({directory,transcript,directivesToVerify,sessionId,agent:"reviewer"})}var _internals245,VERDICT_PATTERN;var init_reviewer_verdict_parser=__esm(()=>{init_reviewer_directive_compliance();init_schema();init_directive_predicate_runner();init_knowledge_escalator();init_knowledge_events();init_knowledge_receipt_ledger();init_skill_propagation_gate();_internals245={validateAndCommitTerminalBatch,recordKnowledgeEvent,runDirectivePredicate,escalateViolatedEntries},VERDICT_PATTERN=/\b(VERIFIED|VIOLATED|N\/A)\s*:\s*([^:\s]{1,512})\s*:\s*([^:\s]{1,512})(?:\s+(?:evidence|reason)\s*=\s*([^\n\r]+?))?(?=$|[\n\r]|\s+(?:VERIFIED|VIOLATED|N\/A)\b)/gi});import{createHash as createHash102}from"node:crypto";function delegationCostRecordMaterial(record3){if(!record3.laneId)return`${record3.parentSessionId}\x00${record3.callID}`;return`${record3.parentSessionId}\x00${record3.callID}\x00lane:${record3.laneId}`}function buildDelegationTerminalIdentityFields(input){let material=delegationCostRecordMaterial(input.record);return{record_id:createHash102("sha256").update(`delegation-cost-id-v1\x00${material}`).digest("hex").slice(0,32),identity_fingerprint:createHash102("sha256").update(`delegation-cost-identity-v1\x00${material}\x00${input.record.swarmPrefixedAgent}\x00${input.model??""}`).digest("hex").slice(0,32),version:1,parent_session_digest:createHash102("sha256").update(`delegation-cost-parent-v1\x00${input.record.parentSessionId}`).digest("hex").slice(0,32),child_session_digest:createHash102("sha256").update(`delegation-cost-child-v1\x00${input.record.subagentSessionId}`).digest("hex").slice(0,32),...input.recovered?{recovered:!0}:{}}}var init_delegation_cost_identity=()=>{};var exports_delegation_lifecycle={};__export(exports_delegation_lifecycle,{settleDelegationTerminal:()=>settleDelegationTerminal,recoverTerminalLaneReceipts:()=>recoverTerminalLaneReceipts,isBenignSettleOutcome:()=>isBenignSettleOutcome,emitDelegationEventlessTerminalEnd:()=>emitDelegationEventlessTerminalEnd,emitDelegationBegin:()=>emitDelegationBegin,delegationCostRecordMaterial:()=>delegationCostRecordMaterial,buildDelegationTerminal:()=>buildDelegationTerminal,_internals:()=>_internals257,TERMINAL_LANE_RECEIPT_RECOVERY_DEADLINE_MS:()=>TERMINAL_LANE_RECEIPT_RECOVERY_DEADLINE_MS,MAX_TERMINAL_LANE_RECEIPT_RECOVERY:()=>MAX_TERMINAL_LANE_RECEIPT_RECOVERY});import*as fs180 from"node:fs";import*as path315 from"node:path";function isBenignSettleOutcome(kind){return kind==="duplicate"||kind==="conflict"||kind==="already_terminal_without_event"}function buildDelegationTerminal(record3,terminal,now2){return{eventId:buildBackgroundCompletionEventId({correlationId:record3.correlationId,jobId:record3.jobId,status:terminal.status,resultDigest:terminal.result.digest}),status:terminal.status,recordedAt:now2,result:terminal.result}}async function settleDelegationTerminal(directory,record3,terminal,observations={},now2=Date.now()){let claim=await _internals257.claimTerminalResult(directory,record3.correlationId,buildDelegationTerminal(record3,terminal,now2));if(claim){if(claim.disposition==="claimed")return await runDelegationTerminalObservations(directory,claim.record,terminal,observations,now2),{kind:"claimed",record:claim.record};if(claim.disposition==="duplicate"&&observations.transcript)await reconcileLaneKnowledgeReceipts(directory,claim.record,observations,!0);return{kind:"duplicate",record:claim.record}}let reread=_internals257.findByCorrelationIdDetailed(directory,record3.correlationId);if(reread.status==="uncertain")return{kind:"uncertain",reason:reread.reason};if(!reread.value)return{kind:"missing"};if(isTerminalDelegationStatus(reread.value.status)){if(reread.value.terminalResult)return{kind:"conflict",record:reread.value};return emitDelegationEventlessTerminalEnd(reread.value,reread.value.status),{kind:"already_terminal_without_event",record:reread.value}}return{kind:"not_open",record:reread.value}}function emitDelegationBegin(record3){try{_internals257.telemetry.delegationBegin(record3.parentSessionId,record3.swarmPrefixedAgent,record3.planTaskId??""),recordExecutionAttempt({sessionId:record3.parentSessionId,...record3.planTaskId?{taskId:record3.planTaskId}:{},attemptClass:"attempt",outcomeStatus:"unknown"})}catch{}}function terminalAttemptClass(status2){if(status2==="cancelled")return"cancelled";return"result"}function terminalAttemptOutcome(status2){if(status2==="completed")return"success";if(status2==="error"||status2==="failed")return"failure";return"unknown"}function emitDelegationCostObservation(record3,observations,terminalStatus,recovered=!1){try{let costFields=buildDelegationCostFields({raw:observations.costRaw,model:observations.model,pricing:observations.pricing});Object.assign(costFields,buildDelegationTerminalIdentityFields({record:record3,model:observations.model,recovered})),_internals257.telemetry.delegationEnd(record3.parentSessionId,record3.swarmPrefixedAgent,record3.planTaskId??"",terminalStatus,costFields);let usageAttested=costFields.cost_source==="reported";recordExecutionAttempt({sessionId:record3.parentSessionId,...record3.planTaskId?{taskId:record3.planTaskId}:{},...record3.callID?{callId:record3.callID}:{},...record3.laneId?{laneId:record3.laneId}:{},attemptClass:terminalAttemptClass(terminalStatus),outcomeStatus:terminalAttemptOutcome(terminalStatus),cost:{...observations.startedAt!==void 0?{latencyMs:Math.max(0,Date.now()-observations.startedAt)}:{},...usageAttested?{...typeof costFields.tokens_input==="number"?{inputTokens:costFields.tokens_input}:{},...typeof costFields.tokens_output==="number"?{outputTokens:costFields.tokens_output}:{},...typeof costFields.tokens_cache==="number"?{cacheReadTokens:costFields.tokens_cache}:{}}:{},...costFields.cost_source==="reported"&&costFields.cost_usd!==null?{billedCostUsd:costFields.cost_usd}:{},...costFields.cost_source==="estimated"&&costFields.cost_usd!==null?{estimatedCostUsd:costFields.cost_usd}:{}}})}catch(error93){log(`[delegation-lifecycle] cost observation skipped: ${error93 instanceof Error?error93.message:String(error93)}`)}}function emitDelegationEventlessTerminalEnd(record3,terminalStatus){emitDelegationCostObservation(record3,{},terminalStatus,!0)}async function appendDelegationTrajectoryObservation(directory,record3,terminalStatus,observations,now2){try{let lastStep=await getCurrentStep(record3.parentSessionId,directory);seedTrajectoryStepCounter(record3.parentSessionId,directory,lastStep);let entry={step:nextTrajectoryStep(record3.parentSessionId,directory),agent:record3.swarmPrefixedAgent,action:"delegate",target:record3.laneId??record3.correlationId,intent:`dispatch_lanes terminal ${terminalStatus}`,timestamp:new Date(now2).toISOString(),result:terminalStatus==="completed"?"success":"failure",tool:"dispatch_lanes",...observations.startedAt!==void 0?{elapsed_ms:Math.max(0,now2-observations.startedAt)}:{},...record3.batchId!==void 0?{batchId:record3.batchId}:{},laneId:record3.laneId??record3.correlationId,...record3.planTaskId?{taskId:record3.planTaskId}:{}};await appendTrajectoryEntry(record3.parentSessionId,entry,directory)}catch{}}async function reconcileLaneKnowledgeReceipts(directory,record3,observations,replay=!1){if(!observations.transcript)return;try{let ack=await collectLaneDelegateAcks({directory,sessionId:record3.subagentSessionId,agent:record3.swarmPrefixedAgent,transcript:observations.transcript,replay});if(record3.normalizedAgent!=="reviewer")return;let phase=ack.phases.find((value)=>Boolean(value));if(!phase)return;let directivesToVerify=await readPhaseDirectivesToVerify(directory,phase);if(directivesToVerify.length===0)return;await reconcileReviewerVerdicts({directory,transcript:observations.transcript,directivesToVerify,sessionId:record3.subagentSessionId,agent:"reviewer"})}catch{}}async function runDelegationTerminalObservations(directory,record3,terminal,observations,now2){emitDelegationCostObservation(record3,observations,terminal.status),await appendDelegationTrajectoryObservation(directory,record3,terminal.status,observations,now2),await reconcileLaneKnowledgeReceipts(directory,record3,observations)}function candidateAfter(record3,cursor){if(record3.updatedAt!==cursor.updatedAt)return record3.updatedAt>cursor.updatedAt;return record3.correlationId>cursor.correlationId}function readRecoveryCursor(directory){try{let filePath=path315.join(directory,".swarm",RECOVERY_CURSOR_FILE);if(!fs180.existsSync(filePath))return null;let parsed=JSON.parse(fs180.readFileSync(filePath,"utf-8"));if(typeof parsed.updatedAt==="number"&&Number.isFinite(parsed.updatedAt)&&typeof parsed.correlationId==="string"&&parsed.correlationId.length>0)return{updatedAt:parsed.updatedAt,correlationId:parsed.correlationId};return null}catch{return null}}function writeRecoveryCursor(directory,cursor){try{let swarmDir=path315.join(directory,".swarm");fs180.mkdirSync(swarmDir,{recursive:!0});let filePath=path315.join(swarmDir,RECOVERY_CURSOR_FILE);if(cursor===null)fs180.rmSync(filePath,{force:!0});else fs180.writeFileSync(filePath,JSON.stringify(cursor),"utf-8")}catch{}}function isRecoverableTerminalLaneRecord(record3){return Boolean(record3.laneId&&record3.terminalResult&&typeof record3.terminalResult.result.text==="string"&&record3.terminalResult.result.text.length>0)}async function recoverTerminalLaneReceipts(directory,records,options={}){let now2=options.now??Date.now,deadlineMs=options.deadlineMs??TERMINAL_LANE_RECEIPT_RECOVERY_DEADLINE_MS,deadline=now2()+deadlineMs;if(records!==void 0){let recovered2=0;for(let record3 of records){if(!isRecoverableTerminalLaneRecord(record3))continue;let transcript=record3.terminalResult?.result.text;if(!transcript)continue;if(now2()>=deadline)return{recovered:recovered2,exhaustedBudget:!0};try{await reconcileLaneKnowledgeReceipts(directory,record3,{transcript},!0),recovered2+=1}catch{}}return{recovered:recovered2,exhaustedBudget:!1}}let enumeration=readDelegationsDetailed(directory);if(enumeration.status==="uncertain")return warn(`[delegation-lifecycle] terminal-lane receipt recovery deferred: delegation store unreadable after ${enumeration.attempts} attempts (${enumeration.reason})`),{recovered:0,exhaustedBudget:!1};let candidates=enumeration.records.filter(isRecoverableTerminalLaneRecord).sort((left,right)=>{if(left.updatedAt!==right.updatedAt)return left.updatedAt-right.updatedAt;return left.correlationId<right.correlationId?-1:left.correlationId>right.correlationId?1:0});if(candidates.length===0)return{recovered:0,exhaustedBudget:!1};let cursor=readRecoveryCursor(directory),selected=cursor?candidates.filter((record3)=>candidateAfter(record3,cursor)):candidates,wrapped=!1;if(selected.length===0)selected=candidates,wrapped=!0;let recovered=0,lastProcessed=null;for(let record3 of selected){if(recovered>=MAX_TERMINAL_LANE_RECEIPT_RECOVERY)break;if(now2()>=deadline)break;let transcript=record3.terminalResult?.result.text;if(!transcript)continue;try{await reconcileLaneKnowledgeReceipts(directory,record3,{transcript},!0),recovered+=1,lastProcessed={updatedAt:record3.updatedAt,correlationId:record3.correlationId}}catch{lastProcessed={updatedAt:record3.updatedAt,correlationId:record3.correlationId}}}let lastCandidate=selected[selected.length-1],processedAll=selected.length>0&&lastProcessed!==null&&lastCandidate!==void 0&&lastProcessed.updatedAt===lastCandidate.updatedAt&&lastProcessed.correlationId===lastCandidate.correlationId,nextCursor=wrapped&&processedAll?null:lastProcessed??cursor??null;if(nextCursor?.correlationId!==cursor?.correlationId)writeRecoveryCursor(directory,nextCursor);return{recovered,exhaustedBudget:recovered<selected.length&&(now2()>=deadline||recovered>=MAX_TERMINAL_LANE_RECEIPT_RECOVERY)}}var MAX_TERMINAL_LANE_RECEIPT_RECOVERY=64,TERMINAL_LANE_RECEIPT_RECOVERY_DEADLINE_MS=5000,RECOVERY_CURSOR_FILE="lane-receipt-recovery-cursor.json",_internals257;var init_delegation_lifecycle=__esm(()=>{init_delegate_ack_collector();init_phase_directives();init_reviewer_verdict_parser();init_trajectory_step_state();init_trajectory_store();init_cost_accounting();init_execution_attempt();init_telemetry();init_logger();init_delegation_cost_identity();init_pending_delegations();init_delegation_cost_identity();registerStaleSweepObserver((record3)=>{emitDelegationEventlessTerminalEnd(record3,"stale")});_internals257={claimTerminalResult,findByCorrelationId,findByCorrelationIdDetailed,telemetry}});var exports_design_doc_drift={};__export(exports_design_doc_drift,{runDesignDocDriftCheck:()=>runDesignDocDriftCheck,_internals:()=>_internals287});import*as fs208 from"node:fs";import*as path346 from"node:path";function mtimeMsOrNull(absPath){try{return fs208.statSync(absPath).mtimeMs}catch{return null}}function resolveAnchorWithin(directory,anchor){if(!anchor||typeof anchor!=="string")return null;let root=path346.resolve(directory),resolved=path346.resolve(root,anchor),rel3=path346.relative(root,resolved);if(rel3.startsWith("..")||path346.isAbsolute(rel3))return null;return resolved}async function runDesignDocDriftCheck(directory,phase,outDir){try{let root=path346.resolve(directory),outAbs=path346.resolve(root,outDir),outRel=path346.relative(root,outAbs);if(outRel.startsWith("..")||path346.isAbsolute(outRel))return null;let docMtimes=new Map,checkedDocs=[],missingDocs=[];for(let[docName,relFile]of Object.entries(DESIGN_DOC_FILES)){let abs=path346.join(outAbs,relFile),mtime=mtimeMsOrNull(abs);if(docMtimes.set(docName,mtime),mtime===null)missingDocs.push(path346.join(outDir,relFile));else checkedDocs.push(path346.join(outDir,relFile))}let traceabilityAbs=path346.join(outAbs,TRACEABILITY_REL),registry4=null;try{if((await fs208.promises.stat(traceabilityAbs)).size<=MAX_TRACEABILITY_BYTES){let raw=await fs208.promises.readFile(traceabilityAbs,"utf-8"),parsed=JSON.parse(raw);registry4=parsed&&typeof parsed==="object"&&!Array.isArray(parsed)?parsed:null}}catch{registry4=null}let noDocs=checkedDocs.length===0||registry4===null,effectiveSpec=readEffectiveSpecSync(root),specMtime=effectiveSpec?.mtime?Date.parse(effectiveSpec.mtime):null,staleSections=[];if(!noDocs&&Array.isArray(registry4?.sections))for(let section2 of registry4.sections){if(!section2||typeof section2.section_id!=="string")continue;if(typeof section2.doc!=="string"||!docMtimes.has(section2.doc))continue;let docMtime=docMtimes.get(section2.doc)??null;if(docMtime===null){staleSections.push({section_id:section2.section_id,doc:section2.doc,reason:"owning design doc is missing"});continue}let flagged=!1;for(let anchor of section2.code_anchors??[]){let anchorAbs=resolveAnchorWithin(directory,anchor);if(anchorAbs===null)continue;let anchorMtime=mtimeMsOrNull(anchorAbs);if(anchorMtime!==null&&anchorMtime>docMtime){staleSections.push({section_id:section2.section_id,doc:section2.doc,reason:`code anchor ${anchor} changed after the doc`}),flagged=!0;break}}if(!flagged&&specMtime!==null&&specMtime>docMtime&&(section2.spec_frs?.length??0)>0)staleSections.push({section_id:section2.section_id,doc:section2.doc,reason:"effective spec changed after the doc"})}let verdict=noDocs?"NO_DOCS":staleSections.length>0?"DOC_STALE":"DOC_FRESH",report={schema_version:1,phase,timestamp:new Date().toISOString(),out_dir:outDir,verdict,stale_sections:staleSections,missing_docs:missingDocs,checked_docs:checkedDocs},locator=phaseReportLocator("design_doc_drift",phase);return await upsertPhaseReportDb(directory,"design_doc_drift",phase,JSON.stringify(report,null,2)),getGlobalEventBus().publish("curator.docdrift.completed",{phase,verdict,stale_count:staleSections.length,report_path:locator}),report}catch(err){try{getGlobalEventBus().publish("curator.error",{operation:"docdrift",phase,error:String(err)})}catch{}return warn(`[design-doc-drift] check failed for phase ${phase}: ${String(err)}`),null}}var MAX_TRACEABILITY_BYTES=1048576,DESIGN_DOC_FILES,TRACEABILITY_REL,_internals287;var init_design_doc_drift=__esm(()=>{init_event_bus();init_phase_report_store();init_effective_spec();init_logger();DESIGN_DOC_FILES={domain:"domain.md","technical-spec":"technical-spec.md","behavior-spec":"behavior-spec.md","reference-impl":path346.join("reference","reference-impl.md"),"idiom-notes":path346.join("reference","idiom-notes.md")},TRACEABILITY_REL=path346.join("reference","traceability.json");_internals287={mtimeMsOrNull,resolveAnchorWithin,DESIGN_DOC_FILES}});var exports_project_context={};__export(exports_project_context,{buildProjectContext:()=>buildProjectContext,_internals:()=>_internals320,LANG_BACKEND_DETECTION_TIMEOUT_MS:()=>LANG_BACKEND_DETECTION_TIMEOUT_MS});import*as fs236 from"node:fs";import*as path382 from"node:path";function detectFileExists2(directory,pattern){if(pattern.includes("*")||pattern.includes("?"))try{let files=fs236.readdirSync(directory),regex=new RegExp(`^${pattern.replace(/\./g,"\\.").replace(/\*/g,".*").replace(/\?/g,".")}$`);return files.some((f)=>regex.test(f))}catch{return!1}try{return fs236.accessSync(path382.join(directory,pattern)),!0}catch{return!1}}function selectTestCommandFromScriptsTest(backend,directory){let pkgRaw;try{pkgRaw=fs236.readFileSync(path382.join(directory,"package.json"),"utf-8")}catch{return null}let pkg;try{pkg=JSON.parse(pkgRaw)}catch{return null}let script=pkg.scripts?.test;if(!script)return null;let fwName=null;if(script.includes("vitest"))fwName="vitest";else if(script.includes("jest"))fwName="jest";else if(script.includes("mocha"))fwName="mocha";else if(script.includes("bun test"))fwName="bun:test";if(!fwName)return null;let fw=backend.test.frameworks.find((f)=>f.name===fwName);return fw?fw.cmd:null}function selectTestCommandFast(backend,directory){let fromScripts=selectTestCommandFromScriptsTest(backend,directory);if(fromScripts!==null)return fromScripts;let sorted2=[...backend.test.frameworks].sort((a,b)=>b.priority-a.priority);for(let fw of sorted2){if(!detectFileExists2(directory,fw.detect))continue;return fw.cmd}return null}function selectBuildCommandFast(backend,directory){let sorted2=[...backend.build.commands].sort((a,b)=>b.priority-a.priority);for(let cmd of sorted2){if(cmd.detectFile&&!detectFileExists2(directory,cmd.detectFile))continue;return cmd.cmd}return null}function selectLintCommand(backend,directory){let sorted2=[...backend.lint.linters].sort((a,b)=>b.priority-a.priority);for(let lint2 of sorted2){if(!detectFileExists2(directory,lint2.detect))continue;return lint2.cmd}return null}async function buildProjectContext(directory,signal2){let backend=await _internals320.pickBackend(directory,signal2);if(!backend)return null;let profiles=_internals320.pickedProfiles(directory),ctx=emptyProjectContext();ctx.PROJECT_LANGUAGE=backend.displayName;let buildCmd=selectBuildCommandFast(backend,directory);if(buildCmd)ctx.BUILD_CMD=buildCmd;let testCmd=selectTestCommandFast(backend,directory);if(testCmd)ctx.TEST_CMD=testCmd;let lintCmd=selectLintCommand(backend,directory);if(lintCmd)ctx.LINT_CMD=lintCmd;if(backend.id==="php"){let overlay=getLaravelCommandOverlay(directory);if(overlay){if(ctx.TEST_CMD=overlay.testCommand,overlay.lintCommand)ctx.LINT_CMD=overlay.lintCommand}}let[frameworkSel,entryPoints]=await Promise.all([backend.selectFramework?backend.selectFramework(directory).catch(()=>null):Promise.resolve(null),backend.selectEntryPoints?backend.selectEntryPoints(directory).catch(()=>[]):Promise.resolve([])]);if(frameworkSel)ctx.PROJECT_FRAMEWORK=frameworkSel.name;if(entryPoints.length>0)ctx.ENTRY_POINTS=entryPoints.join(", ");if(backend.prompts.coderConstraints.length>0)ctx.CODER_CONSTRAINTS=bulletList(backend.prompts.coderConstraints);if(backend.prompts.testConstraints&&backend.prompts.testConstraints.length>0)ctx.TEST_CONSTRAINTS=bulletList(backend.prompts.testConstraints);if(backend.prompts.reviewerChecklist.length>0)ctx.REVIEWER_CHECKLIST=bulletList(backend.prompts.reviewerChecklist);if(profiles.length>1)ctx.PROJECT_CONTEXT_SECONDARY_LANGUAGES=profiles.slice(1).map((p)=>p.id).join(", ");return ctx}var LANG_BACKEND_DETECTION_TIMEOUT_MS=300,_internals320;var init_project_context=__esm(()=>{init_dispatch();init_framework_detector();_internals320={pickBackend,pickedProfiles}});init_package();init_agents2();init_critic();import{createHash as createHash119}from"node:crypto";import{mkdirSync as mkdirSync101,writeFileSync as writeFileSync66}from"node:fs";import*as path383 from"node:path";import{performance as performance2}from"node:perf_hooks";import{fileURLToPath as fileURLToPath8}from"node:url";init_event_bus();init_evidence_summary_integration();init_manager4();init_manager();init_utils();import*as fs153 from"node:fs";import*as path278 from"node:path";class PlanSyncWorker{directory;debounceMs;pollIntervalMs;syncTimeoutMs;onSyncComplete;status="stopped";watcher=null;pollTimer=null;debounceTimer=null;syncing=!1;pendingSync=!1;lastStat=null;disposed=!1;constructor(options={}){this.directory=options.directory??"",this.debounceMs=options.debounceMs??500,this.pollIntervalMs=options.pollIntervalMs??2000,this.syncTimeoutMs=options.syncTimeoutMs??30000,this.onSyncComplete=options.onSyncComplete}getSwarmDir(){return path278.resolve(this.directory,".swarm")}getPlanJsonPath(){return path278.join(this.getSwarmDir(),"plan.json")}start(){if(this.disposed){log("[PlanSyncWorker] Cannot start - worker has been disposed");return}if(!this.directory){log("[PlanSyncWorker] Cannot start - no directory provided");return}if(this.status==="running"||this.status==="starting"){log("[PlanSyncWorker] Already running or starting");return}this.status="starting",log("[PlanSyncWorker] Starting..."),this.initializeStat(),this.setupPolling(),this.setupNativeWatcher(),this.status="running",log("[PlanSyncWorker] Started watching for plan.json changes")}stop(){if(this.status==="stopped"||this.status==="stopping")return;if(this.status="stopping",log("[PlanSyncWorker] Stopping..."),this.clearDebounce(),this.watcher)this.watcher.close(),this.watcher=null;if(this.pollTimer)clearInterval(this.pollTimer),this.pollTimer=null;this.status="stopped",log("[PlanSyncWorker] Stopped")}dispose(){this.stop(),this.disposed=!0,this.lastStat=null,log("[PlanSyncWorker] Disposed")}getStatus(){return this.status}isRunning(){return this.status==="running"}initializeStat(){try{let stats2=fs153.statSync(this.getPlanJsonPath());this.lastStat={mtimeMs:stats2.mtimeMs,size:stats2.size}}catch{this.lastStat=null}}setupNativeWatcher(){let swarmDir=this.getSwarmDir();try{if(!fs153.existsSync(swarmDir))return log("[PlanSyncWorker] Swarm directory does not exist yet"),!1;return this.watcher=fs153.watch(swarmDir,{persistent:!1},(_eventType,filename)=>{if(this.disposed||this.status!=="running")return;if(filename&&(filename.includes(".tmp.")||filename.endsWith(".rebuild")))return;if(filename==="plan.json"||filename===void 0)this.debouncedSync()}),this.watcher.on("error",(error93)=>{if(this.disposed||this.status!=="running")return;if(log("[PlanSyncWorker] Watcher error, falling back to polling",{error:error93.message}),this.watcher)this.watcher.close(),this.watcher=null;this.setupPolling()}),log("[PlanSyncWorker] Native fs.watch established"),!0}catch(error93){return log("[PlanSyncWorker] Failed to setup native watcher",{error:error93 instanceof Error?error93.message:String(error93)}),!1}}setupPolling(){if(this.pollTimer)clearInterval(this.pollTimer);if(this.pollTimer=setInterval(()=>{if(this.disposed||this.status!=="running")return;this.pollCheck()},this.pollIntervalMs),typeof this.pollTimer.unref==="function")this.pollTimer.unref();log("[PlanSyncWorker] Polling fallback established",{intervalMs:this.pollIntervalMs})}pollCheck(){try{let planPath=this.getPlanJsonPath();if(!fs153.existsSync(planPath)){if(this.lastStat!==null)this.lastStat=null,log("[PlanSyncWorker] plan.json deleted");return}let stats2=fs153.statSync(planPath),currentStat={mtimeMs:stats2.mtimeMs,size:stats2.size};if(this.lastStat===null||currentStat.mtimeMs!==this.lastStat.mtimeMs||currentStat.size!==this.lastStat.size)this.lastStat=currentStat,this.debouncedSync()}catch(error93){log("[PlanSyncWorker] Poll check error",{error:error93 instanceof Error?error93.message:String(error93)})}}debouncedSync(){if(this.disposed||this.status!=="running")return;if(this.debounceTimer)clearTimeout(this.debounceTimer);this.debounceTimer=setTimeout(()=>{if(this.disposed||this.status!=="running")return;this.debounceTimer=null,this.triggerSync()},this.debounceMs)}clearDebounce(){if(this.debounceTimer)clearTimeout(this.debounceTimer),this.debounceTimer=null}triggerSync(){if(this.syncing){this.pendingSync=!0,log("[PlanSyncWorker] Sync pending (in-flight)");return}this.executeSync()}async executeSync(){this.syncing=!0;try{log("[PlanSyncWorker] Syncing plan..."),this.checkForUnauthorizedWrite();let plan=await this.withTimeout(_internals56.loadPlanJsonOnly(this.directory),this.syncTimeoutMs,"Sync operation timed out");if(plan&&plan.phases.length>0)await _internals56.regeneratePlanMarkdown(this.directory,plan),log("[PlanSyncWorker] Sync complete",{title:plan.title,phase:plan.current_phase}),this.safeCallback(!0);else if(plan)log("[PlanSyncWorker] Plan has no phases, skipping markdown regeneration"),this.safeCallback(!0);else log("[PlanSyncWorker] No plan found to sync"),this.safeCallback(!0)}catch(error93){if(error93 instanceof Error&&error93.message.includes("timed out"))log("[PlanSyncWorker] Sync timed out after "+this.syncTimeoutMs+"ms, worker remains active");else log("[PlanSyncWorker] Sync failed",{error:error93 instanceof Error?error93.message:String(error93)});this.safeCallback(!1,error93 instanceof Error?error93:Error(String(error93)))}finally{if(this.syncing=!1,this.pendingSync&&!this.disposed&&this.status==="running")this.pendingSync=!1,log("[PlanSyncWorker] Executing pending sync"),this.executeSync()}}safeCallback(success3,error93){if(this.onSyncComplete)try{this.onSyncComplete(success3,error93)}catch(callbackError){log("[PlanSyncWorker] onSyncComplete callback threw error (ignored)",{callbackError:callbackError instanceof Error?callbackError.message:String(callbackError)})}}checkForUnauthorizedWrite(){try{let swarmDir=this.getSwarmDir(),planJsonPath=path278.join(swarmDir,"plan.json"),markerPath=path278.join(swarmDir,".plan-write-marker"),planStats=fs153.statSync(planJsonPath),planMtimeMs=Math.floor(planStats.mtimeMs),markerContent=fs153.readFileSync(markerPath,"utf8"),marker=JSON.parse(markerContent);if(marker.in_progress===!0){log("[PlanSyncWorker] Skipping unauthorized-write check - plan write in progress");return}let markerTimestampMs=new Date(marker.timestamp).getTime();if(planMtimeMs>markerTimestampMs+5000)log("[PlanSyncWorker] WARNING: plan.json may have been written outside save_plan/savePlan - unauthorized direct write suspected",{planMtimeMs,markerTimestampMs})}catch{}}withTimeout(promise3,ms,timeoutMessage2){return new Promise((resolve108,reject)=>{let timer=setTimeout(()=>{reject(Error(`${timeoutMessage2} (${ms}ms)`))},ms);promise3.then((result)=>{clearTimeout(timer),resolve108(result)}).catch((error93)=>{clearTimeout(timer),reject(error93)})})}}init_pr_event_subscribers();init_pr_feedback_loop_runtime();init_pr_monitor_worker();init_queue();init_status_artifact();init_trigger();init_worker();import{createHash as createHash98}from"node:crypto";init_zod();init_task_envelope();init_workspace_snapshot();init_plan_schema();init_schema();init_plan_task_id_context();init_task_id_resolver();init_task_result_classifier();init_utils2();init_ledger();init_manager();init_utils3();init_atomic_write();init_canonical_root();init_lock();init_task_file();import{createHash as createHash97}from"node:crypto";import*as fs155 from"node:fs";import*as path280 from"node:path";var PHASE_PARTICIPATION_FILE="evidence/phase-participation.json",PHASE_PARTICIPATION_QUARANTINE_DIR="evidence/phase-participation-quarantine",MAX_PHASE_PARTICIPATION_BYTES=262144,MAX_PHASE_PARTICIPATION_PENDING=128,MAX_PHASE_PARTICIPATION_RECEIPTS=128,MAX_PHASE_PARTICIPATION_QUARANTINE_FILES=16,MAX_PHASE_PARTICIPATION_QUARANTINE_BYTES=1048576,MAX_PHASE_PARTICIPATION_QUARANTINE_DIRECTORY_ENTRIES=64,MAX_PENDING_IN_MEMORY=128,MAX_ID_CHARS=256,WorkspaceSchema2=exports_external.object({directory:exports_external.string().max(4096),gitHead:exports_external.string().max(256).nullable(),prHeadSha:exports_external.string().max(256).nullable()}).strict(),BindingSchema=exports_external.object({role:exports_external.string().min(1).max(120),prefixedRole:exports_external.string().min(1).max(120),planId:exports_external.string().min(1).max(512),planIdentityHash:exports_external.string().length(64),planStructureHash:exports_external.string().length(64),phase:exports_external.number().int().nonnegative(),taskId:exports_external.string().min(1).max(120).nullable(),parentSessionId:exports_external.string().min(1).max(MAX_ID_CHARS),callId:exports_external.string().min(1).max(MAX_ID_CHARS),policyDigest:exports_external.string().length(64),workspace:WorkspaceSchema2,capturedAt:exports_external.number().int().nonnegative()}).strict(),PendingSchema=BindingSchema.extend({childSessionId:exports_external.string().min(1).max(MAX_ID_CHARS)}).strict(),ReceiptSchema=PendingSchema.extend({receiptId:exports_external.string().length(64),resultDigest:exports_external.string().length(64),completedAt:exports_external.number().int().nonnegative(),childIdentityAvailable:exports_external.boolean()}).strict(),StoreSchema=exports_external.object({schemaVersion:exports_external.literal(1),pending:exports_external.array(PendingSchema).max(MAX_PHASE_PARTICIPATION_PENDING),receipts:exports_external.array(ReceiptSchema).max(MAX_PHASE_PARTICIPATION_RECEIPTS)}).strict(),foregroundReservations=new Map;function emptyStore(){return{schemaVersion:1,pending:[],receipts:[]}}function correlationKey2(parentSessionId,callId){return`${parentSessionId}\x00${callId}`}function sha25610(value){return createHash97("sha256").update(value).digest("hex")}function policyDigest(policy){return sha25610(stableCanonicalStringify(policy??{}))}async function captureParticipationWorkspace(directory){let workspace=await captureWorkspaceSnapshotAsync(directory,{resolveCurrentPrHeadSha:!0});return{directory:workspace.directory,gitHead:workspace.gitHead,prHeadSha:workspace.prHeadSha}}function boundedPut(binding){let key2=correlationKey2(binding.parentSessionId,binding.callId);foregroundReservations.delete(key2),foregroundReservations.set(key2,binding);while(foregroundReservations.size>MAX_PENDING_IN_MEMORY){let oldest=foregroundReservations.keys().next().value;if(!oldest)break;foregroundReservations.delete(oldest)}}function takeBinding(parentSessionId,callId){let key2=correlationKey2(parentSessionId,callId),binding=foregroundReservations.get(key2)??null;return foregroundReservations.delete(key2),binding}async function persistWithBindingRecovery(directory,binding,operation){try{await withEvidenceLock(directory,PHASE_PARTICIPATION_FILE,"docs","phase-participation",operation)}catch(error93){throw boundedPut(binding),error93}}async function buildBinding(input){return{role:stripKnownSwarmPrefix(input.role),prefixedRole:input.role,planId:derivePlanId(input.plan),planIdentityHash:derivePlanIdentityHash(input.plan),planStructureHash:receiptStructureHash(input.plan),phase:input.phase,taskId:input.taskId,parentSessionId:input.parentSessionId,callId:input.callId,policyDigest:policyDigest(input.policy),workspace:await captureParticipationWorkspace(input.directory),capturedAt:Date.now()}}function extractPlanTaskId2(args2,plan){let context=collectPlanTaskIdContextFromPhases(plan.phases),result=resolveTaskId(args2,{policy:"plan",...toTaskIdPlanContextOptions(context)});if(result.status!=="resolved")return null;if(context.status==="over_limit"&&!plan.phases.some((phase)=>phase?.tasks?.some((task2)=>task2?.id===result.taskId)))return null;return result.taskId}function storePath6(directory){return validateSwarmPath(directory,PHASE_PARTICIPATION_FILE)}function readRawStore(directory){let filePath;try{filePath=storePath6(directory)}catch(error93){return{status:"unreadable",error:error93}}let descriptor,bytes;try{let pathStat=fs155.lstatSync(filePath);if(pathStat.isSymbolicLink()||!pathStat.isFile())return{status:"unreadable",error:Error("Participation projection is not a regular file")};if(pathStat.size>MAX_PHASE_PARTICIPATION_BYTES)return{status:"oversized",bytes:pathStat.size};descriptor=fs155.openSync(filePath,fs155.constants.O_RDONLY|(fs155.constants.O_NOFOLLOW??0));let openedStat=fs155.fstatSync(descriptor);if(!openedStat.isFile()||openedStat.dev!==pathStat.dev||openedStat.ino!==pathStat.ino)return{status:"unreadable",error:Error("Participation projection changed while it was being opened")};if(openedStat.size>MAX_PHASE_PARTICIPATION_BYTES)return{status:"oversized",bytes:openedStat.size};let bounded=Buffer.allocUnsafe(MAX_PHASE_PARTICIPATION_BYTES+1),offset=0;while(offset<bounded.byteLength){let read=fs155.readSync(descriptor,bounded,offset,bounded.byteLength-offset,null);if(read===0)break;offset+=read}if(offset>MAX_PHASE_PARTICIPATION_BYTES)return{status:"oversized",bytes:offset};bytes=bounded.subarray(0,offset)}catch(error93){if(error93.code==="ENOENT")return{status:"missing"};return{status:"unreadable",error:error93}}finally{if(descriptor!==void 0)try{fs155.closeSync(descriptor)}catch{}}try{return{status:"valid",store:StoreSchema.parse(JSON.parse(bytes.toString("utf8")))}}catch{return{status:"corrupt",bytes}}}async function atomicWriteBytes(filePath,bytes){await atomicWriteSwarmFile(filePath,bytes)}async function readBoundedRegularFile(filePath,maxBytes){let pathStat=await fs155.promises.lstat(filePath);if(pathStat.isSymbolicLink()||!pathStat.isFile()||pathStat.size>maxBytes)throw Error("bounded evidence artifact is not a permitted regular file");let handle=await fs155.promises.open(filePath,fs155.constants.O_RDONLY|(fs155.constants.O_NOFOLLOW??0));try{let openedStat=await handle.stat();if(!openedStat.isFile()||openedStat.dev!==pathStat.dev||openedStat.ino!==pathStat.ino||openedStat.size>maxBytes)throw Error("bounded evidence artifact changed while being opened");let bounded=Buffer.allocUnsafe(maxBytes+1),offset=0;while(offset<bounded.byteLength){let{bytesRead}=await handle.read(bounded,offset,bounded.byteLength-offset,null);if(bytesRead===0)break;offset+=bytesRead}if(offset>maxBytes)throw Error("bounded evidence artifact exceeds its byte limit");return bounded.subarray(0,offset)}finally{try{await handle.close()}catch{}}}function quarantineFullError(){return Error("PHASE_PARTICIPATION_QUARANTINE_FULL: preserved corrupt evidence reached its bounded retention limit; an operator must archive the quarantine before docs can be re-dispatched.")}async function quarantineCorruptBytes(directory,bytes){let digest4=sha25610(bytes),quarantineDir=validateSwarmPath(directory,PHASE_PARTICIPATION_QUARANTINE_DIR);await fs155.promises.mkdir(quarantineDir,{recursive:!0});let quarantineStat=await fs155.promises.lstat(quarantineDir);if(quarantineStat.isSymbolicLink()||!quarantineStat.isDirectory())throw Error("PHASE_PARTICIPATION_QUARANTINE_UNREADABLE: quarantine is not a regular directory.");let target=validateSwarmPath(directory,`${PHASE_PARTICIPATION_QUARANTINE_DIR}/${digest4}.bin`);try{if(!(await readBoundedRegularFile(target,MAX_PHASE_PARTICIPATION_BYTES)).equals(bytes))throw Error("hash-addressed quarantine content mismatch");return}catch(error93){if(error93.code!=="ENOENT")throw error93}let count=0,totalBytes=0,scanned=0,handle=await fs155.promises.opendir(quarantineDir,{bufferSize:16});try{for await(let entry of handle){if(scanned+=1,scanned>MAX_PHASE_PARTICIPATION_QUARANTINE_DIRECTORY_ENTRIES)throw quarantineFullError();if(!entry.isFile()||!/^[a-f0-9]{64}\.bin$/.test(entry.name))continue;count+=1;let candidate2=validateSwarmPath(directory,`${PHASE_PARTICIPATION_QUARANTINE_DIR}/${entry.name}`),candidateStat=await fs155.promises.lstat(candidate2);if(candidateStat.isSymbolicLink()||!candidateStat.isFile())throw Error("PHASE_PARTICIPATION_QUARANTINE_UNREADABLE: invalid quarantine artifact.");if(totalBytes+=candidateStat.size,count>=MAX_PHASE_PARTICIPATION_QUARANTINE_FILES||totalBytes+bytes.byteLength>MAX_PHASE_PARTICIPATION_QUARANTINE_BYTES)throw quarantineFullError()}}finally{try{await handle.close()}catch{}}await atomicWriteBytes(target,bytes)}async function loadWritableStoreUnderLock(directory){let read=readRawStore(directory);if(read.status==="missing")return emptyStore();if(read.status==="valid")return read.store;if(read.status==="corrupt")return await quarantineCorruptBytes(directory,read.bytes),emptyStore();if(read.status==="oversized")throw Error(`PHASE_PARTICIPATION_OVERSIZED: ${read.bytes} bytes exceeds ${MAX_PHASE_PARTICIPATION_BYTES}; operator action is required before docs can be re-dispatched.`);throw Error("PHASE_PARTICIPATION_UNREADABLE: operator action is required before docs can be re-dispatched.")}async function writeStore3(directory,store){let validatedStore=StoreSchema.parse(store);validatedStore.pending.sort((left,right)=>left.capturedAt-right.capturedAt),validatedStore.receipts.sort((left,right)=>left.completedAt-right.completedAt);let serialized3=JSON.stringify(validatedStore,null,2);while(Buffer.byteLength(serialized3,"utf8")>MAX_PHASE_PARTICIPATION_BYTES){let pendingTime=validatedStore.pending[0]?.capturedAt??1/0,receiptTime=validatedStore.receipts[0]?.completedAt??1/0;if(pendingTime===1/0&&receiptTime===1/0)throw Error("PHASE_PARTICIPATION_WRITE_OVERSIZED: even an empty participation store exceeds its byte limit.");if(pendingTime<=receiptTime)validatedStore.pending.shift();else validatedStore.receipts.shift();validatedStore=StoreSchema.parse(validatedStore),serialized3=JSON.stringify(validatedStore,null,2)}await fs155.promises.mkdir(path280.dirname(storePath6(directory)),{recursive:!0}),await atomicWriteFile(storePath6(directory),serialized3)}function receiptStructureHash(plan){return computePlanStructureHash({...plan,current_phase:void 0})}function samePlanIdentity(binding,plan){return binding.planId===derivePlanId(plan)&&binding.planIdentityHash===derivePlanIdentityHash(plan)&&binding.planStructureHash===receiptStructureHash(plan)}function bindingMatchesPlan(binding,plan,phase){return samePlanIdentity(binding,plan)&&binding.phase===phase}function workspaceIdentityIsFresh(expected,current){return sameProjectRoot(expected.directory,current.directory)&&expected.gitHead===current.gitHead&&expected.prHeadSha===current.prHeadSha}function resultText(output){if(!output||typeof output!=="object")return{text:"",childSessionId:null};let record3=output,rawOutput=typeof record3.output==="string"?record3.output:"",envelope=parseTaskEnvelope(rawOutput);if(envelope?.state==="completed")return{text:envelope.resultText??"",childSessionId:envelope.sessionId};return{text:rawOutput,childSessionId:null}}function envelopeFromOutput(output){if(typeof output==="string")return parseTaskEnvelope(output);if(!output||typeof output!=="object")return null;let rawOutput=output.output;return typeof rawOutput==="string"?parseTaskEnvelope(rawOutput):null}function validateMetadata(output,parentSessionId,childSessionId){if(!output||typeof output!=="object")return{valid:!0,childSessionId};let metadata=output.metadata;if(!metadata||typeof metadata!=="object")return{valid:!0,childSessionId};let meta3=metadata;if(typeof meta3.parentSessionId==="string"&&meta3.parentSessionId!==parentSessionId)return{valid:!1,childSessionId:null};let metadataChild=typeof meta3.sessionId==="string"&&meta3.sessionId.length>0?meta3.sessionId:null;if(childSessionId&&metadataChild&&childSessionId!==metadataChild)return{valid:!1,childSessionId:null};return{valid:!0,childSessionId:childSessionId??metadataChild}}function computeReceiptId(input){return sha25610(stableCanonicalStringify({parentSessionId:input.parentSessionId,callId:input.callId,childSessionId:input.childSessionId,planIdentityHash:input.planIdentityHash,planStructureHash:input.planStructureHash,phase:input.phase,role:input.role}))}function addReceipt(store,pending,text,childIdentityAvailable){let receiptId=computeReceiptId(pending),receipt={...pending,receiptId,resultDigest:sha25610(text),completedAt:Date.now(),childIdentityAvailable};store.receipts=store.receipts.filter((existing)=>existing.receiptId!==receiptId&&!(existing.planIdentityHash===receipt.planIdentityHash&&existing.planStructureHash===receipt.planStructureHash&&existing.phase===receipt.phase&&existing.role===receipt.role)),store.receipts.push(receipt),store.receipts=store.receipts.slice(-MAX_PHASE_PARTICIPATION_RECEIPTS)}async function reserveApprovedPhaseParticipation(input){if(input.tool.toLowerCase()!=="task")return;let rawRole=input.args.subagent_type;if(typeof rawRole!=="string"||stripKnownSwarmPrefix(rawRole)!=="docs")return;let plan=await loadPlan(input.directory);if(!plan)return;let binding=await buildBinding({plan,phase:getCurrentPhase(plan),role:rawRole,parentSessionId:input.parentSessionId,callId:input.callId,taskId:extractPlanTaskId2(input.args,plan),policy:input.policy,directory:input.directory});await withEvidenceLock(input.directory,PHASE_PARTICIPATION_FILE,"docs","phase-participation",async()=>{let store=await loadWritableStoreUnderLock(input.directory);await writeStore3(input.directory,store)}),boundedPut(binding)}async function observePhaseParticipationToolResult(input){if(input.tool.toLowerCase()!=="task")return;let binding=takeBinding(input.parentSessionId,input.callId);if(!binding)return;let envelope=envelopeFromOutput(input.output);if(envelope?.state==="running"){let{subagentSessionId}=extractDispatchIds(input.output);if(!subagentSessionId||subagentSessionId!==envelope.sessionId)return;let pending2={...binding,childSessionId:subagentSessionId};await persistWithBindingRecovery(input.directory,binding,async()=>{let store=await loadWritableStoreUnderLock(input.directory);store.pending=store.pending.filter((existing)=>existing.childSessionId!==pending2.childSessionId&&!(existing.parentSessionId===pending2.parentSessionId&&existing.callId===pending2.callId)),store.pending.push(pending2),store.pending=store.pending.slice(-MAX_PHASE_PARTICIPATION_PENDING),await writeStore3(input.directory,store)});return}if(envelope&&envelope.state!=="completed")return;if(classifyTaskResult(input.output)!=="success")return;let extracted=resultText(input.output),text=extracted.text.trim();if(!text)return;let metadata=validateMetadata(input.output,input.parentSessionId,extracted.childSessionId);if(!metadata.valid)return;let childSessionId=metadata.childSessionId,currentPlan=await loadPlan(input.directory);if(!currentPlan||!bindingMatchesPlan(binding,currentPlan,binding.phase))return;if(!workspaceIdentityIsFresh(binding.workspace,await captureParticipationWorkspace(input.directory)))return;let pending={...binding,childSessionId:childSessionId??`unavailable:${sha25610(correlationKey2(input.parentSessionId,input.callId))}`};await persistWithBindingRecovery(input.directory,binding,async()=>{let store=await loadWritableStoreUnderLock(input.directory);addReceipt(store,pending,text,childSessionId!==null),await writeStore3(input.directory,store)})}async function completeBackgroundPhaseParticipation(input){if(stripKnownSwarmPrefix(input.record.normalizedAgent)!=="docs")return!1;let text=input.resultText.trim();if(!text)return!1;return withEvidenceLock(input.directory,PHASE_PARTICIPATION_FILE,"docs","phase-participation",async()=>{let store=await loadWritableStoreUnderLock(input.directory),currentPlan=await loadPlan(input.directory),existingReceipt=store.receipts.find((receipt)=>receipt.childSessionId===input.record.subagentSessionId&&receipt.parentSessionId===input.record.parentSessionId&&receipt.callId===input.record.callID&&receipt.role===input.record.normalizedAgent&&receipt.prefixedRole===input.record.swarmPrefixedAgent&&receipt.taskId===input.record.planTaskId);if(existingReceipt&¤tPlan&&bindingMatchesPlan(existingReceipt,currentPlan,existingReceipt.phase))return!0;let pending=store.pending.find((candidate2)=>candidate2.childSessionId===input.record.subagentSessionId&&candidate2.parentSessionId===input.record.parentSessionId&&candidate2.callId===input.record.callID&&candidate2.role===input.record.normalizedAgent&&candidate2.prefixedRole===input.record.swarmPrefixedAgent&&candidate2.taskId===input.record.planTaskId);if(!pending)return!1;let plan=currentPlan;if(!plan||!bindingMatchesPlan(pending,plan,pending.phase))return!1;if(!workspaceIdentityIsFresh(pending.workspace,await captureParticipationWorkspace(input.directory)))return!1;if(pending.taskId!==null&&input.record.ingestion?.state!=="consumed")return!1;return addReceipt(store,pending,text,!0),store.pending=store.pending.filter((candidate2)=>candidate2.childSessionId!==pending.childSessionId),await writeStore3(input.directory,store),!0})}async function readPhaseParticipation(directory,plan,phase,role){let read=readRawStore(directory);if(read.status!=="valid")return{status:read.status,found:!1};let canonicalRole2=stripKnownSwarmPrefix(role),currentWorkspace=await captureParticipationWorkspace(directory),cursorPhase=getCurrentPhase(plan);return{status:"valid",found:read.store.receipts.some((receipt)=>receipt.role===canonicalRole2&&samePlanIdentity(receipt,plan)&&workspaceIdentityIsFresh(receipt.workspace,currentWorkspace)&&(receipt.phase===phase||receipt.phase===cursorPhase&&cursorPhase<phase))}}async function rebindCursorTaggedReceipts(directory,plan,phase,role){let canonicalRole2=stripKnownSwarmPrefix(role),cursorPhase=getCurrentPhase(plan),peek=readRawStore(directory);if(!(peek.status==="valid"&&peek.store.receipts.some((receipt)=>receipt.role===canonicalRole2&&samePlanIdentity(receipt,plan)&&receipt.phase===cursorPhase&&cursorPhase<phase)))return{rebound:0};return withEvidenceLock(directory,PHASE_PARTICIPATION_FILE,"docs","phase-participation",async()=>{let store=await loadWritableStoreUnderLock(directory),rebound=0;for(let receipt of store.receipts)if(receipt.role===canonicalRole2&&samePlanIdentity(receipt,plan)&&receipt.phase===cursorPhase&&cursorPhase<phase)receipt.phase=phase,receipt.receiptId=computeReceiptId(receipt),rebound+=1;if(rebound>0){let newestByKey=new Map;for(let receipt of store.receipts.slice().sort((left,right)=>left.completedAt-right.completedAt))newestByKey.set(`${receipt.planIdentityHash}\x00${receipt.planStructureHash}\x00${receipt.phase}\x00${receipt.role}`,receipt);store.receipts=[...newestByKey.values()],await writeStore3(directory,store)}return{rebound}})}init_gate_evidence();init_worktree_isolation();init_helpers();init_state2();init_canonical_root();init_logger();init_coder_settlement();init_merge2();init_pending_delegations();init_loader();init_task_gate_requirements();init_gate_evidence();init_gate_evidence_classification();init_review_receipt_collector();init_reviewer_scope_file_fingerprint();init_routing_enforcement();init_scope_binding();init_state2();init_logger();init_workspace_snapshot();var GATE_EVIDENCE_ROLES=new Set(["reviewer","test_engineer","docs","designer","critic","critic_sounding_board","critic_drift_verifier","critic_hallucination_verifier","critic_architecture_supervisor","explorer","sme"]);function structuredStageBVerdict(role,text,taskId){let escapedTaskId=taskId.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),match=(role==="reviewer"?new RegExp(`^\\[REVIEWED\\]\\s*\\|\\s*(?:task-)?${escapedTaskId}\\s*\\|\\s*(APPROVED|REJECTED|CONCERNS)\\s*\\|`,"im"):new RegExp(`^\\[TESTED\\]\\s*\\|\\s*(?:task-)?${escapedTaskId}\\s*\\|\\s*(PASS|FAIL|SKIPPED)\\s*\\|`,"im")).exec(text);if(!match)return null;if(match[1]==="APPROVED"||match[1]==="PASS")return"pass";if(match[1]==="SKIPPED")return"skip";return"fail"}function normalizeAttributionPath(file3){let normalized=file3.trim().replaceAll("\\","/").replace(/^\.\/+/,""),hasControlCharacter5=[...normalized].some((character)=>{let code=character.charCodeAt(0);return code<=31||code===127});if(!normalized||normalized.startsWith("/")||/^[A-Za-z]:\//.test(normalized)||normalized===".."||normalized.startsWith("../")||normalized.split("/").includes("..")||hasControlCharacter5)return null;return normalized}function normalizedPathSet(files){if(!files)return null;let normalized=new Set;for(let file3 of files){let candidate2=normalizeAttributionPath(file3);if(!candidate2)return null;normalized.add(candidate2)}return normalized}function pathSetsEqual(left,right){return left.size===right.size&&[...left].every((file3)=>right.has(file3))}function hasDistinctBackgroundOwner(input){if(!Number.isFinite(input.candidateCreatedAt)||!Number.isFinite(input.candidateCompletedAt)||input.candidateCreatedAt>input.candidateCompletedAt)return!1;let liveOwners=[...(swarmState.agentSessions.get(input.parentSessionID)?.reviewerScopeGenerations??new Map).values()].filter((generation)=>{if(generation.background!==!0||generation.taskId===input.taskId&&generation.coderCallID===input.coderCallID)return!1;let declared=normalizedPathSet(generation.declaredFiles),routed=normalizedPathSet(generation.modifiedFiles),fingerprints=generation.modifiedFileFingerprints.filter((entry)=>normalizeAttributionPath(entry.file)===input.file),ownerCompletedAt=generation.readyAt??input.candidateCompletedAt;return Number.isFinite(generation.createdAt)&&Number.isFinite(ownerCompletedAt)&&generation.createdAt<=input.candidateCompletedAt&&input.candidateCreatedAt<=ownerCompletedAt&&declared?.has(input.file)===!0&&routed?.has(input.file)===!0&&fingerprints.length===1&&reviewerScopeFileFingerprintsEqual(fingerprints[0],input.fingerprint)}),historicalOwners=getReviewerScopeOwnershipHistory({parentSessionID:input.parentSessionID}).filter((owner)=>{if(owner.taskId===input.taskId&&owner.coderCallID===input.coderCallID)return!1;let declared=normalizedPathSet(owner.declaredFiles),routed=normalizedPathSet(owner.modifiedFiles),fingerprints=owner.modifiedFileFingerprints.filter((entry)=>normalizeAttributionPath(entry.file)===input.file);return owner.parentSessionID===input.parentSessionID&&owner.background===!0&&Number.isFinite(owner.createdAt)&&Number.isFinite(owner.readyAt)&&owner.createdAt<=input.candidateCompletedAt&&input.candidateCreatedAt<=owner.readyAt&&declared?.has(input.file)===!0&&routed?.has(input.file)===!0&&fingerprints.length===1&&reviewerScopeFileFingerprintsEqual(fingerprints[0],input.fingerprint)});return liveOwners.length+historicalOwners.length===1}function isBackgroundGateBearingRecord(record3){return record3.batchId===void 0&&record3.evidenceTaskId!==null&&GATE_EVIDENCE_ROLES.has(record3.normalizedAgent)}function validateStageBWorkspace(directory,record3){let actualWorkspace=captureWorkspaceSnapshot(directory,{scope:record3.workspace?.scope??null,prHeadSha:record3.workspace?.prHeadSha??null,resolveCurrentPrHeadSha:record3.workspace?.prHeadSha!==null}),check3=compareStageBWorkspace(record3,actualWorkspace,directory);return{...check3,ok:!check3.stale}}var BARE_TASK_ID=/^\d+(?:\.\d+)*$/,SCOPE_CASE_FOLD=process.platform==="win32";function scopeMatchKey(normalized){return SCOPE_CASE_FOLD?normalized.toLowerCase():normalized}function deriveScopeFiles(scope){if(!scope)return null;let files=new Set;for(let fragment of scope.split(",")){let normalized=normalizeAttributionPath(fragment);if(normalized===null||BARE_TASK_ID.test(normalized))continue;files.add(scopeMatchKey(normalized))}return files.size>0?files:null}function scopeDirtySlice(files,scopeFiles){let slice=new Set;for(let file3 of files){let normalized=normalizeAttributionPath(file3);if(normalized!==null&&scopeFiles.has(scopeMatchKey(normalized)))slice.add(normalized)}return slice}function compareStageBWorkspace(record3,actualWorkspace,directory){let expectedWorkspace=record3.normalizedAgent==="docs"&&record3.workspace?{...record3.workspace,dirtyHash:null}:record3.workspace;if(!expectedWorkspace)return{stale:!1};if(record3.normalizedAgent==="docs")return compareWorkspaceSnapshots(expectedWorkspace,actualWorkspace);let scopeFiles=deriveScopeFiles(expectedWorkspace.scope),expectedHead=expectedWorkspace.gitHead,currentHead=actualWorkspace.gitHead,expectedChanged=expectedWorkspace.changedFiles,currentChanged=actualWorkspace.changedFiles;if(scopeFiles===null||expectedHead==null||currentHead==null||expectedChanged==null||currentChanged==null||directory===void 0)return compareWorkspaceSnapshots(expectedWorkspace,actualWorkspace);let identity=workspaceSnapshotMatches({...expectedWorkspace,gitHead:null,dirtyHash:null},{...actualWorkspace,gitHead:null,dirtyHash:null});if(!identity.ok)return{stale:!0,reason:identity.reason};let committed=committedFilesBetween(directory,expectedHead,currentHead);if(committed===null)return compareWorkspaceSnapshots(expectedWorkspace,actualWorkspace);let committedInScope=committed.filter((file3)=>scopeFiles.has(scopeMatchKey(normalizeAttributionPath(file3)??"")));if(committedInScope.length>0){let shown=committedInScope.slice(0,5).join(", "),extra=committedInScope.length>5?` (+${committedInScope.length-5} more)`:"";return{stale:!0,reason:`in-scope committed change: ${shown}${extra}`}}let dispatchDirty=scopeDirtySlice(expectedChanged,scopeFiles),currentDirty=scopeDirtySlice(currentChanged,scopeFiles),dirtied=[...currentDirty].filter((file3)=>!dispatchDirty.has(file3)),cleaned=[...dispatchDirty].filter((file3)=>!currentDirty.has(file3));if(dirtied.length>0||cleaned.length>0)return{stale:!0,reason:`in-scope dirty set changed: +[${dirtied.join(", ")}] -[${cleaned.join(", ")}]`};return{stale:!1}}async function ingestBackgroundStageBCompletion(args2){let taskId=args2.record.evidenceTaskId??args2.record.planTaskId;if(!taskId)return{ok:!0,consumed:!1};if(args2.record.normalizedAgent==="coder"){let taskChangeContext=args2.record.taskChangeContext,settledFiles=args2.record.coderSettlement?.state==="settled"?args2.record.coderSettlement.observedFiles:void 0,observedFiles=settledFiles!==void 0?settledFiles:taskChangeContext?changedFilesSinceSnapshot(taskChangeContext.baseline.directory,taskChangeContext.baseline):null;if(observedFiles===null)return{ok:!1,consumed:!1,stale:!0,reason:"background coder files could not be attributed to a clean immutable baseline"};try{let observedSet=normalizedPathSet(observedFiles),declaredSet=normalizedPathSet(taskChangeContext?.declaredFiles??null),completionTime=args2.record.completedAt??args2.record.updatedAt,attributedFiles=observedFiles??[];if(args2.reviewerReceiptOptions?.config?.enabled!==!0){if(observedSet&&declaredSet)attributedFiles=[...observedSet].filter((file3)=>declaredSet.has(file3))}if(args2.reviewerReceiptOptions?.config?.enabled===!0){if(!observedSet||!declaredSet)return{ok:!1,consumed:!1,reason:"background coder changed-file attribution could not be reconstructed exactly"};attributedFiles=[...observedSet].filter((file3)=>declaredSet.has(file3));let generation=getReviewerScopeGenerationForCoderCall({parentSessionID:args2.record.parentSessionId,taskId,coderCallID:args2.record.callID}),generationScope=normalizedPathSet(generation?.declaredFiles??null),routedFiles=normalizedPathSet(generation?.modifiedFiles??null),routedFingerprints=generation?.modifiedFileFingerprints??null;if(generation?.status==="collecting"&&generation.background===!0&&observedSet.size===0&&routedFiles?.size===0&&declaredSet){if(markReviewerScopeGenerationNoChange({parentSessionID:args2.record.parentSessionId,taskId,coderCallID:args2.record.callID}))return{ok:!0,consumed:!0}}let captureRoot=generation?.captureDirectory?.trim()||args2.directory,observedFingerprints=new Map;for(let file3 of observedSet){let captured=captureReviewerScopeFileFingerprint(captureRoot,file3);if(captured.kind==="capture_failed")return{ok:!1,consumed:!1,reason:`background coder post-write fingerprint could not be reconstructed exactly (${captured.code}${captured.retryable?" (retryable)":" (permanent)"} on ${captured.file})`};let fingerprint2=reviewerScopeCaptureToFingerprint(captured);if(!fingerprint2)return{ok:!1,consumed:!1,reason:"background coder post-write fingerprint returned an unusable result"};observedFingerprints.set(file3,fingerprint2)}let changedWithinDeclaredScope=new Set([...observedSet].filter((file3)=>declaredSet.has(file3)&&generationScope?.has(file3))),observedOutsideCurrentScope=[...observedSet].filter((file3)=>!generationScope?.has(file3));if(generation?.status!=="collecting"&&generation?.status!=="ready"||generation.background!==!0||!generationScope||!routedFiles||!routedFingerprints||routedFiles.size===0||!pathSetsEqual(declaredSet,generationScope)||!pathSetsEqual(routedFiles,changedWithinDeclaredScope)||reviewerScopeGenerationHasDeclaredOverlap({parentSessionID:args2.record.parentSessionId,taskId,coderCallID:args2.record.callID,declaredFiles:generation.declaredFiles})||observedOutsideCurrentScope.some((file3)=>!hasDistinctBackgroundOwner({parentSessionID:args2.record.parentSessionId,taskId,coderCallID:args2.record.callID,file:file3,fingerprint:observedFingerprints.get(file3),candidateCreatedAt:args2.record.createdAt,candidateCompletedAt:completionTime}))||[...routedFiles].some((file3)=>{let fingerprints=routedFingerprints.filter((entry)=>normalizeAttributionPath(entry.file)===file3),observedFingerprint=observedFingerprints.get(file3);return!observedSet.has(file3)||!declaredSet.has(file3)||!generationScope.has(file3)||fingerprints.length!==1||!observedFingerprint||!reviewerScopeFileFingerprintsEqual(fingerprints[0],observedFingerprint)}))return{ok:!1,consumed:!1,reason:"background coder scope handoff could not be reconstructed exactly"};attributedFiles=[...routedFiles];for(let file3 of routedFiles){let fingerprint2=observedFingerprints.get(file3);if(fingerprint2)recordReviewerScopeGenerationFileFingerprint({parentSessionID:args2.record.parentSessionId,taskId,coderCallID:args2.record.callID,fingerprint:fingerprint2})}}let parentSession=swarmState.agentSessions.get(args2.record.parentSessionId);if(parentSession){let state2=getTaskState(parentSession,taskId);if(state2!=="idle"&&state2!=="coder_delegated"&&state2!=="rework_required")return{ok:!1,consumed:!1,reason:`background coder completion is late for task ${taskId}: current state is ${state2}`}}let accepted=attributedFiles.length>0,expectedGeneration=args2.record.taskChangeContext?.workflowGeneration??0,transitionId=`background-coder:${args2.record.correlationId}`,existingEvidence=await readTaskEvidence(args2.directory,taskId),existingWorkflow=getTaskWorkflowSnapshot(existingEvidence),updated=existingWorkflow.authoritative&&existingWorkflow.lastTransitionId===transitionId&&existingWorkflow.lastOutcome===(accepted?"accepted_mutation":"dispatch_no_mutation")&&existingWorkflow.generation===expectedGeneration+(accepted?1:0)?existingEvidence:await transitionTaskWorkflowEvidence(args2.directory,taskId,accepted?{type:"accepted_mutation",agentType:"coder",context:{testEngineerExempt:isMarkdownOnlyTaskChange(taskChangeContext?.declaredFiles,attributedFiles)},expectedGeneration,transitionId}:{type:"dispatch_no_mutation",agentType:"coder",expectedGeneration,transitionId});if(accepted){let workflow=getTaskWorkflowSnapshot(updated),parentSession2=swarmState.agentSessions.get(args2.record.parentSessionId);if(parentSession2){if(!recordModifiedFilesForTask(parentSession2,taskId,attributedFiles,args2.directory))warn(`[background] durable coder mutation for ${taskId} exceeded session file-attribution capacity`);parentSession2.taskWorkflowStates.set(taskId,"coder_delegated"),parentSession2.stageBCompletion?.delete(taskId),parentSession2.taskCouncilApproved?.delete(taskId),parentSession2.taskCouncilWorkflowGeneration?.delete(taskId),updateTaskWorkflowCache(parentSession2,taskId,workflow)}}if(args2.reviewerReceiptOptions?.config?.enabled===!0){let laneGeneration=getReviewerScopeGenerationForCoderCall({parentSessionID:args2.record.parentSessionId,taskId,coderCallID:args2.record.callID});if(laneGeneration!==null&&laneGeneration.workspaceIdentity!==canonicalWorkspaceIdentity(args2.directory))return markReviewerScopeGenerationMergebackPending({parentSessionID:args2.record.parentSessionId,taskId,coderCallID:args2.record.callID}),{ok:!0,consumed:!0}}if(args2.reviewerReceiptOptions?.config?.enabled===!0&&!markReviewerScopeGenerationReady({parentSessionID:args2.record.parentSessionId,taskId,coderCallID:args2.record.callID,primaryWorkspaceIdentity:canonicalWorkspaceIdentity(args2.directory)??void 0}))return{ok:!1,consumed:!1,reason:"background coder scope handoff could not be marked ready after evidence persisted"};return{ok:!0,consumed:!0}}catch(err){return{ok:!1,consumed:!1,reason:`background coder evidence ingestion failed: ${err instanceof Error?err.message:String(err)}`}}}if(!isBackgroundGateBearingRecord(args2.record))return{ok:!0,consumed:!1};let workspaceCheck=validateStageBWorkspace(args2.directory,args2.record);if(workspaceCheck.stale)return{ok:!1,consumed:!1,stale:!0,reason:workspaceCheck.reason??"workspace changed while gate was running"};try{if(args2.record.workflowGeneration===void 0)return{ok:!1,consumed:!1,reason:`stage-b ingestion failed: TASK_WORKFLOW_GENERATION_REQUIRED for ${taskId}`};let existingEvidence=await readTaskEvidence(args2.directory,taskId),stageBRole=args2.record.normalizedAgent==="reviewer"||args2.record.normalizedAgent==="test_engineer"?args2.record.normalizedAgent:null,verdict=stageBRole?structuredStageBVerdict(stageBRole,args2.result.text??"",taskId):null;if(stageBRole&&verdict==="skip")return{ok:!1,consumed:!0,skipped:!0,reason:`background ${stageBRole} skipped task ${taskId} — tests not run; re-dispatch the test gate (task stays Stage B eligible; reviewer proof preserved)`};if(stageBRole&&verdict!=="pass"){let rejected2=await transitionTaskWorkflowEvidence(args2.directory,taskId,{type:"stage_b_failed",gate:stageBRole,expectedGeneration:args2.record.workflowGeneration,transitionId:`background-gate-failed:${args2.record.correlationId}`}),parentSession=swarmState.agentSessions.get(args2.record.parentSessionId);if(parentSession)parentSession.taskWorkflowStates.set(taskId,"rework_required"),parentSession.stageBCompletion?.delete(taskId),updateTaskWorkflowCache(parentSession,taskId,getTaskWorkflowSnapshot(rejected2));return{ok:!1,consumed:!0,reason:verdict==="fail"?`background ${stageBRole} rejected task ${taskId}`:`background ${stageBRole} returned no valid structured verdict for task ${taskId}`}}let preparedRoute,routeCompleteForPersistence;if(stageBRole){let parentSession=swarmState.agentSessions.get(args2.record.parentSessionId);if(parentSession){preparedRoute=resolveBackgroundStageBRoute({directory:args2.directory,taskId,parentSessionId:args2.record.parentSessionId,role:stageBRole,callId:args2.record.callID,childSessionId:args2.record.subagentSessionId,generation:args2.record.workflowGeneration,session:parentSession});let routeEnabled=(()=>{try{return loadPluginConfig(args2.directory).review_routing?.enforce_receipts??!0}catch{return!0}})(),routeDecision=enforcePersistedReviewRouteReceipt({projectRoot:args2.directory,sessionId:args2.record.parentSessionId,taskId,receipts:preparedRoute.prospective,enforcementEnabled:routeEnabled,legacyUnrouted:preparedRoute.legacyUnrouted,requireEvidenceBindings:!0,requireCompleteEvidence:!1,expectedDispatch:preparedRoute.binding?{role:preparedRoute.binding.role,identity:preparedRoute.binding.identity,callId:preparedRoute.binding.callId,childSessionId:preparedRoute.binding.childSessionId,generation:preparedRoute.binding.generation}:void 0});if(!routeDecision.canAdvance)return warn(`[background-stage-b] route receipt blocked before evidence publication for ${taskId}: ${routeDecision.reason??"unknown reason"}`),{ok:!1,consumed:!1,reason:`route receipt blocked before Stage-B evidence publication: ${routeDecision.reason??"unknown reason"}`};if(routeEnabled&&preparedRoute.route?.kind==="review_route_receipt")routeCompleteForPersistence=enforcePersistedReviewRouteReceipt({projectRoot:args2.directory,sessionId:args2.record.parentSessionId,taskId,receipts:preparedRoute.prospective,enforcementEnabled:!0,legacyUnrouted:preparedRoute.legacyUnrouted,requireEvidenceBindings:!0,requireCompleteEvidence:!0}).canAdvance}else{let route=readReviewRouteReceiptSync({projectRoot:args2.directory,sessionId:args2.record.parentSessionId,taskId});if(route?.kind!=="review_route_router_error"||route.sessionId!==args2.record.parentSessionId||route.taskId!==taskId)return{ok:!1,consumed:!1,reason:"route receipt blocked before Stage-B evidence publication: parent session is unavailable and recovery receipt is not identity-bound"}}}let routeEvidenceRollback=null;if(preparedRoute?.binding){let parentSession=swarmState.agentSessions.get(args2.record.parentSessionId);if(!parentSession)return warn(`[background-stage-b] route receipt blocked before evidence publication for ${taskId}: parent session unavailable`),{ok:!1,consumed:!1,reason:"route receipt blocked before Stage-B evidence publication: parent session unavailable"};if(routeEvidenceRollback=reserveStageBRouteEvidence(parentSession,taskId,preparedRoute.binding),!routeEvidenceRollback)return warn(`[background-stage-b] route receipt blocked before evidence publication for ${taskId}: bounded route evidence capacity exceeded`),{ok:!1,consumed:!1,reason:"route receipt blocked before Stage-B evidence publication: bounded route evidence capacity exceeded"}}try{await recordGateEvidence(args2.directory,taskId,args2.record.normalizedAgent,args2.record.subagentSessionId,hasActiveTurboMode(args2.record.parentSessionId),{expectedGeneration:args2.record.workflowGeneration,transitionId:`background-gate:${args2.record.correlationId}`,ensureDefaultStageB:existingEvidence?.test_engineer_exempt!==!0,routeBinding:preparedRoute?.binding,routeComplete:routeCompleteForPersistence})}catch(err){throw routeEvidenceRollback?.(),err}if(args2.record.normalizedAgent==="reviewer")await collectReviewerReceiptFromTranscript(args2.directory,{targetAgent:args2.record.swarmPrefixedAgent,prompt:args2.record.prompt?.text??"",transcript:args2.result.text??"",sessionID:args2.record.parentSessionId,taskId,reviewerCallID:args2.record.callID,consumeHandoff:!0},args2.reviewerReceiptOptions);if(args2.record.normalizedAgent==="reviewer"||args2.record.normalizedAgent==="test_engineer")applyStageBStateCompletion(taskId,args2.record.normalizedAgent,args2.record.parentSessionId,existingEvidence?.test_engineer_exempt===!0,args2.directory,args2.record.callID,args2.record.subagentSessionId,args2.record.workflowGeneration,preparedRoute);return{ok:!0,consumed:!0}}catch(err){let message=err instanceof Error?err.message:String(err);return warn(`[background-stage-b] ingestion failed: ${message}`),{ok:!1,consumed:!1,reason:`stage-b ingestion failed: ${message}`}}}function candidateSessions(parentSessionId){let parent=swarmState.agentSessions.get(parentSessionId);return parent?[parent]:[]}function routeDispatchKey(entry){if(!entry.callId||!entry.childSessionId||typeof entry.generation!=="number")return null;return[entry.role,entry.sessionId??"",entry.taskId??"",entry.callId,entry.childSessionId,String(entry.generation)].join("\x00")}function resolveBackgroundStageBRoute(input){let route=readReviewRouteReceiptSync({projectRoot:input.directory,sessionId:input.parentSessionId,taskId:input.taskId}),evidence2=getStageBRouteEvidence(input.session,input.taskId);if(evidence2.length===0)try{evidence2=routeEvidenceFromTaskGateRequirements(readTaskGateRequirementsReceiptsSync(input.directory,input.taskId))}catch{}let legacyUnrouted=route===null&&!isStageBRouteRequired(input.session,input.taskId)&&(()=>{try{let receipts=readTaskGateRequirementsReceiptsSync(input.directory,input.taskId);return receipts.length>0&&receipts.every((receipt)=>!receipt.routeBinding)}catch{return!1}})(),binding,prospective=evidence2;if(route?.kind==="review_route_receipt"){let identities=input.role==="reviewer"?route.identities.reviewers:route.identities.testEngineers,slots=input.role==="reviewer"?route.slots?.reviewers??identities:route.slots?.testEngineers??identities,dispatchKey2=[input.role,input.parentSessionId,input.taskId,input.callId,input.childSessionId,String(input.generation)].join("\x00"),retry=evidence2.find((entry)=>entry.role===input.role&&routeDispatchKey(entry)===dispatchKey2),usedSlots=new Set(evidence2.filter((entry)=>entry.role===input.role&&entry!==retry&&entry.slotId).map((entry)=>entry.slotId)),slotIndex=retry?slots.indexOf(retry.slotId??""):slots.findIndex((slot)=>!usedSlots.has(slot));if(slotIndex>=0&&slotIndex<identities.length){let slotId=slots[slotIndex],identity=identities[slotIndex];binding={role:input.role,identity,sessionId:input.parentSessionId,taskId:input.taskId,slotId,callId:input.callId,childSessionId:input.childSessionId,generation:input.generation},prospective=retry?evidence2.map((entry)=>entry===retry?binding:entry):[...evidence2,binding]}}return{route,binding,prospective,legacyUnrouted}}function applyStageBStateCompletion(taskId,agent,parentSessionId,testEngineerExempt,directory,callId,childSessionId,generation,preparedRoute){for(let session of candidateSessions(parentSessionId)){let resolvedRoute=preparedRoute??resolveBackgroundStageBRoute({directory,taskId,parentSessionId,role:agent,callId,childSessionId,generation:generation??-1,session}),{binding,prospective:routeEvidence,legacyUnrouted}=resolvedRoute,routeEnabled=(()=>{try{return loadPluginConfig(directory).review_routing?.enforce_receipts??!0}catch{return!0}})(),completionDecision=enforcePersistedReviewRouteReceipt({projectRoot:directory,sessionId:parentSessionId,taskId,receipts:routeEvidence,enforcementEnabled:routeEnabled,legacyUnrouted,requireEvidenceBindings:!0,requireCompleteEvidence:!1,expectedDispatch:binding?{role:binding.role,identity:binding.identity,callId:binding.callId,childSessionId:binding.childSessionId,generation:binding.generation}:void 0});if(!completionDecision.canAdvance){warn(`[background-stage-b] route receipt blocked ${taskId}: ${completionDecision.reason??"unknown reason"}`);continue}if(binding&&!recordStageBRouteEvidence(session,taskId,binding)){warn(`[background-stage-b] route receipt blocked before Stage-B evidence publication for ${taskId}: bounded route evidence capacity exceeded`);continue}recordStageBCompletion(session,taskId,agent);let state2=getTaskState(session,taskId);if(state2==="tests_run"||state2==="complete")continue;let routeComplete=enforcePersistedReviewRouteReceipt({projectRoot:directory,sessionId:parentSessionId,taskId,receipts:getStageBRouteEvidence(session,taskId),enforcementEnabled:routeEnabled,legacyUnrouted,requireEvidenceBindings:!0,requireCompleteEvidence:!0}).canAdvance;if(routeComplete&&(hasBothStageBCompletions(session,taskId)||testEngineerExempt&&agent==="reviewer")){try{if(state2==="coder_delegated"||state2==="pre_check_passed")advanceTaskState(session,taskId,"reviewer_run",{telemetrySessionId:parentSessionId});if(getTaskState(session,taskId)==="reviewer_run")advanceTaskState(session,taskId,"tests_run",{telemetrySessionId:parentSessionId})}catch(err){warn(`[background-stage-b] could not advance ${taskId} after ${agent}: ${err instanceof Error?err.message:String(err)}`)}continue}if(agent==="reviewer"&&(state2==="coder_delegated"||state2==="pre_check_passed"))try{advanceTaskState(session,taskId,"reviewer_run",{telemetrySessionId:parentSessionId})}catch(err){warn(`[background-stage-b] could not advance ${taskId} to reviewer_run: ${err instanceof Error?err.message:String(err)}`)}else if(routeComplete&&agent==="test_engineer"&&state2==="reviewer_run")try{advanceTaskState(session,taskId,"tests_run",{telemetrySessionId:parentSessionId})}catch(err){warn(`[background-stage-b] could not advance ${taskId} to tests_run: ${err instanceof Error?err.message:String(err)}`)}}}init_task_envelope();init_workspace_snapshot();var RETRYABLE_LEGACY_SETTLEMENT_TRANSFER_ERROR_CODES=new Set(["CODER_SETTLEMENT_LOCKED","EACCES","EBUSY","EIO","EPERM","ETIMEDOUT"]),observerInternals={transferCoderSettlementToBackground,markLegacyCoderSettlementTransferPending,sleep:(milliseconds)=>new Promise((resolve108)=>setTimeout(resolve108,milliseconds))};function createBackgroundCompletionObserver(opts){let{config:config3,directory}=opts,replayInProgress=!1,notifyLegacyCoderSettlementAdvisoryReplaced=(record3,replacement)=>{let session=swarmState.agentSessions.get(record3.parentSessionId);if(!session)return;if(removeQueuedLegacyTransferAdvisory(session.pendingAdvisoryMessages,replacement.advisory.eventId),replacement.replacedMessage)removeQueuedAdvisoryMessage(session.pendingAdvisoryMessages,[replacement.replacedMessage]);pushAdvisory(session,replacement.advisory.message)},event=async(input)=>{if(!config3.enabled)return;try{let pending,result,terminal,record3,text,isDuplicate=!1;if(input.trustedTerminal)pending=input.trustedTerminal.record,result=input.trustedTerminal.result,terminal=input.trustedTerminal.terminal,text=result.error??result.text??"",record3=pending,isDuplicate=!0;else{let evt=input?.event;if(!evt||evt.type!=="message.part.updated")return;let part=evt.properties?.part;if(!part||part.type!=="text"||part.synthetic!==!0||typeof part.text!=="string")return;let envelope=parseTaskEnvelope(part.text);if(!envelope||envelope.state!=="completed"&&envelope.state!=="error"&&envelope.state!=="cancelled")return;let parentSessionId=typeof part.sessionID==="string"?part.sessionID:"",lookup=await findDelegationForCompletion(directory,envelope.sessionId);if(lookup?.source==="uncertain"){warn(`[background] deferring terminal ingestion: delegation store unreadable for ${envelope.sessionId} (${lookup.uncertain})`);return}if(!lookup){log(`[background] trusted completion for ${envelope.sessionId} has no durable primary or fallback owner; ignored`);return}if(!parentSessionId||lookup.record.parentSessionId!==parentSessionId||lookup.record.subagentSessionId!==envelope.sessionId){warn(`[background] trusted completion identity mismatch for ${envelope.sessionId}; ignored`);return}if(pending=lookup.record,lookup.source==="fallback"){let promoted=await promoteDelegationFallback(directory,envelope.sessionId);if(!promoted){warn(`[background] fallback promotion failed for ${envelope.sessionId}; terminal work remains preserved`);return}pending=promoted.record}text=envelope.state==="error"||envelope.state==="cancelled"?envelope.errorText??"":envelope.resultText??"",result={...envelope.state==="error"?{error:text}:{text},chars:envelope.resultChars??text.length,truncated:envelope.resultTruncated??!1,digest:digest4(text)},terminal={eventId:buildBackgroundCompletionEventId({correlationId:pending.correlationId,jobId:pending.jobId,status:envelope.state,resultDigest:result.digest}),status:envelope.state,recordedAt:pending.terminalResult?.recordedAt??Date.now(),result};let terminalClaim=await claimTerminalResult(directory,pending.correlationId,terminal);if(!terminalClaim){warn(`[background] terminal claim failed for ${pending.correlationId}; ignored`);return}isDuplicate=terminalClaim.disposition==="duplicate",record3=terminalClaim.record}if(opts.onTerminalClaimed?.(record3),!input.trustedTerminal?.skipMaintenance)try{await maintainBackgroundDelegations(directory,{lockTimeoutMs:1000,reason:"trusted-terminal",onLegacyCoderSettlementReconciled:reconcilePending,onLegacyCoderSettlementAdvisoryReplaced:notifyLegacyCoderSettlementAdvisoryReplaced})}catch{}let legacyTransferPending=!1,legacyTransferRequiresManualRecovery=!1;if(terminal.status!=="completed"){if(isDuplicate&&record3.normalizedAgent!=="coder")return;if(record3.normalizedAgent==="coder"){let legacyTransfer=await transferLegacyCoderSettlement(directory,record3);if(legacyTransfer.disposition==="retry_pending")legacyTransferPending=!0;else if(legacyTransfer.disposition==="manual_recovery")legacyTransferRequiresManualRecovery=!0;if(record3.planTaskId){let expectedGeneration=record3.taskChangeContext?.workflowGeneration;if(expectedGeneration===void 0)warn(`[background] failed coder ${record3.correlationId} has no launch generation for task ${record3.planTaskId}`);else try{await transitionTaskWorkflowEvidence(directory,record3.planTaskId,{type:"dispatch_no_mutation",agentType:"coder",expectedGeneration,transitionId:`background-coder-terminal:${terminal.eventId}`})}catch(error93){warn(`[background] failed coder retry accounting was fenced for ${record3.planTaskId}: ${error93 instanceof Error?error93.message:String(error93)}`)}}try{await releaseCoderReservation(directory,record3,"recovered")}catch(error93){warn(`[background] failed coder reservation cleanup will be retried by admission reconciliation: ${error93 instanceof Error?error93.message:String(error93)}`)}if(record3.worktree){let descriptor=record3.worktree;if(!standardWorktreeByCallID.has(record3.callID))standardWorktreeByCallID.set(record3.callID,{callID:descriptor.callID,parentSessionID:descriptor.parentSessionId,taskId:descriptor.taskId,...descriptor.planTaskId?{planTaskId:descriptor.planTaskId}:{},handle:{worktreePath:descriptor.worktreePath,branchName:descriptor.branchName,purpose:"lane",id:descriptor.worktreeId,sessionId:descriptor.worktreeSessionId},mergeStrategy:descriptor.mergeStrategy,laneIndex:descriptor.laneIndex,...descriptor.worktreeDir?{worktree_dir:descriptor.worktreeDir}:{}});try{await abortStandardWorktreeDispatch(record3.callID,"cancelled",directory)}catch(error93){warn(`[background] failed coder worktree cleanup preserved the lane for manual recovery: ${error93 instanceof Error?error93.message:String(error93)}`)}}}if(discardScopeForRecord(record3),await publishAdvisory(directory,record3,terminal.eventId,legacyTransferPending?`${terminal.status==="cancelled"?"cancelled":"failed"}; legacy coder settlement transfer is pending; durable reconciliation will retry`:legacyTransferRequiresManualRecovery?`${terminal.status==="cancelled"?"cancelled":"failed"}; legacy coder settlement requires manual recovery; run /swarm recover for this task (or /swarm reset-session)`:terminal.status==="cancelled"?"cancelled":"failed"),!legacyTransferPending)await clearLegacyCoderSettlementTransferPending(directory,record3.correlationId);return}if(record3.normalizedAgent==="coder"){let settled=await settleCoder(directory,record3,terminal.eventId);if(record3=settled.record,!settled.ok){await publishAdvisory(directory,record3,terminal.eventId,settled.outcome);return}let legacyTransfer=await transferLegacyCoderSettlement(directory,record3);if(legacyTransfer.disposition==="retry_pending")legacyTransferPending=!0;else if(legacyTransfer.disposition==="manual_recovery")legacyTransferRequiresManualRecovery=!0}else if(!isDuplicate&&isBackgroundGateBearingRecord(record3)){if(validateStageBWorkspace(directory,record3).stale){await appendDelegationTransition(directory,record3.correlationId,{status:"stale"}),discardScopeForRecord(record3),await publishAdvisory(directory,record3,terminal.eventId,"stale");return}}if(record3.normalizedAgent==="coder"||isBackgroundGateBearingRecord(record3)){let ingestion=await claimDelegationIngestion(directory,record3.correlationId,{claimantId:terminal.eventId});if(ingestion?.disposition==="claimed"||ingestion?.disposition==="retry"){let applied2=await ingestBackgroundStageBCompletion({directory,record:ingestion.record,result:ingestion.record.result??result,reviewerReceiptOptions:opts.reviewerReceiptOptions}),claimToken=ingestion.record.ingestion?.claimToken;if(!claimToken){await publishAdvisory(directory,record3,terminal.eventId,"ingestion claim token missing");return}let ingestionCommit=await(opts.recordIngestionResult??recordDelegationIngestionResult)(directory,record3.correlationId,claimToken,applied2.ok);if(!ingestionCommit){warn(`[background] ingestion claim for ${record3.correlationId} expired or was fenced before commit; retry remains pending`);return}if(applied2.ok&&(ingestionCommit.status!=="consumed"||ingestionCommit.ingestion?.state!=="consumed"||ingestionCommit.ingestion.claimToken!==claimToken)){warn(`[background] ingestion commit for ${record3.correlationId} did not confirm the exact consumed claim; retry remains pending`);return}if(record3=ingestionCommit,record3=(await findDelegationForCompletion(directory,record3.correlationId))?.record??record3,!applied2.ok){await publishAdvisory(directory,record3,terminal.eventId,applied2.skipped?"skipped (tests not run) — re-dispatch the test gate; reviewer proof preserved; task remains Stage B eligible":legacyTransferPending?"ingestion failed; legacy coder settlement transfer is pending; durable reconciliation will retry":legacyTransferRequiresManualRecovery?"ingestion failed; legacy coder settlement requires manual recovery; run /swarm recover for this task (or /swarm reset-session)":applied2.stale?"stale":"ingestion failed");try{await maintainBackgroundDelegations(directory,{lockTimeoutMs:1000,reason:"ingestion-rejection",skipLegacyCoderSettlementReconciliation:legacyTransferPending,onLegacyCoderSettlementAdvisoryReplaced:notifyLegacyCoderSettlementAdvisoryReplaced})}catch{}return}}else if(ingestion?.disposition==="busy")return;else if(ingestion?.disposition!=="consumed"){await publishAdvisory(directory,record3,terminal.eventId,"ingestion pending");return}}if(record3.normalizedAgent==="docs")try{if(!await completeBackgroundPhaseParticipation({directory,record:record3,resultText:text}))warn(`[background] docs completion ${record3.correlationId} did not satisfy its durable phase-participation binding`)}catch(error93){warn(`[background] docs completion ${record3.correlationId} could not persist phase participation: ${error93 instanceof Error?error93.message:String(error93)}`)}if(record3.normalizedAgent==="reviewer")discardScopeForRecord(record3);if(record3.normalizedAgent==="coder"){if(await releaseCoderReservation(directory,record3,"consumed"),!legacyTransferPending)await clearLegacyCoderSettlementTransferPending(directory,record3.correlationId)}await publishAdvisory(directory,record3,terminal.eventId,record3.normalizedAgent==="coder"?legacyTransferPending?"completed and settled; legacy coder settlement transfer is pending; durable reconciliation will retry":legacyTransferRequiresManualRecovery?"completed and settled; legacy coder settlement requires manual recovery; run /swarm recover for this task (or /swarm reset-session)":"completed and settled":"completed"),log(`[background] trusted completion settled: agent=${record3.normalizedAgent} task=${taskLabel(record3)} parent=${record3.parentSessionId}`)}catch(err){warn(`[background] completion observer error: ${err instanceof Error?err.message:String(err)}`)}},reconcilePending=async(record3)=>{if(replayInProgress)return!1;let terminal=record3.terminalResult;if(!terminal)return!1;replayInProgress=!0;try{await event({event:void 0,trustedTerminal:{record:record3,terminal,result:terminal.result,skipMaintenance:!0}});let refreshed=await findDelegationForCompletion(directory,record3.subagentSessionId);return refreshed?.record?refreshed.record.status==="consumed":!1}finally{replayInProgress=!1}};if(config3.enabled)registerLegacyCoderSettlementReconciler(directory,reconcilePending);return{event,reconcilePending,notifyLegacyCoderSettlementAdvisoryReplaced,prepareAdvisories:async(parentSessionId)=>{if(!config3.enabled||!parentSessionId)return null;let preparationId=`bg-prepare:${cryptoRandomId()}`,entries2=await preparePendingBackgroundAdvisories(directory,parentSessionId,{preparationId});return entries2.length===0?null:{preparationId,eventIds:entries2.map((entry)=>entry.eventId),messages:entries2.map((entry)=>entry.message)}},ackObservedAdvisories:(parentSessionId,observedTexts)=>acknowledgeObservedBackgroundAdvisories(directory,parentSessionId,observedTexts),releaseAdvisories:(parentSessionId,prepared)=>releasePreparedBackgroundAdvisories(directory,parentSessionId,prepared.preparationId,prepared.eventIds)}}async function transferLegacyCoderSettlement(directory,record3){if(!record3.planTaskId)return{disposition:"ok",outcome:"no task-scoped legacy settlement"};let transfer={taskId:record3.planTaskId,transitionId:`coder:${record3.callID}`},detail="unknown transfer failure",lastErrorCode=null;for(let attempt=0;attempt<3;attempt+=1)try{return{disposition:"ok",outcome:await observerInternals.transferCoderSettlementToBackground({directory,taskId:transfer.taskId,transitionId:transfer.transitionId})}}catch(error93){if(lastErrorCode=errorCode2(error93),detail=error93 instanceof Error?error93.message:String(error93),attempt===2||!isRetryableLegacyTransferErrorCode(lastErrorCode))break;await observerInternals.sleep(50*(attempt+1))}if(warn(`[background] legacy coder settlement transfer failed for ${record3.planTaskId}: ${detail}`),!isRetryableLegacyTransferErrorCode(lastErrorCode))return{disposition:"manual_recovery",outcome:"legacy coder settlement requires manual recovery; run /swarm recover for this task (or /swarm reset-session)"};let pending=null;for(let markerAttempt=0;markerAttempt<3;markerAttempt+=1){try{pending=await observerInternals.markLegacyCoderSettlementTransferPending(directory,record3.correlationId,transfer)}catch{pending=null}if(hasExactPendingLegacyTransfer(pending,transfer))break;if(markerAttempt<2)await observerInternals.sleep(50*(markerAttempt+1))}if(hasExactPendingLegacyTransfer(pending,transfer))return{disposition:"retry_pending",outcome:"legacy coder settlement transfer is pending; retrying durable reconciliation"};return{disposition:"manual_recovery",outcome:"legacy coder settlement requires manual recovery; run /swarm recover for this task (or /swarm reset-session)"}}async function releaseCoderReservation(directory,record3,reason){if(!record3.coderReservationId)return;let bound=await bindBackgroundCoderReservation(directory,{reservationId:record3.coderReservationId,parentSessionId:record3.parentSessionId,planTaskId:record3.planTaskId,callID:record3.callID,correlationId:record3.correlationId});if(!bound){warn(`[background] coder reservation ${record3.coderReservationId} could not be bound for ${record3.correlationId}; admission remains fail-closed`);return}if(!await releaseBackgroundCoderReservation(directory,{...bound,generation:record3.generation??1,reason}))warn(`[background] coder reservation ${record3.coderReservationId} could not be released after ${reason}; the next admission will retry reconciliation`)}async function settleCoder(directory,record3,operationId){let context=record3.taskChangeContext;if(!context)return{ok:!1,record:record3,outcome:"stale: no coder baseline"};let claim=await claimCoderSettlement(directory,record3.correlationId,operationId);if(!claim)return{ok:!1,record:record3,outcome:"settlement claim failed"};if(claim.disposition==="settled")return{ok:!0,record:claim.record,outcome:"completed and settled"};if(claim.disposition==="preserved")return{ok:!1,record:claim.record,outcome:"settlement preserved"};if(record3=claim.record,!record3.worktree){let baseline=context.baseline,current=captureWorkspaceSnapshot(directory,{scope:baseline.scope,prHeadSha:baseline.prHeadSha,resolveCurrentPrHeadSha:baseline.prHeadSha!==null}),repositoryDelta=changedFilesSinceSnapshot(directory,baseline),declaredFiles=context.declaredFiles,observedFiles2=repositoryDelta&&declaredFiles&&declaredFiles.length>0?repositoryDelta.filter((file3)=>isInDeclaredScope(file3,declaredFiles,directory)):null,staleReason=!sameProjectRoot(baseline.directory,directory)?"shared-root directory identity changed":!baseline.gitHead||current.gitHead!==baseline.gitHead?"shared-root HEAD changed before coder completion":baseline.prHeadSha!==null&¤t.prHeadSha!==baseline.prHeadSha?"shared-root PR head changed before coder completion":observedFiles2===null?"shared-root coder files could not be attributed to a non-empty declared scope":null;if(staleReason||observedFiles2===null){let preserved2=await updateCoderSettlement(directory,record3.correlationId,{operationId,state:"preserved",observedFiles:null,outcome:{kind:"shared-root",result:"failed",reason:staleReason??"coder attribution failed"}});return await appendDelegationTransition(directory,record3.correlationId,{status:"stale"}),{ok:!1,record:preserved2??record3,outcome:`stale: ${staleReason??"coder attribution failed"}`}}let settled=await updateCoderSettlement(directory,record3.correlationId,{operationId,state:"settled",observedFiles:observedFiles2,outcome:{kind:"shared-root",result:"ready"}});return settled?{ok:!0,record:settled,outcome:"completed and settled"}:{ok:!1,record:record3,outcome:"settlement persistence failed"}}let descriptor=record3.worktree;if(descriptor.callID!==record3.callID||descriptor.parentSessionId!==record3.parentSessionId||descriptor.planTaskId!==record3.planTaskId||!sameProjectRoot(context.baseline.directory,descriptor.worktreePath))return{ok:!1,record:await updateCoderSettlement(directory,record3.correlationId,{operationId,state:"preserved",observedFiles:null,outcome:{kind:"standard-worktree",result:"failed",reason:"worktree recovery identity does not match the dispatch"}})??record3,outcome:"worktree settlement preserved: identity mismatch"};let observedFiles=changedFilesSinceSnapshot(descriptor.worktreePath,context.baseline);if(observedFiles===null)return{ok:!1,record:await updateCoderSettlement(directory,record3.correlationId,{operationId,state:"preserved",observedFiles:null,outcome:{kind:"standard-worktree",result:"failed",reason:"worktree files could not be attributed to the clean baseline"}})??record3,outcome:"worktree settlement preserved: attribution failed"};let dispatch=standardWorktreeByCallID.get(record3.callID)??{callID:descriptor.callID,parentSessionID:descriptor.parentSessionId,taskId:descriptor.taskId,...descriptor.planTaskId?{planTaskId:descriptor.planTaskId}:{},handle:{worktreePath:descriptor.worktreePath,branchName:descriptor.branchName,purpose:"lane",id:descriptor.worktreeId,sessionId:descriptor.worktreeSessionId},mergeStrategy:descriptor.mergeStrategy,laneIndex:descriptor.laneIndex,...descriptor.worktreeDir?{worktree_dir:descriptor.worktreeDir}:{}};standardWorktreeByCallID.delete(record3.callID),awaitingMergeByCallID.set(record3.callID,{callID:record3.callID,parentSessionID:descriptor.parentSessionId,taskId:descriptor.taskId,...descriptor.planTaskId?{planTaskId:descriptor.planTaskId}:{},branch:descriptor.branchName,worktreePath:descriptor.worktreePath,mergeStrategy:descriptor.mergeStrategy,queuedAt:Date.now()});let resume=settlementResume(record3),mergeResult=await finishStandardWorktreeDispatch(directory,dispatch,void 0,record3.callID,{operationId,...resume?{resume}:{},onBeforeMerge:async(provenance)=>{let persisted=await updateCoderSettlement(directory,record3.correlationId,{operationId,state:"settling",sourceHeadAfterCommit:provenance.sourceHead,targetHeadBeforeMerge:provenance.targetHeadBefore,observedFiles});if(!persisted)throw Error("could not persist pre-merge provenance");record3=persisted},onMerged:async(merged)=>{let provenance=merged.provenance??resume,persisted=await updateCoderSettlement(directory,record3.correlationId,{operationId,state:"settled",observedFiles,...provenance?{sourceHeadAfterCommit:provenance.sourceHead,targetHeadBeforeMerge:provenance.targetHeadBefore}:{},outcome:{kind:"standard-worktree",result:provenance&&provenance.sourceHead!==provenance.targetHeadBefore?"merged":"unchanged",sourceHeadAfterCommit:provenance?.sourceHead??null,targetHeadBeforeMerge:provenance?.targetHeadBefore??null,targetHeadAfterMerge:resolveCurrentGitHead(directory)}});if(!persisted)throw Error("could not persist merged settlement");record3=persisted}});if(mergeResult.outcome==="merged")return{ok:!0,record:(await findDelegationForCompletion(directory,record3.correlationId))?.record??record3,outcome:"completed and merged"};if(mergeResult.outcome==="failed"&&mergeResult.stage==="settlement-persist")return{ok:!1,record:record3,outcome:"worktree settlement persistence pending retry"};return{ok:!1,record:await updateCoderSettlement(directory,record3.correlationId,{operationId,state:"preserved",observedFiles,...mergeResult.provenance?{sourceHeadAfterCommit:mergeResult.provenance.sourceHead,targetHeadBeforeMerge:mergeResult.provenance.targetHeadBefore}:{},outcome:{kind:"standard-worktree",result:mergeResult.outcome,reason:mergeResult.message,sourceHeadAfterCommit:mergeResult.provenance?.sourceHead??null,targetHeadBeforeMerge:mergeResult.provenance?.targetHeadBefore??null}})??record3,outcome:`worktree settlement preserved: ${mergeResult.message}`}}function settlementResume(record3){let{coderSettlement:settlement,worktree}=record3;if(settlement?.state!=="settling"||!settlement.operationId||!settlement.sourceHeadAfterCommit||!settlement.targetHeadBeforeMerge||!GIT_OBJECT_ID_PATTERN.test(settlement.sourceHeadAfterCommit)||!GIT_OBJECT_ID_PATTERN.test(settlement.targetHeadBeforeMerge)||!worktree)return;return{operationId:settlement.operationId,sourceHead:settlement.sourceHeadAfterCommit,targetHeadBefore:settlement.targetHeadBeforeMerge,branchName:worktree.branchName,strategy:worktree.mergeStrategy}}async function publishAdvisory(directory,record3,eventId,outcome){let message=`[BACKGROUND COMPLETION ${eventId}] ${record3.normalizedAgent} task ${taskLabel(record3)} ${outcome}.`,input={eventId,parentSessionId:record3.parentSessionId,message},needsCorrection=!message.includes(LEGACY_CODER_SETTLEMENT_PENDING_ADVISORY_MARKER),replacement=(needsCorrection?await replacePendingBackgroundAdvisory(directory,record3.correlationId,input):null)??null,stored=replacement?.advisory??await putPendingBackgroundAdvisory(directory,record3.correlationId,input);if(!stored)return;let session=swarmState.agentSessions.get(record3.parentSessionId);if(session){if(needsCorrection){if(removeQueuedLegacyTransferAdvisory(session.pendingAdvisoryMessages,eventId),replacement?.replacedMessage)removeQueuedAdvisoryMessage(session.pendingAdvisoryMessages,[replacement.replacedMessage])}pushAdvisory(session,stored.message)}}function errorCode2(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}function hasExactPendingLegacyTransfer(record3,transfer){return record3?.legacyCoderSettlementTransfer?.taskId===transfer.taskId&&record3.legacyCoderSettlementTransfer.transitionId===transfer.transitionId}function isRetryableLegacyTransferErrorCode(code){return code!==null&&RETRYABLE_LEGACY_SETTLEMENT_TRANSFER_ERROR_CODES.has(code)}function removeQueuedAdvisoryMessage(queue,messagesToRemove){if(!queue||queue.length===0||messagesToRemove.length===0)return;let remove=new Set(messagesToRemove);for(let index=queue.length-1;index>=0;index-=1)if(remove.has(queue[index]))queue.splice(index,1)}function removeQueuedLegacyTransferAdvisory(queue,eventId){if(!queue||queue.length===0)return;let prefix=`[BACKGROUND COMPLETION ${eventId}]`;for(let index=queue.length-1;index>=0;index-=1){let message=queue[index];if(message?.startsWith(prefix)&&message.includes(LEGACY_CODER_SETTLEMENT_PENDING_ADVISORY_MARKER))queue.splice(index,1)}}function taskLabel(record3){return record3.evidenceTaskId??record3.planTaskId??"unknown"}function discardScopeForRecord(record3){let taskId=record3.evidenceTaskId??record3.planTaskId;if(!taskId)return;if(record3.normalizedAgent==="reviewer")discardReviewerScopeGenerationClaim({parentSessionID:record3.parentSessionId,taskId,reviewerCallID:record3.callID});else if(record3.normalizedAgent==="coder")discardReviewerScopeGenerationForCoderCall({parentSessionID:record3.parentSessionId,taskId,coderCallID:record3.callID})}function digest4(text){return createHash98("sha256").update(text).digest("hex")}function cryptoRandomId(){return createHash98("sha256").update(`${Date.now()}:${Math.random()}`).digest("hex").slice(0,24)}init_pr_subscriptions();init_commands();init_registry2();init_config();init_agent_model();init_bundled_skills();init_constants();init_config();init_package();init_constants();import*as fs156 from"node:fs";import*as path281 from"node:path";var CONFIG_SCHEMA_REF=`https://unpkg.com/opencode-swarm@${package_default.version}/opencode-swarm.schema.json`;function writeSwarmConfigExampleIfNew(projectDirectory){try{let swarmDir=path281.join(projectDirectory,".swarm"),dest=path281.join(swarmDir,"config.example.json");if(fs156.existsSync(dest))return;if(!fs156.existsSync(swarmDir))fs156.mkdirSync(swarmDir,{recursive:!0});let example={$schema:CONFIG_SCHEMA_REF,agents:Object.fromEntries(Object.entries(DEFAULT_MODELS).filter(([name])=>name!=="default").map(([name,model])=>[name,{model,fallback_models:DEFAULT_AGENT_CONFIGS.coder?.fallback_models??["opencode/big-pickle"]}])),max_iterations:5};fs156.writeFileSync(dest,`${JSON.stringify(example,null,2)}
|
|
7187
7187
|
`,"utf-8")}catch{}}init_schema();init_schema();init_core_events();init_delegation_gate();init_utils2();init_injection_budget();init_utils();var FOR_TAG_PATTERN=/^\[FOR:\s*([^\]]+)\]/i;function containsPlanContent(text){if(!text)return!1;let lowerText=text.toLowerCase();return lowerText.includes(".swarm/plan")||lowerText.includes(".swarm/context")||lowerText.includes("swarm/plan.md")||lowerText.includes("swarm/context.md")}function containsKnowledgeContent(text){if(!text)return!1;let lowerText=text.toLowerCase();return lowerText.includes("knowledge")||lowerText.includes("lesson")||lowerText.includes(".swarm/knowledge")||lowerText.includes("swarm knowledge")}function parseForTag(content){let match=content.trim().match(FOR_TAG_PATTERN);if(!match)return null;let tagContent=match[1].trim();if(tagContent.toLowerCase()==="all")return["all"];return tagContent.split(",").map((agent)=>agent.trim().toLowerCase()).filter(Boolean)}function isTargetRoleAllowed(targetRole,allowedAgents){if(allowedAgents.includes("all"))return!0;let normalizedTarget=stripKnownSwarmPrefix(targetRole).toLowerCase();return allowedAgents.some((agent)=>{let normalizedAgent=stripKnownSwarmPrefix(agent).toLowerCase();return normalizedTarget===normalizedAgent})}function shouldNeverFilter(entry){if(entry.role==="system")return!0;if(entry.role==="user"){if(parseDelegationEnvelope(entry.content))return!0}if(entry.role==="assistant"){if(containsPlanContent(entry.content)||containsKnowledgeContent(entry.content))return!0}return!1}function logFilteringMetrics(directory,targetRole,totalEntries,includedEntries){try{appendCoreEventSync(directory,{event:"context_filtered",timestamp:new Date().toISOString(),agentName:targetRole,totalEntries,includedEntries,filteredEntries:totalEntries-includedEntries,estimatedTokensSaved:(totalEntries-includedEntries)*100})}catch(error93){log("[RoleFilter] event append failed",{error:error93 instanceof Error?error93.message:String(error93)})}}function filterByRole(entries2,targetRole,directory,options={}){if(!entries2||entries2.length===0)return[];let filtered=[];for(let entry of entries2){let allowedAgents=parseForTag(entry.content),canFilterTaggedSystem=entry.role==="system"&&options.filterTaggedSystem===!0&&allowedAgents!==null&&allowedAgents.length>0;if(shouldNeverFilter(entry)&&!canFilterTaggedSystem){filtered.push(entry);continue}if(allowedAgents===null){filtered.push(entry);continue}if(isTargetRoleAllowed(targetRole,allowedAgents))filtered.push(entry)}if(directory)logFilteringMetrics(directory,targetRole,entries2.length,filtered.length);return filtered}function createRoleFilterSystemHook(getActiveAgentName){return{"experimental.chat.system.transform":async(input,output)=>{if(!input.sessionID||!Array.isArray(output.system))return;let targetRole=input.agent??getActiveAgentName(input.sessionID);if(!targetRole)return;let entries2=output.system.map((content)=>({role:"system",content})),kept=filterByRole(entries2,targetRole,void 0,{filterTaggedSystem:!0}).map(({content})=>content),keptRemaining=new Map;for(let content of kept)keptRemaining.set(content,(keptRemaining.get(content)??0)+1);let removedTokens=0;for(let{content}of entries2){let remaining=keptRemaining.get(content)??0;if(remaining>0)keptRemaining.set(content,remaining-1);else removedTokens+=estimateTokens(content)}if(removedTokens>0)deductProducerEmission(input.sessionID,"system-enhancer",removedTokens,{expectedGeneration:input.expectedGeneration});output.system.length=0;for(let content of kept)output.system.push(content)}}}import*as fs159 from"node:fs";import*as path284 from"node:path";import*as fs158 from"node:fs";import*as path283 from"node:path";import*as crypto13 from"node:crypto";import*as fs157 from"node:fs";import*as path282 from"node:path";var _internals222={readFileSync:fs157.readFileSync,writeFileSync:fs157.writeFileSync,mkdirSync:fs157.mkdirSync,renameSync:fs157.renameSync,existsSync:fs157.existsSync,statSync:fs157.statSync,createHash:crypto13.createHash.bind(crypto13)};function computeContentHash3(content){return _internals222.createHash("sha256").update(content,"utf-8").digest("hex")}function createEmptyContextMap(){return{schema_version:1,generated_at:new Date().toISOString(),repo_fingerprint:"",files:{},task_history:{},decisions:[]}}function loadContextMap(directory){let filePath=path282.join(directory,".swarm","context-map.json");try{if(!_internals222.existsSync(filePath))return null;let raw=_internals222.readFileSync(filePath,"utf-8"),parsed=JSON.parse(raw);if(typeof parsed!=="object"||parsed===null||parsed.schema_version!==1||!Array.isArray(parsed.decisions)||typeof parsed.files!=="object"||parsed.files===null||Array.isArray(parsed.files)||typeof parsed.task_history!=="object"||parsed.task_history===null||Array.isArray(parsed.task_history))return null;return parsed}catch{return null}}function saveContextMap(map3,directory){let swarmDir=path282.join(directory,".swarm"),tmpPath=path282.join(swarmDir,"context-map.tmp"),finalPath=path282.join(swarmDir,"context-map.json");_internals222.mkdirSync(swarmDir,{recursive:!0});let updated={...map3,generated_at:new Date().toISOString()},json3=JSON.stringify(updated,null,2);_internals222.writeFileSync(tmpPath,json3,"utf-8"),_internals222.renameSync(tmpPath,finalPath)}function appendTaskHistory(map3,summary){return{...map3,task_history:{...map3.task_history,[summary.task_id]:summary}}}function appendDecision(map3,decision){return{...map3,decisions:[...map3.decisions,decision]}}var EXTENSION_LANGUAGE_MAP={".ts":"typescript",".tsx":"typescript",".js":"javascript",".jsx":"javascript",".mjs":"javascript",".py":"python",".rs":"rust",".go":"go",".json":"json",".md":"markdown",".yaml":"yaml",".yml":"yaml",".css":"css",".scss":"scss",".html":"html",".sh":"shell",".bash":"shell",".ps1":"powershell"};function detectLanguage(filePath){let ext=path283.extname(filePath).toLowerCase();return EXTENSION_LANGUAGE_MAP[ext]}var RE_EXPORT_NAMED=/export\s+(?:function|class|interface|type|const|let|var|enum)\s+(\w+)/g,RE_EXPORT_BRACE=/export\s*\{\s*([\w,\s]+)\s*\}/g,RE_IMPORT_FROM=/import\s+.*?\s+from\s+['"](.+?)['"]/g,RE_IMPORT_REQUIRE=/require\(\s*['"](.+?)['"]\s*\)/g,RE_FIRST_COMMENT=/\/\*(.+?)\*\//s,MAX_KEY_SYMBOLS=10,MAX_PURPOSE_LENGTH=200;function extractFileSummary(filePath,content,absolutePath2,existingEntry){let contentHash=computeContentHash3(content),language=detectLanguage(filePath),exportsList=extractExports(content),importsList=extractImports6(content),purpose=extractPurpose(content),keySymbols=exportsList.slice(0,MAX_KEY_SYMBOLS),mtimeMs=0;if(absolutePath2)try{mtimeMs=fs158.statSync(absolutePath2).mtimeMs}catch{}let base={path:filePath,content_hash:contentHash,mtime_ms:mtimeMs,language,purpose,exports:exportsList.length>0?exportsList:void 0,imports:importsList.length>0?importsList:void 0,key_symbols:keySymbols.length>0?keySymbols:void 0,summary:purpose};if(existingEntry)return{...base,invariants:existingEntry.invariants,risks:existingEntry.risks,tests:existingEntry.tests,last_seen_task_ids:existingEntry.last_seen_task_ids};return base}function isFileStale(entry,currentContent){let currentHash=computeContentHash3(currentContent);return entry.content_hash!==currentHash}function extractExports(content){let symbols2=[],namedRe=new RegExp(RE_EXPORT_NAMED.source,"g"),match;match=namedRe.exec(content);while(match!==null)symbols2.push(match[1]),match=namedRe.exec(content);let braceRe=new RegExp(RE_EXPORT_BRACE.source,"g");match=braceRe.exec(content);while(match!==null){let list=match[1];for(let name of list.split(",")){let trimmed=name.trim();if(trimmed)symbols2.push(trimmed)}match=braceRe.exec(content)}return symbols2}function extractImports6(content){let specifiers=[],fromRe=new RegExp(RE_IMPORT_FROM.source,"g"),match;match=fromRe.exec(content);while(match!==null)specifiers.push(match[1]),match=fromRe.exec(content);let requireRe=new RegExp(RE_IMPORT_REQUIRE.source,"g");match=requireRe.exec(content);while(match!==null)specifiers.push(match[1]),match=requireRe.exec(content);return specifiers}function extractPurpose(content){let match=RE_FIRST_COMMENT.exec(content);if(!match)return"No summary available";let body=match[1].split(`
|
|
7188
7188
|
`).map((line)=>line.replace(/^\s*\*\s?/,"").trim()).join(" ").replace(/\s+/g," ").trim();if(body.length>MAX_PURPOSE_LENGTH)body=`${body.substring(0,MAX_PURPOSE_LENGTH)}...`;return body||"No summary available"}var MAX_CONTEXT_MD_DECISIONS=50,MAX_CONTEXT_MD_CONTENT_CHARS=1e6;function allocateDecisionId(decisions){let max=0n;for(let entry of decisions){if(typeof entry?.id!=="string")continue;let match=/^A(\d+)$/.exec(entry.id);if(!match)continue;let value=BigInt(match[1]);if(value>max)max=value}return`A${(max+1n).toString()}`}function isArchitectRole(role){return role==="architect"||role.endsWith("_architect")}function extractContextDecisionsFromContextMd(directory,options){if(options?.agent_role!==void 0&&!isArchitectRole(options.agent_role))return[];try{let contextMdPath=path284.join(directory,".swarm","context.md");if(!_internals223.existsSync(contextMdPath))return[];let content=_internals223.readFileSync(contextMdPath,"utf-8"),bounded=content.length>MAX_CONTEXT_MD_CONTENT_CHARS?content.slice(content.length-MAX_CONTEXT_MD_CONTENT_CHARS):content,extracted=extractContextDecisions(bounded),decisions=[];for(let entry of extracted){let separatorIndex=entry.text.indexOf(": "),decision=separatorIndex===-1?entry.text:entry.text.slice(0,separatorIndex),rationale=separatorIndex===-1?"":entry.text.slice(separatorIndex+2);if(decision.trim()===""||/^[\s✅]*$/.test(decision))continue;decisions.push({decision:sanitizeContextText(decision),rationale:sanitizeContextText(rationale),...entry.phase===null?{}:{phase:entry.phase}})}if(decisions.length>MAX_CONTEXT_MD_DECISIONS)return decisions.slice(decisions.length-MAX_CONTEXT_MD_DECISIONS);return decisions}catch{return[]}}var MAX_PERSISTED_DECISIONS=200;function deriveFinalStatus(params){if(params.rejection_reasons&¶ms.rejection_reasons.length>0)return"rejected";switch(params.final_status){case"completed":return"approved";case"failed":return"rejected";case"blocked":return"blocked";case"cancelled":return"rejected"}}function readFileContent(absolutePath2){try{if(!_internals223.existsSync(absolutePath2))return null;return _internals223.readFileSync(absolutePath2,"utf-8")}catch{return null}}function refreshFileEntry(relativePath2,absolutePath2,existingEntry){let content=readFileContent(absolutePath2);if(content===null)return null;return _internals223.extractFileSummary(relativePath2,content,absolutePath2,existingEntry)}var _internals223={loadContextMap,saveContextMap,createEmptyContextMap,extractFileSummary,existsSync:fs159.existsSync,readFileSync:fs159.readFileSync,readdirSync:fs159.readdirSync,realpathSync:fs159.realpathSync,appendTaskHistory,appendDecision};function extractEvidenceFindings(taskId,directory){let result={rejection_reasons:[],review_findings:[]};try{let evidenceDir=path284.join(directory,".swarm","evidence",taskId);if(!_internals223.existsSync(evidenceDir))return result;let evidenceFiles=_internals223.readdirSync(evidenceDir),targetFiles=["evidence.json","reviewer.json","test-engineer.json","test_engineer.json"];for(let fileName of evidenceFiles){if(!targetFiles.includes(fileName))continue;let filePath=path284.join(evidenceDir,fileName),content=readFileContent(filePath);if(content===null)continue;try{let parsed=JSON.parse(content);if(typeof parsed!=="object"||parsed===null||Array.isArray(parsed))continue;let obj=parsed;if(Array.isArray(obj.entries))for(let entry of obj.entries){if(typeof entry!=="object"||entry===null||Array.isArray(entry))continue;let entryObj=entry,entryType=String(entryObj.type??"").toLowerCase(),isActionable=entryType==="review"||entryType==="test"||entryType==="reviewer"||entryType==="test_engineer"||entryType==="test-engineer";if(isActionable&&typeof entryObj.verdict==="string"){let normalizedVerdict=String(entryObj.verdict).toLowerCase();if(normalizedVerdict==="rejected"||normalizedVerdict==="fail"||normalizedVerdict==="concerns")result.rejection_reasons.push(`[${fileName.replace(".json","")}] ${entryObj.verdict}`)}if(isActionable){let entryIssues=entryObj.issues||entryObj.findings||[];if(Array.isArray(entryIssues))for(let issue3 of entryIssues){let issueText=typeof issue3==="object"&&issue3!==null?String(issue3.message||issue3.detail||issue3.description||""):String(issue3);if(issueText)result.review_findings.push(issueText)}let entryFailures=entryObj.failures;if(Array.isArray(entryFailures))for(let failure of entryFailures){let failureText=typeof failure==="object"&&failure!==null?String(failure.message||failure.detail||String(failure)):String(failure);if(failureText)result.review_findings.push(failureText)}}}else{if(typeof obj.verdict==="string"){let normalizedVerdict=String(obj.verdict).toLowerCase();if(normalizedVerdict==="rejected"||normalizedVerdict==="fail"||normalizedVerdict==="concerns")result.rejection_reasons.push(`[${fileName.replace(".json","")}] ${obj.verdict}`)}if(Array.isArray(obj.issues))for(let issue3 of obj.issues){let issueText=typeof issue3==="object"&&issue3!==null?String(issue3.message||issue3.detail||issue3.description||""):String(issue3);if(issueText)result.review_findings.push(issueText)}if(Array.isArray(obj.findings)){for(let finding of obj.findings)if(typeof finding==="object"&&finding!==null){let findingText=String(finding.message||finding.detail||finding.description||"");if(findingText)result.review_findings.push(findingText)}}}}catch{}}}catch{}return result}function updateContextMapAfterAgent(params){try{let map3=_internals223.loadContextMap(params.directory);if(map3===null)map3=_internals223.createEmptyContextMap();let root=path284.resolve(params.directory),updatedFiles={...map3.files},validFiles=[],realRoot=_internals223.realpathSync(root);for(let filePath of params.files_touched)try{let resolved=path284.resolve(root,filePath),realResolved=_internals223.realpathSync(resolved),relative66=path284.relative(realRoot,realResolved);if(relative66.startsWith("..")||path284.isAbsolute(relative66))continue;let normalizedRelative=relative66.replace(/\\/g,"/"),existingEntry=map3.files[normalizedRelative],refreshed=refreshFileEntry(normalizedRelative,resolved,existingEntry);if(refreshed!==null)updatedFiles[normalizedRelative]=refreshed;validFiles.push(normalizedRelative)}catch{}map3={...map3,files:updatedFiles};let evidenceFindings=extractEvidenceFindings(params.task_id,params.directory),rejectionReasons=params.rejection_reasons??[],reviewFindings=params.review_findings??[],mergedRejectionReasons=[...rejectionReasons,...evidenceFindings.rejection_reasons.filter((r)=>!rejectionReasons.includes(r))],mergedReviewFindings=[...reviewFindings,...evidenceFindings.review_findings.filter((f)=>!reviewFindings.includes(f))],reviewerFindings=[...mergedRejectionReasons.map((r)=>`[rejection] ${r}`),...mergedReviewFindings],taskSummary={task_id:params.task_id,goal:params.task_goal,files_touched:validFiles,implementation_summary:params.implementation_summary,reviewer_findings:reviewerFindings.length>0?reviewerFindings:void 0,final_status:mergedRejectionReasons.length>0?"rejected":deriveFinalStatus(params)};if(map3=_internals223.appendTaskHistory(map3,taskSummary),params.decisions&¶ms.decisions.length>0){let batch=params.decisions.filter((entry)=>(entry.decision??"").trim()!==""),existingTexts=new Set(map3.decisions.map((entry)=>String(entry?.decision??"").trim())),nextSuffix=BigInt(allocateDecisionId(map3.decisions).slice(1));for(let entry of batch){let text=String(entry.decision).trim();if(existingTexts.has(text))continue;existingTexts.add(text);let decision={id:`A${nextSuffix.toString()}`,decision:entry.decision,rationale:entry.rationale,timestamp:new Date().toISOString(),task_id:params.task_id,...entry.phase===void 0?{}:{phase:entry.phase}};map3=_internals223.appendDecision(map3,decision),nextSuffix+=1n}}if(map3.decisions.length>MAX_PERSISTED_DECISIONS)map3={...map3,decisions:map3.decisions.slice(map3.decisions.length-MAX_PERSISTED_DECISIONS)};return _internals223.saveContextMap(map3,params.directory),map3}catch{try{return _internals223.loadContextMap(params.directory)??_internals223.createEmptyContextMap()}catch{return _internals223.createEmptyContextMap()}}}init_dashboard();init_group_commit_writer();init_observability_event_store();init_project_db();init_spawn_circuit();init_coordination_store();init_logger();var TOKEN_BUCKET_NAMESPACE="dispatch.token-bucket",TOKEN_BUCKET_ENTITY_KEY="project",buckets=new Map;function refill(bucket,ratePerSecond,capacity,now2){if(now2<bucket.lastRefillMs)bucket.lastRefillMs=now2;let elapsedSeconds=(now2-bucket.lastRefillMs)/1000;if(elapsedSeconds>0&&ratePerSecond>0)bucket.level=Math.min(capacity,bucket.level+elapsedSeconds*ratePerSecond),bucket.lastRefillMs=now2}function persist(directory,bucket){try{let payload={level:bucket.level,lastRefillMs:bucket.lastRefillMs};transitionCoordinationState(directory,{namespace:TOKEN_BUCKET_NAMESPACE,entityKey:TOKEN_BUCKET_ENTITY_KEY,generation:1,status:"active",payload:JSON.stringify(payload)})}catch(err){_internals224.onPersistError(err)}}function hydrate(directory,capacity){let existing=buckets.get(directory);if(existing)return existing;let bucket={level:capacity,lastRefillMs:_internals224.now(),hydrated:!0};try{let row=_internals224.readState(directory);if(row){let parsed=JSON.parse(row.payload);if(typeof parsed.level==="number"&&Number.isFinite(parsed.level)){let nowMs3=_internals224.now();bucket={level:Math.min(capacity,Math.max(0,parsed.level)),lastRefillMs:typeof parsed.lastRefillMs==="number"&&Number.isFinite(parsed.lastRefillMs)?Math.min(parsed.lastRefillMs,nowMs3):nowMs3,hydrated:!0}}}}catch(err){_internals224.onPersistError(err)}return buckets.set(directory,bucket),bucket}async function acquireDispatchToken(input){let rate=input.ratePerSecond;if(!(rate>0))return;let capacity=Math.max(1,input.burstCapacity),bucket=hydrate(input.directory,capacity),waited=!1;for(;;){let now2=_internals224.now();if(refill(bucket,rate,capacity,now2),bucket.level>=1){if(bucket.level-=1,waited)persist(input.directory,bucket);return}waited=!0;let waitMs=Math.max(1,(1-bucket.level)/rate*1000);await _internals224.sleep(Math.min(waitMs,1000))}}var _internals224={now:()=>Date.now(),sleep:(ms)=>new Promise((resolve109)=>setTimeout(resolve109,ms)),readState:(directory)=>getCoordinationState(directory,TOKEN_BUCKET_NAMESPACE,TOKEN_BUCKET_ENTITY_KEY),onPersistError:(err)=>{if(process.env.DEBUG_SWARM)log("[dispatch.token-bucket] persist failed",err)}};init_model_dispatch_fallback();init_provider_error_classification();init_ephemeral_agent_dispatcher();function parseRequestedModel(modelId){if(modelId==="configured")return;let parsed=parseModelString2(modelId);if(!parsed)throw Error("explicit evaluation models must use provider/model syntax");return parsed}function resolveEvaluationAgentName(agents,logicalName,preferredSwarm){let names=agents.map((agent)=>agent.name);if(preferredSwarm){let preferred=`${preferredSwarm}_${logicalName}`;if(names.includes(preferred))return preferred;throw Error(`preferred swarm ${preferredSwarm} does not provide evaluation agent ${logicalName}`)}if(names.includes(logicalName))return logicalName;let prefixed=names.filter((name)=>name.endsWith(`_${logicalName}`)).sort((left,right)=>left.localeCompare(right));if(prefixed.length===1)return prefixed[0];if(prefixed.length>1)throw Error(`multiple swarms provide ${logicalName}; preferredSwarm is required`);throw Error(`evaluation agent ${logicalName} is not registered`)}var _internals225=Object.defineProperties({},{boundedAbort:{enumerable:!0,get:()=>_internals176.boundedAbort,set:(value)=>{_internals176.boundedAbort=value}},boundedDelete:{enumerable:!0,get:()=>_internals176.boundedDelete,set:(value)=>{_internals176.boundedDelete=value}},log:{enumerable:!0,get:()=>_internals176.log,set:(value)=>{_internals176.log=value}}});async function awaitWithAbort2(promise3,signal2){if(signal2.aborted)throw Error("evaluation dispatch aborted");return new Promise((resolve109,reject)=>{let onAbort=()=>reject(Error("evaluation dispatch aborted"));signal2.addEventListener("abort",onAbort,{once:!0}),promise3.then(resolve109,reject).finally(()=>{signal2.removeEventListener("abort",onAbort)})})}function createEvaluationModelDispatcher(client,pricing){return async(request)=>{let startedAt=Date.now();if(request.abortSignal?.aborted)return{status:"cancelled",modelId:request.modelId,text:"",durationMs:0};let resolvedAgentName,controller=new AbortController,timedOut=!1,abortListener=()=>controller.abort();request.abortSignal?.addEventListener("abort",abortListener,{once:!0});let timeoutHandle=setTimeout(()=>{timedOut=!0,controller.abort()},request.timeoutMs);try{let requestedModel=parseRequestedModel(request.modelId),agentsResult=await awaitWithAbort2(client.app.agents({query:{directory:request.sessionDirectory},signal:controller.signal}),controller.signal);if(!agentsResult.data)throw Error(`Failed to list registered evaluation agents: ${JSON.stringify(agentsResult.error)}`);resolvedAgentName=resolveEvaluationAgentName(agentsResult.data,request.agentName,request.preferredSwarm);let result=(await dispatchWithModelFallback({dispatch:async(_model,context)=>{let result2=await dispatchEphemeralAgent({client,directory:request.sessionDirectory,parentSessionId:request.parentSessionId,agentName:resolvedAgentName,model:requestedModel,...request.system===void 0?{}:{system:request.system},prompt:request.prompt,readOnlyTools:DEFAULT_READ_ONLY_TOOLS,title:`evaluation gate (${resolvedAgentName})`,timeoutMs:context.remainingMs??request.timeoutMs,abortSignal:controller.signal,pricing});if(result2.status==="completed")return result2;if(result2.status==="timeout")timedOut=!0;throw Error(result2.error??`evaluation dispatch ${result2.status}`)},classify:(error93)=>{let message=error93 instanceof Error?error93.message:String(error93);return isTransientProviderError(message)?"transient":"permanent"},maxTransientRetriesPerModel:2,backoffMs:()=>0,maxAttempts:3,deadlineAtMs:startedAt+request.timeoutMs})).result;return{status:"completed",modelId:result.modelId??request.modelId,agentName:resolvedAgentName,text:result.text,durationMs:Date.now()-startedAt,promptBytes:result.promptBytes,responseBytes:result.responseBytes,costFields:result.costFields}}catch(error93){let cancelled=request.abortSignal?.aborted===!0,msg=error93 instanceof Error?error93.message:String(error93),quotaMessage=isQuotaError(msg)?`${msg} (model quota/usage limit; retried the same model 2 time(s) — not substituted, to preserve benchmark attribution)`:msg;return{status:cancelled?"cancelled":timedOut?"timeout":"error",modelId:request.modelId,agentName:resolvedAgentName,text:"",durationMs:Date.now()-startedAt,error:quotaMessage}}finally{clearTimeout(timeoutHandle),request.abortSignal?.removeEventListener("abort",abortListener),controller.abort()}}}init_action_circuit();init_action_identity();init_invocation_failure();init_constants();init_schema();init_logger();init_oversight();init_state3();function configCadence(config3){let oversight=config3.full_auto?.oversight;return{everyToolCalls:oversight?.every_tool_calls??25,everyArchitectTurns:oversight?.every_architect_turns??5,everyMinutes:oversight?.every_minutes??20}}function denialLimits(config3){return{maxConsecutive:config3.full_auto?.denials?.max_consecutive??3,maxTotal:config3.full_auto?.denials?.max_total??20}}function evaluateFullAutoCadence(state2,config3,now2=Date.now()){let triggers=[],cadence=configCadence(config3),denials=denialLimits(config3);if(cadence.everyToolCalls>0&&state2.counters.toolCalls>0&&state2.counters.toolCalls%cadence.everyToolCalls===0)triggers.push({kind:"tool_calls",threshold:cadence.everyToolCalls});if(cadence.everyArchitectTurns>0&&state2.counters.architectTurns>0&&state2.counters.architectTurns%cadence.everyArchitectTurns===0)triggers.push({kind:"architect_turns",threshold:cadence.everyArchitectTurns});if(cadence.everyMinutes>0&&state2.lastOversightAt){let lastTs=Date.parse(state2.lastOversightAt);if(Number.isFinite(lastTs)){let elapsedMinutes=(now2-lastTs)/60000;if(elapsedMinutes>=cadence.everyMinutes)triggers.push({kind:"minutes",threshold:cadence.everyMinutes,elapsedMinutes})}}if(state2.counters.consecutiveNoProgressTurns>=3)triggers.push({kind:"consecutive_no_progress",threshold:3});if(denials.maxConsecutive>1&&state2.denialCounters.consecutive>=denials.maxConsecutive-1&&state2.denialCounters.consecutive<denials.maxConsecutive)triggers.push({kind:"denials_near_limit",consecutive:state2.denialCounters.consecutive,max:denials.maxConsecutive});return{shouldEscalate:triggers.length>0,triggers}}function tickAndEvaluate(directory,sessionID,counter,config3){let before=loadFullAutoRunState(directory,sessionID);if(!before||before.status!=="running")return;let updated=incrementFullAutoCounter(directory,sessionID,counter);if(!updated)return;return evaluateFullAutoCadence(updated,config3)}var cadenceDispatchInFlight=new Set;function resolveOversightAgentName2(activeAgent){if(!activeAgent)return"critic_oversight";if(stripKnownSwarmPrefix(activeAgent)!==ORCHESTRATOR_NAME)return"critic_oversight";let lastIdx=activeAgent.toLowerCase().lastIndexOf("architect");if(lastIdx>0)return`${activeAgent.slice(0,lastIdx)}critic_oversight`;return"critic_oversight"}function tickAndMaybeDispatchCadence(directory,sessionID,counter,config3,options={}){let decision=tickAndEvaluate(directory,sessionID,counter,config3);if(!decision||!decision.shouldEscalate)return decision;if(cadenceDispatchInFlight.has(sessionID))return decision;let runState=loadFullAutoRunState(directory,sessionID);if(!runState||runState.status!=="running")return decision;let oversightAgentName=resolveOversightAgentName2(options.activeAgent),criticModel=config3.full_auto?.critic_model??config3.agents?.critic?.model??"opencode/big-pickle";return cadenceDispatchInFlight.add(sessionID),(options.dispatch??dispatchFullAutoOversight)({directory,sessionID,trigger:`cadence:${decision.triggers.map((t)=>t.kind).join(",")}`,triggerSource:"cadence",phase:runState.currentPhase,taskID:runState.currentTaskID??void 0,planID:runState.planID,actionContext:{counters:runState.counters,denialCounters:runState.denialCounters,triggers:decision.triggers},criticModel,oversightAgentName,fullAutoConfig:{fail_closed:config3.full_auto?.fail_closed!==!1,max_dispatch_retries:config3.full_auto?.oversight?.max_dispatch_retries??2,max_consecutive_dispatch_failures:config3.full_auto?.oversight?.max_consecutive_dispatch_failures??3,total_timeout_ms:config3.full_auto?.oversight?.total_timeout_ms??120000}}).catch((err)=>{error48(`[full-auto/cadence] dispatch threw past dispatcher's own fail-closed branches: ${err instanceof Error?err.message:String(err)}`)}).finally(()=>{cadenceDispatchInFlight.delete(sessionID)}),decision}init_recovery2();init_severe_result();init_state3();init_task_file();init_invocation_failure();init_state2();init_utils();init_realtime_learning_nudge();init_utils2();import*as nodePath from"node:path";var MAX_TOOL_FAILURE_REASONS=5,MAX_TOOL_FAILURE_REASON_LENGTH=200;function extractFailureReason(error93){let raw;if(error93 instanceof Error)raw=error93.message;else if(typeof error93==="string")raw=error93;else if(error93&&typeof error93==="object"){let maybeMessage=error93.message;raw=typeof maybeMessage==="string"?maybeMessage:void 0}if(!raw)return;let trimmed=sanitizeFailureEvidenceDisplay(raw).trim();if(!trimmed)return;return trimmed.length>MAX_TOOL_FAILURE_REASON_LENGTH?`${trimmed.slice(0,MAX_TOOL_FAILURE_REASON_LENGTH)}...`:trimmed}function recordFailureReason(aggregate,reason){if(!aggregate.failureReasons)aggregate.failureReasons=[];if(aggregate.failureReasons.includes(reason))return;if(aggregate.failureReasons.length>=MAX_TOOL_FAILURE_REASONS)return;aggregate.failureReasons.push(reason)}function createAgentActivityHooks(config3,directory){if(config3.hooks?.agent_activity===!1)return{toolBefore:async()=>{},toolAfter:async()=>{}};return{toolBefore:async(input)=>{swarmState.activeToolCalls.set(input.callID,{tool:input.tool,sessionID:input.sessionID,callID:input.callID,startTime:Date.now()})},toolAfter:async(input,output)=>{let entry=swarmState.activeToolCalls.get(input.callID);if(!entry)return;swarmState.activeToolCalls.delete(input.callID);let duration5=Date.now()-entry.startTime,success3=!((typeof output.success==="boolean"?output.success:void 0)===!1||!!output.error),key2=entry.tool,existing=swarmState.toolAggregates.get(key2)??{tool:key2,count:0,successCount:0,failureCount:0,totalDuration:0};if(existing.count++,success3)existing.successCount++;else{existing.failureCount++;let reason=extractFailureReason(output.error);if(reason)recordFailureReason(existing,reason)}if(existing.totalDuration+=duration5,swarmState.toolAggregates.set(key2,existing),recordRealtimeLearningToolCall(entry.sessionID),swarmState.pendingEvents++,swarmState.pendingEvents>=20)flushActivityToFile(directory).catch((err)=>warn("Agent activity flush trigger failed:",err))}}}var flushPromise=null;async function flushActivityToFile(directory){if(flushPromise)return flushPromise=flushPromise.then(()=>doFlush(directory)).catch((err)=>{warn("Queued agent activity flush failed:",err)}),flushPromise;flushPromise=doFlush(directory);try{await flushPromise}finally{flushPromise=null}}async function doFlush(directory){try{let existing=await readSwarmFileAsync(directory,"context.md")??"",activitySection=renderActivitySection(),updated=replaceOrAppendSection(existing,"## Agent Activity",activitySection),flushedCount=swarmState.pendingEvents,path285=nodePath.join(directory,".swarm","context.md");await atomicWriteFile(path285,updated),swarmState.pendingEvents=Math.max(0,swarmState.pendingEvents-flushedCount)}catch(error93){warn("Agent activity flush failed:",error93)}}function renderActivitySection(){let lines=["## Agent Activity",""];if(swarmState.toolAggregates.size===0)return lines.push("No tool activity recorded yet."),lines.join(`
|
|
7189
7189
|
`);lines.push("| Tool | Calls | Success | Failed | Avg Duration |"),lines.push("|------|-------|---------|--------|--------------|");let sorted2=[...swarmState.toolAggregates.values()].sort((a,b)=>b.count-a.count);for(let agg of sorted2){let avgDuration=agg.count>0?Math.round(agg.totalDuration/agg.count):0;lines.push(`| ${agg.tool} | ${agg.count} | ${agg.successCount} | ${agg.failureCount} | ${avgDuration}ms |`)}return lines.join(`
|
|
@@ -7377,7 +7377,7 @@ ${activitySection}`;break}if(contextSummary.length>maxChars)return`${contextSumm
|
|
|
7377
7377
|
`).length,byteSize=Buffer.byteLength(output,"utf8"),formattedSize=formatBytes2(byteSize),headerLine=`[SUMMARY ${summaryId}] ${formattedSize} | ${contentType} | ${lineCount} lines`,footerLine=`→ Use /swarm retrieve ${summaryId} for full content`,overhead=Buffer.byteLength(headerLine,"utf8")+1+Buffer.byteLength(footerLine,"utf8")+1,maxPreviewChars=maxSummaryChars-overhead,preview;switch(contentType){case"json":{try{let parsed=JSON.parse(output.trim());if(Array.isArray(parsed))preview=summarizeJsonArray(parsed);else if(typeof parsed==="object"&&parsed!==null)preview=summarizeJsonObject(parsed);else preview=summarizeText(output,3)}catch{preview=summarizeText(output,3)}break}case"code":{preview=summarizeCode(output);break}case"text":{preview=summarizeText(output,5);break}case"binary":{preview=`[Binary content - ${formattedSize}]`;break}default:preview=summarizeText(output,5)}let previewBytes=Buffer.byteLength(preview,"utf8");if(previewBytes>maxPreviewChars){let marker=`[... ${previewBytes} bytes total, truncated ...]`;if(Buffer.byteLength(marker,"utf8")>maxPreviewChars)marker="...";let{text:kept}=truncateToBytes(preview,Math.max(0,maxPreviewChars-Buffer.byteLength(marker,"utf8")));preview=`${kept}${marker}`}return`${headerLine}
|
|
7378
7378
|
${preview}
|
|
7379
7379
|
${footerLine}`}init_utils();var MAX_ALLOCATION_ATTEMPTS=8,_internals237={allocateSummaryId,storeSummary};function createToolSummarizerHook(config3,directory){if(config3.enabled===!1)return async()=>{};return async(input,output)=>{if(typeof output.output!=="string"||output.output.length===0)return;let exemptTools=config3.exempt_tools??[];if(SUMMARIZER_EXEMPT_TOOL_NAMES.includes(input.tool)||exemptTools.includes(input.tool))return;if(!shouldSummarize(output.output,config3.threshold_bytes))return;for(let attempt=1;attempt<=MAX_ALLOCATION_ATTEMPTS;attempt+=1)try{let summaryId=_internals237.allocateSummaryId(directory),summaryText=createSummary(output.output,input.tool,summaryId,config3.max_summary_chars);await _internals237.storeSummary(directory,summaryId,output.output,summaryText,config3.max_stored_bytes),output.output=summaryText;return}catch(error93){if(error93 instanceof SummaryIdCollisionError&&attempt<MAX_ALLOCATION_ATTEMPTS)continue;warn(`Tool output summarization failed: ${error93 instanceof Error?error93.message:String(error93)}`);return}}}init_utils2();init_schema();init_core_events();init_engine2();init_runtime3();init_state2();init_logger();init_normalize_tool_name();var MAX_TRACKED_SESSIONS8=256,COOLDOWN_MS=60000;function injectAutoReviewAdvisory(injectAdvisory,sessionID,message){try{injectAdvisory(sessionID,message)}catch(error93){warn(`[auto-review] advisory injection failed: ${error93 instanceof Error?error93.message:String(error93)}`)}}function evictCooldownMap(lastDispatchBySession){while(lastDispatchBySession.size>MAX_TRACKED_SESSIONS8){let firstKey=lastDispatchBySession.keys().next().value;if(firstKey===void 0)break;lastDispatchBySession.delete(firstKey)}}function writeAutoReviewEvent(directory,event){try{appendCoreEventSync(directory,{...event})}catch(error93){warn(`[auto-review] event write failed: ${error93 instanceof Error?error93.message:String(error93)}`)}}async function runAutoReview(input){if(!input.dispatcher){writeAutoReviewEvent(input.directory,{type:"auto_review",timestamp:new Date().toISOString(),session_id:input.sessionID,trigger:"task_completion",task_id:input.taskId,verdict:"error",detail:"review runtime unavailable",model_calls:0});return}try{let agents=resolveReviewAgentNames(input.generatedAgentNames??swarmState.generatedAgentNames,input.activeAgentName),result=await _internals238.runReviewEngine({directory:input.directory,sessionID:input.sessionID,trigger:"task_completion",selector:{kind:"working-tree"},config:input.config,dispatcher:input.dispatcher,reviewerAgent:agents.reviewer,validatorAgent:agents.validator,reviewerFallbackModels:resolveReviewFallbackModels(agents.reviewer,input.agentModelRegistry),validatorModel:optionalModelOverride(input.config.validation_model),validatorFallbackModels:resolveReviewFallbackModels(agents.validator,input.agentModelRegistry),injectAdvisory:input.injectAdvisory});return writeAutoReviewEvent(input.directory,{type:"auto_review",timestamp:new Date().toISOString(),session_id:input.sessionID,trigger:"task_completion",task_id:input.taskId,verdict:result.reviewVerdict??result.status,detail:result.message,receipt_path:result.receiptPath,evidence_path:result.evidencePath,scope_hash:result.scopeHash,model_calls:result.modelCalls}),result}catch(error93){warn(`[auto-review] run failed: ${error93 instanceof Error?error93.message:String(error93)}`),writeAutoReviewEvent(input.directory,{type:"auto_review",timestamp:new Date().toISOString(),session_id:input.sessionID,trigger:"task_completion",task_id:input.taskId,verdict:"error",detail:error93 instanceof Error?error93.message:String(error93),model_calls:0});return}}function createAutoReviewHook(options){let config3=AutoReviewConfigSchema.parse(options.config),inFlightSessions=new Set,lastDispatchBySession=new Map,resetTracking=()=>{inFlightSessions.clear(),lastDispatchBySession.clear()},generatedAgentNames=options.generatedAgentNames?Object.freeze([...options.generatedAgentNames]):void 0;if(!(config3.enabled&&(config3.trigger==="task_completion"||config3.trigger==="both")))return{toolAfter:async()=>{},resetTracking};return{resetTracking,toolAfter:async(input,context)=>{try{let tool3=(normalizeToolName(input.tool)??input.tool??"").toLowerCase(),args2=context.args??void 0;if(tool3!=="update_task_status"||args2?.status!=="completed"||!input.sessionID)return;let agentName=options.getActiveAgentName?.(input.sessionID)??swarmState.activeAgent.get(input.sessionID)??swarmState.agentSessions.get(input.sessionID)?.agentName??"";if(agentName&&stripKnownSwarmPrefix(agentName)!=="architect")return;if(inFlightSessions.has(input.sessionID))return;let now2=_internals238.now();if(now2-(lastDispatchBySession.get(input.sessionID)??0)<COOLDOWN_MS)return;let taskId=typeof args2.task_id==="string"?args2.task_id:void 0;if(inFlightSessions.size>=MAX_TRACKED_SESSIONS8){let detail=`active review capacity reached (${MAX_TRACKED_SESSIONS8}); task-completion review skipped`;writeAutoReviewEvent(options.directory,{type:"auto_review",timestamp:new Date().toISOString(),session_id:input.sessionID,trigger:"task_completion",task_id:taskId,verdict:"skipped",detail,model_calls:0}),injectAutoReviewAdvisory(options.injectAdvisory,input.sessionID,`[AUTO-REVIEW TASK_COMPLETION] ${detail}. Completion remains fail-open.`);return}inFlightSessions.add(input.sessionID),lastDispatchBySession.delete(input.sessionID),lastDispatchBySession.set(input.sessionID,now2),evictCooldownMap(lastDispatchBySession);let runInput={directory:options.directory,sessionID:input.sessionID,trigger:"task_completion",taskId,config:config3,dispatcher:options.dispatcher,generatedAgentNames,activeAgentName:agentName||void 0,agentModelRegistry:options.agentModelRegistry,injectAdvisory:options.injectAdvisory},pending;try{pending=Promise.resolve(_internals238.runAutoReview(runInput))}catch(error93){inFlightSessions.delete(input.sessionID);let detail=`unexpected review scheduler failure: ${error93 instanceof Error?error93.message:String(error93)}`;writeAutoReviewEvent(options.directory,{type:"auto_review",timestamp:new Date().toISOString(),session_id:input.sessionID,trigger:"task_completion",task_id:taskId,verdict:"error",detail,model_calls:0}),injectAutoReviewAdvisory(options.injectAdvisory,input.sessionID,`[AUTO-REVIEW TASK_COMPLETION] ${detail}. Completion remains fail-open.`);return}pending.catch((error93)=>{let detail=`unexpected review scheduler rejection: ${error93 instanceof Error?error93.message:String(error93)}`;writeAutoReviewEvent(options.directory,{type:"auto_review",timestamp:new Date().toISOString(),session_id:input.sessionID,trigger:"task_completion",task_id:taskId,verdict:"error",detail,model_calls:0}),injectAutoReviewAdvisory(options.injectAdvisory,input.sessionID,`[AUTO-REVIEW TASK_COMPLETION] ${detail}. Completion remains fail-open.`)}).finally(()=>{inFlightSessions.delete(input.sessionID)})}catch(error93){warn(`[auto-review] hook error: ${error93 instanceof Error?error93.message:String(error93)}`)}}}}var _internals238={runReviewEngine,runAutoReview,now:()=>Date.now()};init_utils();init_bun_compat();init_utils2();function normalizePath3(filePath){return filePath.replace(/\\/g,"/")}async function readCoChangeJson(directory){try{let filePath=validateSwarmPath(directory,"co-change.json"),content=await bunFile(filePath).text(),data=JSON.parse(content);if(!data||typeof data.version!=="string"||!Array.isArray(data.entries))return null;let seen=new Set,dedupedEntries=[];for(let entry of data.entries){if(typeof entry.fileA!=="string"||typeof entry.fileB!=="string"||typeof entry.coChangeCount!=="number"||typeof entry.npmi!=="number")continue;let normalizedA=normalizePath3(entry.fileA),normalizedB=normalizePath3(entry.fileB),key2=[normalizedA,normalizedB].sort().join("|");if(!seen.has(key2))seen.add(key2),dedupedEntries.push(entry)}return{...data,entries:dedupedEntries}}catch{return null}}function getCoChangePartnersForFile(entries2,filePath){let normalizedTarget=normalizePath3(filePath);return entries2.filter((entry)=>{let normalizedA=normalizePath3(entry.fileA),normalizedB=normalizePath3(entry.fileB);return normalizedA===normalizedTarget||normalizedB===normalizedTarget})}function createCoChangeSuggesterHook(directory){return safeHook(async(input,_output)=>{let record3=input,toolName=typeof record3.tool==="string"?record3.tool:"";if(!["write","edit","apply_patch","swarm_apply_patch","patch","create_file"].includes(toolName))return;let toolInput=record3.input,filePath=toolInput?.filePath??toolInput?.file_path??toolInput?.path;if(!filePath)return;let coChangeData=await readCoChangeJson(directory);if(!coChangeData)return;let partners=getCoChangePartnersForFile(coChangeData.entries,filePath);if(partners.length===0)return;let partnerList=partners.slice(0,3).map((e)=>{let normalizedFilePath=normalizePath3(filePath);return`${normalizePath3(e.fileA)===normalizedFilePath?e.fileB:e.fileA} (co-change: ${e.coChangeCount}x, npmi: ${e.npmi.toFixed(2)})`}).join(", ");log(`[CO-CHANGE] Files frequently modified with ${filePath}: ${partnerList}`)})}init_cohort_cache();init_utils();init_bun_compat();init_utils2();function parseDarkMatterGaps(content){let unresolved=[],resolved=[],lines=content.split(`
|
|
7380
|
-
`);for(let line of lines){let unresolvedMatch=line.match(/^-\s+\[\s*\]\s*(.+)$/);if(unresolvedMatch){unresolved.push(unresolvedMatch[1].trim());continue}let resolvedMatch=line.match(/^-\s+\[x\]\s*(.+)$/i);if(resolvedMatch)resolved.push(resolvedMatch[1].trim())}return{unresolved,resolved}}async function readDarkMatterMd(directory){let filePath=validateSwarmPath(directory,"dark-matter.md"),file3=bunFile(filePath);try{let content=await file3.text();if(!content||!content.trim())return null;return parseDarkMatterGaps(content)}catch{return null}}function createDarkMatterDetectorHook(directory){let callCount=0;async function hook(_input,_output){if(callCount++,callCount%10!==0)return;let gaps=await readDarkMatterMd(directory);if(!gaps||gaps.unresolved.length===0)return;let count=gaps.unresolved.length;log(`[DARK-MATTER] ${count} unresolved coupling gap(s) in .swarm/dark-matter.md. Run /swarm dark-matter to review.`);let displayGaps=gaps.unresolved.slice(0,3);for(let description of displayGaps)log(` - ${description}`);if(count>3)log(` - ... and ${count-3} more`)}return safeHook(hook)}init_delegate_ack_collector();init_reviewer_directive_compliance();init_schema();init_manager();init_logger();init_extractors();init_knowledge_events();init_knowledge_injector();init_phase_directives();init_plan_task_id_context();init_skill_propagation_gate();init_task_id_resolver();function recordDelegateInjectionSkip(directory,reason,options){recordKnowledgeEvent(directory,{type:"injection_skip",reason,agent:options?.agent,session_id:options?.sessionId,detail:options?.detail}).catch(()=>{})}function isTaskTool4(tool3){return tool3==="Task"||tool3==="task"}function hasDelegateDirectiveBlock(text){return parseDelegateDirectiveBlock(text).length>0}function hasDirectiveComplianceBlock(text){return parseDirectivesToVerifyBlock(text).length>0}async function injectDelegateDirectivesBefore(directory,input,config3){let sessionId;try{sessionId=typeof input.sessionID==="string"?input.sessionID:void 0;let debugSkip=(reason,data)=>{return log("[delegate-directive-injection] skipped",{reason,caller_agent:typeof input.agent==="string"?input.agent:void 0,tool:input.tool,...data}),0};if(config3.enabled===!1)return debugSkip("knowledge_disabled");if(!isTaskTool4(input.tool))return debugSkip("not_task_tool");let callerAgent=typeof input.agent==="string"?input.agent:"",callerRole=stripKnownSwarmPrefix(callerAgent).toLowerCase();if(!callerAgent||callerRole!=="architect")return recordDelegateInjectionSkip(directory,"delegate_caller_not_allowed",{agent:callerAgent||void 0,sessionId,detail:{caller_role:callerRole}}),debugSkip("caller_not_allowed",{caller_role:callerRole});let argsRecord=input.args&&typeof input.args==="object"?input.args:null;if(!argsRecord)return recordDelegateInjectionSkip(directory,"delegate_missing_args",{agent:callerAgent,sessionId}),debugSkip("missing_args");let promptRaw=argsRecord.prompt;if(typeof promptRaw!=="string")return recordDelegateInjectionSkip(directory,"delegate_missing_prompt",{agent:callerAgent,sessionId}),debugSkip("missing_prompt");let parsed=parseDelegationArgs(input.args);if(!parsed)return recordDelegateInjectionSkip(directory,"delegate_unparseable_delegation_args",{agent:callerAgent,sessionId}),debugSkip("unparseable_delegation_args");let targetAgent=parsed.targetAgent;if(!isDelegatedAgent(targetAgent))return recordDelegateInjectionSkip(directory,"delegate_target_not_delegated_agent",{agent:targetAgent,sessionId,detail:{target_agent:targetAgent}}),debugSkip("target_not_delegated_agent",{target_agent:targetAgent});if(hasDelegateDirectiveBlock(promptRaw)||hasDirectiveComplianceBlock(promptRaw))return recordDelegateInjectionSkip(directory,"delegate_already_injected",{agent:targetAgent,sessionId}),debugSkip("already_injected",{target_agent:targetAgent});let plan=await loadPlan(directory).catch(()=>null),phaseLabel=plan?extractCurrentPhaseFromPlan(plan)??`Phase ${plan.current_phase??1}`:void 0,planTaskIdOptions=plan?toTaskIdPlanContextOptions(collectPlanTaskIdContextFromPhases(plan.phases)):{},taskIdResolution=resolveTaskId(argsRecord,{policy:"attribution",...planTaskIdOptions}),taskId=taskIdResolution.status==="resolved"?taskIdResolution.taskId:void 0,injectionPhaseId=phaseLabel!==void 0?extractPhaseIdFromLabel(phaseLabel):void 0,{entries:entries2,trace_id}=await injectForDelegate({directory,agent:targetAgent,expectedTools:defaultExpectedToolsForAgent(targetAgent),taskTitle:promptRaw.slice(0,800),taskId,sessionId,phase:phaseLabel,...injectionPhaseId!==void 0?{phase_id:injectionPhaseId}:{},config:config3}),prefixParts=[],delegateBlock=buildDelegateDirectiveBlock(entries2,config3,trace_id,Math.min(config3.inject_char_budget??2000,DELEGATE_INJECT_HARD_CHAR_CAP));if(delegateBlock)prefixParts.push(delegateBlock);if(stripKnownSwarmPrefix(targetAgent).toLowerCase()==="reviewer"){let toVerify=await readPhaseDirectivesToVerify(directory,phaseLabel,injectionPhaseId),complianceBlock=buildDirectiveComplianceBlock(toVerify,Math.min(config3.inject_char_budget??DIRECTIVE_COMPLIANCE_DEFAULT_CHAR_BUDGET,DIRECTIVE_COMPLIANCE_HARD_CHAR_CAP));if(complianceBlock)prefixParts.push(complianceBlock)}if(prefixParts.length===0)return recordDelegateInjectionSkip(directory,"delegate_no_directives_to_inject",{agent:targetAgent,sessionId}),debugSkip("no_directives_to_inject",{target_agent:targetAgent});return argsRecord.prompt=`${prefixParts.join(`
|
|
7380
|
+
`);for(let line of lines){let unresolvedMatch=line.match(/^-\s+\[\s*\]\s*(.+)$/);if(unresolvedMatch){unresolved.push(unresolvedMatch[1].trim());continue}let resolvedMatch=line.match(/^-\s+\[x\]\s*(.+)$/i);if(resolvedMatch)resolved.push(resolvedMatch[1].trim())}return{unresolved,resolved}}async function readDarkMatterMd(directory){let filePath=validateSwarmPath(directory,"dark-matter.md"),file3=bunFile(filePath);try{let content=await file3.text();if(!content||!content.trim())return null;return parseDarkMatterGaps(content)}catch{return null}}function createDarkMatterDetectorHook(directory){let callCount=0;async function hook(_input,_output){if(callCount++,callCount%10!==0)return;let gaps=await readDarkMatterMd(directory);if(!gaps||gaps.unresolved.length===0)return;let count=gaps.unresolved.length;log(`[DARK-MATTER] ${count} unresolved coupling gap(s) in .swarm/dark-matter.md. Run /swarm dark-matter to review.`);let displayGaps=gaps.unresolved.slice(0,3);for(let description of displayGaps)log(` - ${description}`);if(count>3)log(` - ... and ${count-3} more`)}return safeHook(hook)}init_delegate_ack_collector();init_reviewer_directive_compliance();init_schema();init_manager();init_state2();init_logger();init_extractors();init_knowledge_events();init_knowledge_injector();init_phase_directives();init_plan_task_id_context();init_skill_propagation_gate();init_task_id_resolver();function recordDelegateInjectionSkip(directory,reason,options){recordKnowledgeEvent(directory,{type:"injection_skip",reason,agent:options?.agent,session_id:options?.sessionId,detail:options?.detail}).catch(()=>{})}function isTaskTool4(tool3){return tool3==="Task"||tool3==="task"}function hasDelegateDirectiveBlock(text){return parseDelegateDirectiveBlock(text).length>0}function hasDirectiveComplianceBlock(text){return parseDirectivesToVerifyBlock(text).length>0}async function injectDelegateDirectivesBefore(directory,input,config3){let sessionId;try{sessionId=typeof input.sessionID==="string"?input.sessionID:void 0;let debugSkip=(reason,data)=>{return log("[delegate-directive-injection] skipped",{reason,caller_agent:typeof input.agent==="string"?input.agent:void 0,tool:input.tool,...data}),0};if(config3.enabled===!1)return debugSkip("knowledge_disabled");if(!isTaskTool4(input.tool))return debugSkip("not_task_tool");let callerAgent=typeof input.agent==="string"?input.agent:"",callerRole=stripKnownSwarmPrefix(callerAgent).toLowerCase();if(!callerAgent||callerRole!=="architect")return recordDelegateInjectionSkip(directory,"delegate_caller_not_allowed",{agent:callerAgent||void 0,sessionId,detail:{caller_role:callerRole}}),debugSkip("caller_not_allowed",{caller_role:callerRole});let argsRecord=input.args&&typeof input.args==="object"?input.args:null;if(!argsRecord)return recordDelegateInjectionSkip(directory,"delegate_missing_args",{agent:callerAgent,sessionId}),debugSkip("missing_args");let promptRaw=argsRecord.prompt;if(typeof promptRaw!=="string")return recordDelegateInjectionSkip(directory,"delegate_missing_prompt",{agent:callerAgent,sessionId}),debugSkip("missing_prompt");let parsed=parseDelegationArgs(input.args);if(!parsed)return recordDelegateInjectionSkip(directory,"delegate_unparseable_delegation_args",{agent:callerAgent,sessionId}),debugSkip("unparseable_delegation_args");let targetAgent=parsed.targetAgent;if(!isDelegatedAgent(targetAgent))return recordDelegateInjectionSkip(directory,"delegate_target_not_delegated_agent",{agent:targetAgent,sessionId,detail:{target_agent:targetAgent}}),debugSkip("target_not_delegated_agent",{target_agent:targetAgent});if(hasDelegateDirectiveBlock(promptRaw)||hasDirectiveComplianceBlock(promptRaw))return recordDelegateInjectionSkip(directory,"delegate_already_injected",{agent:targetAgent,sessionId}),debugSkip("already_injected",{target_agent:targetAgent});let plan=await loadPlan(directory).catch(()=>null),phaseLabel=plan?extractCurrentPhaseFromPlan(plan)??`Phase ${plan.current_phase??1}`:void 0,planTaskIdOptions=plan?toTaskIdPlanContextOptions(collectPlanTaskIdContextFromPhases(plan.phases)):{},taskIdResolution=resolveTaskId(argsRecord,{policy:"attribution",...planTaskIdOptions}),taskId=taskIdResolution.status==="resolved"?taskIdResolution.taskId:void 0,injectionPhaseId=phaseLabel!==void 0?extractPhaseIdFromLabel(phaseLabel):void 0,{entries:entries2,trace_id}=await injectForDelegate({directory,agent:targetAgent,expectedTools:defaultExpectedToolsForAgent(targetAgent),taskTitle:promptRaw.slice(0,800),taskId,sessionId,phase:phaseLabel,...injectionPhaseId!==void 0?{phase_id:injectionPhaseId}:{},config:config3});if(sessionId&&entries2.length>0)recordPendingDispatchAuthorization(sessionId,targetAgent);let prefixParts=[],delegateBlock=buildDelegateDirectiveBlock(entries2,config3,trace_id,Math.min(config3.inject_char_budget??2000,DELEGATE_INJECT_HARD_CHAR_CAP));if(delegateBlock)prefixParts.push(delegateBlock);if(stripKnownSwarmPrefix(targetAgent).toLowerCase()==="reviewer"){let toVerify=await readPhaseDirectivesToVerify(directory,phaseLabel,injectionPhaseId),complianceBlock=buildDirectiveComplianceBlock(toVerify,Math.min(config3.inject_char_budget??DIRECTIVE_COMPLIANCE_DEFAULT_CHAR_BUDGET,DIRECTIVE_COMPLIANCE_HARD_CHAR_CAP));if(complianceBlock)prefixParts.push(complianceBlock)}if(prefixParts.length===0)return recordDelegateInjectionSkip(directory,"delegate_no_directives_to_inject",{agent:targetAgent,sessionId}),debugSkip("no_directives_to_inject",{target_agent:targetAgent});return argsRecord.prompt=`${prefixParts.join(`
|
|
7381
7381
|
|
|
7382
7382
|
`)}
|
|
7383
7383
|
|
|
@@ -7391,7 +7391,7 @@ ${instruction}`;else if(typeof args2.task==="string")args2.task=`${args2.task}
|
|
|
7391
7391
|
${instruction}`}if(incrementFullAutoCounter(directory,sessionID,"coderDelegations"),!subagentRaw||!isKnownCanonicalRole(canonicalRole2))throw Error(`FULL_AUTO_DELEGATION_DENY: unknown subagent '${subagentRaw}' (canonical role '${canonicalRole2}' is not a registered plugin role). Choose a generated agent whose suffix matches one of the canonical roles.`);if(canonicalRole2==="coder"){let protectedPathScan=scanForProtectedPaths(args2,config3.full_auto);if(!protectedPathScan.complete)throw await writeDelegationEvent(directory,{type:"full_auto_subagent_warning",timestamp:new Date().toISOString(),session_id:sessionID,subagent:subagentRaw,canonical_role:canonicalRole2,phase:"outbound",category:"protected_path_scan_incomplete",matched:"scan-budget-exceeded"}),Error("FULL_AUTO_DELEGATION_DENY: coder delegation payload exceeds the protected-path scan budget");for(let p of protectedPathScan.hits)if(isProtectedPath(p,config3.full_auto))throw await writeDelegationEvent(directory,{type:"full_auto_subagent_warning",timestamp:new Date().toISOString(),session_id:sessionID,subagent:subagentRaw,canonical_role:canonicalRole2,phase:"outbound",category:"protected_path_in_prompt",matched:p}),Error(`FULL_AUTO_DELEGATION_DENY: coder delegation targets protected path '${p}'`)}},toolAfter:async(input,output)=>{let tool3=input.tool??"";if(!isTaskTool5(tool3))return;let sessionID=input.sessionID;if(!sessionID)return;let runState=loadFullAutoRunState(directory,sessionID);if(!runState||runState.status!=="running")return;let text=extractText(output.output),envelope=extractFullAutoSevereEnvelope(text),warnings=detectReturnWarnings(text),session=swarmState.agentSessions.get(sessionID),severeValidation=input.callID&&runState?validateFullAutoSevereEnvelope({envelope,sessionID,callID:input.callID,generation:runState.runGeneration??0,declaredScope:session?.declaredCoderScope??null,currentTaskID:session?.currentTaskId??null,session,projectDirectory:directory}):{accepted:!1,reason:"missing-call-id"},severe=severeValidation.accepted;if(warnings.length===0&&!envelope)return;await writeDelegationEvent(directory,{type:"full_auto_subagent_warning",timestamp:new Date().toISOString(),session_id:sessionID,phase:"return",warnings,envelope_category:envelope?.category,envelope_validation:severeValidation.reason,severe});try{recordFullAutoSubagentOutcome(directory,sessionID,{severe,pauseReason:severe?`severe subagent return envelope: ${envelope?.category??"unknown"}`:void 0})}catch(error93){if(!isFullAutoStateLockError(error93))throw error93;markFullAutoStateLockFailure(directory,sessionID),warn("[full-auto/delegation] durable state lock unavailable; pausing in-process")}if(input.callID)clearFullAutoSevereCorrelation(sessionID,input.callID)}}}init_core_events();var PATTERNS=[{category:"instruction_override",regex:/\bignore (?:all |any |the )?(?:previous|prior|earlier|above) (?:instructions|prompts|rules|directives)\b/i},{category:"instruction_override",regex:/\bdisregard (?:all |any |the )?(?:previous|prior|earlier|above) (?:instructions|prompts|rules)\b/i},{category:"instruction_override",regex:/\bforget (?:all |any |everything|the )?(?:previous|above|prior) (?:instructions|prompts|rules)\b/i},{category:"system_role_override",regex:/\b(?:you are now|act as|pretend to be|from now on you are)\s+(?:a |an |the )?(?:system|developer|root|admin|superuser)\b/i},{category:"system_role_override",regex:/\b<\|?(?:system|developer|im_start|imstart)\|?>/i},{category:"credential_request",regex:/\b(?:please |kindly |)(?:paste|share|reveal|send|provide|leak|print|echo|cat) (?:your |the |my )?(?:api[_ -]?key|password|token|secret|credentials|\.env)\b/i},{category:"credential_request",regex:/\b(?:show|dump|export) (?:env(?:ironment)?|secrets|credentials|keys?)\b/i},{category:"exfiltration_request",regex:/\b(?:upload|exfiltrate|send) (?:contents of |files? from |the )?(?:home|repo|workspace|project|secrets?|env(?:ironment)?)\b/i},{category:"exfiltration_request",regex:/\bcurl\s+-d\s+@/i},{category:"guardrail_disable_request",regex:/\bdisable (?:full[- ]auto|guardrails?|safety|policy|oversight|critic)\b/i},{category:"guardrail_disable_request",regex:/\bturn (?:off|disable) (?:full[- ]auto|guardrails?|safety|policy)\b/i},{category:"curl_pipe_shell",regex:/\bcurl\b[^|\n]*\|\s*(?:sh|bash|zsh|fish)\b/i},{category:"untrusted_run_command",regex:/\b(?:run|execute|paste) (?:this|the following) (?:command|script|bash|shell)\b/i}];function buildExcerpt(text,match){let idx=match.index??0,start=Math.max(0,idx-120),end=Math.min(text.length,idx+match[0].length+120),slice=text.slice(start,end).replace(/\s+/g," ").trim();return slice.length>280?`${slice.slice(0,280)}…`:slice}function probeFullAutoInput(text){let warnings=[];if(!text||typeof text!=="string")return{hasWarning:!1,warnings};let seen=new Set;for(let{category,regex}of PATTERNS){let m=text.match(regex);if(!m)continue;let key2=`${category}:${m[0].toLowerCase()}`;if(seen.has(key2))continue;seen.add(key2),warnings.push({category,matched:m[0],excerpt:buildExcerpt(text,m)})}return{hasWarning:warnings.length>0,warnings}}var RISKY_FOLLOWUP_TOOLS=new Set(["bash","shell","exec","web_search","webfetch","web_fetch","fetch","http","request"]),SECRET_TOOL_PATTERNS=[/\b(?:cat|head|tail|less|more)\s+[^\n]*\.env/i,/\bprintenv\b.*(?:SECRET|TOKEN|KEY|PASSWORD)/i];function shouldEscalateAfterWarning(toolName,commandOrUrl){let lower=toolName?.toLowerCase()??"";if(RISKY_FOLLOWUP_TOOLS.has(lower))return!0;if(typeof commandOrUrl==="string"){for(let re of SECRET_TOOL_PATTERNS)if(re.test(commandOrUrl))return!0}return!1}init_state3();init_logger();init_normalize_tool_name();var PROBED_TOOLS=new Set(["web_search","webfetch","web_fetch","fetch","http","request","doc_extract","doc_scan","gitingest","extract_code_blocks","retrieve_summary","retrieve_lane_output","search","read","view"]);async function writeWarningEvent(directory,sessionID,tool3,probe2){let event={type:"full_auto_input_warning",timestamp:new Date().toISOString(),session_id:sessionID,tool:tool3,warnings:probe2.warnings};try{appendCoreEventSync(directory,event)}catch(error93){error48(`[full-auto/input-probe] failed to write event: ${error93 instanceof Error?error93.message:String(error93)}`)}}function extractText2(out){if(typeof out==="string")return out;if(out&&typeof out==="object"){let candidate2=out;if(typeof candidate2.output==="string")return candidate2.output;if(typeof candidate2.text==="string")return candidate2.text;if(typeof candidate2.body==="string")return candidate2.body;try{return JSON.stringify(candidate2)}catch{return""}}return""}var MAX_TRACKED_SESSIONS10=256,WARNING_TTL_MS=300000,fullAutoInputWarningStash=new Map;function isExpired2(w,nowMs3=Date.now()){let at=Date.parse(w.at);if(!Number.isFinite(at))return!0;return nowMs3-at>WARNING_TTL_MS}function evictExpired2(){let now2=Date.now();for(let[sid,w]of fullAutoInputWarningStash)if(isExpired2(w,now2))fullAutoInputWarningStash.delete(sid);while(fullAutoInputWarningStash.size>MAX_TRACKED_SESSIONS10){let firstKey=fullAutoInputWarningStash.keys().next().value;if(firstKey===void 0)break;fullAutoInputWarningStash.delete(firstKey)}}function setPendingInputWarning(sessionID,warning){fullAutoInputWarningStash.delete(sessionID),fullAutoInputWarningStash.set(sessionID,warning),evictExpired2()}function consumePendingInputWarning(sessionID){let warning=fullAutoInputWarningStash.get(sessionID);if(warning)fullAutoInputWarningStash.delete(sessionID);if(warning&&isExpired2(warning))return;return warning}function peekPendingInputWarning(sessionID){let w=fullAutoInputWarningStash.get(sessionID);if(!w)return;if(isExpired2(w)){fullAutoInputWarningStash.delete(sessionID);return}return w}function createFullAutoInputProbeHook(options){let{directory}=options;return{toolAfter:async(input,output)=>{let tool3=(normalizeToolName(input.tool)??input.tool??"").toLowerCase();if(!PROBED_TOOLS.has(tool3))return;let sessionID=input.sessionID;if(!sessionID)return;let runState=loadFullAutoRunState(directory,sessionID);if(!runState||runState.status!=="running")return;let text=extractText2(output.output);if(!text)return;let probe2=probeFullAutoInput(text);if(!probe2.hasWarning)return;setPendingInputWarning(sessionID,{tool:tool3,at:new Date().toISOString(),categories:probe2.warnings.map((w)=>w.category)}),await writeWarningEvent(directory,sessionID,tool3,probe2)}}}init_constants();init_schema();init_oversight();init_policy();init_recovery2();init_severe_result();init_state3();init_executor();init_skip_state();init_scope_persistence();init_state2();init_file_authority();var _internals239={assessSandboxEnforcement,readSandboxWrapOutcome,clearSandboxWrapOutcome};function createFullAutoPermissionHook(options){let{config:config3,directory}=options,fullAutoConfig=config3.full_auto;return{toolBefore:async(input,output)=>{let{tool:toolName,sessionID}=input;if(!sessionID)return;let stateHealth=isFullAutoStateUnreadable();if(stateHealth.unreadable){if(isReadOnlyTool(toolName))return;throw Error(`FULL_AUTO_STATE_UNREADABLE: tool '${toolName}' blocked because the Full-Auto durable state file is unreadable (${stateHealth.reason}). Restore .swarm/full-auto-state.json (or .bak) and re-run /swarm full-auto on.`)}let runState=loadFullAutoRunState(directory,sessionID);if(!runState||runState.status==="idle")return;if(runState.status==="paused"||runState.status==="terminated"){if(toolName==="swarm_command"&&output.args&&typeof output.args==="object"&&typeof output.args.command==="string"){let raw=output.args,command=String(raw.command),commandArgs=Array.isArray(raw.args)?raw.args.filter((item)=>typeof item==="string"):[];if(isAllowedPausedSwarmCommand(command,commandArgs,runState.status))return}if(isReadOnlyTool(toolName))return;let rawReason=runState.pauseReason??runState.terminateReason??"no reason recorded",statusPrefix=rawReason.includes("infrastructure failure")&&runState.status==="paused"?"FULL_AUTO_PAUSED:OVERSIGHT_INFRASTRUCTURE_FAILURE":`FULL_AUTO_${runState.status.toUpperCase()}`;throw Error(`${statusPrefix}: tool '${toolName}' blocked because Full-Auto run is ${runState.status} (${rawReason}). Re-enable with /swarm full-auto on after the underlying issue is resolved.`)}let session=swarmState.agentSessions.get(sessionID),activeAgent=swarmState.activeAgent.get(sessionID)??session?.agentName??ORCHESTRATOR_NAME,normalizedAgentName=stripKnownSwarmPrefix(activeAgent),taskId=session?.currentTaskId??null,binding=taskId?resolveAuthorizedScopeBinding({directory,taskId,activeSessionId:sessionID}):resolveAuthorizedScopeBindingForSession({directory,activeSessionId:sessionID});if(!taskId&&binding&&session)taskId=binding.taskId,session.currentTaskId=binding.taskId,session.declaredCoderScope=[...binding.files];let declaredScope=binding?.files??null,argsObj=output.args??void 0,lowerTool=toolName?.toLowerCase()??"",phaseFromArgs;if(lowerTool==="phase_complete"){if(phaseFromArgs=parsePhaseArg(argsObj),phaseFromArgs===void 0)throw Error("FULL_AUTO_DENY [phase_complete_invalid_phase]: phase_complete called without a valid 'phase' argument. Provide a positive integer phase before calling phase_complete.")}let effectivePhase=phaseFromArgs??runState.currentPhase,safeMode=["assisted","supervised","strict"].includes(runState.mode)?runState.mode:"strict",effectiveFullAutoConfig=fullAutoConfig?{...fullAutoConfig,mode:safeMode}:{mode:safeMode},rawCommand=typeof argsObj?.command==="string"?argsObj.command.trim():"",sandboxOutcome=(toolName==="bash"||toolName==="shell")&&input.callID?_internals239.readSandboxWrapOutcome(sessionID,input.callID):null,classifierArgs=sandboxOutcome?{...argsObj,command:sandboxOutcome.originalCommand}:argsObj,classifierInput={sessionID,agentName:activeAgent,normalizedAgentName,generatedAgentNames:swarmState.generatedAgentNames,toolName,args:classifierArgs,directory,declaredScope,currentTaskID:taskId,currentPhase:effectivePhase,planSummary:void 0,changedFiles:session&&taskId?getModifiedFilesForTask(session,taskId):void 0,fullAutoConfig:effectiveFullAutoConfig,pluginConfig:config3},decision=classifyFullAutoToolAction(classifierInput);if(safeMode==="strict"&&(toolName==="bash"||toolName==="shell")&&rawCommand)try{let commandIdentity=`cmd=${hashArgs({command:rawCommand})}`,wrapOutcome=sandboxOutcome,sandboxConfig=config3.guardrails?.sandbox,identityAssessment=await _internals239.assessSandboxEnforcement({mode:sandboxConfig?.mode??"advisory",require_filesystem:sandboxConfig?.require_filesystem??!1,require_network:sandboxConfig?.require_network??!1,require_process:sandboxConfig?.require_process??!1,network_mode:sandboxConfig?.network_mode??"off",network_allowlist:sandboxConfig?.network_allowlist??[],writable_roots:sandboxConfig?.writable_roots??[]}),assessmentSupported=identityAssessment.supported!==!1,assessmentUnsupported=identityAssessment.unsupported??[],capabilityIdentity=`cap=${identityAssessment.capability.identity}`;if(!wrapOutcome)decision={action:"deny",code:"sandbox_unverified",recoverable:!0,reason:`strict mode shell command was not verified by the guardrails sandbox wrapper [${commandIdentity} ${capabilityIdentity}]`};else if(!wrapOutcome.wrapped||wrapOutcome.originalCommandHash!==hashArgs({command:wrapOutcome.originalCommand})||wrapOutcome.originalCommandHash===wrapOutcome.finalCommandHash||wrapOutcome.finalCommandHash!==hashArgs({command:rawCommand})||normalizeSandboxMechanism(wrapOutcome.executorMechanism)!==normalizeSandboxMechanism(wrapOutcome.capabilityMechanism)||wrapOutcome.capabilityIdentity!==identityAssessment.capability.identity||wrapOutcome.assessmentCacheKey!==identityAssessment.cacheKey)decision={action:"deny",code:"sandbox_unverified",recoverable:!0,reason:`strict mode shell command lost sandbox binding (${wrapOutcome.reason}) [${commandIdentity} ${capabilityIdentity}]`};else if(!assessmentSupported)decision={action:"deny",code:"sandbox_required",recoverable:!0,reason:`strict mode shell command requested unsupported sandbox policy (${assessmentUnsupported.join(", ")}) [${commandIdentity} ${capabilityIdentity}]`};else if(!identityAssessment.satisfied)decision={action:"deny",code:"sandbox_required",recoverable:!0,reason:`strict mode shell command requires independently verified sandbox containment; missing ${identityAssessment.missing.join(", ")} [${commandIdentity} ${capabilityIdentity}]`}}finally{_internals239.clearSandboxWrapOutcome(sessionID,input.callID)}let pendingWarning=peekPendingInputWarning(sessionID);if(pendingWarning){let commandOrUrl=typeof argsObj?.command==="string"&&argsObj.command||typeof argsObj?.url==="string"&&argsObj.url||void 0;if(shouldEscalateAfterWarning(toolName,commandOrUrl)){let evidenceEventID=recordFullAutoSevereEvidenceEvent({sessionID,childSessionID:sessionID,category:"external_instructions",callID:input.callID,generation:runState.runGeneration});decision={action:"escalate_critic",reason:`risky follow-up after prompt-injection warning (${pendingWarning.categories.join(",")}); evidence event ${evidenceEventID}`,risk:"high",context:{tool:toolName,priorWarningTool:pendingWarning.tool,categories:pendingWarning.categories}},consumePendingInputWarning(sessionID)}}if(decision.action==="allow"){try{tickAndMaybeDispatchCadence(directory,sessionID,"toolCalls",config3,{activeAgent}),resetFullAutoDenials(directory,sessionID)}catch(error93){if(!isFullAutoStateLockError(error93))throw error93}return}if(decision.action==="deny"){let denial=buildStructuredDenial(decision,toolName);recordFullAutoDenial(directory,sessionID,{tool:toolName,code:decision.code,reason:decision.reason});let updated2=loadFullAutoRunState(directory,sessionID);if(updated2){let pauseDecision=shouldPauseForDenials(updated2,fullAutoConfig);if(pauseDecision.pause)if(pauseDecision.mode==="terminate")terminateFullAutoRun(directory,sessionID,pauseDecision.reason??"denial-limit");else pauseFullAutoRun(directory,sessionID,pauseDecision.reason??"denial-limit")}throw Error(`FULL_AUTO_DENY [${decision.code}]: ${decision.reason}. ${JSON.stringify(denial)}`)}if(decision.action==="pause")throw pauseFullAutoRun(directory,sessionID,decision.reason),Error(`FULL_AUTO_PAUSE [${decision.code}]: ${decision.reason}`);if(decision.action==="escalate_human")throw terminateFullAutoRun(directory,sessionID,decision.reason),Error(`FULL_AUTO_ESCALATE_HUMAN [${decision.code}]: ${decision.reason}`);let triggerSource=mapTriggerSource(decision,toolName),criticModel=fullAutoConfig?.critic_model??config3.agents?.critic?.model??"opencode/big-pickle",oversightAgentName=resolveOversightAgentNameFromActive(activeAgent);if(lowerTool==="phase_complete"&&effectivePhase!==void 0){let stateForPhase=loadFullAutoRunState(directory,sessionID);if(stateForPhase&&stateForPhase.currentPhase!==effectivePhase){stateForPhase.currentPhase=effectivePhase;try{saveFullAutoRunState(directory,stateForPhase)}catch(persistErr){let msg=persistErr instanceof Error?persistErr.message:String(persistErr);throw Error(`FULL_AUTO_BLOCKED: failed to persist phase ${effectivePhase} to durable run state — ${msg}`)}}}let outcome;try{outcome=await dispatchFullAutoOversight({directory,sessionID,trigger:decision.reason,triggerSource,phase:effectivePhase,taskID:taskId??void 0,planID:runState.planID,architectOutput:output.args?JSON.stringify(output.args):void 0,actionContext:{tool:toolName,...decision.context??{}},criticModel,oversightAgentName,fullAutoConfig:{fail_closed:fullAutoConfig?.fail_closed!==!1,max_dispatch_retries:fullAutoConfig?.oversight?.max_dispatch_retries??2,max_consecutive_dispatch_failures:fullAutoConfig?.oversight?.max_consecutive_dispatch_failures??3,total_timeout_ms:fullAutoConfig?.oversight?.total_timeout_ms??120000,cleanup_timeout_ms:fullAutoConfig?.oversight?.cleanup_timeout_ms??2000}})}catch(error93){let reason=error93 instanceof Error?error93.message:String(error93);throw pauseFullAutoRun(directory,sessionID,`oversight dispatcher exception: ${reason}`),Error(`FULL_AUTO_BLOCKED: oversight dispatch threw — ${reason}`)}if(outcome.decision==="allow"){try{tickAndMaybeDispatchCadence(directory,sessionID,"toolCalls",config3,{activeAgent}),resetFullAutoDenials(directory,sessionID)}catch(error93){if(!isFullAutoStateLockError(error93))throw error93}return}if(outcome.decision==="pause")throw Error(`FULL_AUTO_BLOCKED: critic verdict ${outcome.verdict} — ${outcome.reasoning}`);if(outcome.decision==="escalate_human")throw Error(`FULL_AUTO_ESCALATE_HUMAN: critic verdict ${outcome.verdict} — ${outcome.reasoning}`);recordFullAutoDenial(directory,sessionID,{tool:toolName,code:`critic_${outcome.verdict}`.toLowerCase(),reason:outcome.reasoning||`critic verdict ${outcome.verdict}`});let updated=loadFullAutoRunState(directory,sessionID);if(updated){let pauseDecision=shouldPauseForDenials(updated,fullAutoConfig);if(pauseDecision.pause)if(pauseDecision.mode==="terminate")terminateFullAutoRun(directory,sessionID,pauseDecision.reason??"denial-limit");else pauseFullAutoRun(directory,sessionID,pauseDecision.reason??"denial-limit")}throw Error(`FULL_AUTO_CRITIC_DENY: ${outcome.verdict} — ${outcome.reasoning}`)}}}function parsePhaseArg(args2){if(!args2)return;let raw=args2.phase,n;if(typeof raw==="number")n=raw;else if(typeof raw==="string"&&raw.trim()){let trimmed=raw.trim();if(!/^[1-9][0-9]*$/.test(trimmed))return;n=Number.parseInt(trimmed,10)}else return;if(!Number.isFinite(n)||!Number.isInteger(n)||n<1)return;if(n>Number.MAX_SAFE_INTEGER)return;return n}function mapTriggerSource(decision,toolName){if(decision.action!=="escalate_critic")return"tool_action";let lower=toolName?.toLowerCase()??"";if(lower==="phase_complete")return"phase_boundary";if(lower==="update_task_status")return"task_completion";if(decision.risk==="high")return"risk";return"tool_action"}function resolveOversightAgentNameFromActive(activeAgent){if(!activeAgent)return"critic_oversight";if(stripKnownSwarmPrefix(activeAgent)===ORCHESTRATOR_NAME){let lastIdx=activeAgent.toLowerCase().lastIndexOf("architect");if(lastIdx>0)return`${activeAgent.slice(0,lastIdx)}critic_oversight`}return"critic_oversight"}init_gate_denial_tracker();init_guardrails2();init_hive_promoter();init_host_boundary();init_command_resolution();init_stored_input_args();init_normalize_tool_name();init_spawn_helper();import*as fs170 from"node:fs";import*as path297 from"node:path";var emittedSkipAdvisories=new Set;function detectPackageManager(projectDir){if(fs170.existsSync(path297.join(projectDir,"bun.lockb")))return"bun";if(fs170.existsSync(path297.join(projectDir,"pnpm-lock.yaml")))return"pnpm";if(fs170.existsSync(path297.join(projectDir,"yarn.lock")))return"yarn";if(fs170.existsSync(path297.join(projectDir,"package-lock.json")))return"npm";return"bun"}function detectTypecheckCommand(projectDir){let pkgPath=path297.join(projectDir,"package.json");if(fs170.existsSync(pkgPath))try{let pkg=JSON.parse(fs170.readFileSync(pkgPath,"utf8")),scripts=pkg.scripts;if(scripts?.typecheck)return{command:[detectPackageManager(projectDir),"run","typecheck"],language:"typescript"};if(scripts?.["type-check"])return{command:[detectPackageManager(projectDir),"run","type-check"],language:"typescript"};let deps={...pkg.dependencies,...pkg.devDependencies};if(!deps?.typescript&&!fs170.existsSync(path297.join(projectDir,"tsconfig.json")));if(deps?.typescript||fs170.existsSync(path297.join(projectDir,"tsconfig.json")))return{command:resolveLocalNodeTool("tsc",["--noEmit"],projectDir),language:"typescript"}}catch{return null}if(fs170.existsSync(path297.join(projectDir,"go.mod")))return{command:["go","vet","./..."],language:"go"};if(fs170.existsSync(path297.join(projectDir,"Cargo.toml")))return{command:["cargo","check"],language:"rust"};if(fs170.existsSync(path297.join(projectDir,"pyproject.toml"))||fs170.existsSync(path297.join(projectDir,"requirements.txt"))||fs170.existsSync(path297.join(projectDir,"setup.py")))return{command:null,language:"python"};try{if(fs170.readdirSync(projectDir).some((f)=>f.endsWith(".csproj")||f.endsWith(".sln")))return{command:["dotnet","build","--no-restore"],language:"csharp"}}catch{}return null}async function runWithTimeout(command,cwd,timeoutMs){let result=await spawnAsync(command,cwd,timeoutMs);if(result===null)return null;return{exitCode:result.exitCode,stderr:result.stderr}}function createIncrementalVerifyHook(config3,projectDir,injectMessage){return{toolAfter:async(input,output)=>{if(!config3.enabled)return;if(!isTaskToolId(input.tool))return;let args2=(typeof input.callID==="string"?getStoredInputArgs(input.callID):void 0)??input.args??output.args,subagentType=typeof args2?.subagent_type==="string"?args2.subagent_type:"",agentName=subagentType.replace(/^[^_]+_/,"");if(!config3.triggerAgents.includes(agentName)&&!config3.triggerAgents.includes(subagentType))return;let commandToRun=null;if(config3.command!=null)if(Array.isArray(config3.command))commandToRun=config3.command;else commandToRun=config3.command.split(" ");else{let detected=detectTypecheckCommand(projectDir);if(detected===null)return;if(detected.command===null){let dedupKey=`${input.sessionID}:${detected.language}`;if(!emittedSkipAdvisories.has(dedupKey))emittedSkipAdvisories.add(dedupKey),injectMessage(input.sessionID,`POST-CODER CHECK SKIPPED: ${detected.language} project detected but no default checker available. Set incremental_verify.command in .swarm/config.json to enable.`);return}commandToRun=detected.command}if(commandToRun===null)return;let result=await runWithTimeout(commandToRun,projectDir,config3.timeoutMs);if(result===null)return;if(result.exitCode===0)injectMessage(input.sessionID,"POST-CODER CHECK PASSED: No type errors.");else{let errorSummary=result.stderr.slice(0,800);injectMessage(input.sessionID,`POST-CODER CHECK FAILED: Type errors detected after coder delegation. Address these before proceeding.
|
|
7392
7392
|
${errorSummary}`)}}}}init_init_orphan_recovery();init_state2();import*as fs171 from"node:fs/promises";import*as path298 from"node:path";var ADVISORY_FILENAME="init-orphan-recovery.json";function createInitOrphanRecoveryAdvisoryHook(directory){let consumedBySession=new Set;async function readAdvisoryFile(){let advisoryPath=path298.join(directory,".swarm","advisories",ADVISORY_FILENAME);try{let content=await fs171.readFile(advisoryPath,"utf-8");return JSON.parse(content)}catch{return null}}async function deleteAdvisoryFile(){let advisoryPath=path298.join(directory,".swarm","advisories",ADVISORY_FILENAME);try{await fs171.unlink(advisoryPath)}catch{}}function formatError3(error93){return`ORPHAN_RECOVERY_ERROR: Could not reclaim branch "${error93.branch}": ${error93.error}`}async function messagesTransform(_input,output){let messages=output.messages;if(!messages||messages.length===0)return;let sessionId=messages[messages.length-1]?.info?.sessionID;if(!sessionId)return;let activeAgent=swarmState.activeAgent.get(sessionId),session=swarmState.agentSessions.get(sessionId),ORCHESTRATOR_NAME2="Architect";if(!(activeAgent?activeAgent===ORCHESTRATOR_NAME2||activeAgent.endsWith("_Architect"):session?session.agentName===ORCHESTRATOR_NAME2||session.agentName.endsWith("_Architect"):!1))return;if(consumedBySession.has(sessionId))return;let advisory=await readAdvisoryFile();if(!advisory)return;consumedBySession.add(sessionId),await deleteAdvisoryFile();let reclaimedForGate=advisory.reclaimed;if(!((advisory.warnings?.length??0)>0||(advisory.errors?.length??0)>0||(reclaimedForGate?.removedBranches?.length??0)>0||(reclaimedForGate?.removedWorktrees?.length??0)>0))return;let targetSession=ensureAgentSession(sessionId,void 0,directory),timestamp=advisory.initTimestamp?new Date(advisory.initTimestamp).toLocaleString():"unknown";pushAdvisory(targetSession,`[INIT ORPHAN RECOVERY] Plugin init detected the following at ${timestamp}:`);for(let warning of advisory.warnings??[])pushAdvisory(targetSession,` WARNING: ${warning}`);for(let err of advisory.errors??[])pushAdvisory(targetSession,` ERROR: ${formatError3(err)}`);let reclaimed=advisory.reclaimed;if((reclaimed?.removedBranches?.length??0)>0)pushAdvisory(targetSession,` Reclaimed ${reclaimed.removedBranches.length} orphaned branch(es): ${reclaimed.removedBranches.join(", ")}`);if(reclaimed?.removedWorktrees&&reclaimed.removedWorktrees.length>0)pushAdvisory(targetSession,` Reclaimed ${reclaimed.removedWorktrees.length} orphaned worktree directory(ies): ${reclaimed.removedWorktrees.join(", ")}`);if(reclaimed?.prunedWorktrees)pushAdvisory(targetSession," Stale worktree metadata pruned.")}return{messagesTransform}}init_ledger_sqlite();init_logger();init_spec_hash();init_delegation_gate();import*as fs172 from"node:fs";import*as path300 from"node:path";function computeNextMode(params){let{issueReference,traceState,workflowArtifacts}=params,noop={nextMode:null,directive:null,nextLastTransition:traceState.lastTransition,nextStatus:traceState.status};if(!issueReference||issueReference.flags.trace!==!0)return noop;if(traceState.status==="merge_approval_recorded")return noop;if(traceState.status==="published"){if(workflowArtifacts.mergeApprovalObserved&&traceState.lastTransition!=="MERGE_APPROVAL_RECORDED")return{nextMode:null,directive:"Merge approval recorded for this trace, bound to the PR head SHA in .swarm/merge-approval.json. The merge decision is human-enforced: the human user owns and executes it through the host. This plugin records the approval verbatim for audit; it does not drive, gate, or green-light the merge itself.",nextLastTransition:"MERGE_APPROVAL_RECORDED",nextStatus:"merge_approval_recorded"};return noop}if(traceState.status==="publication_handoff"){if(workflowArtifacts.publicationObserved&&traceState.lastTransition!=="PUBLISHED")return{nextMode:null,directive:"Publication confirmed. The issue-trace workflow is complete.",nextLastTransition:"PUBLISHED",nextStatus:"published"};return noop}if(workflowArtifacts.specIssueNumber===null||workflowArtifacts.specIssueNumber!==issueReference.number||traceState.issueNumber!==issueReference.number){if(traceState.lastTransition!=="SPEC_MISMATCH_GATE"&&(workflowArtifacts.specIssueNumber!==null||traceState.issueNumber!==issueReference.number))return{nextMode:"ISSUE_INGEST",directive:"The spec on disk (## Source Issue) does not match the traced issue #N. Regenerate the spec for this issue through the issue-ingest flow (/swarm issue), or correct the ## Source Issue number in .swarm/spec.md. The trace will not advance while the spec belongs to a different issue.",nextLastTransition:"SPEC_MISMATCH_GATE",nextStatus:"in_progress"};return noop}if(!workflowArtifacts.specExists)return noop;if(!workflowArtifacts.planExists){if(workflowArtifacts.freshnessPermitted===!1){if(traceState.lastTransition===null||traceState.lastTransition==="REPRO_GATE"||traceState.lastTransition==="SPEC_MISMATCH_GATE")return{nextMode:"ISSUE_INGEST",directive:'Branch freshness is not established for this trace (behind, or fetch failed without a recorded user override). Re-sync with the default branch (git fetch + rebase/merge), then call record_branch_freshness (issueNumber, freshness: "synced") — or, when the fetch genuinely failed and the user has accepted proceeding on the stale base, record freshness: "fetch-failed:<reason>" together with the verbatim override string the user provided. The trace will not transition to PLAN until this receipt permits.',nextLastTransition:"FRESHNESS_GATE",nextStatus:"in_progress"};return noop}if(!workflowArtifacts.reproductionPermitted){if(traceState.lastTransition===null||traceState.lastTransition==="FRESHNESS_GATE"||traceState.lastTransition==="SPEC_MISMATCH_GATE")return{nextMode:"ISSUE_INGEST",directive:"Reproduction evidence (or a typed --no-repro waiver) is required before this trace can transition to PLAN. Attempt a minimal reproduction and call record_issue_reproduction (performed: true, commands, output_summary), or restart with /swarm issue --no-repro.",nextLastTransition:"REPRO_GATE",nextStatus:"in_progress"};return noop}if(traceState.lastTransition===null||traceState.lastTransition==="ISSUE_INGEST_TO_PLAN"||traceState.lastTransition==="REPRO_GATE"||traceState.lastTransition==="FRESHNESS_GATE"||traceState.lastTransition==="SPEC_MISMATCH_GATE"){if(traceState.lastTransition==="ISSUE_INGEST_TO_PLAN")return noop;return{nextMode:"PLAN",directive:null,nextLastTransition:"ISSUE_INGEST_TO_PLAN",nextStatus:"in_progress"}}return noop}if(workflowArtifacts.planBoundToSpec===!1){if(traceState.lastTransition!=="PLAN_BINDING_GATE")return{nextMode:"PLAN",directive:"The loaded plan cannot be bound to the current spec for issue #N — its recorded specHash differs from the current spec (or the plan predates spec linkage), so executing it under this trace would run the wrong plan. Re-save the plan against the current spec (save_plan after the spec is correct), or run /swarm reset to clear the foreign plan and re-plan (note: reset also deletes .swarm/spec.md and the recorded review receipts, so re-run /swarm issue --trace afterwards to regenerate them). The trace will not transition to EXECUTE on a plan it cannot bind.",nextLastTransition:"PLAN_BINDING_GATE",nextStatus:"in_progress"};return noop}if(!workflowArtifacts.reproductionPermitted){if(traceState.lastTransition===null||traceState.lastTransition==="SPEC_MISMATCH_GATE"||traceState.lastTransition==="PLAN_BINDING_GATE"||traceState.lastTransition==="FRESHNESS_GATE"||traceState.lastTransition==="REPRO_GATE"||traceState.lastTransition==="ISSUE_INGEST_TO_PLAN")return{nextMode:"ISSUE_INGEST",directive:"A plan already exists for this trace, but reproduction evidence has not been recorded for issue #N. Attempt a minimal reproduction and call record_issue_reproduction (performed: true, commands, output_summary), or restart with /swarm issue --no-repro. The trace will not transition to EXECUTE until reproduction is permitted.",nextLastTransition:"REPRO_GATE_LATE",nextStatus:"in_progress"};return noop}if(!workflowArtifacts.criticApproved){if(traceState.lastTransition===null||traceState.lastTransition==="SPEC_MISMATCH_GATE"||traceState.lastTransition==="PLAN_BINDING_GATE"||traceState.lastTransition==="REPRO_GATE_LATE"||traceState.lastTransition==="FRESHNESS_GATE"||traceState.lastTransition==="REPRO_GATE"||traceState.lastTransition==="ISSUE_INGEST_TO_PLAN")return{nextMode:"CRITIC-GATE",directive:"The plan for issue #N is not yet critic-approved. Dispatch MODE: CRITIC-GATE and wait for VERDICT: APPROVED before EXECUTE. If the critic already returned APPROVED but the snapshot was not recorded (issue #2012), call approve_plan_critic with a reason, or run /swarm approve-plan-critic <reason>, to record the approval.",nextLastTransition:"CRITIC_GATE",nextStatus:"in_progress"};return noop}if(workflowArtifacts.planExists&&!workflowArtifacts.allPhasesComplete){if(traceState.lastTransition==="PLAN_TO_EXECUTE")return noop;return{nextMode:"EXECUTE",directive:null,nextLastTransition:"PLAN_TO_EXECUTE",nextStatus:"in_progress"}}if(!workflowArtifacts.planExists)return noop;if(!workflowArtifacts.implementationReviewVerified&&traceState.lastTransition!=="REVIEW_GATE"&&traceState.lastTransition!=="RECURRENCE_GATE"&&traceState.lastTransition!=="EXECUTE_TO_COMMIT")return{nextMode:"EXECUTE",directive:"All implementation phases are complete, but the independent implementation review is not yet recorded. Dispatch a FRESH-context reviewer and then a FRESH-context critic over the implementation diff (separate contexts from the implementer); when both approve, call record_implementation_review (issueNumber, reviewerVerdict APPROVE, criticVerdict APPROVE, the reviewed diff base/head, and notes). The trace will not hand off to commit-pr until this receipt exists.",nextLastTransition:"REVIEW_GATE",nextStatus:"in_progress"};if(workflowArtifacts.implementationReviewVerified&&!workflowArtifacts.recurrenceSweepVerified&&traceState.lastTransition!=="RECURRENCE_GATE"&&traceState.lastTransition!=="EXECUTE_TO_COMMIT")return{nextMode:"EXECUTE",directive:'The implementation review is approved, but the recurrence sweep is not yet recorded. Characterize the defect class, search the repository with explicit predicates, disposition every hit (FIX / FALSE_POSITIVE / OUT_OF_CLASS / DEFERRED_WITH_USER_APPROVAL), and install a guardrail that provably catches the original defect — or record the "no defect class" fast path with a one-line justification. Then call record_recurrence_sweep. The trace will not hand off to commit-pr until this receipt exists.',nextLastTransition:"RECURRENCE_GATE",nextStatus:"in_progress"};if(workflowArtifacts.implementationReviewVerified&&workflowArtifacts.recurrenceSweepVerified&&workflowArtifacts.traceValidationVerified===!1&&traceState.lastTransition!=="TRACE_VALIDATION_GATE"&&traceState.lastTransition!=="EXECUTE_TO_COMMIT")return{nextMode:"EXECUTE",directive:"The review and recurrence gates are satisfied, but the trace-check.sh validator receipts are not yet green. Run the issue-tracer phase validator for every completed phase (trace-check.sh phase <N> --slug <slug>) and record each outcome with record_trace_validation (issueNumber, phase, outcome, the reviewedCommit, and the treeId the validator reported). Any fail entry must be fixed and re-recorded as a pass before the trace can hand off to commit-pr.",nextLastTransition:"TRACE_VALIDATION_GATE",nextStatus:"in_progress"};if(!workflowArtifacts.implementationReviewVerified||!workflowArtifacts.recurrenceSweepVerified||workflowArtifacts.traceValidationVerified===!1)return noop;if(traceState.lastTransition==="EXECUTE_TO_COMMIT")return noop;return{nextMode:null,directive:"All implementation phases are complete. Compose commit-pr to publish the PR. Read .swarm/issue-reference.json for Closes #N. After the PR is created/updated, call record_issue_publication (with the issue number, PR number, URL, and HEAD sha) so this trace reaches its terminal published state — the trace is NOT complete until publication is confirmed.",nextLastTransition:"EXECUTE_TO_COMMIT",nextStatus:"publication_handoff"}}init_manager();init_forge_provider();import{existsSync as existsSync158,mkdirSync as mkdirSync87,readFileSync as readFileSync130,renameSync as renameSync44,unlinkSync as unlinkSync49,writeFileSync as writeFileSync56}from"node:fs";import*as path299 from"node:path";async function _defaultLoadPlanFromLedger(directory){return loadPlan(directory)}async function _defaultReproductionReceiptExists(directory,issueNumber){try{let filePath=path299.join(directory,".swarm","reproduction.json"),raw=_internals240.readFileSync(filePath,"utf-8"),parsed=JSON.parse(raw);if(typeof parsed!=="object"||parsed===null)return!1;let o=parsed;return o.performed===!0&&typeof o.issueNumber==="number"&&o.issueNumber===issueNumber}catch{return!1}}async function _defaultPublicationReceiptExists(directory,issueNumber){try{let filePath=path299.join(directory,".swarm","issue-publication.json"),raw=_internals240.readFileSync(filePath,"utf-8"),parsed=JSON.parse(raw);if(typeof parsed!=="object"||parsed===null)return!1;let o=parsed;return o.published===!0&&typeof o.issueNumber==="number"&&o.issueNumber===issueNumber}catch{return!1}}async function _defaultRecurrenceSweepReceiptExists(directory,issueNumber){try{let filePath=path299.join(directory,".swarm","recurrence-sweep.json"),raw=_internals240.readFileSync(filePath,"utf-8"),parsed=JSON.parse(raw);if(typeof parsed!=="object"||parsed===null)return!1;let o=parsed;if(o.issueNumber!==issueNumber||typeof o.defectClass!=="string"||o.defectClass.trim().length===0)return!1;let relatedProblems=o.relatedProblems;if(!(Array.isArray(relatedProblems)&&relatedProblems.length>0&&relatedProblems.every((rp)=>typeof rp==="object"&&rp!==null&&typeof rp.ref==="string"&&rp.ref.trim().length>0)))return!1;if(o.defectClass!=="no defect class"){let{predicates,dispositions,guardrail}=o,validPredicates=Array.isArray(predicates)&&predicates.length>0&&predicates.every((p)=>typeof p==="string"&&p.trim().length>0),validDispositions=Array.isArray(dispositions)&&dispositions.length>0&&dispositions.every((d)=>typeof d==="object"&&d!==null&&typeof d.ref==="string"&&["FIX","FALSE_POSITIVE","OUT_OF_CLASS","DEFERRED_WITH_USER_APPROVAL"].includes(String(d.disposition))),validGuardrail=typeof guardrail==="object"&&guardrail!==null&&typeof guardrail.kind==="string"&&typeof guardrail.proof==="string";if(!validPredicates||!validDispositions||!validGuardrail)return!1}else if(typeof o.justification!=="string"||o.justification.trim().length===0)return!1;return!0}catch{return!1}}async function _defaultImplementationReviewReceiptExists(directory,issueNumber){try{let filePath=path299.join(directory,".swarm","implementation-review.json"),raw=_internals240.readFileSync(filePath,"utf-8"),parsed=JSON.parse(raw);if(typeof parsed!=="object"||parsed===null)return!1;let o=parsed;return o.issueNumber===issueNumber&&o.reviewerVerdict==="APPROVE"&&o.criticVerdict==="APPROVE"}catch{return!1}}async function _defaultBranchFreshnessReceiptExists(directory,issueNumber){try{let filePath=path299.join(directory,".swarm","branch-freshness.json"),raw=_internals240.readFileSync(filePath,"utf-8"),parsed=JSON.parse(raw);if(typeof parsed!=="object"||parsed===null)return!1;let o=parsed;if(o.issueNumber!==issueNumber)return!1;if(typeof o.freshness!=="string")return!1;let freshness=o.freshness;if(freshness==="synced")return!0;if(/^behind:[1-9][0-9]*$/.test(freshness))return!1;if(/^fetch-failed:\S+$/.test(freshness))return typeof o.override==="string"&&o.override.trim().length>0;return!1}catch{return!1}}var TRACE_VALIDATION_PHASES=["0","1","2","2.5","3","4","4.2","4.5","4.6","5"];function isFortyHex(value){return typeof value==="string"&&/^[0-9a-f]{40}$/.test(value)}async function _defaultTraceValidationReceiptExists(directory,issueNumber){try{let filePath=path299.join(directory,".swarm","trace-validation.json"),raw=_internals240.readFileSync(filePath,"utf-8"),parsed=JSON.parse(raw);if(typeof parsed!=="object"||parsed===null)return!1;let o=parsed;if(o.issueNumber!==issueNumber)return!1;let validations=o.validations;if(!Array.isArray(validations)||validations.length===0)return!1;for(let entry of validations){if(typeof entry!=="object"||entry===null)return!1;let e=entry;if(!TRACE_VALIDATION_PHASES.includes(String(e.phase))||e.outcome!=="pass"||!isFortyHex(e.reviewedCommit)||!isFortyHex(e.treeId))return!1}return!0}catch{return!1}}async function _defaultMergeApprovalReceiptExists(directory,issueNumber){try{let filePath=path299.join(directory,".swarm","merge-approval.json"),raw=_internals240.readFileSync(filePath,"utf-8"),parsed=JSON.parse(raw);if(typeof parsed!=="object"||parsed===null)return!1;let o=parsed;if(o.issueNumber!==issueNumber)return!1;if(!isFortyHex(o.prHeadSha)||!isFortyHex(o.finalCriticReviewedCommit))return!1;return o.prHeadSha===o.finalCriticReviewedCommit}catch{return!1}}var _internals240={readFileSync:readFileSync130,writeFileSync:writeFileSync56,existsSync:existsSync158,renameSync:renameSync44,mkdirSync:mkdirSync87,unlinkSync:unlinkSync49,loadPlanFromLedger:_defaultLoadPlanFromLedger,reproductionReceiptExists:_defaultReproductionReceiptExists,publicationReceiptExists:_defaultPublicationReceiptExists,recurrenceSweepReceiptExists:_defaultRecurrenceSweepReceiptExists,implementationReviewReceiptExists:_defaultImplementationReviewReceiptExists,branchFreshnessReceiptExists:_defaultBranchFreshnessReceiptExists,traceValidationReceiptExists:_defaultTraceValidationReceiptExists,mergeApprovalReceiptExists:_defaultMergeApprovalReceiptExists},TRACE_STATUSES=["in_progress","publication_handoff","published","merge_approval_recorded"];function isTraceStatus(value){return typeof value==="string"&&TRACE_STATUSES.includes(value)}function isPhaseComplete(status2){return status2==="complete"||status2==="completed"}function isValidIssueReference(obj){if(typeof obj!=="object"||obj===null)return!1;let o=obj;if(typeof o.url!=="string")return!1;if(detectForgeFromUrl(o.url)===null){let forge=o.forge;if(!forge||forge.provider!=="gitlab"||typeof forge.host!=="string"||detectForgeFromUrl(o.url,{provider:"gitlab",host:forge.host})===null)return!1}return typeof o.owner==="string"&&typeof o.repo==="string"&&typeof o.number==="number"&&typeof o.timestamp==="string"&&typeof o.flags==="object"&&o.flags!==null}function isValidTraceStateShape(obj){if(typeof obj!=="object"||obj===null)return!1;let o=obj;return typeof o.issueNumber==="number"&&(o.lastTransition===null||typeof o.lastTransition==="string")}function normalizeTraceState(obj){let status2;if(isTraceStatus(obj.status))status2=obj.status;else if(obj.status===void 0&&typeof obj.completed==="boolean")status2=obj.completed?"publication_handoff":"in_progress";else status2="in_progress";return{issueNumber:obj.issueNumber,lastTransition:obj.lastTransition===null||typeof obj.lastTransition==="string"?obj.lastTransition:null,status:status2}}function readIssueReference(directory){try{let filePath=path299.join(directory,".swarm","issue-reference.json"),raw=_internals240.readFileSync(filePath,"utf-8"),parsed=JSON.parse(raw);if(!isValidIssueReference(parsed))return null;return parsed}catch{return null}}function readTraceState(directory){let defaultState={issueNumber:0,lastTransition:null,status:"in_progress"};try{let filePath=path299.join(directory,".swarm","issue-trace-state.json"),raw=_internals240.readFileSync(filePath,"utf-8"),parsed=JSON.parse(raw);if(!isValidTraceStateShape(parsed))return defaultState;return normalizeTraceState(parsed)}catch{return defaultState}}function writeTraceState(directory,state2){let swarmDir=path299.join(directory,".swarm");_internals240.mkdirSync(swarmDir,{recursive:!0});let finalPath=path299.join(swarmDir,"issue-trace-state.json"),tmpPath=path299.join(swarmDir,`issue-trace-state.tmp.${process.pid}.${Date.now()}.json`);_internals240.writeFileSync(tmpPath,JSON.stringify(state2,null,2),"utf-8");try{_internals240.renameSync(tmpPath,finalPath)}catch{try{_internals240.unlinkSync(finalPath)}catch{}try{_internals240.renameSync(tmpPath,finalPath)}catch(retryErr){try{_internals240.unlinkSync(tmpPath)}catch{}throw retryErr}}}function readSpecIssueNumber(directory){try{let filePath=path299.join(directory,".swarm","spec.md"),raw=_internals240.readFileSync(filePath,"utf-8"),sectionStart=raw.indexOf("## Source Issue");if(sectionStart===-1)return null;let nextHeading=raw.indexOf(`
|
|
7393
7393
|
## `,sectionStart+14),sectionEnd=nextHeading===-1?raw.length:nextHeading,section2=raw.slice(sectionStart,sectionEnd),numberMatch=section2.match(/-\s+Number:\s*(\d+)/);if(numberMatch)return parseInt(numberMatch[1],10);let urlMatch=section2.match(/-\s+URL:.*\/issues\/(\d+)/);if(urlMatch)return parseInt(urlMatch[1],10);return null}catch{return null}}async function readPlanPhaseStatus(directory){let plan=await _internals240.loadPlanFromLedger(directory);if(!plan||plan.phases.length===0)return{planExists:!1,allComplete:!1,planSpecHash:void 0};return{planExists:!0,allComplete:plan.phases.every((phase)=>isPhaseComplete(phase.status)),planSpecHash:typeof plan.specHash==="string"?plan.specHash:void 0}}function specExists(directory){return _internals240.existsSync(path299.join(directory,".swarm","spec.md"))}async function reproductionReceiptExists(directory,issueNumber){return _internals240.reproductionReceiptExists(directory,issueNumber)}async function publicationReceiptExists(directory,issueNumber){return _internals240.publicationReceiptExists(directory,issueNumber)}async function recurrenceSweepReceiptExists(directory,issueNumber){return _internals240.recurrenceSweepReceiptExists(directory,issueNumber)}async function implementationReviewReceiptExists(directory,issueNumber){return _internals240.implementationReviewReceiptExists(directory,issueNumber)}async function branchFreshnessReceiptExists(directory,issueNumber){return _internals240.branchFreshnessReceiptExists(directory,issueNumber)}async function traceValidationReceiptExists(directory,issueNumber){return _internals240.traceValidationReceiptExists(directory,issueNumber)}async function mergeApprovalReceiptExists(directory,issueNumber){return _internals240.mergeApprovalReceiptExists(directory,issueNumber)}init_system_guidance_carrier();var _internals241={readIssueReference,readTraceState,writeTraceState,readSpecIssueNumber,readPlanPhaseStatus,specExists,reproductionReceiptExists,publicationReceiptExists,recurrenceSweepReceiptExists,implementationReviewReceiptExists,branchFreshnessReceiptExists,traceValidationReceiptExists,mergeApprovalReceiptExists,isPlanCriticApproved,getPlanLedgerState:getPlanLedgerStateReadOnly,logError:error48,computeSpecHash,boundedApprovalCheck:(directory,timeoutMs)=>boundedApprovalCheck(directory,timeoutMs)},cachedApproval=null,cachedPhaseStatus=null;async function boundedApprovalCheck(directory,timeoutMs){try{let ledgerPath3=path300.join(directory,".swarm","plan-ledger.jsonl"),currentSize=-1,currentMtime=-1;try{let stat25=fs172.statSync(ledgerPath3);currentSize=stat25.size,currentMtime=stat25.mtimeMs}catch{}let state2=null,authorityReadFailed=!1;try{state2=_internals241.getPlanLedgerState(directory)}catch{authorityReadFailed=!0}let revision=authorityReadFailed?null:state2?.authorityMode==="sqlite"?`sqlite:${state2.lastSeq}:${state2.lastEventHash??""}:${state2.updatedAt}`:`file:${currentSize}:${currentMtime}`;if(cachedApproval&&cachedApproval.dir===directory&&cachedApproval.revision===revision)return cachedApproval.result;let timer;try{let timeout=new Promise((resolve115)=>{timer=setTimeout(()=>resolve115(!1),timeoutMs)}),result=await Promise.race([_internals241.isPlanCriticApproved(directory),timeout]);if(revision!==null)cachedApproval={dir:directory,revision,result};return result}finally{if(timer!==void 0)clearTimeout(timer)}}catch{return!1}}async function cachedReadPlanPhaseStatus(directory){let planJsonPath=path300.join(directory,".swarm","plan.json"),currentSize=-1,currentMtime=-1;try{let stat25=fs172.statSync(planJsonPath);currentSize=stat25.size,currentMtime=stat25.mtimeMs}catch{}let ledgerRevision;try{let state2=_internals241.getPlanLedgerState(directory);ledgerRevision=state2?`ledger:${state2.lastSeq}:${state2.lastEventHash??""}:${state2.updatedAt}`:"no-ledger"}catch{ledgerRevision=null}if(cachedPhaseStatus&&cachedPhaseStatus.dir===directory&&cachedPhaseStatus.planJsonSize===currentSize&&cachedPhaseStatus.planJsonMtime===currentMtime&&cachedPhaseStatus.ledgerRevision!==null&&cachedPhaseStatus.ledgerRevision===ledgerRevision)return cachedPhaseStatus.result;let result=await _internals241.readPlanPhaseStatus(directory);if(ledgerRevision===null)return result;return cachedPhaseStatus={dir:directory,planJsonSize:currentSize,planJsonMtime:currentMtime,ledgerRevision,result},result}function createIssueTraceHook(_config2,directory,approvalTimeoutMs=5000){return{messagesTransform:async(_input,output)=>{try{let issueRef=_internals241.readIssueReference(directory);if(!issueRef||issueRef.flags.trace!==!0)return;let traceState=_internals241.readTraceState(directory),_specExists=_internals241.specExists(directory),_specIssueNumber=_internals241.readSpecIssueNumber(directory),phaseStatus=await cachedReadPlanPhaseStatus(directory),_planBoundToSpec;if(phaseStatus.planExists){let currentSpecHash=await _internals241.computeSpecHash(directory);_planBoundToSpec=currentSpecHash!==null&¤tSpecHash===phaseStatus.planSpecHash}let _criticApproved=await boundedApprovalCheck(directory,approvalTimeoutMs),_reproReceipt=await _internals241.reproductionReceiptExists(directory,issueRef.number),_reproductionPermitted=issueRef.flags.noRepro===!0||issueRef.noReproWaiver?.waived===!0||_reproReceipt,_publicationObserved=await _internals241.publicationReceiptExists(directory,issueRef.number),_implementationReviewVerified=await _internals241.implementationReviewReceiptExists(directory,issueRef.number),_recurrenceSweepVerified=await _internals241.recurrenceSweepReceiptExists(directory,issueRef.number),_freshnessPermitted=await _internals241.branchFreshnessReceiptExists(directory,issueRef.number),_traceValidationVerified=await _internals241.traceValidationReceiptExists(directory,issueRef.number),_mergeApprovalObserved=await _internals241.mergeApprovalReceiptExists(directory,issueRef.number),result=computeNextMode({issueReference:issueRef,traceState,workflowArtifacts:{specExists:_specExists,specIssueNumber:_specIssueNumber,planExists:phaseStatus.planExists,criticApproved:_criticApproved,allPhasesComplete:phaseStatus.allComplete,reproductionPermitted:_reproductionPermitted,freshnessPermitted:_freshnessPermitted,publicationObserved:_publicationObserved,implementationReviewVerified:_implementationReviewVerified,recurrenceSweepVerified:_recurrenceSweepVerified,traceValidationVerified:_traceValidationVerified,mergeApprovalObserved:_mergeApprovalObserved,planBoundToSpec:_planBoundToSpec}});if(result.nextMode===null&&result.directive===null)return;let finalDirective=result.directive?result.directive.replace("#N",`#${issueRef.number}`):null,out=output;if(!Array.isArray(out.messages))return;let modeDelivered=result.nextMode===null||appendGuidanceCarrier(out.messages,"issue-trace",`[MODE: ${result.nextMode}]`)!==null,directiveDelivered=finalDirective===null||appendGuidanceCarrier(out.messages,"issue-trace",finalDirective)!==null;if(!modeDelivered||!directiveDelivered)return;_internals241.writeTraceState(directory,{issueNumber:traceState.issueNumber,lastTransition:result.nextLastTransition,status:result.nextStatus})}catch(err){_internals241.logError("[issue-trace] hook cycle failed:",err)}}}}init_schema();init_core_events();init_state2();init_logger();init_knowledge_application();init_knowledge_receipt_ledger();init_knowledge_store();init_system_guidance_carrier();import{existsSync as existsSync159}from"node:fs";var HIGH_RISK_TOOLS=new Set(["save_plan","update_task_status","phase_complete","task","Task","skill_regenerate","skill_retire"]),DEFAULT_MAX_GATE_DENIALS=5,DEFAULT_GATE_STALENESS_MS=600000;function selectCurrentArchitectDirectiveMemberships(memberships){let activeArchitect=memberships.filter((membership)=>membership.exposure_kind==="architect_directive"&&!membership.phase_closed_at),latest,latestAt=Number.NEGATIVE_INFINITY;for(let membership of activeArchitect){let committedAt=Date.parse(membership.committed_at),comparableAt=Number.isFinite(committedAt)?committedAt:Number.NEGATIVE_INFINITY;if(!latest||comparableAt>=latestAt)latest=membership,latestAt=comparableAt}if(!latest)return[];return activeArchitect.filter((membership)=>membership.phase===latest.phase&&membership.task_id===latest.task_id)}function selectStaleUnmarkedMemberships(memberships,now2,stalenessMs){return memberships.filter((membership)=>{if(membership.application_marker||hasEffectiveGateRelease(membership))return!1;let committedAt=Date.parse(membership.committed_at);return Number.isFinite(committedAt)&&now2-committedAt>stalenessMs})}function hasEffectiveGateRelease(membership){return membership.gate_release?.membership_event_id===membership.membership_event_id}function groupMembershipsByTrace(memberships){let byTrace=new Map;for(let membership of memberships){let group=byTrace.get(membership.trace_id)??[];group.push(membership),byTrace.set(membership.trace_id,group)}return byTrace}async function loadDirectiveContents(directory,entryIds){let contents=new Map;if(entryIds.length===0)return contents;let want=new Set(entryIds),sources=[resolveSwarmKnowledgePath(directory)];try{let hivePath=resolveHiveKnowledgePath2();if(existsSync159(hivePath))sources.push(hivePath)}catch{}for(let filePath of sources)try{let entries2=await readKnowledge(filePath);for(let entry of entries2)if(want.has(entry.id)&&!contents.has(entry.id)&&typeof entry.lesson==="string")contents.set(entry.id,entry.lesson)}catch{}return contents}function buildGateDenialMessage(toolName,memberships,contents){let pairs=memberships.map((m)=>`${m.trace_id}:${m.entry_id}`),examples=memberships.map((m)=>` KNOWLEDGE_N_A:${m.trace_id}:${m.entry_id} reason=<reason>`),contentLines=memberships.map((m)=>{let lesson=contents.get(m.entry_id);return` [${m.trace_id}:${m.entry_id}] ${lesson??"content not found in knowledge store — see the most recent <swarm_knowledge_directives> block or run knowledge_recall"}`});return[`KNOWLEDGE_ENFORCE_GATE_DENY: ${toolName} blocked — unacknowledged critical knowledge directive(s): ${pairs.join(", ")}.`,"","Acknowledge each directive using its exact, colon-separated tokens (<trace_id>:<entry_id>) with one of these verb markers:"," KNOWLEDGE_APPLIED:<trace_id>:<entry_id>"," KNOWLEDGE_IGNORED:<trace_id>:<entry_id> reason=<short reason>"," KNOWLEDGE_CONTRADICTED:<trace_id>:<entry_id> reason=<observable conflict>"," KNOWLEDGE_N_A:<trace_id>:<entry_id> reason=<short reason>"," KNOWLEDGE_VIOLATED:<trace_id>:<entry_id> reason=<short reason>","KNOWLEDGE_N_A (does not apply; neutral) is a valid, penalty-free acknowledgment when the directive does not pertain to the current step.","","Copy-paste to acknowledge each directive now (replace <reason> with a short reason):",...examples,"","Directive content being acknowledged:",...contentLines].join(`
|
|
7394
|
-
`)}async function knowledgeApplicationGateBefore(directory,input,config3){if(!config3.enabled)return;let toolName=typeof input.tool==="string"?input.tool:"";if(!(config3.high_risk_tools?new Set(config3.high_risk_tools):HIGH_RISK_TOOLS).has(toolName))return;let agentRaw=typeof input.agent==="string"?input.agent:"";if(!agentRaw)return;if(stripKnownSwarmPrefix(agentRaw)!=="architect")return;let sessionID=typeof input.sessionID==="string"?input.sessionID:void 0;if(!sessionID){if(config3.mode==="enforce")throw Error("KNOWLEDGE_ENFORCE_GATE_DENY: missing sessionID on tool.execute.before; refusing to evaluate critical-directive ack state");writeWarnEvent2(directory,{timestamp:new Date().toISOString(),event:"knowledge_application_gate_warn",tool:toolName,agent:agentRaw,reason:"missing_sessionID",mode:config3.mode}).catch(()=>{});return}let receiptState=await queryLiveMemberships(directory,{session_id:sessionID,include_terminal:!0,include_phase_closed:!1,exposure_kind:"architect_directive"});if(!receiptState.ok){if(config3.mode==="enforce")throw Error(`KNOWLEDGE_ENFORCE_GATE_DENY: receipt authority unavailable (${receiptState.code}); refusing to infer acknowledgment from diagnostics`);writeWarnEvent2(directory,{timestamp:new Date().toISOString(),event:"knowledge_application_gate_warn",tool:toolName,agent:agentRaw,sessionID,reason:receiptState.code});return}let currentMemberships=selectCurrentArchitectDirectiveMemberships(receiptState.memberships),criticalMemberships=currentMemberships.filter((membership)=>membership.critical);if(criticalMemberships.length===0){clearGateDenialCount(sessionID);return}let acknowledgedEntryIds=new Set(currentMemberships.filter((membership)=>membership.application_marker?.source==="architect_marker").map((membership)=>membership.entry_id)),unackedMemberships=criticalMemberships.filter((membership)=>!membership.application_marker&&!hasEffectiveGateRelease(membership)&&!acknowledgedEntryIds.has(membership.entry_id));if(unackedMemberships.length===0){clearGateDenialCount(sessionID);return}if(config3.mode==="enforce"&&config3.critical_requires_ack){let maxDenials=config3.max_gate_denials??DEFAULT_MAX_GATE_DENIALS,stalenessMs=config3.gate_staleness_ms??DEFAULT_GATE_STALENESS_MS,now2=Date.now(),staleMemberships=selectStaleUnmarkedMemberships(unackedMemberships,now2,stalenessMs);if(staleMemberships.length>0){for(let[traceId,memberships]of groupMembershipsByTrace(staleMemberships)){let committed=await commitGateReleaseBatch(directory,{trace_id:traceId,session_id:sessionID,items:memberships.map((membership)=>({entry_id:membership.entry_id,source:"application_gate_staleness_release",reason:"configured staleness escape hatch"}))});if(!committed.ok||committed.rejected.length>0)throw Error(
|
|
7394
|
+
`)}async function knowledgeApplicationGateBefore(directory,input,config3){if(!config3.enabled)return;let toolName=typeof input.tool==="string"?input.tool:"";if(!(config3.high_risk_tools?new Set(config3.high_risk_tools):HIGH_RISK_TOOLS).has(toolName))return;let agentRaw=typeof input.agent==="string"?input.agent:"";if(!agentRaw)return;if(stripKnownSwarmPrefix(agentRaw)!=="architect")return;let sessionID=typeof input.sessionID==="string"?input.sessionID:void 0;if(!sessionID){if(config3.mode==="enforce")throw Error("KNOWLEDGE_ENFORCE_GATE_DENY: missing sessionID on tool.execute.before; refusing to evaluate critical-directive ack state");writeWarnEvent2(directory,{timestamp:new Date().toISOString(),event:"knowledge_application_gate_warn",tool:toolName,agent:agentRaw,reason:"missing_sessionID",mode:config3.mode}).catch(()=>{});return}let receiptState=await queryLiveMemberships(directory,{session_id:sessionID,include_terminal:!0,include_phase_closed:!1,exposure_kind:"architect_directive"});if(!receiptState.ok){if(config3.mode==="enforce")throw Error(`KNOWLEDGE_ENFORCE_GATE_DENY: receipt authority unavailable (${receiptState.code}); refusing to infer acknowledgment from diagnostics`);writeWarnEvent2(directory,{timestamp:new Date().toISOString(),event:"knowledge_application_gate_warn",tool:toolName,agent:agentRaw,sessionID,reason:receiptState.code});return}let currentMemberships=selectCurrentArchitectDirectiveMemberships(receiptState.memberships),criticalMemberships=currentMemberships.filter((membership)=>membership.critical);if(criticalMemberships.length===0){clearGateDenialCount(sessionID);return}let acknowledgedEntryIds=new Set(currentMemberships.filter((membership)=>membership.application_marker?.source==="architect_marker").map((membership)=>membership.entry_id)),unackedMemberships=criticalMemberships.filter((membership)=>!membership.application_marker&&!hasEffectiveGateRelease(membership)&&!acknowledgedEntryIds.has(membership.entry_id));if(unackedMemberships.length===0){clearGateDenialCount(sessionID);return}if(config3.mode==="enforce"&&config3.critical_requires_ack){let maxDenials=config3.max_gate_denials??DEFAULT_MAX_GATE_DENIALS,stalenessMs=config3.gate_staleness_ms??DEFAULT_GATE_STALENESS_MS,now2=Date.now(),staleMemberships=selectStaleUnmarkedMemberships(unackedMemberships,now2,stalenessMs);if(staleMemberships.length>0){for(let[traceId,memberships]of groupMembershipsByTrace(staleMemberships)){let committed=await commitGateReleaseBatch(directory,{trace_id:traceId,session_id:sessionID,items:memberships.map((membership)=>({entry_id:membership.entry_id,source:"application_gate_staleness_release",reason:"configured staleness escape hatch"}))});if(!committed.ok||committed.rejected.length>0)throw Error(`KNOWLEDGE_ENFORCE_GATE_DENY: could not durably record staleness release${committed.ok&&committed.rejected.length>0?` (${committed.rejected.map((item)=>`${item.entry_id}: ${item.reason}`).join("; ")})`:""}`)}let stalePairs=new Set(staleMemberships.map((membership)=>`${membership.trace_id}/${membership.entry_id}`));unackedMemberships=unackedMemberships.filter((membership)=>!stalePairs.has(`${membership.trace_id}/${membership.entry_id}`));let staleIds=[...new Set(staleMemberships.map((membership)=>membership.entry_id))];if(await writeWarnEvent2(directory,{timestamp:new Date().toISOString(),event:"knowledge_application_gate_staleness_clear",tool:toolName,agent:agentRaw,sessionID,cleared_ids:staleIds,cleared_pairs:[...stalePairs],age_ms:Math.max(...staleMemberships.map((membership)=>now2-Date.parse(membership.committed_at))),staleness_threshold_ms:stalenessMs}).catch((err)=>{warn(`[knowledge-application-gate] staleness-clear audit write failed: ${err instanceof Error?err.message:String(err)}`)}),unackedMemberships.length===0){clearCriticalShownIds(sessionID);return}}let unacked2=[...new Set(unackedMemberships.map((membership)=>membership.entry_id))],directiveKey=buildGateDenialDirectiveKey(unacked2),denials=incrementGateDenialCount(sessionID,directiveKey);if(denials>maxDenials){for(let[traceId,memberships]of groupMembershipsByTrace(unackedMemberships)){let committed=await commitGateReleaseBatch(directory,{trace_id:traceId,session_id:sessionID,items:memberships.map((membership)=>({entry_id:membership.entry_id,source:"application_gate_denial_limit_release",reason:"configured denial-count escape hatch"}))});if(!committed.ok||committed.rejected.length>0)throw Error(`KNOWLEDGE_ENFORCE_GATE_DENY: could not durably record denial-limit release${committed.ok&&committed.rejected.length>0?` (${committed.rejected.map((item)=>`${item.entry_id}: ${item.reason}`).join("; ")})`:""}`)}clearCriticalShownIds(sessionID),clearGateDenialCount(sessionID),await writeWarnEvent2(directory,{timestamp:new Date().toISOString(),event:"knowledge_application_gate_denial_limit_clear",tool:toolName,agent:agentRaw,sessionID,cleared_ids:unacked2,denial_count:denials,max_gate_denials:maxDenials}).catch((err)=>{warn(`[knowledge-application-gate] denial-limit-clear audit write failed: ${err instanceof Error?err.message:String(err)}`)});return}let contents=await loadDirectiveContents(directory,unacked2);throw Error(buildGateDenialMessage(toolName,unackedMemberships,contents))}let unacked=[...new Set(unackedMemberships.map((membership)=>membership.entry_id))],unackedPairs=unackedMemberships.map((membership)=>`${membership.trace_id}/${membership.entry_id}`);writeWarnEvent2(directory,{timestamp:new Date().toISOString(),event:"knowledge_application_gate_warn",tool:toolName,agent:agentRaw,sessionID,unacknowledged_critical_ids:unacked,unacknowledged_critical_pairs:unackedPairs}).catch(()=>{})}async function writeWarnEvent2(directory,record3){appendCoreEventSync(directory,record3)}async function knowledgeApplicationTransformScan(directory,output,sessionID){if(!output?.messages)return;if(!sessionID)return;let target;for(let i=output.messages.length-1;i>=0;i--){let m=output.messages[i];if(isGuidanceCarrier(m))continue;let agent=m.info?.agent;if(typeof agent==="string"&&stripKnownSwarmPrefix(agent)==="architect"){target=m;break}}if(!target)return;let text=(target.parts??[]).map((p)=>typeof p.text==="string"?p.text:"").join(`
|
|
7395
7395
|
`);if(!text)return;let acks=parseAcknowledgments(text);if(acks.length===0)return;let ctx={sessionId:sessionID},live=await queryLiveMemberships(directory,{session_id:sessionID,include_terminal:!0,include_phase_closed:!1,exposure_kind:"architect_directive"});if(!live.ok){warn(`[knowledge-application-gate] receipt authority unavailable: ${live.code}`);return}for(let ack of acks){if(!ack.trace_id)continue;let key2=buildAckDedupKey(sessionID,JSON.stringify([ack.trace_id,ack.id]),ack.result);if(swarmState.knowledgeAckDedup.has(key2))continue;let memberships=live.memberships.filter((membership)=>membership.trace_id===ack.trace_id&&membership.entry_id===ack.id&&!membership.application_marker&&!hasEffectiveGateRelease(membership));if(memberships.length===0)continue;let byTrace=new Map;for(let membership of memberships){let group=byTrace.get(membership.trace_id)??[];group.push(membership),byTrace.set(membership.trace_id,group)}let committedAll=!0,newlyCommitted=!1;for(let[traceId,group]of byTrace){let committed=await commitApplicationOutcomeBatch(directory,{trace_id:traceId,session_id:sessionID,items:group.map((membership)=>({entry_id:membership.entry_id,outcome:ack.result,source:"architect_marker",reason:ack.reason}))});if(!committed.ok||committed.rejected.length>0){committedAll=!1;break}if(committed.committed.length>0)newlyCommitted=!0}if(!committedAll)continue;if(addKnowledgeAckDedup(key2),!newlyCommitted)continue;try{await recordAcknowledgment(directory,ack,ctx)}catch(err){warn(`[knowledge-application-gate] transform-scan record failed: ${err instanceof Error?err.message:String(err)}`)}}}init_knowledge_curator();init_knowledge_injector();init_micro_reflector();init_agent_names();init_schema();init_state2();var NON_ARCHITECT_ADVISORY_KEY="[non-architect-advisory]",HOST_INTERNAL_AGENTS=new Set(["compaction","title","summary"]),SWARM_SUBAGENT_ROLES=new Set(ALL_SUBAGENT_NAMES);function maybeEmitNonArchitectAdvisory(sessionID,agentName){if(!sessionID||!agentName.trim())return!1;let role=stripKnownSwarmPrefix(agentName);if(role==="architect")return!1;if(HOST_INTERNAL_AGENTS.has(role))return!1;if(SWARM_SUBAGENT_ROLES.has(role))return!1;let session=swarmState.agentSessions.get(sessionID)??ensureAgentSession(sessionID);if(!session||session.nonArchitectAdvisoryDone)return!1;let enqueued=pushAdvisory(session,`[swarm] This session is running on "${agentName}", not a swarm architect. The gated pipeline (plan approval, delegation gates, scoped writes) is only active on architect sessions. Switch to an architect agent or set auto_select_architect in opencode-swarm.json. ${NON_ARCHITECT_ADVISORY_KEY}`,{dedupeKey:NON_ARCHITECT_ADVISORY_KEY});if(enqueued)session.nonArchitectAdvisoryDone=!0;return enqueued}init_normalize_tool_name();init_plan_task_id_context();init_pr_subscriptions();init_forge_provider();init_utils();init_stored_input_args();init_normalize_tool_name();var MAX_OUTPUT_SCAN_BYTES=65536,PR_URL_PATTERN=/https:\/\/github\.com\/([A-Za-z0-9_.-]+)\/([A-Za-z0-9_.-]+)\/pull\/(\d+)/,MR_URL_PATTERN=/https:\/\/(gitlab\.com|gitlab\.[A-Za-z0-9.-]+)\/([A-Za-z0-9_.-]+(?:\/[A-Za-z0-9_.-]+)*)\/([A-Za-z0-9_.-]+)\/-\/merge_requests\/(\d+)/,_internals242={subscribe,log};function extractPrUrl(text){let slice=text.slice(0,MAX_OUTPUT_SCAN_BYTES),ghMatch=PR_URL_PATTERN.exec(slice);if(ghMatch){let owner=ghMatch[1],repo=ghMatch[2],prNumber=Number.parseInt(ghMatch[3],10);if(!Number.isSafeInteger(prNumber)||prNumber<=0)return null;return{repoFullName:`${owner}/${repo}`,prNumber,prUrl:buildPrUrl({provider:"github",host:"github.com"},owner,repo,prNumber)}}let glMatch=MR_URL_PATTERN.exec(slice);if(glMatch){let host=glMatch[1].toLowerCase(),owner=glMatch[2],repo=glMatch[3],prNumber=Number.parseInt(glMatch[4],10);if(!Number.isSafeInteger(prNumber)||prNumber<=0)return null;let context=detectForgeFromUrl(`https://${host}/${owner}/${repo}`);if(!context)return null;return{repoFullName:`${owner}/${repo}`,prNumber,prUrl:buildPrUrl(context,owner,repo,prNumber)}}return null}function createPrAutoSubscribeHook(directory,config3){return{toolAfter:async(input,output)=>{try{if(!config3.enabled||!config3.auto_subscribe_on_pr_create)return;let sessionID=typeof input.sessionID==="string"?input.sessionID.trim():"";if(!sessionID)return;let tool3=normalizeToolNameLowerCase(input.tool??"");if(tool3!=="bash"&&tool3!=="shell")return;let args2=(typeof input.callID==="string"?getStoredInputArgs(input.callID):void 0)??input.args??output.args,command=typeof args2?.command==="string"?args2.command:"";if(!command.includes("gh pr create")&&!command.includes("glab mr create"))return;let outputText2=typeof output.output==="string"?output.output:"";if(!outputText2)return;let prInfo=extractPrUrl(outputText2);if(!prInfo)return;await _internals242.subscribe(directory,{sessionID,prNumber:prInfo.prNumber,repoFullName:prInfo.repoFullName,prUrl:prInfo.prUrl,maxSubscriptions:config3.max_subscriptions}),_internals242.log("[pr-monitor] Auto-subscribed session to created PR",{sessionID,pr:`${prInfo.repoFullName}#${prInfo.prNumber}`})}catch(err){_internals242.log("[pr-monitor] Auto-subscribe failed (non-fatal)",{error:err instanceof Error?err.message:String(err)})}}}}init_pr_workflow_gate();init_pending_delegations();init_pr_feedback_event_queue();init_pr_subscriptions();init_core_events();init_forge_provider();init_pr_workflow_skill_contract();init_utils();init_pr_workflow_auto_wake();init_pr_workflow_gate();import{createHash as createHash101}from"node:crypto";var DEFAULT_WAKE_TIMEOUT_MS=5000,DEFAULT_BOUNDARY_QUIET_MS=120000,DEFAULT_BOUNDARY_WATCHDOG_MS=5000,DEFAULT_STATUS_PROBE_TIMEOUT_MS=250,MAX_TRACKED_BOUNDARY_TOOL_PARTS=200,_internals243={readPrWorkflowGateState,claimPrFeedbackMonitorEvents,readPrFeedbackMonitorQueue,observePrWorkflowAutoWakeEvent,scanDelegationsForRecovery,ensurePrWorkflowSkillContractsFresh},DEFAULT_MAX_CONSECUTIVE_UNPRODUCTIVE_WAKES=5,DEFAULT_WAKE_COOLDOWN_MS=30000,DEFAULT_BANNER_COOLDOWN_MS=20000,MAX_FALLBACK_BANNER_INJECTIONS_PER_SESSION=20,BANNER_PREFIX_PATTERN=/^--- \[(?:PR_REVIEW|PR_FEEDBACK) WORKFLOW ACTIVE/,DEFAULT_TOTAL_WAKE_CEILINGS={S:12,M:54,L:102},MAX_TRACKED_WAKE_SESSIONS=200;function activeWorkflowLaneKeys(state2){let keys=new Set;for(let batch of state2.prReviewBaseDispatches??[])for(let lane of batch.lanes)keys.add(`${batch.batchId}\x00${lane.laneId}`);for(let batch of state2.prReviewValidationBatches??[])for(let lane of batch.lanes)keys.add(`${batch.batchId}\x00${lane.laneId}`);for(let batch of state2.prFeedbackVerifications??[])for(let lane of batch.ownership)keys.add(`${batch.batchId}\x00${lane.laneId}`);for(let batch of state2.prFeedbackGateBatches??[])keys.add(`${batch.batchId}\x00${batch.laneId}`);return keys}function workflowProgressSnapshot(directory,sessionID,state2){let scan;try{scan=_internals243.scanDelegationsForRecovery(directory)}catch{return{kind:"uncertain"}}if(scan.status!=="ok")return{kind:"uncertain"};let activeKeys=activeWorkflowLaneKeys(state2),activatedAt=Date.parse(state2.activatedAt),modePrefix=state2.mode==="PR_REVIEW"?"swarm-pr-review:":"swarm-pr-feedback:",tuples=scan.owners.filter((record3)=>{if(record3.parentSessionId!==sessionID||!record3.mode?.startsWith(modePrefix)||!record3.batchId||!record3.laneId||!activeKeys.has(`${record3.batchId}\x00${record3.laneId}`)||Number.isFinite(activatedAt)&&record3.createdAt<activatedAt)return!1;return!state2.prHeadSha||record3.workspace?.prHeadSha===state2.prHeadSha}).map((record3)=>{let result=record3.result??record3.terminalResult?.result;return[record3.correlationId,record3.batchId,record3.laneId,record3.status,record3.terminalResult?.eventId??"",result?.digest??"",result?.outputRef??"",result?.prReviewResultReceipt?.semanticEnvelopeDigest??""].join("\x00")}).sort((left,right)=>left.localeCompare(right)),workflowIdentity2=state2.workflowInstanceId??`${state2.mode}\x00${state2.activatedAt}`;return{kind:"valid",token:createHash101("sha256").update(`${workflowIdentity2}\x00${state2.revision}\x00${tuples.join(`
|
|
7396
7396
|
`)}`).digest("hex")}}function observeWorkflowProgress(budget,snapshot){if(snapshot.kind==="uncertain")return budget.progressUncertain=!0,!1;if(budget.progressUncertain)return budget.progressUncertain=!1,budget.lastSeenProgressToken=snapshot.token,!1;let madeProgress=budget.lastSeenProgressToken===void 0||budget.lastSeenProgressToken!==snapshot.token;return budget.lastSeenProgressToken=snapshot.token,madeProgress}function isValidTotalWakeCeiling(value){return value!==void 0&&Number.isInteger(value)&&value>0}function asRecord3(value){return typeof value==="object"&&value!==null?value:void 0}function asArray(value){return Array.isArray(value)?value:[]}function eventEnvelope2(event){return asRecord3(event.properties)??asRecord3(event.data)??{}}function envelopeSessionID(envelope){let info=asRecord3(envelope.info),candidate2=envelope.sessionID??envelope.sessionId??info?.sessionID??info?.sessionId??info?.id;return typeof candidate2==="string"&&candidate2.trim()!==""?candidate2.trim():void 0}function normalizeSessionReadiness(value){if(value==="idle"||value==="busy"||value==="retry")return value;let nested=asRecord3(value)?.type;return nested==="idle"||nested==="busy"||nested==="retry"?nested:"unknown"}function extractToolPartID(part){let state2=asRecord3(part.state),candidate2=part.id??part.partID??part.callID??state2?.id??state2?.partID??state2?.callID;return typeof candidate2==="string"&&candidate2.trim()!==""?candidate2.trim():void 0}function isInFlightToolStatus(value){return value==="pending"||value==="running"}function isTerminalToolStatus(value){return value==="completed"||value==="error"||value==="cancelled"||value==="aborted"}function canonicalGitHubPrUrl4(value,configured){return canonicalForgePrUrl(value,configured)}function sameGitHubPr2(left,right,configured){let leftCanonical=canonicalGitHubPrUrl4(left,configured);return leftCanonical!==null&&leftCanonical===canonicalGitHubPrUrl4(right,configured)}async function resolveWakeForgeContext(directory,firstQueuedEvent,feedbackTarget){try{let key2=firstQueuedEvent?.repoFullName?{repoFullName:firstQueuedEvent.repoFullName,prNumber:firstQueuedEvent.prNumber,...firstQueuedEvent.prUrl?{prUrl:firstQueuedEvent.prUrl}:{}}:feedbackTarget?{prUrl:feedbackTarget}:null;if(!key2)return;return(await findSubscriptionRecordForPrUrl(directory,key2))?.forge}catch{return}}function formatQueuedMonitorEventsText(events){if(events.length===0)return"";return["Queued PR monitor events are now authorized for this PR_FEEDBACK workflow and must be treated as feedback inputs for the current round:",...events.map((event)=>`- ${event.type} on ${event.repoFullName}#${event.prNumber}: ${event.message.split(`
|
|
7397
7397
|
`)[0]}`),"Do not expand or replace an already-declared immutable feedback inventory; if these events require a later round, finish or abort the current round first."].join(`
|
|
@@ -7733,7 +7733,7 @@ ${scanResult.findings.filter((f)=>f.severity==="error").map((f)=>`- ${f.pattern}
|
|
|
7733
7733
|
${scanResult.neutralized}`;return result}catch(error93){if(error93 instanceof DOMException&&(error93.name==="TimeoutError"||error93.name==="AbortError")){if(attempt>=GITINGEST_MAX_RETRIES)throw Error("gitingest request timed out");let backoff=200*2**attempt;await delay4(backoff);continue}if(error93 instanceof Error&&error93.message.startsWith("gitingest "))throw error93;if(attempt<GITINGEST_MAX_RETRIES){let backoff=200*2**attempt;await delay4(backoff);continue}throw error93}throw Error("gitingest request failed after retries")}var gitingest=createSwarmTool({description:"Fetch a GitHub repository's full content via gitingest.com. Returns summary, directory tree, and file contents optimized for LLM analysis. Use when you need to understand an external repository's structure or code.",args:{url:exports_external.string().describe("GitHub repository URL (e.g., https://github.com/owner/repo)"),maxFileSize:exports_external.number().optional().describe("Maximum file size in bytes to include (default: 50000)"),pattern:exports_external.string().optional().describe("Glob pattern to filter files (e.g., '*.ts' or 'src/**/*.py')"),patternType:exports_external.enum(["include","exclude"]).optional().describe("Whether pattern includes or excludes matching files (default: exclude)")},async execute(args2,_directory2,_ctx){return fetchGitingest(args2)}});init_zod();init_create_tool();init_path_security();import*as fs195 from"node:fs";import*as path331 from"node:path";var MAX_FILE_PATH_LENGTH3=500,MAX_SYMBOL_LENGTH=256,MAX_FILE_SIZE_BYTES7=1048576,MAX_CONSUMERS=100,SUPPORTED_EXTENSIONS2=[".ts",".tsx",".js",".jsx",".mjs",".cjs"],BINARY_SIGNATURES2=[0,2303741511,4292411360,1195984440,626017350,1347093252],BINARY_PREFIX_BYTES2=4,BINARY_NULL_CHECK_BYTES2=8192,BINARY_NULL_THRESHOLD2=0.1;function validateFileInput(file3){if(!file3||file3.length===0)return"file is required";if(file3.length>MAX_FILE_PATH_LENGTH3)return`file exceeds maximum length of ${MAX_FILE_PATH_LENGTH3}`;if(containsControlChars(file3))return"file contains control characters";if(containsPathTraversal(file3))return"file contains path traversal";return null}function validateSymbolInput(symbol3){if(symbol3===void 0||symbol3==="")return null;if(symbol3.length>MAX_SYMBOL_LENGTH)return`symbol exceeds maximum length of ${MAX_SYMBOL_LENGTH}`;if(containsControlChars(symbol3))return"symbol contains control characters";if(containsPathTraversal(symbol3))return"symbol contains path traversal";return null}function isBinaryFile3(filePath,buffer){let ext=path331.extname(filePath).toLowerCase();if(ext===".json"||ext===".md"||ext===".txt")return!1;if(buffer.length>=BINARY_PREFIX_BYTES2){let uint323=buffer.subarray(0,BINARY_PREFIX_BYTES2).readUInt32BE(0);for(let sig of BINARY_SIGNATURES2)if(uint323===sig)return!0}let nullCount=0,checkLen=Math.min(buffer.length,BINARY_NULL_CHECK_BYTES2);for(let i=0;i<checkLen;i++)if(buffer[i]===0)nullCount++;return nullCount>checkLen*BINARY_NULL_THRESHOLD2}function parseImports(content,targetFile,targetSymbol){let imports=[],_resolvedTarget;try{_resolvedTarget=path331.resolve(targetFile)}catch{_resolvedTarget=targetFile}let targetBasename=path331.basename(targetFile,path331.extname(targetFile)),targetWithExt=targetFile,targetWithoutExt=targetFile.replace(/\.(ts|tsx|js|jsx|mjs|cjs)$/i,""),normalizedTargetWithExt=path331.normalize(targetWithExt).replace(/\\/g,"/"),normalizedTargetWithoutExt=path331.normalize(targetWithoutExt).replace(/\\/g,"/"),importRegex=/import\s+(?:\{[\s\S]*?\}|(?:\*\s+as\s+\w+)|\w+)\s+from\s+['"`]([^'"`]+)['"`]|import\s+['"`]([^'"`]+)['"`]|require\s*\(\s*['"`]([^'"`]+)['"`]\s*\)/g;for(let match=importRegex.exec(content);match!==null;match=importRegex.exec(content)){let modulePath=match[1]||match[2]||match[3];if(!modulePath)continue;let lineNum=(content.substring(0,match.index).match(/\n/g)||[]).length+1,matchedString=match[0],importType="named";if(matchedString.includes("* as"))importType="namespace";else if(/^import\s+\{/.test(matchedString))importType="named";else if(/^import\s+\w+\s+from\s+['"`]/.test(matchedString))importType="default";else if(/^import\s+['"`]/m.test(matchedString))importType="sideeffect";else if(matchedString.includes("require("))importType="require";let _normalizedModule=modulePath.replace(/^\.\//,"").replace(/^\.\.\\/,"../"),isMatch=!1,_targetDir=path331.dirname(targetFile),targetExt=path331.extname(targetFile),targetBasenameNoExt=path331.basename(targetFile,targetExt),moduleNormalized=modulePath.replace(/\\/g,"/").replace(/^\.\//,""),moduleName=modulePath.split(/[/\\]/).pop()||"",moduleNameNoExt=moduleName.replace(/\.(ts|tsx|js|jsx|mjs|cjs)$/i,"");if(modulePath===targetBasename||modulePath===targetBasenameNoExt||modulePath===`./${targetBasename}`||modulePath===`./${targetBasenameNoExt}`||modulePath===`../${targetBasename}`||modulePath===`../${targetBasenameNoExt}`||moduleNormalized===normalizedTargetWithExt||moduleNormalized===normalizedTargetWithoutExt||modulePath.endsWith(`/${targetBasename}`)||modulePath.endsWith(`\\${targetBasename}`)||modulePath.endsWith(`/${targetBasenameNoExt}`)||modulePath.endsWith(`\\${targetBasenameNoExt}`)||moduleNameNoExt===targetBasenameNoExt||`./${moduleNameNoExt}`===targetBasenameNoExt||moduleName===targetBasename||moduleName===targetBasenameNoExt)isMatch=!0;if(isMatch&&targetSymbol)if(importType==="namespace"||importType==="sideeffect")isMatch=!1;else{let namedMatch=matchedString.match(/import\s+\{([\s\S]*?)\}\s+from/);if(namedMatch)isMatch=namedMatch[1].split(",").map((s)=>{let parts=s.trim().split(/\s+as\s+/i),originalName=parts[0].trim(),aliasName=parts[1]?.trim();return{original:originalName,alias:aliasName}}).some(({original,alias})=>original===targetSymbol||alias===targetSymbol);else if(importType==="default"){let defaultMatch=matchedString.match(/^import\s+(\w+)\s+from/m);if(defaultMatch)isMatch=defaultMatch[1]===targetSymbol}}if(isMatch)imports.push({line:lineNum,imports:modulePath,importType,raw:matchedString.trim()})}return imports}var SKIP_DIRECTORIES4=new Set(["node_modules",".git","dist","build","out","coverage",".next",".nuxt",".cache","vendor",".svn",".hg"]);function findSourceFiles2(dir,files=[],stats2={skippedDirs:[],skippedFiles:0,fileErrors:[]}){let entries2;try{entries2=fs195.readdirSync(dir)}catch(e){return stats2.fileErrors.push({path:dir,reason:e instanceof Error?e.message:"readdir failed"}),files}entries2.sort((a,b)=>a.toLowerCase().localeCompare(b.toLowerCase()));for(let entry of entries2){if(SKIP_DIRECTORIES4.has(entry)){stats2.skippedDirs.push(path331.join(dir,entry));continue}let fullPath=path331.join(dir,entry),stat25;try{stat25=fs195.statSync(fullPath)}catch(e){stats2.fileErrors.push({path:fullPath,reason:e instanceof Error?e.message:"stat failed"});continue}if(stat25.isDirectory())findSourceFiles2(fullPath,files,stats2);else if(stat25.isFile()){let ext=path331.extname(fullPath).toLowerCase();if(SUPPORTED_EXTENSIONS2.includes(ext))files.push(fullPath)}}return files}var imports=createSwarmTool({description:"Find all reverse dependencies (consumers) that import from a given file. Returns JSON with file path, line numbers, and import metadata for each consumer. Use this to understand who depends on a module before refactoring.",args:{file:exports_external.string().describe('Source file path to find importers for (e.g., "./src/utils.ts")'),symbol:exports_external.string().optional().describe('Optional specific symbol to filter imports (e.g., "MyClass")')},async execute(args2,_directory2,_ctx){let typedArgs=args2,file3,symbol3;try{if(typedArgs&&typeof typedArgs==="object")file3=typedArgs.file,symbol3=typedArgs.symbol}catch{}if(file3===void 0)return JSON.stringify({error:"invalid arguments: file is required",target:"",symbol:void 0,consumers:[],count:0},null,2);let fileValidationError=validateFileInput(file3);if(fileValidationError){let errorResult={error:`invalid file: ${fileValidationError}`,target:file3,symbol:symbol3,consumers:[],count:0};return JSON.stringify(errorResult,null,2)}let symbolValidationError=validateSymbolInput(symbol3);if(symbolValidationError){let errorResult={error:`invalid symbol: ${symbolValidationError}`,target:file3,symbol:symbol3,consumers:[],count:0};return JSON.stringify(errorResult,null,2)}try{let targetFile=path331.resolve(file3);if(!fs195.existsSync(targetFile)){let errorResult={error:`target file not found: ${file3}`,target:file3,symbol:symbol3,consumers:[],count:0};return JSON.stringify(errorResult,null,2)}if(!fs195.statSync(targetFile).isFile())return JSON.stringify({error:"target must be a file, not a directory",target:file3,symbol:symbol3,consumers:[],count:0},null,2);let baseDir=path331.dirname(targetFile),filesToScan=findSourceFiles2(baseDir,[],{skippedDirs:[],skippedFiles:0,fileErrors:[]}).filter((f)=>f!==targetFile).sort((a,b)=>a.toLowerCase().localeCompare(b.toLowerCase())).slice(0,MAX_CONSUMERS*10),consumers=[],skippedFileCount=0,totalMatchesFound=0;for(let filePath of filesToScan){if(consumers.length>=MAX_CONSUMERS)break;try{if(fs195.statSync(filePath).size>MAX_FILE_SIZE_BYTES7){skippedFileCount++;continue}let buffer=fs195.readFileSync(filePath);if(isBinaryFile3(filePath,buffer)){skippedFileCount++;continue}let content=buffer.toString("utf-8"),fileImports=parseImports(content,targetFile,symbol3);for(let imp of fileImports){if(totalMatchesFound++,consumers.length>=MAX_CONSUMERS)continue;if(consumers.some((c)=>c.file===filePath&&c.line===imp.line))continue;consumers.push({file:filePath,line:imp.line,imports:imp.imports,importType:imp.importType,raw:imp.raw})}}catch(_e){skippedFileCount++}}let result={target:file3,symbol:symbol3,consumers,count:consumers.length},parts=[];if(filesToScan.length>=MAX_CONSUMERS*10)parts.push(`Scanned ${filesToScan.length} files`);if(skippedFileCount>0)parts.push(`${skippedFileCount} skipped (size/binary/errors)`);if(consumers.length>=MAX_CONSUMERS){let hidden=totalMatchesFound-consumers.length;if(hidden>0)parts.push(`Results limited to ${MAX_CONSUMERS} consumers (${hidden} hidden)`);else parts.push(`Results limited to ${MAX_CONSUMERS} consumers`)}if(parts.length>0)result.message=`${parts.join("; ")}.`;return JSON.stringify(result,null,2)}catch(e){let errorResult={error:e instanceof Error?`scan failed: ${e.message||"internal error"}`:"scan failed: unknown error",target:file3,symbol:symbol3,consumers:[],count:0};return JSON.stringify(errorResult,null,2)}}});init_zod();init_pr_workflow_gate();init_create_tool();var InvalidatePrFeedbackPublicationArgsSchema=exports_external.object({reason:exports_external.string().trim().min(1).max(500)}).strict();async function executeInvalidatePrFeedbackPublication(args2,directory,context={}){let parsed=InvalidatePrFeedbackPublicationArgsSchema.safeParse(args2);if(!parsed.success)return JSON.stringify({success:!1,message:`Invalid publication invalidation: ${parsed.error.issues.map((issue3)=>`${issue3.path.join(".")}: ${issue3.message}`).join("; ")}`});if(!context.sessionID?.trim())return JSON.stringify({success:!1,message:"Publication invalidation requires an active sessionID"});try{let generation=await invalidatePrFeedbackPublication(directory,context.sessionID,parsed.data.reason);return JSON.stringify({success:!0,generation:generation.generation,previous_state:"armed",message:`Publication generation ${generation.generation} is INVALIDATED (${generation.invalidationReason}). Every approval of this generation is superseded: rerun Stage A and every independent gate on the corrected content, then arm a fresh generation with complete_pr_workflow. Scoped rework reopens via prepare_pr_feedback_scope; the full audit trail is in the .swarm events store.`})}catch(error93){return JSON.stringify({success:!1,message:error93 instanceof Error?error93.message:String(error93)})}}var invalidate_pr_feedback_publication=createSwarmTool({description:"Invalidate the armed PR_FEEDBACK publication generation so approved content can change (issue #2108). The explicit audited revocation/rework transition: it marks the current generation invalidated with a required reason, supersedes every content-dependent approval (Stage A, verification batches, ordered gates, scope declarations — audit history is preserved), and reopens the exact scoped rework path. A fresh generation arms only after the full ordered ladder re-passes via complete_pr_workflow. Use ONLY when approved content genuinely must change after arming; it never grants publication authority.",args:{reason:InvalidatePrFeedbackPublicationArgsSchema.shape.reason},execute:executeInvalidatePrFeedbackPublication});init_zod();init_config();init_knowledge_reinforcement();init_knowledge_store();init_knowledge_types();init_knowledge_validator();init_cohort_identity();init_worktree_identity();init_manager();init_create_tool();import{randomUUID as randomUUID45}from"node:crypto";var VALID_CATEGORIES2=["process","architecture","tooling","security","testing","debugging","performance","integration","todo","other"],KNOWLEDGE_ADD_FIELD_CAP=20;function mergeLessonTags(tagsInput,lesson){return dedupeCapped([...Array.isArray(tagsInput)?tagsInput:[],...inferTags(lesson)],{cap:KNOWLEDGE_ADD_FIELD_CAP})}function strArray(v){return Array.isArray(v)?dedupeCapped(v,{cap:KNOWLEDGE_ADD_FIELD_CAP}):void 0}var knowledge_add=createSwarmTool({allowWorkingDirectoryOverride:!0,description:"Store a new lesson in the knowledge base for future reference. The lesson will be available for retrieval via knowledge_recall.",args:{lesson:exports_external.string().min(15).max(280).describe("The lesson to store (15-280 characters)"),category:exports_external.enum(VALID_CATEGORIES2).describe("Knowledge category for the lesson"),tags:exports_external.array(exports_external.string()).optional().describe("Optional tags for better searchability"),scope:exports_external.string().optional().describe("Scope of the lesson (global or stack:<name>)"),applies_to_agents:exports_external.array(exports_external.string()).optional().describe('Agent roles this lesson applies to (e.g. ["coder"]). REQUIRED (or applies_to_tools) for the lesson to become active.'),applies_to_tools:exports_external.array(exports_external.string()).optional().describe('Tool names this lesson applies to (e.g. ["edit","bash"]). REQUIRED (or applies_to_agents) for the lesson to become active.'),required_actions:exports_external.array(exports_external.string()).optional().describe("Concrete actions to always take. At least one predicate field (required_actions / forbidden_actions / verification_checks) is REQUIRED for the lesson to become active."),forbidden_actions:exports_external.array(exports_external.string()).optional().describe("Concrete actions to never take."),verification_checks:exports_external.array(exports_external.string()).optional().describe("Checks a reviewer can run to verify compliance.")},execute:async(args2,directory)=>{let lessonInput,categoryInput,tagsInput,scopeInput;try{if(args2&&typeof args2==="object"){let obj2=args2;lessonInput=obj2.lesson,categoryInput=obj2.category,tagsInput=obj2.tags,scopeInput=obj2.scope}}catch{}if(typeof lessonInput!=="string")return JSON.stringify({success:!1,error:"lesson must be a string"});let lesson=lessonInput;if(lesson.length<15||lesson.length>280)return JSON.stringify({success:!1,error:"lesson must be between 15 and 280 characters"});if(typeof categoryInput!=="string")return JSON.stringify({success:!1,error:"category must be a string"});let category=categoryInput;if(!VALID_CATEGORIES2.includes(category))return JSON.stringify({success:!1,error:`category must be one of: ${VALID_CATEGORIES2.join(", ")}`});let tags=mergeLessonTags(tagsInput,lesson),scope=typeof scopeInput==="string"&&scopeInput.length>0?scopeInput:"global",obj=args2&&typeof args2==="object"?args2:{},actionable={applies_to_agents:strArray(obj.applies_to_agents),applies_to_tools:strArray(obj.applies_to_tools),required_actions:strArray(obj.required_actions),forbidden_actions:strArray(obj.forbidden_actions),verification_checks:strArray(obj.verification_checks)},shape=validateActionableFields(actionable);if(!shape.valid)return JSON.stringify({success:!1,error:`invalid actionability fields: ${shape.errors.join("; ")}`});let project_name="",phase_number=1;try{let plan=await loadPlan(directory);if(project_name=plan?.title??"",typeof plan?.current_phase==="number")phase_number=plan.current_phase}catch{}let producer=null;try{let[worktreeId,cohort]=await Promise.all([resolveWorktreeId(directory),resolveCohortId(directory)]);producer={cohort_id:cohort.cohortId,worktree_id:worktreeId}}catch{}let nowIso2=new Date().toISOString(),entry={id:randomUUID45(),tier:"swarm",lesson,category,tags,scope,confidence:0.5,status:"candidate",confirmed_by:[],project_name,retrieval_outcomes:{applied_count:0,succeeded_after_count:0,failed_after_count:0},schema_version:KNOWLEDGE_SCHEMA_VERSION,producer,revision:1,content_hash:computeContentHash(lesson),created_at:nowIso2,updated_at:nowIso2,auto_generated:!1,hive_eligible:!1,...actionable},config3,dedupThreshold=0.6;try{if(config3=loadPluginConfigWithMeta(directory).config,dedupThreshold=config3.knowledge?.dedup_threshold??0.6,config3.knowledge?.validation_enabled!==!1){let validation2=validateLesson(lesson,[],{category,scope,confidence:0.5});if(!validation2.valid)return JSON.stringify({success:!1,error:`Validation failed: ${validation2.reason}`})}}catch{}let actionability=validateActionability(entry);if(!actionability.actionable){try{await appendUnactionable(directory,entry,actionability.reason??"unactionable")}catch{}return JSON.stringify({success:!1,quarantined:!0,id:entry.id,reason:actionability.reason,hint:"Provide at least one of required_actions/forbidden_actions/verification_checks AND at least one of applies_to_agents/applies_to_tools, then retry."})}try{let maxEntries=config3?.knowledge?.swarm_max_entries??100,duplicateResponse;if(await transactKnowledge(resolveSwarmKnowledgePath(directory),(existingEntries)=>{let activeDuplicate=findActiveSwarmNearDuplicate(lesson,existingEntries,dedupThreshold);if(activeDuplicate){let result=reinforceSwarmKnowledgeEntry(activeDuplicate,{phase_number,confirmed_at:new Date().toISOString(),project_name});return duplicateResponse={id:activeDuplicate.id,reinforced:result.reinforced,idempotent:result.reason==="already_confirmed_phase",inactive:!1},result.reinforced?existingEntries:null}let inactiveDuplicate=findNearDuplicate(lesson,existingEntries,dedupThreshold);if(inactiveDuplicate)return duplicateResponse={id:inactiveDuplicate.id,reinforced:!1,idempotent:!1,inactive:!0},null;let updated=[...existingEntries,entry];if(updated.length>maxEntries)return updated.slice(updated.length-maxEntries);return updated}),duplicateResponse){if(duplicateResponse.inactive)return JSON.stringify({success:!1,id:duplicateResponse.id,message:"near-duplicate of inactive existing entry"});return JSON.stringify({success:!0,id:duplicateResponse.id,reinforced:duplicateResponse.reinforced,idempotent:duplicateResponse.idempotent,message:duplicateResponse.reinforced?"near-duplicate reinforced existing entry":"near-duplicate already confirmed for this phase"})}}catch(err){let message=err instanceof Error?err.message:"Unknown error";return JSON.stringify({success:!1,error:message})}return JSON.stringify({success:!0,id:entry.id,category})}});init_zod();init_knowledge_store();init_knowledge_validator();init_skill_invalidator();init_curation_policy();init_logger();init_create_tool();var MODES2=["archive","quarantine","purge"],TIERS=["swarm","hive"];async function loadConfigForPolicy(directory){let{KnowledgeConfigSchema:KnowledgeConfigSchema2}=await Promise.resolve().then(() => (init_schema(),exports_schema)),{loadPluginConfigWithMeta:loadPluginConfigWithMeta2}=await Promise.resolve().then(() => (init_config(),exports_config)),{config:loaded}=loadPluginConfigWithMeta2(directory);return KnowledgeConfigSchema2.parse(loaded.knowledge??{})}function mapCurationDenial(mode,denial){return{success:!1,error:`Cohort-safety policy blocked this ${mode}: ${denial.detail}`,basis:denial.basis}}var knowledge_archive=createSwarmTool({allowWorkingDirectoryOverride:!0,description:"Archive (default), quarantine, or purge a swarm or hive knowledge entry by ID, appending an immutable audit tombstone. 'archive'/'quarantine' set the entry status reversibly and hide it from recall; 'purge' hard-deletes and requires allow_purge:true.",args:{id:exports_external.string().min(1).describe("UUID of the knowledge entry"),tier:exports_external.enum(TIERS).optional().describe("Knowledge tier to modify; default 'swarm'"),reason:exports_external.string().min(1).max(500).describe("Why the entry is being archived/quarantined/purged"),evidence:exports_external.string().max(1000).optional().describe('Supporting evidence (e.g. "ignored 8 times, contradicted by tests")'),mode:exports_external.enum(MODES2).optional().describe("Default 'archive'"),allow_purge:exports_external.boolean().optional().describe("Admin flag required when mode='purge'")},execute:async(args2,directory,ctx)=>{let a=args2??{},id=typeof a.id==="string"?a.id:"";if(!id)return JSON.stringify({success:!1,error:"id must be a non-empty string"});let reason=typeof a.reason==="string"?a.reason:"";if(!reason)return JSON.stringify({success:!1,error:"reason is required"});let evidence2=typeof a.evidence==="string"?a.evidence:void 0,tier=a.tier==="hive"?"hive":"swarm",mode=a.mode==="quarantine"||a.mode==="purge"?a.mode:"archive";if(mode==="purge"&&a.allow_purge!==!0)return JSON.stringify({success:!1,error:"purge requires allow_purge:true (admin flag)"});if(mode==="quarantine"){if(tier==="hive")return JSON.stringify({success:!1,error:"quarantine via the archive tool is swarm-only; use tier:'swarm' or the /swarm knowledge quarantine command"});try{let target=(await readKnowledge(resolveSwarmKnowledgePath(directory))).find((e)=>e.id===id);if(!target)return JSON.stringify({success:!1,message:"entry not found"});let reportedBy=ctx?.agent==="architect"?"architect":"user",curationInput={directory,action:"quarantine",entryId:id,reason,evidenceScope:"cohort-wide",actorRole:ctx?.agent},curationContext={config:await loadConfigForPolicy(directory),entry:target},outcome=await quarantineEntry(directory,id,reason,reportedBy,{input:curationInput,context:curationContext});if(outcome.status==="quarantined")return JSON.stringify({success:!0,id,tier,mode,status:"quarantined"});if(outcome.status==="denied")return JSON.stringify(mapCurationDenial("quarantine",outcome));if(outcome.status==="not_found")return JSON.stringify({success:!1,message:"entry not found"});return JSON.stringify({success:!1,error:"quarantine rejected: invalid directory, entry id, or reporter"})}catch(err){return JSON.stringify({success:!1,error:err instanceof Error?err.message:"Unknown error during quarantine"})}}let knowledgePath=tier==="hive"?resolveHiveKnowledgePath2():resolveSwarmKnowledgePath(directory),found=!1,previousStatus,now2=new Date().toISOString(),resultStatus,casExpectedRevision,casExpectedContentHash;if(tier==="swarm"){let preEntries;try{preEntries=await readKnowledge(knowledgePath)}catch(err){let message=err instanceof Error?err.message:"Unknown error";return JSON.stringify({success:!1,error:message})}let preTarget=preEntries.find((e)=>e.id===id)??null;if(preTarget){let curationInput={directory,action:mode,entryId:id,reason,evidenceScope:"cohort-wide",actorRole:ctx?.agent},curationContext={config:await loadConfigForPolicy(directory),entry:preTarget},decision=await authorizeCuration(curationInput,curationContext);if(!decision.authorized)return JSON.stringify(mapCurationDenial(mode,decision));casExpectedRevision=preTarget.revision,casExpectedContentHash=preTarget.content_hash}}if(tier==="swarm"&&mode==="archive"){let casResult;try{casResult=await transactKnowledgeWithCas(directory,knowledgePath,id,casExpectedRevision,casExpectedContentHash,(entry)=>{if(found=!0,previousStatus=entry.status,entry.status==="archived")return resultStatus="archived",null;return resultStatus="archived",{mutated:{...entry,status:"archived",archived_from:entry.status,archived_at:now2,updated_at:now2}}})}catch(err){return JSON.stringify({success:!1,error:err instanceof Error?err.message:"Unknown error"})}if(casResult.casFailed)return JSON.stringify({success:!1,error:"entry changed since authorization (revision/content-hash mismatch); stale archive plan rejected"})}else try{await transactKnowledge(knowledgePath,(entries2)=>{let target=entries2.find((e)=>e.id===id);if(!target)return null;if(found=!0,previousStatus=target.status,mode==="purge")return warn(`[knowledge_archive] PURGE: hard-deleting ${tier} entry id=${id} actor=${ctx?.agent??"unknown"} reason=${reason}`),resultStatus="purged",entries2.filter((e)=>e.id!==id);if(target.status==="archived")return resultStatus="archived",entries2;return resultStatus="archived",entries2.map((e)=>e.id===id?{...e,status:"archived",archived_from:target.status,archived_at:now2,updated_at:now2}:e)})}catch(err){return JSON.stringify({success:!1,error:err instanceof Error?err.message:"Unknown error"})}if(!found)return JSON.stringify({success:!1,message:"entry not found"});return await writeArchiveTombstoneAndInvalidateSkills({directory,entryId:id,tier,actor:ctx?.agent??"unknown",reason,mode,evidence:evidence2,previousStatus,sourceLabel:"knowledge-archive"}),JSON.stringify({success:!0,id,tier,mode,previous_status:previousStatus,status:resultStatus})}});init_zod();init_config();init_knowledge_store();init_create_tool();import{existsSync as existsSync178}from"node:fs";var DEFAULT_LIMIT=10,MAX_LESSON_LENGTH=200,VALID_CATEGORIES3=["process","architecture","tooling","security","testing","debugging","performance","integration","todo","other"],VALID_STATUSES=["candidate","established","promoted","archived"],DEFAULT_QUERY_STATUSES=new Set(["established","promoted"]),VALID_TIERS=["swarm","hive","all"];function validateTierInput(tier){if(typeof tier!=="string")return null;let normalized=tier.toLowerCase().trim();if(VALID_TIERS.includes(normalized))return normalized;return null}function validateStatusInput(status2){if(typeof status2!=="string")return null;let normalized=status2.toLowerCase().trim();if(VALID_STATUSES.includes(normalized))return normalized;return null}function validateCategoryInput(category){if(typeof category!=="string")return null;let normalized=category.toLowerCase().trim();if(VALID_CATEGORIES3.includes(normalized))return normalized;return null}function validateMinScore(score){if(typeof score==="number"&&!Number.isNaN(score))return Math.max(0,Math.min(1,score));if(typeof score==="string"){let parsed=Number.parseFloat(score);if(!Number.isNaN(parsed))return Math.max(0,Math.min(1,parsed))}return null}function validateLimit(limit){if(typeof limit==="number"&&!Number.isNaN(limit)&&limit>0)return Math.min(limit,100);if(typeof limit==="string"){let parsed=Number.parseInt(limit,10);if(!Number.isNaN(parsed)&&parsed>0)return Math.min(parsed,100)}return DEFAULT_LIMIT}async function readSwarmKnowledge(directory){let swarmPath3=resolveSwarmKnowledgePath(directory);if(!existsSync178(swarmPath3))return[];return readKnowledge(swarmPath3)}async function readHiveKnowledge(){let hivePath=resolveHiveKnowledgePath2();if(!existsSync178(hivePath))return[];return readKnowledge(hivePath)}function filterSwarmEntries(entries2,filters,suppressedLessons,scopeFilter){return entries2.filter((entry)=>{if(filters.status){if(entry.status!==filters.status)return!1}else if(!DEFAULT_QUERY_STATUSES.has(entry.status))return!1;if(filters.category&&entry.category!==filters.category)return!1;if(filters.minScore!==void 0&&entry.confidence<filters.minScore)return!1;if(scopeFilter&&scopeFilter.length>0){let entryScope=entry.scope??"global";if(!scopeFilter.some((pattern)=>entryScope===pattern))return!1}if(suppressedLessons.has(normalize4(entry.lesson)))return!1;return!0})}function filterHiveEntries(entries2,filters,suppressedLessons,scopeFilter){return entries2.filter((entry)=>{if(filters.status){if(entry.status!==filters.status)return!1}else if(!DEFAULT_QUERY_STATUSES.has(entry.status))return!1;if(filters.category&&entry.category!==filters.category)return!1;if(filters.minScore!==void 0&&entry.confidence<filters.minScore)return!1;if(scopeFilter&&scopeFilter.length>0){let entryScope=entry.scope??"global";if(!scopeFilter.some((pattern)=>entryScope===pattern))return!1}if(suppressedLessons.has(normalize4(entry.lesson)))return!1;return!0})}function truncateLesson3(lesson,maxLength){if(lesson.length<=maxLength)return lesson;return`${lesson.slice(0,maxLength-3)}...`}function formatSwarmEntry(entry){let lines=[];return lines.push(`[${entry.tier.toUpperCase()}] ${entry.id}`),lines.push(` Lesson: ${truncateLesson3(entry.lesson,MAX_LESSON_LENGTH)}`),lines.push(` Category: ${entry.category}`),lines.push(` Status: ${entry.status}`),lines.push(` Confidence: ${entry.confidence.toFixed(2)}`),lines.push(` Confirmed by: ${entry.confirmed_by.length} phase(s)`),lines.push(` Project: ${entry.project_name}`),lines.join(`
|
|
7734
7734
|
`)}function formatHiveEntry(entry){let lines=[];return lines.push(`[${entry.tier.toUpperCase()}] ${entry.id}`),lines.push(` Lesson: ${truncateLesson3(entry.lesson,MAX_LESSON_LENGTH)}`),lines.push(` Category: ${entry.category}`),lines.push(` Status: ${entry.status}`),lines.push(` Confidence: ${entry.confidence.toFixed(2)}`),lines.push(` Encounter Score: ${entry.encounter_score?.toFixed(2)??"N/A"}`),lines.push(` Source Project: ${entry.source_project}`),lines.push(` Confirmed by: ${entry.confirmed_by.length} project(s)`),lines.join(`
|
|
7735
7735
|
`)}var knowledge_query=createSwarmTool({allowWorkingDirectoryOverride:!0,description:"Performs structured filter-based retrieval of swarm knowledge (project-level) or hive knowledge (cross-project). Returns formatted text for human inspection. This is the tool to use when the user knows the CATEGORY, STATUS, or SCORE they want to filter by. For semantic natural-language search, use `knowledge_recall` instead.",args:{tier:exports_external.string().optional().describe("Knowledge tier to query: 'swarm', 'hive', or 'all' (default: 'all')"),status:exports_external.string().optional().describe("Filter by status: 'candidate', 'established', 'promoted', or 'archived'"),category:exports_external.string().optional().describe("Filter by category: 'process', 'architecture', 'tooling', 'security', 'testing', 'debugging', 'performance', 'integration', 'todo', or 'other'"),min_score:exports_external.number().optional().describe("Minimum confidence score filter (0.0-1.0)"),limit:exports_external.number().optional().describe(`Maximum number of results to return (default: ${DEFAULT_LIMIT}, max: 100)`)},async execute(args2,directory){let tierInput,statusInput,categoryInput,minScoreInput,limitInput;try{if(args2&&typeof args2==="object"){let obj=args2;tierInput=obj.tier,statusInput=obj.status,categoryInput=obj.category,minScoreInput=obj.min_score,limitInput=obj.limit}}catch{}let tier=validateTierInput(tierInput)??"all",status2=validateStatusInput(statusInput)??null,category=validateCategoryInput(categoryInput)??null,minScore=validateMinScore(minScoreInput)??null,limit=validateLimit(limitInput),filters={status:status2??void 0,category:category??void 0,minScore:minScore??void 0},retractionRecords=await readRetractionRecords(directory),suppressedLessons=new Set(retractionRecords.map((record3)=>record3.normalized_lesson).filter((value)=>typeof value==="string"&&value.length>0)),results=[],scopeFilter;try{let{config:config3}=loadPluginConfigWithMeta(directory);scopeFilter=config3.knowledge?.scope_filter}catch{}if(tier==="swarm"||tier==="all"){let swarmEntries=await readSwarmKnowledge(directory),filtered=filterSwarmEntries(swarmEntries,filters,suppressedLessons,scopeFilter);for(let entry of filtered)results.push({entry,tier:"swarm"})}if(tier==="hive"||tier==="all"){let hiveEntries=await readHiveKnowledge(),filtered=filterHiveEntries(hiveEntries,filters,suppressedLessons,scopeFilter);for(let entry of filtered)results.push({entry,tier:"hive"})}let limitedResults=results.slice(0,limit);if(limitedResults.length===0){let tierDesc=tier==="all"?"swarm or hive":tier,filterParts=[];if(status2)filterParts.push(`status=${status2}`);if(category)filterParts.push(`category=${category}`);if(minScore!==null)filterParts.push(`min_score=${minScore}`);let filterDesc=filterParts.length>0?` with filters: ${filterParts.join(", ")}`:"";return`No knowledge entries found for tier '${tierDesc}'${filterDesc}.`}let outputLines=[];outputLines.push(`=== Knowledge Query Results (${limitedResults.length} of ${results.length} shown) ===`),outputLines.push("");for(let{entry,tier:entryTier}of limitedResults){if(entryTier==="hive")outputLines.push(formatHiveEntry(entry));else outputLines.push(formatSwarmEntry(entry));outputLines.push("")}if(outputLines.push("---"),outputLines.push(`Total matched: ${results.length} | Tier: ${tier} | Limit: ${limit}`),status2)outputLines.push(`Status filter: ${status2}`);if(category)outputLines.push(`Category filter: ${category}`);if(minScore!==null)outputLines.push(`Min score filter: ${minScore}`);return outputLines.join(`
|
|
7736
|
-
`)}});init_knowledge_recall();init_zod();init_config();init_schema();init_cohort_cache();init_knowledge_events();init_knowledge_link();init_knowledge_receipt_validator();init_promotion_evidence_store();init_logger();init_create_tool();async function readLinkPointerSafe(directory){try{return readLinkPointer(directory)?.linkId}catch{return}}var IGNORE_REASONS=["stale","superseded","unsafe","too_generic","already_satisfied","other"],PROPOSED_ACTIONS=["archive","revise","quarantine"],VERIFIED_BY=["reviewer","test_engineer","architect"],appliedItem=exports_external.object({id:exports_external.string().min(1),how:exports_external.string().min(1).max(500),evidence_files:exports_external.array(exports_external.string()).optional(),evidence_commands:exports_external.array(exports_external.string()).optional(),verified_by:exports_external.enum(VERIFIED_BY).optional()}),ignoredItem=exports_external.object({id:exports_external.string().min(1),reason:exports_external.enum(IGNORE_REASONS),note:exports_external.string().max(500).optional()}),notApplicableItem=exports_external.object({id:exports_external.string().min(1),reason:exports_external.string().trim().min(1).max(500)}),contradictedItem=exports_external.object({id:exports_external.string().min(1),evidence:exports_external.string().min(1).max(500),proposed_action:exports_external.enum(PROPOSED_ACTIONS)}),newLessonItem=exports_external.object({lesson:exports_external.string().min(15).max(280),category:exports_external.string().min(1),evidence:exports_external.string().max(500).optional(),applies_to_agents:exports_external.array(exports_external.string()).optional(),applies_to_tools:exports_external.array(exports_external.string()).optional(),required_actions:exports_external.array(exports_external.string()).optional(),forbidden_actions:exports_external.array(exports_external.string()).optional(),verification_checks:exports_external.array(exports_external.string()).optional()});function receiptSourceForAgent(agent){let base=stripKnownSwarmPrefix(agent.trim());if(!base||base==="unknown")return"unknown";if(base==="reviewer")return"reviewer";if(base==="test_engineer")return"test_engineer";if(base==="architect")return"architect";return"delegate"}var knowledge_receipt=createSwarmTool({allowWorkingDirectoryOverride:!0,description:"File a receipt for knowledge surfaced by a retrieval (by trace_id): which entries were applied (with evidence), ignored with a reason (relevant but deliberately not followed — counts against the entry), marked n_a with a reason (not applicable to this task — neutral), or contradicted (with proposed remediation), plus any new lessons. Each item is recorded as an immutable knowledge event. Set no_relevant_knowledge:true when a retrieval surfaced nothing useful.",args:{trace_id:exports_external.string().min(1).describe("trace_id from a prior knowledge_recall/injection, or 'none' if no retrieval occurred"),task_id:exports_external.string().min(1).optional(),phase:exports_external.string().optional(),applied:exports_external.array(appliedItem).optional(),ignored:exports_external.array(ignoredItem).optional().describe("entries you judged relevant but deliberately did not follow (counts against the entry). NOT for not-applicable entries — file those under n_a"),n_a:exports_external.array(notApplicableItem).optional().describe("entries that did not apply to this task (neutral; reasoned). Replaces the removed not_relevant ignore reason"),contradicted:exports_external.array(contradictedItem).optional(),new_lessons:exports_external.array(newLessonItem).optional(),no_relevant_knowledge:exports_external.boolean().optional()},execute:async(args2,directory,ctx)=>{let a=args2??{},traceId=typeof a.trace_id==="string"?a.trace_id:"";if(!traceId)return JSON.stringify({recorded:!1,error:'trace_id is required (use "none" if no retrieval occurred)'});let taskId=typeof a.task_id==="string"&&a.task_id.trim()?a.task_id.trim():void 0,phase=typeof a.phase==="string"?a.phase:void 0,applied2=Array.isArray(a.applied)?a.applied:[],ignored=Array.isArray(a.ignored)?a.ignored:[],notApplicable=Array.isArray(a.n_a)?a.n_a:[],contradicted=Array.isArray(a.contradicted)?a.contradicted:[],newLessons=Array.isArray(a.new_lessons)?a.new_lessons:[],noRelevant=a.no_relevant_knowledge===!0;if(applied2.length===0&&ignored.length===0&¬Applicable.length===0&&contradicted.length===0&&newLessons.length===0&&!noRelevant)return JSON.stringify({recorded:!1,error:"empty receipt: provide at least one applied/ignored/n_a/contradicted entry, a new lesson, or set no_relevant_knowledge:true"});let sessionId=ctx?.sessionID??"unknown",agent=ctx?.agent??"unknown",receiptSource=receiptSourceForAgent(agent),knowledgeConfig=KnowledgeConfigSchema.parse({});try{let{config:config3}=loadPluginConfigWithMeta(directory);knowledgeConfig=KnowledgeConfigSchema.parse(config3.knowledge??{})}catch{}let base={trace_id:traceId,session_id:sessionId,phase,task_id:taskId,agent,source:receiptSource},recordedEventIds=[],diagnosticEventIds=[],emit4=async(event)=>{let id=(await recordKnowledgeEvent(directory,event))?.event_id??"";if(id)diagnosticEventIds.push(id);return id},eventIdByKnowledgeId=new Map,validationItems=[...applied2.map((i)=>({id:i.id,outcome:"applied",reason:i.how})),...ignored.map((i)=>({id:i.id,outcome:"ignored",reason:i.note?`${i.reason}: ${i.note}`:i.reason})),...notApplicable.map((i)=>({id:i.id,outcome:"n_a",reason:i.reason})),...contradicted.map((i)=>({id:i.id,outcome:"contradicted",reason:`${i.proposed_action}: ${i.evidence}`}))],needsValidation=validationItems.length>0||noRelevant,acceptedIds=new Set,closesNoRelevant=!1,acceptedItems=[],authoritativeEventIds={},cohortId,linkId;if(needsValidation){try{cohortId=await ensureCohortIdCached(directory,sessionId),linkId=await readLinkPointerSafe(directory)}catch{}let validation2=await validateReceipt({directory,trace_id:traceId,session_id:sessionId,task_id:taskId,phase,agent,source:receiptSource,cohort_id:cohortId,source_link_id:linkId,items:validationItems,no_relevant_knowledge:noRelevant,grace_days:knowledgeConfig.receipt_close_grace_days});if(!validation2.ok)return JSON.stringify({recorded:!1,rejected:!0,reason:validation2.reason,detail:validation2.detail,rejected_items:validation2.rejected_items});if(acceptedIds=new Set(validation2.accepted.map((i)=>i.id)),closesNoRelevant=validation2.closes_no_relevant,acceptedItems=validation2.accepted,authoritativeEventIds=validation2.authoritative_event_ids,recordedEventIds.push(...Object.values(authoritativeEventIds)),validation2.no_relevant_event_id)recordedEventIds.push(validation2.no_relevant_event_id)}if(closesNoRelevant)await emit4({type:"no_relevant",...base,reason:"no relevant knowledge surfaced by the trace"});for(let item of applied2){if(!acceptedIds.has(item.id))continue;await emit4({type:"applied",...base,knowledge_id:item.id,reason:item.how,evidence:{files:item.evidence_files,commands:item.evidence_commands,summary:item.verified_by?`verified_by=${item.verified_by}`:void 0}});let eid=authoritativeEventIds[item.id];if(eid)eventIdByKnowledgeId.set(item.id,eid)}for(let item of ignored){if(!acceptedIds.has(item.id))continue;await emit4({type:"ignored",...base,knowledge_id:item.id,reason:item.note?`${item.reason}: ${item.note}`:item.reason})}for(let item of notApplicable){if(!acceptedIds.has(item.id))continue;await emit4({type:"n_a",...base,knowledge_id:item.id,reason:item.reason})}for(let item of contradicted){if(!acceptedIds.has(item.id))continue;await emit4({type:"contradicted",...base,knowledge_id:item.id,reason:`${item.proposed_action}: ${item.evidence}`,evidence:{summary:item.evidence}});let eid=authoritativeEventIds[item.id];if(eid)eventIdByKnowledgeId.set(item.id,eid)}if(acceptedItems.length>0)try{let now2=new Date().toISOString(),evidenceRecords=[];for(let item of acceptedItems){if(item.outcome!=="applied"&&item.outcome!=="contradicted")continue;let receiptEventId=eventIdByKnowledgeId.get(item.id);if(!cohortId||!receiptEventId)continue;evidenceRecords.push({cohort_id:cohortId,source_link_id:linkId,entry_id:item.id,retrieval_trace_id:traceId,receipt_outcome:item.outcome==="applied"?"applied":"contradicted",receipt_source:receiptSource,receipt_event_id:receiptEventId,phase,timestamp:now2})}await appendPromotionEvidence(directory,evidenceRecords)}catch{}let newLessonResults=[];for(let item of newLessons){let raw=await knowledge_add.execute({lesson:item.lesson,category:item.category,applies_to_agents:item.applies_to_agents,applies_to_tools:item.applies_to_tools,required_actions:item.required_actions,forbidden_actions:item.forbidden_actions,verification_checks:item.verification_checks},ctx);try{let output=typeof raw==="string"?raw:typeof raw==="object"&&raw!==null&&("output"in raw)&&typeof raw.output==="string"?raw.output:"";newLessonResults.push(JSON.parse(output))}catch{newLessonResults.push({success:!1})}}return log("[knowledge_receipt] completed",{agent,source:receiptSource,session_id:sessionId,trace_id:traceId,applied:applied2.length,ignored:ignored.length,n_a:notApplicable.length,contradicted:contradicted.length,new_lessons:newLessonResults.length,no_relevant_knowledge:noRelevant,event_count:recordedEventIds.length,diagnostic_event_count:diagnosticEventIds.length}),JSON.stringify({recorded:!0,trace_id:traceId,applied:applied2.length,ignored:ignored.length,n_a:notApplicable.length,contradicted:contradicted.length,new_lessons:newLessonResults,no_relevant_knowledge:noRelevant,event_ids:recordedEventIds})}});init_zod();init_redaction();init_file_locks();init_atomic_write();init_canonical_root();init_path_security();import{createHash as createHash109,randomUUID as randomUUID46}from"node:crypto";import{lstat as lstat12,open as open13}from"node:fs/promises";import*as path332 from"node:path";var MCP_WRITE_RECEIPTS_RELATIVE_PATH=path332.join(".swarm","mcp-write-receipts.jsonl"),MCP_WRITE_RECEIPTS_ARCHIVE_RELATIVE_PATH=path332.join(".swarm","mcp-write-receipts-archive.jsonl");var MAX_RECEIPT_RECORDS=500,MAX_RECEIPT_ARCHIVE_RECORDS=1e4,MAX_RECEIPT_LINE_BYTES=16384,MAX_RECEIPT_JOURNAL_BYTES=524288,MAX_RECEIPT_ARCHIVE_BYTES=16777216,MAX_RECEIPT_RESPONSE_BYTES=8192,KNOWLEDGE_ADD_POLICY_VERSION="knowledge_add:v1",MAX_IDEMPOTENCY_KEY_LENGTH=128,MAX_ARGUMENT_BYTES=131072,MAX_CANONICAL_NODES=2048,MAX_CANONICAL_ARRAY_ITEMS=64,MAX_CANONICAL_OBJECT_KEYS=64,MAX_KNOWLEDGE_ARRAY_ITEMS=20,MAX_KNOWLEDGE_TEXT_LENGTH=280,MAX_KNOWLEDGE_OPTIONAL_TEXT_LENGTH=256,KNOWLEDGE_CATEGORIES2=["process","architecture","tooling","security","testing","debugging","performance","integration","todo","other"],writeReceiptStatusInput=exports_external.object({idempotency_key:exports_external.string().min(1).max(MAX_IDEMPOTENCY_KEY_LENGTH).refine((value)=>![...value].some((character)=>{let code=character.codePointAt(0)??0;return code<=31||code===127}),{message:"idempotency_key must not contain control characters"})}),WRITE_RECEIPT_STATES=["PREPARED","COMMITTED","FAILED_NO_EFFECT","IN_DOUBT"];class WriteReceiptError extends Error{code;constructor(code,message){super(message);this.name="WriteReceiptError",this.code=code}}var receiptRecordSchema=exports_external.object({version:exports_external.literal(1),receipt_id:exports_external.string().regex(/^[0-9a-f-]{36}$/i),attempt_id:exports_external.string().regex(/^[0-9a-f-]{36}$/i),tool:exports_external.string().min(1).max(80),root_hash:exports_external.string().regex(/^[0-9a-f]{64}$/),idempotency_hash:exports_external.string().regex(/^[0-9a-f]{64}$/),arguments_digest:exports_external.string().regex(/^[0-9a-f]{64}$/),policy_digest:exports_external.string().regex(/^[0-9a-f]{64}$/),state:exports_external.enum(WRITE_RECEIPT_STATES),prepared_at:exports_external.number().finite().nonnegative(),updated_at:exports_external.number().finite().nonnegative(),lease_expires_at:exports_external.number().finite().nonnegative(),response:exports_external.string().max(MAX_RECEIPT_RESPONSE_BYTES).optional(),error:exports_external.string().max(MAX_RECEIPT_RESPONSE_BYTES).optional()}).strict();function journalPath3(root){return path332.join(root,MCP_WRITE_RECEIPTS_RELATIVE_PATH)}function assertReceiptPaths(root){let journal=journalPath3(root),lockDirectory=path332.join(root,".swarm","locks");try{assertSwarmContainedTarget(journal),assertSwarmContainedTarget(path332.join(lockDirectory,"mcp-write-receipts.lock")),assertSwarmContainedTarget(path332.join(root,MCP_WRITE_RECEIPTS_ARCHIVE_RELATIVE_PATH)),validateSymlinkBoundary(journal,root),validateSymlinkBoundary(lockDirectory,root)}catch{throw new WriteReceiptError("JOURNAL_UNAVAILABLE","Write receipt journal path is outside the project boundary")}}function getWriteReceiptArchivePath(root){return path332.join(root,MCP_WRITE_RECEIPTS_ARCHIVE_RELATIVE_PATH)}function hash5(value){return createHash109("sha256").update(value,"utf8").digest("hex")}function canonicalRoot(root){return canonicalRootKeyFresh(root)}function hasControlCharacters2(value){for(let character of value){let code=character.codePointAt(0);if(code!==void 0&&(code<=31||code===127))return!0}return!1}function assertSafeRequest(request){if(!request.root||!path332.isAbsolute(request.root))throw new WriteReceiptError("INVALID_REQUEST","Write receipt requires an absolute project root");if(!request.tool||request.tool.length>80||hasControlCharacters2(request.tool))throw new WriteReceiptError("INVALID_REQUEST","Write receipt tool identity is invalid");if(!request.idempotencyKey||request.idempotencyKey.length>MAX_IDEMPOTENCY_KEY_LENGTH||hasControlCharacters2(request.idempotencyKey))throw new WriteReceiptError("INVALID_REQUEST","Idempotency key is empty, too long, or contains control characters")}function stableValue(value,depth=0,budget){let state2=budget??{nodes:0,bytes:0};if(state2.nodes+=1,state2.nodes>MAX_CANONICAL_NODES)throw new WriteReceiptError("INVALID_REQUEST","Write arguments exceed the bounded receipt digest input");if(depth>16)return"[depth-limited]";if(value===null||typeof value==="boolean")return value;if(typeof value==="string"){if(state2.bytes+=Buffer.byteLength(value,"utf8"),state2.bytes>MAX_ARGUMENT_BYTES)throw new WriteReceiptError("INVALID_REQUEST","Write arguments exceed the bounded receipt digest input");return value}if(typeof value==="number")return Number.isFinite(value)?value:"[non-finite]";if(typeof value==="bigint")return"[bigint]";if(typeof value>"u")return"[undefined]";if(Array.isArray(value)){if(value.length>MAX_CANONICAL_ARRAY_ITEMS)throw new WriteReceiptError("INVALID_REQUEST","Write arguments exceed the bounded receipt digest input");return value.map((item)=>stableValue(item,depth+1,state2))}if(typeof value==="object"){let record3=value,keys=Object.keys(record3).sort();if(keys.length>MAX_CANONICAL_OBJECT_KEYS)throw new WriteReceiptError("INVALID_REQUEST","Write arguments exceed the bounded receipt digest input");let result=Object.create(null);for(let key2 of keys){if(state2.bytes+=Buffer.byteLength(key2,"utf8"),state2.bytes>MAX_ARGUMENT_BYTES)throw new WriteReceiptError("INVALID_REQUEST","Write arguments exceed the bounded receipt digest input");let descriptor=Object.getOwnPropertyDescriptor(record3,key2);result[key2]=stableValue(descriptor&&"value"in descriptor?descriptor.value:"[accessor]",depth+1,state2)}return result}return`[${typeof value}]`}function canonicalArguments(value){let normalized=stableValue(value,0,{nodes:0,bytes:0}),encoded=JSON.stringify(normalized);if(encoded===void 0||Buffer.byteLength(encoded,"utf8")>MAX_ARGUMENT_BYTES)throw new WriteReceiptError("INVALID_REQUEST","Write arguments exceed the bounded receipt digest input");return encoded}function computeWriteReceiptIdentity(request){return assertSafeRequest(request),{root_hash:hash5(canonicalRoot(request.root)),idempotency_hash:hash5(request.idempotencyKey),arguments_digest:hash5(canonicalArguments(request.arguments)),policy_digest:hash5(request.policy??KNOWLEDGE_ADD_POLICY_VERSION)}}var RECEIPT_RESULT_UNREDACTED_VALUES=new Map([["category",new Set(KNOWLEDGE_CATEGORIES2)]]);async function readWriteReceiptStatus(root,idempotencyKey){let request={root,tool:"knowledge_add",idempotencyKey,arguments:{}},identity=computeWriteReceiptIdentity(request);assertReceiptPaths(root);let storage=await readReceiptStorage(root),record3=[...[...storage.archive,...storage.active]].reverse().find((candidate2)=>candidate2.tool===request.tool&&candidate2.root_hash===identity.root_hash&&candidate2.idempotency_hash===identity.idempotency_hash);if(!record3)return{found:!1,status:"NOT_FOUND",retryable:!0};return{found:!0,status:record3.state,tool:record3.tool,receipt_id:record3.receipt_id,attempt_id:record3.attempt_id,updated_at:record3.updated_at,lease_expires_at:record3.lease_expires_at,archived:storage.archive.includes(record3),retryable:!1}}async function readJournal(filePath,limits){let content,info;try{info=await lstat12(filePath)}catch(error93){if(error93?.code==="ENOENT")return[];throw new WriteReceiptError("JOURNAL_UNAVAILABLE","Write receipt journal could not be read")}if(!info.isFile()||info.isSymbolicLink())throw new WriteReceiptError("JOURNAL_UNAVAILABLE","Write receipt journal could not be read");if(info.size>limits.maxBytes)throw new WriteReceiptError("JOURNAL_CAPACITY","Write receipt journal exceeds its bounded capacity");let handle;try{handle=await open13(filePath,"r");let buffer=Buffer.alloc(limits.maxBytes+1),offset=0;while(offset<buffer.length){let read=await handle.read(buffer,offset,buffer.length-offset,null);if(read.bytesRead===0)break;offset+=read.bytesRead}if(offset>limits.maxBytes)throw new WriteReceiptError("JOURNAL_CAPACITY","Write receipt journal exceeds its bounded capacity");content=buffer.subarray(0,offset).toString("utf8")}catch(error93){if(error93 instanceof WriteReceiptError)throw error93;throw new WriteReceiptError("JOURNAL_UNAVAILABLE","Write receipt journal could not be read")}finally{try{await handle?.close()}catch{}}if(content.length>0&&!content.endsWith(`
|
|
7736
|
+
`)}});init_knowledge_recall();init_zod();init_config();init_schema();init_cohort_cache();init_knowledge_events();init_knowledge_link();init_knowledge_receipt_validator();init_promotion_evidence_store();init_state2();init_logger();init_create_tool();async function readLinkPointerSafe(directory){try{return readLinkPointer(directory)?.linkId}catch{return}}var IGNORE_REASONS=["stale","superseded","unsafe","too_generic","already_satisfied","other"],PROPOSED_ACTIONS=["archive","revise","quarantine"],VERIFIED_BY=["reviewer","test_engineer","architect"],appliedItem=exports_external.object({id:exports_external.string().min(1),how:exports_external.string().min(1).max(500),evidence_files:exports_external.array(exports_external.string()).optional(),evidence_commands:exports_external.array(exports_external.string()).optional(),verified_by:exports_external.enum(VERIFIED_BY).optional()}),ignoredItem=exports_external.object({id:exports_external.string().min(1),reason:exports_external.enum(IGNORE_REASONS),note:exports_external.string().max(500).optional()}),notApplicableItem=exports_external.object({id:exports_external.string().min(1),reason:exports_external.string().trim().min(1).max(500)}),contradictedItem=exports_external.object({id:exports_external.string().min(1),evidence:exports_external.string().min(1).max(500),proposed_action:exports_external.enum(PROPOSED_ACTIONS)}),newLessonItem=exports_external.object({lesson:exports_external.string().min(15).max(280),category:exports_external.string().min(1),evidence:exports_external.string().max(500).optional(),applies_to_agents:exports_external.array(exports_external.string()).optional(),applies_to_tools:exports_external.array(exports_external.string()).optional(),required_actions:exports_external.array(exports_external.string()).optional(),forbidden_actions:exports_external.array(exports_external.string()).optional(),verification_checks:exports_external.array(exports_external.string()).optional()});function receiptSourceForAgent(agent){let base=stripKnownSwarmPrefix(agent.trim());if(!base||base==="unknown")return"unknown";if(base==="reviewer")return"reviewer";if(base==="test_engineer")return"test_engineer";if(base==="architect")return"architect";return"delegate"}var knowledge_receipt=createSwarmTool({allowWorkingDirectoryOverride:!0,description:"File a receipt for knowledge surfaced by a retrieval (by trace_id): which entries were applied (with evidence), ignored with a reason (relevant but deliberately not followed — counts against the entry), marked n_a with a reason (not applicable to this task — neutral), or contradicted (with proposed remediation), plus any new lessons. Each item is recorded as an immutable knowledge event. Set no_relevant_knowledge:true when a retrieval surfaced nothing useful.",args:{trace_id:exports_external.string().min(1).describe("trace_id from a prior knowledge_recall/injection, or 'none' if no retrieval occurred"),task_id:exports_external.string().min(1).optional(),phase:exports_external.string().optional(),applied:exports_external.array(appliedItem).optional(),ignored:exports_external.array(ignoredItem).optional().describe("entries you judged relevant but deliberately did not follow (counts against the entry). NOT for not-applicable entries — file those under n_a"),n_a:exports_external.array(notApplicableItem).optional().describe("entries that did not apply to this task (neutral; reasoned). Replaces the removed not_relevant ignore reason"),contradicted:exports_external.array(contradictedItem).optional(),new_lessons:exports_external.array(newLessonItem).optional(),no_relevant_knowledge:exports_external.boolean().optional()},execute:async(args2,directory,ctx)=>{let a=args2??{},traceId=typeof a.trace_id==="string"?a.trace_id:"";if(!traceId)return JSON.stringify({recorded:!1,error:'trace_id is required (use "none" if no retrieval occurred)'});let taskId=typeof a.task_id==="string"&&a.task_id.trim()?a.task_id.trim():void 0,phase=typeof a.phase==="string"?a.phase:void 0,applied2=Array.isArray(a.applied)?a.applied:[],ignored=Array.isArray(a.ignored)?a.ignored:[],notApplicable=Array.isArray(a.n_a)?a.n_a:[],contradicted=Array.isArray(a.contradicted)?a.contradicted:[],newLessons=Array.isArray(a.new_lessons)?a.new_lessons:[],noRelevant=a.no_relevant_knowledge===!0;if(applied2.length===0&&ignored.length===0&¬Applicable.length===0&&contradicted.length===0&&newLessons.length===0&&!noRelevant)return JSON.stringify({recorded:!1,error:"empty receipt: provide at least one applied/ignored/n_a/contradicted entry, a new lesson, or set no_relevant_knowledge:true"});let sessionId=ctx?.sessionID??"unknown",agent=ctx?.agent??"unknown",receiptSource=receiptSourceForAgent(agent),knowledgeConfig=KnowledgeConfigSchema.parse({});try{let{config:config3}=loadPluginConfigWithMeta(directory);knowledgeConfig=KnowledgeConfigSchema.parse(config3.knowledge??{})}catch{}let base={trace_id:traceId,session_id:sessionId,phase,task_id:taskId,agent,source:receiptSource},recordedEventIds=[],diagnosticEventIds=[],emit4=async(event)=>{let id=(await recordKnowledgeEvent(directory,event))?.event_id??"";if(id)diagnosticEventIds.push(id);return id},eventIdByKnowledgeId=new Map,validationItems=[...applied2.map((i)=>({id:i.id,outcome:"applied",reason:i.how})),...ignored.map((i)=>({id:i.id,outcome:"ignored",reason:i.note?`${i.reason}: ${i.note}`:i.reason})),...notApplicable.map((i)=>({id:i.id,outcome:"n_a",reason:i.reason})),...contradicted.map((i)=>({id:i.id,outcome:"contradicted",reason:`${i.proposed_action}: ${i.evidence}`}))],needsValidation=validationItems.length>0||noRelevant,acceptedIds=new Set,closesNoRelevant=!1,acceptedItems=[],authoritativeEventIds={},cohortId,linkId;if(needsValidation){try{cohortId=await ensureCohortIdCached(directory,sessionId),linkId=await readLinkPointerSafe(directory)}catch{}let dispatchParent=resolveDispatchParent(sessionId),validation2=await validateReceipt({directory,trace_id:traceId,session_id:sessionId,task_id:taskId,phase,agent,source:receiptSource,cohort_id:cohortId,source_link_id:linkId,authorized_filing_sessions:dispatchParent&&dispatchParent!==sessionId?[sessionId,dispatchParent]:[sessionId],items:validationItems,no_relevant_knowledge:noRelevant,grace_days:knowledgeConfig.receipt_close_grace_days});if(!validation2.ok)return JSON.stringify({recorded:!1,rejected:!0,reason:validation2.reason,detail:validation2.detail,rejected_items:validation2.rejected_items});if(acceptedIds=new Set(validation2.accepted.map((i)=>i.id)),closesNoRelevant=validation2.closes_no_relevant,acceptedItems=validation2.accepted,authoritativeEventIds=validation2.authoritative_event_ids,recordedEventIds.push(...Object.values(authoritativeEventIds)),validation2.no_relevant_event_id)recordedEventIds.push(validation2.no_relevant_event_id)}if(closesNoRelevant)await emit4({type:"no_relevant",...base,reason:"no relevant knowledge surfaced by the trace"});for(let item of applied2){if(!acceptedIds.has(item.id))continue;await emit4({type:"applied",...base,knowledge_id:item.id,reason:item.how,evidence:{files:item.evidence_files,commands:item.evidence_commands,summary:item.verified_by?`verified_by=${item.verified_by}`:void 0}});let eid=authoritativeEventIds[item.id];if(eid)eventIdByKnowledgeId.set(item.id,eid)}for(let item of ignored){if(!acceptedIds.has(item.id))continue;await emit4({type:"ignored",...base,knowledge_id:item.id,reason:item.note?`${item.reason}: ${item.note}`:item.reason})}for(let item of notApplicable){if(!acceptedIds.has(item.id))continue;await emit4({type:"n_a",...base,knowledge_id:item.id,reason:item.reason})}for(let item of contradicted){if(!acceptedIds.has(item.id))continue;await emit4({type:"contradicted",...base,knowledge_id:item.id,reason:`${item.proposed_action}: ${item.evidence}`,evidence:{summary:item.evidence}});let eid=authoritativeEventIds[item.id];if(eid)eventIdByKnowledgeId.set(item.id,eid)}if(acceptedItems.length>0)try{let now2=new Date().toISOString(),evidenceRecords=[];for(let item of acceptedItems){if(item.outcome!=="applied"&&item.outcome!=="contradicted")continue;let receiptEventId=eventIdByKnowledgeId.get(item.id);if(!cohortId||!receiptEventId)continue;evidenceRecords.push({cohort_id:cohortId,source_link_id:linkId,entry_id:item.id,retrieval_trace_id:traceId,receipt_outcome:item.outcome==="applied"?"applied":"contradicted",receipt_source:receiptSource,receipt_event_id:receiptEventId,phase,timestamp:now2})}await appendPromotionEvidence(directory,evidenceRecords)}catch{}let newLessonResults=[];for(let item of newLessons){let raw=await knowledge_add.execute({lesson:item.lesson,category:item.category,applies_to_agents:item.applies_to_agents,applies_to_tools:item.applies_to_tools,required_actions:item.required_actions,forbidden_actions:item.forbidden_actions,verification_checks:item.verification_checks},ctx);try{let output=typeof raw==="string"?raw:typeof raw==="object"&&raw!==null&&("output"in raw)&&typeof raw.output==="string"?raw.output:"";newLessonResults.push(JSON.parse(output))}catch{newLessonResults.push({success:!1})}}return log("[knowledge_receipt] completed",{agent,source:receiptSource,session_id:sessionId,trace_id:traceId,applied:applied2.length,ignored:ignored.length,n_a:notApplicable.length,contradicted:contradicted.length,new_lessons:newLessonResults.length,no_relevant_knowledge:noRelevant,event_count:recordedEventIds.length,diagnostic_event_count:diagnosticEventIds.length}),JSON.stringify({recorded:!0,trace_id:traceId,applied:applied2.length,ignored:ignored.length,n_a:notApplicable.length,contradicted:contradicted.length,new_lessons:newLessonResults,no_relevant_knowledge:noRelevant,event_ids:recordedEventIds})}});init_zod();init_redaction();init_file_locks();init_atomic_write();init_canonical_root();init_path_security();import{createHash as createHash109,randomUUID as randomUUID46}from"node:crypto";import{lstat as lstat12,open as open13}from"node:fs/promises";import*as path332 from"node:path";var MCP_WRITE_RECEIPTS_RELATIVE_PATH=path332.join(".swarm","mcp-write-receipts.jsonl"),MCP_WRITE_RECEIPTS_ARCHIVE_RELATIVE_PATH=path332.join(".swarm","mcp-write-receipts-archive.jsonl");var MAX_RECEIPT_RECORDS=500,MAX_RECEIPT_ARCHIVE_RECORDS=1e4,MAX_RECEIPT_LINE_BYTES=16384,MAX_RECEIPT_JOURNAL_BYTES=524288,MAX_RECEIPT_ARCHIVE_BYTES=16777216,MAX_RECEIPT_RESPONSE_BYTES=8192,KNOWLEDGE_ADD_POLICY_VERSION="knowledge_add:v1",MAX_IDEMPOTENCY_KEY_LENGTH=128,MAX_ARGUMENT_BYTES=131072,MAX_CANONICAL_NODES=2048,MAX_CANONICAL_ARRAY_ITEMS=64,MAX_CANONICAL_OBJECT_KEYS=64,MAX_KNOWLEDGE_ARRAY_ITEMS=20,MAX_KNOWLEDGE_TEXT_LENGTH=280,MAX_KNOWLEDGE_OPTIONAL_TEXT_LENGTH=256,KNOWLEDGE_CATEGORIES2=["process","architecture","tooling","security","testing","debugging","performance","integration","todo","other"],writeReceiptStatusInput=exports_external.object({idempotency_key:exports_external.string().min(1).max(MAX_IDEMPOTENCY_KEY_LENGTH).refine((value)=>![...value].some((character)=>{let code=character.codePointAt(0)??0;return code<=31||code===127}),{message:"idempotency_key must not contain control characters"})}),WRITE_RECEIPT_STATES=["PREPARED","COMMITTED","FAILED_NO_EFFECT","IN_DOUBT"];class WriteReceiptError extends Error{code;constructor(code,message){super(message);this.name="WriteReceiptError",this.code=code}}var receiptRecordSchema=exports_external.object({version:exports_external.literal(1),receipt_id:exports_external.string().regex(/^[0-9a-f-]{36}$/i),attempt_id:exports_external.string().regex(/^[0-9a-f-]{36}$/i),tool:exports_external.string().min(1).max(80),root_hash:exports_external.string().regex(/^[0-9a-f]{64}$/),idempotency_hash:exports_external.string().regex(/^[0-9a-f]{64}$/),arguments_digest:exports_external.string().regex(/^[0-9a-f]{64}$/),policy_digest:exports_external.string().regex(/^[0-9a-f]{64}$/),state:exports_external.enum(WRITE_RECEIPT_STATES),prepared_at:exports_external.number().finite().nonnegative(),updated_at:exports_external.number().finite().nonnegative(),lease_expires_at:exports_external.number().finite().nonnegative(),response:exports_external.string().max(MAX_RECEIPT_RESPONSE_BYTES).optional(),error:exports_external.string().max(MAX_RECEIPT_RESPONSE_BYTES).optional()}).strict();function journalPath3(root){return path332.join(root,MCP_WRITE_RECEIPTS_RELATIVE_PATH)}function assertReceiptPaths(root){let journal=journalPath3(root),lockDirectory=path332.join(root,".swarm","locks");try{assertSwarmContainedTarget(journal),assertSwarmContainedTarget(path332.join(lockDirectory,"mcp-write-receipts.lock")),assertSwarmContainedTarget(path332.join(root,MCP_WRITE_RECEIPTS_ARCHIVE_RELATIVE_PATH)),validateSymlinkBoundary(journal,root),validateSymlinkBoundary(lockDirectory,root)}catch{throw new WriteReceiptError("JOURNAL_UNAVAILABLE","Write receipt journal path is outside the project boundary")}}function getWriteReceiptArchivePath(root){return path332.join(root,MCP_WRITE_RECEIPTS_ARCHIVE_RELATIVE_PATH)}function hash5(value){return createHash109("sha256").update(value,"utf8").digest("hex")}function canonicalRoot(root){return canonicalRootKeyFresh(root)}function hasControlCharacters2(value){for(let character of value){let code=character.codePointAt(0);if(code!==void 0&&(code<=31||code===127))return!0}return!1}function assertSafeRequest(request){if(!request.root||!path332.isAbsolute(request.root))throw new WriteReceiptError("INVALID_REQUEST","Write receipt requires an absolute project root");if(!request.tool||request.tool.length>80||hasControlCharacters2(request.tool))throw new WriteReceiptError("INVALID_REQUEST","Write receipt tool identity is invalid");if(!request.idempotencyKey||request.idempotencyKey.length>MAX_IDEMPOTENCY_KEY_LENGTH||hasControlCharacters2(request.idempotencyKey))throw new WriteReceiptError("INVALID_REQUEST","Idempotency key is empty, too long, or contains control characters")}function stableValue(value,depth=0,budget){let state2=budget??{nodes:0,bytes:0};if(state2.nodes+=1,state2.nodes>MAX_CANONICAL_NODES)throw new WriteReceiptError("INVALID_REQUEST","Write arguments exceed the bounded receipt digest input");if(depth>16)return"[depth-limited]";if(value===null||typeof value==="boolean")return value;if(typeof value==="string"){if(state2.bytes+=Buffer.byteLength(value,"utf8"),state2.bytes>MAX_ARGUMENT_BYTES)throw new WriteReceiptError("INVALID_REQUEST","Write arguments exceed the bounded receipt digest input");return value}if(typeof value==="number")return Number.isFinite(value)?value:"[non-finite]";if(typeof value==="bigint")return"[bigint]";if(typeof value>"u")return"[undefined]";if(Array.isArray(value)){if(value.length>MAX_CANONICAL_ARRAY_ITEMS)throw new WriteReceiptError("INVALID_REQUEST","Write arguments exceed the bounded receipt digest input");return value.map((item)=>stableValue(item,depth+1,state2))}if(typeof value==="object"){let record3=value,keys=Object.keys(record3).sort();if(keys.length>MAX_CANONICAL_OBJECT_KEYS)throw new WriteReceiptError("INVALID_REQUEST","Write arguments exceed the bounded receipt digest input");let result=Object.create(null);for(let key2 of keys){if(state2.bytes+=Buffer.byteLength(key2,"utf8"),state2.bytes>MAX_ARGUMENT_BYTES)throw new WriteReceiptError("INVALID_REQUEST","Write arguments exceed the bounded receipt digest input");let descriptor=Object.getOwnPropertyDescriptor(record3,key2);result[key2]=stableValue(descriptor&&"value"in descriptor?descriptor.value:"[accessor]",depth+1,state2)}return result}return`[${typeof value}]`}function canonicalArguments(value){let normalized=stableValue(value,0,{nodes:0,bytes:0}),encoded=JSON.stringify(normalized);if(encoded===void 0||Buffer.byteLength(encoded,"utf8")>MAX_ARGUMENT_BYTES)throw new WriteReceiptError("INVALID_REQUEST","Write arguments exceed the bounded receipt digest input");return encoded}function computeWriteReceiptIdentity(request){return assertSafeRequest(request),{root_hash:hash5(canonicalRoot(request.root)),idempotency_hash:hash5(request.idempotencyKey),arguments_digest:hash5(canonicalArguments(request.arguments)),policy_digest:hash5(request.policy??KNOWLEDGE_ADD_POLICY_VERSION)}}var RECEIPT_RESULT_UNREDACTED_VALUES=new Map([["category",new Set(KNOWLEDGE_CATEGORIES2)]]);async function readWriteReceiptStatus(root,idempotencyKey){let request={root,tool:"knowledge_add",idempotencyKey,arguments:{}},identity=computeWriteReceiptIdentity(request);assertReceiptPaths(root);let storage=await readReceiptStorage(root),record3=[...[...storage.archive,...storage.active]].reverse().find((candidate2)=>candidate2.tool===request.tool&&candidate2.root_hash===identity.root_hash&&candidate2.idempotency_hash===identity.idempotency_hash);if(!record3)return{found:!1,status:"NOT_FOUND",retryable:!0};return{found:!0,status:record3.state,tool:record3.tool,receipt_id:record3.receipt_id,attempt_id:record3.attempt_id,updated_at:record3.updated_at,lease_expires_at:record3.lease_expires_at,archived:storage.archive.includes(record3),retryable:!1}}async function readJournal(filePath,limits){let content,info;try{info=await lstat12(filePath)}catch(error93){if(error93?.code==="ENOENT")return[];throw new WriteReceiptError("JOURNAL_UNAVAILABLE","Write receipt journal could not be read")}if(!info.isFile()||info.isSymbolicLink())throw new WriteReceiptError("JOURNAL_UNAVAILABLE","Write receipt journal could not be read");if(info.size>limits.maxBytes)throw new WriteReceiptError("JOURNAL_CAPACITY","Write receipt journal exceeds its bounded capacity");let handle;try{handle=await open13(filePath,"r");let buffer=Buffer.alloc(limits.maxBytes+1),offset=0;while(offset<buffer.length){let read=await handle.read(buffer,offset,buffer.length-offset,null);if(read.bytesRead===0)break;offset+=read.bytesRead}if(offset>limits.maxBytes)throw new WriteReceiptError("JOURNAL_CAPACITY","Write receipt journal exceeds its bounded capacity");content=buffer.subarray(0,offset).toString("utf8")}catch(error93){if(error93 instanceof WriteReceiptError)throw error93;throw new WriteReceiptError("JOURNAL_UNAVAILABLE","Write receipt journal could not be read")}finally{try{await handle?.close()}catch{}}if(content.length>0&&!content.endsWith(`
|
|
7737
7737
|
`))throw new WriteReceiptError("JOURNAL_CORRUPT","Write receipt journal has a truncated final record");let lines=content.split(`
|
|
7738
7738
|
`);if(lines.length>limits.maxRecords+1)throw new WriteReceiptError("JOURNAL_CAPACITY","Write receipt journal exceeds its bounded record capacity");let records=[];for(let line of lines){if(!line)continue;if(Buffer.byteLength(line,"utf8")>MAX_RECEIPT_LINE_BYTES)throw new WriteReceiptError("JOURNAL_CAPACITY","Write receipt record exceeds its bounded line size");let parsed;try{parsed=JSON.parse(line)}catch{throw new WriteReceiptError("JOURNAL_CORRUPT","Write receipt journal contains invalid JSON")}let result=receiptRecordSchema.safeParse(parsed);if(!result.success)throw new WriteReceiptError("JOURNAL_CORRUPT","Write receipt journal contains an invalid record");records.push(result.data)}return records}async function readReceiptStorage(root){let[archive,active]=await Promise.all([readJournal(getWriteReceiptArchivePath(root),{maxBytes:MAX_RECEIPT_ARCHIVE_BYTES,maxRecords:MAX_RECEIPT_ARCHIVE_RECORDS}),readJournal(journalPath3(root),{maxBytes:MAX_RECEIPT_JOURNAL_BYTES,maxRecords:MAX_RECEIPT_RECORDS})]);return{archive,active}}var boundedKnowledgeText=exports_external.string().max(MAX_KNOWLEDGE_OPTIONAL_TEXT_LENGTH),knowledgeAddInput=exports_external.object({idempotency_key:exports_external.string().min(1).max(MAX_IDEMPOTENCY_KEY_LENGTH).refine((value)=>!hasControlCharacters2(value),{message:"idempotency_key must not contain ASCII control characters"}),lesson:exports_external.string().min(15).max(MAX_KNOWLEDGE_TEXT_LENGTH),category:exports_external.enum(KNOWLEDGE_CATEGORIES2),tags:exports_external.array(boundedKnowledgeText).max(MAX_KNOWLEDGE_ARRAY_ITEMS).optional(),scope:boundedKnowledgeText.optional(),applies_to_agents:exports_external.array(boundedKnowledgeText).max(MAX_KNOWLEDGE_ARRAY_ITEMS).optional(),applies_to_tools:exports_external.array(boundedKnowledgeText).max(MAX_KNOWLEDGE_ARRAY_ITEMS).optional(),required_actions:exports_external.array(boundedKnowledgeText).max(MAX_KNOWLEDGE_ARRAY_ITEMS).optional(),forbidden_actions:exports_external.array(boundedKnowledgeText).max(MAX_KNOWLEDGE_ARRAY_ITEMS).optional(),verification_checks:exports_external.array(boundedKnowledgeText).max(MAX_KNOWLEDGE_ARRAY_ITEMS).optional()}).strict();init_create_tool();var knowledge_receipt_status=createSwarmTool({description:"Read the bounded status of a knowledge_add receipt without exposing its payload",args:{idempotency_key:writeReceiptStatusInput.shape.idempotency_key},execute:async(args2,directory)=>JSON.stringify(await readWriteReceiptStatus(directory,writeReceiptStatusInput.parse(args2).idempotency_key))});init_zod();init_knowledge_store();init_skill_invalidator();init_curation_policy();init_create_tool();async function loadConfigForPolicy2(directory){let{KnowledgeConfigSchema:KnowledgeConfigSchema2}=await Promise.resolve().then(() => (init_schema(),exports_schema));try{let{loadPluginConfigWithMeta:loadPluginConfigWithMeta2}=await Promise.resolve().then(() => (init_config(),exports_config)),{config:loadedConfig}=loadPluginConfigWithMeta2(directory);return KnowledgeConfigSchema2.parse(loadedConfig.knowledge??{})}catch{return KnowledgeConfigSchema2.parse({})}}var _internals281={transactKnowledge,writeArchiveTombstoneAndInvalidateSkills},knowledge_remove=createSwarmTool({allowWorkingDirectoryOverride:!0,description:"Delete an outdated swarm knowledge entry by ID (swarm tier only — does not affect hive). Promoted entries cannot be deleted. Double-deletion is idempotent — removing a non-existent entry returns a clear message without error.",args:{id:exports_external.string().min(1).describe("UUID of the knowledge entry to remove")},execute:async(args2,directory)=>{let idInput;try{if(args2&&typeof args2==="object")idInput=args2.id}catch{}if(typeof idInput!=="string"||idInput.length<1)return JSON.stringify({success:!1,error:"id must be a non-empty string"});let id=idInput,swarmPath3=resolveSwarmKnowledgePath(directory),preEntries;try{preEntries=await readKnowledge(swarmPath3)}catch(err){let message=err instanceof Error?err.message:"Unknown error";return JSON.stringify({success:!1,error:message})}let preTarget=preEntries.find((e)=>e.id===id)??null;if(preTarget){let curationInput={directory,action:"remove",entryId:id,reason:"hard-delete via knowledge_remove tool",evidenceScope:"cohort-wide"},curationContext={config:await loadConfigForPolicy2(directory),entry:preTarget},decision=await authorizeCuration(curationInput,curationContext);if(!decision.authorized)return JSON.stringify({success:!1,error:`Cohort-safety policy blocked removal: ${decision.detail}`,basis:decision.basis})}let found=!1,remaining=0,isPromoted=!1;try{await _internals281.transactKnowledge(swarmPath3,(entries2)=>{let entryToDelete=entries2.find((entry)=>entry.id===id);if(!entryToDelete)return null;if(entryToDelete.status==="promoted")return isPromoted=!0,null;let filtered=entries2.filter((entry)=>entry.id!==id);if(filtered.length===entries2.length)return null;return found=!0,remaining=filtered.length,filtered})}catch(err){let message=err instanceof Error?err.message:"Unknown error";return JSON.stringify({success:!1,error:message})}if(isPromoted)return JSON.stringify({success:!1,message:"cannot delete promoted entry — this entry has been promoted to cross-project consensus"});if(!found)return JSON.stringify({success:!1,message:"entry not found"});return await _internals281.writeArchiveTombstoneAndInvalidateSkills({directory,entryId:id,tier:"swarm",actor:"knowledge_remove",reason:"hard-delete via knowledge_remove tool",mode:"purge",skipTombstone:!0,sourceLabel:"knowledge-remove"}),JSON.stringify({success:!0,removed:1,remaining})}});init_zod();init_file_locks();init_create_tool();async function executeLeanTurboAcquireLocks(args2){let{directory,laneId,files,agent,taskId,sessionID}=args2;try{let result=await acquireLaneLocks(directory,laneId,files,agent,taskId,sessionID);if(result.acquired)return{success:!0,locks:result.locks};else return{success:!1,conflicts:result.conflicts}}catch(error93){return{success:!1,errors:[error93 instanceof Error?error93.message:String(error93)]}}}var lean_turbo_acquire_locks=createSwarmTool({description:"Acquire file locks for all files in a lane (all-or-nothing). Wraps acquireLaneLocks from src/parallel/file-locks. If any file is already locked, releases all previously acquired locks.",args:{directory:exports_external.string().describe("Project root directory"),laneId:exports_external.string().describe('Unique lane identifier (e.g., "lane-1")'),files:exports_external.array(exports_external.string().min(1)).min(1).describe("Array of file paths to lock"),agent:exports_external.string().describe("Agent name acquiring the locks"),taskId:exports_external.string().describe('Task ID (e.g., "4.1")'),sessionID:exports_external.string().describe("Session ID for the Lean Turbo run")},execute:async(args2,_directory2)=>{return JSON.stringify(await executeLeanTurboAcquireLocks({...args2,directory:_directory2}),null,2)}});init_zod();init_constants();import*as fs196 from"node:fs";import*as path333 from"node:path";init_create_tool();function readPlanJson2(directory){let planPath=path333.join(directory,".swarm","plan.json");if(!fs196.existsSync(planPath))return null;try{return JSON.parse(fs196.readFileSync(planPath,"utf-8"))}catch{return null}}async function executeLeanTurboPlanLanes(args2){let{directory,phase,scopes}=args2,plan=readPlanJson2(directory);if(!plan)return{success:!1,errors:["plan.json not found in .swarm directory"]};let defaultConfig={...DEFAULT_LEAN_TURBO_CONFIG};try{let lanePlan=planLeanTurboLanes(directory,phase,plan,defaultConfig,scopes);return{success:!0,plan:lanePlan,lanes:lanePlan.lanes,degradedTasks:lanePlan.degradedTasks,serializedTasks:lanePlan.serializedTasks}}catch(error93){return{success:!1,errors:[error93 instanceof Error?error93.message:String(error93)]}}}var lean_turbo_plan_lanes=createSwarmTool({description:"Partition phase tasks into parallel lanes based on file-scope conflicts. Wraps planLeanTurboLanes for Lean Turbo lane planning.",args:{directory:exports_external.string().describe("Project root directory where .swarm/plan.json is located"),phase:exports_external.number().int().positive().describe("Phase number to plan"),scopes:exports_external.record(exports_external.string(),exports_external.array(exports_external.string())).optional().describe("Optional pre-loaded scopes map (taskId -> file paths)")},execute:async(args2,_directory2)=>{return JSON.stringify(await executeLeanTurboPlanLanes({...args2,directory:_directory2}),null,2)}});init_zod();init_state4();init_create_tool();async function executeLeanTurboRunnerStatus(args2){let{directory,sessionID}=args2;try{let runState=loadLeanTurboRunState(directory,sessionID);if(!runState)return{success:!1,errors:["No Lean Turbo run state found for this session"]};return{success:!0,status:runState.status,phase:runState.phase,lanes:runState.lanes,degradedTasks:runState.degradedTasks,maxParallelCoders:runState.maxParallelCoders,sessionID:runState.sessionID,strategy:runState.strategy}}catch(error93){return{success:!1,errors:[error93 instanceof Error?error93.message:String(error93)]}}}var lean_turbo_runner_status=createSwarmTool({description:"Read Lean Turbo run state from .swarm/turbo-state.json. Returns status, phase, lanes, degraded tasks, and max parallel coders.",args:{directory:exports_external.string().describe("Project root directory where .swarm/turbo-state.json is located"),sessionID:exports_external.string().describe("Session ID for the Lean Turbo run")},execute:async(args2,_directory2)=>{return JSON.stringify(await executeLeanTurboRunnerStatus({...args2,directory:_directory2}),null,2)}});init_zod();init_constants();init_state4();init_create_tool();async function executeLeanTurboStatus(args2){let{directory,sessionID}=args2;try{let runState=loadLeanTurboRunState(directory,sessionID),defaultConfig={max_parallel_coders:DEFAULT_LEAN_TURBO_CONFIG.max_parallel_coders,require_declared_scope:DEFAULT_LEAN_TURBO_CONFIG.require_declared_scope,degrade_on_risk:DEFAULT_LEAN_TURBO_CONFIG.degrade_on_risk,conflict_policy:DEFAULT_LEAN_TURBO_CONFIG.conflict_policy};if(runState)return{success:!0,strategy:"lean",leanActive:runState.status==="running",config:defaultConfig,status:runState.status,phase:runState.phase,lanes:runState.lanes.length,degradedTasks:runState.degradedTasks.length};return{success:!0,strategy:"lean",leanActive:!1,config:defaultConfig,status:"idle",phase:void 0,lanes:0,degradedTasks:0}}catch(error93){return{success:!1,errors:[error93 instanceof Error?error93.message:String(error93)]}}}var lean_turbo_status=createSwarmTool({description:"Returns Lean Turbo configuration and active status for the current session. Shows whether lean turbo is active, current status, and configuration values.",args:{directory:exports_external.string().describe("Project root directory"),sessionID:exports_external.string().describe("Session ID to check status for")},execute:async(args2,_directory2)=>{return JSON.stringify(await executeLeanTurboStatus({...args2,directory:_directory2}),null,2)}});init_lint();init_spec_schema();init_effective_spec();init_create_tool();var OBLIGATION_KEYWORDS=["MUST","SHALL","SHOULD","MAY"],FR_ID_PATTERN2=/\bFR-(?!000)\d{3}\b/,OBLIGATION_PATTERN2=/\b(MUST|SHALL|SHOULD|MAY)\b/g,SCENARIO_PATTERN=/^##\s+Scenario\s*:/gm,GIVEN_WHEN_THEN_PATTERN=/\b(Given|When|Then|And|But)[:\s]/gi;function countRequirementsByObligation(content){let counts={MUST:0,SHALL:0,SHOULD:0,MAY:0},lines=content.replace(/```[\s\S]*?```/g,"").replace(/`[^`]*`/g,"").split(`
|
|
7739
7739
|
`);for(let line of lines){if(!line.match(FR_ID_PATTERN2))continue;let matches=line.matchAll(OBLIGATION_PATTERN2);for(let match of matches){let keyword=match[1];if(OBLIGATION_KEYWORDS.includes(keyword))counts[keyword]++}}return counts}function countScenarios(content){let scenarioCount=0,scenarioMatches=content.match(SCENARIO_PATTERN);if(scenarioMatches)scenarioCount+=scenarioMatches.length;let givenWhenThenMatches=content.match(GIVEN_WHEN_THEN_PATTERN);if(givenWhenThenMatches&&givenWhenThenMatches.length>0){if(scenarioCount===0)scenarioCount=(content.match(/\bWhen\s+/gi)||[]).length}return scenarioCount}var lint_spec=createSwarmTool({description:"Reads .swarm/spec.md, lints markdown spec for FR-IDs, obligations, and structure, and returns requirement counts by obligation level, scenario count, and any errors or warnings found.",args:{},async execute(_args,directory){let errors5=[],warnings=[],spec=readEffectiveSpecSync(directory);if(!spec)return JSON.stringify({valid:!1,specMtime:null,requirementCount:{MUST:0,SHALL:0,SHOULD:0,MAY:0,total:0},scenarioCount:0,errors:["spec.md not found and no valid OpenSpec-compatible projection available"],warnings:[]},null,2);let{mtime:specMtime,content}=spec,contentValidation=validateSpecContent(content);if(!contentValidation.valid)for(let issue3 of contentValidation.issues)errors5.push(`Line ${issue3.line}: ${issue3.message}`);let obligationCounts=countRequirementsByObligation(content),totalRequirements=Object.values(obligationCounts).reduce((sum,count)=>sum+count,0),scenarioCount=countScenarios(content),result={valid:errors5.length===0,specMtime,requirementCount:{...obligationCounts,total:totalRequirements},scenarioCount,errors:errors5,warnings:[...warnings,...spec.warnings]};return JSON.stringify(result,null,2)}});init_zod();init_engine();import{createHash as createHash110}from"node:crypto";import*as fs197 from"node:fs";import*as path334 from"node:path";var _internals282={evaluateMutationGate,buildTestImprovementPrompt,buildMessage};function evaluateMutationGate(report,passThreshold=0.8,warnThreshold=0.6){if(passThreshold<warnThreshold)throw Error(`Invalid thresholds: passThreshold (${passThreshold}) must be >= warnThreshold (${warnThreshold})`);let adjustedKillRate=report.adjustedKillRate,survivedMutants=report.results.filter((result)=>result.outcome==="survived"),verdict;if(adjustedKillRate>=passThreshold)verdict="pass";else if(adjustedKillRate>=warnThreshold)verdict="warn";else verdict="fail";let testImprovementPrompt=_internals282.buildTestImprovementPrompt(report,passThreshold,verdict),message=_internals282.buildMessage(verdict,adjustedKillRate,report.killed,report.totalMutants,report.equivalent,warnThreshold);return{verdict,killRate:report.killRate,adjustedKillRate,totalMutants:report.totalMutants,killed:report.killed,survived:report.survived,threshold:passThreshold,warnThreshold,message,survivedMutants,testImprovementPrompt}}function buildTestImprovementPrompt(report,passThreshold,verdict){if(verdict==="pass")return"";let lowKillRateFunctions=[];for(let[key2,stats2]of report.perFunction)if(stats2.killRate<passThreshold){let lastColon=key2.lastIndexOf(":");if(lastColon===-1)continue;let filePath=key2.substring(0,lastColon),functionName=key2.substring(lastColon+1);lowKillRateFunctions.push(` - ${functionName} in ${filePath}: ${Math.round(stats2.killRate*100)}% kill rate (${stats2.killed}/${stats2.total} killed)`)}if(lowKillRateFunctions.length===0)return"";return`The following functions have low mutation kill rates and need stronger tests:
|