opencode-swarm 7.135.0 → 7.135.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/cli/{config-doctor-j1x63x87.js → config-doctor-6398t3a6.js} +2 -2
  2. package/dist/cli/{core-fvqp2gnn.js → core-9876t6cs.js} +1 -1
  3. package/dist/cli/{curation-policy-xg9zw0ep.js → curation-policy-f7qz4tez.js} +2 -2
  4. package/dist/cli/{curator-yc06cmnz.js → curator-fjhyezyx.js} +14 -14
  5. package/dist/cli/{curator-llm-factory-4mat6cq5.js → curator-llm-factory-wr3zmy2c.js} +14 -14
  6. package/dist/cli/{guardrail-explain-zmbxwh3s.js → guardrail-explain-g1s89b3e.js} +15 -15
  7. package/dist/cli/{guardrail-log-7egxrxap.js → guardrail-log-bd45kw0x.js} +3 -3
  8. package/dist/cli/{hive-promoter-7s3gzajy.js → hive-promoter-f2yh22m1.js} +14 -14
  9. package/dist/cli/{index-a4972t0f.js → index-247b1c1m.js} +3 -3
  10. package/dist/cli/{index-997d6p42.js → index-2nqsr1dx.js} +2 -2
  11. package/dist/cli/{index-6kmmdtdp.js → index-4pdrmemy.js} +2 -2
  12. package/dist/cli/{index-ctvnb76s.js → index-5vp9gka3.js} +1 -1
  13. package/dist/cli/{index-86wdrskb.js → index-5wx8wdxg.js} +5 -5
  14. package/dist/cli/{index-crw4n55v.js → index-aky90eqz.js} +36 -36
  15. package/dist/cli/{index-vf6e8ame.js → index-bjrkg4tc.js} +1 -1
  16. package/dist/cli/{index-337r9pkr.js → index-dzaarxhg.js} +1 -1
  17. package/dist/cli/{index-44zgqvqh.js → index-fwkqq9mq.js} +1 -1
  18. package/dist/cli/{index-x88w0cp5.js → index-g1drmgxe.js} +1 -1
  19. package/dist/cli/{index-nrvs08pr.js → index-j89zmcpx.js} +4 -4
  20. package/dist/cli/{index-grxkbbc5.js → index-jtshf1pd.js} +1 -1
  21. package/dist/cli/{index-e8w62fgs.js → index-jxchddjk.js} +1 -1
  22. package/dist/cli/{index-4yv2rn8q.js → index-nbnqf4fj.js} +1 -1
  23. package/dist/cli/{index-96b78s7p.js → index-w80r3axq.js} +16 -16
  24. package/dist/cli/{index-q9mq5tv3.js → index-wdkkf3xg.js} +2 -2
  25. package/dist/cli/{index-g0raqavt.js → index-xhpmagdm.js} +1 -1
  26. package/dist/cli/index.js +14 -14
  27. package/dist/cli/{knowledge-escalator-d76a090n.js → knowledge-escalator-4tp3yy7e.js} +3 -3
  28. package/dist/cli/{knowledge-events-3mcg1a0e.js → knowledge-events-7854gb3p.js} +1 -1
  29. package/dist/cli/{knowledge-store-xtt4sede.js → knowledge-store-cxnr6v01.js} +1 -1
  30. package/dist/cli/{knowledge-validator-h1k7ymtd.js → knowledge-validator-3n5t55qy.js} +4 -4
  31. package/dist/cli/{scan-cursor-stztfv7d.js → scan-cursor-0cexjh3b.js} +2 -2
  32. package/dist/cli/{schema-tbq2srrh.js → schema-rs5a7ywx.js} +1 -1
  33. package/dist/cli/{scope-persistence-7wydjzx8.js → scope-persistence-1vsnkmm4.js} +1 -1
  34. package/dist/cli/{skill-generator-02q1qdf0.js → skill-generator-n0h9n0zd.js} +5 -5
  35. package/dist/hooks/scope-guard.d.ts +11 -4
  36. package/dist/index.js +10 -10
  37. package/dist/scope/scope-binding.d.ts +68 -0
  38. package/dist/session/snapshot-reader.d.ts +6 -0
  39. package/dist/state.d.ts +118 -0
  40. package/dist/turbo/lean/lane-scope.d.ts +120 -0
  41. package/dist/turbo/lean/runner.d.ts +66 -4
  42. package/package.json +1 -1
  43. /package/dist/cli/{index-ny93srnd.js → index-fpkb3mw1.js} +0 -0
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.135.0",description:"Architect-centric agentic swarm plugin for OpenCode - hub-and-spoke orchestration with SME consultation, code generation, and QA review",main:"dist/index.js",types:"dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",default:"./dist/index.js"},"./package.json":"./package.json"},bin:{"opencode-swarm":"./dist/cli/index.js"},type:"module",engines:{bun:">=1.3.13"},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/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/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","tests/fixtures/memory-recall","README.md","LICENSE"],scripts:{clean:`bun -e "require('fs').rmSync('dist',{recursive:true,force:true})"`,build:"bun run clean && 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","drift:check":"bun run scripts/drift-check.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: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"},dependencies:{"@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.1.8"},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"}}});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, and Python",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",agents:["architect","researcher","docs","explorer"],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"]},prepare_pr_workflow_checkout:{description:"preserve explicit dirty tracked files before an unbound PR workflow checkout with an auditable recovery receipt",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",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",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:"mark a phase as complete and track dispatched agents",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"]},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, model-limit, 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. 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"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},get_qa_gate_profile:{description:"retrieve the QA gate profile for the current plan: 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, and profile hash. Read-only.",agents:["architect"]},set_qa_gates:{description:"configure the QA gate profile for the current plan. Architect-only. Ratchet-tighter only — rejected once the profile is 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.",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_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_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 so you can keep working; launch_timeout_ms is only a promptAsync acceptance budget, not a lane runtime timeout; poll incrementally with collect_lane_results (wait omitted or false) while doing independent investigation, or join with wait: true when you need all results",agents:["architect"]},collect_lane_results:{description:"collect or poll results for a dispatch_lanes_async batch; supports both non-blocking polling (wait omitted or false) and blocking join (wait: true). Non-blocking polls include pending lane identities by default and process settled lanes incrementally while continuing independent work; busy/retry lanes are not timed out just because they run for a long time. Does not advance workflow gates. Inline output for a settled lane is delivered only once: later polls of the same lane set output_omitted_repeat: true and omit output, but still include output_ref for recovery via retrieve_lane_output.",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_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 deepMergeInternal(base,override,depth){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);else result[key]=overrideVal}return result}function deepMerge(base,override){if(!base)return override;if(!override)return base;return deepMergeInternal(base,override,0)}var MAX_MERGE_DEPTH=10;function freezeSet(items){let set=new Set(items),proxy=new Proxy(set,{get(target,prop){if(prop==="add"||prop==="delete"||prop==="clear")return()=>{throw TypeError("CLAUDE_CODE_NATIVE_COMMANDS 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("CLAUDE_CODE_NATIVE_COMMANDS is readonly")},deleteProperty(){throw TypeError("CLAUDE_CODE_NATIVE_COMMANDS is readonly")},defineProperty(){throw TypeError("CLAUDE_CODE_NATIVE_COMMANDS is readonly")},setPrototypeOf(){throw TypeError("CLAUDE_CODE_NATIVE_COMMANDS 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,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,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.135.1",description:"Architect-centric agentic swarm plugin for OpenCode - hub-and-spoke orchestration with SME consultation, code generation, and QA review",main:"dist/index.js",types:"dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",default:"./dist/index.js"},"./package.json":"./package.json"},bin:{"opencode-swarm":"./dist/cli/index.js"},type:"module",engines:{bun:">=1.3.13"},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/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/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","tests/fixtures/memory-recall","README.md","LICENSE"],scripts:{clean:`bun -e "require('fs').rmSync('dist',{recursive:true,force:true})"`,build:"bun run clean && 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","drift:check":"bun run scripts/drift-check.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: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"},dependencies:{"@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.1.8"},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"}}});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, and Python",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",agents:["architect","researcher","docs","explorer"],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"]},prepare_pr_workflow_checkout:{description:"preserve explicit dirty tracked files before an unbound PR workflow checkout with an auditable recovery receipt",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",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",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:"mark a phase as complete and track dispatched agents",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"]},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, model-limit, 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. 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"],prWorkflow:{modes:["PR_REVIEW","PR_FEEDBACK"],capability:"observe"}},get_qa_gate_profile:{description:"retrieve the QA gate profile for the current plan: 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, and profile hash. Read-only.",agents:["architect"]},set_qa_gates:{description:"configure the QA gate profile for the current plan. Architect-only. Ratchet-tighter only — rejected once the profile is 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.",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_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_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 so you can keep working; launch_timeout_ms is only a promptAsync acceptance budget, not a lane runtime timeout; poll incrementally with collect_lane_results (wait omitted or false) while doing independent investigation, or join with wait: true when you need all results",agents:["architect"]},collect_lane_results:{description:"collect or poll results for a dispatch_lanes_async batch; supports both non-blocking polling (wait omitted or false) and blocking join (wait: true). Non-blocking polls include pending lane identities by default and process settled lanes incrementally while continuing independent work; busy/retry lanes are not timed out just because they run for a long time. Does not advance workflow gates. Inline output for a settled lane is delivered only once: later polls of the same lane set output_omitted_repeat: true and omit output, but still include output_ref for recovery via retrieve_lane_output.",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_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 deepMergeInternal(base,override,depth){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);else result[key]=overrideVal}return result}function deepMerge(base,override){if(!base)return override;if(!override)return base;return deepMergeInternal(base,override,0)}var MAX_MERGE_DEPTH=10;function freezeSet(items){let set=new Set(items),proxy=new Proxy(set,{get(target,prop){if(prop==="add"||prop==="delete"||prop==="clear")return()=>{throw TypeError("CLAUDE_CODE_NATIVE_COMMANDS 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("CLAUDE_CODE_NATIVE_COMMANDS is readonly")},deleteProperty(){throw TypeError("CLAUDE_CODE_NATIVE_COMMANDS is readonly")},defineProperty(){throw TypeError("CLAUDE_CODE_NATIVE_COMMANDS is readonly")},setPrototypeOf(){throw TypeError("CLAUDE_CODE_NATIVE_COMMANDS 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,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,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
 
@@ -355,7 +355,7 @@ ${cacheSection2}`;return baseMsg}let lines2=["## Archive Preview (dry run)","",`
355
355
  BEGIN
356
356
  SELECT RAISE(ABORT, 'qa_gate_profile row is locked and cannot be modified after critic approval');
357
357
  END`}],_projectDbs=new Map});import{createHash as createHash11}from"node:crypto";function rowToProfile(row){let parsed={};try{let maybeGates=JSON.parse(row.gates);if(maybeGates&&typeof maybeGates==="object"&&!Array.isArray(maybeGates))parsed=maybeGates}catch{parsed={}}let raw=parsed;if(raw.council_mode===!0&&raw.phase_council===void 0)parsed.phase_council=!0,parsed.council_mode=!1;let knownKeys=new Set(Object.keys(DEFAULT_QA_GATES)),filteredParsed={};for(let key of Object.keys(parsed))if(knownKeys.has(key))filteredParsed[key]=parsed[key];let gates={...DEFAULT_QA_GATES,...filteredParsed};return{id:row.id,plan_id:row.plan_id,created_at:row.created_at,project_type:row.project_type,gates,locked_at:row.locked_at,locked_by_snapshot_seq:row.locked_by_snapshot_seq}}function getProfile(directory,planId){if(!projectDbExists(directory))return null;let row=getProjectDb(directory).query("SELECT * FROM qa_gate_profile WHERE plan_id = ?").get(planId);return row?rowToProfile(row):null}function hasAnyProfileWithEnabledGate(directory,gate){if(!projectDbExists(directory))return!1;let rows=getProjectDb(directory).query("SELECT gates FROM qa_gate_profile").all();for(let row of rows)try{if(JSON.parse(row.gates)?.[gate]===!0)return!0}catch{}return!1}function getOrCreateProfile(directory,planId,projectType){let existing=_internals23.getProfile(directory,planId);if(existing)return existing;let db=getProjectDb(directory),gatesJson=JSON.stringify(DEFAULT_QA_GATES),insert=db.transaction(()=>{db.run("INSERT INTO qa_gate_profile (plan_id, project_type, gates) VALUES (?, ?, ?)",[planId,projectType??null,gatesJson])});try{insert()}catch(err){if(!(err instanceof Error?err.message:String(err)).toLowerCase().includes("unique"))throw err}let after=_internals23.getProfile(directory,planId);if(!after)throw Error(`Failed to create or load QA gate profile for plan_id=${planId}`);return after}function setGates(directory,planId,gates){let current=_internals23.getProfile(directory,planId);if(!current)throw Error(`No QA gate profile found for plan_id=${planId} — call getOrCreateProfile first`);if(current.locked_at!==null)throw Error("Cannot modify gates: QA gate profile is locked after critic approval");let merged={...current.gates};for(let key of Object.keys(gates)){let incoming=gates[key];if(incoming===void 0)continue;if(incoming===!1&&current.gates[key]===!0)throw Error(`Cannot disable gate '${key}': sessions can only ratchet tighter`);if(incoming===!0)merged[key]=!0}getProjectDb(directory).run("UPDATE qa_gate_profile SET gates = ? WHERE plan_id = ?",[JSON.stringify(merged),planId]);let updated=_internals23.getProfile(directory,planId);if(!updated)throw Error(`Failed to re-read QA gate profile after update for plan_id=${planId}`);return updated}function lockProfile(directory,planId,snapshotSeq){let current=_internals23.getProfile(directory,planId);if(!current)throw Error(`No QA gate profile found for plan_id=${planId} — cannot lock`);if(current.locked_at!==null)return current;getProjectDb(directory).run("UPDATE qa_gate_profile SET locked_at = datetime('now'), locked_by_snapshot_seq = ? WHERE plan_id = ?",[snapshotSeq,planId]);let locked=_internals23.getProfile(directory,planId);if(!locked)throw Error(`Failed to re-read locked QA gate profile for plan_id=${planId}`);return locked}function computeProfileHash(profile){let payload=JSON.stringify({plan_id:profile.plan_id,gates:profile.gates});return createHash11("sha256").update(payload).digest("hex")}function getEffectiveGates(profile,sessionOverrides){let merged={...profile.gates};for(let key of Object.keys(sessionOverrides))if(sessionOverrides[key]===!0)merged[key]=!0;return merged}var _internals23,DEFAULT_QA_GATES;var init_qa_gate_profile=__esm(()=>{init_project_db();_internals23={getProfile,getOrCreateProfile,setGates,getEffectiveGates,computeProfileHash,hasAnyProfileWithEnabledGate},DEFAULT_QA_GATES={reviewer:!0,test_engineer:!0,council_mode:!1,sme_enabled:!0,critic_pre_plan:!0,hallucination_guard:!1,sast_enabled:!0,mutation_test:!1,phase_council:!1,drift_check:!0,final_council:!1}});function detectHostOS(){switch(process.platform){case"win32":return"windows";case"darwin":return"macos";case"linux":return"linux";default:return"unknown"}}function detectShellFamily(){if(process.env.PSModulePath)return"powershell";if((process.env.ComSpec??"").toLowerCase().includes("cmd.exe"))return"cmd";let shell=process.env.SHELL??"";if(shell.includes("bash"))return"bash";if(shell.includes("zsh"))return"zsh";if(shell.includes("/sh"))return"sh";return"unknown"}function detectExecutionMode(hostOS){if(process.env.WSL_DISTRO_NAME)return"wsl";if(hostOS==="linux"){if(["DOCKER_CONTAINER","KUBERNETES_SERVICE_HOST","CONTAINER"].some((k)=>process.env[k]))return"docker"}return"native"}function deriveOperatingMode(hostOS,_executionMode){if(hostOS==="linux")return"linux";if(hostOS==="macos")return"macos-native";if(hostOS==="windows")return"windows-native";return"unknown"}function buildCommandPolicy(profile){if(profile.isWindowsNative)return{preferredShell:"powershell",avoidPosixExamples:!0,preferNodeApis:!0,preferToolingOverShell:!0,pathExampleStyle:"windows",examples:{listDir:"Get-ChildItem -Force",removeFile:"Remove-Item file.tmp",setEnv:'$env:DEBUG = "1"',printEnv:"$env:PATH",searchText:'Get-ChildItem -Recurse src | Select-String "foo"'}};return{preferredShell:profile.shellFamily==="unknown"?"bash":profile.shellFamily,avoidPosixExamples:!1,preferNodeApis:!0,preferToolingOverShell:!0,pathExampleStyle:"posix",examples:{listDir:"ls -la",removeFile:"rm file.tmp",setEnv:"export DEBUG=1",printEnv:"echo $PATH",searchText:'grep -R "foo" src/'}}}function detectEnvironmentProfile(){let hostOS=detectHostOS(),shellFamily=detectShellFamily(),executionMode=detectExecutionMode(hostOS),operatingMode=deriveOperatingMode(hostOS,executionMode),isWindowsNative=hostOS==="windows"&&executionMode==="native",isWindowsDocker=!1;return{hostOS,shellFamily,executionMode,operatingMode,isWindowsNative,isWindowsDocker:!1,isWSL:executionMode==="wsl",pathStyle:hostOS==="windows"?"windows":"posix",shellCommandPreference:isWindowsNative?"powershell-native":"posix-native",evidence:{processPlatform:process.platform,comspec:process.env.ComSpec,psModulePath:process.env.PSModulePath,termProgram:process.env.TERM_PROGRAM,shell:process.env.SHELL,wslDistroName:process.env.WSL_DISTRO_NAME,containerMarkers:["DOCKER_CONTAINER","KUBERNETES_SERVICE_HOST","CONTAINER"].filter((k)=>!!process.env[k])}}}function deriveCommandPolicy(profile){return buildCommandPolicy(profile)}import*as path32 from"node:path";function normalizeCandidate(value){if(typeof value!=="string"||value.length===0)return null;if([...value].some((character)=>{let codePoint=character.codePointAt(0)??0;return codePoint<=31||codePoint===127}))return null;if(path32.win32.isAbsolute(value)||path32.posix.isAbsolute(value))return null;let normalized=value.replace(/\\/g,"/");if(normalized.split("/").some((segment)=>segment===""||segment==="."||segment===".."))return null;return normalized}function isExactMarkdownPath(value){let normalized=normalizeCandidate(value);return normalized!==null&&path32.posix.extname(normalized)===".md"}function isMarkdownOnlyDeclaredScope(value){return Array.isArray(value)&&value.length>0&&value.every(isExactMarkdownPath)}function isMarkdownOnlyTaskChange(declaredFiles,observedFiles){if(!Array.isArray(declaredFiles)||!Array.isArray(observedFiles))return!1;if(!isMarkdownOnlyDeclaredScope(declaredFiles)||observedFiles.length===0)return!1;if(!observedFiles.every(isExactMarkdownPath))return!1;let declared=new Set(declaredFiles.map(normalizeCandidate).filter((value)=>value!==null));return observedFiles.every((value)=>{let normalized=normalizeCandidate(value);return normalized!==null&&declared.has(normalized)})}var init_gate_evidence_classification=()=>{};async function computeComplexity(directory,changedFiles){let functionCount=0,astChangeCount=0,maxFileComplexity=0;for(let file2 of changedFiles){if(!/\.(ts|js|tsx|jsx|py|go|rs)$/.test(file2))continue;try{let fs19=await import("node:fs"),filePath=(await import("node:path")).join(directory,file2);if(!fs19.existsSync(filePath))continue;let content=fs19.readFileSync(filePath,"utf-8"),fileFunctionCount=content.match(/\b(function|def|func|fn)\s+\w+/g)?.length||0;functionCount+=fileFunctionCount;let lines=content.split(`
358
- `).length,estimatedChanges=Math.min(lines/10,50);astChangeCount+=estimatedChanges;let fileComplexity=fileFunctionCount+lines/100;maxFileComplexity=Math.max(maxFileComplexity,fileComplexity)}catch{}}return{fileCount:changedFiles.length,functionCount,astChangeCount:Math.round(astChangeCount),maxFileComplexity:Math.round(maxFileComplexity*10)/10}}function routeReview(metrics){if(metrics.fileCount>=5||metrics.functionCount>=10||metrics.astChangeCount>=30||metrics.maxFileComplexity>=15)return{reviewerCount:2,testEngineerCount:2,depth:"double",reason:`High complexity: ${metrics.fileCount} files, ${metrics.functionCount} functions, complexity score ${metrics.maxFileComplexity}`};return{reviewerCount:1,testEngineerCount:1,depth:"single",reason:`Standard complexity: ${metrics.fileCount} files, ${metrics.functionCount} functions`}}async function routeReviewForChanges(directory,changedFiles){let metrics=await computeComplexity(directory,changedFiles);return routeReview(metrics)}function shouldParallelizeReview(routing){return routing.depth==="double"}import*as fs19 from"node:fs";import*as path33 from"node:path";function canonicalWorkspaceIdentity(directory){try{let real=fs19.realpathSync(directory).replace(/\\/g,"/");return process.platform==="win32"?real.toLowerCase():real}catch{return null}}function isStrictTaskId2(value){return/^\d+\.\d+(?:\.\d+)*$/.test(value)}function normalizeScopePath(value){if(typeof value!=="string")return null;let trimmed=value.trim().replace(/\\/g,"/");if(trimmed.length===0||trimmed.includes("\x00")||path33.posix.isAbsolute(trimmed)||/^[A-Za-z]:\//.test(trimmed))return null;let normalized=path33.posix.normalize(trimmed).replace(/^\.\//,"");if(normalized==="."||normalized===".."||normalized.startsWith("../"))return null;return normalized.endsWith("/")?normalized.slice(0,-1):normalized}function normalizeScopeFiles(files){if(!Array.isArray(files)||files.length===0||files.length>1e4)return null;let normalized=new Set;for(let file2 of files){let candidate=normalizeScopePath(file2);if(!candidate)return null;normalized.add(candidate)}return normalized.size>0?[...normalized].sort():null}function bindingKey(binding){return[binding.workspaceIdentity,binding.planStructureHash,binding.taskId,binding.ownerSessionId,binding.ownerMessageId??""].join("\x00")}function createScopeBinding(input){if(!input.ownerSessionId.trim()||!input.ownerMessageId.trim()||!isStrictTaskId2(input.taskId))return null;let workspaceIdentity=canonicalWorkspaceIdentity(input.directory),files=normalizeScopeFiles(input.files);if(!workspaceIdentity||!files)return null;let now=Date.now(),ttlMs=Math.max(1,input.ttlMs??DEFAULT_SCOPE_BINDING_TTL_MS);return{version:2,workspaceIdentity,planId:derivePlanId(input.plan),planStructureHash:computePlanStructureHash(input.plan),taskId:input.taskId,ownerSessionId:input.ownerSessionId,ownerMessageId:input.ownerMessageId,dispatchCallId:input.dispatchCallId,activation:input.activation??(input.dispatchCallId?"pending_child":"declaration"),source:input.source,files,declaredAt:now,expiresAt:now+ttlMs}}function sweepExpired(now=Date.now()){for(let[key,binding]of pendingScopeBindings)if(binding.expiresAt<=now)pendingScopeBindings.delete(key)}function registerScopeBinding(binding){if(sweepExpired(),binding.activation==="declaration"&&binding.dispatchCallId===void 0){for(let[existingKey,existing]of pendingScopeBindings)if(existing.activation==="declaration"&&existing.dispatchCallId===void 0&&existing.workspaceIdentity===binding.workspaceIdentity&&existing.taskId===binding.taskId&&existing.ownerSessionId===binding.ownerSessionId)pendingScopeBindings.delete(existingKey)}let key=bindingKey(binding);pendingScopeBindings.delete(key),pendingScopeBindings.set(key,binding);while(pendingScopeBindings.size>MAX_PENDING_SCOPE_BINDINGS){let oldest=pendingScopeBindings.keys().next().value;if(!oldest)break;pendingScopeBindings.delete(oldest)}}function getScopeBindingForParentDispatch(input){if(sweepExpired(),!input.parentSessionId.trim()||!input.dispatchCallId.trim())return null;let active=[...pendingScopeBindings.values()].filter((binding)=>binding.activation==="active"&&binding.parentOwnerSessionId===input.parentSessionId&&binding.parentCallId===input.dispatchCallId&&binding.dispatchCallId===input.dispatchCallId);if(active.length>1)return null;if(active.length===1)return active[0];let pending=[...pendingScopeBindings.values()].filter((binding)=>binding.activation==="pending_child"&&binding.ownerSessionId===input.parentSessionId&&binding.ownerMessageId===input.dispatchCallId&&binding.dispatchCallId===input.dispatchCallId);return pending.length===1?pending[0]:null}function getScopeBinding(input){sweepExpired();let workspaceIdentity=canonicalWorkspaceIdentity(input.directory);if(!workspaceIdentity||!isStrictTaskId2(input.taskId))return null;let candidates=[...pendingScopeBindings.values()].filter((binding)=>binding.workspaceIdentity===workspaceIdentity&&binding.planStructureHash===computePlanStructureHash(input.plan)&&binding.taskId===input.taskId&&binding.ownerSessionId===input.ownerSessionId&&binding.activation==="declaration"&&binding.dispatchCallId===void 0&&(input.ownerMessageId===void 0||binding.ownerMessageId===input.ownerMessageId));if(candidates.length!==1)return null;let candidate=candidates[0];if(!candidate||candidate.planId!==derivePlanId(input.plan))return null;return candidate}function createPrFeedbackScopeBinding(input){if(!input.ownerSessionId.trim()||!input.ownerMessageId.trim()||!input.workflowSessionId.trim()||!input.workflowRevisionDigest.trim()||!isStrictTaskId2(input.taskId))return null;let workspaceIdentity=canonicalWorkspaceIdentity(input.directory),files=normalizeScopeFiles(input.files);if(!workspaceIdentity||!files)return null;let now=Date.now(),workflowIdentity2=`pr-feedback:${input.workflowSessionId}`;return{version:2,workspaceIdentity,planId:workflowIdentity2,planStructureHash:input.workflowRevisionDigest,taskId:input.taskId,ownerSessionId:input.ownerSessionId,ownerMessageId:input.ownerMessageId,dispatchCallId:input.dispatchCallId,activation:input.activation??(input.dispatchCallId?"pending_child":"declaration"),source:"pr_feedback",files,declaredAt:now,expiresAt:now+DEFAULT_SCOPE_BINDING_TTL_MS,workflowSessionId:input.workflowSessionId,workflowRevisionDigest:input.workflowRevisionDigest}}function getAuthorizedPrFeedbackScopeBinding(input){sweepExpired();let workspaceIdentity=canonicalWorkspaceIdentity(input.directory);if(!workspaceIdentity||!input.activeSessionId.trim())return null;let matches=[...pendingScopeBindings.values()].filter((binding)=>binding.workspaceIdentity===workspaceIdentity&&binding.source==="pr_feedback"&&binding.activation==="active"&&binding.ownerSessionId===input.activeSessionId&&(!input.taskId||binding.taskId===input.taskId)&&typeof binding.dispatchCallId==="string"&&binding.dispatchCallId.length>0&&binding.ownerMessageId===binding.dispatchCallId&&typeof binding.parentOwnerSessionId==="string"&&binding.parentOwnerSessionId.length>0&&binding.ownerSessionId!==binding.parentOwnerSessionId&&binding.parentCallId===binding.dispatchCallId&&typeof binding.workflowSessionId==="string"&&binding.workflowSessionId===binding.parentOwnerSessionId&&typeof binding.workflowRevisionDigest==="string"&&binding.workflowRevisionDigest.length>0&&binding.planId===`pr-feedback:${binding.workflowSessionId}`&&binding.planStructureHash===binding.workflowRevisionDigest);return matches.length===1?matches[0]:null}function getAuthorizedScopeBinding(input){return getAuthorizedScopeBindingByPlanIdentity({directory:input.directory,planId:derivePlanId(input.plan),planStructureHash:computePlanStructureHash(input.plan),taskId:input.taskId,activeSessionId:input.activeSessionId})}function getAuthorizedScopeBindingByPlanIdentity(input){sweepExpired();let workspaceIdentity=canonicalWorkspaceIdentity(input.directory);if(!workspaceIdentity||!isStrictTaskId2(input.taskId))return null;let matches=[...pendingScopeBindings.values()].filter((binding)=>binding.workspaceIdentity===workspaceIdentity&&binding.planId===input.planId&&binding.planStructureHash===input.planStructureHash&&binding.taskId===input.taskId&&binding.ownerSessionId===input.activeSessionId&&binding.activation==="active"&&typeof binding.dispatchCallId==="string"&&binding.dispatchCallId.length>0&&binding.ownerMessageId===binding.dispatchCallId&&typeof binding.parentOwnerSessionId==="string"&&binding.parentOwnerSessionId.length>0&&binding.ownerSessionId!==binding.parentOwnerSessionId&&binding.parentCallId===binding.dispatchCallId);return matches.length===1?matches[0]:null}function clearScopeBindings(predicate){let removed=[];if(!predicate)return removed.push(...pendingScopeBindings.values()),pendingScopeBindings.clear(),removed;for(let[key,binding]of pendingScopeBindings)if(predicate(binding))removed.push(binding),pendingScopeBindings.delete(key);return removed}function claimScopeBindingForChild(input){sweepExpired();let workspaceIdentity=canonicalWorkspaceIdentity(input.directory);if(!workspaceIdentity||!input.parentSessionId.trim()||!input.childSessionId.trim()||!input.dispatchCallId.trim()||input.parentSessionId===input.childSessionId)return null;let matches=[...pendingScopeBindings.values()].filter((binding)=>binding.workspaceIdentity===workspaceIdentity&&binding.ownerSessionId===input.parentSessionId&&binding.activation==="pending_child"&&binding.ownerMessageId===input.dispatchCallId&&binding.dispatchCallId===input.dispatchCallId);if(matches.length!==1)return null;let previous=matches[0];pendingScopeBindings.delete(bindingKey(previous));let claimed={...previous,ownerSessionId:input.childSessionId,parentOwnerSessionId:input.parentSessionId,parentCallId:previous.dispatchCallId,activation:"active"};return registerScopeBinding(claimed),{previous,claimed}}function deriveChildScopeBinding(parent,input){let workspaceIdentity=canonicalWorkspaceIdentity(input.childDirectory);if(!workspaceIdentity||!input.childSessionId.trim()||!input.parentCallId.trim())throw Error("Cannot derive child scope binding without verified identity");let now=Date.now();return{...parent,workspaceIdentity,ownerSessionId:input.childSessionId,ownerMessageId:input.parentCallId,dispatchCallId:input.parentCallId,activation:"active",parentOwnerSessionId:parent.ownerSessionId,parentCallId:input.parentCallId,source:"worktree_derived",declaredAt:now,expiresAt:Math.min(parent.expiresAt,now+DEFAULT_SCOPE_BINDING_TTL_MS)}}function scopeContains(scope,candidate){return scope.some((entry)=>candidate===entry||candidate.startsWith(`${entry}/`))}function isSubset(candidate,authority){return candidate.every((file2)=>scopeContains(authority,file2))}function resolveCoderScopeSources(input){let explicit=input.explicitFiles&&input.explicitFiles.length>0?normalizeScopeFiles(input.explicitFiles):null,plan=input.planFiles&&input.planFiles.length>0?normalizeScopeFiles(input.planFiles):null,directives=input.fileDirectiveFiles&&input.fileDirectiveFiles.length>0?normalizeScopeFiles(input.fileDirectiveFiles):null;if(input.explicitFiles&&input.explicitFiles.length>0&&!explicit)return{ok:!1,code:"SCOPE_NOT_DECLARED"};if(input.planFiles&&input.planFiles.length>0&&!plan)return{ok:!1,code:"SCOPE_NOT_DECLARED"};if(input.fileDirectiveFiles&&input.fileDirectiveFiles.length>0&&!directives)return{ok:!1,code:"SCOPE_NOT_DECLARED"};if(explicit){if(plan&&!isSubset(plan,explicit)||directives&&!isSubset(directives,explicit))return{ok:!1,code:"SCOPE_CONFLICT"};return{ok:!0,files:explicit,source:"declare_scope"}}if(plan){if(directives&&!isSubset(directives,plan))return{ok:!1,code:"SCOPE_CONFLICT"};return{ok:!0,files:plan,source:"plan"}}if(directives)return{ok:!0,files:directives,source:"file_directive"};return{ok:!1,code:"SCOPE_NOT_DECLARED"}}var MAX_PENDING_SCOPE_BINDINGS=256,DEFAULT_SCOPE_BINDING_TTL_MS=3600000,pendingScopeBindings;var init_scope_binding=__esm(()=>{init_ledger();init_utils3();pendingScopeBindings=new Map});var exports_scope_persistence={};__export(exports_scope_persistence,{writeScopeToDisk:()=>writeScopeToDisk,writeScopeBindingToDisk:()=>writeScopeBindingToDisk,resolveScopeWithFallbacks:()=>resolveScopeWithFallbacks,resolveAuthorizedScopeBindingForSession:()=>resolveAuthorizedScopeBindingForSession,resolveAuthorizedScopeBinding:()=>resolveAuthorizedScopeBinding,resolveAuthorizedPrFeedbackScopeBindingFromDisk:()=>resolveAuthorizedPrFeedbackScopeBindingFromDisk,readScopeFromDisk:()=>readScopeFromDisk,readScopeBindingFromDisk:()=>readScopeBindingFromDisk,readPlanScope:()=>readPlanScope,clearScopeForTask:()=>clearScopeForTask,clearScopeBindingFromDisk:()=>clearScopeBindingFromDisk,clearAllScopes:()=>clearAllScopes});import{createHash as createHash12}from"node:crypto";import*as fs20 from"node:fs";import*as path34 from"node:path";function getScopesDir(directory){return path34.join(directory,SCOPES_DIR)}function normalizePathForComparison(value){let normalized=path34.resolve(value);return process.platform==="win32"?normalized.toLowerCase():normalized}function isSafeTaskId(taskId){if(typeof taskId!=="string")return!1;if(!/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/.test(taskId))return!1;let head=taskId.replace(/\.+$/,"").split(".")[0].toUpperCase();if(WINDOWS_RESERVED.has(head))return!1;return!0}function isScopesDirSafe(directory,scopesDir){try{let resolvedWorkspace=fs20.realpathSync(directory),expectedSwarmDir=path34.join(resolvedWorkspace,".swarm"),expectedScopesDir=path34.join(expectedSwarmDir,"scopes"),swarmStat=fs20.lstatSync(expectedSwarmDir),scopesStat=fs20.lstatSync(expectedScopesDir);if(!swarmStat.isDirectory()||swarmStat.isSymbolicLink()||!scopesStat.isDirectory()||scopesStat.isSymbolicLink())return!1;let resolvedScopes=fs20.realpathSync(scopesDir);if(normalizePathForComparison(resolvedScopes)!==normalizePathForComparison(expectedScopesDir))return!1;let rel=path34.relative(resolvedWorkspace,resolvedScopes);return rel.length>0&&!rel.startsWith("..")&&!path34.isAbsolute(rel)}catch{return!1}}function resolveSafeScopeFileForUnlink(directory,targetPath){try{let resolvedWorkspace=fs20.realpathSync(directory),scopesDir=path34.join(resolvedWorkspace,SCOPES_DIR);if(!isScopesDirSafe(resolvedWorkspace,scopesDir))return null;let candidate=path34.resolve(targetPath),resolvedCandidate=fs20.realpathSync(candidate);if(normalizePathForComparison(path34.dirname(candidate))!==normalizePathForComparison(scopesDir)||normalizePathForComparison(resolvedCandidate)!==normalizePathForComparison(candidate))return null;let relative9=path34.relative(resolvedWorkspace,resolvedCandidate);if(relative9.length===0||relative9===".."||relative9.startsWith(`..${path34.sep}`)||path34.isAbsolute(relative9))return null;let leafStat=fs20.lstatSync(candidate);if(!leafStat.isFile()||leafStat.isSymbolicLink())return null;if(!isScopesDirSafe(resolvedWorkspace,scopesDir))return null;let finalResolvedCandidate=fs20.realpathSync(candidate),finalLeafStat=fs20.lstatSync(candidate);if(normalizePathForComparison(finalResolvedCandidate)!==normalizePathForComparison(candidate)||!finalLeafStat.isFile()||finalLeafStat.isSymbolicLink()||finalLeafStat.dev!==leafStat.dev||finalLeafStat.ino!==leafStat.ino)return null;return candidate}catch{return null}}function getScopeFilePath(directory,taskId){if(!isSafeTaskId(taskId))throw Error(`Invalid taskId for scope persistence: ${taskId}`);return path34.join(getScopesDir(directory),`scope-${taskId}.json`)}function getBindingFilePath(directory,taskId,ownerSessionId){if(!isSafeTaskId(taskId)||!ownerSessionId.trim())throw Error("Invalid identity for scope binding persistence");let ownerHash=createHash12("sha256").update(ownerSessionId).digest("hex").slice(0,24);return path34.join(getScopesDir(directory),`binding-${taskId}-${ownerHash}.json`)}async function writeScopeToDisk(directory,taskId,files,ttlMs=DEFAULT_TTL_MS){if(!isSafeTaskId(taskId))return;if(!Array.isArray(files)||files.length===0)return;if(files.length>MAX_FILES_PER_SCOPE)return;let scopesDir=getScopesDir(directory),scopePath=getScopeFilePath(directory,taskId);try{fs20.mkdirSync(scopesDir,{recursive:!0})}catch{return}if(!isScopesDirSafe(directory,scopesDir))return;let now=Date.now(),payload={version:SCOPE_SCHEMA_VERSION,taskId,declaredAt:now,expiresAt:now+ttlMs,files:[...files]},content=JSON.stringify(payload,null,2);try{let flags=fs20.constants.O_WRONLY|fs20.constants.O_CREAT,nofollow=fs20.constants.O_NOFOLLOW??0,fd=fs20.openSync(scopePath,flags|nofollow);fs20.closeSync(fd)}catch{return}let release;try{release=await import_proper_lockfile2.default.lock(scopePath,{stale:LOCK_STALE_MS,retries:{retries:3,minTimeout:50,maxTimeout:200},realpath:!1}),await atomicWrite(scopePath,content)}catch{}finally{if(release)try{await release()}catch{}}}async function writeScopeBindingToDisk(directory,binding){if(!isSafeTaskId(binding.taskId)||binding.version!==2)return;let workspaceIdentity=canonicalWorkspaceIdentity(directory),files=normalizeScopeFiles(binding.files);if(!workspaceIdentity||workspaceIdentity!==binding.workspaceIdentity||!files||!binding.ownerSessionId||!binding.ownerMessageId||binding.expiresAt<=Date.now())return;let scopesDir=getScopesDir(directory),scopePath=getBindingFilePath(directory,binding.taskId,binding.ownerSessionId);try{fs20.mkdirSync(scopesDir,{recursive:!0})}catch{return}if(!isScopesDirSafe(directory,scopesDir))return;let content=JSON.stringify({...binding,files},null,2);try{let flags=fs20.constants.O_WRONLY|fs20.constants.O_CREAT,nofollow=fs20.constants.O_NOFOLLOW??0,fd=fs20.openSync(scopePath,flags|nofollow);fs20.closeSync(fd)}catch{return}let release;try{release=await import_proper_lockfile2.default.lock(scopePath,{stale:LOCK_STALE_MS,retries:{retries:3,minTimeout:50,maxTimeout:200},realpath:!1}),await atomicWrite(scopePath,content)}catch{}finally{if(release)try{await release()}catch{}}}function readScopeBindingFromDisk(input){if(!isSafeTaskId(input.taskId))return null;let scopesDir=getScopesDir(input.directory);if(!isScopesDirSafe(input.directory,scopesDir))return null;let scopePath;try{scopePath=getBindingFilePath(input.directory,input.taskId,input.ownerSessionId)}catch{return null}let nofollow=fs20.constants.O_NOFOLLOW??0,fd;try{fd=fs20.openSync(scopePath,fs20.constants.O_RDONLY|nofollow)}catch{return null}let raw="";try{let stat7=fs20.fstatSync(fd);if(!stat7.isFile()||stat7.size>MAX_SCOPE_BYTES)return null;let buffer=Buffer.alloc(stat7.size);fs20.readSync(fd,buffer,0,stat7.size,0),raw=buffer.toString("utf8")}catch{return null}finally{try{fs20.closeSync(fd)}catch{}}let parsed;try{parsed=JSON.parse(raw)}catch{return null}let now=Date.now(),workspaceIdentity=canonicalWorkspaceIdentity(input.directory),files=Array.isArray(parsed.files)?normalizeScopeFiles(parsed.files.filter((file2)=>typeof file2==="string")):null;if(parsed.version!==2||parsed.taskId!==input.taskId||!workspaceIdentity||parsed.workspaceIdentity!==workspaceIdentity||parsed.planId!==derivePlanId(input.plan)||parsed.planStructureHash!==computePlanStructureHash(input.plan)||typeof parsed.declaredAt!=="number"||parsed.declaredAt>now||typeof parsed.expiresAt!=="number"||parsed.expiresAt<=now||!parsed.ownerSessionId||!parsed.ownerMessageId||!parsed.source||!files||parsed.ownerSessionId!==input.ownerSessionId||input.requireDispatchCorrelation===!0&&(typeof parsed.dispatchCallId!=="string"||parsed.dispatchCallId.length===0||parsed.activation!=="active"||parsed.ownerMessageId!==parsed.dispatchCallId||typeof parsed.parentOwnerSessionId!=="string"||parsed.parentOwnerSessionId.length===0||parsed.ownerSessionId===parsed.parentOwnerSessionId||parsed.parentCallId!==parsed.dispatchCallId)||input.requireDeclaration===!0&&(parsed.activation!=="declaration"||parsed.dispatchCallId!==void 0)||input.parentCallId!==void 0&&parsed.parentCallId!==input.parentCallId)return null;return{...parsed,files}}function clearScopeBindingFromDisk(input){try{let resolvedWorkspace=fs20.realpathSync(input.directory),scopePath=getBindingFilePath(resolvedWorkspace,input.taskId,input.ownerSessionId),safePath=resolveSafeScopeFileForUnlink(resolvedWorkspace,scopePath);if(!safePath)return;fs20.unlinkSync(safePath)}catch{}}function readCurrentPlan(directory){try{let planPath=path34.join(directory,".swarm","plan.json"),stat7=fs20.statSync(planPath);if(!stat7.isFile()||stat7.size>MAX_PLAN_BYTES)return null;let parsed=PlanSchema.safeParse(JSON.parse(fs20.readFileSync(planPath,"utf8")));return parsed.success?parsed.data:null}catch{return null}}function resolveAuthorizedScopeBindingForPlan(input){let inMemory=getAuthorizedScopeBinding(input);if(inMemory)return inMemory;let durable=readScopeBindingFromDisk({directory:input.directory,taskId:input.taskId,plan:input.plan,ownerSessionId:input.activeSessionId,requireDispatchCorrelation:!0});if(durable)registerScopeBinding(durable);return durable}function resolveAuthorizedScopeBinding(input){let plan=readCurrentPlan(input.directory);return plan?resolveAuthorizedScopeBindingForPlan({...input,plan}):null}function resolveAuthorizedScopeBindingForSession(input){let plan=readCurrentPlan(input.directory);if(!plan)return null;let matches=[];for(let task of plan.phases.flatMap((phase)=>phase.tasks)){let binding=resolveAuthorizedScopeBindingForPlan({directory:input.directory,plan,taskId:task.id,activeSessionId:input.activeSessionId});if(binding)matches.push(binding);if(matches.length>1)return null}return matches[0]??null}function readPrFeedbackBindingFile(directory,filePath,activeSessionId,taskId){try{let leaf=fs20.lstatSync(filePath);if(!leaf.isFile()||leaf.isSymbolicLink())return null;if(normalizePathForComparison(fs20.realpathSync(filePath))!==normalizePathForComparison(filePath))return null}catch{return null}let nofollow=fs20.constants.O_NOFOLLOW??0,fd;try{fd=fs20.openSync(filePath,fs20.constants.O_RDONLY|nofollow)}catch{return null}let raw="";try{let stat7=fs20.fstatSync(fd);if(!stat7.isFile()||stat7.size>MAX_SCOPE_BYTES)return null;let buffer=Buffer.alloc(stat7.size);fs20.readSync(fd,buffer,0,stat7.size,0),raw=buffer.toString("utf8")}catch{return null}finally{try{fs20.closeSync(fd)}catch{}}let parsed;try{parsed=JSON.parse(raw)}catch{return null}let workspaceIdentity=canonicalWorkspaceIdentity(directory),files=Array.isArray(parsed.files)?normalizeScopeFiles(parsed.files.filter((file2)=>typeof file2==="string")):null,now=Date.now();if(parsed.version!==2||parsed.source!=="pr_feedback"||!workspaceIdentity||parsed.workspaceIdentity!==workspaceIdentity||!isSafeTaskId(parsed.taskId??"")||taskId!==void 0&&parsed.taskId!==taskId||parsed.ownerSessionId!==activeSessionId||parsed.activation!=="active"||typeof parsed.dispatchCallId!=="string"||!parsed.dispatchCallId||parsed.ownerMessageId!==parsed.dispatchCallId||typeof parsed.parentOwnerSessionId!=="string"||!parsed.parentOwnerSessionId||parsed.ownerSessionId===parsed.parentOwnerSessionId||parsed.parentCallId!==parsed.dispatchCallId||parsed.workflowSessionId!==parsed.parentOwnerSessionId||typeof parsed.workflowRevisionDigest!=="string"||!parsed.workflowRevisionDigest||parsed.planId!==`pr-feedback:${parsed.workflowSessionId}`||parsed.planStructureHash!==parsed.workflowRevisionDigest||typeof parsed.declaredAt!=="number"||parsed.declaredAt>now||typeof parsed.expiresAt!=="number"||parsed.expiresAt<=now||!files)return null;let expectedPath=getBindingFilePath(directory,parsed.taskId,activeSessionId);if(normalizePathForComparison(expectedPath)!==normalizePathForComparison(filePath))return null;return{...parsed,files}}function resolveAuthorizedPrFeedbackScopeBindingFromDisk(input){if(!input.activeSessionId.trim())return null;let scopesDir=getScopesDir(input.directory);if(!isScopesDirSafe(input.directory,scopesDir))return null;let candidates;if(input.taskId){if(!isSafeTaskId(input.taskId))return null;candidates=[getBindingFilePath(input.directory,input.taskId,input.activeSessionId)]}else try{let names=fs20.readdirSync(scopesDir);if(names.length>MAX_BINDING_FILES_TO_SCAN)return null;candidates=names.filter((name)=>name.startsWith("binding-")&&name.endsWith(".json")).map((name)=>path34.join(scopesDir,name))}catch{return null}let matches=candidates.map((candidate)=>readPrFeedbackBindingFile(input.directory,candidate,input.activeSessionId,input.taskId)).filter((binding)=>binding!==null);if(matches.length!==1)return null;return registerScopeBinding(matches[0]),matches[0]}async function atomicWrite(targetPath,content){let tempPath=`${targetPath}.tmp.${Date.now()}.${Math.floor(Math.random()*1e9)}`;try{await bunWrite(tempPath,content),fs20.renameSync(tempPath,targetPath)}finally{try{fs20.unlinkSync(tempPath)}catch{}}}function readScopeFromDisk(directory,taskId){if(!isSafeTaskId(taskId))return null;let scopesDir=getScopesDir(directory);if(!isScopesDirSafe(directory,scopesDir))return null;let scopePath=getScopeFilePath(directory,taskId),nofollow=fs20.constants.O_NOFOLLOW??0,fd;try{fd=fs20.openSync(scopePath,fs20.constants.O_RDONLY|nofollow)}catch{return null}let raw;try{let stat7=fs20.fstatSync(fd);if(!stat7.isFile())return null;if(stat7.size>MAX_SCOPE_BYTES)return null;let buf=Buffer.alloc(stat7.size);fs20.readSync(fd,buf,0,stat7.size,0),raw=buf.toString("utf-8")}catch{return null}finally{try{fs20.closeSync(fd)}catch{}}if(!raw.trim())return null;let parsed;try{parsed=JSON.parse(raw)}catch{return null}if(parsed.version!==SCOPE_SCHEMA_VERSION)return null;if(parsed.taskId!==taskId)return null;let now=Date.now();if(typeof parsed.declaredAt!=="number"||parsed.declaredAt>now)return null;if(typeof parsed.expiresAt!=="number"||now>=parsed.expiresAt)return null;if(!Array.isArray(parsed.files))return null;if(parsed.files.length>MAX_FILES_PER_SCOPE)return null;let files=parsed.files.filter((f)=>typeof f==="string");return files.length>0?files:null}function readPlanScope(directory,taskId){if(!isSafeTaskId(taskId))return null;try{let planPath=path34.join(directory,".swarm","plan.json"),stat7=fs20.statSync(planPath);if(!stat7.isFile())return null;if(stat7.size>MAX_PLAN_BYTES)return null;let raw=fs20.readFileSync(planPath,"utf-8"),plan=JSON.parse(raw);for(let phase of plan.phases??[])for(let task of phase.tasks??[]){if(task.id!==taskId)continue;let ft=task.files_touched;if(Array.isArray(ft)&&ft.length>0){if(ft.length>MAX_FILES_PER_SCOPE)return null;return ft.filter((f)=>typeof f==="string")}if(typeof ft==="string"&&ft.length>0)return[ft];return null}return null}catch{return null}}function clearScopeForTask(directory,taskId){if(!isSafeTaskId(taskId))return;try{fs20.unlinkSync(getScopeFilePath(directory,taskId))}catch{}}function clearAllScopes(directory){try{fs20.rmSync(getScopesDir(directory),{recursive:!0,force:!0})}catch{}}function resolveScopeWithFallbacks(input){let{directory,taskId,inMemoryScope,pendingMapScope}=input;if(inMemoryScope&&inMemoryScope.length>0)return inMemoryScope;if(taskId){let disk=readScopeFromDisk(directory,taskId);if(disk&&disk.length>0)return disk;let plan=readPlanScope(directory,taskId);if(plan&&plan.length>0)return plan}if(pendingMapScope&&pendingMapScope.length>0)return pendingMapScope;return null}var import_proper_lockfile2,SCOPE_SCHEMA_VERSION=1,DEFAULT_TTL_MS=86400000,LOCK_STALE_MS=30000,SCOPES_DIR=".swarm/scopes",MAX_FILES_PER_SCOPE=1e4,MAX_PLAN_BYTES=10485760,MAX_SCOPE_BYTES=2097152,MAX_BINDING_FILES_TO_SCAN=1e4,WINDOWS_RESERVED;var init_scope_persistence=__esm(()=>{init_plan_schema();init_ledger();init_utils3();init_bun_compat();init_scope_binding();import_proper_lockfile2=__toESM(require_proper_lockfile(),1),WINDOWS_RESERVED=new Set(["CON","PRN","AUX","NUL","COM1","COM2","COM3","COM4","COM5","COM6","COM7","COM8","COM9","LPT1","LPT2","LPT3","LPT4","LPT5","LPT6","LPT7","LPT8","LPT9"])});function pathMatches(scopePath,cochangePath){if(scopePath===cochangePath)return!0;return scopePath.endsWith(`/${cochangePath}`)}function epicPairConflict(scopeA,scopeB,cochangePairs,threshold){let normA=scopeA.map(normalizePath),normB=scopeB.map(normalizePath),pathPairs=[];for(let a of normA)for(let b of normB)if(pathsConflict(a,b))pathPairs.push([a,b]);let pathConflict=pathPairs.length>0,activePairs=cochangePairs.filter((e)=>e.coChangeCount>=threshold.minCoChanges&&e.npmi>=threshold.npmi),cochangeMatches=[];for(let entry of activePairs){let{fileA:fa,fileB:fb}=entry,aTouchesFa=normA.some((p)=>pathMatches(p,fa)),aTouchesFb=normA.some((p)=>pathMatches(p,fb)),bTouchesFa=normB.some((p)=>pathMatches(p,fa)),bTouchesFb=normB.some((p)=>pathMatches(p,fb));if(aTouchesFa&&!aTouchesFb&&(bTouchesFb&&!bTouchesFa)||aTouchesFb&&!aTouchesFa&&(bTouchesFa&&!bTouchesFb))cochangeMatches.push({a:fa,b:fb,npmi:entry.npmi,coChangeCount:entry.coChangeCount})}let cochangeConflict=cochangeMatches.length>0,reason;if(pathConflict&&cochangeConflict)reason="both";else if(pathConflict)reason="path";else if(cochangeConflict)reason="cochange";else reason="none";return{conflict:pathConflict||cochangeConflict,reason,evidence:{pathPairs,cochangePairs:cochangeMatches}}}var init_cochange_conflict=__esm(()=>{init_conflicts()});function resolveScope(directory,taskId){let raw=readScopeFromDisk(directory,taskId);if(raw===null)return{files:[],ok:!1};if(raw.length===0)return{files:[],ok:!1};return{files:raw,ok:!0}}function computeParallelVerdict(directory,taskIds,options){if(taskIds.length>MAX_PARALLEL_VERDICT_TASKS)throw RangeError(`Parallel verdict supports at most ${MAX_PARALLEL_VERDICT_TASKS} tasks`);let useCochange=options?.useCochange===!0&&Array.isArray(options?.cochangePairs),threshold=options?.cochangeThreshold??DEFAULT_PARALLEL_COCHANGE_THRESHOLD,cochangePairs=useCochange?options.cochangePairs:[],resolved=new Map,unknownScopeTasks=[];for(let id of taskIds){let r=resolveScope(directory,id);if(resolved.set(id,r),!r.ok)unknownScopeTasks.push(id)}let pairs=[],inDegree=new Map,adj=new Map;for(let id of taskIds)inDegree.set(id,0),adj.set(id,[]);for(let i=0;i<taskIds.length;i++)for(let j=i+1;j<taskIds.length;j++){let a=taskIds[i],b=taskIds[j],ra=resolved.get(a),rb=resolved.get(b),pairVerdict,evidence2;if(!ra.ok||!rb.ok)pairVerdict="unknown",evidence2=[];else{let ev=epicPairConflict(ra.files,rb.files,cochangePairs,threshold);if(ev.conflict){if(pairVerdict="conflict",evidence2=formatEvidence(ev),!adj.get(a).includes(b))adj.get(a).push(b),inDegree.set(b,(inDegree.get(b)??0)+1)}else pairVerdict="disjoint",evidence2=[]}pairs.push({a,b,verdict:pairVerdict,evidence:evidence2})}let suggestedSerialOrder=topoSort(taskIds,adj,inDegree),verdict;if(unknownScopeTasks.length>0)verdict="unknown_scopes";else if(pairs.some((p)=>p.verdict==="conflict"))verdict="conflicts_present";else verdict="all_disjoint";return{verdict,pairs,suggestedSerialOrder,unknownScopeTasks}}function formatEvidence(ev){let lines=[];for(let[pa,pb]of ev.evidence.pathPairs)lines.push(`path overlap: ${pa} ↔ ${pb}`);for(let cc of ev.evidence.cochangePairs)lines.push(`co-change: ${cc.a} ↔ ${cc.b} (npmi=${cc.npmi.toFixed(3)}, coChanges=${cc.coChangeCount})`);return lines}function topoSort(taskIds,adj,inDegree){let deg=new Map(inDegree),order=[],queue=[...taskIds.filter((id)=>(deg.get(id)??0)===0)];while(queue.length>0){let cur=queue.shift();order.push(cur);for(let next of adj.get(cur)??[])if(deg.set(next,(deg.get(next)??0)-1),(deg.get(next)??0)===0)queue.push(next);queue.sort((x,y)=>taskIds.indexOf(x)-taskIds.indexOf(y))}if(order.length<taskIds.length){for(let id of taskIds)if(!order.includes(id))order.push(id)}return order}var DEFAULT_PARALLEL_COCHANGE_THRESHOLD,MAX_PARALLEL_VERDICT_TASKS=64;var init_parallel_verdict=__esm(()=>{init_scope_persistence();init_cochange_conflict();init_conflicts();DEFAULT_PARALLEL_COCHANGE_THRESHOLD={npmi:0.2,minCoChanges:3}});function normalizeMessage(message){return message.replace(/\s+/g," ").trim().toLowerCase()}function pushAdvisory(session,message,opts){if(!message?.trim())return!1;if(session.pendingAdvisoryMessages??=[],opts?.dedupeKey){let key=opts.dedupeKey;if(session.pendingAdvisoryMessages.some((m)=>m.includes(key)))return!1}else if(session.pendingAdvisoryMessages.some((m)=>normalizeMessage(m)===normalizeMessage(message)))return!1;let cap=Math.max(1,opts?.maxPending??25);while(session.pendingAdvisoryMessages.length>=cap)session.pendingAdvisoryMessages.shift();return session.pendingAdvisoryMessages.push(message),!0}var exports_core3={};__export(exports_core3,{writeLaneProfileToDiskReal:()=>writeLaneProfileToDiskReal,shortenWorktreePath:()=>shortenWorktreePath,resolveWorktreeBaseDir:()=>resolveWorktreeBaseDir,removeWorktree:()=>removeWorktree,removeLaneProfileFromDiskReal:()=>removeLaneProfileFromDiskReal,provisionWorktree:()=>provisionWorktree,makeWorktreeBranchName:()=>makeWorktreeBranchName,isPathUnderSwarmWorktreeBase:()=>isPathUnderSwarmWorktreeBase,isCleanWorktree:()=>isCleanWorktree,cleanUntrackedFiles:()=>cleanUntrackedFiles,checkPathBudget:()=>checkPathBudget,autoCommitDirty:()=>autoCommitDirty,assertCleanWorkingTree:()=>assertCleanWorkingTree,_internals:()=>_internals24});import*as fs21 from"node:fs";import*as fsPromises5 from"node:fs/promises";import*as os9 from"node:os";import*as path35 from"node:path";async function writeLaneProfileToDiskReal(worktreePath,laneIndex,envOverrides){let lines=[];for(let[key,value]of Object.entries(envOverrides)){if(value===null)continue;if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key))continue;if(value.includes(`
358
+ `).length,estimatedChanges=Math.min(lines/10,50);astChangeCount+=estimatedChanges;let fileComplexity=fileFunctionCount+lines/100;maxFileComplexity=Math.max(maxFileComplexity,fileComplexity)}catch{}}return{fileCount:changedFiles.length,functionCount,astChangeCount:Math.round(astChangeCount),maxFileComplexity:Math.round(maxFileComplexity*10)/10}}function routeReview(metrics){if(metrics.fileCount>=5||metrics.functionCount>=10||metrics.astChangeCount>=30||metrics.maxFileComplexity>=15)return{reviewerCount:2,testEngineerCount:2,depth:"double",reason:`High complexity: ${metrics.fileCount} files, ${metrics.functionCount} functions, complexity score ${metrics.maxFileComplexity}`};return{reviewerCount:1,testEngineerCount:1,depth:"single",reason:`Standard complexity: ${metrics.fileCount} files, ${metrics.functionCount} functions`}}async function routeReviewForChanges(directory,changedFiles){let metrics=await computeComplexity(directory,changedFiles);return routeReview(metrics)}function shouldParallelizeReview(routing){return routing.depth==="double"}import*as fs19 from"node:fs";import*as path33 from"node:path";function canonicalWorkspaceIdentity(directory){try{let real=fs19.realpathSync(directory).replace(/\\/g,"/");return process.platform==="win32"?real.toLowerCase():real}catch{return null}}function isStrictTaskId2(value){return/^\d+\.\d+(?:\.\d+)*$/.test(value)}function normalizeScopePath(value){if(typeof value!=="string")return null;let trimmed=value.trim().replace(/\\/g,"/");if(trimmed.length===0||trimmed.includes("\x00")||path33.posix.isAbsolute(trimmed)||/^[A-Za-z]:\//.test(trimmed))return null;let normalized=path33.posix.normalize(trimmed).replace(/^\.\//,"");if(normalized==="."||normalized===".."||normalized.startsWith("../"))return null;return normalized.endsWith("/")?normalized.slice(0,-1):normalized}function normalizeScopeFiles(files){if(!Array.isArray(files)||files.length===0||files.length>1e4)return null;let normalized=new Set;for(let file2 of files){let candidate=normalizeScopePath(file2);if(!candidate)return null;normalized.add(candidate)}return normalized.size>0?[...normalized].sort():null}function bindingKey(binding){return[binding.workspaceIdentity,binding.planStructureHash,binding.taskId,binding.ownerSessionId,binding.ownerMessageId??""].join("\x00")}function createScopeBinding(input){if(!input.ownerSessionId.trim()||!input.ownerMessageId.trim()||!isStrictTaskId2(input.taskId))return null;let workspaceIdentity=canonicalWorkspaceIdentity(input.directory),files=normalizeScopeFiles(input.files);if(!workspaceIdentity||!files)return null;let now=Date.now(),ttlMs=Math.max(1,input.ttlMs??DEFAULT_SCOPE_BINDING_TTL_MS);return{version:2,workspaceIdentity,planId:derivePlanId(input.plan),planStructureHash:computePlanStructureHash(input.plan),taskId:input.taskId,ownerSessionId:input.ownerSessionId,ownerMessageId:input.ownerMessageId,dispatchCallId:input.dispatchCallId,activation:input.activation??(input.dispatchCallId?"pending_child":"declaration"),source:input.source,files,declaredAt:now,expiresAt:now+ttlMs}}function sweepExpired(now=Date.now()){for(let[key,binding]of pendingScopeBindings)if(binding.expiresAt<=now)pendingScopeBindings.delete(key)}function registerScopeBinding(binding){if(sweepExpired(),binding.activation==="declaration"&&binding.dispatchCallId===void 0){for(let[existingKey,existing]of pendingScopeBindings)if(existing.activation==="declaration"&&existing.dispatchCallId===void 0&&existing.workspaceIdentity===binding.workspaceIdentity&&existing.taskId===binding.taskId&&existing.ownerSessionId===binding.ownerSessionId)pendingScopeBindings.delete(existingKey)}let key=bindingKey(binding);pendingScopeBindings.delete(key),pendingScopeBindings.set(key,binding);while(pendingScopeBindings.size>MAX_PENDING_SCOPE_BINDINGS){let oldest=pendingScopeBindings.keys().next().value;if(!oldest)break;pendingScopeBindings.delete(oldest)}}function getScopeBindingForParentDispatch(input){if(sweepExpired(),!input.parentSessionId.trim()||!input.dispatchCallId.trim())return null;let active=[...pendingScopeBindings.values()].filter((binding)=>binding.activation==="active"&&binding.parentOwnerSessionId===input.parentSessionId&&binding.parentCallId===input.dispatchCallId&&binding.dispatchCallId===input.dispatchCallId);if(active.length>1)return null;if(active.length===1)return active[0];let pending=[...pendingScopeBindings.values()].filter((binding)=>binding.activation==="pending_child"&&binding.ownerSessionId===input.parentSessionId&&binding.ownerMessageId===input.dispatchCallId&&binding.dispatchCallId===input.dispatchCallId);return pending.length===1?pending[0]:null}function getScopeBinding(input){sweepExpired();let workspaceIdentity=canonicalWorkspaceIdentity(input.directory);if(!workspaceIdentity||!isStrictTaskId2(input.taskId))return null;let candidates=[...pendingScopeBindings.values()].filter((binding)=>binding.workspaceIdentity===workspaceIdentity&&binding.planStructureHash===computePlanStructureHash(input.plan)&&binding.taskId===input.taskId&&binding.ownerSessionId===input.ownerSessionId&&binding.activation==="declaration"&&binding.dispatchCallId===void 0&&(input.ownerMessageId===void 0||binding.ownerMessageId===input.ownerMessageId));if(candidates.length!==1)return null;let candidate=candidates[0];if(!candidate||candidate.planId!==derivePlanId(input.plan))return null;return candidate}function createPrFeedbackScopeBinding(input){if(!input.ownerSessionId.trim()||!input.ownerMessageId.trim()||!input.workflowSessionId.trim()||!input.workflowRevisionDigest.trim()||!isStrictTaskId2(input.taskId))return null;let workspaceIdentity=canonicalWorkspaceIdentity(input.directory),files=normalizeScopeFiles(input.files);if(!workspaceIdentity||!files)return null;let now=Date.now(),workflowIdentity2=`pr-feedback:${input.workflowSessionId}`;return{version:2,workspaceIdentity,planId:workflowIdentity2,planStructureHash:input.workflowRevisionDigest,taskId:input.taskId,ownerSessionId:input.ownerSessionId,ownerMessageId:input.ownerMessageId,dispatchCallId:input.dispatchCallId,activation:input.activation??(input.dispatchCallId?"pending_child":"declaration"),source:"pr_feedback",files,declaredAt:now,expiresAt:now+DEFAULT_SCOPE_BINDING_TTL_MS,workflowSessionId:input.workflowSessionId,workflowRevisionDigest:input.workflowRevisionDigest}}function getAuthorizedPrFeedbackScopeBinding(input){sweepExpired();let workspaceIdentity=canonicalWorkspaceIdentity(input.directory);if(!workspaceIdentity||!input.activeSessionId.trim())return null;let matches=[...pendingScopeBindings.values()].filter((binding)=>binding.workspaceIdentity===workspaceIdentity&&binding.source==="pr_feedback"&&binding.activation==="active"&&binding.ownerSessionId===input.activeSessionId&&(!input.taskId||binding.taskId===input.taskId)&&typeof binding.dispatchCallId==="string"&&binding.dispatchCallId.length>0&&binding.ownerMessageId===binding.dispatchCallId&&typeof binding.parentOwnerSessionId==="string"&&binding.parentOwnerSessionId.length>0&&binding.ownerSessionId!==binding.parentOwnerSessionId&&binding.parentCallId===binding.dispatchCallId&&typeof binding.workflowSessionId==="string"&&binding.workflowSessionId===binding.parentOwnerSessionId&&typeof binding.workflowRevisionDigest==="string"&&binding.workflowRevisionDigest.length>0&&binding.planId===`pr-feedback:${binding.workflowSessionId}`&&binding.planStructureHash===binding.workflowRevisionDigest);return matches.length===1?matches[0]:null}function getAuthorizedScopeBinding(input){return getAuthorizedScopeBindingByPlanIdentity({directory:input.directory,planId:derivePlanId(input.plan),planStructureHash:computePlanStructureHash(input.plan),taskId:input.taskId,activeSessionId:input.activeSessionId})}function getAuthorizedScopeBindingByPlanIdentity(input){sweepExpired();let workspaceIdentity=canonicalWorkspaceIdentity(input.directory);if(!workspaceIdentity||!isStrictTaskId2(input.taskId))return null;let matches=[...pendingScopeBindings.values()].filter((binding)=>binding.workspaceIdentity===workspaceIdentity&&binding.planId===input.planId&&binding.planStructureHash===input.planStructureHash&&binding.taskId===input.taskId&&binding.ownerSessionId===input.activeSessionId&&binding.activation==="active"&&typeof binding.dispatchCallId==="string"&&binding.dispatchCallId.length>0&&binding.ownerMessageId===binding.dispatchCallId&&typeof binding.parentOwnerSessionId==="string"&&binding.parentOwnerSessionId.length>0&&binding.ownerSessionId!==binding.parentOwnerSessionId&&binding.parentCallId===binding.dispatchCallId);return matches.length===1?matches[0]:null}function describeScopeWorkspaceMismatch(input){if(sweepExpired(),!input.activeSessionId.trim())return null;let workspaceIdentity=canonicalWorkspaceIdentity(input.directory);if(!workspaceIdentity)return null;let first=[...pendingScopeBindings.values()].filter((binding)=>binding.ownerSessionId===input.activeSessionId&&binding.activation==="active"&&binding.source!=="pr_feedback"&&(!input.taskId||binding.taskId===input.taskId)&&typeof binding.dispatchCallId==="string"&&binding.dispatchCallId.length>0&&binding.ownerMessageId===binding.dispatchCallId&&typeof binding.parentOwnerSessionId==="string"&&binding.parentOwnerSessionId.length>0&&binding.ownerSessionId!==binding.parentOwnerSessionId&&binding.parentCallId===binding.dispatchCallId&&binding.workspaceIdentity!==workspaceIdentity)[0];if(!first)return null;return`SCOPE_WORKSPACE_MISMATCH: an active scope binding for session "${input.activeSessionId}" (task ${first.taskId}, source ${first.source}) is rooted at "${first.workspaceIdentity}", but this gate resolved "${workspaceIdentity}". The gate is using the wrong workspace root for this session.`}function clearScopeBindings(predicate){let removed=[];if(!predicate)return removed.push(...pendingScopeBindings.values()),pendingScopeBindings.clear(),removed;for(let[key,binding]of pendingScopeBindings)if(predicate(binding))removed.push(binding),pendingScopeBindings.delete(key);return removed}function claimScopeBindingForChild(input){sweepExpired();let workspaceIdentity=canonicalWorkspaceIdentity(input.directory);if(!workspaceIdentity||!input.parentSessionId.trim()||!input.childSessionId.trim()||!input.dispatchCallId.trim()||input.parentSessionId===input.childSessionId)return null;let matches=[...pendingScopeBindings.values()].filter((binding)=>binding.workspaceIdentity===workspaceIdentity&&binding.ownerSessionId===input.parentSessionId&&binding.activation==="pending_child"&&binding.ownerMessageId===input.dispatchCallId&&binding.dispatchCallId===input.dispatchCallId);if(matches.length!==1)return null;let previous=matches[0];pendingScopeBindings.delete(bindingKey(previous));let claimed={...previous,ownerSessionId:input.childSessionId,parentOwnerSessionId:input.parentSessionId,parentCallId:previous.dispatchCallId,activation:"active"};return registerScopeBinding(claimed),{previous,claimed}}function deriveChildScopeBinding(parent,input){let workspaceIdentity=canonicalWorkspaceIdentity(input.childDirectory);if(!workspaceIdentity||!input.childSessionId.trim()||!input.parentCallId.trim())throw Error("Cannot derive child scope binding without verified identity");let now=Date.now();return{...parent,workspaceIdentity,ownerSessionId:input.childSessionId,ownerMessageId:input.parentCallId,dispatchCallId:input.parentCallId,activation:"active",parentOwnerSessionId:parent.ownerSessionId,parentCallId:input.parentCallId,source:"worktree_derived",declaredAt:now,expiresAt:Math.min(parent.expiresAt,now+DEFAULT_SCOPE_BINDING_TTL_MS)}}function scopeContains(scope,candidate){return scope.some((entry)=>candidate===entry||candidate.startsWith(`${entry}/`))}function isSubset(candidate,authority){return candidate.every((file2)=>scopeContains(authority,file2))}function resolveCoderScopeSources(input){let explicit=input.explicitFiles&&input.explicitFiles.length>0?normalizeScopeFiles(input.explicitFiles):null,plan=input.planFiles&&input.planFiles.length>0?normalizeScopeFiles(input.planFiles):null,directives=input.fileDirectiveFiles&&input.fileDirectiveFiles.length>0?normalizeScopeFiles(input.fileDirectiveFiles):null;if(input.explicitFiles&&input.explicitFiles.length>0&&!explicit)return{ok:!1,code:"SCOPE_NOT_DECLARED"};if(input.planFiles&&input.planFiles.length>0&&!plan)return{ok:!1,code:"SCOPE_NOT_DECLARED"};if(input.fileDirectiveFiles&&input.fileDirectiveFiles.length>0&&!directives)return{ok:!1,code:"SCOPE_NOT_DECLARED"};if(explicit){if(plan&&!isSubset(plan,explicit)||directives&&!isSubset(directives,explicit))return{ok:!1,code:"SCOPE_CONFLICT"};return{ok:!0,files:explicit,source:"declare_scope"}}if(plan){if(directives&&!isSubset(directives,plan))return{ok:!1,code:"SCOPE_CONFLICT"};return{ok:!0,files:plan,source:"plan"}}if(directives)return{ok:!0,files:directives,source:"file_directive"};return{ok:!1,code:"SCOPE_NOT_DECLARED"}}var MAX_PENDING_SCOPE_BINDINGS=256,DEFAULT_SCOPE_BINDING_TTL_MS=3600000,pendingScopeBindings;var init_scope_binding=__esm(()=>{init_ledger();init_utils3();pendingScopeBindings=new Map});var exports_scope_persistence={};__export(exports_scope_persistence,{writeScopeToDisk:()=>writeScopeToDisk,writeScopeBindingToDisk:()=>writeScopeBindingToDisk,resolveScopeWithFallbacks:()=>resolveScopeWithFallbacks,resolveAuthorizedScopeBindingForSession:()=>resolveAuthorizedScopeBindingForSession,resolveAuthorizedScopeBinding:()=>resolveAuthorizedScopeBinding,resolveAuthorizedPrFeedbackScopeBindingFromDisk:()=>resolveAuthorizedPrFeedbackScopeBindingFromDisk,readScopeFromDisk:()=>readScopeFromDisk,readScopeBindingFromDisk:()=>readScopeBindingFromDisk,readPlanScope:()=>readPlanScope,clearScopeForTask:()=>clearScopeForTask,clearScopeBindingFromDisk:()=>clearScopeBindingFromDisk,clearAllScopes:()=>clearAllScopes});import{createHash as createHash12}from"node:crypto";import*as fs20 from"node:fs";import*as path34 from"node:path";function getScopesDir(directory){return path34.join(directory,SCOPES_DIR)}function normalizePathForComparison(value){let normalized=path34.resolve(value);return process.platform==="win32"?normalized.toLowerCase():normalized}function isSafeTaskId(taskId){if(typeof taskId!=="string")return!1;if(!/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/.test(taskId))return!1;let head=taskId.replace(/\.+$/,"").split(".")[0].toUpperCase();if(WINDOWS_RESERVED.has(head))return!1;return!0}function isScopesDirSafe(directory,scopesDir){try{let resolvedWorkspace=fs20.realpathSync(directory),expectedSwarmDir=path34.join(resolvedWorkspace,".swarm"),expectedScopesDir=path34.join(expectedSwarmDir,"scopes"),swarmStat=fs20.lstatSync(expectedSwarmDir),scopesStat=fs20.lstatSync(expectedScopesDir);if(!swarmStat.isDirectory()||swarmStat.isSymbolicLink()||!scopesStat.isDirectory()||scopesStat.isSymbolicLink())return!1;let resolvedScopes=fs20.realpathSync(scopesDir);if(normalizePathForComparison(resolvedScopes)!==normalizePathForComparison(expectedScopesDir))return!1;let rel=path34.relative(resolvedWorkspace,resolvedScopes);return rel.length>0&&!rel.startsWith("..")&&!path34.isAbsolute(rel)}catch{return!1}}function resolveSafeScopeFileForUnlink(directory,targetPath){try{let resolvedWorkspace=fs20.realpathSync(directory),scopesDir=path34.join(resolvedWorkspace,SCOPES_DIR);if(!isScopesDirSafe(resolvedWorkspace,scopesDir))return null;let candidate=path34.resolve(targetPath),resolvedCandidate=fs20.realpathSync(candidate);if(normalizePathForComparison(path34.dirname(candidate))!==normalizePathForComparison(scopesDir)||normalizePathForComparison(resolvedCandidate)!==normalizePathForComparison(candidate))return null;let relative9=path34.relative(resolvedWorkspace,resolvedCandidate);if(relative9.length===0||relative9===".."||relative9.startsWith(`..${path34.sep}`)||path34.isAbsolute(relative9))return null;let leafStat=fs20.lstatSync(candidate);if(!leafStat.isFile()||leafStat.isSymbolicLink())return null;if(!isScopesDirSafe(resolvedWorkspace,scopesDir))return null;let finalResolvedCandidate=fs20.realpathSync(candidate),finalLeafStat=fs20.lstatSync(candidate);if(normalizePathForComparison(finalResolvedCandidate)!==normalizePathForComparison(candidate)||!finalLeafStat.isFile()||finalLeafStat.isSymbolicLink()||finalLeafStat.dev!==leafStat.dev||finalLeafStat.ino!==leafStat.ino)return null;return candidate}catch{return null}}function getScopeFilePath(directory,taskId){if(!isSafeTaskId(taskId))throw Error(`Invalid taskId for scope persistence: ${taskId}`);return path34.join(getScopesDir(directory),`scope-${taskId}.json`)}function getBindingFilePath(directory,taskId,ownerSessionId){if(!isSafeTaskId(taskId)||!ownerSessionId.trim())throw Error("Invalid identity for scope binding persistence");let ownerHash=createHash12("sha256").update(ownerSessionId).digest("hex").slice(0,24);return path34.join(getScopesDir(directory),`binding-${taskId}-${ownerHash}.json`)}async function writeScopeToDisk(directory,taskId,files,ttlMs=DEFAULT_TTL_MS){if(!isSafeTaskId(taskId))return;if(!Array.isArray(files)||files.length===0)return;if(files.length>MAX_FILES_PER_SCOPE)return;let scopesDir=getScopesDir(directory),scopePath=getScopeFilePath(directory,taskId);try{fs20.mkdirSync(scopesDir,{recursive:!0})}catch{return}if(!isScopesDirSafe(directory,scopesDir))return;let now=Date.now(),payload={version:SCOPE_SCHEMA_VERSION,taskId,declaredAt:now,expiresAt:now+ttlMs,files:[...files]},content=JSON.stringify(payload,null,2);try{let flags=fs20.constants.O_WRONLY|fs20.constants.O_CREAT,nofollow=fs20.constants.O_NOFOLLOW??0,fd=fs20.openSync(scopePath,flags|nofollow);fs20.closeSync(fd)}catch{return}let release;try{release=await import_proper_lockfile2.default.lock(scopePath,{stale:LOCK_STALE_MS,retries:{retries:3,minTimeout:50,maxTimeout:200},realpath:!1}),await atomicWrite(scopePath,content)}catch{}finally{if(release)try{await release()}catch{}}}async function writeScopeBindingToDisk(directory,binding){if(!isSafeTaskId(binding.taskId)||binding.version!==2)return;let workspaceIdentity=canonicalWorkspaceIdentity(directory),files=normalizeScopeFiles(binding.files);if(!workspaceIdentity||workspaceIdentity!==binding.workspaceIdentity||!files||!binding.ownerSessionId||!binding.ownerMessageId||binding.expiresAt<=Date.now())return;let scopesDir=getScopesDir(directory),scopePath=getBindingFilePath(directory,binding.taskId,binding.ownerSessionId);try{fs20.mkdirSync(scopesDir,{recursive:!0})}catch{return}if(!isScopesDirSafe(directory,scopesDir))return;let content=JSON.stringify({...binding,files},null,2);try{let flags=fs20.constants.O_WRONLY|fs20.constants.O_CREAT,nofollow=fs20.constants.O_NOFOLLOW??0,fd=fs20.openSync(scopePath,flags|nofollow);fs20.closeSync(fd)}catch{return}let release;try{release=await import_proper_lockfile2.default.lock(scopePath,{stale:LOCK_STALE_MS,retries:{retries:3,minTimeout:50,maxTimeout:200},realpath:!1}),await atomicWrite(scopePath,content)}catch{}finally{if(release)try{await release()}catch{}}}function readScopeBindingFromDisk(input){if(!isSafeTaskId(input.taskId))return null;let scopesDir=getScopesDir(input.directory);if(!isScopesDirSafe(input.directory,scopesDir))return null;let scopePath;try{scopePath=getBindingFilePath(input.directory,input.taskId,input.ownerSessionId)}catch{return null}let nofollow=fs20.constants.O_NOFOLLOW??0,fd;try{fd=fs20.openSync(scopePath,fs20.constants.O_RDONLY|nofollow)}catch{return null}let raw="";try{let stat7=fs20.fstatSync(fd);if(!stat7.isFile()||stat7.size>MAX_SCOPE_BYTES)return null;let buffer=Buffer.alloc(stat7.size);fs20.readSync(fd,buffer,0,stat7.size,0),raw=buffer.toString("utf8")}catch{return null}finally{try{fs20.closeSync(fd)}catch{}}let parsed;try{parsed=JSON.parse(raw)}catch{return null}let now=Date.now(),workspaceIdentity=canonicalWorkspaceIdentity(input.directory),files=Array.isArray(parsed.files)?normalizeScopeFiles(parsed.files.filter((file2)=>typeof file2==="string")):null;if(parsed.version!==2||parsed.taskId!==input.taskId||!workspaceIdentity||parsed.workspaceIdentity!==workspaceIdentity||parsed.planId!==derivePlanId(input.plan)||parsed.planStructureHash!==computePlanStructureHash(input.plan)||typeof parsed.declaredAt!=="number"||parsed.declaredAt>now||typeof parsed.expiresAt!=="number"||parsed.expiresAt<=now||!parsed.ownerSessionId||!parsed.ownerMessageId||!parsed.source||!files||parsed.ownerSessionId!==input.ownerSessionId||input.requireDispatchCorrelation===!0&&(typeof parsed.dispatchCallId!=="string"||parsed.dispatchCallId.length===0||parsed.activation!=="active"||parsed.ownerMessageId!==parsed.dispatchCallId||typeof parsed.parentOwnerSessionId!=="string"||parsed.parentOwnerSessionId.length===0||parsed.ownerSessionId===parsed.parentOwnerSessionId||parsed.parentCallId!==parsed.dispatchCallId)||input.requireDeclaration===!0&&(parsed.activation!=="declaration"||parsed.dispatchCallId!==void 0)||input.parentCallId!==void 0&&parsed.parentCallId!==input.parentCallId)return null;return{...parsed,files}}function clearScopeBindingFromDisk(input){try{let resolvedWorkspace=fs20.realpathSync(input.directory),scopePath=getBindingFilePath(resolvedWorkspace,input.taskId,input.ownerSessionId),safePath=resolveSafeScopeFileForUnlink(resolvedWorkspace,scopePath);if(!safePath)return;fs20.unlinkSync(safePath)}catch{}}function readCurrentPlan(directory){try{let planPath=path34.join(directory,".swarm","plan.json"),stat7=fs20.statSync(planPath);if(!stat7.isFile()||stat7.size>MAX_PLAN_BYTES)return null;let parsed=PlanSchema.safeParse(JSON.parse(fs20.readFileSync(planPath,"utf8")));return parsed.success?parsed.data:null}catch{return null}}function resolveAuthorizedScopeBindingForPlan(input){let inMemory=getAuthorizedScopeBinding(input);if(inMemory)return inMemory;let durable=readScopeBindingFromDisk({directory:input.directory,taskId:input.taskId,plan:input.plan,ownerSessionId:input.activeSessionId,requireDispatchCorrelation:!0});if(durable)registerScopeBinding(durable);return durable}function resolveAuthorizedScopeBinding(input){let plan=readCurrentPlan(input.directory);return plan?resolveAuthorizedScopeBindingForPlan({...input,plan}):null}function resolveAuthorizedScopeBindingForSession(input){let plan=readCurrentPlan(input.directory);if(!plan)return null;let matches=[];for(let task of plan.phases.flatMap((phase)=>phase.tasks)){let binding=resolveAuthorizedScopeBindingForPlan({directory:input.directory,plan,taskId:task.id,activeSessionId:input.activeSessionId});if(binding)matches.push(binding);if(matches.length>1)return null}return matches[0]??null}function readPrFeedbackBindingFile(directory,filePath,activeSessionId,taskId){try{let leaf=fs20.lstatSync(filePath);if(!leaf.isFile()||leaf.isSymbolicLink())return null;if(normalizePathForComparison(fs20.realpathSync(filePath))!==normalizePathForComparison(filePath))return null}catch{return null}let nofollow=fs20.constants.O_NOFOLLOW??0,fd;try{fd=fs20.openSync(filePath,fs20.constants.O_RDONLY|nofollow)}catch{return null}let raw="";try{let stat7=fs20.fstatSync(fd);if(!stat7.isFile()||stat7.size>MAX_SCOPE_BYTES)return null;let buffer=Buffer.alloc(stat7.size);fs20.readSync(fd,buffer,0,stat7.size,0),raw=buffer.toString("utf8")}catch{return null}finally{try{fs20.closeSync(fd)}catch{}}let parsed;try{parsed=JSON.parse(raw)}catch{return null}let workspaceIdentity=canonicalWorkspaceIdentity(directory),files=Array.isArray(parsed.files)?normalizeScopeFiles(parsed.files.filter((file2)=>typeof file2==="string")):null,now=Date.now();if(parsed.version!==2||parsed.source!=="pr_feedback"||!workspaceIdentity||parsed.workspaceIdentity!==workspaceIdentity||!isSafeTaskId(parsed.taskId??"")||taskId!==void 0&&parsed.taskId!==taskId||parsed.ownerSessionId!==activeSessionId||parsed.activation!=="active"||typeof parsed.dispatchCallId!=="string"||!parsed.dispatchCallId||parsed.ownerMessageId!==parsed.dispatchCallId||typeof parsed.parentOwnerSessionId!=="string"||!parsed.parentOwnerSessionId||parsed.ownerSessionId===parsed.parentOwnerSessionId||parsed.parentCallId!==parsed.dispatchCallId||parsed.workflowSessionId!==parsed.parentOwnerSessionId||typeof parsed.workflowRevisionDigest!=="string"||!parsed.workflowRevisionDigest||parsed.planId!==`pr-feedback:${parsed.workflowSessionId}`||parsed.planStructureHash!==parsed.workflowRevisionDigest||typeof parsed.declaredAt!=="number"||parsed.declaredAt>now||typeof parsed.expiresAt!=="number"||parsed.expiresAt<=now||!files)return null;let expectedPath=getBindingFilePath(directory,parsed.taskId,activeSessionId);if(normalizePathForComparison(expectedPath)!==normalizePathForComparison(filePath))return null;return{...parsed,files}}function resolveAuthorizedPrFeedbackScopeBindingFromDisk(input){if(!input.activeSessionId.trim())return null;let scopesDir=getScopesDir(input.directory);if(!isScopesDirSafe(input.directory,scopesDir))return null;let candidates;if(input.taskId){if(!isSafeTaskId(input.taskId))return null;candidates=[getBindingFilePath(input.directory,input.taskId,input.activeSessionId)]}else try{let names=fs20.readdirSync(scopesDir);if(names.length>MAX_BINDING_FILES_TO_SCAN)return null;candidates=names.filter((name)=>name.startsWith("binding-")&&name.endsWith(".json")).map((name)=>path34.join(scopesDir,name))}catch{return null}let matches=candidates.map((candidate)=>readPrFeedbackBindingFile(input.directory,candidate,input.activeSessionId,input.taskId)).filter((binding)=>binding!==null);if(matches.length!==1)return null;return registerScopeBinding(matches[0]),matches[0]}async function atomicWrite(targetPath,content){let tempPath=`${targetPath}.tmp.${Date.now()}.${Math.floor(Math.random()*1e9)}`;try{await bunWrite(tempPath,content),fs20.renameSync(tempPath,targetPath)}finally{try{fs20.unlinkSync(tempPath)}catch{}}}function readScopeFromDisk(directory,taskId){if(!isSafeTaskId(taskId))return null;let scopesDir=getScopesDir(directory);if(!isScopesDirSafe(directory,scopesDir))return null;let scopePath=getScopeFilePath(directory,taskId),nofollow=fs20.constants.O_NOFOLLOW??0,fd;try{fd=fs20.openSync(scopePath,fs20.constants.O_RDONLY|nofollow)}catch{return null}let raw;try{let stat7=fs20.fstatSync(fd);if(!stat7.isFile())return null;if(stat7.size>MAX_SCOPE_BYTES)return null;let buf=Buffer.alloc(stat7.size);fs20.readSync(fd,buf,0,stat7.size,0),raw=buf.toString("utf-8")}catch{return null}finally{try{fs20.closeSync(fd)}catch{}}if(!raw.trim())return null;let parsed;try{parsed=JSON.parse(raw)}catch{return null}if(parsed.version!==SCOPE_SCHEMA_VERSION)return null;if(parsed.taskId!==taskId)return null;let now=Date.now();if(typeof parsed.declaredAt!=="number"||parsed.declaredAt>now)return null;if(typeof parsed.expiresAt!=="number"||now>=parsed.expiresAt)return null;if(!Array.isArray(parsed.files))return null;if(parsed.files.length>MAX_FILES_PER_SCOPE)return null;let files=parsed.files.filter((f)=>typeof f==="string");return files.length>0?files:null}function readPlanScope(directory,taskId){if(!isSafeTaskId(taskId))return null;try{let planPath=path34.join(directory,".swarm","plan.json"),stat7=fs20.statSync(planPath);if(!stat7.isFile())return null;if(stat7.size>MAX_PLAN_BYTES)return null;let raw=fs20.readFileSync(planPath,"utf-8"),plan=JSON.parse(raw);for(let phase of plan.phases??[])for(let task of phase.tasks??[]){if(task.id!==taskId)continue;let ft=task.files_touched;if(Array.isArray(ft)&&ft.length>0){if(ft.length>MAX_FILES_PER_SCOPE)return null;return ft.filter((f)=>typeof f==="string")}if(typeof ft==="string"&&ft.length>0)return[ft];return null}return null}catch{return null}}function clearScopeForTask(directory,taskId){if(!isSafeTaskId(taskId))return;try{fs20.unlinkSync(getScopeFilePath(directory,taskId))}catch{}}function clearAllScopes(directory){try{fs20.rmSync(getScopesDir(directory),{recursive:!0,force:!0})}catch{}}function resolveScopeWithFallbacks(input){let{directory,taskId,inMemoryScope,pendingMapScope}=input;if(inMemoryScope&&inMemoryScope.length>0)return inMemoryScope;if(taskId){let disk=readScopeFromDisk(directory,taskId);if(disk&&disk.length>0)return disk;let plan=readPlanScope(directory,taskId);if(plan&&plan.length>0)return plan}if(pendingMapScope&&pendingMapScope.length>0)return pendingMapScope;return null}var import_proper_lockfile2,SCOPE_SCHEMA_VERSION=1,DEFAULT_TTL_MS=86400000,LOCK_STALE_MS=30000,SCOPES_DIR=".swarm/scopes",MAX_FILES_PER_SCOPE=1e4,MAX_PLAN_BYTES=10485760,MAX_SCOPE_BYTES=2097152,MAX_BINDING_FILES_TO_SCAN=1e4,WINDOWS_RESERVED;var init_scope_persistence=__esm(()=>{init_plan_schema();init_ledger();init_utils3();init_bun_compat();init_scope_binding();import_proper_lockfile2=__toESM(require_proper_lockfile(),1),WINDOWS_RESERVED=new Set(["CON","PRN","AUX","NUL","COM1","COM2","COM3","COM4","COM5","COM6","COM7","COM8","COM9","LPT1","LPT2","LPT3","LPT4","LPT5","LPT6","LPT7","LPT8","LPT9"])});function pathMatches(scopePath,cochangePath){if(scopePath===cochangePath)return!0;return scopePath.endsWith(`/${cochangePath}`)}function epicPairConflict(scopeA,scopeB,cochangePairs,threshold){let normA=scopeA.map(normalizePath),normB=scopeB.map(normalizePath),pathPairs=[];for(let a of normA)for(let b of normB)if(pathsConflict(a,b))pathPairs.push([a,b]);let pathConflict=pathPairs.length>0,activePairs=cochangePairs.filter((e)=>e.coChangeCount>=threshold.minCoChanges&&e.npmi>=threshold.npmi),cochangeMatches=[];for(let entry of activePairs){let{fileA:fa,fileB:fb}=entry,aTouchesFa=normA.some((p)=>pathMatches(p,fa)),aTouchesFb=normA.some((p)=>pathMatches(p,fb)),bTouchesFa=normB.some((p)=>pathMatches(p,fa)),bTouchesFb=normB.some((p)=>pathMatches(p,fb));if(aTouchesFa&&!aTouchesFb&&(bTouchesFb&&!bTouchesFa)||aTouchesFb&&!aTouchesFa&&(bTouchesFa&&!bTouchesFb))cochangeMatches.push({a:fa,b:fb,npmi:entry.npmi,coChangeCount:entry.coChangeCount})}let cochangeConflict=cochangeMatches.length>0,reason;if(pathConflict&&cochangeConflict)reason="both";else if(pathConflict)reason="path";else if(cochangeConflict)reason="cochange";else reason="none";return{conflict:pathConflict||cochangeConflict,reason,evidence:{pathPairs,cochangePairs:cochangeMatches}}}var init_cochange_conflict=__esm(()=>{init_conflicts()});function resolveScope(directory,taskId){let raw=readScopeFromDisk(directory,taskId);if(raw===null)return{files:[],ok:!1};if(raw.length===0)return{files:[],ok:!1};return{files:raw,ok:!0}}function computeParallelVerdict(directory,taskIds,options){if(taskIds.length>MAX_PARALLEL_VERDICT_TASKS)throw RangeError(`Parallel verdict supports at most ${MAX_PARALLEL_VERDICT_TASKS} tasks`);let useCochange=options?.useCochange===!0&&Array.isArray(options?.cochangePairs),threshold=options?.cochangeThreshold??DEFAULT_PARALLEL_COCHANGE_THRESHOLD,cochangePairs=useCochange?options.cochangePairs:[],resolved=new Map,unknownScopeTasks=[];for(let id of taskIds){let r=resolveScope(directory,id);if(resolved.set(id,r),!r.ok)unknownScopeTasks.push(id)}let pairs=[],inDegree=new Map,adj=new Map;for(let id of taskIds)inDegree.set(id,0),adj.set(id,[]);for(let i=0;i<taskIds.length;i++)for(let j=i+1;j<taskIds.length;j++){let a=taskIds[i],b=taskIds[j],ra=resolved.get(a),rb=resolved.get(b),pairVerdict,evidence2;if(!ra.ok||!rb.ok)pairVerdict="unknown",evidence2=[];else{let ev=epicPairConflict(ra.files,rb.files,cochangePairs,threshold);if(ev.conflict){if(pairVerdict="conflict",evidence2=formatEvidence(ev),!adj.get(a).includes(b))adj.get(a).push(b),inDegree.set(b,(inDegree.get(b)??0)+1)}else pairVerdict="disjoint",evidence2=[]}pairs.push({a,b,verdict:pairVerdict,evidence:evidence2})}let suggestedSerialOrder=topoSort(taskIds,adj,inDegree),verdict;if(unknownScopeTasks.length>0)verdict="unknown_scopes";else if(pairs.some((p)=>p.verdict==="conflict"))verdict="conflicts_present";else verdict="all_disjoint";return{verdict,pairs,suggestedSerialOrder,unknownScopeTasks}}function formatEvidence(ev){let lines=[];for(let[pa,pb]of ev.evidence.pathPairs)lines.push(`path overlap: ${pa} ↔ ${pb}`);for(let cc of ev.evidence.cochangePairs)lines.push(`co-change: ${cc.a} ↔ ${cc.b} (npmi=${cc.npmi.toFixed(3)}, coChanges=${cc.coChangeCount})`);return lines}function topoSort(taskIds,adj,inDegree){let deg=new Map(inDegree),order=[],queue=[...taskIds.filter((id)=>(deg.get(id)??0)===0)];while(queue.length>0){let cur=queue.shift();order.push(cur);for(let next of adj.get(cur)??[])if(deg.set(next,(deg.get(next)??0)-1),(deg.get(next)??0)===0)queue.push(next);queue.sort((x,y)=>taskIds.indexOf(x)-taskIds.indexOf(y))}if(order.length<taskIds.length){for(let id of taskIds)if(!order.includes(id))order.push(id)}return order}var DEFAULT_PARALLEL_COCHANGE_THRESHOLD,MAX_PARALLEL_VERDICT_TASKS=64;var init_parallel_verdict=__esm(()=>{init_scope_persistence();init_cochange_conflict();init_conflicts();DEFAULT_PARALLEL_COCHANGE_THRESHOLD={npmi:0.2,minCoChanges:3}});function normalizeMessage(message){return message.replace(/\s+/g," ").trim().toLowerCase()}function pushAdvisory(session,message,opts){if(!message?.trim())return!1;if(session.pendingAdvisoryMessages??=[],opts?.dedupeKey){let key=opts.dedupeKey;if(session.pendingAdvisoryMessages.some((m)=>m.includes(key)))return!1}else if(session.pendingAdvisoryMessages.some((m)=>normalizeMessage(m)===normalizeMessage(message)))return!1;let cap=Math.max(1,opts?.maxPending??25);while(session.pendingAdvisoryMessages.length>=cap)session.pendingAdvisoryMessages.shift();return session.pendingAdvisoryMessages.push(message),!0}var exports_core3={};__export(exports_core3,{writeLaneProfileToDiskReal:()=>writeLaneProfileToDiskReal,shortenWorktreePath:()=>shortenWorktreePath,resolveWorktreeBaseDir:()=>resolveWorktreeBaseDir,removeWorktree:()=>removeWorktree,removeLaneProfileFromDiskReal:()=>removeLaneProfileFromDiskReal,provisionWorktree:()=>provisionWorktree,makeWorktreeBranchName:()=>makeWorktreeBranchName,isPathUnderSwarmWorktreeBase:()=>isPathUnderSwarmWorktreeBase,isCleanWorktree:()=>isCleanWorktree,cleanUntrackedFiles:()=>cleanUntrackedFiles,checkPathBudget:()=>checkPathBudget,autoCommitDirty:()=>autoCommitDirty,assertCleanWorkingTree:()=>assertCleanWorkingTree,_internals:()=>_internals24});import*as fs21 from"node:fs";import*as fsPromises5 from"node:fs/promises";import*as os9 from"node:os";import*as path35 from"node:path";async function writeLaneProfileToDiskReal(worktreePath,laneIndex,envOverrides){let lines=[];for(let[key,value]of Object.entries(envOverrides)){if(value===null)continue;if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key))continue;if(value.includes(`
359
359
  `)||value.includes("\r")){log("writeLaneProfileToDisk: skipping env var with newline in value",{key});continue}lines.push(`${key}=${value}`)}if(lines.length===0)return;let lanesDir=path35.join(worktreePath,".swarm","lanes");await fs21.promises.mkdir(lanesDir,{recursive:!0});let envPath=path35.join(lanesDir,`${laneIndex}.env`);await fs21.promises.writeFile(envPath,`${lines.join(`
360
360
  `)}
361
361
  `,"utf-8")}async function removeLaneProfileFromDiskReal(worktreePath,laneIndex){let envPath=path35.join(worktreePath,".swarm","lanes",`${laneIndex}.env`);try{await fs21.promises.unlink(envPath)}catch(err){if(err.code!=="ENOENT")log(`[worktree] Failed to remove lane profile ${envPath}: ${err.message}`)}}async function runGit2(args2,cwd,timeoutMs=WORKTREE_TIMEOUT_MS){let proc=_internals24.bunSpawn(["git",...args2],{cwd,timeout:timeoutMs,stdin:"ignore",stdout:"pipe",stderr:"pipe",env:{...process.env,LC_ALL:"C"}});try{let exitCode=await proc.exited,stdout=await proc.stdout.text(),stderr=await proc.stderr.text();return{exitCode,stdout,stderr}}finally{try{proc.kill()}catch{}}}async function checkPathBudget(worktreeRoot,directory){if(_internals24.platform!=="win32")return{ok:!0};let longPaths;try{longPaths=await _internals24.getCoreLongPaths(directory)}catch{}if(longPaths==="true")return{ok:!0};let proc=_internals24.bunSpawn(["git","ls-files"],{cwd:directory,timeout:WORKTREE_TIMEOUT_MS,stdin:"ignore",stdout:"pipe",stderr:"ignore",env:{...process.env,LC_ALL:"C"}});try{let exitCode=await proc.exited,stdout=await proc.stdout.text();if(exitCode!==0||stdout.trim().length===0)return{ok:!0};let files=stdout.split(/\r?\n/),longest=0;for(let file2 of files)if(file2.length>longest)longest=file2.length;let totalPathLength=worktreeRoot.length+1+longest;if(totalPathLength>=WIN_PATH_BUDGET)return{ok:!1,error:`Total path budget exceeded: worktree root "${worktreeRoot}" (${worktreeRoot.length} chars) + longest file "${files.find((f)=>f.length===longest)}" (${longest} chars) = ${totalPathLength} chars (budget: ${WIN_PATH_BUDGET})`,suggestion:"Set config.worktree_dir to a shorter absolute path, or let the auto-shorten feature relocate the worktree to the system temp directory."};return{ok:!0}}finally{try{proc.kill()}catch{}}}function shortenWorktreePath(_directory,sessionId,laneId){let tmp=_internals24.osTmpdir();try{tmp=fs21.realpathSync(tmp)}catch{}return path35.join(tmp,"swwt",sessionId,laneId)}function makeWorktreeBranchName(sessionId,id,options){if(options.branchStyle==="legacy-lane"&&options.purpose==="lane")return`swarm-lane/${sessionId}/${id}`;return`swarm/${options.purpose}/${sessionId}/${id}`}function resolveWorktreeBaseDir(directory,worktreeDir){return worktreeDir?path35.resolve(directory,worktreeDir):path35.resolve(path35.dirname(directory),".swarm-worktrees")}function isPathUnderSwarmWorktreeBase(targetPath,directory,worktreeDirOverrides=[]){let caseInsensitive=process.platform==="win32",realTarget;try{realTarget=fs21.realpathSync(path35.resolve(directory,targetPath))}catch{return!1}let bases=[resolveWorktreeBaseDir(directory),...worktreeDirOverrides.map((d)=>resolveWorktreeBaseDir(directory,d))],cmpTarget=caseInsensitive?realTarget.toLowerCase():realTarget;return bases.some((base)=>{let realBase;try{realBase=fs21.realpathSync(base)}catch{realBase=path35.resolve(base)}let cmpBase=caseInsensitive?realBase.toLowerCase():realBase;if(cmpTarget===cmpBase)return!0;let rel=path35.relative(cmpBase,cmpTarget);return rel.length>0&&!rel.startsWith("..")&&!path35.isAbsolute(rel)})}async function provisionWorktree(directory,id,sessionId,options){let branchName=makeWorktreeBranchName(sessionId,id,options),worktreePath=path35.resolve(resolveWorktreeBaseDir(directory,options.worktreeDir),sessionId,id),budgetResult=await checkPathBudget(worktreePath,directory);if(budgetResult.ok===!1)if(options.worktreeDir)advisoryWarn(`[swarm] Path budget warning: ${budgetResult.error} ${budgetResult.suggestion}`);else{let shortPath=shortenWorktreePath(directory,sessionId,id);if((await checkPathBudget(shortPath,directory)).ok===!1)return{error:budgetResult.error};worktreePath=shortPath}if((await runGit2(["show-ref","--verify","--quiet",`refs/heads/${branchName}`],directory)).exitCode===0){let listResult=await runGit2(["worktree","list","--porcelain"],directory),normalizeGitPath=(p)=>{let lexical=p.replace(/\\/g,"/").replace(/\/+$/,"");try{return fs21.realpathSync(p).replace(/\\/g,"/").replace(/\/+$/,"")}catch{return lexical}},expectedPath=normalizeGitPath(worktreePath),entries=[],current={path:"",branch:void 0};if(listResult.exitCode!==0){let raw=listResult.stderr.trim()||listResult.stdout.trim();return{error:`worktree enumeration failed: ${raw.length>500?`${raw.slice(0,500)}... (truncated)`:raw}`}}for(let rawLine of listResult.stdout.split(`
@@ -365,7 +365,7 @@ ${cacheSection2}`;return baseMsg}let lines2=["## Archive Preview (dry run)","",`
365
365
  ${result.stdout}`;if(/CONFLICT/i.test(combinedOutput)||/conflict/i.test(combinedOutput)){let files=parseConflictFiles(combinedOutput);return await runGit3(strategy==="rebase"?["rebase","--abort"]:strategy==="cherry-pick"?["cherry-pick","--abort"]:["merge","--abort"],primaryDir),{conflict:!0,files,message:result.stderr.trim()}}return{error:result.stderr.trim()||result.stdout.trim()}}async function reconcileLandedMerge(primaryDir,provenance){if(!provenance.operationId||!provenance.sourceHead||!provenance.targetHeadBefore)return{landed:!1,error:"Incomplete merge operation provenance"};if(provenance.strategy!=="cherry-pick"){let ancestry=await runGit3(["merge-base","--is-ancestor",provenance.sourceHead,"HEAD"],primaryDir);if(ancestry.exitCode===0)return{landed:!0,method:"ancestry"};if(ancestry.exitCode===1)return{landed:!1};return{landed:!1,error:ancestry.stderr.trim()||ancestry.stdout.trim()||`git merge-base exited ${ancestry.exitCode}`}}let escapedTrailer=`(cherry picked from commit ${provenance.sourceHead})`.replace(/[\\.^$|?*+()[\]{}]/g,"\\$&"),trailerSearch=await runGit3(["log","--format=%H","--extended-regexp",`--grep=^${escapedTrailer}$`,"--max-count=1",`${provenance.targetHeadBefore}..HEAD`],primaryDir);if(trailerSearch.exitCode!==0)return{landed:!1,error:trailerSearch.stderr.trim()||trailerSearch.stdout.trim()||`git log exited ${trailerSearch.exitCode}`};return trailerSearch.stdout.trim()?{landed:!0,method:"cherry-pick-trailer"}:{landed:!1}}async function postMergeCleanup(directory,branchName){let deleteResult=await runGit3(["branch","-D",branchName],directory),deleteOk=deleteResult.exitCode===0,pruneResult=await runGit3(["worktree","prune"],directory),pruneOk=pruneResult.exitCode===0;if(deleteOk&&pruneOk)return{cleaned:!0};if(!deleteOk&&pruneOk)return{error:`Branch delete failed: ${deleteResult.stderr.trim()||deleteResult.stdout.trim()}`,partial:!0};return{error:deleteOk?`Worktree prune failed: ${pruneResult.stderr.trim()||pruneResult.stdout.trim()}`:`Branch delete failed: ${deleteResult.stderr.trim()||deleteResult.stdout.trim()}; worktree prune failed: ${pruneResult.stderr.trim()||pruneResult.stdout.trim()}`}}async function attemptMergeBackFromDirty(worktreePath,branchName,primaryDir,strategy,options={}){let autoCommitted=!1,cleaned=!1,autoCommitFailed=!1,cleanFailed=!1,provenance=options.resume;if(provenance){if(provenance.branchName!==branchName||provenance.strategy!==strategy||options.operationId!==void 0&&provenance.operationId!==options.operationId)return{failed:!0,stage:"reconciliation",message:"Stored merge operation identity does not match this dispatch",provenance};let reconciliation=await reconcileLandedMerge(primaryDir,provenance);if("error"in reconciliation&&reconciliation.error)return{failed:!0,stage:"reconciliation",message:`Unable to reconcile prior merge-back: ${reconciliation.error}`,provenance};if(reconciliation.landed)return{merged:!0,strategy,autoCommitted:!1,cleaned:!1,reconciled:!0,provenance};let sourceHead=await runGit3(["rev-parse","HEAD"],worktreePath),targetHead=await runGit3(["rev-parse","HEAD"],primaryDir);if(sourceHead.exitCode!==0||targetHead.exitCode!==0||sourceHead.stdout.trim()!==provenance.sourceHead||targetHead.stdout.trim()!==provenance.targetHeadBefore)return{failed:!0,stage:"reconciliation",message:"Stored merge operation did not land and its source or target HEAD has changed",provenance}}if(!provenance){let commitResult=await autoCommitDirty(worktreePath);if(commitResult.committed)autoCommitted=!0;else if(commitResult.reason!=="Nothing to commit")autoCommitFailed=!0,log(`[worktree] attemptMergeBackFromDirty: auto-commit failed for worktree "${worktreePath}" branch "${branchName}": ${commitResult.reason}`)}let cleanResult=await cleanUntrackedFiles(worktreePath);if(cleanResult.cleaned)cleaned=!0;else cleanFailed=!0,log(`[worktree] attemptMergeBackFromDirty: clean untracked failed for worktree "${worktreePath}" branch "${branchName}": ${cleanResult.error}`);if(autoCommitFailed&&cleanFailed)return{failed:!0,stage:"cleanup",message:"Auto-commit and clean both failed; abandoning worktree",...provenance?{provenance}:{}};if(!provenance&&(options.operationId||options.onBeforeMerge)){if(!options.operationId)return{failed:!0,stage:"pre-merge",message:"A pre-merge callback requires a stable operationId"};let sourceHead=await runGit3(["rev-parse","HEAD"],worktreePath),targetHead=await runGit3(["rev-parse","HEAD"],primaryDir);if(sourceHead.exitCode!==0||targetHead.exitCode!==0||!sourceHead.stdout.trim()||!targetHead.stdout.trim())return{failed:!0,stage:"pre-merge",message:"Unable to capture source and target HEAD before merge-back"};if(provenance={operationId:options.operationId,sourceHead:sourceHead.stdout.trim(),targetHeadBefore:targetHead.stdout.trim(),branchName,strategy},options.onBeforeMerge)try{await options.onBeforeMerge(provenance)}catch(error49){return{failed:!0,stage:"pre-merge",message:`Unable to persist merge operation provenance: ${String(error49)}`,provenance}}}let mergeResult=await mergeLaneBranch(primaryDir,branchName,strategy);if("merged"in mergeResult&&mergeResult.merged)return{merged:!0,strategy,autoCommitted,cleaned,...provenance?{reconciled:!1,provenance}:{}};if("conflict"in mergeResult)return{partial:!0,stage:"merge",autoCommitted,cleaned,message:mergeResult.message,conflictFiles:mergeResult.files,...provenance?{provenance}:{}};if("error"in mergeResult)return{failed:!0,stage:"merge",message:mergeResult.error,...provenance?{provenance}:{}};return{failed:!0,stage:"merge",message:"Merge failed with unexpected result",...provenance?{provenance}:{}}}function extractSessionId(branchName){let segments=branchName.trim().split("/");if(segments.length>=3&&segments[0]==="swarm-lane")return segments[1];if(segments.length>=4&&segments[0]==="swarm"&&segments[1]==="lane")return segments[2];return null}async function listLaneBranches(directory){let branches=new Set,result=await runGit3(["branch","--format=%(refname:short)"],directory);if(result.exitCode===0)for(let line of result.stdout.split(`
366
366
  `)){let branch=line.trim();if(branch.length>0&&(branch.startsWith("swarm-lane/")||branch.startsWith("swarm/lane/")))branches.add(branch)}return[...branches]}async function cleanupOrphanedBranches(directory,activeSessionIds=[]){let removed=[],skipped=[],skippedRecoveryBranches=[],errors3=[];if(recoveryReadErrored(directory)){log("[worktree] cleanupOrphanedBranches: .swarm/recovery/ read error — skipping all "+"lane-branch deletions this pass (fail-safe for preserved recovery branches).");let branches2=await listLaneBranches(directory);return{removed,skipped:branches2,skippedRecoveryBranches,errors:errors3,recoveryReadError:!0}}let branches=await listLaneBranches(directory);for(let branch of branches){let sessionId=extractSessionId(branch);if(sessionId!==null&&activeSessionIds.includes(sessionId)){skipped.push(branch);continue}if(hasRecoveryRecordForBranch(directory,branch)){skippedRecoveryBranches.push(branch);continue}let deleteResult=await runGit3(["branch","-D",branch],directory);if(deleteResult.exitCode===0)removed.push(branch);else errors3.push({branch,error:deleteResult.stderr.trim()||deleteResult.stdout.trim()})}return await runGit3(["worktree","prune"],directory),{removed,skipped,skippedRecoveryBranches,errors:errors3}}async function startupOrphanRecovery(directory,activeSessionIds=[]){let warnings=[],pruneResult=await runGit3(["worktree","prune"],directory);if(pruneResult.exitCode!==0)warnings.push(`git worktree prune failed: ${pruneResult.stderr.trim()||pruneResult.stdout.trim()}`);let allBranches=await listLaneBranches(directory),orphanBranches=[];for(let branch of allBranches){let sessionId=extractSessionId(branch);if(sessionId===null||!activeSessionIds.includes(sessionId))orphanBranches.push(branch),warnings.push(`Orphaned swarm-lane branch "${branch}" detected in "${directory}"`)}for(let warning of warnings)log(warning);return{prunedWorktrees:pruneResult.exitCode===0,remainingBranches:orphanBranches,warnings}}var _internals25,MERGE_TIMEOUT_MS=30000;var init_merge=__esm(()=>{init_warning_buffer();init_recovery();init_utils();init_bun_compat();init_core3();_internals25={bunSpawn,platform:process.platform,sleep:(ms)=>new Promise((resolve17)=>setTimeout(resolve17,ms)),cleanupOrphanedBranches,startupOrphanRecovery,extractSessionId}});var init_worktree=__esm(()=>{init_core3();init_merge()});import{createHash as createHash13,randomBytes as randomBytes2}from"node:crypto";import*as fs23 from"node:fs";import*as path37 from"node:path";function ownerDirectory(directory){return path37.dirname(validateSwarmPath(directory,path37.join(PROVISIONING_OWNER_DIR,".containment-anchor")))}function ownerPath(directory,callID){let digest2=createHash13("sha256").update(callID).digest("hex");return validateSwarmPath(directory,path37.join(PROVISIONING_OWNER_DIR,`${digest2}.json`))}function isOwner(value){if(!value||typeof value!=="object"||Array.isArray(value))return!1;let candidate=value,schemaVersion=candidate.schemaVersion,validTaskIdentity=schemaVersion===1?candidate.taskId===void 0:schemaVersion===2&&typeof candidate.taskId==="string"&&candidate.taskId.length>0&&candidate.taskId.length<=512;return(schemaVersion===1||schemaVersion===2)&&validTaskIdentity&&typeof candidate.callID==="string"&&candidate.callID.length>0&&candidate.callID.length<=512&&typeof candidate.parentSessionId==="string"&&candidate.parentSessionId.length>0&&candidate.parentSessionId.length<=512&&typeof candidate.worktreeSessionId==="string"&&candidate.worktreeSessionId.length>0&&candidate.worktreeSessionId.length<=512&&typeof candidate.createdAt==="number"&&Number.isFinite(candidate.createdAt)&&candidate.createdAt>=0}function recordWorktreeProvisioningOwner(directory,input){let owner={schemaVersion:input.taskId?2:1,callID:input.callID,parentSessionId:input.parentSessionId,worktreeSessionId:input.worktreeSessionId,...input.taskId?{taskId:input.taskId}:{},createdAt:Date.now()};if(!isOwner(owner))throw Error("invalid worktree provisioning owner");let absolutePath=ownerPath(directory,input.callID);fs23.mkdirSync(path37.dirname(absolutePath),{recursive:!0});let tempPath=`${absolutePath}.tmp-${randomBytes2(8).toString("hex")}`;try{fs23.writeFileSync(tempPath,`${JSON.stringify(owner)}
367
367
  `,{encoding:"utf8",flag:"wx"}),fs23.renameSync(tempPath,absolutePath)}catch(error49){try{fs23.unlinkSync(tempPath)}catch{}throw error49}return owner}function removeWorktreeProvisioningOwner(directory,callID){try{return fs23.unlinkSync(ownerPath(directory,callID)),!0}catch(error49){return error49.code==="ENOENT"}}function scanWorktreeProvisioningOwnersForRecovery(directory){let directoryPath,entries;try{directoryPath=ownerDirectory(directory),entries=fs23.readdirSync(directoryPath,{withFileTypes:!0}).filter((entry)=>entry.isFile()&&entry.name.endsWith(".json"))}catch(error49){if(error49.code==="ENOENT")return{status:"ok",owners:[]};return{status:"uncertain",reason:`worktree provisioning-owner directory is unreadable: ${error49 instanceof Error?error49.message:String(error49)}`}}if(entries.length>MAX_PROVISIONING_OWNERS)return{status:"uncertain",reason:`worktree provisioning-owner count exceeds the ${MAX_PROVISIONING_OWNERS}-marker safety bound`};let owners=[];for(let entry of entries){let absolutePath=path37.join(directoryPath,entry.name);try{if(fs23.statSync(absolutePath).size>MAX_PROVISIONING_OWNER_BYTES)return{status:"uncertain",reason:`worktree provisioning owner "${entry.name}" exceeds the recovery size bound`};let raw=fs23.readFileSync(absolutePath,"utf8");if(Buffer.byteLength(raw,"utf8")>MAX_PROVISIONING_OWNER_BYTES)return{status:"uncertain",reason:`worktree provisioning owner "${entry.name}" changed beyond the recovery size bound`};let parsed=JSON.parse(raw);if(!isOwner(parsed))return{status:"uncertain",reason:`worktree provisioning owner "${entry.name}" is invalid`};owners.push(parsed)}catch(error49){return{status:"uncertain",reason:`worktree provisioning owner "${entry.name}" is unreadable or malformed: ${error49 instanceof Error?error49.message:String(error49)}`}}}return{status:"ok",owners}}var PROVISIONING_OWNER_DIR="worktree-provisioning-owners",MAX_PROVISIONING_OWNERS=512,MAX_PROVISIONING_OWNER_BYTES=16384,WORKTREE_LIFECYCLE_LOCK_FILE=".swarm/locks/init-orphan-recovery.lock";var init_worktree_provisioning_owner=__esm(()=>{init_utils2()});import*as fs24 from"node:fs";import*as path38 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{fs24.statSync(path38.join(directory,".git"))}catch(error49){if(error49.code==="ENOENT")return{status:"ok",owners:[]};return{status:"uncertain",reason:`Git metadata could not be inspected: ${error49 instanceof Error?error49.message:String(error49)}`}}let proc=bunSpawn(["git","-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});try{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(error49){return{status:"uncertain",reason:`ownership tag scan failed: ${error49 instanceof Error?error49.message:String(error49)}`}}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()});var exports_worktree_collision_ownership={};__export(exports_worktree_collision_ownership,{inspectStandardWorktreeCollisionOwnership:()=>inspectStandardWorktreeCollisionOwnership});import*as path39 from"node:path";function normalizedPath(value){let resolved=path39.normalize(path39.resolve(value));return process.platform==="win32"?resolved.toLowerCase():resolved}function descriptorCoordinateMatch(descriptor,identity){let branchMatches=descriptor.branchName===identity.branchName,pathMatches2=normalizedPath(descriptor.worktreePath)===normalizedPath(identity.worktreePath);if(!branchMatches&&!pathMatches2)return"none";if(!branchMatches||!pathMatches2||descriptor.parentSessionId!==identity.parentSessionId||descriptor.taskId!==identity.taskId)return"uncertain";return"exact"}function isProvenSettled(record2){let settlement=record2.coderSettlement;return settlement?.state==="settled"&&settlement.outcome?.kind==="standard-worktree"&&(settlement.outcome.result==="merged"||settlement.outcome.result==="unchanged")}function classifyRecord(record2,identity,ownerKind){if(!record2.worktree)return null;let coordinates=descriptorCoordinateMatch(record2.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(record2))return null;let lifecycle=record2.coderSettlement?.state==="preserved"?"preserved":"active";return{status:"protected",ownerKind,lifecycle,reason:`${ownerKind} background owner ${record2.correlationId} is ${record2.status}`+(record2.coderSettlement?` with coder settlement ${record2.coderSettlement.state}`:" without a settled workspace outcome")}}async function inspectStandardWorktreeCollisionOwnership(identity){let provisioning=scanWorktreeProvisioningOwnersForRecovery(identity.directory);if(provisioning.status==="uncertain")return provisioning;for(let owner of provisioning.owners){if(!(owner.parentSessionId===identity.parentSessionId||owner.worktreeSessionId===identity.parentSessionId))continue;if(owner.schemaVersion===1||owner.taskId===identity.taskId)return{status:"protected",ownerKind:"provisioning",lifecycle:"active",reason: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 record2 of primary.owners){let classified=classifyRecord(record2,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"&&normalizedPath(failure.worktreePath)===normalizedPath(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 init_worktree_collision_ownership=__esm(()=>{init_pending_delegations();init_worktree_merge_status();init_worktree_ownership_tag();init_worktree_provisioning_owner()});import{createHash as createHash14}from"node:crypto";import*as fs25 from"node:fs/promises";import*as path40 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=path40.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}function rememberStandardWorktreeDispatch(dispatch){standardWorktreeByCallID.set(dispatch.callID,dispatch)}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 record2 of awaitingMergeByCallID.values())if(record2.parentSessionID===parentSessionID)return!0;return!1}function handleStandardWorktreeFailure(parentSessionID,policy,message){if(policy==="required")throw Error(message);if(hasInFlightStandardWorktreeDispatch(parentSessionID))throw Error(`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),Error(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}let session=ensureAgentSession(sessionID);session.maxConcurrencyOverride=1,pushAdvisory(session,`${message} Serializing standard coder dispatches for this session.`)}function resetStandardWorktreeIsolationState(){standardWorktreeByCallID.clear(),standardWorktreeSerializationSessions.clear(),serializationStateBySessionID.clear(),awaitingMergeByCallID.clear(),standardWorktreeMergeQueue=Promise.resolve(),standardWorktreeLaneIndexBySession.clear()}function releaseStandardWorktreeSerialization(sessionID){if(!standardWorktreeSerializationSessions.has(sessionID))return!1;standardWorktreeSerializationSessions.delete(sessionID),serializationStateBySessionID.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,config2){let state=serializationStateBySessionID.get(sessionID);if(!state)return;let count=config2.serialization_release_after_dispatches??5,ttl=config2.serialization_release_after_ms??60000;if(state.successfulDispatchesSince>=count){releaseStandardWorktreeSerialization(sessionID);return}if(Date.now()-state.serializedAt>=ttl)releaseStandardWorktreeSerialization(sessionID)}function rememberStandardWorktreeSerializationSession(sessionID){if(standardWorktreeSerializationSessions.size>=MAX_TRACKED_STANDARD_WORKTREE_CALLS){let evicted=!1;for(let key of serializationStateBySessionID.keys())if(!hasInFlightStandardWorktreeDispatch(key)){standardWorktreeSerializationSessions.delete(key),serializationStateBySessionID.delete(key),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=_internals26.bunSpawn(["git","-C",directory,"worktree","list","--porcelain"],{stdin:"ignore",stdout:"pipe",stderr:"pipe",timeout:WORKTREE_LIST_TIMEOUT_MS}),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};for(let rawLine of stdout.split(`
368
- `)){let line=rawLine.trim();if(line.startsWith("worktree ")){if(current.path)entries.push(current);current={path:line.slice(9),branch:void 0}}else if(line.startsWith("branch "))current.branch=line.slice(7)}if(current.path)entries.push(current);for(let entry of entries){if(!entry.branch)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 _internals25.extractSessionId(branchName)===expectedSessionId}async function inspectStandardWorktreeCollisionOwnership2(identity){return(await Promise.resolve().then(() => (init_worktree_collision_ownership(),exports_worktree_collision_ownership))).inspectStandardWorktreeCollisionOwnership(identity)}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),lifecycleLock=await _internals26.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 _internals26.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 _internals26.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 record2 of _internals26.awaitingMergeByCallID.values())if(record2.branch===collision.existingBranch)hardStopStandardWorktreeLifecycle(args2.parentSessionID,`PREPROVISION_COLLISION_AWAITING_MERGE: branch ${collision.existingBranch} is still awaiting merge-back.`);let ownership=await _internals26.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 preserveResult=await _internals26.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.`);let removeResult=await _internals26.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 _internals26.postMergeCleanup(args2.directory,collision.existingBranch);if("error"in cleanupResult)hardStopStandardWorktreeLifecycle(args2.parentSessionID,`STANDARD_WORKTREE_COLLISION_BRANCH_CLEANUP_FAILED: ${cleanupResult.error}. Provisioning was blocked.`);let verification=await _internals26.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.`)}_internals26.recordWorktreeProvisioningOwner(args2.directory,{callID:args2.callID,parentSessionId:args2.parentSessionID,worktreeSessionId:args2.parentSessionID,taskId:args2.taskId})}catch(error49){if(error49 instanceof Error&&(error49.message.startsWith("STANDARD_WORKTREE_")||error49.message.startsWith("PREPROVISION_COLLISION")))throw error49;hardStopStandardWorktreeLifecycle(args2.parentSessionID,`STANDARD_WORKTREE_OWNER_PERSIST_FAILED: ${error49 instanceof Error?error49.message:String(error49)}.`)}finally{try{await lifecycleLock.lock._release?.()}catch{}}let provisionResult;try{provisionResult=await _internals26.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(error49){throw _internals26.removeWorktreeProvisioningOwner(args2.directory,args2.callID),error49}if("error"in provisionResult){_internals26.removeWorktreeProvisioningOwner(args2.directory,args2.callID);let message=`STANDARD_WORKTREE_PROVISION_FAILED: ${provisionResult.error}.`;handleStandardWorktreeFailure(args2.parentSessionID,worktreeConfig.policy,message);return}let laneProfile=computeLaneRuntimeProfile(worktreeConfig.runtime_isolation,laneIndex,provisionResult.worktreePath);if(laneProfile)try{let{writeLaneProfileToDiskReal:writeLaneProfileToDiskReal2}=await Promise.resolve().then(() => (init_core3(),exports_core3));await writeLaneProfileToDiskReal2(provisionResult.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.`)}}let createResult=await client.session.create({body:{parentID:args2.parentSessionID,title:`${args2.description??args2.taskId} (worktree lane)`},query:{directory:provisionResult.worktreePath}});if(!createResult.data?.id){await _internals26.removeWorktree(provisionResult.worktreePath,args2.directory,{force:!0,worktreeDir:worktreeConfig.worktree_dir}).catch(()=>{}),_internals26.removeWorktreeProvisioningOwner(args2.directory,args2.callID);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}args2.outputArgs.task_id=createResult.data.id,rememberStandardWorktreeDispatch({callID:args2.callID,parentSessionID:args2.parentSessionID,taskId:args2.taskId,planTaskId:args2.planTaskId,handle:provisionResult,mergeStrategy:worktreeConfig.merge_strategy,laneIndex,worktree_dir:worktreeConfig.worktree_dir})}async function preserveBackgroundWorktreeOwnershipForCallId(callID){let dispatch=standardWorktreeByCallID.get(callID);if(!dispatch)return{outcome:"not-found"};let refProc=_internals26.bunSpawn(["git","-C",dispatch.handle.worktreePath,"rev-parse","HEAD"],{stdin:"ignore",stdout:"pipe",stderr:"pipe",timeout:PRESERVE_COMMIT_TIMEOUT_MS}),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=createHash14("sha256").update(callID).digest("hex").slice(0,12),tag=`swarm-preserved-owner/${session}/${lane}/${callDigest}`,tagProc=_internals26.bunSpawn(["git","-C",dispatch.handle.worktreePath,"tag",tag,ref],{stdin:"ignore",stdout:"pipe",stderr:"pipe",timeout:PRESERVE_COMMIT_TIMEOUT_MS});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,_directory,_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=_internals26.bunSpawn(["git","-C",worktreePath,"status","--porcelain"],{stdin:"ignore",stdout:"pipe",stderr:"pipe",timeout:PRESERVE_COMMIT_TIMEOUT_MS}),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=_internals26.bunSpawn(["git","-C",worktreePath,"add","-A"],{stdin:"ignore",stdout:"pipe",stderr:"pipe",timeout:PRESERVE_COMMIT_TIMEOUT_MS});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=_internals26.bunSpawn(["git","-C",worktreePath,"commit","-m",commitMessage],{stdin:"ignore",stdout:"pipe",stderr:"pipe",timeout:PRESERVE_COMMIT_TIMEOUT_MS}),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=_internals26.bunSpawn(["git","-C",worktreePath,"rev-parse","HEAD"],{stdin:"ignore",stdout:"pipe",stderr:"pipe",timeout:PRESERVE_COMMIT_TIMEOUT_MS});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=_internals26.bunSpawn(["git","-C",worktreePath,"tag",tagName],{stdin:"ignore",stdout:"pipe",stderr:"pipe",timeout:PRESERVE_COMMIT_TIMEOUT_MS});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,_directory,_worktree_dir){let statusProc=_internals26.bunSpawn(["git","-C",worktreePath,"status","--porcelain"],{stdin:"ignore",stdout:"pipe",stderr:"pipe",timeout:PRESERVE_COMMIT_TIMEOUT_MS}),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=_internals26.bunSpawn(["git","-C",worktreePath,"add","-A"],{stdin:"ignore",stdout:"pipe",stderr:"pipe",timeout:PRESERVE_COMMIT_TIMEOUT_MS});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=_internals26.bunSpawn(["git","-C",worktreePath,"commit","-m",commitMessage],{stdin:"ignore",stdout:"pipe",stderr:"pipe",timeout:PRESERVE_COMMIT_TIMEOUT_MS}),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=_internals26.bunSpawn(["git","-C",worktreePath,"rev-parse","HEAD"],{stdin:"ignore",stdout:"pipe",stderr:"pipe",timeout:PRESERVE_COMMIT_TIMEOUT_MS});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=_internals26.bunSpawn(["git","-C",worktreePath,"tag",tagName],{stdin:"ignore",stdout:"pipe",stderr:"pipe",timeout:PRESERVE_COMMIT_TIMEOUT_MS});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){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;worktreePath=awaiting.worktreePath,branchName=awaiting.branch,parentSessionID=awaiting.parentSessionID}let preserveResult;if(reason==="denied"||reason==="cancelled"){try{preserveResult=await _internals26.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 _internals26.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);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}.`);return}await _internals26.removeWorktree(worktreePath,directory,{force:!0,worktreeDir:worktree_dir}).catch((err)=>log(`[swarm] cleanupStandardWorktreeForCallId: removeWorktree failed for ${callID}: ${err}`)),await _internals26.postMergeCleanup(directory,branchName).catch((err)=>log(`[swarm] cleanupStandardWorktreeForCallId: postMergeCleanup failed for ${callID}: ${err}`)),standardWorktreeByCallID.delete(callID),awaitingMergeByCallID.delete(callID);let session=ensureAgentSession(parentSessionID);pushAdvisory(session,`STANDARD_WORKTREE_CLEANUP: dispatch ${callID} cleaned up (reason: ${reason}); worktree=${worktreePath}; branch=${branchName}.`)}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,config2,callID,settlement={}){let wtConfig=config2?resolveWorktreeIsolationConfig(config2):DEFAULT_WORKTREE_ISOLATION_CONFIG,resolvedCallID=callID??dispatch.callID,run=async()=>{let mergeResult=await _internals26.attemptMergeBackFromDirty(dispatch.handle.worktreePath,dispatch.handle.branchName,directory,getMergeStrategy({merge_strategy:dispatch.mergeStrategy}),{operationId:settlement.operationId,resume:settlement.resume,onBeforeMerge:settlement.onBeforeMerge}),statusKey=dispatch.planTaskId??dispatch.taskId;if("merged"in mergeResult&&mergeResult.merged){let mergedSettlement={outcome:"merged",strategy:mergeResult.strategy,autoCommitted:mergeResult.autoCommitted,cleaned:mergeResult.cleaned,reconciled:mergeResult.reconciled??!1,provenance:mergeResult.provenance};if(settlement.onMerged)try{await settlement.onMerged(mergedSettlement)}catch(error49){let failedSettlement={outcome:"failed",stage:"settlement-persist",message:`Git merge-back succeeded but settlement persistence failed: ${String(error49)}`,provenance:mergeResult.provenance};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}clearWorktreeMergeStatus(statusKey);try{let{removeLaneProfileFromDiskReal:removeLaneProfileFromDiskReal2}=await Promise.resolve().then(() => (init_core3(),exports_core3));await removeLaneProfileFromDiskReal2(dispatch.handle.worktreePath,dispatch.laneIndex)}catch{}let state=serializationStateBySessionID.get(dispatch.parentSessionID);if(state)state.successfulDispatchesSince++,checkStandardWorktreeSerializationRelease(dispatch.parentSessionID,wtConfig);return await cleanupStandardWorktreeForCallId(resolvedCallID,"success",directory,dispatch.worktree_dir),mergedSettlement}if("partial"in mergeResult){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);return pushAdvisory(session,`STANDARD_WORKTREE_MERGE_PARTIAL: task ${dispatch.taskId} preserved at ${dispatch.handle.worktreePath}; stage: ${mergeResult.stage}; ${mergeResult.message}`),{outcome:"partial",stage:mergeResult.stage,message:mergeResult.message,autoCommitted:mergeResult.autoCommitted,cleaned:mergeResult.cleaned,conflictFiles:mergeResult.conflictFiles,provenance:mergeResult.provenance}}if("failed"in mergeResult){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);return pushAdvisory(session,`STANDARD_WORKTREE_MERGE_FAILED: task ${dispatch.taskId} preserved at ${dispatch.handle.worktreePath}; stage: ${mergeResult.stage}; ${mergeResult.message}.`),{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=await queuedRun;if(resolvedCallID)awaitingMergeByCallID.delete(resolvedCallID);return result}async function readLaneEnvFileFromDisk(worktreePath,laneIndex){let envPath=path40.join(worktreePath,".swarm","lanes",`${laneIndex}.env`),content;try{content=await fs25.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(`
368
+ `)){let line=rawLine.trim();if(line.startsWith("worktree ")){if(current.path)entries.push(current);current={path:line.slice(9),branch:void 0}}else if(line.startsWith("branch "))current.branch=line.slice(7)}if(current.path)entries.push(current);for(let entry of entries){if(!entry.branch)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 _internals25.extractSessionId(branchName)===expectedSessionId}async function inspectStandardWorktreeCollisionOwnership2(identity){return(await Promise.resolve().then(() => (init_worktree_collision_ownership(),exports_worktree_collision_ownership))).inspectStandardWorktreeCollisionOwnership(identity)}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),lifecycleLock=await _internals26.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 _internals26.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 _internals26.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 record2 of _internals26.awaitingMergeByCallID.values())if(record2.branch===collision.existingBranch)hardStopStandardWorktreeLifecycle(args2.parentSessionID,`PREPROVISION_COLLISION_AWAITING_MERGE: branch ${collision.existingBranch} is still awaiting merge-back.`);let ownership=await _internals26.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 preserveResult=await _internals26.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.`);let removeResult=await _internals26.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 _internals26.postMergeCleanup(args2.directory,collision.existingBranch);if("error"in cleanupResult)hardStopStandardWorktreeLifecycle(args2.parentSessionID,`STANDARD_WORKTREE_COLLISION_BRANCH_CLEANUP_FAILED: ${cleanupResult.error}. Provisioning was blocked.`);let verification=await _internals26.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.`)}_internals26.recordWorktreeProvisioningOwner(args2.directory,{callID:args2.callID,parentSessionId:args2.parentSessionID,worktreeSessionId:args2.parentSessionID,taskId:args2.taskId})}catch(error49){if(error49 instanceof Error&&(error49.message.startsWith("STANDARD_WORKTREE_")||error49.message.startsWith("PREPROVISION_COLLISION")))throw error49;hardStopStandardWorktreeLifecycle(args2.parentSessionID,`STANDARD_WORKTREE_OWNER_PERSIST_FAILED: ${error49 instanceof Error?error49.message:String(error49)}.`)}finally{try{await lifecycleLock.lock._release?.()}catch{}}let provisionResult;try{provisionResult=await _internals26.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(error49){throw _internals26.removeWorktreeProvisioningOwner(args2.directory,args2.callID),error49}if("error"in provisionResult){_internals26.removeWorktreeProvisioningOwner(args2.directory,args2.callID);let message=`STANDARD_WORKTREE_PROVISION_FAILED: ${provisionResult.error}.`;handleStandardWorktreeFailure(args2.parentSessionID,worktreeConfig.policy,message);return}let laneProfile=computeLaneRuntimeProfile(worktreeConfig.runtime_isolation,laneIndex,provisionResult.worktreePath);if(laneProfile)try{let{writeLaneProfileToDiskReal:writeLaneProfileToDiskReal2}=await Promise.resolve().then(() => (init_core3(),exports_core3));await writeLaneProfileToDiskReal2(provisionResult.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.`)}}let createResult=await client.session.create({body:{parentID:args2.parentSessionID,title:`${args2.description??args2.taskId} (worktree lane)`},query:{directory:provisionResult.worktreePath}});if(!createResult.data?.id){await _internals26.removeWorktree(provisionResult.worktreePath,args2.directory,{force:!0,worktreeDir:worktreeConfig.worktree_dir}).catch(()=>{}),_internals26.removeWorktreeProvisioningOwner(args2.directory,args2.callID);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}args2.outputArgs.task_id=createResult.data.id,ensureAgentSession(createResult.data.id,"coder",provisionResult.worktreePath),recordSessionWorkspaceRoot(createResult.data.id,provisionResult.worktreePath),rememberStandardWorktreeDispatch({callID:args2.callID,parentSessionID:args2.parentSessionID,taskId:args2.taskId,planTaskId:args2.planTaskId,handle:provisionResult,mergeStrategy:worktreeConfig.merge_strategy,laneIndex,worktree_dir:worktreeConfig.worktree_dir})}async function preserveBackgroundWorktreeOwnershipForCallId(callID){let dispatch=standardWorktreeByCallID.get(callID);if(!dispatch)return{outcome:"not-found"};let refProc=_internals26.bunSpawn(["git","-C",dispatch.handle.worktreePath,"rev-parse","HEAD"],{stdin:"ignore",stdout:"pipe",stderr:"pipe",timeout:PRESERVE_COMMIT_TIMEOUT_MS}),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=createHash14("sha256").update(callID).digest("hex").slice(0,12),tag=`swarm-preserved-owner/${session}/${lane}/${callDigest}`,tagProc=_internals26.bunSpawn(["git","-C",dispatch.handle.worktreePath,"tag",tag,ref],{stdin:"ignore",stdout:"pipe",stderr:"pipe",timeout:PRESERVE_COMMIT_TIMEOUT_MS});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,_directory,_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=_internals26.bunSpawn(["git","-C",worktreePath,"status","--porcelain"],{stdin:"ignore",stdout:"pipe",stderr:"pipe",timeout:PRESERVE_COMMIT_TIMEOUT_MS}),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=_internals26.bunSpawn(["git","-C",worktreePath,"add","-A"],{stdin:"ignore",stdout:"pipe",stderr:"pipe",timeout:PRESERVE_COMMIT_TIMEOUT_MS});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=_internals26.bunSpawn(["git","-C",worktreePath,"commit","-m",commitMessage],{stdin:"ignore",stdout:"pipe",stderr:"pipe",timeout:PRESERVE_COMMIT_TIMEOUT_MS}),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=_internals26.bunSpawn(["git","-C",worktreePath,"rev-parse","HEAD"],{stdin:"ignore",stdout:"pipe",stderr:"pipe",timeout:PRESERVE_COMMIT_TIMEOUT_MS});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=_internals26.bunSpawn(["git","-C",worktreePath,"tag",tagName],{stdin:"ignore",stdout:"pipe",stderr:"pipe",timeout:PRESERVE_COMMIT_TIMEOUT_MS});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,_directory,_worktree_dir){let statusProc=_internals26.bunSpawn(["git","-C",worktreePath,"status","--porcelain"],{stdin:"ignore",stdout:"pipe",stderr:"pipe",timeout:PRESERVE_COMMIT_TIMEOUT_MS}),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=_internals26.bunSpawn(["git","-C",worktreePath,"add","-A"],{stdin:"ignore",stdout:"pipe",stderr:"pipe",timeout:PRESERVE_COMMIT_TIMEOUT_MS});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=_internals26.bunSpawn(["git","-C",worktreePath,"commit","-m",commitMessage],{stdin:"ignore",stdout:"pipe",stderr:"pipe",timeout:PRESERVE_COMMIT_TIMEOUT_MS}),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=_internals26.bunSpawn(["git","-C",worktreePath,"rev-parse","HEAD"],{stdin:"ignore",stdout:"pipe",stderr:"pipe",timeout:PRESERVE_COMMIT_TIMEOUT_MS});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=_internals26.bunSpawn(["git","-C",worktreePath,"tag",tagName],{stdin:"ignore",stdout:"pipe",stderr:"pipe",timeout:PRESERVE_COMMIT_TIMEOUT_MS});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){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;worktreePath=awaiting.worktreePath,branchName=awaiting.branch,parentSessionID=awaiting.parentSessionID}let preserveResult;if(reason==="denied"||reason==="cancelled"){try{preserveResult=await _internals26.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 _internals26.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);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}.`);return}await _internals26.removeWorktree(worktreePath,directory,{force:!0,worktreeDir:worktree_dir}).catch((err)=>log(`[swarm] cleanupStandardWorktreeForCallId: removeWorktree failed for ${callID}: ${err}`)),await _internals26.postMergeCleanup(directory,branchName).catch((err)=>log(`[swarm] cleanupStandardWorktreeForCallId: postMergeCleanup failed for ${callID}: ${err}`)),standardWorktreeByCallID.delete(callID),awaitingMergeByCallID.delete(callID);let session=ensureAgentSession(parentSessionID);pushAdvisory(session,`STANDARD_WORKTREE_CLEANUP: dispatch ${callID} cleaned up (reason: ${reason}); worktree=${worktreePath}; branch=${branchName}.`)}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,config2,callID,settlement={}){let wtConfig=config2?resolveWorktreeIsolationConfig(config2):DEFAULT_WORKTREE_ISOLATION_CONFIG,resolvedCallID=callID??dispatch.callID,run=async()=>{let mergeResult=await _internals26.attemptMergeBackFromDirty(dispatch.handle.worktreePath,dispatch.handle.branchName,directory,getMergeStrategy({merge_strategy:dispatch.mergeStrategy}),{operationId:settlement.operationId,resume:settlement.resume,onBeforeMerge:settlement.onBeforeMerge}),statusKey=dispatch.planTaskId??dispatch.taskId;if("merged"in mergeResult&&mergeResult.merged){let mergedSettlement={outcome:"merged",strategy:mergeResult.strategy,autoCommitted:mergeResult.autoCommitted,cleaned:mergeResult.cleaned,reconciled:mergeResult.reconciled??!1,provenance:mergeResult.provenance};if(settlement.onMerged)try{await settlement.onMerged(mergedSettlement)}catch(error49){let failedSettlement={outcome:"failed",stage:"settlement-persist",message:`Git merge-back succeeded but settlement persistence failed: ${String(error49)}`,provenance:mergeResult.provenance};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}clearWorktreeMergeStatus(statusKey);try{let{removeLaneProfileFromDiskReal:removeLaneProfileFromDiskReal2}=await Promise.resolve().then(() => (init_core3(),exports_core3));await removeLaneProfileFromDiskReal2(dispatch.handle.worktreePath,dispatch.laneIndex)}catch{}let state=serializationStateBySessionID.get(dispatch.parentSessionID);if(state)state.successfulDispatchesSince++,checkStandardWorktreeSerializationRelease(dispatch.parentSessionID,wtConfig);return await cleanupStandardWorktreeForCallId(resolvedCallID,"success",directory,dispatch.worktree_dir),mergedSettlement}if("partial"in mergeResult){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);return pushAdvisory(session,`STANDARD_WORKTREE_MERGE_PARTIAL: task ${dispatch.taskId} preserved at ${dispatch.handle.worktreePath}; stage: ${mergeResult.stage}; ${mergeResult.message}`),{outcome:"partial",stage:mergeResult.stage,message:mergeResult.message,autoCommitted:mergeResult.autoCommitted,cleaned:mergeResult.cleaned,conflictFiles:mergeResult.conflictFiles,provenance:mergeResult.provenance}}if("failed"in mergeResult){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);return pushAdvisory(session,`STANDARD_WORKTREE_MERGE_FAILED: task ${dispatch.taskId} preserved at ${dispatch.handle.worktreePath}; stage: ${mergeResult.stage}; ${mergeResult.message}.`),{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=await queuedRun;if(resolvedCallID)awaitingMergeByCallID.delete(resolvedCallID);return result}async function readLaneEnvFileFromDisk(worktreePath,laneIndex){let envPath=path40.join(worktreePath,".swarm","lanes",`${laneIndex}.env`),content;try{content=await fs25.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(`
369
369
  `)){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;result[k]=v}return result}var MAX_TRACKED_STANDARD_WORKTREE_CALLS=256,awaitingMergeByCallID,standardWorktreeByCallID,standardWorktreeSerializationSessions,standardWorktreeMergeQueue,standardWorktreeLaneIndexBySession,serializationStateBySessionID,WORKTREE_LIST_TIMEOUT_MS=15000,PRESERVE_COMMIT_TIMEOUT_MS=30000,_internals26;var init_worktree_isolation=__esm(()=>{init_constants();init_file_locks();init_executor();init_state2();init_bun_compat();init_logger();init_worktree();init_worktree_merge_status();init_worktree_provisioning_owner();init_worktree_isolation_config();awaitingMergeByCallID=new Map,standardWorktreeByCallID=new Map,standardWorktreeSerializationSessions=new Set,standardWorktreeMergeQueue=Promise.resolve(),standardWorktreeLaneIndexBySession=new Map,serializationStateBySessionID=new Map;_internals26={provisionWorktree,removeWorktree,attemptMergeBackFromDirty,postMergeCleanup,readLaneEnvFileFromDisk,serializationStateBySessionID,rememberStandardWorktreeSerializationSession,awaitingMergeByCallID,startupOrphanRecovery,cleanupOrphanedBranches,cleanupStandardWorktreeForCallId,preserveDirtyWorktreeForCallId,preserveBackgroundWorktreeOwnershipForCallId,tryAcquireWorktreeLifecycleLock:tryAcquireLock,recordWorktreeProvisioningOwner,removeWorktreeProvisioningOwner,preserveDirtyWorktreeAtPath,abortStandardWorktreeDispatch,standardWorktreeByCallID,preProvisionCollisionCheck,inspectStandardWorktreeCollisionOwnership:inspectStandardWorktreeCollisionOwnership2,isLaneOwnedByCurrentSession,bunSpawn}});function resolveMemoryConfig(input){return{...DEFAULT_MEMORY_CONFIG,...input??{},sqlite:{...DEFAULT_MEMORY_CONFIG.sqlite,...input?.sqlite??{}},recall:{...DEFAULT_MEMORY_CONFIG.recall,...input?.recall??{},injection:{...DEFAULT_MEMORY_CONFIG.recall.injection,...input?.recall?.injection??{}}},learning:{...DEFAULT_MEMORY_CONFIG.learning,...input?.learning??{}},writes:{...DEFAULT_MEMORY_CONFIG.writes,...input?.writes??{}},redaction:{...DEFAULT_MEMORY_CONFIG.redaction,...input?.redaction??{}},maintenance:{...DEFAULT_MEMORY_CONFIG.maintenance,...input?.maintenance??{},importance:{...DEFAULT_MEMORY_CONFIG.maintenance.importance,...input?.maintenance?.importance??{}}},consolidation:{...DEFAULT_CONSOLIDATION_CONFIG,...input?.consolidation??{},decayHalfLifeDays:{...DEFAULT_CONSOLIDATION_CONFIG.decayHalfLifeDays,...input?.consolidation?.decayHalfLifeDays??{}}},link:{enabled:input?.link?.enabled??DEFAULT_MEMORY_CONFIG.link.enabled},embeddings:{...DEFAULT_MEMORY_CONFIG.embeddings,...input?.embeddings??{}},retrieval:{...DEFAULT_MEMORY_CONFIG.retrieval,...input?.retrieval??{},weights:{...DEFAULT_MEMORY_CONFIG.retrieval.weights,...input?.retrieval?.weights??{}},rerank:{...DEFAULT_MEMORY_CONFIG.retrieval.rerank,...input?.retrieval?.rerank??{}}},qLearning:{...DEFAULT_MEMORY_CONFIG.qLearning,...input?.qLearning??{}}}}var DEFAULT_DECAY_HALF_LIFE_DAYS,DEFAULT_IMPORTANCE_CONFIG,DEFAULT_QLEARNING_CONFIG,COUNCIL_VERDICT_REWARDS,DEFAULT_CONSOLIDATION_CONFIG,DEFAULT_MEMORY_LEARNING_CONFIG,DEFAULT_EMBEDDINGS_CONFIG,DEFAULT_RETRIEVAL_CONFIG,DEFAULT_MEMORY_CONFIG,DURABLE_MEMORY_KINDS,EVIDENCE_REQUIRED_KINDS;var init_config2=__esm(()=>{DEFAULT_DECAY_HALF_LIFE_DAYS={scratch:7,todo:30,code_pattern:90,test_pattern:90,failure_pattern:90,api_finding:180,evidence:180,architecture_decision:0,repo_convention:0,project_fact:0,security_note:0,user_preference:0},DEFAULT_IMPORTANCE_CONFIG={wRecency:0.2,wFrequency:0.2,wFreshness:0.15,wConfidence:0.25,lambda:0.05,mu:0.01,n:50,threshold:0.2},DEFAULT_QLEARNING_CONFIG={learningRate:0.1,qValueBoostWeight:0.1,suppressionThreshold:0.15,promotionThreshold:0.85,promotionMinRetrievals:5,propagationFraction:0.3,propagationFanoutCap:20,propagationWindowDays:30,propagationRelatednessThreshold:0.7,explorationRate:0.05,verdictPayloadCapBytes:8192,initialQValue:0.5},COUNCIL_VERDICT_REWARDS={APPROVE:1,CONCERNS:0.5,REJECT:0},DEFAULT_CONSOLIDATION_CONFIG={enabled:!1,maxClustersPerPass:10,jaccardThreshold:0.3,autoApplyMinConfidence:0.6,decayHalfLifeDays:{...DEFAULT_DECAY_HALF_LIFE_DAYS}},DEFAULT_MEMORY_LEARNING_CONFIG={learningRate:0.1,propagationFactor:0.3,qValueBoostWeight:0.1,suppressionThreshold:0.15,promotionThreshold:0.85,propagationTokenOverlapThreshold:0.4,propagationEmbeddingCosineThreshold:0.7,propagationFanout:20,propagationLookbackDays:30},DEFAULT_EMBEDDINGS_CONFIG={enabled:!1,model:"Xenova/all-MiniLM-L6-v2",dimension:384,cacheSize:256},DEFAULT_RETRIEVAL_CONFIG={rrfK:60,weights:{lexical:0.5,dense:0.4,metadata:0.1},rerank:{enabled:!1},latencyBudgetMs:250},DEFAULT_MEMORY_CONFIG={enabled:!1,provider:"sqlite",storageDir:".swarm/memory",sqlite:{path:".swarm/memory/memory.db",busyTimeoutMs:5000},recall:{defaultMaxItems:8,defaultTokenBudget:1200,minScore:0.05,injection:{enabled:!0,minScore:0.25,requireQuerySignal:!0,maxItems:6,tokenBudget:1000}},learning:{...DEFAULT_MEMORY_LEARNING_CONFIG},writes:{mode:"propose"},redaction:{rejectDurableSecrets:!0},maintenance:{lowUtilityMaxConfidence:0.45,lowUtilityMinAgeDays:30,autoCompactEveryNRecalls:50,importance:{...DEFAULT_IMPORTANCE_CONFIG}},consolidation:{...DEFAULT_CONSOLIDATION_CONFIG,decayHalfLifeDays:{...DEFAULT_DECAY_HALF_LIFE_DAYS}},link:{enabled:!1},embeddings:{...DEFAULT_EMBEDDINGS_CONFIG},retrieval:{...DEFAULT_RETRIEVAL_CONFIG},qLearning:{...DEFAULT_QLEARNING_CONFIG},hardDelete:!1},DURABLE_MEMORY_KINDS=new Set(["user_preference","project_fact","architecture_decision","repo_convention","code_pattern","test_pattern","failure_pattern","security_note"]),EVIDENCE_REQUIRED_KINDS=new Set(["api_finding","evidence","security_note"])});var MemoryValidationError,MemoryDisabledError;var init_errors4=__esm(()=>{MemoryValidationError=class MemoryValidationError extends Error{code;constructor(message,code="memory_validation_error"){super(message);this.name="MemoryValidationError",this.code=code}};MemoryDisabledError=class MemoryDisabledError extends Error{constructor(message="Swarm memory is disabled"){super(message);this.name="MemoryDisabledError"}}});import{createHash as createHash15}from"node:crypto";function computeRedactionPolicyVersion(rejectDurableSecrets){return 1e6+SECRET_PATTERNS.length*2+(rejectDurableSecrets?1:0)}function computeMemoryCohortFingerprint(input){let canonical=JSON.stringify(input,Object.keys(input).sort());return createHash15("sha256").update(canonical).digest("hex").slice(0,12)}function buildMemoryCohortFingerprintInput(config2){return{provider:config2.provider,redaction_policy_version:computeRedactionPolicyVersion(config2.redaction.rejectDurableSecrets),embedding_model:config2.embeddings.model,embedding_dimension:config2.embeddings.dimension,embedding_version:config2.embeddings.version??"default"}}function findSecrets(text){let findings=[];for(let{type,pattern}of SECRET_PATTERNS){pattern.lastIndex=0;for(let match of text.matchAll(pattern))if(match[0])findings.push({type,match:match[0]})}return findings}function containsSecret(text){return findSecrets(text).length>0}function redactSecrets(text){let redacted=text;for(let{type,pattern}of SECRET_PATTERNS)pattern.lastIndex=0,redacted=redacted.replace(pattern,`[REDACTED:${type}]`);return redacted}var SECRET_PATTERNS;var init_redaction=__esm(()=>{SECRET_PATTERNS=[{type:"openai_api_key",pattern:/\bsk-[A-Za-z0-9_-]{20,}\b/g},{type:"github_token",pattern:/\b(?:ghp|gho|ghu|ghs|ghr|github_pat)_[A-Za-z0-9_]{20,}\b/g},{type:"aws_access_key_id",pattern:/\bAKIA[0-9A-Z]{16}\b/g},{type:"private_key_block",pattern:/-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/g},{type:"authorization_bearer",pattern:/\bAuthorization\s*:\s*Bearer\s+[A-Za-z0-9._~+/=-]{12,}/gi},{type:"env_secret",pattern:/\b(?:[A-Z][A-Z0-9]+_)+(?:KEY|TOKEN|SECRET|PASSWORD)\b\s*=\s*["']?[^\s"'`]{8,}["']?/gi},{type:"gitlab_token",pattern:/\bgl(?:pat|ptt)-[A-Za-z0-9_-]{15,}\b/g},{type:"slack_token",pattern:/\bxox[abprs]-[A-Za-z0-9-]{10,}\b/g},{type:"jwt_token",pattern:/\beyJ[A-Za-z0-9_-]+\.eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/g},{type:"aws_secret_access_key",pattern:/\b(?:aws_secret_access_key|AWS_SECRET_ACCESS_KEY)\s*[=:]\s*[A-Za-z0-9/+=]{40}\b/g},{type:"stripe_secret_key",pattern:/\b(?:sk|rk)_(?:live|test)_[A-Za-z0-9]{24,}\b/g},{type:"google_api_key",pattern:/\bAIza[0-9A-Za-z_-]{35}\b/g},{type:"openssh_private_key_block",pattern:/-----BEGIN[ ]OPENSSH[ ]PRIVATE[ ]KEY-----[\s\S]*?-----END[ ]OPENSSH[ ]PRIVATE[ ]KEY-----/g}]});var MEMORY_RECALL_SENTINEL="## Retrieved Swarm Memory";import{createHash as createHash16}from"node:crypto";function normalizeMemoryText(text){return text.replace(/\s+/g," ").trim()}function stableScopeKey(scope){let ordered={type:scope.type},keys=scope.type==="repository"?["repoId"]:scope.type==="cohort"?["cohortId"]:["userId","workspaceId","projectId","repoId","repoRoot","runId","agentId"];for(let key of keys){let value=scope[key];if(value)ordered[key]=value}return JSON.stringify(ordered)}function computeMemoryContentHash(recordLike){let normalized=normalizeMemoryText(recordLike.text).toLowerCase();return createHash16("sha256").update(`${stableScopeKey(recordLike.scope)}
370
370
  ${recordLike.kind}
371
371
  ${normalized}`).digest("hex")}function createMemoryId(recordLike){return`mem_${computeMemoryContentHash(recordLike).slice(0,16)}`}function createProposalId(input){return`prop_${createHash16("sha256").update(`${input.createdAt}
@@ -697,9 +697,9 @@ Expecting `+expected.join(", ")+", got '"+(this.terminals_[symbol2]||symbol2)+"'
697
697
  `;break;case"destructive_block":case"sandbox_wrap":case"sandbox_skip":line=`${JSON.stringify({...entry,command:redactShellCommand(entry.command)})}
698
698
  `;break;case"file_write":line=`${JSON.stringify({...entry,path:redactPath(entry.path),reason:redactEmbeddedPaths(entry.reason),resolvedScope:redactPath(entry.resolvedScope)})}
699
699
  `;break;case"scope_violation":line=`${JSON.stringify({...entry,path:redactPath(entry.path),declaredScope:redactPath(entry.declaredScope),resolvedScope:redactPath(entry.resolvedScope)})}
700
- `;break}try{await _internals33.mkdir(path60.dirname(ctx.auditPath),{recursive:!0}),await _internals33.appendFile(ctx.auditPath,line,"utf-8")}catch(error49){log("guardrail audit: append failed",{auditPath:ctx.auditPath,error:error49})}}var _internals33,REQUIRED_STRING_FIELDS;var init_audit_log=__esm(()=>{init_logger();init_helpers();_internals33={mkdir:fs31.mkdir,appendFile:fs31.appendFile},REQUIRED_STRING_FIELDS=["ts","sessionID","agent","tool","type"]});import*as path61 from"node:path";function createToolBeforeHandler(ctx){let{effectiveDirectory,cfg,precomputedAuthorityRules,universalDenyPrefixes,shellAuditPath,shellAuditEnabled,interpreterAllowedAgents,authorityConfig,consecutiveNoToolTurns,worktreeBaseDirOverrides,rememberReviewerScopeWrite}=ctx;function resolveActiveScopeBinding(sessionID){let session=swarmState.agentSessions.get(sessionID),taskId=session?.currentTaskId??null,binding=taskId?resolveAuthorizedScopeBinding({directory:effectiveDirectory,taskId,activeSessionId:sessionID}):resolveAuthorizedScopeBindingForSession({directory:effectiveDirectory,activeSessionId:sessionID});if(!taskId&&binding&&session)session.currentTaskId=binding.taskId,session.declaredCoderScope=[...binding.files];return binding}function resolveDeclaredScope(sessionID){return resolveActiveScopeBinding(sessionID)?.files??null}function isArchitect(sessionId){let activeAgent=swarmState.activeAgent.get(sessionId);if(activeAgent){if(stripKnownSwarmPrefix(activeAgent)===ORCHESTRATOR_NAME)return!0}let session=swarmState.agentSessions.get(sessionId);if(session){if(stripKnownSwarmPrefix(session.agentName)===ORCHESTRATOR_NAME)return!0}return!1}function handleInterpreterGating(sessionID,tool){let normalizedTool=normalizeToolName(tool).toLowerCase();if(normalizedTool!=="bash"&&normalizedTool!=="shell")return;if(!interpreterAllowedAgents)return;let rawAgent=swarmState.activeAgent.get(sessionID),agentRole=rawAgent?stripKnownSwarmPrefix(rawAgent).toLowerCase():"unknown";if(!interpreterAllowedAgents.some((a)=>a.toLowerCase()===agentRole))throw Error(`BLOCKED: Agent "${agentRole}" is not permitted to use the bash/shell interpreter. Allowed agents: [${interpreterAllowedAgents.map((a)=>`"${a}"`).join(", ")}]`)}function checkDestructiveCommand(sessionID,tool,args2){if(tool!=="bash"&&tool!=="shell")return;if(cfg.block_destructive_commands===!1)return;let rawAgent=swarmState.activeAgent.get(sessionID),declaredScope=(rawAgent?stripKnownSwarmPrefix(rawAgent).toLowerCase():"unknown")==="coder"?resolveDeclaredScope(sessionID):null,toolArgs=args2,rawCommand=typeof toolArgs?.command==="string"?toolArgs.command.trim():"";if(!rawCommand)return;let cwd=effectiveDirectory,command=dcNormalizeCommand(rawCommand);if(/:\s*\(\s*\)\s*\{[^}]*\|[^}]*:/.test(command))throw Error("BLOCKED: Potentially destructive shell command detected: fork bomb pattern");let unwrapped=dcUnwrapWrappers(command),outerSegments=dcSplitSegments(command),innerSegments=dcSplitSegments(unwrapped),perSegmentUnwrapped=outerSegments.map((s)=>dcUnwrapWrappers(s)),allSegments=[...new Set([...outerSegments,...innerSegments,...perSegmentUnwrapped])];for(let segment of allSegments){let seg=segment.trim();if(!seg)continue;let junctionBlock=dcCheckJunctionCreation(seg,cwd);if(junctionBlock)throw Error(junctionBlock);let rmMatch=/^rm\s+((?:-\S+\s+)+)(.+)$/.exec(seg),rmFlagsPart=rmMatch?.[1]??"",rmHasRecursiveOrForce=/(?:^|\s)-[A-Za-z]*[rRfF]/.test(rmFlagsPart)||/(?:^|\s)--(?:recursive|force)\b/.test(rmFlagsPart);if(rmMatch&&rmHasRecursiveOrForce){let targetPart=rmMatch[2].trim(),targets=targetPart.split(/\s+/),validateBlock=dcValidateTargets(targets,cwd);if(validateBlock)throw Error(validateBlock);if(!targets.every((t)=>DC_SAFE_TARGETS.has(t.replace(/^["']|["']$/g,"").trim()))){if(!(declaredScope!=null&&declaredScope.length>0&&targets.every((t)=>isInDeclaredScope2(t.replace(/^["']|["']$/g,"").trim(),declaredScope,cwd))))throw Error(`BLOCKED: Potentially destructive shell command: rm with recursive/force flags on unsafe path(s): ${targetPart}`)}}if(/^(?:rmdir|rd)(?:\.exe)?\s+.*\/[sS]/i.test(seg)){let targets=dcExtractWindowsCmdTargets(seg);if(targets.length===0)throw Error("BLOCKED: Windows recursive directory delete (rmdir /s or rd /s) detected. Verify the target is not a junction/symlink.");let validateBlock=dcValidateTargets(targets,cwd);if(validateBlock)throw Error(validateBlock);if(!targets.every((t)=>DC_SAFE_TARGETS.has(t.trim()))){if(!(declaredScope!=null&&declaredScope.length>0&&targets.every((t)=>isInDeclaredScope2(t.trim(),declaredScope,cwd))))throw Error(`BLOCKED: Windows recursive directory delete on unsafe path(s): ${targets.join(", ")}`)}}if(/^del(?:\.exe)?\s+.*\/[sS]/i.test(seg)){let targets=dcExtractWindowsCmdTargets(seg);if(targets.length>0){let validateBlock=dcValidateTargets(targets,cwd);if(validateBlock)throw Error(validateBlock);if(!targets.every((t)=>DC_SAFE_TARGETS.has(t.trim()))){if(!(declaredScope!=null&&declaredScope.length>0&&targets.every((t)=>isInDeclaredScope2(t.trim(),declaredScope,cwd))))throw Error(`BLOCKED: Windows recursive file delete (del /s) on unsafe path(s): ${targets.join(", ")}`)}}}if(/^(?:Remove-Item|ri|rm|rmdir|del|erase|rd)\b.*-[Rr]ecurse\b/i.test(seg)||/^(?:Remove-Item|ri|rm|rmdir|del|erase|rd)\b.*-[Rr]\b/i.test(seg)){let targets=dcExtractPowerShellTargets(seg);if(targets.length>0){let validateBlock=dcValidateTargets(targets,cwd);if(validateBlock)throw Error(validateBlock);if(!targets.every((t)=>DC_SAFE_TARGETS.has(t.trim()))){if(!(declaredScope!=null&&declaredScope.length>0&&targets.every((t)=>isInDeclaredScope2(t.trim(),declaredScope,cwd))))throw Error(`BLOCKED: PowerShell recursive delete on unsafe path(s): ${targets.join(", ")}`)}}else throw Error("BLOCKED: PowerShell Remove-Item with -Recurse detected — cannot verify target safety")}if(/Get-ChildItem\b.*\|\s*Remove-Item\b.*-[Rr]ecurse/i.test(seg)||/gci\b.*\|\s*ri\b.*-[Rr]ecurse/i.test(seg))throw Error('BLOCKED: PowerShell pipeline "Get-ChildItem | Remove-Item -Recurse" detected — verify target safety and avoid recursive deletion through symlinks/junctions');if(/^vssadmin(?:\.exe)?\s+delete\b/i.test(seg))throw Error('BLOCKED: "vssadmin delete" detected — deletes Volume Shadow Copies (ransomware-grade operation)');if(/^wbadmin(?:\.exe)?\s+delete\b/i.test(seg))throw Error('BLOCKED: "wbadmin delete" detected — deletes Windows backup catalog (ransomware-grade operation)');if(/^diskpart(?:\.exe)?$/i.test(seg))throw Error('BLOCKED: "diskpart" detected — interactive disk partitioning tool');if(/^bcdedit(?:\.exe)?\s+\/delete\b/i.test(seg))throw Error('BLOCKED: "bcdedit /delete" detected — modifies Windows boot configuration');if(/^sdelete(?:\.exe)?\s+/i.test(seg))throw Error('BLOCKED: "sdelete" detected — secure file deletion (Sysinternals)');if(/^fsutil(?:\.exe)?\s+reparsepoint\s+delete\b/i.test(seg)||/^fsutil(?:\.exe)?\s+file\s+setzerodata\b/i.test(seg))throw Error('BLOCKED: "fsutil" destructive subcommand detected');if(/^takeown(?:\.exe)?\s+.*\/[rR]\b/i.test(seg))throw Error('BLOCKED: "takeown /R" (recursive ownership takeover) detected — often precedes destructive operations');if(/^cipher(?:\.exe)?\s+\/[wW]\b/i.test(seg))throw Error('BLOCKED: "cipher /w" detected — overwrites free disk space (data wipe operation)');if(/^format\s+[A-Za-z]:/i.test(seg))throw Error("BLOCKED: Windows disk format command detected");if(/^robocopy(?:\.exe)?\s+.*\/(?:MIR|mir)\b/.test(seg))throw Error(`BLOCKED: "robocopy /MIR" (mirror) detected — can delete files in the destination that don't exist in the source`);if(/^chmod\s+.*-[rR]\b.*000\b/.test(seg))throw Error('BLOCKED: "chmod -R 000" detected — removes all permissions recursively');if(/^chattr\s+.*\+i\b/.test(seg))throw Error('BLOCKED: "chattr +i" detected — makes files immutable');if(/^icacls(?:\.exe)?\s+.*\/deny\b/i.test(seg))throw Error('BLOCKED: "icacls /deny" detected — denies filesystem permissions');if(/^dd\b.*\bif=\/dev\/(zero|null|urandom)\b/.test(seg))throw Error('BLOCKED: "dd" with /dev/zero, /dev/null, or /dev/urandom as input detected — data wipe operation');if(/^git\s+push\b.*?(--force(?!-with-lease)|-f)\b/.test(seg))throw Error("BLOCKED: Force push detected — git push --force is not allowed (use --force-with-lease instead)");if(/^git\s+reset\s+--hard/.test(seg))throw Error('BLOCKED: "git reset --hard" detected — use --soft or --mixed with caution');if(/^git\s+reset\s+--mixed\s+\S+/.test(seg))throw Error('BLOCKED: "git reset --mixed" with a target branch/commit is not allowed');if(/^git\s+clean\s+.*-[fF].*[dD]/.test(seg))throw Error('BLOCKED: "git clean -fd" detected — permanently deletes untracked files and directories');let worktreeRemoveMatch=/^git\s+worktree\s+remove\s+(.+)$/i.exec(seg);if(worktreeRemoveMatch){let normalizedArgs=worktreeRemoveMatch[1].trim().split(/\s+/).filter(Boolean).map((a)=>a.replace(/^["']|["']$/g,"")),isForceToken=(a)=>{let lower=a.toLowerCase();return/^-f+$/.test(lower)||lower.length>2&&"--force".startsWith(lower)};if(normalizedArgs.some(isForceToken)){let pathArgs=normalizedArgs.filter((a)=>!a.startsWith("-")),target=pathArgs.length===1?pathArgs[0].trim():null;if(!(target!=null&&target.length>0&&(declaredScope!=null&&declaredScope.length>0&&isInDeclaredScope2(target,declaredScope,cwd)||isPathUnderSwarmWorktreeBase(target,cwd,worktreeBaseDirOverrides??[]))))throw Error('BLOCKED: "git worktree remove --force" detected — can delete working tree contents')}}if(/^rsync\b.*--delete(?:-after|-before|-during|-delay)?\b/.test(seg)){let rsyncTarget=seg.split(/\s+/).slice(1).filter((a)=>!a.startsWith("-")&&!a.includes("@")).pop();if(!(rsyncTarget!=null&&declaredScope!=null&&declaredScope.length>0&&isInDeclaredScope2(rsyncTarget,declaredScope,cwd)))throw Error('BLOCKED: "rsync --delete" detected — can delete files in the destination. Verify source is not empty.')}if(/^kubectl\s+delete\b/.test(seg))throw Error('BLOCKED: "kubectl delete" detected — destructive cluster operation');if(/^docker\s+system\s+prune\b/.test(seg))throw Error('BLOCKED: "docker system prune" detected — destructive container operation');if(/^\s*DROP\s+(TABLE|DATABASE|SCHEMA)\b/i.test(seg))throw Error("BLOCKED: SQL DROP command detected — destructive database operation");if(/^\s*TRUNCATE\s+TABLE\b/i.test(seg))throw Error("BLOCKED: SQL TRUNCATE command detected — destructive database operation");if(/^mkfs[./]/.test(seg))throw Error("BLOCKED: Disk format command (mkfs) detected — disk formatting operation");if(/^\\?mv\s/i.test(seg)){let mvMatch=seg.match(/^\\?mv\s+(.+)$/i);if(mvMatch){let argsStr=mvMatch[1].replace(/["']/g,"");if(/\.swarm(?:[\x5c/\s]|$)/.test(argsStr))throw Error('BLOCKED: "mv" targeting .swarm/ detected — move operations under .swarm/ are not allowed from shell commands')}}if(/^\\?(?:move|ren)(?:\.exe)?\s/i.test(seg)){let moveMatch=seg.match(/^\\?(?:move|ren)(?:\.exe)?\s+(.+)$/i);if(moveMatch){let argsStr=moveMatch[1].replace(/["']/g,"");if(/\.swarm(?:[\x5c/\s]|$)/i.test(argsStr))throw Error('BLOCKED: "move" or "ren" targeting .swarm/ detected — move/rename operations under .swarm/ are not allowed from shell commands')}}if(/^\\?(?:Move-Item|Rename-Item|move|mi|mv|ren|rni)\b.*\.swarm(?:[\x5c/\s]|$)/i.test(seg))throw Error("BLOCKED: PowerShell Move-Item or Rename-Item targeting .swarm/ detected — move/rename operations under .swarm/ are not allowed from shell commands");if(/^\\?rm\b/i.test(seg)&&!/^\\?rm\s+(?:-[a-zA-Z]*[rR][a-zA-Z]*|--recursive)\b/i.test(seg)&&/\.swarm(?:[\x5c/\s]|$)/i.test(seg))throw Error('BLOCKED: "rm" targeting .swarm/ detected — deleting files under .swarm/ is not allowed from shell commands');if(/\bcp\b.*\.swarm(?:[\x5c/\s]|$)/i.test(seg)&&/\brm\b.*\.swarm(?:[\x5c/\s]|$)/i.test(seg))throw Error('BLOCKED: "cp" of .swarm/ file followed by "rm" of .swarm/ source detected — copy-and-delete bypass is not allowed');if(/^rsync\b.*--remove-source-files\b/i.test(seg)&&/\.swarm(?:[\x5c/\s]|$)/i.test(seg))throw Error('BLOCKED: "rsync" with delete-source flag targeting .swarm/ detected — archive with source deletion under .swarm/ is not allowed');if(/^tar\b.*--remove-files\b/i.test(seg)&&/\.swarm(?:[\x5c/\s]|$)/i.test(seg))throw Error('BLOCKED: "tar" with delete-source flag targeting .swarm/ detected — archive with source deletion under .swarm/ is not allowed');if(/^zip\b.*\s-m\b/i.test(seg)&&/\.swarm(?:[\x5c/\s]|$)/i.test(seg))throw Error('BLOCKED: "zip" with delete-source flag targeting .swarm/ detected — archive with source deletion under .swarm/ is not allowed');if(/^7z\b.*\s-sdel\b/i.test(seg)&&/\.swarm(?:[\x5c/\s]|$)/i.test(seg))throw Error('BLOCKED: "7z" with delete-source flag targeting .swarm/ detected — archive with source deletion under .swarm/ is not allowed');{let HUMAN_ONLY_SWARM_SUBCOMMANDS=HUMAN_ONLY_SWARM_COMMANDS,probe2=seg.replace(/^(?:[A-Za-z_][A-Za-z0-9_]*=\S+\s+)+/,"").replace(/^eval(?:\s+--)?\s+["']?/,"").replace(/["']\s*$/,"").replace(/^\$\(\s*/,"").replace(/^\(\s*/,"").replace(/\s*\)$/,"").replace(/^`/,"").replace(/`$/,"").trim();for(let i=0;i<4;i++){let before=probe2;if(probe2=probe2.replace(/^env\s+(?:-i\b|--ignore-environment\b|-u\s+\S+|-[a-zA-Z]+\s+)*\s*/,"").replace(/^command\s+(?:-[pvV]\s+)*/,"").replace(/^(?:[A-Za-z_][A-Za-z0-9_]*=\S+\s+)+/,"").trim(),probe2===before)break}let swarmCliBypassMatch=probe2.match(/^\\?(?:bunx|npx|pnpx|npm(?:\s+(?:exec|x)(?:\s+--)?)?|pnpm(?:\s+(?:dlx|exec))?|yarn(?:\s+(?:dlx|exec))?|bun(?:\s+x)?|node|deno\s+run|tsx|ts-node)\b[^|;&]*?\bopencode-swarm\b[^|;&]*?\brun\s+([A-Za-z0-9_-]+(?:\s+(?!-)[A-Za-z0-9_-]+)?)/i);if(swarmCliBypassMatch){let normalized=swarmCliBypassMatch[1].trim().split(/\s+/).join(" "),firstToken=normalized.includes(" ")?normalized.split(" ")[0]:normalized,cmdName=HUMAN_ONLY_SWARM_SUBCOMMANDS.has(normalized)?normalized:firstToken;if(HUMAN_ONLY_SWARM_SUBCOMMANDS.has(normalized)||HUMAN_ONLY_SWARM_SUBCOMMANDS.has(firstToken))throw Error(`BLOCKED: "${cmdName}" is a human-only swarm command and may not be invoked from shell by an agent. Present the situation to the user and ask them to run \`/swarm ${cmdName}\` themselves.`)}let swarmBareBinMatch=probe2.match(/^\\?opencode-swarm\b[^|;&]*?\brun\s+([A-Za-z0-9_-]+(?:\s+(?!-)[A-Za-z0-9_-]+)?)/i);if(swarmBareBinMatch){let normalized=swarmBareBinMatch[1].trim().split(/\s+/).join(" "),firstToken=normalized.includes(" ")?normalized.split(" ")[0]:normalized,cmdName=HUMAN_ONLY_SWARM_SUBCOMMANDS.has(normalized)?normalized:firstToken;if(HUMAN_ONLY_SWARM_SUBCOMMANDS.has(normalized)||HUMAN_ONLY_SWARM_SUBCOMMANDS.has(firstToken))throw Error(`BLOCKED: "${cmdName}" is a human-only swarm command and may not be invoked from shell by an agent. Present the situation to the user and ask them to run \`/swarm ${cmdName}\` themselves.`)}let swarmCliPathMatch=probe2.match(/\bcli[/\\]+index\.[mc]?(?:js|ts)\b[^|;&]*?\brun\s+([A-Za-z0-9_-]+(?:\s+(?!-)[A-Za-z0-9_-]+)?)/i);if(swarmCliPathMatch){let normalized=swarmCliPathMatch[1].trim().split(/\s+/).join(" "),firstToken=normalized.includes(" ")?normalized.split(" ")[0]:normalized,cmdName=HUMAN_ONLY_SWARM_SUBCOMMANDS.has(normalized)?normalized:firstToken;if(HUMAN_ONLY_SWARM_SUBCOMMANDS.has(normalized)||HUMAN_ONLY_SWARM_SUBCOMMANDS.has(firstToken))throw Error(`BLOCKED: "${cmdName}" is a human-only swarm command and may not be invoked from shell by an agent. Present the situation to the user and ask them to run \`/swarm ${cmdName}\` themselves.`)}}{let normForPathCheck=seg.replace(/\\/g,"/").replace(/\/(?:\.\/+)+/g,"/").replace(/\/{2,}/g,"/");if(/\.swarm\/spec-staleness\.json\b/i.test(normForPathCheck)){let trimmed=seg.trim(),looksReadOnly=/^(?:cat|less|more|head|tail|file|stat|ls|dir|Get-Content|gc|Get-Item|gi|type)\b/i.test(trimmed),hasWriteRedirect=/>{1,2}\s*[^\s>]/.test(trimmed);if(!looksReadOnly||hasWriteRedirect)throw Error("BLOCKED: shell command targeting .swarm/spec-staleness.json detected. This file is system-managed and gates plan-mutating tools while spec drift is unresolved. Present the drift to the user and ask them to run /swarm clarify or /swarm acknowledge-spec-drift.")}}}}function detectShellType(command){if(/^(powershell|ps1|\.\s*\\|Remove-Item|Copy-Item|Move-Item|Start-Process|New-Object|Get-ChildItem|Set-Content|Add-Content|Out-File|Invoke-WebRequest|Invoke-RestMethod|IEX|iex)\b/i.test(command)||command.includes("$PSVersionTable")||command.includes("$env:")||/-EncodedCommand|-ExecutionPolicy|Enable-PSRemoting/i.test(command))return"powershell";if(/^(cmd|c:\/|set \w+=|\.\d+|del \/|rd \/|mkdir|chdir|echo |copy |move |ren |fc |diskpart)/i.test(command)||/%[^%\s]+%/.test(command)||/\b(set|echo|if|exist)\s+/i.test(command))return"cmd";if(/^(bash|sh|zsh|ksh|ash|dash|fish|ruby|python|perl|npm|yarn|node|cargo|go|rustc|mv|cp|rm|chmod|chown|mkdir|ln|tar|gzip|gunzip|ssh|scp|rsync|sudo|su -|export |source |\.\s+)/i.test(command)||command.includes("|")||command.includes("&&")||command.includes(">>")||/\$\{?\w+\}?/.test(command))return"bash";return"unix"}function checkShellWriteScope(sessionID,callID,tool,args2,commandOverride){if(tool!=="bash"&&tool!=="shell")return;let toolArgs=args2,command=typeof commandOverride==="string"?commandOverride.trim():typeof toolArgs?.command==="string"?toolArgs.command.trim():"";if(!command)return;let normalizedTool=tool,shellType="posix";if(normalizedTool==="bash")shellType="posix";else shellType=detectShellType(command);if(detectInteractiveSession(command,shellType==="unix"||shellType==="bash"?"posix":shellType))throw Error("BLOCKED: interactive/session tool detected — rejecting for safety");let detect=(c)=>normalizedTool==="bash"?detectPosixWrites(c):shellType==="powershell"||shellType==="cmd"?detectWindowsWrites(c,shellType):detectPosixWrites(c),primaryAnalysis=detect(command);if(primaryAnalysis.parseError)throw Error("BLOCKED: bash write detection failed to parse command — rejecting for safety");let commandSegments=dcSplitSegments(command),unwrappedSegments=commandSegments.map((s)=>dcUnwrapWrappers(s)),didUnwrap=commandSegments.some((s,i)=>unwrappedSegments[i]!==s),detectionCommand=didUnwrap?unwrappedSegments.join(`
701
- `):command,analysis=didUnwrap?detect(detectionCommand):primaryAnalysis;if(analysis.parseError)throw Error("BLOCKED: bash write detection failed to parse command — rejecting for safety");if(!analysis.hasWrites||analysis.writes.length===0)return;let declaredScope=resolveDeclaredScope(sessionID),shellWriteAgent=swarmState.activeAgent.get(sessionID);if(!shellWriteAgent)throw Error(`WRITE BLOCKED: No active agent registered for session "${sessionID}". Call startAgentSession before issuing shell write operations.`);let shellWriteRole=stripKnownSwarmPrefix(shellWriteAgent).toLowerCase(),isArch=shellWriteRole==="architect",isCoder=shellWriteRole==="coder";if(isCoder&&(!declaredScope||declaredScope.length===0))throw Error(`SCOPE_NOT_DECLARED: ${shellWriteAgent} cannot perform shell writes without an active Task-correlated scope binding.`);let noScopeLenient=!isArch&&!isCoder&&(!declaredScope||declaredScope.length===0),resolvedWrites=resolveWriteTargets(detectionCommand,analysis.writes,effectiveDirectory);for(let write of resolvedWrites){if(write.resolvedPath===null){if(write.original.category==="here_doc"&&write.original.path===null)continue;if(write.original.category==="interpreter_eval")throw Error(`BLOCKED: ${write.original.operator} evaluates inline code whose write targets cannot be verified against the declared scope — rejecting for safety. Write files with the write/edit tools or a checked-in script, and invoke installed tools directly (e.g. \`pytest\`, \`ruff\`) instead of an inline \`python -c\` / \`node -e\` eval.`);throw Error(`BLOCKED: bash/shell write to a dynamic path target${write.original.path?` "${write.original.path}"`:""} that cannot be statically resolved (shell variable or command substitution) — rejecting for safety.`)}if(universalDenyPrefixes.length>0){let normalizedPath2=path61.relative(path61.resolve(effectiveDirectory),path61.resolve(effectiveDirectory,write.resolvedPath)).replace(/\\/g,"/");for(let prefix of universalDenyPrefixes)if(normalizedPath2.toLowerCase().startsWith(prefix.toLowerCase()))throw Error(`WRITE BLOCKED: Agent "${shellWriteAgent}" is not authorised to write "${write.resolvedPath}" (via shell). Reason: Path is under universal deny prefix "${prefix}"`)}if(noScopeLenient)continue;let authorityCheck=checkFileAuthorityWithRules(shellWriteAgent,write.resolvedPath,effectiveDirectory,precomputedAuthorityRules,{declaredScope});if(!authorityCheck.allowed)throw Error(`WRITE BLOCKED: Agent "${shellWriteAgent}" is not authorised to write "${write.resolvedPath}" (via shell). Reason: ${authorityCheck.reason}`);if(declaredScope&&declaredScope.length>0&&!isInDeclaredScope2(write.resolvedPath,declaredScope,effectiveDirectory))throw Error(`bash write detected outside declared scope: ${write.resolvedPath} (original: ${write.original.path})`);if(isCoder){let writeBinding=resolveActiveScopeBinding(sessionID);if(writeBinding?.activation==="active"&&writeBinding.parentOwnerSessionId&&writeBinding.parentCallId){let relativeTarget=path61.relative(path61.resolve(effectiveDirectory),path61.resolve(effectiveDirectory,write.resolvedPath)).replace(/\\/g,"/");if(recordReviewerScopeGenerationFile({parentSessionID:writeBinding.parentOwnerSessionId,taskId:writeBinding.taskId,coderCallID:writeBinding.parentCallId,file:relativeTarget}))rememberReviewerScopeWrite?.({callID,parentSessionID:writeBinding.parentOwnerSessionId,taskId:writeBinding.taskId,coderCallID:writeBinding.parentCallId,file:relativeTarget})}}}}async function applySandboxExecution(sessionID,callID,tool,args2,agent,command,auditPath,auditEnabled){if(tool!=="bash"&&tool!=="shell")return;let executor=await getExecutor();if(!executor||!executor.isAvailable()){if(!hasWarnedSandboxUnavailable)hasWarnedSandboxUnavailable=!0,warn("[guardrails] sandbox executor unavailable; shell commands will run unsandboxed");appendGuardrailDecision({type:"sandbox_skip",ts:new Date().toISOString(),sessionID,agent,tool,command,executorMechanism:executor?.mechanism??"none",skipReason:"executor not available"},{auditPath,enabled:auditEnabled});return}let toolArgs=args2,rawCommand=typeof toolArgs?.command==="string"?toolArgs.command.trim():"";if(!rawCommand||!toolArgs)return;let declaredPaths=resolveDeclaredScope(sessionID);if(!declaredPaths||declaredPaths.length===0)return;let resolved=resolveScopePaths(declaredPaths,effectiveDirectory);if(resolved.paths.length===0)return;try{let wrappedCommand=executor.wrapCommand(rawCommand,resolved.paths);toolArgs.command=wrappedCommand,markToolExecutionSandboxWrapped(sessionID,callID),appendGuardrailDecision({type:"sandbox_wrap",ts:new Date().toISOString(),sessionID,agent,tool,command:rawCommand,executorMechanism:executor.mechanism},{auditPath,enabled:auditEnabled})}catch(err){forgetToolExecution(sessionID,callID);let message=`[sandbox] BLOCKED: Failed to wrap command with ${executor.mechanism}: ${err}. Command will not be executed unsandboxed.`,circuit=recordNonTransientFailure(sessionID,"sandbox_wrapper_failure",message);if(circuit?.hardStop)throw Error(nonTransientHardStopMessage(circuit));throw Error(message)}}async function checkGateLimits(params){let{sessionID,window:window2,agentConfig,elapsedMinutes,repetitionCount}=params;if(agentConfig.max_tool_calls>0&&window2.toolCalls>=agentConfig.max_tool_calls)throw window2.hardLimitHit=!0,telemetry.hardLimitHit(sessionID,window2.agentName,"tool_calls",window2.toolCalls),warn("Circuit breaker: tool call limit hit",{sessionID,agentName:window2.agentName,invocationId:window2.id,windowKey:`${window2.agentName}:${window2.id}`,resolvedMaxCalls:agentConfig.max_tool_calls,currentCalls:window2.toolCalls}),Error(`\uD83D\uDED1 LIMIT REACHED: Tool calls exhausted (${window2.toolCalls}/${agentConfig.max_tool_calls}). Finish the current operation and return your progress summary.`);if(agentConfig.max_duration_minutes>0&&elapsedMinutes>=agentConfig.max_duration_minutes)throw window2.hardLimitHit=!0,telemetry.hardLimitHit(sessionID,window2.agentName,"duration",elapsedMinutes),warn("Circuit breaker: duration limit hit",{sessionID,agentName:window2.agentName,invocationId:window2.id,windowKey:`${window2.agentName}:${window2.id}`,resolvedMaxMinutes:agentConfig.max_duration_minutes,elapsedMinutes:Math.floor(elapsedMinutes)}),Error(`\uD83D\uDED1 LIMIT REACHED: Duration exhausted (${Math.floor(elapsedMinutes)}/${agentConfig.max_duration_minutes} min). Finish the current operation and return your progress summary.`);if(repetitionCount>=agentConfig.max_repetitions)throw window2.hardLimitHit=!0,telemetry.hardLimitHit(sessionID,window2.agentName,"repetition",repetitionCount),Error(`\uD83D\uDED1 LIMIT REACHED: Repeated the same tool call ${repetitionCount} times. This suggests a loop. Return your progress summary.`);if(window2.consecutiveErrors>=agentConfig.max_consecutive_errors)throw window2.hardLimitHit=!0,telemetry.hardLimitHit(sessionID,window2.agentName,"consecutive_errors",window2.consecutiveErrors),Error(`\uD83D\uDED1 LIMIT REACHED: ${window2.consecutiveErrors} consecutive tool errors detected. Return your progress summary with details of what went wrong. Run /swarm reset-session to clear the circuit breaker without restarting your session.`);let idleMinutes=(Date.now()-window2.lastSuccessTimeMs)/60000;if(idleMinutes>=agentConfig.idle_timeout_minutes)throw window2.hardLimitHit=!0,telemetry.hardLimitHit(sessionID,window2.agentName,"idle_timeout",idleMinutes),warn("Circuit breaker: idle timeout hit",{sessionID,agentName:window2.agentName,invocationId:window2.id,windowKey:`${window2.agentName}:${window2.id}`,idleTimeoutMinutes:agentConfig.idle_timeout_minutes,idleMinutes:Math.floor(idleMinutes)}),Error(`\uD83D\uDED1 LIMIT REACHED: No successful tool call for ${Math.floor(idleMinutes)} minutes (idle timeout: ${agentConfig.idle_timeout_minutes} min). This suggests the agent may be stuck. Return your progress summary.`);if(!window2.warningIssued){let toolPct=agentConfig.max_tool_calls>0?window2.toolCalls/agentConfig.max_tool_calls:0,durationPct=agentConfig.max_duration_minutes>0?elapsedMinutes/agentConfig.max_duration_minutes:0,repPct=repetitionCount/agentConfig.max_repetitions,errorPct=window2.consecutiveErrors/agentConfig.max_consecutive_errors,reasons=[];if(agentConfig.max_tool_calls>0&&toolPct>=agentConfig.warning_threshold)reasons.push(`tool calls ${window2.toolCalls}/${agentConfig.max_tool_calls}`);if(durationPct>=agentConfig.warning_threshold)reasons.push(`duration ${Math.floor(elapsedMinutes)}/${agentConfig.max_duration_minutes} min`);if(repPct>=agentConfig.warning_threshold)reasons.push(`repetitions ${repetitionCount}/${agentConfig.max_repetitions}`);if(errorPct>=agentConfig.warning_threshold)reasons.push(`errors ${window2.consecutiveErrors}/${agentConfig.max_consecutive_errors}`);if(reasons.length>0)window2.warningIssued=!0,window2.warningReason=reasons.join(", ")}}function handleDelegatedWriteTracking(sessionID,tool,args2){if(!swarmState.agentSessions.get(sessionID)?.delegationActive&&isArchitect(sessionID)){let coderDeleg=isAgentDelegation(tool,args2);if(coderDeleg.isDelegation&&coderDeleg.targetAgent==="coder"){let coderSession=swarmState.agentSessions.get(sessionID);if(coderSession){let taskId=coderSession.currentTaskId??coderSession.lastCoderDelegationTaskId??`${sessionID}:unknown`;if(coderSession.currentTaskId=taskId,resetModifiedFilesForTask(coderSession,taskId),!coderSession.revisionLimitHit)coderSession.coderRevisions=0}}}}function isAgentDelegation(toolName,args2){let normalized=normalizeToolName(toolName);if(normalized!=="Task"&&normalized!=="task")return{isDelegation:!1,targetAgent:null};let argsObj=args2;if(!argsObj)return{isDelegation:!1,targetAgent:null};let subagentType=argsObj.subagent_type;if(typeof subagentType==="string")return{isDelegation:!0,targetAgent:stripKnownSwarmPrefix(subagentType)};return{isDelegation:!1,targetAgent:null}}function handleLoopDetection(sessionID,tool,args2){if(tool!=="Task")return;let loopArgs=args2,loopResult=detectLoop(sessionID,tool,loopArgs);if(loopResult.count>=5)throw Error(`CIRCUIT BREAKER: Delegation loop detected (${loopResult.count} identical patterns). Session paused. Ask the user for guidance.`);else if(loopResult.count>=3&&loopResult.count<5){let agentName=typeof loopArgs?.subagent_type==="string"?loopArgs.subagent_type:"agent",loopSession=swarmState.agentSessions.get(sessionID);if(loopSession){let loopPattern=loopResult.pattern,modifiedFiles=loopSession.currentTaskId?getModifiedFilesForTask(loopSession,loopSession.currentTaskId):[],accomplishmentSummary=modifiedFiles.length>0?`Modified ${modifiedFiles.length} file(s): ${modifiedFiles.slice(0,3).join(", ")}${modifiedFiles.length>3?"...":""}`:"No files modified yet",alternativeSuggestions={coder:"Try a different task spec, simplify the constraint, or escalate to user",reviewer:"Try a different review dimension or escalate to user",test_engineer:"Run a specific test file with targeted scope",explorer:"Narrow the search scope or check a specific file directly"},cleanAgent=stripKnownSwarmPrefix(agentName).toLowerCase(),suggestion=alternativeSuggestions[cleanAgent]??"Try a different agent, different instructions, or escalate to the user";loopSession.loopWarningPending={agent:agentName,message:[`LOOP DETECTED: Pattern "${loopPattern}" repeated 3 times.`,`Agent: ${agentName}`,`Accomplished: ${accomplishmentSummary}`,`Suggested action: ${suggestion}`,"If still stuck after trying alternatives, escalate to the user."].join(`
702
- `),timestamp:Date.now()}}}}function handleTestSuiteBlocking(tool,args2){if(tool!=="bash"&&tool!=="shell")return;let bashArgs=args2,cmd=(typeof bashArgs?.command==="string"?bashArgs.command:"").trim();if(/^(bun\s+test|npm\s+test|npx\s+vitest|bunx\s+vitest)\b/.test(cmd)){let tokens=cmd.split(/\s+/),runnerTokenCount=tokens[0]==="npx"||tokens[0]==="bunx"?3:2;if(!tokens.slice(runnerTokenCount).some((token)=>token.length>0&&!token.startsWith("-")&&(token.includes("/")||token.includes("\\")||token.endsWith(".ts")||token.endsWith(".js")||token.endsWith(".tsx")||token.endsWith(".jsx")||token.endsWith(".mts")||token.endsWith(".mjs"))))throw Error("BLOCKED: Full test suite execution is not allowed in-session. Run a specific test file instead: bun test path/to/file.test.ts")}}function extractAllPatchPayloads(args2){let toolArgs=args2;if(!toolArgs)return[];let out=[];for(let key of["patch","input","diff"]){let v=toolArgs[key];if(typeof v==="string"&&v.length>0)out.push(v)}let cmd=toolArgs.cmd;if(Array.isArray(cmd)){for(let entry of cmd)if(typeof entry==="string"&&entry.length>0)out.push(entry)}return out}function getHumanOnlyAlternation(){return[...HUMAN_ONLY_SWARM_COMMANDS].map((c)=>c.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).sort((a,b)=>b.length-a.length).join("|")}function patchPayloadHasHumanOnlyInvocation(args2){let payloads=extractAllPatchPayloads(args2);if(payloads.length===0)return!1;let alternation=getHumanOnlyAlternation(),re=new RegExp(`\\bopencode-swarm\\b[\\s\\S]*?\\brun\\s+(${alternation})\\b`,"i");return payloads.some((p)=>re.test(p))}function extractPatchTargetPaths(tool,args2){if(tool!=="apply_patch"&&tool!=="swarm_apply_patch"&&tool!=="patch")return[];let toolArgs=args2,paths=new Set;if(Array.isArray(toolArgs?.files)){for(let f of toolArgs.files)if(typeof f==="string"&&f.length>0&&f!=="/dev/null")paths.add(f)}let patchText=toolArgs?.input??toolArgs?.patch??toolArgs?.diff??(Array.isArray(toolArgs?.cmd)?toolArgs.cmd[1]:void 0);if(typeof patchText!=="string")return Array.from(paths);if(patchText.length>1e6)throw Error("WRITE BLOCKED: Patch payload exceeds 1 MB — authority cannot be verified for all modified paths. Split into smaller patches.");let patchPathPattern=/\*\*\*\s+(?:Update|Add|Delete)\s+File:\s*(.+)/gi,diffPathPattern=/\+\+\+\s+b\/(.+)/gm,gitDiffPathPattern=/^diff --git a\/(.+?) b\/(.+?)$/gm,minusPathPattern=/^---\s+a\/(.+)$/gm,traditionalMinusPattern=/^---\s+([^\s].+?)(?:\t.*)?$/gm,traditionalPlusPattern=/^\+\+\+\s+([^\s].+?)(?:\t.*)?$/gm;for(let match of patchText.matchAll(patchPathPattern))paths.add(match[1].trim());for(let match of patchText.matchAll(diffPathPattern)){let p=match[1].trim();if(p!=="/dev/null")paths.add(p)}for(let match of patchText.matchAll(gitDiffPathPattern)){let aPath=match[1].trim(),bPath=match[2].trim();if(aPath!=="/dev/null")paths.add(aPath);if(bPath!=="/dev/null")paths.add(bPath)}for(let match of patchText.matchAll(minusPathPattern)){let p=match[1].trim();if(p!=="/dev/null")paths.add(p)}for(let match of patchText.matchAll(traditionalMinusPattern)){let p=match[1].trim();if(p!=="/dev/null"&&!p.startsWith("a/")&&!p.startsWith("b/"))paths.add(p)}for(let match of patchText.matchAll(traditionalPlusPattern)){let p=match[1].trim();if(p!=="/dev/null"&&!p.startsWith("a/")&&!p.startsWith("b/"))paths.add(p)}return Array.from(paths)}function handlePlanAndScopeProtection(sessionID,tool,args2){let toolArgs=args2,targetPath=toolArgs?.filePath??toolArgs?.path??toolArgs?.file??toolArgs?.target;if(tool==="apply_patch"||tool==="swarm_apply_patch"||tool==="patch"){if(patchPayloadHasHumanOnlyInvocation(args2))throw Error("BLOCKED: apply_patch/swarm_apply_patch would introduce a script invoking a human-only swarm CLI subcommand. Present the situation to the user and ask them to run the command themselves.")}if(typeof targetPath==="string"&&targetPath.length>0){let resolvedTarget=path61.resolve(effectiveDirectory,targetPath).toLowerCase(),planMdPath=path61.resolve(effectiveDirectory,".swarm","plan.md").toLowerCase(),planJsonPath=path61.resolve(effectiveDirectory,".swarm","plan.json").toLowerCase();if(resolvedTarget===planMdPath||resolvedTarget===planJsonPath)throw Error("PLAN STATE VIOLATION: Direct writes to .swarm/plan.md and .swarm/plan.json are blocked. plan.md is auto-regenerated from plan.json by PlanSyncWorker. Use save_plan for ALL structural plan changes (adding/removing tasks, updating descriptions, dependencies, or phase names). Use update_task_status() for task status only. Use phase_complete() for phase transitions only.");let specStalenessPath=path61.resolve(effectiveDirectory,".swarm","spec-staleness.json").toLowerCase();if(resolvedTarget===specStalenessPath)throw Error("SPEC_DRIFT_VIOLATION: Direct writes to .swarm/spec-staleness.json are blocked. This file is system-managed and gates plan-mutating tools while spec drift is unresolved. Present the drift to the user and ask them to run /swarm clarify or /swarm acknowledge-spec-drift.");let content=toolArgs?.content??toolArgs?.text??toolArgs?.new_string??toolArgs?.newText;if(typeof content==="string"&&new RegExp(`\\bopencode-swarm\\b[\\s\\S]*?\\brun\\s+(${getHumanOnlyAlternation()})\\b`,"i").test(content))throw Error("BLOCKED: write/edit tool would create a script invoking a human-only swarm CLI subcommand. Present the situation to the user and ask them to run the command themselves.")}if(!targetPath&&(tool==="apply_patch"||tool==="swarm_apply_patch"||tool==="patch"))for(let p of extractPatchTargetPaths(tool,args2)){let resolvedP=path61.resolve(effectiveDirectory,p),planMdPath=path61.resolve(effectiveDirectory,".swarm","plan.md").toLowerCase(),planJsonPath=path61.resolve(effectiveDirectory,".swarm","plan.json").toLowerCase(),specStalenessPath=path61.resolve(effectiveDirectory,".swarm","spec-staleness.json").toLowerCase();if(resolvedP.toLowerCase()===planMdPath||resolvedP.toLowerCase()===planJsonPath)throw Error("PLAN STATE VIOLATION: Direct writes to .swarm/plan.md and .swarm/plan.json are blocked. plan.md is auto-regenerated from plan.json by PlanSyncWorker. Use save_plan for ALL structural plan changes (adding/removing tasks, updating descriptions, dependencies, or phase names). Use update_task_status() for task status only. Use phase_complete() for phase transitions only.");if(resolvedP.toLowerCase()===specStalenessPath)throw Error("SPEC_DRIFT_VIOLATION: Direct writes to .swarm/spec-staleness.json are blocked. This file is system-managed and gates plan-mutating tools while spec drift is unresolved. Present the drift to the user and ask them to run /swarm clarify or /swarm acknowledge-spec-drift.");if(isOutsideSwarmDir(p,effectiveDirectory)&&(isSourceCodePath(p)||hasTraversalSegments(p))){let session=swarmState.agentSessions.get(sessionID);if(session)session.architectWriteCount++,warn("Architect direct code edit detected via patch tool",{tool,sessionID,targetPath:p,writeCount:session.architectWriteCount});break}}if(typeof targetPath==="string"&&targetPath.length>0&&isOutsideSwarmDir(targetPath,effectiveDirectory)&&isSourceCodePath(path61.relative(effectiveDirectory,path61.resolve(effectiveDirectory,targetPath)))){let session=swarmState.agentSessions.get(sessionID);if(session){if(session.architectWriteCount++,warn("Architect direct code edit detected",{tool,sessionID,targetPath,writeCount:session.architectWriteCount}),session.lastGateFailure&&Date.now()-session.lastGateFailure.timestamp<120000){let failedGate=session.lastGateFailure.tool,failedTaskId=session.lastGateFailure.taskId;warn("Self-fix after gate failure detected",{failedGate,failedTaskId,currentTool:tool,sessionID}),session.selfFixAttempted=!0}}}}function resolveSessionAndWindow(sessionID){let rawActiveAgent=swarmState.activeAgent.get(sessionID),strippedAgent=rawActiveAgent?stripKnownSwarmPrefix(rawActiveAgent):void 0;if(strippedAgent===ORCHESTRATOR_NAME)return null;if(strippedAgent&&isNativeOpencodeAgent(strippedAgent))return null;let existingSession=swarmState.agentSessions.get(sessionID);if(existingSession){let sessionAgent=stripKnownSwarmPrefix(existingSession.agentName);if(sessionAgent===ORCHESTRATOR_NAME)return null;if(isNativeOpencodeAgent(sessionAgent))return null}let agentName=swarmState.activeAgent.get(sessionID)??ORCHESTRATOR_NAME,session=ensureAgentSession(sessionID,agentName),resolvedName=stripKnownSwarmPrefix(session.agentName);if(resolvedName===ORCHESTRATOR_NAME)return null;if(isNativeOpencodeAgent(resolvedName))return null;let agentConfig=resolveGuardrailsConfig(cfg,session.agentName);if(agentConfig.max_duration_minutes===0&&agentConfig.max_tool_calls===0)return null;if(!getActiveWindow(sessionID)){let fallbackAgent=swarmState.activeAgent.get(sessionID)??session.agentName;if(stripKnownSwarmPrefix(fallbackAgent)!==ORCHESTRATOR_NAME)beginInvocation(sessionID,fallbackAgent)}let window2=getActiveWindow(sessionID);if(!window2)return null;return{agentConfig,window:window2}}function isNativeOpencodeAgent(agentName){return OPENCODE_NATIVE_AGENTS.has(agentName.toLowerCase())}function trackToolCall(window2,tool,args2){if(window2.hardLimitHit)throw Error("\uD83D\uDED1 CIRCUIT BREAKER: Agent blocked. Hard limit was previously triggered. Stop making tool calls and return your progress summary.");window2.toolCalls++;let hash3=hashArgs(args2);if(window2.recentToolCalls.push({tool,argsHash:hash3,timestamp:Date.now()}),window2.recentToolCalls.length>20)window2.recentToolCalls.shift();let repetitionCount=0;if(window2.recentToolCalls.length>0){let lastEntry=window2.recentToolCalls[window2.recentToolCalls.length-1];for(let i=window2.recentToolCalls.length-1;i>=0;i--){let entry=window2.recentToolCalls[i];if(entry.tool===lastEntry.tool&&entry.argsHash===lastEntry.argsHash)repetitionCount++;else break}}let elapsedMinutes=(Date.now()-window2.startedAtMs)/60000;return{repetitionCount,elapsedMinutes}}return async(input,output)=>{assertNonTransientCircuitAllowsTool(input.sessionID);let resolvedSessionWindow=swarmState.agentSessions.has(input.sessionID)||swarmState.activeAgent.has(input.sessionID)?resolveSessionAndWindow(input.sessionID):null;consecutiveNoToolTurns.set(input.sessionID,0),handleDelegatedWriteTracking(input.sessionID,input.tool,output.args),handleLoopDetection(input.sessionID,input.tool,output.args),handleTestSuiteBlocking(input.tool,output.args);let rawShellCommand=(()=>{let bashArgs=output.args;return typeof bashArgs?.command==="string"?bashArgs.command:""})(),normalizedAuditTool=normalizeToolName(input.tool).toLowerCase();if(normalizedAuditTool==="bash"||normalizedAuditTool==="shell")appendGuardrailDecision({type:"shell",ts:new Date().toISOString(),sessionID:input.sessionID,agent:(()=>{let rawAgent=swarmState.activeAgent.get(input.sessionID);return rawAgent?stripKnownSwarmPrefix(rawAgent):"unknown"})(),tool:input.tool,command:(()=>{let bashArgs=output.args,rawCmd=typeof bashArgs?.command==="string"?bashArgs.command:"";return redactShellCommand(rawCmd)})()},{auditPath:shellAuditPath,enabled:shellAuditEnabled});handleInterpreterGating(input.sessionID,input.tool);try{checkDestructiveCommand(input.sessionID,input.tool,output.args)}catch(err){let destructiveCategory=(()=>{let msg=err instanceof Error?err.message:String(err);if(/fork bomb/i.test(msg))return"fork bomb";if(/rm\b.*recursive|recursive.*rm/i.test(msg))return"recursive delete";if(/rmdir|rd\b/i.test(msg))return"recursive directory delete";if(/\bdel\b/i.test(msg))return"recursive file delete";if(/Remove-Item|ri\b/i.test(msg))return"recursive remove";if(/format/i.test(msg))return"disk format";if(/robocopy/i.test(msg))return"mirror sync";if(/chmod.*000/i.test(msg))return"permission wipe";if(/chattr/i.test(msg))return"immutable flag";if(/icacls/i.test(msg))return"permission deny";if(/\bdd\b/i.test(msg))return"data wipe";if(/git push.*--force|git push.*-f/i.test(msg))return"force push";if(/git reset/i.test(msg))return"git reset";if(/git clean/i.test(msg))return"git clean";if(/git worktree/i.test(msg))return"git worktree remove";if(/rsync.*--delete/i.test(msg))return"rsync delete";if(/kubectl delete/i.test(msg))return"kubectl delete";if(/docker system prune/i.test(msg))return"docker prune";if(/DROP\s+TABLE|DROP\s+DATABASE|DROP\s+SCHEMA/i.test(msg))return"sql drop";if(/TRUNCATE\s+TABLE/i.test(msg))return"sql truncate";if(/mkfs/i.test(msg))return"disk format";if(/\bmv\b.*\.swarm/i.test(msg))return"swarm path move";if(/\bmove\b|\bren\b/i.test(msg))return"move/rename";if(/Move-Item|Rename-Item/i.test(msg))return"move/rename";if(/\brm\b.*\.swarm/i.test(msg))return"swarm path delete";if(/cp\b.*\.swarm.*rm\b|rm\b.*\.swarm/i.test(msg))return"copy-and-delete bypass";if(/rsync.*remove-source|tar.*remove-files|zip.*-m\b|7z.*-sdel/i.test(msg))return"archive delete source";if(/human-only swarm command/i.test(msg))return"human-only swarm command";if(/spec-staleness\.json/i.test(msg))return"system file tampering";return"destructive shell command"})();throw appendGuardrailDecision({type:"destructive_block",ts:new Date().toISOString(),sessionID:input.sessionID,agent:(()=>{let rawAgent=swarmState.activeAgent.get(input.sessionID);return rawAgent?stripKnownSwarmPrefix(rawAgent):"unknown"})(),tool:input.tool,command:(()=>{let bashArgs=output.args;return typeof bashArgs?.command==="string"?bashArgs.command:""})(),destructiveCategory},{auditPath:shellAuditPath,enabled:shellAuditEnabled}),err}try{checkShellWriteScope(input.sessionID,input.callID,input.tool,output.args,rawShellCommand)}catch(err){let toolArgs=output.args,declaredScope=resolveDeclaredScope(input.sessionID),declaredScopeText=declaredScope!=null&&declaredScope.length>0?declaredScope.join(", "):"",resolvedScopeText=declaredScope!=null&&declaredScope.length>0?resolveScopePaths(declaredScope,effectiveDirectory).paths.join(", "):"",pathMatch=/[^\s]+/.exec(err instanceof Error?err.message:String(err)),targetPath=(()=>{let p=toolArgs?.filePath??toolArgs?.path??toolArgs?.file??toolArgs?.target;if(typeof p==="string"&&p.length>0)return p;let rawMessage=err instanceof Error?err.message:String(err),extracted=/(?:write|target|file|path|scope|prefix)[^:]*:\s*(?:"([^"]+)"|'([^']+)'|(\S+))/i.exec(rawMessage)??/(?:write|target|file|path)\s+(?:"([^"]+)"|'([^']+)'|(\S+))/i.exec(rawMessage),candidate=extracted!=null?extracted[1]??extracted[2]??extracted[3]??extracted[4]??extracted[5]??extracted[6]:null;if(candidate&&candidate.length>0&&candidate.length<200)return candidate;if(pathMatch)return pathMatch[0];return"<shell write>"})(),agentName=(()=>{let rawAgent=swarmState.activeAgent.get(input.sessionID);return rawAgent?stripKnownSwarmPrefix(rawAgent):"unknown"})();throw appendGuardrailDecision({type:"scope_violation",ts:new Date().toISOString(),sessionID:input.sessionID,agent:agentName,tool:input.tool,path:targetPath,declaredScope:declaredScopeText,resolvedScope:resolvedScopeText,action:"bash"},{auditPath:shellAuditPath,enabled:shellAuditEnabled}),err}let agentNameForSandbox=(()=>{let rawAgent=swarmState.activeAgent.get(input.sessionID);return rawAgent?stripKnownSwarmPrefix(rawAgent):"unknown"})();if(rememberToolExecution(input.sessionID,input.callID,input.tool,rawShellCommand),await applySandboxExecution(input.sessionID,input.callID,input.tool,output.args,agentNameForSandbox,rawShellCommand,shellAuditPath,shellAuditEnabled),enforceSpecDriftGate(effectiveDirectory,input.tool),isArchitect(input.sessionID)&&isWriteTool(input.tool))handlePlanAndScopeProtection(input.sessionID,input.tool,output.args);let resolvedFileTargets=null;if(isWriteTool(input.tool)){let resolution=resolveWriteTargets2(normalizeToolName(input.tool),output.args,{directory:effectiveDirectory});if(resolution.status==="unverifiable")throw Error(`WRITE TARGET UNVERIFIABLE: ${resolution.reason}`);else resolvedFileTargets=resolution.paths}if(isWriteTool(input.tool))for(let targetPath of resolvedFileTargets??[]){let agentName=swarmState.activeAgent.get(input.sessionID);if(!agentName)throw Error(`WRITE BLOCKED: No active agent registered for session "${input.sessionID}". Call startAgentSession before issuing write tool calls.`);let lstatBlock=checkWriteTargetForSymlink(targetPath,effectiveDirectory);if(lstatBlock)throw appendGuardrailDecision({type:"file_write",ts:new Date().toISOString(),sessionID:input.sessionID,agent:agentName,tool:input.tool,path:targetPath,reason:lstatBlock,resolvedScope:(()=>{let scope=resolveDeclaredScope(input.sessionID);return scope!=null&&scope.length>0?scope.join(", "):""})()},{auditPath:shellAuditPath,enabled:shellAuditEnabled}),Error(lstatBlock);if(universalDenyPrefixes.length>0){let normalizedPath2=path61.relative(path61.resolve(effectiveDirectory),path61.resolve(effectiveDirectory,targetPath)).replace(/\\/g,"/");for(let prefix of universalDenyPrefixes)if(normalizedPath2.toLowerCase().startsWith(prefix.toLowerCase()))throw appendGuardrailDecision({type:"file_write",ts:new Date().toISOString(),sessionID:input.sessionID,agent:agentName,tool:input.tool,path:targetPath,reason:`Path is under universal deny prefix "${prefix}"`,resolvedScope:(()=>{let scope=resolveDeclaredScope(input.sessionID);return scope!=null&&scope.length>0?scope.join(", "):""})()},{auditPath:shellAuditPath,enabled:shellAuditEnabled}),Error(`WRITE BLOCKED: Agent "${agentName}" is not authorised to write "${targetPath}". Reason: Path is under universal deny prefix "${prefix}"`)}let writeBinding=resolveActiveScopeBinding(input.sessionID),writeDeclaredScope=writeBinding?.files??null,authorityCheck=checkFileAuthorityWithRules(agentName,targetPath,effectiveDirectory,precomputedAuthorityRules,{declaredScope:writeDeclaredScope});if(!authorityCheck.allowed)throw appendGuardrailDecision({type:"file_write",ts:new Date().toISOString(),sessionID:input.sessionID,agent:agentName,tool:input.tool,path:targetPath,reason:authorityCheck.reason,resolvedScope:(()=>{let scope=writeDeclaredScope;return scope!=null&&scope.length>0?scope.join(", "):""})()},{auditPath:shellAuditPath,enabled:shellAuditEnabled}),Error(`WRITE BLOCKED: Agent "${agentName}" is not authorised to write "${targetPath}". Reason: ${authorityCheck.reason}`);let trackingSession=swarmState.agentSessions.get(input.sessionID),auditContext=trackingSession?.delegationActive?"delegated":"direct",auditOperation=["apply_patch","swarm_apply_patch","patch"].includes(normalizeToolName(input.tool))?"patch":"write";if(isConfigFilePath(targetPath,effectiveDirectory,authorityConfig?.verifier_config_paths)){let normalizedPath2=path61.relative(path61.resolve(effectiveDirectory),path61.resolve(effectiveDirectory,targetPath)).replace(/\\/g,"/"),logEntry={agent:agentName,path:normalizedPath2,allowed:authorityCheck.allowed,type:`${auditContext}_${auditOperation}`};if(!authorityCheck.allowed&&"reason"in authorityCheck)logEntry.reason=authorityCheck.reason;warn("Config file write attempt",logEntry)}if(trackingSession?.delegationActive){let taskId=trackingSession.currentTaskId??trackingSession.lastCoderDelegationTaskId??`${input.sessionID}:unknown`;trackingSession.currentTaskId=taskId,recordModifiedFileForTask(trackingSession,taskId,targetPath)}if(writeBinding?.activation==="active"&&writeBinding.parentOwnerSessionId&&writeBinding.parentCallId){let relativeTarget=path61.relative(path61.resolve(effectiveDirectory),path61.resolve(effectiveDirectory,targetPath)).replace(/\\/g,"/");if(recordReviewerScopeGenerationFile({parentSessionID:writeBinding.parentOwnerSessionId,taskId:writeBinding.taskId,coderCallID:writeBinding.parentCallId,file:relativeTarget}))rememberReviewerScopeWrite?.({callID:input.callID,parentSessionID:writeBinding.parentOwnerSessionId,taskId:writeBinding.taskId,coderCallID:writeBinding.parentCallId,file:relativeTarget})}}if(swarmState.agentSessions.get(input.sessionID)?.prmHardStopPending)throw Error("\uD83D\uDED1 PRM HARD STOP: Pattern escalation maximum reached. Stop tool calls and return progress summary.");let resolved=resolvedSessionWindow;if(!resolved)return;let{agentConfig,window:window2}=resolved,{repetitionCount,elapsedMinutes}=trackToolCall(window2,input.tool,output.args);await checkGateLimits({sessionID:input.sessionID,window:window2,agentConfig,elapsedMinutes,repetitionCount}),setStoredInputArgs(input.callID,output.args)}}var hasWarnedSandboxUnavailable=!1;var init_tool_before=__esm(()=>{init_tool_policy();init_constants();init_schema();init_executor();init_scope_resolver();init_scope_persistence();init_state2();init_telemetry();init_utils();init_core3();init_loop_detector();init_normalize_tool_name();init_shell_write_detect();init_write_target_resolver();init_audit_log();init_destructive_command();init_file_authority();init_guardrails();init_nontransient_circuit();init_stored_input_args();init_helpers()});import*as fsSync7 from"node:fs";import*as path62 from"node:path";function enforceSpecDriftGate(directory,toolName){if(!directory)return;if(!SPEC_DRIFT_BLOCKED_TOOLS.has(toolName))return;let stalePath=path62.join(directory,".swarm","spec-staleness.json");if(fsSync7.existsSync(stalePath)){let diffInfo=null;try{diffInfo=computeSpecDiff(directory)}catch{}let message=`SPEC_DRIFT_BLOCK: tool "${toolName}" is blocked because .swarm/spec-staleness.json exists. Run /swarm clarify to update the spec, or /swarm acknowledge-spec-drift to dismiss, then retry.`;if(diffInfo){let sectionSummary=diffInfo.changedSections.length>0?`
700
+ `;break}try{await _internals33.mkdir(path60.dirname(ctx.auditPath),{recursive:!0}),await _internals33.appendFile(ctx.auditPath,line,"utf-8")}catch(error49){log("guardrail audit: append failed",{auditPath:ctx.auditPath,error:error49})}}var _internals33,REQUIRED_STRING_FIELDS;var init_audit_log=__esm(()=>{init_logger();init_helpers();_internals33={mkdir:fs31.mkdir,appendFile:fs31.appendFile},REQUIRED_STRING_FIELDS=["ts","sessionID","agent","tool","type"]});import*as path61 from"node:path";function createToolBeforeHandler(ctx){let{effectiveDirectory,cfg,precomputedAuthorityRules,universalDenyPrefixes,shellAuditPath,shellAuditEnabled,interpreterAllowedAgents,authorityConfig,consecutiveNoToolTurns,worktreeBaseDirOverrides,rememberReviewerScopeWrite}=ctx,sessionWorkspaceDirectory=(sessionID)=>resolveSessionWorkspaceDirectory(sessionID,effectiveDirectory);function resolveActiveScopeBinding(sessionID){let session=swarmState.agentSessions.get(sessionID),taskId=session?.currentTaskId??null,bindingDirectory=sessionWorkspaceDirectory(sessionID),binding=taskId?resolveAuthorizedScopeBinding({directory:bindingDirectory,taskId,activeSessionId:sessionID}):resolveAuthorizedScopeBindingForSession({directory:bindingDirectory,activeSessionId:sessionID});if(!taskId&&binding&&session)session.currentTaskId=binding.taskId,session.declaredCoderScope=[...binding.files];return binding}function resolveDeclaredScope(sessionID){return resolveActiveScopeBinding(sessionID)?.files??null}function isArchitect(sessionId){let activeAgent=swarmState.activeAgent.get(sessionId);if(activeAgent){if(stripKnownSwarmPrefix(activeAgent)===ORCHESTRATOR_NAME)return!0}let session=swarmState.agentSessions.get(sessionId);if(session){if(stripKnownSwarmPrefix(session.agentName)===ORCHESTRATOR_NAME)return!0}return!1}function handleInterpreterGating(sessionID,tool){let normalizedTool=normalizeToolName(tool).toLowerCase();if(normalizedTool!=="bash"&&normalizedTool!=="shell")return;if(!interpreterAllowedAgents)return;let rawAgent=swarmState.activeAgent.get(sessionID),agentRole=rawAgent?stripKnownSwarmPrefix(rawAgent).toLowerCase():"unknown";if(!interpreterAllowedAgents.some((a)=>a.toLowerCase()===agentRole))throw Error(`BLOCKED: Agent "${agentRole}" is not permitted to use the bash/shell interpreter. Allowed agents: [${interpreterAllowedAgents.map((a)=>`"${a}"`).join(", ")}]`)}function checkDestructiveCommand(sessionID,tool,args2){if(tool!=="bash"&&tool!=="shell")return;if(cfg.block_destructive_commands===!1)return;let rawAgent=swarmState.activeAgent.get(sessionID),declaredScope=(rawAgent?stripKnownSwarmPrefix(rawAgent).toLowerCase():"unknown")==="coder"?resolveDeclaredScope(sessionID):null,toolArgs=args2,rawCommand=typeof toolArgs?.command==="string"?toolArgs.command.trim():"";if(!rawCommand)return;let cwd=sessionWorkspaceDirectory(sessionID),command=dcNormalizeCommand(rawCommand);if(/:\s*\(\s*\)\s*\{[^}]*\|[^}]*:/.test(command))throw Error("BLOCKED: Potentially destructive shell command detected: fork bomb pattern");let unwrapped=dcUnwrapWrappers(command),outerSegments=dcSplitSegments(command),innerSegments=dcSplitSegments(unwrapped),perSegmentUnwrapped=outerSegments.map((s)=>dcUnwrapWrappers(s)),allSegments=[...new Set([...outerSegments,...innerSegments,...perSegmentUnwrapped])];for(let segment of allSegments){let seg=segment.trim();if(!seg)continue;let junctionBlock=dcCheckJunctionCreation(seg,cwd);if(junctionBlock)throw Error(junctionBlock);let rmMatch=/^rm\s+((?:-\S+\s+)+)(.+)$/.exec(seg),rmFlagsPart=rmMatch?.[1]??"",rmHasRecursiveOrForce=/(?:^|\s)-[A-Za-z]*[rRfF]/.test(rmFlagsPart)||/(?:^|\s)--(?:recursive|force)\b/.test(rmFlagsPart);if(rmMatch&&rmHasRecursiveOrForce){let targetPart=rmMatch[2].trim(),targets=targetPart.split(/\s+/),validateBlock=dcValidateTargets(targets,cwd);if(validateBlock)throw Error(validateBlock);if(!targets.every((t)=>DC_SAFE_TARGETS.has(t.replace(/^["']|["']$/g,"").trim()))){if(!(declaredScope!=null&&declaredScope.length>0&&targets.every((t)=>isInDeclaredScope2(t.replace(/^["']|["']$/g,"").trim(),declaredScope,cwd))))throw Error(`BLOCKED: Potentially destructive shell command: rm with recursive/force flags on unsafe path(s): ${targetPart}`)}}if(/^(?:rmdir|rd)(?:\.exe)?\s+.*\/[sS]/i.test(seg)){let targets=dcExtractWindowsCmdTargets(seg);if(targets.length===0)throw Error("BLOCKED: Windows recursive directory delete (rmdir /s or rd /s) detected. Verify the target is not a junction/symlink.");let validateBlock=dcValidateTargets(targets,cwd);if(validateBlock)throw Error(validateBlock);if(!targets.every((t)=>DC_SAFE_TARGETS.has(t.trim()))){if(!(declaredScope!=null&&declaredScope.length>0&&targets.every((t)=>isInDeclaredScope2(t.trim(),declaredScope,cwd))))throw Error(`BLOCKED: Windows recursive directory delete on unsafe path(s): ${targets.join(", ")}`)}}if(/^del(?:\.exe)?\s+.*\/[sS]/i.test(seg)){let targets=dcExtractWindowsCmdTargets(seg);if(targets.length>0){let validateBlock=dcValidateTargets(targets,cwd);if(validateBlock)throw Error(validateBlock);if(!targets.every((t)=>DC_SAFE_TARGETS.has(t.trim()))){if(!(declaredScope!=null&&declaredScope.length>0&&targets.every((t)=>isInDeclaredScope2(t.trim(),declaredScope,cwd))))throw Error(`BLOCKED: Windows recursive file delete (del /s) on unsafe path(s): ${targets.join(", ")}`)}}}if(/^(?:Remove-Item|ri|rm|rmdir|del|erase|rd)\b.*-[Rr]ecurse\b/i.test(seg)||/^(?:Remove-Item|ri|rm|rmdir|del|erase|rd)\b.*-[Rr]\b/i.test(seg)){let targets=dcExtractPowerShellTargets(seg);if(targets.length>0){let validateBlock=dcValidateTargets(targets,cwd);if(validateBlock)throw Error(validateBlock);if(!targets.every((t)=>DC_SAFE_TARGETS.has(t.trim()))){if(!(declaredScope!=null&&declaredScope.length>0&&targets.every((t)=>isInDeclaredScope2(t.trim(),declaredScope,cwd))))throw Error(`BLOCKED: PowerShell recursive delete on unsafe path(s): ${targets.join(", ")}`)}}else throw Error("BLOCKED: PowerShell Remove-Item with -Recurse detected — cannot verify target safety")}if(/Get-ChildItem\b.*\|\s*Remove-Item\b.*-[Rr]ecurse/i.test(seg)||/gci\b.*\|\s*ri\b.*-[Rr]ecurse/i.test(seg))throw Error('BLOCKED: PowerShell pipeline "Get-ChildItem | Remove-Item -Recurse" detected — verify target safety and avoid recursive deletion through symlinks/junctions');if(/^vssadmin(?:\.exe)?\s+delete\b/i.test(seg))throw Error('BLOCKED: "vssadmin delete" detected — deletes Volume Shadow Copies (ransomware-grade operation)');if(/^wbadmin(?:\.exe)?\s+delete\b/i.test(seg))throw Error('BLOCKED: "wbadmin delete" detected — deletes Windows backup catalog (ransomware-grade operation)');if(/^diskpart(?:\.exe)?$/i.test(seg))throw Error('BLOCKED: "diskpart" detected — interactive disk partitioning tool');if(/^bcdedit(?:\.exe)?\s+\/delete\b/i.test(seg))throw Error('BLOCKED: "bcdedit /delete" detected — modifies Windows boot configuration');if(/^sdelete(?:\.exe)?\s+/i.test(seg))throw Error('BLOCKED: "sdelete" detected — secure file deletion (Sysinternals)');if(/^fsutil(?:\.exe)?\s+reparsepoint\s+delete\b/i.test(seg)||/^fsutil(?:\.exe)?\s+file\s+setzerodata\b/i.test(seg))throw Error('BLOCKED: "fsutil" destructive subcommand detected');if(/^takeown(?:\.exe)?\s+.*\/[rR]\b/i.test(seg))throw Error('BLOCKED: "takeown /R" (recursive ownership takeover) detected — often precedes destructive operations');if(/^cipher(?:\.exe)?\s+\/[wW]\b/i.test(seg))throw Error('BLOCKED: "cipher /w" detected — overwrites free disk space (data wipe operation)');if(/^format\s+[A-Za-z]:/i.test(seg))throw Error("BLOCKED: Windows disk format command detected");if(/^robocopy(?:\.exe)?\s+.*\/(?:MIR|mir)\b/.test(seg))throw Error(`BLOCKED: "robocopy /MIR" (mirror) detected — can delete files in the destination that don't exist in the source`);if(/^chmod\s+.*-[rR]\b.*000\b/.test(seg))throw Error('BLOCKED: "chmod -R 000" detected — removes all permissions recursively');if(/^chattr\s+.*\+i\b/.test(seg))throw Error('BLOCKED: "chattr +i" detected — makes files immutable');if(/^icacls(?:\.exe)?\s+.*\/deny\b/i.test(seg))throw Error('BLOCKED: "icacls /deny" detected — denies filesystem permissions');if(/^dd\b.*\bif=\/dev\/(zero|null|urandom)\b/.test(seg))throw Error('BLOCKED: "dd" with /dev/zero, /dev/null, or /dev/urandom as input detected — data wipe operation');if(/^git\s+push\b.*?(--force(?!-with-lease)|-f)\b/.test(seg))throw Error("BLOCKED: Force push detected — git push --force is not allowed (use --force-with-lease instead)");if(/^git\s+reset\s+--hard/.test(seg))throw Error('BLOCKED: "git reset --hard" detected — use --soft or --mixed with caution');if(/^git\s+reset\s+--mixed\s+\S+/.test(seg))throw Error('BLOCKED: "git reset --mixed" with a target branch/commit is not allowed');if(/^git\s+clean\s+.*-[fF].*[dD]/.test(seg))throw Error('BLOCKED: "git clean -fd" detected — permanently deletes untracked files and directories');let worktreeRemoveMatch=/^git\s+worktree\s+remove\s+(.+)$/i.exec(seg);if(worktreeRemoveMatch){let normalizedArgs=worktreeRemoveMatch[1].trim().split(/\s+/).filter(Boolean).map((a)=>a.replace(/^["']|["']$/g,"")),isForceToken=(a)=>{let lower=a.toLowerCase();return/^-f+$/.test(lower)||lower.length>2&&"--force".startsWith(lower)};if(normalizedArgs.some(isForceToken)){let pathArgs=normalizedArgs.filter((a)=>!a.startsWith("-")),target=pathArgs.length===1?pathArgs[0].trim():null;if(!(target!=null&&target.length>0&&(declaredScope!=null&&declaredScope.length>0&&isInDeclaredScope2(target,declaredScope,cwd)||isPathUnderSwarmWorktreeBase(target,cwd,worktreeBaseDirOverrides??[]))))throw Error('BLOCKED: "git worktree remove --force" detected — can delete working tree contents')}}if(/^rsync\b.*--delete(?:-after|-before|-during|-delay)?\b/.test(seg)){let rsyncTarget=seg.split(/\s+/).slice(1).filter((a)=>!a.startsWith("-")&&!a.includes("@")).pop();if(!(rsyncTarget!=null&&declaredScope!=null&&declaredScope.length>0&&isInDeclaredScope2(rsyncTarget,declaredScope,cwd)))throw Error('BLOCKED: "rsync --delete" detected — can delete files in the destination. Verify source is not empty.')}if(/^kubectl\s+delete\b/.test(seg))throw Error('BLOCKED: "kubectl delete" detected — destructive cluster operation');if(/^docker\s+system\s+prune\b/.test(seg))throw Error('BLOCKED: "docker system prune" detected — destructive container operation');if(/^\s*DROP\s+(TABLE|DATABASE|SCHEMA)\b/i.test(seg))throw Error("BLOCKED: SQL DROP command detected — destructive database operation");if(/^\s*TRUNCATE\s+TABLE\b/i.test(seg))throw Error("BLOCKED: SQL TRUNCATE command detected — destructive database operation");if(/^mkfs[./]/.test(seg))throw Error("BLOCKED: Disk format command (mkfs) detected — disk formatting operation");if(/^\\?mv\s/i.test(seg)){let mvMatch=seg.match(/^\\?mv\s+(.+)$/i);if(mvMatch){let argsStr=mvMatch[1].replace(/["']/g,"");if(/\.swarm(?:[\x5c/\s]|$)/.test(argsStr))throw Error('BLOCKED: "mv" targeting .swarm/ detected — move operations under .swarm/ are not allowed from shell commands')}}if(/^\\?(?:move|ren)(?:\.exe)?\s/i.test(seg)){let moveMatch=seg.match(/^\\?(?:move|ren)(?:\.exe)?\s+(.+)$/i);if(moveMatch){let argsStr=moveMatch[1].replace(/["']/g,"");if(/\.swarm(?:[\x5c/\s]|$)/i.test(argsStr))throw Error('BLOCKED: "move" or "ren" targeting .swarm/ detected — move/rename operations under .swarm/ are not allowed from shell commands')}}if(/^\\?(?:Move-Item|Rename-Item|move|mi|mv|ren|rni)\b.*\.swarm(?:[\x5c/\s]|$)/i.test(seg))throw Error("BLOCKED: PowerShell Move-Item or Rename-Item targeting .swarm/ detected — move/rename operations under .swarm/ are not allowed from shell commands");if(/^\\?rm\b/i.test(seg)&&!/^\\?rm\s+(?:-[a-zA-Z]*[rR][a-zA-Z]*|--recursive)\b/i.test(seg)&&/\.swarm(?:[\x5c/\s]|$)/i.test(seg))throw Error('BLOCKED: "rm" targeting .swarm/ detected — deleting files under .swarm/ is not allowed from shell commands');if(/\bcp\b.*\.swarm(?:[\x5c/\s]|$)/i.test(seg)&&/\brm\b.*\.swarm(?:[\x5c/\s]|$)/i.test(seg))throw Error('BLOCKED: "cp" of .swarm/ file followed by "rm" of .swarm/ source detected — copy-and-delete bypass is not allowed');if(/^rsync\b.*--remove-source-files\b/i.test(seg)&&/\.swarm(?:[\x5c/\s]|$)/i.test(seg))throw Error('BLOCKED: "rsync" with delete-source flag targeting .swarm/ detected — archive with source deletion under .swarm/ is not allowed');if(/^tar\b.*--remove-files\b/i.test(seg)&&/\.swarm(?:[\x5c/\s]|$)/i.test(seg))throw Error('BLOCKED: "tar" with delete-source flag targeting .swarm/ detected — archive with source deletion under .swarm/ is not allowed');if(/^zip\b.*\s-m\b/i.test(seg)&&/\.swarm(?:[\x5c/\s]|$)/i.test(seg))throw Error('BLOCKED: "zip" with delete-source flag targeting .swarm/ detected — archive with source deletion under .swarm/ is not allowed');if(/^7z\b.*\s-sdel\b/i.test(seg)&&/\.swarm(?:[\x5c/\s]|$)/i.test(seg))throw Error('BLOCKED: "7z" with delete-source flag targeting .swarm/ detected — archive with source deletion under .swarm/ is not allowed');{let HUMAN_ONLY_SWARM_SUBCOMMANDS=HUMAN_ONLY_SWARM_COMMANDS,probe2=seg.replace(/^(?:[A-Za-z_][A-Za-z0-9_]*=\S+\s+)+/,"").replace(/^eval(?:\s+--)?\s+["']?/,"").replace(/["']\s*$/,"").replace(/^\$\(\s*/,"").replace(/^\(\s*/,"").replace(/\s*\)$/,"").replace(/^`/,"").replace(/`$/,"").trim();for(let i=0;i<4;i++){let before=probe2;if(probe2=probe2.replace(/^env\s+(?:-i\b|--ignore-environment\b|-u\s+\S+|-[a-zA-Z]+\s+)*\s*/,"").replace(/^command\s+(?:-[pvV]\s+)*/,"").replace(/^(?:[A-Za-z_][A-Za-z0-9_]*=\S+\s+)+/,"").trim(),probe2===before)break}let swarmCliBypassMatch=probe2.match(/^\\?(?:bunx|npx|pnpx|npm(?:\s+(?:exec|x)(?:\s+--)?)?|pnpm(?:\s+(?:dlx|exec))?|yarn(?:\s+(?:dlx|exec))?|bun(?:\s+x)?|node|deno\s+run|tsx|ts-node)\b[^|;&]*?\bopencode-swarm\b[^|;&]*?\brun\s+([A-Za-z0-9_-]+(?:\s+(?!-)[A-Za-z0-9_-]+)?)/i);if(swarmCliBypassMatch){let normalized=swarmCliBypassMatch[1].trim().split(/\s+/).join(" "),firstToken=normalized.includes(" ")?normalized.split(" ")[0]:normalized,cmdName=HUMAN_ONLY_SWARM_SUBCOMMANDS.has(normalized)?normalized:firstToken;if(HUMAN_ONLY_SWARM_SUBCOMMANDS.has(normalized)||HUMAN_ONLY_SWARM_SUBCOMMANDS.has(firstToken))throw Error(`BLOCKED: "${cmdName}" is a human-only swarm command and may not be invoked from shell by an agent. Present the situation to the user and ask them to run \`/swarm ${cmdName}\` themselves.`)}let swarmBareBinMatch=probe2.match(/^\\?opencode-swarm\b[^|;&]*?\brun\s+([A-Za-z0-9_-]+(?:\s+(?!-)[A-Za-z0-9_-]+)?)/i);if(swarmBareBinMatch){let normalized=swarmBareBinMatch[1].trim().split(/\s+/).join(" "),firstToken=normalized.includes(" ")?normalized.split(" ")[0]:normalized,cmdName=HUMAN_ONLY_SWARM_SUBCOMMANDS.has(normalized)?normalized:firstToken;if(HUMAN_ONLY_SWARM_SUBCOMMANDS.has(normalized)||HUMAN_ONLY_SWARM_SUBCOMMANDS.has(firstToken))throw Error(`BLOCKED: "${cmdName}" is a human-only swarm command and may not be invoked from shell by an agent. Present the situation to the user and ask them to run \`/swarm ${cmdName}\` themselves.`)}let swarmCliPathMatch=probe2.match(/\bcli[/\\]+index\.[mc]?(?:js|ts)\b[^|;&]*?\brun\s+([A-Za-z0-9_-]+(?:\s+(?!-)[A-Za-z0-9_-]+)?)/i);if(swarmCliPathMatch){let normalized=swarmCliPathMatch[1].trim().split(/\s+/).join(" "),firstToken=normalized.includes(" ")?normalized.split(" ")[0]:normalized,cmdName=HUMAN_ONLY_SWARM_SUBCOMMANDS.has(normalized)?normalized:firstToken;if(HUMAN_ONLY_SWARM_SUBCOMMANDS.has(normalized)||HUMAN_ONLY_SWARM_SUBCOMMANDS.has(firstToken))throw Error(`BLOCKED: "${cmdName}" is a human-only swarm command and may not be invoked from shell by an agent. Present the situation to the user and ask them to run \`/swarm ${cmdName}\` themselves.`)}}{let normForPathCheck=seg.replace(/\\/g,"/").replace(/\/(?:\.\/+)+/g,"/").replace(/\/{2,}/g,"/");if(/\.swarm\/spec-staleness\.json\b/i.test(normForPathCheck)){let trimmed=seg.trim(),looksReadOnly=/^(?:cat|less|more|head|tail|file|stat|ls|dir|Get-Content|gc|Get-Item|gi|type)\b/i.test(trimmed),hasWriteRedirect=/>{1,2}\s*[^\s>]/.test(trimmed);if(!looksReadOnly||hasWriteRedirect)throw Error("BLOCKED: shell command targeting .swarm/spec-staleness.json detected. This file is system-managed and gates plan-mutating tools while spec drift is unresolved. Present the drift to the user and ask them to run /swarm clarify or /swarm acknowledge-spec-drift.")}}}}function detectShellType(command){if(/^(powershell|ps1|\.\s*\\|Remove-Item|Copy-Item|Move-Item|Start-Process|New-Object|Get-ChildItem|Set-Content|Add-Content|Out-File|Invoke-WebRequest|Invoke-RestMethod|IEX|iex)\b/i.test(command)||command.includes("$PSVersionTable")||command.includes("$env:")||/-EncodedCommand|-ExecutionPolicy|Enable-PSRemoting/i.test(command))return"powershell";if(/^(cmd|c:\/|set \w+=|\.\d+|del \/|rd \/|mkdir|chdir|echo |copy |move |ren |fc |diskpart)/i.test(command)||/%[^%\s]+%/.test(command)||/\b(set|echo|if|exist)\s+/i.test(command))return"cmd";if(/^(bash|sh|zsh|ksh|ash|dash|fish|ruby|python|perl|npm|yarn|node|cargo|go|rustc|mv|cp|rm|chmod|chown|mkdir|ln|tar|gzip|gunzip|ssh|scp|rsync|sudo|su -|export |source |\.\s+)/i.test(command)||command.includes("|")||command.includes("&&")||command.includes(">>")||/\$\{?\w+\}?/.test(command))return"bash";return"unix"}function checkShellWriteScope(sessionID,callID,tool,args2,commandOverride){if(tool!=="bash"&&tool!=="shell")return;let toolArgs=args2,command=typeof commandOverride==="string"?commandOverride.trim():typeof toolArgs?.command==="string"?toolArgs.command.trim():"";if(!command)return;let normalizedTool=tool,shellType="posix";if(normalizedTool==="bash")shellType="posix";else shellType=detectShellType(command);if(detectInteractiveSession(command,shellType==="unix"||shellType==="bash"?"posix":shellType))throw Error("BLOCKED: interactive/session tool detected — rejecting for safety");let detect=(c)=>normalizedTool==="bash"?detectPosixWrites(c):shellType==="powershell"||shellType==="cmd"?detectWindowsWrites(c,shellType):detectPosixWrites(c),primaryAnalysis=detect(command);if(primaryAnalysis.parseError)throw Error("BLOCKED: bash write detection failed to parse command — rejecting for safety");let commandSegments=dcSplitSegments(command),unwrappedSegments=commandSegments.map((s)=>dcUnwrapWrappers(s)),didUnwrap=commandSegments.some((s,i)=>unwrappedSegments[i]!==s),detectionCommand=didUnwrap?unwrappedSegments.join(`
701
+ `):command,analysis=didUnwrap?detect(detectionCommand):primaryAnalysis;if(analysis.parseError)throw Error("BLOCKED: bash write detection failed to parse command — rejecting for safety");if(!analysis.hasWrites||analysis.writes.length===0)return;let declaredScope=resolveDeclaredScope(sessionID),shellWriteAgent=swarmState.activeAgent.get(sessionID);if(!shellWriteAgent)throw Error(`WRITE BLOCKED: No active agent registered for session "${sessionID}". Call startAgentSession before issuing shell write operations.`);let shellWriteRole=stripKnownSwarmPrefix(shellWriteAgent).toLowerCase(),isArch=shellWriteRole==="architect",isCoder=shellWriteRole==="coder";if(isCoder&&(!declaredScope||declaredScope.length===0))throw Error(`SCOPE_NOT_DECLARED: ${shellWriteAgent} cannot perform shell writes without an active Task-correlated scope binding.`);let noScopeLenient=!isArch&&!isCoder&&(!declaredScope||declaredScope.length===0),shellDirectory=sessionWorkspaceDirectory(sessionID),resolvedWrites=resolveWriteTargets(detectionCommand,analysis.writes,shellDirectory);for(let write of resolvedWrites){if(write.resolvedPath===null){if(write.original.category==="here_doc"&&write.original.path===null)continue;if(write.original.category==="interpreter_eval")throw Error(`BLOCKED: ${write.original.operator} evaluates inline code whose write targets cannot be verified against the declared scope — rejecting for safety. Write files with the write/edit tools or a checked-in script, and invoke installed tools directly (e.g. \`pytest\`, \`ruff\`) instead of an inline \`python -c\` / \`node -e\` eval.`);throw Error(`BLOCKED: bash/shell write to a dynamic path target${write.original.path?` "${write.original.path}"`:""} that cannot be statically resolved (shell variable or command substitution) — rejecting for safety.`)}if(universalDenyPrefixes.length>0){let normalizedPath2=path61.relative(path61.resolve(shellDirectory),path61.resolve(shellDirectory,write.resolvedPath)).replace(/\\/g,"/");for(let prefix of universalDenyPrefixes)if(normalizedPath2.toLowerCase().startsWith(prefix.toLowerCase()))throw Error(`WRITE BLOCKED: Agent "${shellWriteAgent}" is not authorised to write "${write.resolvedPath}" (via shell). Reason: Path is under universal deny prefix "${prefix}"`)}if(noScopeLenient)continue;let authorityCheck=checkFileAuthorityWithRules(shellWriteAgent,write.resolvedPath,shellDirectory,precomputedAuthorityRules,{declaredScope});if(!authorityCheck.allowed)throw Error(`WRITE BLOCKED: Agent "${shellWriteAgent}" is not authorised to write "${write.resolvedPath}" (via shell). Reason: ${authorityCheck.reason}`);if(declaredScope&&declaredScope.length>0&&!isInDeclaredScope2(write.resolvedPath,declaredScope,shellDirectory))throw Error(`bash write detected outside declared scope: ${write.resolvedPath} (original: ${write.original.path})`);if(isCoder){let writeBinding=resolveActiveScopeBinding(sessionID);if(writeBinding?.activation==="active"&&writeBinding.parentOwnerSessionId&&writeBinding.parentCallId){let relativeTarget=path61.relative(path61.resolve(shellDirectory),path61.resolve(shellDirectory,write.resolvedPath)).replace(/\\/g,"/");if(recordReviewerScopeGenerationFile({parentSessionID:writeBinding.parentOwnerSessionId,taskId:writeBinding.taskId,coderCallID:writeBinding.parentCallId,file:relativeTarget}))rememberReviewerScopeWrite?.({callID,parentSessionID:writeBinding.parentOwnerSessionId,taskId:writeBinding.taskId,coderCallID:writeBinding.parentCallId,file:relativeTarget})}}}}async function applySandboxExecution(sessionID,callID,tool,args2,agent,command,auditPath,auditEnabled){if(tool!=="bash"&&tool!=="shell")return;let executor=await getExecutor();if(!executor||!executor.isAvailable()){if(!hasWarnedSandboxUnavailable)hasWarnedSandboxUnavailable=!0,warn("[guardrails] sandbox executor unavailable; shell commands will run unsandboxed");appendGuardrailDecision({type:"sandbox_skip",ts:new Date().toISOString(),sessionID,agent,tool,command,executorMechanism:executor?.mechanism??"none",skipReason:"executor not available"},{auditPath,enabled:auditEnabled});return}let toolArgs=args2,rawCommand=typeof toolArgs?.command==="string"?toolArgs.command.trim():"";if(!rawCommand||!toolArgs)return;let declaredPaths=resolveDeclaredScope(sessionID);if(!declaredPaths||declaredPaths.length===0)return;let resolved=resolveScopePaths(declaredPaths,sessionWorkspaceDirectory(sessionID));if(resolved.paths.length===0)return;try{let wrappedCommand=executor.wrapCommand(rawCommand,resolved.paths);toolArgs.command=wrappedCommand,markToolExecutionSandboxWrapped(sessionID,callID),appendGuardrailDecision({type:"sandbox_wrap",ts:new Date().toISOString(),sessionID,agent,tool,command:rawCommand,executorMechanism:executor.mechanism},{auditPath,enabled:auditEnabled})}catch(err){forgetToolExecution(sessionID,callID);let message=`[sandbox] BLOCKED: Failed to wrap command with ${executor.mechanism}: ${err}. Command will not be executed unsandboxed.`,circuit=recordNonTransientFailure(sessionID,"sandbox_wrapper_failure",message);if(circuit?.hardStop)throw Error(nonTransientHardStopMessage(circuit));throw Error(message)}}async function checkGateLimits(params){let{sessionID,window:window2,agentConfig,elapsedMinutes,repetitionCount}=params;if(agentConfig.max_tool_calls>0&&window2.toolCalls>=agentConfig.max_tool_calls)throw window2.hardLimitHit=!0,telemetry.hardLimitHit(sessionID,window2.agentName,"tool_calls",window2.toolCalls),warn("Circuit breaker: tool call limit hit",{sessionID,agentName:window2.agentName,invocationId:window2.id,windowKey:`${window2.agentName}:${window2.id}`,resolvedMaxCalls:agentConfig.max_tool_calls,currentCalls:window2.toolCalls}),Error(`\uD83D\uDED1 LIMIT REACHED: Tool calls exhausted (${window2.toolCalls}/${agentConfig.max_tool_calls}). Finish the current operation and return your progress summary.`);if(agentConfig.max_duration_minutes>0&&elapsedMinutes>=agentConfig.max_duration_minutes)throw window2.hardLimitHit=!0,telemetry.hardLimitHit(sessionID,window2.agentName,"duration",elapsedMinutes),warn("Circuit breaker: duration limit hit",{sessionID,agentName:window2.agentName,invocationId:window2.id,windowKey:`${window2.agentName}:${window2.id}`,resolvedMaxMinutes:agentConfig.max_duration_minutes,elapsedMinutes:Math.floor(elapsedMinutes)}),Error(`\uD83D\uDED1 LIMIT REACHED: Duration exhausted (${Math.floor(elapsedMinutes)}/${agentConfig.max_duration_minutes} min). Finish the current operation and return your progress summary.`);if(repetitionCount>=agentConfig.max_repetitions)throw window2.hardLimitHit=!0,telemetry.hardLimitHit(sessionID,window2.agentName,"repetition",repetitionCount),Error(`\uD83D\uDED1 LIMIT REACHED: Repeated the same tool call ${repetitionCount} times. This suggests a loop. Return your progress summary.`);if(window2.consecutiveErrors>=agentConfig.max_consecutive_errors)throw window2.hardLimitHit=!0,telemetry.hardLimitHit(sessionID,window2.agentName,"consecutive_errors",window2.consecutiveErrors),Error(`\uD83D\uDED1 LIMIT REACHED: ${window2.consecutiveErrors} consecutive tool errors detected. Return your progress summary with details of what went wrong. Run /swarm reset-session to clear the circuit breaker without restarting your session.`);let idleMinutes=(Date.now()-window2.lastSuccessTimeMs)/60000;if(idleMinutes>=agentConfig.idle_timeout_minutes)throw window2.hardLimitHit=!0,telemetry.hardLimitHit(sessionID,window2.agentName,"idle_timeout",idleMinutes),warn("Circuit breaker: idle timeout hit",{sessionID,agentName:window2.agentName,invocationId:window2.id,windowKey:`${window2.agentName}:${window2.id}`,idleTimeoutMinutes:agentConfig.idle_timeout_minutes,idleMinutes:Math.floor(idleMinutes)}),Error(`\uD83D\uDED1 LIMIT REACHED: No successful tool call for ${Math.floor(idleMinutes)} minutes (idle timeout: ${agentConfig.idle_timeout_minutes} min). This suggests the agent may be stuck. Return your progress summary.`);if(!window2.warningIssued){let toolPct=agentConfig.max_tool_calls>0?window2.toolCalls/agentConfig.max_tool_calls:0,durationPct=agentConfig.max_duration_minutes>0?elapsedMinutes/agentConfig.max_duration_minutes:0,repPct=repetitionCount/agentConfig.max_repetitions,errorPct=window2.consecutiveErrors/agentConfig.max_consecutive_errors,reasons=[];if(agentConfig.max_tool_calls>0&&toolPct>=agentConfig.warning_threshold)reasons.push(`tool calls ${window2.toolCalls}/${agentConfig.max_tool_calls}`);if(durationPct>=agentConfig.warning_threshold)reasons.push(`duration ${Math.floor(elapsedMinutes)}/${agentConfig.max_duration_minutes} min`);if(repPct>=agentConfig.warning_threshold)reasons.push(`repetitions ${repetitionCount}/${agentConfig.max_repetitions}`);if(errorPct>=agentConfig.warning_threshold)reasons.push(`errors ${window2.consecutiveErrors}/${agentConfig.max_consecutive_errors}`);if(reasons.length>0)window2.warningIssued=!0,window2.warningReason=reasons.join(", ")}}function handleDelegatedWriteTracking(sessionID,tool,args2){if(!swarmState.agentSessions.get(sessionID)?.delegationActive&&isArchitect(sessionID)){let coderDeleg=isAgentDelegation(tool,args2);if(coderDeleg.isDelegation&&coderDeleg.targetAgent==="coder"){let coderSession=swarmState.agentSessions.get(sessionID);if(coderSession){let taskId=coderSession.currentTaskId??coderSession.lastCoderDelegationTaskId??`${sessionID}:unknown`;if(coderSession.currentTaskId=taskId,resetModifiedFilesForTask(coderSession,taskId),!coderSession.revisionLimitHit)coderSession.coderRevisions=0}}}}function isAgentDelegation(toolName,args2){let normalized=normalizeToolName(toolName);if(normalized!=="Task"&&normalized!=="task")return{isDelegation:!1,targetAgent:null};let argsObj=args2;if(!argsObj)return{isDelegation:!1,targetAgent:null};let subagentType=argsObj.subagent_type;if(typeof subagentType==="string")return{isDelegation:!0,targetAgent:stripKnownSwarmPrefix(subagentType)};return{isDelegation:!1,targetAgent:null}}function handleLoopDetection(sessionID,tool,args2){if(tool!=="Task")return;let loopArgs=args2,loopResult=detectLoop(sessionID,tool,loopArgs);if(loopResult.count>=5)throw Error(`CIRCUIT BREAKER: Delegation loop detected (${loopResult.count} identical patterns). Session paused. Ask the user for guidance.`);else if(loopResult.count>=3&&loopResult.count<5){let agentName=typeof loopArgs?.subagent_type==="string"?loopArgs.subagent_type:"agent",loopSession=swarmState.agentSessions.get(sessionID);if(loopSession){let loopPattern=loopResult.pattern,modifiedFiles=loopSession.currentTaskId?getModifiedFilesForTask(loopSession,loopSession.currentTaskId):[],accomplishmentSummary=modifiedFiles.length>0?`Modified ${modifiedFiles.length} file(s): ${modifiedFiles.slice(0,3).join(", ")}${modifiedFiles.length>3?"...":""}`:"No files modified yet",alternativeSuggestions={coder:"Try a different task spec, simplify the constraint, or escalate to user",reviewer:"Try a different review dimension or escalate to user",test_engineer:"Run a specific test file with targeted scope",explorer:"Narrow the search scope or check a specific file directly"},cleanAgent=stripKnownSwarmPrefix(agentName).toLowerCase(),suggestion=alternativeSuggestions[cleanAgent]??"Try a different agent, different instructions, or escalate to the user";loopSession.loopWarningPending={agent:agentName,message:[`LOOP DETECTED: Pattern "${loopPattern}" repeated 3 times.`,`Agent: ${agentName}`,`Accomplished: ${accomplishmentSummary}`,`Suggested action: ${suggestion}`,"If still stuck after trying alternatives, escalate to the user."].join(`
702
+ `),timestamp:Date.now()}}}}function handleTestSuiteBlocking(tool,args2){if(tool!=="bash"&&tool!=="shell")return;let bashArgs=args2,cmd=(typeof bashArgs?.command==="string"?bashArgs.command:"").trim();if(/^(bun\s+test|npm\s+test|npx\s+vitest|bunx\s+vitest)\b/.test(cmd)){let tokens=cmd.split(/\s+/),runnerTokenCount=tokens[0]==="npx"||tokens[0]==="bunx"?3:2;if(!tokens.slice(runnerTokenCount).some((token)=>token.length>0&&!token.startsWith("-")&&(token.includes("/")||token.includes("\\")||token.endsWith(".ts")||token.endsWith(".js")||token.endsWith(".tsx")||token.endsWith(".jsx")||token.endsWith(".mts")||token.endsWith(".mjs"))))throw Error("BLOCKED: Full test suite execution is not allowed in-session. Run a specific test file instead: bun test path/to/file.test.ts")}}function extractAllPatchPayloads(args2){let toolArgs=args2;if(!toolArgs)return[];let out=[];for(let key of["patch","input","diff"]){let v=toolArgs[key];if(typeof v==="string"&&v.length>0)out.push(v)}let cmd=toolArgs.cmd;if(Array.isArray(cmd)){for(let entry of cmd)if(typeof entry==="string"&&entry.length>0)out.push(entry)}return out}function getHumanOnlyAlternation(){return[...HUMAN_ONLY_SWARM_COMMANDS].map((c)=>c.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).sort((a,b)=>b.length-a.length).join("|")}function patchPayloadHasHumanOnlyInvocation(args2){let payloads=extractAllPatchPayloads(args2);if(payloads.length===0)return!1;let alternation=getHumanOnlyAlternation(),re=new RegExp(`\\bopencode-swarm\\b[\\s\\S]*?\\brun\\s+(${alternation})\\b`,"i");return payloads.some((p)=>re.test(p))}function extractPatchTargetPaths(tool,args2){if(tool!=="apply_patch"&&tool!=="swarm_apply_patch"&&tool!=="patch")return[];let toolArgs=args2,paths=new Set;if(Array.isArray(toolArgs?.files)){for(let f of toolArgs.files)if(typeof f==="string"&&f.length>0&&f!=="/dev/null")paths.add(f)}let patchText=toolArgs?.input??toolArgs?.patch??toolArgs?.diff??(Array.isArray(toolArgs?.cmd)?toolArgs.cmd[1]:void 0);if(typeof patchText!=="string")return Array.from(paths);if(patchText.length>1e6)throw Error("WRITE BLOCKED: Patch payload exceeds 1 MB — authority cannot be verified for all modified paths. Split into smaller patches.");let patchPathPattern=/\*\*\*\s+(?:Update|Add|Delete)\s+File:\s*(.+)/gi,diffPathPattern=/\+\+\+\s+b\/(.+)/gm,gitDiffPathPattern=/^diff --git a\/(.+?) b\/(.+?)$/gm,minusPathPattern=/^---\s+a\/(.+)$/gm,traditionalMinusPattern=/^---\s+([^\s].+?)(?:\t.*)?$/gm,traditionalPlusPattern=/^\+\+\+\s+([^\s].+?)(?:\t.*)?$/gm;for(let match of patchText.matchAll(patchPathPattern))paths.add(match[1].trim());for(let match of patchText.matchAll(diffPathPattern)){let p=match[1].trim();if(p!=="/dev/null")paths.add(p)}for(let match of patchText.matchAll(gitDiffPathPattern)){let aPath=match[1].trim(),bPath=match[2].trim();if(aPath!=="/dev/null")paths.add(aPath);if(bPath!=="/dev/null")paths.add(bPath)}for(let match of patchText.matchAll(minusPathPattern)){let p=match[1].trim();if(p!=="/dev/null")paths.add(p)}for(let match of patchText.matchAll(traditionalMinusPattern)){let p=match[1].trim();if(p!=="/dev/null"&&!p.startsWith("a/")&&!p.startsWith("b/"))paths.add(p)}for(let match of patchText.matchAll(traditionalPlusPattern)){let p=match[1].trim();if(p!=="/dev/null"&&!p.startsWith("a/")&&!p.startsWith("b/"))paths.add(p)}return Array.from(paths)}function handlePlanAndScopeProtection(sessionID,tool,args2){let toolArgs=args2,targetPath=toolArgs?.filePath??toolArgs?.path??toolArgs?.file??toolArgs?.target;if(tool==="apply_patch"||tool==="swarm_apply_patch"||tool==="patch"){if(patchPayloadHasHumanOnlyInvocation(args2))throw Error("BLOCKED: apply_patch/swarm_apply_patch would introduce a script invoking a human-only swarm CLI subcommand. Present the situation to the user and ask them to run the command themselves.")}if(typeof targetPath==="string"&&targetPath.length>0){let resolvedTarget=path61.resolve(effectiveDirectory,targetPath).toLowerCase(),planMdPath=path61.resolve(effectiveDirectory,".swarm","plan.md").toLowerCase(),planJsonPath=path61.resolve(effectiveDirectory,".swarm","plan.json").toLowerCase();if(resolvedTarget===planMdPath||resolvedTarget===planJsonPath)throw Error("PLAN STATE VIOLATION: Direct writes to .swarm/plan.md and .swarm/plan.json are blocked. plan.md is auto-regenerated from plan.json by PlanSyncWorker. Use save_plan for ALL structural plan changes (adding/removing tasks, updating descriptions, dependencies, or phase names). Use update_task_status() for task status only. Use phase_complete() for phase transitions only.");let specStalenessPath=path61.resolve(effectiveDirectory,".swarm","spec-staleness.json").toLowerCase();if(resolvedTarget===specStalenessPath)throw Error("SPEC_DRIFT_VIOLATION: Direct writes to .swarm/spec-staleness.json are blocked. This file is system-managed and gates plan-mutating tools while spec drift is unresolved. Present the drift to the user and ask them to run /swarm clarify or /swarm acknowledge-spec-drift.");let content=toolArgs?.content??toolArgs?.text??toolArgs?.new_string??toolArgs?.newText;if(typeof content==="string"&&new RegExp(`\\bopencode-swarm\\b[\\s\\S]*?\\brun\\s+(${getHumanOnlyAlternation()})\\b`,"i").test(content))throw Error("BLOCKED: write/edit tool would create a script invoking a human-only swarm CLI subcommand. Present the situation to the user and ask them to run the command themselves.")}if(!targetPath&&(tool==="apply_patch"||tool==="swarm_apply_patch"||tool==="patch"))for(let p of extractPatchTargetPaths(tool,args2)){let resolvedP=path61.resolve(effectiveDirectory,p),planMdPath=path61.resolve(effectiveDirectory,".swarm","plan.md").toLowerCase(),planJsonPath=path61.resolve(effectiveDirectory,".swarm","plan.json").toLowerCase(),specStalenessPath=path61.resolve(effectiveDirectory,".swarm","spec-staleness.json").toLowerCase();if(resolvedP.toLowerCase()===planMdPath||resolvedP.toLowerCase()===planJsonPath)throw Error("PLAN STATE VIOLATION: Direct writes to .swarm/plan.md and .swarm/plan.json are blocked. plan.md is auto-regenerated from plan.json by PlanSyncWorker. Use save_plan for ALL structural plan changes (adding/removing tasks, updating descriptions, dependencies, or phase names). Use update_task_status() for task status only. Use phase_complete() for phase transitions only.");if(resolvedP.toLowerCase()===specStalenessPath)throw Error("SPEC_DRIFT_VIOLATION: Direct writes to .swarm/spec-staleness.json are blocked. This file is system-managed and gates plan-mutating tools while spec drift is unresolved. Present the drift to the user and ask them to run /swarm clarify or /swarm acknowledge-spec-drift.");if(isOutsideSwarmDir(p,effectiveDirectory)&&(isSourceCodePath(p)||hasTraversalSegments(p))){let session=swarmState.agentSessions.get(sessionID);if(session)session.architectWriteCount++,warn("Architect direct code edit detected via patch tool",{tool,sessionID,targetPath:p,writeCount:session.architectWriteCount});break}}if(typeof targetPath==="string"&&targetPath.length>0&&isOutsideSwarmDir(targetPath,effectiveDirectory)&&isSourceCodePath(path61.relative(effectiveDirectory,path61.resolve(effectiveDirectory,targetPath)))){let session=swarmState.agentSessions.get(sessionID);if(session){if(session.architectWriteCount++,warn("Architect direct code edit detected",{tool,sessionID,targetPath,writeCount:session.architectWriteCount}),session.lastGateFailure&&Date.now()-session.lastGateFailure.timestamp<120000){let failedGate=session.lastGateFailure.tool,failedTaskId=session.lastGateFailure.taskId;warn("Self-fix after gate failure detected",{failedGate,failedTaskId,currentTool:tool,sessionID}),session.selfFixAttempted=!0}}}}function resolveSessionAndWindow(sessionID){let rawActiveAgent=swarmState.activeAgent.get(sessionID),strippedAgent=rawActiveAgent?stripKnownSwarmPrefix(rawActiveAgent):void 0;if(strippedAgent===ORCHESTRATOR_NAME)return null;if(strippedAgent&&isNativeOpencodeAgent(strippedAgent))return null;let existingSession=swarmState.agentSessions.get(sessionID);if(existingSession){let sessionAgent=stripKnownSwarmPrefix(existingSession.agentName);if(sessionAgent===ORCHESTRATOR_NAME)return null;if(isNativeOpencodeAgent(sessionAgent))return null}let agentName=swarmState.activeAgent.get(sessionID)??ORCHESTRATOR_NAME,session=ensureAgentSession(sessionID,agentName),resolvedName=stripKnownSwarmPrefix(session.agentName);if(resolvedName===ORCHESTRATOR_NAME)return null;if(isNativeOpencodeAgent(resolvedName))return null;let agentConfig=resolveGuardrailsConfig(cfg,session.agentName);if(agentConfig.max_duration_minutes===0&&agentConfig.max_tool_calls===0)return null;if(!getActiveWindow(sessionID)){let fallbackAgent=swarmState.activeAgent.get(sessionID)??session.agentName;if(stripKnownSwarmPrefix(fallbackAgent)!==ORCHESTRATOR_NAME)beginInvocation(sessionID,fallbackAgent)}let window2=getActiveWindow(sessionID);if(!window2)return null;return{agentConfig,window:window2}}function isNativeOpencodeAgent(agentName){return OPENCODE_NATIVE_AGENTS.has(agentName.toLowerCase())}function trackToolCall(window2,tool,args2){if(window2.hardLimitHit)throw Error("\uD83D\uDED1 CIRCUIT BREAKER: Agent blocked. Hard limit was previously triggered. Stop making tool calls and return your progress summary.");window2.toolCalls++;let hash3=hashArgs(args2);if(window2.recentToolCalls.push({tool,argsHash:hash3,timestamp:Date.now()}),window2.recentToolCalls.length>20)window2.recentToolCalls.shift();let repetitionCount=0;if(window2.recentToolCalls.length>0){let lastEntry=window2.recentToolCalls[window2.recentToolCalls.length-1];for(let i=window2.recentToolCalls.length-1;i>=0;i--){let entry=window2.recentToolCalls[i];if(entry.tool===lastEntry.tool&&entry.argsHash===lastEntry.argsHash)repetitionCount++;else break}}let elapsedMinutes=(Date.now()-window2.startedAtMs)/60000;return{repetitionCount,elapsedMinutes}}return async(input,output)=>{assertNonTransientCircuitAllowsTool(input.sessionID);let resolvedSessionWindow=swarmState.agentSessions.has(input.sessionID)||swarmState.activeAgent.has(input.sessionID)?resolveSessionAndWindow(input.sessionID):null;consecutiveNoToolTurns.set(input.sessionID,0),handleDelegatedWriteTracking(input.sessionID,input.tool,output.args),handleLoopDetection(input.sessionID,input.tool,output.args),handleTestSuiteBlocking(input.tool,output.args);let rawShellCommand=(()=>{let bashArgs=output.args;return typeof bashArgs?.command==="string"?bashArgs.command:""})(),normalizedAuditTool=normalizeToolName(input.tool).toLowerCase();if(normalizedAuditTool==="bash"||normalizedAuditTool==="shell")appendGuardrailDecision({type:"shell",ts:new Date().toISOString(),sessionID:input.sessionID,agent:(()=>{let rawAgent=swarmState.activeAgent.get(input.sessionID);return rawAgent?stripKnownSwarmPrefix(rawAgent):"unknown"})(),tool:input.tool,command:(()=>{let bashArgs=output.args,rawCmd=typeof bashArgs?.command==="string"?bashArgs.command:"";return redactShellCommand(rawCmd)})()},{auditPath:shellAuditPath,enabled:shellAuditEnabled});handleInterpreterGating(input.sessionID,input.tool);try{checkDestructiveCommand(input.sessionID,input.tool,output.args)}catch(err){let destructiveCategory=(()=>{let msg=err instanceof Error?err.message:String(err);if(/fork bomb/i.test(msg))return"fork bomb";if(/rm\b.*recursive|recursive.*rm/i.test(msg))return"recursive delete";if(/rmdir|rd\b/i.test(msg))return"recursive directory delete";if(/\bdel\b/i.test(msg))return"recursive file delete";if(/Remove-Item|ri\b/i.test(msg))return"recursive remove";if(/format/i.test(msg))return"disk format";if(/robocopy/i.test(msg))return"mirror sync";if(/chmod.*000/i.test(msg))return"permission wipe";if(/chattr/i.test(msg))return"immutable flag";if(/icacls/i.test(msg))return"permission deny";if(/\bdd\b/i.test(msg))return"data wipe";if(/git push.*--force|git push.*-f/i.test(msg))return"force push";if(/git reset/i.test(msg))return"git reset";if(/git clean/i.test(msg))return"git clean";if(/git worktree/i.test(msg))return"git worktree remove";if(/rsync.*--delete/i.test(msg))return"rsync delete";if(/kubectl delete/i.test(msg))return"kubectl delete";if(/docker system prune/i.test(msg))return"docker prune";if(/DROP\s+TABLE|DROP\s+DATABASE|DROP\s+SCHEMA/i.test(msg))return"sql drop";if(/TRUNCATE\s+TABLE/i.test(msg))return"sql truncate";if(/mkfs/i.test(msg))return"disk format";if(/\bmv\b.*\.swarm/i.test(msg))return"swarm path move";if(/\bmove\b|\bren\b/i.test(msg))return"move/rename";if(/Move-Item|Rename-Item/i.test(msg))return"move/rename";if(/\brm\b.*\.swarm/i.test(msg))return"swarm path delete";if(/cp\b.*\.swarm.*rm\b|rm\b.*\.swarm/i.test(msg))return"copy-and-delete bypass";if(/rsync.*remove-source|tar.*remove-files|zip.*-m\b|7z.*-sdel/i.test(msg))return"archive delete source";if(/human-only swarm command/i.test(msg))return"human-only swarm command";if(/spec-staleness\.json/i.test(msg))return"system file tampering";return"destructive shell command"})();throw appendGuardrailDecision({type:"destructive_block",ts:new Date().toISOString(),sessionID:input.sessionID,agent:(()=>{let rawAgent=swarmState.activeAgent.get(input.sessionID);return rawAgent?stripKnownSwarmPrefix(rawAgent):"unknown"})(),tool:input.tool,command:(()=>{let bashArgs=output.args;return typeof bashArgs?.command==="string"?bashArgs.command:""})(),destructiveCategory},{auditPath:shellAuditPath,enabled:shellAuditEnabled}),err}try{checkShellWriteScope(input.sessionID,input.callID,input.tool,output.args,rawShellCommand)}catch(err){let toolArgs=output.args,declaredScope=resolveDeclaredScope(input.sessionID),declaredScopeText=declaredScope!=null&&declaredScope.length>0?declaredScope.join(", "):"",resolvedScopeText=declaredScope!=null&&declaredScope.length>0?resolveScopePaths(declaredScope,sessionWorkspaceDirectory(input.sessionID)).paths.join(", "):"",pathMatch=/[^\s]+/.exec(err instanceof Error?err.message:String(err)),targetPath=(()=>{let p=toolArgs?.filePath??toolArgs?.path??toolArgs?.file??toolArgs?.target;if(typeof p==="string"&&p.length>0)return p;let rawMessage=err instanceof Error?err.message:String(err),extracted=/(?:write|target|file|path|scope|prefix)[^:]*:\s*(?:"([^"]+)"|'([^']+)'|(\S+))/i.exec(rawMessage)??/(?:write|target|file|path)\s+(?:"([^"]+)"|'([^']+)'|(\S+))/i.exec(rawMessage),candidate=extracted!=null?extracted[1]??extracted[2]??extracted[3]??extracted[4]??extracted[5]??extracted[6]:null;if(candidate&&candidate.length>0&&candidate.length<200)return candidate;if(pathMatch)return pathMatch[0];return"<shell write>"})(),agentName=(()=>{let rawAgent=swarmState.activeAgent.get(input.sessionID);return rawAgent?stripKnownSwarmPrefix(rawAgent):"unknown"})();throw appendGuardrailDecision({type:"scope_violation",ts:new Date().toISOString(),sessionID:input.sessionID,agent:agentName,tool:input.tool,path:targetPath,declaredScope:declaredScopeText,resolvedScope:resolvedScopeText,action:"bash"},{auditPath:shellAuditPath,enabled:shellAuditEnabled}),err}let agentNameForSandbox=(()=>{let rawAgent=swarmState.activeAgent.get(input.sessionID);return rawAgent?stripKnownSwarmPrefix(rawAgent):"unknown"})();if(rememberToolExecution(input.sessionID,input.callID,input.tool,rawShellCommand),await applySandboxExecution(input.sessionID,input.callID,input.tool,output.args,agentNameForSandbox,rawShellCommand,shellAuditPath,shellAuditEnabled),enforceSpecDriftGate(effectiveDirectory,input.tool),isArchitect(input.sessionID)&&isWriteTool(input.tool))handlePlanAndScopeProtection(input.sessionID,input.tool,output.args);let writeDirectory=sessionWorkspaceDirectory(input.sessionID),resolvedFileTargets=null;if(isWriteTool(input.tool)){let resolution=resolveWriteTargets2(normalizeToolName(input.tool),output.args,{directory:writeDirectory});if(resolution.status==="unverifiable")throw Error(`WRITE TARGET UNVERIFIABLE: ${resolution.reason}`);else resolvedFileTargets=resolution.paths}if(isWriteTool(input.tool))for(let targetPath of resolvedFileTargets??[]){let agentName=swarmState.activeAgent.get(input.sessionID);if(!agentName)throw Error(`WRITE BLOCKED: No active agent registered for session "${input.sessionID}". Call startAgentSession before issuing write tool calls.`);let lstatBlock=checkWriteTargetForSymlink(targetPath,writeDirectory);if(lstatBlock)throw appendGuardrailDecision({type:"file_write",ts:new Date().toISOString(),sessionID:input.sessionID,agent:agentName,tool:input.tool,path:targetPath,reason:lstatBlock,resolvedScope:(()=>{let scope=resolveDeclaredScope(input.sessionID);return scope!=null&&scope.length>0?scope.join(", "):""})()},{auditPath:shellAuditPath,enabled:shellAuditEnabled}),Error(lstatBlock);if(universalDenyPrefixes.length>0){let normalizedPath2=path61.relative(path61.resolve(writeDirectory),path61.resolve(writeDirectory,targetPath)).replace(/\\/g,"/");for(let prefix of universalDenyPrefixes)if(normalizedPath2.toLowerCase().startsWith(prefix.toLowerCase()))throw appendGuardrailDecision({type:"file_write",ts:new Date().toISOString(),sessionID:input.sessionID,agent:agentName,tool:input.tool,path:targetPath,reason:`Path is under universal deny prefix "${prefix}"`,resolvedScope:(()=>{let scope=resolveDeclaredScope(input.sessionID);return scope!=null&&scope.length>0?scope.join(", "):""})()},{auditPath:shellAuditPath,enabled:shellAuditEnabled}),Error(`WRITE BLOCKED: Agent "${agentName}" is not authorised to write "${targetPath}". Reason: Path is under universal deny prefix "${prefix}"`)}let writeBinding=resolveActiveScopeBinding(input.sessionID),writeDeclaredScope=writeBinding?.files??null,authorityCheck=checkFileAuthorityWithRules(agentName,targetPath,writeDirectory,precomputedAuthorityRules,{declaredScope:writeDeclaredScope});if(!authorityCheck.allowed)throw appendGuardrailDecision({type:"file_write",ts:new Date().toISOString(),sessionID:input.sessionID,agent:agentName,tool:input.tool,path:targetPath,reason:authorityCheck.reason,resolvedScope:(()=>{let scope=writeDeclaredScope;return scope!=null&&scope.length>0?scope.join(", "):""})()},{auditPath:shellAuditPath,enabled:shellAuditEnabled}),Error(`WRITE BLOCKED: Agent "${agentName}" is not authorised to write "${targetPath}". Reason: ${authorityCheck.reason}`);let trackingSession=swarmState.agentSessions.get(input.sessionID),auditContext=trackingSession?.delegationActive?"delegated":"direct",auditOperation=["apply_patch","swarm_apply_patch","patch"].includes(normalizeToolName(input.tool))?"patch":"write";if(isConfigFilePath(targetPath,writeDirectory,authorityConfig?.verifier_config_paths)){let normalizedPath2=path61.relative(path61.resolve(writeDirectory),path61.resolve(writeDirectory,targetPath)).replace(/\\/g,"/"),logEntry={agent:agentName,path:normalizedPath2,allowed:authorityCheck.allowed,type:`${auditContext}_${auditOperation}`};if(!authorityCheck.allowed&&"reason"in authorityCheck)logEntry.reason=authorityCheck.reason;warn("Config file write attempt",logEntry)}if(trackingSession?.delegationActive){let taskId=trackingSession.currentTaskId??trackingSession.lastCoderDelegationTaskId??`${input.sessionID}:unknown`;trackingSession.currentTaskId=taskId,recordModifiedFileForTask(trackingSession,taskId,targetPath)}if(writeBinding?.activation==="active"&&writeBinding.parentOwnerSessionId&&writeBinding.parentCallId){let relativeTarget=path61.relative(path61.resolve(writeDirectory),path61.resolve(writeDirectory,targetPath)).replace(/\\/g,"/");if(recordReviewerScopeGenerationFile({parentSessionID:writeBinding.parentOwnerSessionId,taskId:writeBinding.taskId,coderCallID:writeBinding.parentCallId,file:relativeTarget}))rememberReviewerScopeWrite?.({callID:input.callID,parentSessionID:writeBinding.parentOwnerSessionId,taskId:writeBinding.taskId,coderCallID:writeBinding.parentCallId,file:relativeTarget})}}if(swarmState.agentSessions.get(input.sessionID)?.prmHardStopPending)throw Error("\uD83D\uDED1 PRM HARD STOP: Pattern escalation maximum reached. Stop tool calls and return progress summary.");let resolved=resolvedSessionWindow;if(!resolved)return;let{agentConfig,window:window2}=resolved,{repetitionCount,elapsedMinutes}=trackToolCall(window2,input.tool,output.args);await checkGateLimits({sessionID:input.sessionID,window:window2,agentConfig,elapsedMinutes,repetitionCount}),setStoredInputArgs(input.callID,output.args)}}var hasWarnedSandboxUnavailable=!1;var init_tool_before=__esm(()=>{init_tool_policy();init_constants();init_schema();init_executor();init_scope_resolver();init_scope_persistence();init_state2();init_telemetry();init_utils();init_core3();init_loop_detector();init_normalize_tool_name();init_shell_write_detect();init_write_target_resolver();init_audit_log();init_destructive_command();init_file_authority();init_guardrails();init_nontransient_circuit();init_stored_input_args();init_helpers()});import*as fsSync7 from"node:fs";import*as path62 from"node:path";function enforceSpecDriftGate(directory,toolName){if(!directory)return;if(!SPEC_DRIFT_BLOCKED_TOOLS.has(toolName))return;let stalePath=path62.join(directory,".swarm","spec-staleness.json");if(fsSync7.existsSync(stalePath)){let diffInfo=null;try{diffInfo=computeSpecDiff(directory)}catch{}let message=`SPEC_DRIFT_BLOCK: tool "${toolName}" is blocked because .swarm/spec-staleness.json exists. Run /swarm clarify to update the spec, or /swarm acknowledge-spec-drift to dismiss, then retry.`;if(diffInfo){let sectionSummary=diffInfo.changedSections.length>0?`
703
703
  Changed sections: ${diffInfo.changedSections.map((s)=>`## ${s}`).join(", ")}`:"";message+=`
704
704
 
705
705
  --- spec diff (recorded vs current) ---`+sectionSummary+`
@@ -735,7 +735,7 @@ ${warnings.map((w)=>`Detected signal: ${w}`).join(`
735
735
  `),validStartMs=[];for(let line of lines){if(!line.trim())continue;try{let parsed=JSON.parse(line);if(typeof parsed.startMs==="number"&&Number.isFinite(parsed.startMs))validStartMs.push(parsed.startMs)}catch{}}if(validStartMs.length===0)return null;return new Date(Math.min(...validStartMs)).toISOString()}catch{return null}}var SESSION_START_FILE="session-start.jsonl";var init_session_start_store=()=>{};import{execFile as execFile2}from"node:child_process";function markSuggested(sessionId){if(_suggestedSessions.has(sessionId))return;if(_suggestedSessions.size>=MAX_SUGGESTED_SESSIONS){let oldest=_suggestedSessions.values().next().value;if(oldest!==void 0)_suggestedSessions.delete(oldest)}_suggestedSessions.add(sessionId)}function countWorktrees(directory){return new Promise((resolve34)=>{try{let child=execFile2("git",["-C",directory,"worktree","list","--porcelain"],{timeout:GIT_TIMEOUT_MS3,windowsHide:!0,encoding:"utf-8"},(err,stdout)=>{if(err||typeof stdout!=="string"){resolve34(0);return}let count=0;for(let line of stdout.split(`
736
736
  `))if(line.startsWith("worktree "))count++;resolve34(count)});try{child.stdin?.end()}catch{}child.on("error",()=>resolve34(0))}catch{resolve34(0)}})}async function maybeSuggestWorktreeLink(directory,sessionId){try{if(!directory||!sessionId)return;if(_suggestedSessions.has(sessionId))return;if(markSuggested(sessionId),isLinked(directory))return;let worktrees=await countWorktrees(directory);if(worktrees>1)advisoryWarn(`[opencode-swarm] Detected ${worktrees} git worktrees of this repo. Run \`/swarm link\` in each to share swarm knowledge across them (or \`/swarm link <name>\` to share with similar projects).`)}catch{}}var GIT_TIMEOUT_MS3=1500,MAX_SUGGESTED_SESSIONS=500,_suggestedSessions;var init_worktree_link_suggestion=__esm(()=>{init_knowledge_link();init_warning_buffer();_suggestedSessions=new Set});class AgentRunContext{runId;activeToolCalls;activeAgent;delegationChains;agentSessions;environmentProfiles;toolAggregates;constructor(runId,toolAggregates){this.runId=runId,this.activeToolCalls=new Map,this.activeAgent=new Map,this.delegationChains=new Map,this.agentSessions=new Map,this.environmentProfiles=new Map,this.toolAggregates=toolAggregates}}var exports_pr_subscriptions={};__export(exports_pr_subscriptions,{updateSnapshot:()=>updateSnapshot,unsubscribe:()=>unsubscribe,sweepStale:()=>sweepStale,subscribe:()=>subscribe,setOnSubscriptionCreated:()=>setOnSubscriptionCreated,lookupByPr:()=>lookupByPr,listActive:()=>listActive,buildCorrelationId:()=>buildCorrelationId,PR_SUBSCRIPTIONS_FILE:()=>PR_SUBSCRIPTIONS_FILE});import*as fs34 from"node:fs";import*as path67 from"node:path";function setOnSubscriptionCreated(callback){onSubscriptionCreated=callback}function storePath2(directory){return validateSwarmPath(directory,PR_SUBSCRIPTIONS_FILE)}function ensureSwarmDir3(directory){fs34.mkdirSync(path67.resolve(directory,".swarm","pr-monitor"),{recursive:!0})}function buildCorrelationId(sessionID,repoFullName,prNumber){return`${sessionID}::${repoFullName}::${prNumber}`}function readAllRecords(directory){let raw;try{raw=fs34.readFileSync(storePath2(directory),"utf-8")}catch(err){if(err.code==="ENOENT")return[];return log(`[pr-monitor] readAllRecords failed: ${err instanceof Error?err.message:String(err)}`),[]}let folded=new Map;for(let line of raw.split(`
737
737
  `)){let trimmed=line.trim();if(trimmed.length===0)continue;let parsedJson;try{parsedJson=JSON.parse(trimmed)}catch{continue}let result=RecordSchema2.safeParse(parsedJson);if(!result.success)continue;folded.set(result.data.correlationId,result.data)}return[...folded.values()]}function appendRecord2(directory,record2){let result=RecordSchema2.safeParse(record2);if(!result.success)throw Error(`Invalid subscription record: ${result.error.message}`);ensureSwarmDir3(directory),fs34.appendFileSync(storePath2(directory),`${JSON.stringify(record2)}
738
- `,"utf-8")}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_AGENT2,STORE_LOCK_TASK2,async()=>{let existing=readAllRecords(directory),match=existing.find((r)=>r.correlationId===correlationId&&r.status==="active");if(match)return onSubscriptionCreated?.(directory,match),match;if(input.maxSubscriptions!==void 0&&input.maxSubscriptions>0){let activeCount=existing.filter((r)=>r.status==="active").length;if(activeCount>=input.maxSubscriptions)throw Error(`PR subscription limit reached: ${activeCount}/${input.maxSubscriptions}`)}let record2={correlationId,sessionID:input.sessionID,prNumber:input.prNumber,repoFullName:input.repoFullName,prUrl:input.prUrl,lastCheckedAt:now,isWatching:!0,hasUnaddressedEvents:!1,status:"active",createdAt:now,updatedAt:now,errorCount:0};return appendRecord2(directory,record2),onSubscriptionCreated?.(directory,record2),record2})}async function unsubscribe(directory,correlationId){if(!correlationId)return null;return withEvidenceLock(directory,PR_SUBSCRIPTIONS_FILE,STORE_LOCK_AGENT2,STORE_LOCK_TASK2,async()=>{let match=readAllRecords(directory).find((r)=>r.correlationId===correlationId&&r.status==="active");if(!match)return null;let now=Date.now(),removed={...match,status:"removed",isWatching:!1,updatedAt:now};return appendRecord2(directory,removed),removed})}async function listActive(directory){return readAllRecords(directory).filter((r)=>r.status==="active")}async function lookupByPr(directory,repoFullName,prNumber){for(let record2 of readAllRecords(directory))if(record2.status==="active"&&record2.repoFullName===repoFullName&&record2.prNumber===prNumber)return record2;return null}async function updateSnapshot(directory,correlationId,updates){if(!correlationId)return null;return withEvidenceLock(directory,PR_SUBSCRIPTIONS_FILE,STORE_LOCK_AGENT2,STORE_LOCK_TASK2,async()=>{let match=readAllRecords(directory).find((r)=>r.correlationId===correlationId&&r.status==="active");if(!match)return null;let updated={...match,...updates,correlationId,sessionID:match.sessionID,repoFullName:match.repoFullName,prNumber:match.prNumber,prUrl:match.prUrl,createdAt:match.createdAt,updatedAt:Date.now()};return appendRecord2(directory,updated),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_AGENT2,STORE_LOCK_TASK2,async()=>{let swept=0;for(let record2 of readAllRecords(directory)){if(record2.status!=="active")continue;let prKey=`${record2.repoFullName}::${record2.prNumber}`,isMerged=mergedPrs?.has(prKey)??!1,isStale=now-record2.updatedAt>ttlMs;if(isMerged){appendRecord2(directory,{...record2,status:"expired",isWatching:!1,updatedAt:now}),swept+=1,log(`[pr-monitor] Swept subscription: merged/closed: ${prKey}`);continue}if(isStale&&!record2.hasUnaddressedEvents)appendRecord2(directory,{...record2,status:"expired",isWatching:!1,updatedAt:now}),swept+=1,log(`[pr-monitor] Swept subscription: stale (TTL ${ttlDays}d): ${prKey}`)}return swept})}catch(err){return log(`[pr-monitor] sweepStale failed: ${err instanceof Error?err.message:String(err)}`),0}}var PR_SUBSCRIPTIONS_FILE="pr-monitor/subscriptions.jsonl",STORE_LOCK_AGENT2="pr-monitor",STORE_LOCK_TASK2="pr-subscriptions",onSubscriptionCreated=null,RecordSchema2;var init_pr_subscriptions=__esm(()=>{init_zod();init_lock();init_utils2();init_utils();RecordSchema2=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(/^[^/]+\/[^/]+$/,"Must be owner/repo format"),prUrl:exports_external.string().min(1).regex(/^https:\/\/github\.com\/[^/]+\/[^/]+\/pull\/\d+$/,"Must be a valid GitHub PR URL"),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()});var exports_state={};__export(exports_state,{updateAgentEventTime:()=>updateAgentEventTime,takeReviewerScopeGeneration:()=>takeReviewerScopeGeneration,sweepStaleSessions:()=>sweepStaleSessions,swarmState:()=>swarmState,startReviewerScopeGeneration:()=>startReviewerScopeGeneration,startAgentSession:()=>startAgentSession,setSessionEnvironment:()=>setSessionEnvironment,setCriticalShownIds:()=>setCriticalShownIds,reviewerScopeGenerationHasDeclaredOverlap:()=>reviewerScopeGenerationHasDeclaredOverlap,resetSwarmStatePreservingSingletons:()=>resetSwarmStatePreservingSingletons,resetSwarmState:()=>resetSwarmState,resetModifiedFilesForTask:()=>resetModifiedFilesForTask,rehydrateSessionFromDisk:()=>rehydrateSessionFromDisk,rehydratePrSubscriptions:()=>rehydratePrSubscriptions,recordStageBCompletion:()=>recordStageBCompletion,recordReviewerScopeGenerationFileFingerprint:()=>recordReviewerScopeGenerationFileFingerprint,recordReviewerScopeGenerationFile:()=>recordReviewerScopeGenerationFile,recordPhaseAgentDispatch:()=>recordPhaseAgentDispatch,recordModifiedFilesForTask:()=>recordModifiedFilesForTask,recordModifiedFileForTask:()=>recordModifiedFileForTask,pruneOldWindows:()=>pruneOldWindows,peekReviewerScopeGenerationClaim:()=>peekReviewerScopeGenerationClaim,peekReadyReviewerScopeGeneration:()=>peekReadyReviewerScopeGeneration,maybeSweepStaleSessions:()=>maybeSweepStaleSessions,markReviewerScopeGenerationReady:()=>markReviewerScopeGenerationReady,isReviewerScopeGenerationCurrent:()=>isReviewerScopeGenerationCurrent,isCouncilGateActive:()=>isCouncilGateActive,incrementGateDenialCount:()=>incrementGateDenialCount,hasBothStageBCompletions:()=>hasBothStageBCompletions,hasActiveTurboMode:()=>hasActiveTurboMode,hasActiveLeanTurbo:()=>hasActiveLeanTurbo,hasActiveFullAuto:()=>hasActiveFullAuto,hasActiveEpicMode:()=>hasActiveEpicMode,getTaskState:()=>getTaskState,getSessionEnvironment:()=>getSessionEnvironment,getRunContext:()=>getRunContext,getReviewerScopeOwnershipHistory:()=>getReviewerScopeOwnershipHistory,getReviewerScopeGenerationForCoderCall:()=>getReviewerScopeGenerationForCoderCall,getResolvedAutoProceed:()=>getResolvedAutoProceed,getModifiedFilesForTask:()=>getModifiedFilesForTask,getAgentSession:()=>getAgentSession,getActiveWindow:()=>getActiveWindow,getActiveFullAutoSessionID:()=>getActiveFullAutoSessionID,ensureSessionEnvironment:()=>ensureSessionEnvironment,ensureAgentSession:()=>ensureAgentSession,endAgentSession:()=>endAgentSession,discardReviewerScopeGenerationForCoderCall:()=>discardReviewerScopeGenerationForCoderCall,discardReviewerScopeGenerationClaim:()=>discardReviewerScopeGenerationClaim,defaultRunContext:()=>defaultRunContext,completeModifiedFilesForTask:()=>completeModifiedFilesForTask,clearGateDenialCount:()=>clearGateDenialCount,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:()=>_internals38,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_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 randomUUID6}from"node:crypto";import*as fs35 from"node:fs/promises";import*as path68 from"node:path";function cloneReviewerScopeGeneration(generation){return{...generation,declaredFiles:[...generation.declaredFiles],modifiedFiles:[...generation.modifiedFiles],modifiedFileFingerprints:generation.modifiedFileFingerprints.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((fingerprint)=>({...fingerprint}))}}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.lastBudgetPct=0,swarmState.agentSessions.clear(),_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=[],_rehydrationCache=null,swarmState.fullAutoEnabledInConfig=!1,swarmState.environmentProfiles.clear(),clearPendingCoderScope();for(let binding of clearScopeBindings())clearScopeBindingFromDisk({directory:binding.workspaceIdentity,taskId:binding.taskId,ownerSessionId:binding.ownerSessionId});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??=randomUUID6(),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[key,entry]of generations){if(entry.status==="claimed")continue;if(!Number.isFinite(entry.createdAt)||now<entry.createdAt||now-entry.createdAt>REVIEWER_SCOPE_GENERATION_TTL_MS)generations.delete(key)}}function startReviewerScopeGeneration(input){let session=swarmState.agentSessions.get(input.parentSessionID);if(!session||!isBoundedGenerationValue(input.taskId,512)||!isBoundedGenerationValue(input.coderCallID,512))return null;let now=input.createdAt??Date.now();sweepReviewerScopeGenerations(session,now);let{generations,counter,incarnation,latestByTask}=ensureReviewerScopeGenerationState(session);for(let[key2,entry]of generations)if(entry.taskId===input.taskId&&entry.status!=="claimed")generations.delete(key2);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,declaredFiles:[...new Set(input.declaredFiles??[])],modifiedFiles:[],modifiedFileFingerprints:[],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 key=reviewerScopeGenerationKey(generation.taskId,generation.coderCallID,generation.generation);return generations.set(key,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 key=reviewerScopeGenerationKey(generation.taskId,generation.coderCallID,generation.generation);return generations.delete(key),!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;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 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;if(matches[0].status==="ready")return!0;return matches[0].status="ready",matches[0].readyAt=now,!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 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[key,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,declaredFiles:[...generation.declaredFiles],modifiedFiles:[...generation.modifiedFiles],modifiedFileFingerprints:generation.modifiedFileFingerprints.map((fingerprint)=>({...fingerprint})),createdAt:generation.createdAt,readyAt:generation.readyAt,consumedAt:input.now??Date.now()};ownershipHistory.set(reviewerScopeOwnershipKey(tombstone.taskId,tombstone.coderCallID,tombstone.generation,tombstone.sessionIncarnation),tombstone)}return generations.delete(key),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((file2)=>declared.has(file2)))}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()){let staleIds=[];for(let[id,session]of swarmState.agentSessions)if(now-session.lastToolCallTime>staleDurationMs)staleIds.push(id);for(let id of staleIds)swarmState.agentSessions.delete(id),swarmState.delegationChains.delete(id);return staleIds}function maybeSweepStaleSessions(staleDurationMs=STALE_SESSION_TTL_MS,now=Date.now()){if(now-_lastIdleSweepAtMs<IDLE_SWEEP_COOLDOWN_MS)return[];return _lastIdleSweepAtMs=now,sweepStaleSessions(staleDurationMs,now)}function startAgentSession(sessionId,agentName,staleDurationMs=STALE_SESSION_TTL_MS,directory){let now=Date.now();sweepStaleSessions(staleDurationMs,now);let 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,stageBCompletion:new Map,taskCouncilApproved:new Map,pendingCouncilRequirements:new Map,lastGateOutcome:null,declaredCoderScope:null,lastScopeViolation:null,scopeViolationDetected:!1,modifiedFilesByTask:new Map,modifiedFilesThisCoderTask:[],reviewerScopeGenerations:new Map,reviewerScopeGenerationCounter:0,reviewerScopeIncarnation:randomUUID6(),reviewerScopeLatestGenerationByTask:new Map,reviewerScopeOwnershipHistory:new Map,turboMode:!1,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,prmPatternCounts:new Map,prmEscalationLevel:0,prmLastPatternDetected:null,prmTrajectoryStep:0,prmHardStopPending:!1,prmInjectedAdvisoryKeys:new Set,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),_internals38.applyRehydrationCache(sessionState),directory){let rehydrationPromise;rehydrationPromise=_internals38.rehydrateSessionFromDisk(directory,sessionState).then(async()=>{try{sessionState.prSubscriptions=await rehydratePrSubscriptions(sessionId,directory)}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){let removedBindings=clearScopeBindings((binding)=>binding.ownerSessionId===sessionId||binding.parentOwnerSessionId===sessionId);for(let binding of removedBindings)clearScopeBindingFromDisk({directory:binding.workspaceIdentity,taskId:binding.taskId,ownerSessionId:binding.ownerSessionId});swarmState.agentSessions.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(),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.stageBCompletion)session.stageBCompletion=new Map;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=randomUUID6();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.prmInjectedAdvisoryKeys)session.prmInjectedAdvisoryKeys=new Set;if(!session.prSubscriptions)session.prSubscriptions=new Map;return session.lastToolCallTime=now,maybeSweepStaleSessions(),session}if(_internals38.startAgentSession(sessionId,agentName??"unknown",7200000,directory),session=swarmState.agentSessions.get(sessionId),!session)throw Error(`Failed to create guardrail session for ${sessionId}`);return session}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),newId=(session.lastInvocationIdByAgent[stripped]||0)+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},key=`${stripped}:${newId}`;return session.windows[key]=window2,pruneOldWindows(sessionId,86400000,50),telemetry.delegationBegin(sessionId,stripped,session.currentTaskId??"unknown"),window2}function getActiveWindow(sessionId){let session=swarmState.agentSessions.get(sessionId);if(!session||!session.windows)return;let key=`${stripKnownSwarmPrefix(session.agentName)}:${session.activeInvocationId}`;return session.windows[key]}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){if(!ensureModifiedFileTaskSlot(session,taskId))return!1;let normalized=[...new Set(files.filter((file2)=>typeof file2==="string"&&file2.length>0))];if(session.modifiedFilesByTask.set(taskId,normalized),session.currentTaskId===taskId)projectModifiedFilesForActiveTask(session);return!0}function recordModifiedFileForTask(session,taskId,file2){if(typeof file2!=="string"||file2.length===0)return!1;let existing=getModifiedFilesForTask(session,taskId);if(existing.includes(file2))return!0;return recordModifiedFilesForTask(session,taskId,[...existing,file2])}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 advanceTaskState(session,taskId,newState,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=STATE_ORDER.indexOf(current);if(STATE_ORDER.indexOf(newState)<=currentIndex)throw Error(`INVALID_TASK_STATE_TRANSITION: ${taskId} ${current} → ${newState}`);if(newState==="complete"&&current!=="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>=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,newState),newState==="complete")session.stageBCompletion?.delete(taskId),completeModifiedFilesForTask(session,taskId);if(options?.emitTelemetry!==!1)telemetry.taskStateChanged(options?.telemetrySessionId??session.agentName,taskId,newState,current)}function canAdvanceTaskState(session,taskId,newState,councilConfig){if(!isValidTaskId2(taskId))return!1;if(!session||!(session.taskWorkflowStates instanceof Map))return!1;let current=session.taskWorkflowStates.get(taskId)??"idle",currentIndex=STATE_ORDER.indexOf(current);if(STATE_ORDER.indexOf(newState)<=currentIndex)return!1;if(newState==="complete"&&current!=="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>=STATE_ORDER.indexOf("pre_check_passed");if(!councilApproved||!pastPreCheck)return!1}return!0}async function advanceTaskStateAndPersist(session,taskId,newState,directory,options,councilConfig){if(newState==="coder_delegated"){if(await isTaskSettled(directory,taskId)){warn(`[advanceTaskStateAndPersist] refusing to re-dispatch settled task ${taskId}; skipping in-memory advance + persist`);return}}if(advanceTaskState(session,taskId,newState,options,councilConfig),newState!=="coder_delegated"&&newState!=="complete")return;let planStatus=newState==="complete"?"completed":"in_progress";try{await updateTaskStatus(directory,taskId,planStatus,{force:!1})}catch(err){warn(`[advanceTaskStateAndPersist] persist ${taskId} → ${planStatus} failed (in-memory state still advanced): ${err instanceof Error?err.message:String(err)}`)}}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 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),profile=null;try{profile=getProfile(directory,planId)}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.`);profile=null}if(!profile)return!1;let 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"coder_delegated";case"completed":return"complete";default:return"idle"}}function evidenceToWorkflowState(evidence2){let gates=evidence2.gates??{},requiredGates=evidence2.required_gates??[];if(requiredGates.length>0){if(requiredGates.every((gate)=>gates[gate]!=null))return"complete"}if(gates.test_engineer!=null)return"tests_run";if(gates.reviewer!=null)return"reviewer_run";if(Object.keys(gates).length>0)return"coder_delegated";return"idle"}async function readPlanFromDisk(directory){try{let planPath=path68.join(directory,".swarm","plan.json"),content=await fs35.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=path68.join(directory,".swarm","evidence"),entries=await fs35.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=path68.join(evidenceDir,entry.name),content=await fs35.readFile(filePath,"utf-8"),parsed=JSON.parse(content);if(parsed&&typeof parsed.taskId==="string"&&Array.isArray(parsed.required_gates))evidenceMap.set(taskId,parsed)}catch{}}}catch{}return evidenceMap}async function buildRehydrationCache(directory){let planTaskStates=new Map,plan=await readPlanFromDisk(directory);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);_rehydrationCache={planTaskStates,evidenceMap}}function applyRehydrationCache(session){if(!_rehydrationCache)return;if(!session.taskWorkflowStates)session.taskWorkflowStates=new Map;if(!session.taskCouncilApproved)session.taskCouncilApproved=new Map;let{planTaskStates,evidenceMap}=_rehydrationCache;for(let[taskId,planState]of planTaskStates){let existingState=session.taskWorkflowStates.get(taskId),evidence2=evidenceMap.get(taskId);if(evidence2){let derivedState=evidenceToWorkflowState(evidence2),existingIndex=existingState?STATE_ORDER.indexOf(existingState):-1;if(STATE_ORDER.indexOf(derivedState)>existingIndex)session.taskWorkflowStates.set(taskId,derivedState)}else{let existingIndex=existingState?STATE_ORDER.indexOf(existingState):-1;if(STATE_ORDER.indexOf(planState)>existingIndex)session.taskWorkflowStates.set(taskId,planState)}}let VALID_COUNCIL_VERDICTS=new Set(["APPROVE","REJECT","CONCERNS"]);for(let[taskId,evidence2]of evidenceMap){if(session.taskCouncilApproved.has(taskId))continue;let council=evidence2.gates?.council;if(!council)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){await _internals38.buildRehydrationCache(directory),_internals38.applyRehydrationCache(session)}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 setCriticalShownIds(sessionID,value){let map2=swarmState.currentCriticalShownIds;if(map2.has(sessionID))map2.delete(sessionID);if(map2.set(sessionID,value),map2.size>MAX_TRACKED_CRITICAL_SHOWN){let oldest=map2.keys().next().value;if(oldest!==void 0&&oldest!==sessionID)map2.delete(oldest)}}function clearCriticalShownIds(sessionID){return swarmState.currentCriticalShownIds.delete(sessionID)}function buildGateDenialDirectiveKey(ids){return[...ids].sort().join(",")}function incrementGateDenialCount(sessionID,directiveKey){let map2=swarmState.gateDenialCounts,existing=map2.get(sessionID),count=existing&&existing.directiveKey===directiveKey?existing.count+1:1;if(map2.has(sessionID))map2.delete(sessionID);if(map2.set(sessionID,{count,directiveKey}),map2.size>MAX_TRACKED_GATE_DENIALS){let oldest=map2.keys().next().value;if(oldest!==void 0&&oldest!==sessionID)map2.delete(oldest)}return count}function clearGateDenialCount(sessionID){swarmState.gateDenialCounts.delete(sessionID)}function addKnowledgeAckDedup(key){let set2=swarmState.knowledgeAckDedup;if(set2.has(key))return;if(set2.add(key),set2.size>MAX_TRACKED_KNOWLEDGE_ACKS){let oldest=set2.values().next().value;if(oldest!==void 0)set2.delete(oldest)}}async function rehydratePrSubscriptions(sessionID,directory){let map2=new Map;try{let{listActive:listActive2}=await Promise.resolve().then(() => (init_pr_subscriptions(),exports_pr_subscriptions)),records=await listActive2(directory);for(let record2 of records){if(record2.sessionID!==sessionID)continue;let key=`${record2.repoFullName}::${record2.prNumber}`;map2.set(key,{prNumber:record2.prNumber,repoFullName:record2.repoFullName,prUrl:record2.prUrl,lastKnownStatus:record2.mergeableState??"unknown",lastPollTime:record2.lastCheckedAt,errorCount:record2.errorCount,isWatching:record2.isWatching})}}catch(err){warn(`[state] rehydratePrSubscriptions failed for session ${sessionID}: ${err instanceof Error?err.message:String(err)}`)}return map2}var _rehydrationCache=null,_councilDisagreementWarned,MAX_TRACKED_TASK_FILE_ATTRIBUTIONS=128,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_CRITICAL_SHOWN=500,MAX_TRACKED_KNOWLEDGE_ACKS=5000,MAX_TRACKED_GATE_DENIALS=500,_internals38;var init_state2=__esm(()=>{init_constants();init_plan_schema();init_schema();init_qa_gate_profile();init_delegation_gate();init_realtime_learning_nudge();init_trajectory_step_state();init_candidate_queue();init_prm_pattern_support();init_manager();init_utils3();init_trajectory_store();init_scope_binding();init_scope_persistence();init_session_start_store();init_worktree_link_suggestion();init_telemetry();init_logger();_councilDisagreementWarned=new Set,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:[],lastBudgetPct:0,agentSessions:defaultRunContext.agentSessions,pendingRehydrations:new Set,fullAutoEnabledInConfig:!1,environmentProfiles:defaultRunContext.environmentProfiles};REVIEWER_SCOPE_GENERATION_TTL_MS=STALE_SESSION_TTL_MS;_internals38={swarmState,resetSwarmState,ensureAgentSession,startAgentSession,getAgentSession,beginInvocation,getActiveWindow,advanceTaskState,getTaskState,hasActiveFullAuto,hasActiveTurboMode,hasActiveLeanTurbo,hasActiveEpicMode,buildRehydrationCache,applyRehydrationCache,rehydrateSessionFromDisk,isCouncilGateActive,defaultRunContext}});async function handleAutoProceedCommand(_directory,args2,sessionID){if(!sessionID||sessionID.trim()==="")return"Error: No active session context. Auto-proceed requires an active session. Use /swarm auto-proceed from within an OpenCode session, or start a session first.";let session=getAgentSession(sessionID);if(!session)return"Error: No active session. Auto-proceed requires an active session to operate.";if(stripKnownSwarmPrefix(session.agentName)!=="architect")return`Error: Auto-proceed can only be toggled from the architect session. Currently active session is: ${session.agentName}`;let arg=args2[0]?.toLowerCase(),wasUndefinedBefore=session.autoProceedOverride===void 0,newAutoProceedOverride;if(arg==="on")newAutoProceedOverride=!0;else if(arg==="off")newAutoProceedOverride=!1;else if(arg===void 0)newAutoProceedOverride=!session.autoProceedOverride;else return'Error: Invalid argument for /swarm auto-proceed. Valid options: "on", "off", or omit the argument to toggle.';if(session.autoProceedOverride=newAutoProceedOverride,arg==="on"||arg==="off"||arg===void 0&&wasUndefinedBefore)session.autoProceedNudgeDone=!0;if(newAutoProceedOverride)return"Auto-proceed is now ON. Phase boundaries will advance automatically.";else return"Auto-proceed is now OFF. You will be asked before advancing to the next phase."}var init_auto_proceed=__esm(()=>{init_schema();init_state2()});import{mkdir as mkdir10,readFile as readFile14}from"node:fs/promises";import*as path69 from"node:path";function gateGroundTruthJoinKey(value){return[value.runId,value.taskId,value.candidateId,value.model,value.gate,String(value.repetition)].join("\x00")}function relativePath(runId){return path69.join("evidence","gate-audit",runId,"ground-truth.jsonl")}function absolutePath(directory,runId){return path69.join(directory,".swarm",relativePath(runId))}function serialize(events){return`${events.map((event)=>canonicalJson(event)).join(`
738
+ `,"utf-8")}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_AGENT2,STORE_LOCK_TASK2,async()=>{let existing=readAllRecords(directory),match=existing.find((r)=>r.correlationId===correlationId&&r.status==="active");if(match)return onSubscriptionCreated?.(directory,match),match;if(input.maxSubscriptions!==void 0&&input.maxSubscriptions>0){let activeCount=existing.filter((r)=>r.status==="active").length;if(activeCount>=input.maxSubscriptions)throw Error(`PR subscription limit reached: ${activeCount}/${input.maxSubscriptions}`)}let record2={correlationId,sessionID:input.sessionID,prNumber:input.prNumber,repoFullName:input.repoFullName,prUrl:input.prUrl,lastCheckedAt:now,isWatching:!0,hasUnaddressedEvents:!1,status:"active",createdAt:now,updatedAt:now,errorCount:0};return appendRecord2(directory,record2),onSubscriptionCreated?.(directory,record2),record2})}async function unsubscribe(directory,correlationId){if(!correlationId)return null;return withEvidenceLock(directory,PR_SUBSCRIPTIONS_FILE,STORE_LOCK_AGENT2,STORE_LOCK_TASK2,async()=>{let match=readAllRecords(directory).find((r)=>r.correlationId===correlationId&&r.status==="active");if(!match)return null;let now=Date.now(),removed={...match,status:"removed",isWatching:!1,updatedAt:now};return appendRecord2(directory,removed),removed})}async function listActive(directory){return readAllRecords(directory).filter((r)=>r.status==="active")}async function lookupByPr(directory,repoFullName,prNumber){for(let record2 of readAllRecords(directory))if(record2.status==="active"&&record2.repoFullName===repoFullName&&record2.prNumber===prNumber)return record2;return null}async function updateSnapshot(directory,correlationId,updates){if(!correlationId)return null;return withEvidenceLock(directory,PR_SUBSCRIPTIONS_FILE,STORE_LOCK_AGENT2,STORE_LOCK_TASK2,async()=>{let match=readAllRecords(directory).find((r)=>r.correlationId===correlationId&&r.status==="active");if(!match)return null;let updated={...match,...updates,correlationId,sessionID:match.sessionID,repoFullName:match.repoFullName,prNumber:match.prNumber,prUrl:match.prUrl,createdAt:match.createdAt,updatedAt:Date.now()};return appendRecord2(directory,updated),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_AGENT2,STORE_LOCK_TASK2,async()=>{let swept=0;for(let record2 of readAllRecords(directory)){if(record2.status!=="active")continue;let prKey=`${record2.repoFullName}::${record2.prNumber}`,isMerged=mergedPrs?.has(prKey)??!1,isStale=now-record2.updatedAt>ttlMs;if(isMerged){appendRecord2(directory,{...record2,status:"expired",isWatching:!1,updatedAt:now}),swept+=1,log(`[pr-monitor] Swept subscription: merged/closed: ${prKey}`);continue}if(isStale&&!record2.hasUnaddressedEvents)appendRecord2(directory,{...record2,status:"expired",isWatching:!1,updatedAt:now}),swept+=1,log(`[pr-monitor] Swept subscription: stale (TTL ${ttlDays}d): ${prKey}`)}return swept})}catch(err){return log(`[pr-monitor] sweepStale failed: ${err instanceof Error?err.message:String(err)}`),0}}var PR_SUBSCRIPTIONS_FILE="pr-monitor/subscriptions.jsonl",STORE_LOCK_AGENT2="pr-monitor",STORE_LOCK_TASK2="pr-subscriptions",onSubscriptionCreated=null,RecordSchema2;var init_pr_subscriptions=__esm(()=>{init_zod();init_lock();init_utils2();init_utils();RecordSchema2=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(/^[^/]+\/[^/]+$/,"Must be owner/repo format"),prUrl:exports_external.string().min(1).regex(/^https:\/\/github\.com\/[^/]+\/[^/]+\/pull\/\d+$/,"Must be a valid GitHub PR URL"),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()});var exports_state={};__export(exports_state,{updateAgentEventTime:()=>updateAgentEventTime,takeReviewerScopeGeneration:()=>takeReviewerScopeGeneration,sweepStaleSessions:()=>sweepStaleSessions,swarmState:()=>swarmState,startReviewerScopeGeneration:()=>startReviewerScopeGeneration,startAgentSession:()=>startAgentSession,setSessionEnvironment:()=>setSessionEnvironment,setCriticalShownIds:()=>setCriticalShownIds,reviewerScopeGenerationHasDeclaredOverlap:()=>reviewerScopeGenerationHasDeclaredOverlap,resolveSessionWorkspaceDirectory:()=>resolveSessionWorkspaceDirectory,resetSwarmStatePreservingSingletons:()=>resetSwarmStatePreservingSingletons,resetSwarmState:()=>resetSwarmState,resetModifiedFilesForTask:()=>resetModifiedFilesForTask,rehydrateSessionFromDisk:()=>rehydrateSessionFromDisk,rehydratePrSubscriptions:()=>rehydratePrSubscriptions,recordStageBCompletion:()=>recordStageBCompletion,recordSessionWorkspaceRoot:()=>recordSessionWorkspaceRoot,recordReviewerScopeGenerationFileFingerprint:()=>recordReviewerScopeGenerationFileFingerprint,recordReviewerScopeGenerationFile:()=>recordReviewerScopeGenerationFile,recordPhaseAgentDispatch:()=>recordPhaseAgentDispatch,recordModifiedFilesForTask:()=>recordModifiedFilesForTask,recordModifiedFileForTask:()=>recordModifiedFileForTask,pruneOldWindows:()=>pruneOldWindows,peekReviewerScopeGenerationClaim:()=>peekReviewerScopeGenerationClaim,peekReadyReviewerScopeGeneration:()=>peekReadyReviewerScopeGeneration,maybeSweepStaleSessions:()=>maybeSweepStaleSessions,markReviewerScopeGenerationReady:()=>markReviewerScopeGenerationReady,isReviewerScopeGenerationCurrent:()=>isReviewerScopeGenerationCurrent,isCouncilGateActive:()=>isCouncilGateActive,incrementGateDenialCount:()=>incrementGateDenialCount,hasBothStageBCompletions:()=>hasBothStageBCompletions,hasActiveTurboMode:()=>hasActiveTurboMode,hasActiveLeanTurbo:()=>hasActiveLeanTurbo,hasActiveFullAuto:()=>hasActiveFullAuto,hasActiveEpicMode:()=>hasActiveEpicMode,getTaskState:()=>getTaskState,getSessionEnvironment:()=>getSessionEnvironment,getRunContext:()=>getRunContext,getReviewerScopeOwnershipHistory:()=>getReviewerScopeOwnershipHistory,getReviewerScopeGenerationForCoderCall:()=>getReviewerScopeGenerationForCoderCall,getResolvedAutoProceed:()=>getResolvedAutoProceed,getModifiedFilesForTask:()=>getModifiedFilesForTask,getAgentSession:()=>getAgentSession,getActiveWindow:()=>getActiveWindow,getActiveFullAutoSessionID:()=>getActiveFullAutoSessionID,ensureSessionEnvironment:()=>ensureSessionEnvironment,ensureAgentSession:()=>ensureAgentSession,endAgentSession:()=>endAgentSession,discardReviewerScopeGenerationForCoderCall:()=>discardReviewerScopeGenerationForCoderCall,discardReviewerScopeGenerationClaim:()=>discardReviewerScopeGenerationClaim,defaultRunContext:()=>defaultRunContext,completeModifiedFilesForTask:()=>completeModifiedFilesForTask,clearGateDenialCount:()=>clearGateDenialCount,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:()=>_internals38,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_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 randomUUID6}from"node:crypto";import*as fs35 from"node:fs/promises";import*as path68 from"node:path";function cloneReviewerScopeGeneration(generation){return{...generation,declaredFiles:[...generation.declaredFiles],modifiedFiles:[...generation.modifiedFiles],modifiedFileFingerprints:generation.modifiedFileFingerprints.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((fingerprint)=>({...fingerprint}))}}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.lastBudgetPct=0,swarmState.agentSessions.clear(),_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=[],_rehydrationCache=null,swarmState.fullAutoEnabledInConfig=!1,swarmState.environmentProfiles.clear(),clearPendingCoderScope();for(let binding of clearScopeBindings())clearScopeBindingFromDisk({directory:binding.workspaceIdentity,taskId:binding.taskId,ownerSessionId:binding.ownerSessionId});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??=randomUUID6(),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[key,entry]of generations){if(entry.status==="claimed")continue;if(!Number.isFinite(entry.createdAt)||now<entry.createdAt||now-entry.createdAt>REVIEWER_SCOPE_GENERATION_TTL_MS)generations.delete(key)}}function startReviewerScopeGeneration(input){let session=swarmState.agentSessions.get(input.parentSessionID);if(!session||!isBoundedGenerationValue(input.taskId,512)||!isBoundedGenerationValue(input.coderCallID,512))return null;let now=input.createdAt??Date.now();sweepReviewerScopeGenerations(session,now);let{generations,counter,incarnation,latestByTask}=ensureReviewerScopeGenerationState(session);for(let[key2,entry]of generations)if(entry.taskId===input.taskId&&entry.status!=="claimed")generations.delete(key2);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,declaredFiles:[...new Set(input.declaredFiles??[])],modifiedFiles:[],modifiedFileFingerprints:[],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 key=reviewerScopeGenerationKey(generation.taskId,generation.coderCallID,generation.generation);return generations.set(key,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 key=reviewerScopeGenerationKey(generation.taskId,generation.coderCallID,generation.generation);return generations.delete(key),!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;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 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;if(matches[0].status==="ready")return!0;return matches[0].status="ready",matches[0].readyAt=now,!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 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[key,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,declaredFiles:[...generation.declaredFiles],modifiedFiles:[...generation.modifiedFiles],modifiedFileFingerprints:generation.modifiedFileFingerprints.map((fingerprint)=>({...fingerprint})),createdAt:generation.createdAt,readyAt:generation.readyAt,consumedAt:input.now??Date.now()};ownershipHistory.set(reviewerScopeOwnershipKey(tombstone.taskId,tombstone.coderCallID,tombstone.generation,tombstone.sessionIncarnation),tombstone)}return generations.delete(key),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((file2)=>declared.has(file2)))}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()){let staleIds=[];for(let[id,session]of swarmState.agentSessions)if(now-session.lastToolCallTime>staleDurationMs)staleIds.push(id);for(let id of staleIds)swarmState.agentSessions.delete(id),swarmState.delegationChains.delete(id);return staleIds}function maybeSweepStaleSessions(staleDurationMs=STALE_SESSION_TTL_MS,now=Date.now()){if(now-_lastIdleSweepAtMs<IDLE_SWEEP_COOLDOWN_MS)return[];return _lastIdleSweepAtMs=now,sweepStaleSessions(staleDurationMs,now)}function startAgentSession(sessionId,agentName,staleDurationMs=STALE_SESSION_TTL_MS,directory){let now=Date.now();sweepStaleSessions(staleDurationMs,now);let 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,stageBCompletion:new Map,taskCouncilApproved:new Map,pendingCouncilRequirements:new Map,lastGateOutcome:null,declaredCoderScope:null,lastScopeViolation:null,scopeViolationDetected:!1,modifiedFilesByTask:new Map,modifiedFilesThisCoderTask:[],reviewerScopeGenerations:new Map,reviewerScopeGenerationCounter:0,reviewerScopeIncarnation:randomUUID6(),reviewerScopeLatestGenerationByTask:new Map,reviewerScopeOwnershipHistory:new Map,turboMode:!1,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,prmPatternCounts:new Map,prmEscalationLevel:0,prmLastPatternDetected:null,prmTrajectoryStep:0,prmHardStopPending:!1,prmInjectedAdvisoryKeys:new Set,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),_internals38.applyRehydrationCache(sessionState),directory){let rehydrationPromise;rehydrationPromise=_internals38.rehydrateSessionFromDisk(directory,sessionState).then(async()=>{try{sessionState.prSubscriptions=await rehydratePrSubscriptions(sessionId,directory)}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){let removedBindings=clearScopeBindings((binding)=>binding.ownerSessionId===sessionId||binding.parentOwnerSessionId===sessionId);for(let binding of removedBindings)clearScopeBindingFromDisk({directory:binding.workspaceIdentity,taskId:binding.taskId,ownerSessionId:binding.ownerSessionId});swarmState.agentSessions.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(),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.stageBCompletion)session.stageBCompletion=new Map;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=randomUUID6();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.prmInjectedAdvisoryKeys)session.prmInjectedAdvisoryKeys=new Set;if(!session.prSubscriptions)session.prSubscriptions=new Map;return session.lastToolCallTime=now,maybeSweepStaleSessions(),session}if(_internals38.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),newId=(session.lastInvocationIdByAgent[stripped]||0)+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},key=`${stripped}:${newId}`;return session.windows[key]=window2,pruneOldWindows(sessionId,86400000,50),telemetry.delegationBegin(sessionId,stripped,session.currentTaskId??"unknown"),window2}function getActiveWindow(sessionId){let session=swarmState.agentSessions.get(sessionId);if(!session||!session.windows)return;let key=`${stripKnownSwarmPrefix(session.agentName)}:${session.activeInvocationId}`;return session.windows[key]}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){if(!ensureModifiedFileTaskSlot(session,taskId))return!1;let normalized=[...new Set(files.filter((file2)=>typeof file2==="string"&&file2.length>0))];if(session.modifiedFilesByTask.set(taskId,normalized),session.currentTaskId===taskId)projectModifiedFilesForActiveTask(session);return!0}function recordModifiedFileForTask(session,taskId,file2){if(typeof file2!=="string"||file2.length===0)return!1;let existing=getModifiedFilesForTask(session,taskId);if(existing.includes(file2))return!0;return recordModifiedFilesForTask(session,taskId,[...existing,file2])}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 advanceTaskState(session,taskId,newState,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=STATE_ORDER.indexOf(current);if(STATE_ORDER.indexOf(newState)<=currentIndex)throw Error(`INVALID_TASK_STATE_TRANSITION: ${taskId} ${current} → ${newState}`);if(newState==="complete"&&current!=="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>=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,newState),newState==="complete")session.stageBCompletion?.delete(taskId),completeModifiedFilesForTask(session,taskId);if(options?.emitTelemetry!==!1)telemetry.taskStateChanged(options?.telemetrySessionId??session.agentName,taskId,newState,current)}function canAdvanceTaskState(session,taskId,newState,councilConfig){if(!isValidTaskId2(taskId))return!1;if(!session||!(session.taskWorkflowStates instanceof Map))return!1;let current=session.taskWorkflowStates.get(taskId)??"idle",currentIndex=STATE_ORDER.indexOf(current);if(STATE_ORDER.indexOf(newState)<=currentIndex)return!1;if(newState==="complete"&&current!=="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>=STATE_ORDER.indexOf("pre_check_passed");if(!councilApproved||!pastPreCheck)return!1}return!0}async function advanceTaskStateAndPersist(session,taskId,newState,directory,options,councilConfig){if(newState==="coder_delegated"){if(await isTaskSettled(directory,taskId)){warn(`[advanceTaskStateAndPersist] refusing to re-dispatch settled task ${taskId}; skipping in-memory advance + persist`);return}}if(advanceTaskState(session,taskId,newState,options,councilConfig),newState!=="coder_delegated"&&newState!=="complete")return;let planStatus=newState==="complete"?"completed":"in_progress";try{await updateTaskStatus(directory,taskId,planStatus,{force:!1})}catch(err){warn(`[advanceTaskStateAndPersist] persist ${taskId} → ${planStatus} failed (in-memory state still advanced): ${err instanceof Error?err.message:String(err)}`)}}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 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),profile=null;try{profile=getProfile(directory,planId)}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.`);profile=null}if(!profile)return!1;let 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"coder_delegated";case"completed":return"complete";default:return"idle"}}function evidenceToWorkflowState(evidence2){let gates=evidence2.gates??{},requiredGates=evidence2.required_gates??[];if(requiredGates.length>0){if(requiredGates.every((gate)=>gates[gate]!=null))return"complete"}if(gates.test_engineer!=null)return"tests_run";if(gates.reviewer!=null)return"reviewer_run";if(Object.keys(gates).length>0)return"coder_delegated";return"idle"}async function readPlanFromDisk(directory){try{let planPath=path68.join(directory,".swarm","plan.json"),content=await fs35.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=path68.join(directory,".swarm","evidence"),entries=await fs35.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=path68.join(evidenceDir,entry.name),content=await fs35.readFile(filePath,"utf-8"),parsed=JSON.parse(content);if(parsed&&typeof parsed.taskId==="string"&&Array.isArray(parsed.required_gates))evidenceMap.set(taskId,parsed)}catch{}}}catch{}return evidenceMap}async function buildRehydrationCache(directory){let planTaskStates=new Map,plan=await readPlanFromDisk(directory);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);_rehydrationCache={planTaskStates,evidenceMap}}function applyRehydrationCache(session){if(!_rehydrationCache)return;if(!session.taskWorkflowStates)session.taskWorkflowStates=new Map;if(!session.taskCouncilApproved)session.taskCouncilApproved=new Map;let{planTaskStates,evidenceMap}=_rehydrationCache;for(let[taskId,planState]of planTaskStates){let existingState=session.taskWorkflowStates.get(taskId),evidence2=evidenceMap.get(taskId);if(evidence2){let derivedState=evidenceToWorkflowState(evidence2),existingIndex=existingState?STATE_ORDER.indexOf(existingState):-1;if(STATE_ORDER.indexOf(derivedState)>existingIndex)session.taskWorkflowStates.set(taskId,derivedState)}else{let existingIndex=existingState?STATE_ORDER.indexOf(existingState):-1;if(STATE_ORDER.indexOf(planState)>existingIndex)session.taskWorkflowStates.set(taskId,planState)}}let VALID_COUNCIL_VERDICTS=new Set(["APPROVE","REJECT","CONCERNS"]);for(let[taskId,evidence2]of evidenceMap){if(session.taskCouncilApproved.has(taskId))continue;let council=evidence2.gates?.council;if(!council)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){await _internals38.buildRehydrationCache(directory),_internals38.applyRehydrationCache(session)}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 setCriticalShownIds(sessionID,value){let map2=swarmState.currentCriticalShownIds;if(map2.has(sessionID))map2.delete(sessionID);if(map2.set(sessionID,value),map2.size>MAX_TRACKED_CRITICAL_SHOWN){let oldest=map2.keys().next().value;if(oldest!==void 0&&oldest!==sessionID)map2.delete(oldest)}}function clearCriticalShownIds(sessionID){return swarmState.currentCriticalShownIds.delete(sessionID)}function buildGateDenialDirectiveKey(ids){return[...ids].sort().join(",")}function incrementGateDenialCount(sessionID,directiveKey){let map2=swarmState.gateDenialCounts,existing=map2.get(sessionID),count=existing&&existing.directiveKey===directiveKey?existing.count+1:1;if(map2.has(sessionID))map2.delete(sessionID);if(map2.set(sessionID,{count,directiveKey}),map2.size>MAX_TRACKED_GATE_DENIALS){let oldest=map2.keys().next().value;if(oldest!==void 0&&oldest!==sessionID)map2.delete(oldest)}return count}function clearGateDenialCount(sessionID){swarmState.gateDenialCounts.delete(sessionID)}function addKnowledgeAckDedup(key){let set2=swarmState.knowledgeAckDedup;if(set2.has(key))return;if(set2.add(key),set2.size>MAX_TRACKED_KNOWLEDGE_ACKS){let oldest=set2.values().next().value;if(oldest!==void 0)set2.delete(oldest)}}async function rehydratePrSubscriptions(sessionID,directory){let map2=new Map;try{let{listActive:listActive2}=await Promise.resolve().then(() => (init_pr_subscriptions(),exports_pr_subscriptions)),records=await listActive2(directory);for(let record2 of records){if(record2.sessionID!==sessionID)continue;let key=`${record2.repoFullName}::${record2.prNumber}`;map2.set(key,{prNumber:record2.prNumber,repoFullName:record2.repoFullName,prUrl:record2.prUrl,lastKnownStatus:record2.mergeableState??"unknown",lastPollTime:record2.lastCheckedAt,errorCount:record2.errorCount,isWatching:record2.isWatching})}}catch(err){warn(`[state] rehydratePrSubscriptions failed for session ${sessionID}: ${err instanceof Error?err.message:String(err)}`)}return map2}var _rehydrationCache=null,_councilDisagreementWarned,MAX_TRACKED_TASK_FILE_ATTRIBUTIONS=128,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_CRITICAL_SHOWN=500,MAX_TRACKED_KNOWLEDGE_ACKS=5000,MAX_TRACKED_GATE_DENIALS=500,_internals38;var init_state2=__esm(()=>{init_constants();init_plan_schema();init_schema();init_qa_gate_profile();init_delegation_gate();init_realtime_learning_nudge();init_trajectory_step_state();init_candidate_queue();init_prm_pattern_support();init_manager();init_utils3();init_trajectory_store();init_scope_binding();init_scope_persistence();init_session_start_store();init_worktree_link_suggestion();init_telemetry();init_logger();_councilDisagreementWarned=new Set,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:[],lastBudgetPct:0,agentSessions:defaultRunContext.agentSessions,pendingRehydrations:new Set,fullAutoEnabledInConfig:!1,environmentProfiles:defaultRunContext.environmentProfiles};REVIEWER_SCOPE_GENERATION_TTL_MS=STALE_SESSION_TTL_MS;_internals38={swarmState,resetSwarmState,ensureAgentSession,startAgentSession,getAgentSession,beginInvocation,getActiveWindow,advanceTaskState,getTaskState,hasActiveFullAuto,hasActiveTurboMode,hasActiveLeanTurbo,hasActiveEpicMode,buildRehydrationCache,applyRehydrationCache,rehydrateSessionFromDisk,isCouncilGateActive,defaultRunContext}});async function handleAutoProceedCommand(_directory,args2,sessionID){if(!sessionID||sessionID.trim()==="")return"Error: No active session context. Auto-proceed requires an active session. Use /swarm auto-proceed from within an OpenCode session, or start a session first.";let session=getAgentSession(sessionID);if(!session)return"Error: No active session. Auto-proceed requires an active session to operate.";if(stripKnownSwarmPrefix(session.agentName)!=="architect")return`Error: Auto-proceed can only be toggled from the architect session. Currently active session is: ${session.agentName}`;let arg=args2[0]?.toLowerCase(),wasUndefinedBefore=session.autoProceedOverride===void 0,newAutoProceedOverride;if(arg==="on")newAutoProceedOverride=!0;else if(arg==="off")newAutoProceedOverride=!1;else if(arg===void 0)newAutoProceedOverride=!session.autoProceedOverride;else return'Error: Invalid argument for /swarm auto-proceed. Valid options: "on", "off", or omit the argument to toggle.';if(session.autoProceedOverride=newAutoProceedOverride,arg==="on"||arg==="off"||arg===void 0&&wasUndefinedBefore)session.autoProceedNudgeDone=!0;if(newAutoProceedOverride)return"Auto-proceed is now ON. Phase boundaries will advance automatically.";else return"Auto-proceed is now OFF. You will be asked before advancing to the next phase."}var init_auto_proceed=__esm(()=>{init_schema();init_state2()});import{mkdir as mkdir10,readFile as readFile14}from"node:fs/promises";import*as path69 from"node:path";function gateGroundTruthJoinKey(value){return[value.runId,value.taskId,value.candidateId,value.model,value.gate,String(value.repetition)].join("\x00")}function relativePath(runId){return path69.join("evidence","gate-audit",runId,"ground-truth.jsonl")}function absolutePath(directory,runId){return path69.join(directory,".swarm",relativePath(runId))}function serialize(events){return`${events.map((event)=>canonicalJson(event)).join(`
739
739
  `)}
740
740
  `}function parseStrict(content){return content.split(/\r?\n/).filter((line)=>line.trim()).map((line)=>GateGroundTruthV1Schema.parse(JSON.parse(line)))}async function saveGateGroundTruth(directory,runId,input){let events=input.map((event)=>GateGroundTruthV1Schema.parse(event));if(events.some((event)=>event.runId!==runId))throw Error("gate ground truth run id does not match its storage path");let target=absolutePath(directory,runId);return await mkdir10(path69.dirname(target),{recursive:!0}),withEvidenceLock(directory,relativePath(runId),"gate-ground-truth",runId,async()=>{let existingEvents=[];try{existingEvents=parseStrict(await readFile14(target,"utf8"))}catch(error49){if(error49.code!=="ENOENT")throw error49}let byCanonicalEvent=new Map;for(let event of[...existingEvents,...events]){if(event.runId!==runId)throw Error("gate ground truth run id does not match its storage path");byCanonicalEvent.set(canonicalJson(event),event)}let merged=[...byCanonicalEvent.values()].sort((left,right)=>{return gateGroundTruthJoinKey(left).localeCompare(gateGroundTruthJoinKey(right))||canonicalJson(left).localeCompare(canonicalJson(right))}),desired=serialize(merged);if(serialize(existingEvents)!==desired)await atomicWriteFile(target,desired);return merged})}async function recordTestImpactGateGroundTruth(directory,runId,input){return saveGateGroundTruth(directory,runId,input.map((event)=>({...event,v:1,source:"test-impact"})))}async function readGateGroundTruth(directory,runId){let content;try{content=await readFile14(absolutePath(directory,runId),"utf8")}catch(error49){if(error49.code==="ENOENT")return{events:[],malformed:0};throw error49}let events=[],malformed=0;for(let line of content.split(/\r?\n/)){if(!line.trim())continue;try{let event=GateGroundTruthV1Schema.parse(JSON.parse(line));if(event.runId!==runId)throw Error("run id/path mismatch");events.push(event)}catch{malformed++}}return{events,malformed}}var GateGroundTruthV1Schema;var init_gate_ground_truth=__esm(()=>{init_zod();init_lock();init_task_file();init_contracts();init_hashing();GateGroundTruthV1Schema=exports_external.object({v:exports_external.literal(1),runId:IdentifierSchema,taskId:IdentifierSchema,candidateId:IdentifierSchema,model:exports_external.string().min(1).max(300),gate:GateNameSchema,repetition:exports_external.number().int().nonnegative(),source:exports_external.enum(["integration","test-impact"]),classification:exports_external.enum(["clean","new_regression","pre_existing","flaky","infrastructure_failure","unknown"]),observedAt:exports_external.iso.datetime({offset:!0}),confidence:exports_external.number().min(0).max(1).optional()}).strict()});import*as fs36 from"node:fs";import*as path70 from"node:path";function wilson95(successes,total){if(total===0)return null;let z2=1.959963984540054,p=successes/total,denominator=1+z2*z2/total,center=(p+z2*z2/(2*total))/denominator,margin=z2/denominator*Math.sqrt(p*(1-p)/total+z2*z2/(4*total*total));return[Math.max(0,center-margin),Math.min(1,center+margin)]}function telemetryStats(directory){let summary={parsed:0,skipped:0,genuine:0,fallback:0,dataQuality:0,blocked:0,fallbackToGenuineRatio:null};for(let filename of["telemetry.jsonl.1","telemetry.jsonl"]){let content="";try{content=fs36.readFileSync(path70.join(directory,".swarm",filename),"utf8")}catch(error49){if(error49.code!=="ENOENT")summary.skipped++;continue}for(let line of content.split(/\r?\n/)){if(!line.trim())continue;let event;try{let value=JSON.parse(line);if(!value||typeof value!=="object"||Array.isArray(value))throw Error("not an object");event=value}catch{summary.skipped++;continue}if(event.event!=="reviewer_gate_decision")continue;let kind=event.evidenceKind;if(!["genuine","fallback","data_quality","block"].includes(String(kind))){summary.skipped++;continue}if(summary.parsed++,kind==="genuine")summary.genuine++;else if(kind==="fallback")summary.fallback++;else if(kind==="data_quality")summary.dataQuality++;else summary.blocked++}}return summary.fallbackToGenuineRatio=summary.genuine===0?null:summary.fallback/summary.genuine,summary}function summarizeCells(cells,truthByKey,minSamples){let groups=new Map;for(let audited of cells){let key=`${audited.cell.model}\x00${audited.cell.gate}`,group=groups.get(key)??[];group.push(audited),groups.set(key,group)}let ambiguous=0,unjoined=0;return{models:[...groups.values()].map((group)=>{let first=group[0].cell,joined=[];for(let audited of group){if(!audited.cell.candidateId){unjoined++;continue}let matches=truthByKey.get(gateGroundTruthJoinKey({runId:audited.runId,taskId:audited.cell.taskId,candidateId:audited.cell.candidateId,model:audited.cell.model,gate:audited.cell.gate,repetition:audited.cell.repetition}))??[];if(matches.length===0){unjoined++;continue}if(new Set(matches.map((match)=>match.classification)).size!==1){ambiguous++;continue}joined.push({cell:audited.cell,truth:matches.find((match)=>match.source==="test-impact")??matches[0]})}let regressionCells=joined.filter((entry)=>entry.truth.classification==="new_regression"),caught=regressionCells.filter((entry)=>entry.cell.outcome==="caught").length,missed=regressionCells.filter((entry)=>entry.cell.outcome==="missed").length,denominator=caught+missed,cleanCells=joined.filter((entry)=>entry.truth.classification==="clean"),falseRejections=cleanCells.filter((entry)=>entry.cell.outcome==="caught"||entry.cell.outcome==="false_rejection").length,negativeControls=cleanCells.filter((entry)=>["caught","missed","false_rejection"].includes(entry.cell.outcome)).length,knownCosts=group.filter((entry)=>entry.cell.cost.source!=="unavailable");return{model:first.model,gate:first.gate,total:group.length,caught,missed,falseRejections,negativeControls,infrastructureFailures:group.filter((entry)=>entry.cell.outcome==="infrastructure_failure").length,unsupported:group.filter((entry)=>entry.cell.outcome==="unsupported").length,catchRate:denominator===0?null:caught/denominator,confidenceInterval:wilson95(caught,denominator),falseRejectionRate:negativeControls===0?null:falseRejections/negativeControls,falseRejectionConfidenceInterval:wilson95(falseRejections,negativeControls),insufficientData:denominator<minSamples||negativeControls<minSamples,retries:{total:group.reduce((sum,entry)=>sum+entry.cell.retries,0),maximum:Math.max(0,...group.map((entry)=>entry.cell.retries))},cost:{usd:knownCosts.reduce((sum,entry)=>sum+(entry.cell.cost.usd??0),0),unavailable:group.length-knownCosts.length}}}).sort((left,right)=>`${left.model}\x00${left.gate}`.localeCompare(`${right.model}\x00${right.gate}`)),ambiguous,unjoined}}async function computeGateStatistics(directory,minSamples=6,runId){if(!Number.isInteger(minSamples)||minSamples<1||minSamples>1e4)throw Error("minSamples must be an integer between 1 and 10000");let audit=await listGateAuditResults(directory),results=runId?audit.results.filter((result)=>result.runId===runId):audit.results,truthSummaries=await Promise.all(results.map((result)=>readGateGroundTruth(directory,result.runId))),truthByKey=new Map;for(let summary2 of truthSummaries)for(let event of summary2.events){let key=gateGroundTruthJoinKey(event),group=truthByKey.get(key)??[];group.push(event),truthByKey.set(key,group)}let summary=summarizeCells(results.flatMap((result)=>result.cells.map((cell)=>({runId:result.runId,cell}))),truthByKey,minSamples);return{runs:results.length,corruptRuns:runId?audit.corruptRunIds.filter((corruptRunId)=>corruptRunId===runId):audit.corruptRunIds,groundTruth:{parsed:truthSummaries.reduce((total,value)=>total+value.events.length,0),malformed:truthSummaries.reduce((total,value)=>total+value.malformed,0),ambiguous:summary.ambiguous,unjoined:summary.unjoined},models:summary.models,reviewerTelemetry:telemetryStats(directory)}}var init_gate_stats=__esm(()=>{init_gate_ground_truth();init_store()});import*as fs37 from"node:fs";import*as os13 from"node:os";import*as path71 from"node:path";function buildDelegationCostFields(input={}){let extracted=extractUsageAndCost(input.raw),usage=extracted.usage,model=extracted.model??input.model,reportedCost=extracted.cost_usd;if(reportedCost!==null)return{...usage,cost_usd:roundUsd(reportedCost),cost_source:"reported",model,gate:input.gate,retry_index:input.retry_index};let estimated=estimateCostUsd(usage,model,input.pricing);if(estimated!==null)return{...usage,cost_usd:roundUsd(estimated),cost_source:"estimated",model,gate:input.gate,retry_index:input.retry_index};return{...usage,cost_usd:null,cost_source:"unavailable",model,gate:input.gate,retry_index:input.retry_index}}function summarizeTelemetryCosts(directory){let summary=createEmptySummary();for(let event of readTelemetryEvents(directory)){if(event.event!=="delegation_end")continue;addDelegationEvent(summary,event)}return finalizeSummary(summary)}function readTelemetryEvents(directory){let swarmDir=path71.join(directory,".swarm"),files=[path71.join(swarmDir,"telemetry.jsonl.1"),path71.join(swarmDir,"telemetry.jsonl")],tmpDir=fs37.mkdtempSync(path71.join(os13.tmpdir(),"telemetry-snapshot-")),snapshotFiles=[];try{for(let file2 of files){if(!fs37.existsSync(file2))continue;let snap=path71.join(tmpDir,path71.basename(file2));try{fs37.copyFileSync(file2,snap),snapshotFiles.push(snap)}catch{}}}catch{}let events=[];for(let file2 of snapshotFiles){let content="";try{content=fs37.readFileSync(file2,"utf-8")}catch{continue}for(let line of content.split(/\r?\n/)){let trimmed=line.trim();if(!trimmed)continue;try{let parsed=JSON.parse(trimmed);if(isRecord(parsed))events.push(parsed)}catch{}}}try{for(let f of snapshotFiles)try{fs37.unlinkSync(f)}catch{}fs37.rmdirSync(tmpDir)}catch{}return events}function estimateCostUsd(usage,model,pricing){if(!model)return null;let table={...BUNDLED_MODEL_PRICING,...pricing?.models??{}},entry=table[model]??table[model.toLowerCase()];if(!entry)return null;let cost=usage.tokens_input/1e6*entry.input_per_million+usage.tokens_output/1e6*entry.output_per_million+usage.tokens_reasoning/1e6*(entry.reasoning_per_million??entry.output_per_million)+usage.tokens_cache/1e6*(entry.cache_per_million??entry.input_per_million);return cost>0?cost:null}function extractUsageAndCost(raw){let candidates=collectCandidateRecords(raw),usage={...ZERO_USAGE},cost_usd=null,model;for(let candidate of candidates){model??=readModelIdentifier(candidate),cost_usd??=readNumber(candidate,["cost_usd","total_cost_usd","cost","totalCost"]);let directInput=readNumber(candidate,["tokens_input","input_tokens","input","prompt_tokens"]),directOutput=readNumber(candidate,["tokens_output","output_tokens","output","completion_tokens"]),directReasoning=readNumber(candidate,["tokens_reasoning","reasoning_tokens","reasoning"]),directCache=readNumber(candidate,["tokens_cache","cache_tokens","cache_read_input_tokens","cached_input_tokens","cache_write_input_tokens","cache"]),nestedCache=readCacheTokens(candidate);usage.tokens_input||=directInput??0,usage.tokens_output||=directOutput??0,usage.tokens_reasoning||=directReasoning??0,usage.tokens_cache||=directCache??nestedCache??0}return{usage,cost_usd,model}}function collectCandidateRecords(raw){let records=[],visit=(value,depth)=>{if(depth>3||!isRecord(value))return;records.push(value);for(let key of["usage","tokens","cache","cost","metadata","data","info","message","assistant","task","part","response","output"])visit(value[key],depth+1)};return visit(raw,0),records}function readNumber(record2,keys){for(let key of keys){let value=record2[key];if(typeof value==="number"&&Number.isFinite(value)&&value>=0)return value;if(typeof value==="string"&&value.trim()!==""){let parsed=Number(value);if(Number.isFinite(parsed)&&parsed>=0)return parsed}}return null}function readString(record2,keys){for(let key of keys){let value=record2[key];if(typeof value==="string"&&value.trim()!=="")return value.trim()}return}function readModelIdentifier(record2){let direct=readString(record2,["model","model_id"]);if(direct)return direct;let modelID=readString(record2,["modelID"]),providerID=readString(record2,["providerID"]);if(modelID&&providerID)return`${providerID}/${modelID}`;return modelID}function readCacheTokens(record2){let cacheRecord=isRecord(record2.cache)?record2.cache:record2,read=readNumber(cacheRecord,["read","cache_read_input_tokens"]),write=readNumber(cacheRecord,["write","cache_write_input_tokens","write_input_tokens"]);if(read===null&&write===null)return null;return(read??0)+(write??0)}function isRecord(value){return typeof value==="object"&&value!==null&&!Array.isArray(value)}function createEmptySummary(){return{total_cost_usd:0,total_reported_usd:0,total_estimated_usd:0,total_input_tokens:0,total_output_tokens:0,total_reasoning_tokens:0,total_cache_tokens:0,delegations:0,unavailable_delegations:0,by_agent:[],by_task:[],by_gate:[],by_retry:[],by_source:{reported:{delegations:0,cost_usd:0},estimated:{delegations:0,cost_usd:0},unavailable:{delegations:0,cost_usd:0}}}}function addDelegationEvent(summary,event){let costSource=parseCostSource(event.cost_source),cost=readNumber(event,["cost_usd"])??0,usage={tokens_input:readNumber(event,["tokens_input"])??0,tokens_output:readNumber(event,["tokens_output"])??0,tokens_reasoning:readNumber(event,["tokens_reasoning"])??0,tokens_cache:readNumber(event,["tokens_cache"])??0};if(summary.delegations++,summary.total_cost_usd+=cost,summary.total_input_tokens+=usage.tokens_input,summary.total_output_tokens+=usage.tokens_output,summary.total_reasoning_tokens+=usage.tokens_reasoning,summary.total_cache_tokens+=usage.tokens_cache,summary.by_source[costSource].delegations++,summary.by_source[costSource].cost_usd+=cost,costSource==="reported")summary.total_reported_usd+=cost;if(costSource==="estimated")summary.total_estimated_usd+=cost;if(costSource==="unavailable")summary.unavailable_delegations++;addRow(summary.by_agent,String(event.agentName??event.agent??"unknown"),{cost,costSource,usage}),addRow(summary.by_task,String(event.taskId??event.task_id??"unknown"),{cost,costSource,usage}),addRow(summary.by_gate,String(event.gate??"unknown"),{cost,costSource,usage}),addRow(summary.by_retry,String(readNumber(event,["retry_index","retryIndex"])??0),{cost,costSource,usage})}function addRow(rows,name,input){let row=rows.find((candidate)=>candidate.name===name);if(!row)row={name,delegations:0,cost_usd:0,input_tokens:0,output_tokens:0,reasoning_tokens:0,cache_tokens:0,unavailable_delegations:0},rows.push(row);if(row.delegations++,row.cost_usd+=input.cost,row.input_tokens+=input.usage.tokens_input,row.output_tokens+=input.usage.tokens_output,row.reasoning_tokens+=input.usage.tokens_reasoning,row.cache_tokens+=input.usage.tokens_cache,input.costSource==="unavailable")row.unavailable_delegations++}function finalizeSummary(summary){summary.total_cost_usd=roundUsd(summary.total_cost_usd),summary.total_reported_usd=roundUsd(summary.total_reported_usd),summary.total_estimated_usd=roundUsd(summary.total_estimated_usd);for(let source of Object.values(summary.by_source))source.cost_usd=roundUsd(source.cost_usd);for(let rows of[summary.by_agent,summary.by_task,summary.by_gate,summary.by_retry]){for(let row of rows)row.cost_usd=roundUsd(row.cost_usd);rows.sort((a,b)=>b.cost_usd-a.cost_usd||b.delegations-a.delegations)}return summary}function parseCostSource(value){return value==="reported"||value==="estimated"||value==="unavailable"?value:"unavailable"}function roundUsd(value){return Math.round(value*1e6)/1e6}var ZERO_USAGE,BUNDLED_MODEL_PRICING;var init_cost_accounting=__esm(()=>{ZERO_USAGE={tokens_input:0,tokens_output:0,tokens_reasoning:0,tokens_cache:0},BUNDLED_MODEL_PRICING={}});function summarizeGateAuditStatistics(report){let caught=report.models.reduce((total,model)=>total+model.caught,0),missed=report.models.reduce((total,model)=>total+model.missed,0),falseRejections=report.models.reduce((total,model)=>total+model.falseRejections,0),negativeControls=report.models.reduce((total,model)=>total+model.negativeControls,0),regressions=caught+missed,insufficientData=report.models.length===0||report.models.some((model)=>model.insufficientData),truthAvailable=report.runs===1&&report.corruptRuns.length===0&&report.groundTruth.parsed>0&&report.groundTruth.malformed===0&&report.groundTruth.ambiguous===0&&report.groundTruth.unjoined===0&&!insufficientData;return{caught,missed,regressions,falseRejections,negativeControls,catchRate:regressions===0?null:caught/regressions*100,falseRejectionRate:negativeControls===0?null:falseRejections/negativeControls*100,insufficientData,truthAvailable}}async function handleBenchmarkCommand(directory,args2){let cumulative=args2.includes("--cumulative");if(args2.includes("--ci-gate"))cumulative=!0;let maxCostUsd=parseMaxCostUsd(args2),gateAuditRunId=parseGateAuditRunId(args2),gateAudit=gateAuditRunId?await readGateAuditResult(directory,gateAuditRunId):void 0;if(gateAuditRunId&&!gateAudit)throw Error(`Gate-audit result not found: ${gateAuditRunId}`);let gateAuditStatistics=gateAuditRunId?await computeGateStatistics(directory,GATE_AUDIT_MIN_SAMPLES,gateAuditRunId):void 0,gateAuditSummary=gateAuditStatistics?summarizeGateAuditStatistics(gateAuditStatistics):void 0,mode=cumulative?"cumulative":"in-memory",costSummary=cumulative?summarizeTelemetryCosts(directory):void 0,agentMap=new Map;for(let[,s]of swarmState.agentSessions){let e=agentMap.get(s.agentName)||{toolCalls:0,hardLimits:0,warnings:0},windows=Object.values(s.windows);e.toolCalls+=windows.reduce((sum,w)=>sum+w.toolCalls,0),e.hardLimits+=windows.filter((w)=>w.hardLimitHit).length,e.warnings+=windows.filter((w)=>w.warningIssued).length,agentMap.set(s.agentName,e)}let agentHealth=Array.from(agentMap.entries()).map(([a,v])=>({agent:a,...v})),toolPerf=[];for(let[,a]of swarmState.toolAggregates){let successRate=a.count?a.successCount/a.count*100:0;toolPerf.push({tool:a.tool,calls:a.count,successRate:Math.round(successRate*10)/10,avg:a.count?Math.round(a.totalDuration/a.count):0})}toolPerf.sort((a,b)=>b.calls-a.calls);let delegationCount=0;for(let c of swarmState.delegationChains.values())delegationCount+=c.length;let quality,qualityMetrics;if(cumulative){let reviewPasses=0,reviewFails=0,testPasses=0,testFails=0,additions=0,deletions=0,totalComplexityDelta=0,totalPublicApiDelta=0,totalDuplicationRatio=0,totalTestToCodeRatio=0,qualityEvidenceCount=0;for(let tid of await listEvidenceTaskIds(directory)){let result;try{result=await loadEvidence(directory,tid)}catch(_evidenceErr){warn("benchmark: skipping corrupt or unreadable evidence for task",tid);continue}if(result.status!=="found")continue;for(let e of result.bundle.entries){if(!isValidEvidenceType(e.type)){warn(`Unknown evidence type '${e.type}' in task ${tid}, skipping`);continue}if(e.type==="review"){if(e.verdict==="approved")reviewPasses++;else if(e.verdict==="rejected")reviewFails++}else if(e.type==="test")testPasses+=e.tests_passed,testFails+=e.tests_failed;else if(e.type==="diff")additions+=e.additions,deletions+=e.deletions;else if(e.type==="quality_budget"){let qe=e;totalComplexityDelta+=qe.metrics.complexity_delta,totalPublicApiDelta+=qe.metrics.public_api_delta,totalDuplicationRatio+=qe.metrics.duplication_ratio*100,totalTestToCodeRatio+=qe.metrics.test_to_code_ratio*100,qualityEvidenceCount++}}}let totalReviews=reviewPasses+reviewFails,totalTests=testPasses+testFails;if(quality={reviewPassRate:totalReviews?Math.round(reviewPasses/totalReviews*1000)/10:null,testPassRate:totalTests?Math.round(testPasses/totalTests*1000)/10:null,totalReviews,testsPassed:testPasses,testsFailed:testFails,additions,deletions},qualityEvidenceCount>0)qualityMetrics={complexityDelta:Math.round(totalComplexityDelta/qualityEvidenceCount*10)/10,publicApiDelta:Math.round(totalPublicApiDelta/qualityEvidenceCount*10)/10,duplicationRatio:Math.round(totalDuplicationRatio/qualityEvidenceCount*10)/10,testToCodeRatio:Math.round(totalTestToCodeRatio/qualityEvidenceCount*10)/10,thresholds:{maxComplexityDelta:CI.max_complexity_delta,maxPublicApiDelta:CI.max_public_api_delta,maxDuplicationRatio:CI.max_duplication_ratio,minTestToCodeRatio:CI.min_test_to_code_ratio},hasEvidence:!0};else qualityMetrics={complexityDelta:0,publicApiDelta:0,duplicationRatio:0,testToCodeRatio:0,thresholds:{maxComplexityDelta:CI.max_complexity_delta,maxPublicApiDelta:CI.max_public_api_delta,maxDuplicationRatio:CI.max_duplication_ratio,minTestToCodeRatio:CI.min_test_to_code_ratio},hasEvidence:!1}}let ciGate;if(args2.includes("--ci-gate")){let totalCalls=0,totalFailures=0;for(let[,a]of swarmState.toolAggregates)totalCalls+=a.count,totalFailures+=a.failureCount;let agentErrorRate=totalCalls?totalFailures/totalCalls*100:0,maxHardLimits=0;for(let v of agentMap.values())if(v.hardLimits>maxHardLimits)maxHardLimits=v.hardLimits;let hasQualityEvidence=qualityMetrics?.hasEvidence??!1,complexityDelta=qualityMetrics?.complexityDelta??0,publicApiDelta=qualityMetrics?.publicApiDelta??0,duplicationRatio=qualityMetrics?.duplicationRatio??0,testToCodeRatio=qualityMetrics?.testToCodeRatio??0,checks3=[{name:"Review pass rate",value:quality?.reviewPassRate??0,threshold:CI.review_pass_rate,operator:">=",passed:(quality?.reviewPassRate??0)>=CI.review_pass_rate},{name:"Test pass rate",value:quality?.testPassRate??0,threshold:CI.test_pass_rate,operator:">=",passed:(quality?.testPassRate??0)>=CI.test_pass_rate},{name:"Agent error rate",value:Math.round(agentErrorRate*10)/10,threshold:CI.max_agent_error_rate,operator:"<=",passed:agentErrorRate<=CI.max_agent_error_rate},{name:"Hard limit hits",value:maxHardLimits,threshold:CI.max_hard_limit_hits,operator:"<=",passed:maxHardLimits<=CI.max_hard_limit_hits},{name:"Complexity Delta",value:complexityDelta,threshold:CI.max_complexity_delta,operator:"<=",passed:!hasQualityEvidence||complexityDelta<=CI.max_complexity_delta},{name:"Public API Delta",value:publicApiDelta,threshold:CI.max_public_api_delta,operator:"<=",passed:!hasQualityEvidence||publicApiDelta<=CI.max_public_api_delta},{name:"Duplication Ratio",value:duplicationRatio,threshold:CI.max_duplication_ratio,operator:"<=",passed:!hasQualityEvidence||duplicationRatio<=CI.max_duplication_ratio},{name:"Test-to-Code Ratio",value:testToCodeRatio,threshold:CI.min_test_to_code_ratio,operator:">=",passed:!hasQualityEvidence||testToCodeRatio>=CI.min_test_to_code_ratio}];if(maxCostUsd!==null)checks3.push({name:"Total cost",value:costSummary?.total_cost_usd??0,threshold:maxCostUsd,operator:"<=",passed:(costSummary?.total_cost_usd??0)<=maxCostUsd});if(gateAudit&&gateAuditSummary){let catchRate=gateAuditSummary.catchRate??0;checks3.push({name:"Gate audit complete",value:gateAudit.status==="complete"?1:0,threshold:1,operator:">=",passed:gateAudit.status==="complete"},{name:"Gate audit ground truth",value:gateAuditSummary.truthAvailable?1:0,threshold:1,operator:">=",passed:gateAuditSummary.truthAvailable},{name:"Gate audit catch rate",value:Math.round(catchRate*10)/10,threshold:100,operator:">=",passed:gateAuditSummary.truthAvailable&&catchRate===100},{name:"Gate audit clean-control rejections",value:gateAuditSummary.falseRejections,threshold:0,operator:"<=",passed:gateAuditSummary.truthAvailable&&gateAuditSummary.falseRejections===0})}ciGate={passed:checks3.every((c)=>c.passed),checks:checks3}}let lines=[`## Swarm Benchmark (mode: ${mode})`,"","### Agent Health"];if(!agentHealth.length)lines.push("No agent sessions recorded");else for(let{agent,toolCalls,hardLimits,warnings}of agentHealth){let parts=[`${toolCalls} tool calls`];if(warnings>0)parts.push(`${warnings} warning${warnings>1?"s":""}`);parts.push(hardLimits?`${hardLimits} hard limit hit${hardLimits>1?"s":""}`:"0 hard limits"),lines.push(`- ${hardLimits?"⚠️":"✅"} **${agent}**: ${parts.join(", ")}`)}if(lines.push("","### Tool Performance"),!toolPerf.length)lines.push("No tool data recorded");else{lines.push("| Tool | Calls | Success Rate | Avg Duration |","|------|-------|-------------|-------------|");for(let{tool,calls,successRate,avg}of toolPerf)lines.push(`| ${tool} | ${calls} | ${successRate}% | ${avg}ms |`)}if(lines.push("","### Delegations",delegationCount?`Total: ${delegationCount} delegations`:"No delegations recorded",""),quality){if(lines.push("### Quality Signals"),!quality.totalReviews&&!quality.testsPassed&&!quality.additions)lines.push("No evidence data found");else{if(quality.reviewPassRate!==null)lines.push(`- Review pass rate: ${quality.reviewPassRate}% (${quality.totalReviews}) ${quality.reviewPassRate>=70?"✅":"❌"}`);else lines.push("- Review pass rate: N/A (no reviews)");if(quality.testPassRate!==null)lines.push(`- Test pass rate: ${quality.testPassRate}% (${quality.testsPassed}/${quality.testsPassed+quality.testsFailed}) ${quality.testPassRate>=80?"✅":"❌"}`);else lines.push("- Test pass rate: N/A (no tests)");lines.push(`- Code churn: +${quality.additions} / -${quality.deletions} lines`)}lines.push("")}if(qualityMetrics?.hasEvidence)lines.push("### Quality Metrics"),lines.push(`- Complexity Delta: ${qualityMetrics.complexityDelta} (max: ${qualityMetrics.thresholds.maxComplexityDelta}) ${qualityMetrics.complexityDelta<=qualityMetrics.thresholds.maxComplexityDelta?"✅":"❌"}`),lines.push(`- Public API Delta: ${qualityMetrics.publicApiDelta} (max: ${qualityMetrics.thresholds.maxPublicApiDelta}) ${qualityMetrics.publicApiDelta<=qualityMetrics.thresholds.maxPublicApiDelta?"✅":"❌"}`),lines.push(`- Duplication Ratio: ${qualityMetrics.duplicationRatio}% (max: ${qualityMetrics.thresholds.maxDuplicationRatio}%) ${qualityMetrics.duplicationRatio<=qualityMetrics.thresholds.maxDuplicationRatio?"✅":"❌"}`),lines.push(`- Test-to-Code Ratio: ${qualityMetrics.testToCodeRatio}% (min: ${qualityMetrics.thresholds.minTestToCodeRatio}%) ${qualityMetrics.testToCodeRatio>=qualityMetrics.thresholds.minTestToCodeRatio?"✅":"❌"}`),lines.push("");if(costSummary)lines.push("### Cost Signals"),lines.push(`- Total tracked cost: $${costSummary.total_cost_usd.toFixed(6)} (${costSummary.delegations} delegations)`,`- Reported: $${costSummary.total_reported_usd.toFixed(6)}; estimated: $${costSummary.total_estimated_usd.toFixed(6)}; unavailable: ${costSummary.unavailable_delegations}`),lines.push("");if(gateAudit&&gateAuditStatistics&&gateAuditSummary)lines.push("### Gate Audit",`- Run: ${gateAudit.runId}`,`- Status: ${gateAudit.status}`,`- Ground truth: ${gateAuditSummary.truthAvailable?"available":"unavailable"} (parsed ${gateAuditStatistics.groundTruth.parsed}; malformed ${gateAuditStatistics.groundTruth.malformed}; ambiguous ${gateAuditStatistics.groundTruth.ambiguous}; unjoined ${gateAuditStatistics.groundTruth.unjoined}; insufficient ${gateAuditSummary.insufficientData})`,`- Regression catches: ${gateAuditSummary.caught}/${gateAuditSummary.regressions}`,`- Clean-control rejections: ${gateAuditSummary.falseRejections}/${gateAuditSummary.negativeControls}`,"- complexity_delta/public_api_delta: unavailable (#1655; excluded)","");if(ciGate){lines.push("### CI Gate",ciGate.passed?"✅ PASSED":"❌ FAILED");for(let c of ciGate.checks){let valueStr;if(c.name==="Complexity Delta"||c.name==="Public API Delta")valueStr=`${c.value}`;else if(c.name==="Total cost")valueStr=`$${c.value.toFixed(6)}`;else valueStr=`${c.value}%`;let thresholdStr=c.name==="Complexity Delta"||c.name==="Public API Delta"?`${c.threshold}`:c.name==="Total cost"?`$${c.threshold.toFixed(6)}`:`${c.threshold}%`;lines.push(`- ${c.name}: ${valueStr} ${c.operator} ${thresholdStr} ${c.passed?"✅":"❌"}`)}lines.push("")}let json2={mode,timestamp:new Date().toISOString(),agent_health:agentHealth.map((a)=>({agent:a.agent,tool_calls:a.toolCalls,hard_limit_hits:a.hardLimits,warnings:a.warnings})),tool_performance:toolPerf.map((t)=>({tool:t.tool,calls:t.calls,success_rate:t.successRate,avg_duration_ms:t.avg})),delegations:delegationCount};if(quality)json2.quality={review_pass_rate:quality.reviewPassRate,test_pass_rate:quality.testPassRate,total_reviews:quality.totalReviews,total_tests_passed:quality.testsPassed,total_tests_failed:quality.testsFailed,additions:quality.additions,deletions:quality.deletions};if(qualityMetrics)json2.quality_metrics={complexity_delta:qualityMetrics.complexityDelta,public_api_delta:qualityMetrics.publicApiDelta,duplication_ratio:qualityMetrics.duplicationRatio,test_to_code_ratio:qualityMetrics.testToCodeRatio,thresholds:qualityMetrics.thresholds,has_evidence:qualityMetrics.hasEvidence};if(costSummary)json2.costs={total_cost_usd:costSummary.total_cost_usd,total_reported_usd:costSummary.total_reported_usd,total_estimated_usd:costSummary.total_estimated_usd,total_input_tokens:costSummary.total_input_tokens,total_output_tokens:costSummary.total_output_tokens,total_reasoning_tokens:costSummary.total_reasoning_tokens,total_cache_tokens:costSummary.total_cache_tokens,delegations:costSummary.delegations,unavailable_delegations:costSummary.unavailable_delegations};if(gateAudit&&gateAuditStatistics&&gateAuditSummary)json2.gate_audit={run_id:gateAudit.runId,status:gateAudit.status,manifest_hash:gateAudit.manifestHash,cells:gateAudit.cells.length,caught:gateAuditSummary.caught,missed:gateAuditSummary.missed,regressions:gateAuditSummary.regressions,catch_rate:gateAuditSummary.catchRate,clean_control_rejections:gateAuditSummary.falseRejections,negative_controls:gateAuditSummary.negativeControls,false_rejection_rate:gateAuditSummary.falseRejectionRate,ground_truth_available:gateAuditSummary.truthAvailable,insufficient_data:gateAuditSummary.insufficientData,ground_truth:gateAuditStatistics.groundTruth,corrupt_runs:gateAuditStatistics.corruptRuns,quality_metric_availability:gateAudit.qualityMetricAvailability};if(ciGate)json2.ci_gate={passed:ciGate.passed,checks:ciGate.checks.map((c)=>({name:c.name,value:c.value,threshold:c.threshold,operator:c.operator,passed:c.passed}))};return lines.push("[BENCHMARK_JSON]",JSON.stringify(json2,null,2),"[/BENCHMARK_JSON]"),lines.join(`
741
741
  `)}function parseMaxCostUsd(args2){let index=args2.indexOf("--max-cost-usd");if(index===-1)return null;let raw=args2[index+1];if(!raw||raw.startsWith("--"))throw Error("Invalid --max-cost-usd value: expected a non-negative number.");let parsed=Number(raw);if(!Number.isFinite(parsed)||parsed<0)throw Error("Invalid --max-cost-usd value: expected a non-negative number.");return parsed}function parseGateAuditRunId(args2){let index=args2.indexOf("--gate-audit-run");if(index===-1)return null;let value=args2[index+1];if(!value||!/^[A-Za-z0-9][A-Za-z0-9._-]{0,159}$/.test(value))throw Error("Invalid --gate-audit-run value: expected a safe run id.");return value}var CI,GATE_AUDIT_MIN_SAMPLES=6;var init_benchmark=__esm(()=>{init_gate_stats();init_store();init_manager2();init_cost_accounting();init_state2();init_utils();CI={review_pass_rate:70,test_pass_rate:80,max_agent_error_rate:20,max_hard_limit_hits:1,max_complexity_delta:5,max_public_api_delta:10,max_duplication_ratio:5,min_test_to_code_ratio:30}});function sanitizeTopic(raw){let normalized=raw.replace(/\s+/g," ").trim().replace(/\[\s*MODE\s*:[^\]]*\]/gi,"").replace(/\s+/g," ").trim(),MAX_TOPIC_LEN=2000;if(normalized.length<=2000)return normalized;return`${normalized.slice(0,2000)}…`}async function handleBrainstormCommand(_directory,args2){let description=sanitizeTopic(args2.join(" "));if(description)return`[MODE: BRAINSTORM] ${description}`;return"[MODE: BRAINSTORM] Please enter MODE: BRAINSTORM and begin the structured brainstorm workflow (CONTEXT SCAN → DIALOGUE → APPROACHES → DESIGN SECTIONS → SPEC WRITE + SELF-REVIEW → QA GATE SELECTION → TRANSITION)."}function $constructor2(name,initializer3,params){function init(inst,def){var _a2;Object.defineProperty(inst,"_zod",{value:inst._zod??{},enumerable:!1}),(_a2=inst._zod).traits??(_a2.traits=new Set),inst._zod.traits.add(name),initializer3(inst,def);for(let k in _.prototype)if(!(k in inst))Object.defineProperty(inst,k,{value:_.prototype[k].bind(inst)});inst._zod.constr=_,inst._zod.def=def}let Parent=params?.Parent??Object;class Definition extends Parent{}Object.defineProperty(Definition,"name",{value:name});function _(def){var _a2;let inst=params?.Parent?new Definition:this;init(inst,def),(_a2=inst._zod).deferred??(_a2.deferred=[]);for(let fn2 of inst._zod.deferred)fn2();return inst}return Object.defineProperty(_,"init",{value:init}),Object.defineProperty(_,Symbol.hasInstance,{value:(inst)=>{if(params?.Parent&&inst instanceof params.Parent)return!0;return inst?._zod?.traits?.has(name)}}),Object.defineProperty(_,"name",{value:name}),_}function config2(newConfig){if(newConfig)Object.assign(globalConfig2,newConfig);return globalConfig2}var NEVER2,$brand2,$ZodAsyncError2,$ZodEncodeError2,globalConfig2;var init_core4=__esm(()=>{NEVER2=Object.freeze({status:"aborted"});$brand2=Symbol("zod_brand");$ZodAsyncError2=class $ZodAsyncError2 extends Error{constructor(){super("Encountered Promise during synchronous parse. Use .parseAsync() instead.")}};$ZodEncodeError2=class $ZodEncodeError2 extends Error{constructor(name){super(`Encountered unidirectional transform during encode: ${name}`);this.name="ZodEncodeError"}};globalConfig2={}});var exports_util2={};__export(exports_util2,{unwrapMessage:()=>unwrapMessage2,uint8ArrayToHex:()=>uint8ArrayToHex2,uint8ArrayToBase64url:()=>uint8ArrayToBase64url2,uint8ArrayToBase64:()=>uint8ArrayToBase642,stringifyPrimitive:()=>stringifyPrimitive2,shallowClone:()=>shallowClone2,safeExtend:()=>safeExtend2,required:()=>required2,randomString:()=>randomString2,propertyKeyTypes:()=>propertyKeyTypes2,promiseAllObject:()=>promiseAllObject2,primitiveTypes:()=>primitiveTypes2,prefixIssues:()=>prefixIssues2,pick:()=>pick2,partial:()=>partial2,optionalKeys:()=>optionalKeys2,omit:()=>omit2,objectClone:()=>objectClone2,numKeys:()=>numKeys2,nullish:()=>nullish3,normalizeParams:()=>normalizeParams2,mergeDefs:()=>mergeDefs2,merge:()=>merge2,jsonStringifyReplacer:()=>jsonStringifyReplacer2,joinValues:()=>joinValues2,issue:()=>issue2,isPlainObject:()=>isPlainObject4,isObject:()=>isObject2,hexToUint8Array:()=>hexToUint8Array2,getSizableOrigin:()=>getSizableOrigin2,getParsedType:()=>getParsedType2,getLengthableOrigin:()=>getLengthableOrigin2,getEnumValues:()=>getEnumValues2,getElementAtPath:()=>getElementAtPath2,floatSafeRemainder:()=>floatSafeRemainder2,finalizeIssue:()=>finalizeIssue2,extend:()=>extend2,escapeRegex:()=>escapeRegex3,esc:()=>esc2,defineLazy:()=>defineLazy2,createTransparentProxy:()=>createTransparentProxy2,cloneDef:()=>cloneDef2,clone:()=>clone2,cleanRegex:()=>cleanRegex2,cleanEnum:()=>cleanEnum2,captureStackTrace:()=>captureStackTrace2,cached:()=>cached2,base64urlToUint8Array:()=>base64urlToUint8Array2,base64ToUint8Array:()=>base64ToUint8Array2,assignProp:()=>assignProp2,assertNotEqual:()=>assertNotEqual2,assertNever:()=>assertNever2,assertIs:()=>assertIs2,assertEqual:()=>assertEqual2,assert:()=>assert2,allowsEval:()=>allowsEval2,aborted:()=>aborted2,NUMBER_FORMAT_RANGES:()=>NUMBER_FORMAT_RANGES2,Class:()=>Class2,BIGINT_FORMAT_RANGES:()=>BIGINT_FORMAT_RANGES2});function assertEqual2(val){return val}function assertNotEqual2(val){return val}function assertIs2(_arg){}function assertNever2(_x){throw Error()}function assert2(_){}function getEnumValues2(entries){let numericValues=Object.values(entries).filter((v)=>typeof v==="number");return Object.entries(entries).filter(([k,_])=>numericValues.indexOf(+k)===-1).map(([_,v])=>v)}function joinValues2(array2,separator="|"){return array2.map((val)=>stringifyPrimitive2(val)).join(separator)}function jsonStringifyReplacer2(_,value){if(typeof value==="bigint")return value.toString();return value}function cached2(getter){return{get value(){{let value=getter();return Object.defineProperty(this,"value",{value}),value}throw Error("cached value already set")}}}function nullish3(input){return input===null||input===void 0}function cleanRegex2(source){let start=source.startsWith("^")?1:0,end=source.endsWith("$")?source.length-1:source.length;return source.slice(start,end)}function floatSafeRemainder2(val,step){let valDecCount=(val.toString().split(".")[1]||"").length,stepString=step.toString(),stepDecCount=(stepString.split(".")[1]||"").length;if(stepDecCount===0&&/\d?e-\d?/.test(stepString)){let match=stepString.match(/\d?e-(\d?)/);if(match?.[1])stepDecCount=Number.parseInt(match[1])}let decCount=valDecCount>stepDecCount?valDecCount:stepDecCount,valInt=Number.parseInt(val.toFixed(decCount).replace(".","")),stepInt=Number.parseInt(step.toFixed(decCount).replace(".",""));return valInt%stepInt/10**decCount}function defineLazy2(object2,key,getter){let value=void 0;Object.defineProperty(object2,key,{get(){if(value===EVALUATING2)return;if(value===void 0)value=EVALUATING2,value=getter();return value},set(v){Object.defineProperty(object2,key,{value:v})},configurable:!0})}function objectClone2(obj){return Object.create(Object.getPrototypeOf(obj),Object.getOwnPropertyDescriptors(obj))}function assignProp2(target,prop,value){Object.defineProperty(target,prop,{value,writable:!0,enumerable:!0,configurable:!0})}function mergeDefs2(...defs){let mergedDescriptors={};for(let def of defs){let descriptors=Object.getOwnPropertyDescriptors(def);Object.assign(mergedDescriptors,descriptors)}return Object.defineProperties({},mergedDescriptors)}function cloneDef2(schema){return mergeDefs2(schema._zod.def)}function getElementAtPath2(obj,path72){if(!path72)return obj;return path72.reduce((acc,key)=>acc?.[key],obj)}function promiseAllObject2(promisesObj){let keys=Object.keys(promisesObj),promises6=keys.map((key)=>promisesObj[key]);return Promise.all(promises6).then((results)=>{let resolvedObj={};for(let i=0;i<keys.length;i++)resolvedObj[keys[i]]=results[i];return resolvedObj})}function randomString2(length=10){let str="";for(let i=0;i<length;i++)str+="abcdefghijklmnopqrstuvwxyz"[Math.floor(Math.random()*26)];return str}function esc2(str){return JSON.stringify(str)}function isObject2(data){return typeof data==="object"&&data!==null&&!Array.isArray(data)}function isPlainObject4(o){if(isObject2(o)===!1)return!1;let ctor=o.constructor;if(ctor===void 0)return!0;let prot=ctor.prototype;if(isObject2(prot)===!1)return!1;if(Object.prototype.hasOwnProperty.call(prot,"isPrototypeOf")===!1)return!1;return!0}function shallowClone2(o){if(isPlainObject4(o))return{...o};if(Array.isArray(o))return[...o];return o}function numKeys2(data){let keyCount=0;for(let key in data)if(Object.prototype.hasOwnProperty.call(data,key))keyCount++;return keyCount}function escapeRegex3(str){return str.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function clone2(inst,def,params){let cl=new inst._zod.constr(def??inst._zod.def);if(!def||params?.parent)cl._zod.parent=inst;return cl}function normalizeParams2(_params){let params=_params;if(!params)return{};if(typeof params==="string")return{error:()=>params};if(params?.message!==void 0){if(params?.error!==void 0)throw Error("Cannot specify both `message` and `error` params");params.error=params.message}if(delete params.message,typeof params.error==="string")return{...params,error:()=>params.error};return params}function createTransparentProxy2(getter){let target;return new Proxy({},{get(_,prop,receiver){return target??(target=getter()),Reflect.get(target,prop,receiver)},set(_,prop,value,receiver){return target??(target=getter()),Reflect.set(target,prop,value,receiver)},has(_,prop){return target??(target=getter()),Reflect.has(target,prop)},deleteProperty(_,prop){return target??(target=getter()),Reflect.deleteProperty(target,prop)},ownKeys(_){return target??(target=getter()),Reflect.ownKeys(target)},getOwnPropertyDescriptor(_,prop){return target??(target=getter()),Reflect.getOwnPropertyDescriptor(target,prop)},defineProperty(_,prop,descriptor){return target??(target=getter()),Reflect.defineProperty(target,prop,descriptor)}})}function stringifyPrimitive2(value){if(typeof value==="bigint")return value.toString()+"n";if(typeof value==="string")return`"${value}"`;return`${value}`}function optionalKeys2(shape){return Object.keys(shape).filter((k)=>{return shape[k]._zod.optin==="optional"&&shape[k]._zod.optout==="optional"})}function pick2(schema,mask){let currDef=schema._zod.def,def=mergeDefs2(schema._zod.def,{get shape(){let newShape={};for(let key in mask){if(!(key in currDef.shape))throw Error(`Unrecognized key: "${key}"`);if(!mask[key])continue;newShape[key]=currDef.shape[key]}return assignProp2(this,"shape",newShape),newShape},checks:[]});return clone2(schema,def)}function omit2(schema,mask){let currDef=schema._zod.def,def=mergeDefs2(schema._zod.def,{get shape(){let newShape={...schema._zod.def.shape};for(let key in mask){if(!(key in currDef.shape))throw Error(`Unrecognized key: "${key}"`);if(!mask[key])continue;delete newShape[key]}return assignProp2(this,"shape",newShape),newShape},checks:[]});return clone2(schema,def)}function extend2(schema,shape){if(!isPlainObject4(shape))throw Error("Invalid input to extend: expected a plain object");let checks3=schema._zod.def.checks;if(checks3&&checks3.length>0)throw Error("Object schemas containing refinements cannot be extended. Use `.safeExtend()` instead.");let def=mergeDefs2(schema._zod.def,{get shape(){let _shape={...schema._zod.def.shape,...shape};return assignProp2(this,"shape",_shape),_shape},checks:[]});return clone2(schema,def)}function safeExtend2(schema,shape){if(!isPlainObject4(shape))throw Error("Invalid input to safeExtend: expected a plain object");let def={...schema._zod.def,get shape(){let _shape={...schema._zod.def.shape,...shape};return assignProp2(this,"shape",_shape),_shape},checks:schema._zod.def.checks};return clone2(schema,def)}function merge2(a,b){let def=mergeDefs2(a._zod.def,{get shape(){let _shape={...a._zod.def.shape,...b._zod.def.shape};return assignProp2(this,"shape",_shape),_shape},get catchall(){return b._zod.def.catchall},checks:[]});return clone2(a,def)}function partial2(Class2,schema,mask){let def=mergeDefs2(schema._zod.def,{get shape(){let oldShape=schema._zod.def.shape,shape={...oldShape};if(mask)for(let key in mask){if(!(key in oldShape))throw Error(`Unrecognized key: "${key}"`);if(!mask[key])continue;shape[key]=Class2?new Class2({type:"optional",innerType:oldShape[key]}):oldShape[key]}else for(let key in oldShape)shape[key]=Class2?new Class2({type:"optional",innerType:oldShape[key]}):oldShape[key];return assignProp2(this,"shape",shape),shape},checks:[]});return clone2(schema,def)}function required2(Class2,schema,mask){let def=mergeDefs2(schema._zod.def,{get shape(){let oldShape=schema._zod.def.shape,shape={...oldShape};if(mask)for(let key in mask){if(!(key in shape))throw Error(`Unrecognized key: "${key}"`);if(!mask[key])continue;shape[key]=new Class2({type:"nonoptional",innerType:oldShape[key]})}else for(let key in oldShape)shape[key]=new Class2({type:"nonoptional",innerType:oldShape[key]});return assignProp2(this,"shape",shape),shape},checks:[]});return clone2(schema,def)}function aborted2(x,startIndex=0){if(x.aborted===!0)return!0;for(let i=startIndex;i<x.issues.length;i++)if(x.issues[i]?.continue!==!0)return!0;return!1}function prefixIssues2(path72,issues){return issues.map((iss)=>{var _a2;return(_a2=iss).path??(_a2.path=[]),iss.path.unshift(path72),iss})}function unwrapMessage2(message){return typeof message==="string"?message:message?.message}function finalizeIssue2(iss,ctx,config3){let full={...iss,path:iss.path??[]};if(!iss.message){let message=unwrapMessage2(iss.inst?._zod.def?.error?.(iss))??unwrapMessage2(ctx?.error?.(iss))??unwrapMessage2(config3.customError?.(iss))??unwrapMessage2(config3.localeError?.(iss))??"Invalid input";full.message=message}if(delete full.inst,delete full.continue,!ctx?.reportInput)delete full.input;return full}function getSizableOrigin2(input){if(input instanceof Set)return"set";if(input instanceof Map)return"map";if(input instanceof File)return"file";return"unknown"}function getLengthableOrigin2(input){if(Array.isArray(input))return"array";if(typeof input==="string")return"string";return"unknown"}function issue2(...args2){let[iss,input,inst]=args2;if(typeof iss==="string")return{message:iss,code:"custom",input,inst};return{...iss}}function cleanEnum2(obj){return Object.entries(obj).filter(([k,_])=>{return Number.isNaN(Number.parseInt(k,10))}).map((el)=>el[1])}function base64ToUint8Array2(base643){let binaryString=atob(base643),bytes=new Uint8Array(binaryString.length);for(let i=0;i<binaryString.length;i++)bytes[i]=binaryString.charCodeAt(i);return bytes}function uint8ArrayToBase642(bytes){let binaryString="";for(let i=0;i<bytes.length;i++)binaryString+=String.fromCharCode(bytes[i]);return btoa(binaryString)}function base64urlToUint8Array2(base64url3){let base643=base64url3.replace(/-/g,"+").replace(/_/g,"/"),padding="=".repeat((4-base643.length%4)%4);return base64ToUint8Array2(base643+padding)}function uint8ArrayToBase64url2(bytes){return uint8ArrayToBase642(bytes).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function hexToUint8Array2(hex3){let cleanHex=hex3.replace(/^0x/,"");if(cleanHex.length%2!==0)throw Error("Invalid hex string length");let bytes=new Uint8Array(cleanHex.length/2);for(let i=0;i<cleanHex.length;i+=2)bytes[i/2]=Number.parseInt(cleanHex.slice(i,i+2),16);return bytes}function uint8ArrayToHex2(bytes){return Array.from(bytes).map((b)=>b.toString(16).padStart(2,"0")).join("")}class Class2{constructor(..._args){}}var EVALUATING2,captureStackTrace2,allowsEval2,getParsedType2=(data)=>{let t=typeof data;switch(t){case"undefined":return"undefined";case"string":return"string";case"number":return Number.isNaN(data)?"nan":"number";case"boolean":return"boolean";case"function":return"function";case"bigint":return"bigint";case"symbol":return"symbol";case"object":if(Array.isArray(data))return"array";if(data===null)return"null";if(data.then&&typeof data.then==="function"&&data.catch&&typeof data.catch==="function")return"promise";if(typeof Map<"u"&&data instanceof Map)return"map";if(typeof Set<"u"&&data instanceof Set)return"set";if(typeof Date<"u"&&data instanceof Date)return"date";if(typeof File<"u"&&data instanceof File)return"file";return"object";default:throw Error(`Unknown data type: ${t}`)}},propertyKeyTypes2,primitiveTypes2,NUMBER_FORMAT_RANGES2,BIGINT_FORMAT_RANGES2;var init_util2=__esm(()=>{EVALUATING2=Symbol("evaluating");captureStackTrace2="captureStackTrace"in Error?Error.captureStackTrace:(..._args)=>{};allowsEval2=cached2(()=>{if(typeof navigator<"u"&&navigator?.userAgent?.includes("Cloudflare"))return!1;try{return new Function(""),!0}catch(_){return!1}});propertyKeyTypes2=new Set(["string","number","symbol"]),primitiveTypes2=new Set(["string","number","bigint","boolean","symbol","undefined"]);NUMBER_FORMAT_RANGES2={safeint:[Number.MIN_SAFE_INTEGER,Number.MAX_SAFE_INTEGER],int32:[-2147483648,2147483647],uint32:[0,4294967295],float32:[-340282346638528860000000000000000000000,340282346638528860000000000000000000000],float64:[-Number.MAX_VALUE,Number.MAX_VALUE]},BIGINT_FORMAT_RANGES2={int64:[BigInt("-9223372036854775808"),BigInt("9223372036854775807")],uint64:[BigInt(0),BigInt("18446744073709551615")]}});function flattenError2(error49,mapper=(issue3)=>issue3.message){let fieldErrors={},formErrors=[];for(let sub of error49.issues)if(sub.path.length>0)fieldErrors[sub.path[0]]=fieldErrors[sub.path[0]]||[],fieldErrors[sub.path[0]].push(mapper(sub));else formErrors.push(mapper(sub));return{formErrors,fieldErrors}}function formatError2(error49,_mapper){let mapper=_mapper||function(issue3){return issue3.message},fieldErrors={_errors:[]},processError=(error50)=>{for(let issue3 of error50.issues)if(issue3.code==="invalid_union"&&issue3.errors.length)issue3.errors.map((issues)=>processError({issues}));else if(issue3.code==="invalid_key")processError({issues:issue3.issues});else if(issue3.code==="invalid_element")processError({issues:issue3.issues});else if(issue3.path.length===0)fieldErrors._errors.push(mapper(issue3));else{let curr=fieldErrors,i=0;while(i<issue3.path.length){let el=issue3.path[i];if(i!==issue3.path.length-1)curr[el]=curr[el]||{_errors:[]};else curr[el]=curr[el]||{_errors:[]},curr[el]._errors.push(mapper(issue3));curr=curr[el],i++}}};return processError(error49),fieldErrors}function treeifyError2(error49,_mapper){let mapper=_mapper||function(issue3){return issue3.message},result={errors:[]},processError=(error50,path72=[])=>{var _a2,_b;for(let issue3 of error50.issues)if(issue3.code==="invalid_union"&&issue3.errors.length)issue3.errors.map((issues)=>processError({issues},issue3.path));else if(issue3.code==="invalid_key")processError({issues:issue3.issues},issue3.path);else if(issue3.code==="invalid_element")processError({issues:issue3.issues},issue3.path);else{let fullpath=[...path72,...issue3.path];if(fullpath.length===0){result.errors.push(mapper(issue3));continue}let curr=result,i=0;while(i<fullpath.length){let el=fullpath[i],terminal=i===fullpath.length-1;if(typeof el==="string")curr.properties??(curr.properties={}),(_a2=curr.properties)[el]??(_a2[el]={errors:[]}),curr=curr.properties[el];else curr.items??(curr.items=[]),(_b=curr.items)[el]??(_b[el]={errors:[]}),curr=curr.items[el];if(terminal)curr.errors.push(mapper(issue3));i++}}};return processError(error49),result}function toDotPath2(_path){let segs=[],path72=_path.map((seg)=>typeof seg==="object"?seg.key:seg);for(let seg of path72)if(typeof seg==="number")segs.push(`[${seg}]`);else if(typeof seg==="symbol")segs.push(`[${JSON.stringify(String(seg))}]`);else if(/[^\w$]/.test(seg))segs.push(`[${JSON.stringify(seg)}]`);else{if(segs.length)segs.push(".");segs.push(seg)}return segs.join("")}function prettifyError2(error49){let lines=[],issues=[...error49.issues].sort((a,b)=>(a.path??[]).length-(b.path??[]).length);for(let issue3 of issues)if(lines.push(`✖ ${issue3.message}`),issue3.path?.length)lines.push(` → at ${toDotPath2(issue3.path)}`);return lines.join(`
@@ -3269,7 +3269,7 @@ ACCEPTANCE: [verbatim FR/SC requirement text this task must satisfy, copied byte
3269
3269
  SKILLS: [optional — either "none", repo-relative file: references (preferred), or inline skill content pasted by architect]
3270
3270
 
3271
3271
  ## STRICT WRITE-SCOPE CONTRACT (MANDATORY)
3272
- - Every coder Task call must pass controller preflight before you start. The call must resolve exactly one current plan task and one non-empty write scope. Missing, malformed, empty, or ambiguous scope fails before execution with SCOPE_NOT_DECLARED; disagreement between scope sources fails with SCOPE_CONFLICT. Never retry or bypass either failure.
3272
+ - Every coder Task call must pass controller preflight before you start. The call must resolve exactly one current plan task and one non-empty write scope. Missing, malformed, empty, or ambiguous scope fails before execution with SCOPE_NOT_DECLARED; disagreement between scope sources fails with SCOPE_CONFLICT; an active binding rooted at a different workspace fails with SCOPE_WORKSPACE_MISMATCH. Never retry or bypass any of these failures.
3273
3273
  - Scope source precedence is strict: matching declare_scope binding (explicit) > the resolved plan task's files_touched (plan) > FILE: directives in the Task prompt.
3274
3274
  - When an explicit binding exists, every plan and FILE: path that is also present must be contained by that explicit scope. Without an explicit binding, every FILE: path must be contained by the plan scope. A lower-precedence source may narrow the authoritative scope but must never widen it; widening or disagreement is SCOPE_CONFLICT.
3275
3275
  - FILE: directives are the sole-source fallback only when both explicit and plan scopes are absent. That fallback must enumerate the complete write set using exactly one non-empty project-relative path per FILE: line. Comma-separated paths, absolute paths, traversal, empty directives, and incomplete lists are invalid and produce SCOPE_NOT_DECLARED.
@@ -6048,7 +6048,7 @@ Do not stop or summarize. Inspect the durable gate, dispatch or collect the next
6048
6048
  ${output.text}`;return}let banner=workflowBanner(state.mode,{suspended,userInterrupted,maxConsecutive,recovery});bannerStamps.set(input.sessionID,now),evictBannerDedupeMapsIfOverBound(),output.text=`${banner}
6049
6049
 
6050
6050
  ${output.text}`},_inspectWakeBudget:(sessionID)=>wakeBudgets.get(sessionID)}}init_pending_delegations();init_pr_workflow_gate();var MAX_PARENT_DEPTH=16,MAX_TRACKED_SESSION_PARENTS=512;function rememberBounded2(parents,childSessionID,parentSessionID){parents.delete(childSessionID),parents.set(childSessionID,parentSessionID);while(parents.size>MAX_TRACKED_SESSION_PARENTS){let oldest=parents.keys().next().value;if(typeof oldest!=="string")break;parents.delete(oldest)}}function createPrWorkflowSessionResolver(options){let session=options.client?.session,parents=new Map;return{observeEvent:(input)=>{let event=input.event;if(event?.type!=="session.created"&&event?.type!=="session.updated")return;let child=event.properties?.info?.id,parent=event.properties?.info?.parentID;if(typeof child==="string"&&child.trim()&&typeof parent==="string"&&parent.trim())rememberBounded2(parents,child.trim(),parent.trim())},resolve:async(sessionID)=>{let original=sessionID.trim();if(!original)return sessionID;let current=original,visited=new Set;for(let depth=0;depth<MAX_PARENT_DEPTH;depth+=1){if(visited.has(current))break;if(visited.add(current),await readPrWorkflowGateState(options.directory,current))return current;let parent=parents.get(current);if(!parent)parent=findByCorrelationId(options.directory,current)?.parentSessionId;if(!parent&&session?.get){let result=await session.get({path:{id:current},query:{directory:options.directory}});if(result?.error==null){let candidate=result?.data?.parentID;if(typeof candidate==="string"&&candidate.trim())parent=candidate.trim()}}if(!parent)return original;rememberBounded2(parents,current,parent),current=parent}return original}}}init_review_receipt_collector();init_schema();init_scope_binding();init_state2();init_normalize_tool_name();init_review_receipt();init_review_receipt_scope();init_reviewer_scope_file_fingerprint();init_skill_propagation_gate();init_task_result_classifier();function lifecycleTarget(args2){let delegation=parseDelegationArgs(args2);return delegation?stripKnownSwarmPrefix(delegation.targetAgent).toLowerCase():""}function isTaskTool6(tool3){if(typeof tool3!=="string")return!1;let normalized=normalizeToolName(tool3);return normalized==="Task"||normalized==="task"}function generationFingerprintsAreCurrent(directory,generation){let{modifiedFiles,modifiedFileFingerprints:fingerprints}=generation;if(modifiedFiles.length===0||modifiedFiles.length!==fingerprints.length||new Set(modifiedFiles).size!==modifiedFiles.length||new Set(fingerprints.map((entry)=>entry.file)).size!==fingerprints.length)return!1;let fingerprintBytes=0;for(let file3 of modifiedFiles){let stored=fingerprints.filter((entry)=>entry.file===file3),current=captureReviewerScopeFileFingerprint(directory,file3,MAX_REVIEWER_SCOPE_FINGERPRINT_AGGREGATE_BYTES-fingerprintBytes);if(stored.length!==1||!current||!reviewerScopeFileFingerprintsEqual(stored[0],current))return!1;if(current.kind==="file")fingerprintBytes+=current.size}return!0}function scopeMatchesGenerationFingerprints(scope,generation){let records=new Map;for(let line of scope.content.split(`
6051
- `).slice(1)){if(!line)continue;try{let parsed=JSON.parse(line);if(typeof parsed.path==="string")records.set(parsed.path,parsed)}catch{return!1}}if(records.size!==generation.modifiedFileFingerprints.length||scope.files.length!==generation.modifiedFiles.length)return!1;return generation.modifiedFileFingerprints.every((fingerprint)=>{let record3=records.get(fingerprint.file);if(!record3)return!1;return fingerprint.kind==="deleted"?record3.state==="deleted":record3.state==="file"&&record3.bytes===fingerprint.size&&record3.sha256===fingerprint.hash})}async function beginApprovedReviewerScopeLifecycle(input){if(!isTaskTool6(input.tool))return null;let taskId=await resolveReviewerScopeTaskId(input.directory,input.args);if(!taskId)return null;let target=lifecycleTarget(input.args);if(target==="coder"){let binding=getScopeBindingForParentDispatch({parentSessionId:input.parentSessionID,dispatchCallId:input.callID});if(binding?.taskId!==taskId)return null;let rawArgs=input.args&&typeof input.args==="object"?input.args:null;return startReviewerScopeGeneration({parentSessionID:input.parentSessionID,taskId,coderCallID:input.callID,background:rawArgs?.background===!0||rawArgs?.background==="true",declaredFiles:binding.files})?"coder_started":null}if(target==="reviewer"){let ready=peekReadyReviewerScopeGeneration({parentSessionID:input.parentSessionID,taskId});if(!ready||!generationFingerprintsAreCurrent(input.directory,ready)){if(ready)discardReviewerScopeGenerationForCoderCall({parentSessionID:input.parentSessionID,taskId,coderCallID:ready.coderCallID});throw Error("REVIEWER_SCOPE_STALE: coder post-write fingerprints are incomplete or changed before reviewer dispatch")}let snapshot=await buildReviewerTaskScope(input.directory,ready.modifiedFiles,input.maxBytes,{taskId:ready.taskId,coderCallID:ready.coderCallID,generation:ready.generation,sessionIncarnation:ready.sessionIncarnation}),current=peekReadyReviewerScopeGeneration({parentSessionID:input.parentSessionID,taskId}),exactGenerationStillCurrent=current!==null&&current.coderCallID===ready.coderCallID&&current.generation===ready.generation&&current.sessionIncarnation===ready.sessionIncarnation&&isReviewerScopeGenerationCurrent({parentSessionID:input.parentSessionID,taskId,coderCallID:ready.coderCallID,generation:ready.generation,sessionIncarnation:ready.sessionIncarnation});if(!snapshot||!current||!exactGenerationStillCurrent||!generationFingerprintsAreCurrent(input.directory,current)||!scopeMatchesGenerationFingerprints(snapshot,current))throw discardReviewerScopeGenerationForCoderCall({parentSessionID:input.parentSessionID,taskId,coderCallID:ready.coderCallID}),Error("REVIEWER_SCOPE_STALE: exact reviewer dispatch scope changed during capture");let claimed=claimReviewerScopeGeneration({parentSessionID:input.parentSessionID,taskId,reviewerCallID:input.callID});if(!claimed||claimed.coderCallID!==ready.coderCallID||claimed.generation!==ready.generation||claimed.sessionIncarnation!==ready.sessionIncarnation||!attachReviewerScopeGenerationDispatchSnapshot({parentSessionID:input.parentSessionID,taskId,reviewerCallID:input.callID,snapshot:{hash:computeScopeFingerprint(snapshot.content,snapshot.description).hash,description:snapshot.description,files:[...snapshot.files],headSha:snapshot.headSha,taskId:claimed.taskId,coderCallID:claimed.coderCallID,generation:claimed.generation,sessionIncarnation:claimed.sessionIncarnation}}))throw discardReviewerScopeGenerationClaim({parentSessionID:input.parentSessionID,taskId,reviewerCallID:input.callID}),Error("REVIEWER_SCOPE_STALE: exact reviewer dispatch scope could not be captured");return"reviewer_claimed"}return null}async function completeReviewerScopeLifecycle(input){if(!isTaskTool6(input.tool))return null;if(lifecycleTarget(input.args)!=="coder")return null;let result=classifyTaskResult(input.output);if(result==="running")return null;let taskId=await resolveReviewerScopeTaskId(input.directory,input.args);if(!taskId)return discardReviewerScopeGenerationForCoderCall({parentSessionID:input.parentSessionID,coderCallID:input.callID}),null;if(result==="non_success")return discardReviewerScopeGenerationForCoderCall({parentSessionID:input.parentSessionID,taskId,coderCallID:input.callID}),null;return markReviewerScopeGenerationReady({parentSessionID:input.parentSessionID,taskId,coderCallID:input.callID})?"coder_ready":null}init_schema();init_bun_compat();init_logger();var import_picomatch2=__toESM(require_picomatch2(),1);import{existsSync as existsSync106,readdirSync as readdirSync33,readFileSync as readFileSync81,statSync as statSync45}from"node:fs";import*as path217 from"node:path";var PREDICATE_TIMEOUT_MS=15000,GREP_MAX_FILES=1e4,GREP_MAX_BYTES_PER_FILE=1e6,GREP_SKIP_DIRECTORIES=new Set([".git",".swarm","node_modules","dist","coverage"]),TOOL_BINARY_ALLOWLIST=new Set(["rg","grep","git","biome","eslint","tsc","ruff"]);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=path217.resolve(directory),resolved=path217.resolve(baseDir,concrete),rel=path217.relative(baseDir,resolved);if(rel.startsWith("..")||path217.isAbsolute(rel))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(path217.delimiter)){if(!dir)continue;for(let name of candidates){let candidate=path217.join(dir,name);if(existsSync106(candidate))return candidate}}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((resolve81)=>setTimeout(()=>resolve81("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 entries;try{entries=readdirSync33(dir,{withFileTypes:!0})}catch{return}for(let entry of entries){if(visited>=GREP_MAX_FILES)return;let fullPath=path217.join(dir,entry.name),relPath=path217.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(statSync45(fullPath).size>GREP_MAX_BYTES_PER_FILE)continue;let found=readFileSync81(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(path217.normalize(p))}return out}async function runFileModifiedPredicate(rest,directory,expectModified){let label=expectModified?"file_modified":"file_not_modified",safe=validateRepoRelativeGlob(directory,rest);if(safe===null)return{result:"error",detail:`${label}: unsafe or empty path "${rest}"`};let changed=await changedPaths(directory);if(changed===null)return{result:"error",detail:`${label}: git unavailable or failed`};let target=path217.normalize(safe),isChanged=changed.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)"}}}init_knowledge_escalator();init_knowledge_events();init_skill_propagation_gate();var VERDICT_PATTERN=/\b(VERIFIED|VIOLATED|N\/A)\s*:\s*([A-Za-z0-9._-]{1,80})(?:\s+(?:evidence|reason)\s*=\s*([^\n\r]+?))?(?=$|[\n\r]|\s+(?:VERIFIED|VIOLATED|N\/A)\b)/gi;function parseReviewerDirectiveCompliance(text){if(!text||typeof text!=="string")return[];let out=[];for(let m of text.matchAll(VERDICT_PATTERN)){let verb=m[1].toUpperCase(),id=m[2],evidence2=m[3]?.trim().slice(0,280),verdict=verb==="VERIFIED"?"verified":verb==="VIOLATED"?"violated":"n_a";out.push({id,verdict,evidence:evidence2})}return out}function verdictToEventType(v){return v==="verified"?"applied":v==="violated"?"violated":"n_a"}async function reconcileReviewerVerdicts(params){let result={emitted:[],omittedCriticals:[]};try{let verifyById=new Map(params.directivesToVerify.map((d)=>[d.id,d]));if(verifyById.size===0)return result;let verdicts=parseReviewerDirectiveCompliance(params.transcript),addressed=new Set,violatedIds=new Set,traceId=newTraceId(),sessionId=params.sessionId??"unknown",agent=params.agent??"reviewer";for(let v of verdicts){let directive=verifyById.get(v.id);if(!directive)continue;addressed.add(v.id);let type=verdictToEventType(v.verdict),predicateCheck;if(v.verdict==="violated"&&directive.verification_predicate){let outcome=await runDirectivePredicate(directive.verification_predicate,params.directory);predicateCheck={predicate:directive.verification_predicate,result:outcome.result,detail:outcome.detail}}if(await recordKnowledgeEvent(params.directory,{type,trace_id:traceId,knowledge_id:v.id,session_id:sessionId,task_id:params.taskId,phase:params.phase,agent,source:"reviewer",reason:v.evidence,predicate_check:predicateCheck}),type==="violated")violatedIds.add(v.id);result.emitted.push({id:v.id,type,source:"reviewer"})}for(let d of params.directivesToVerify){if(d.priority!=="critical")continue;if(addressed.has(d.id))continue;result.omittedCriticals.push(d.id),await recordKnowledgeEvent(params.directory,{type:"violated",trace_id:traceId,knowledge_id:d.id,session_id:sessionId,task_id:params.taskId,phase:params.phase,agent,source:"reviewer",reason:"reviewer_omitted"}),violatedIds.add(d.id),result.emitted.push({id:d.id,type:"violated",source:"reviewer"})}if(violatedIds.size>0)await escalateViolatedEntries(params.directory,[...violatedIds])}catch{}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"})}init_constants();init_schema();init_scope_binding();init_scope_persistence();init_state2();init_normalize_tool_name();init_pr_workflow_gate();init_write_target_resolver();import*as path218 from"node:path";var WRITE_TOOLS2=new Set(WRITE_TOOL_NAMES);function createScopeGuardHook(config3,directory,injectAdvisory){let enabled=config3.enabled??!0,_skipInTurbo=config3.skip_in_turbo??!1;return{toolBefore:async(input,output)=>{if(!enabled)return;let toolName=normalizeToolName(input.tool);if(!WRITE_TOOLS2.has(toolName))return;let sessionId=input.sessionID,activeAgent=swarmState.activeAgent.get(sessionId),session=swarmState.agentSessions.get(sessionId),agentName=activeAgent??session?.agentName??"unknown",agentRole=stripKnownSwarmPrefix(agentName);if(agentRole===ORCHESTRATOR_NAME)return;if(agentRole!=="coder")return;let targets=_internals147.resolveWriteTargets(toolName,output.args,{directory});if(targets.status==="unverifiable")throw Error(`WRITE TARGET UNVERIFIABLE: ${agentName} invoked ${toolName}: ${targets.reason}`);if(targets.paths.length===0)return;let taskId=_internals147.resolveTaskId(session),binding=taskId?_internals147.resolveAuthorizedScopeBinding({directory,taskId,activeSessionId:sessionId}):_internals147.resolveAuthorizedScopeBindingForSession({directory,activeSessionId:sessionId});if(!binding){if(binding=_internals147.getAuthorizedPrFeedbackScopeBinding({directory,activeSessionId:sessionId,taskId:taskId??void 0})??_internals147.resolveAuthorizedPrFeedbackScopeBindingFromDisk({directory,activeSessionId:sessionId,taskId:taskId??void 0}),binding&&!await _internals147.validatePrFeedbackScopeBinding(directory,binding))binding=null}if(!taskId&&binding&&session)taskId=binding.taskId,session.currentTaskId=binding.taskId,session.declaredCoderScope=[...binding.files];let declaredScope=binding?.files??null;if(!declaredScope||declaredScope.length===0)throw Error(`SCOPE_NOT_DECLARED: ${agentName} cannot invoke ${toolName} without a validated scope for task ${taskId??"unknown"}.`);for(let rawPath of targets.paths){let filePath=sanitizePath(rawPath);if(!isFileInScope(filePath,declaredScope,directory))reportScopeViolation(agentName,filePath,taskId,session,injectAdvisory,swarmState,declaredScope)}}}}function isFileInScope(filePath,scopeEntries,directory){let dir=directory??process.cwd(),resolvedFile=path218.resolve(dir,filePath);return scopeEntries.filter((scope)=>scope.length>0).some((scope)=>{let resolvedScope=path218.resolve(dir,scope);if(resolvedFile===resolvedScope)return!0;let rel=path218.relative(resolvedScope,resolvedFile);return rel.length>0&&!rel.startsWith("..")&&!path218.isAbsolute(rel)})}function sanitizePath(raw){let result="";for(let i=0;i<raw.length;i++){let c=raw.charCodeAt(i);if(c<=31||c===127||c>=128&&c<=159){result+="_";continue}result+=raw[i]}return result.replace(/\[[\d;]*m/g,"")}var _internals147={sanitizePath,resolveWriteTargets:resolveWriteTargets2,resolveAuthorizedScopeBinding,resolveAuthorizedScopeBindingForSession,getAuthorizedPrFeedbackScopeBinding,resolveAuthorizedPrFeedbackScopeBindingFromDisk,validatePrFeedbackScopeBinding,resolveTaskId:(session)=>session?.currentTaskId??null};function reportScopeViolation(agentName,filePath,taskId,session,injectAdvisory,state,scopeEntries){let violationMessage=`SCOPE VIOLATION: ${agentName} attempted to modify '${filePath}' which is not in declared scope for task ${taskId??"unknown"}. Declared scope: [${scopeEntries.slice(0,3).join(", ")}${scopeEntries.length>3?"...":""}]`;if(session)session.lastScopeViolation=violationMessage,session.scopeViolationDetected=!0;if(injectAdvisory)for(let[archSessionId,archSession]of state.agentSessions){let archAgent=state.activeAgent.get(archSessionId)??archSession.agentName;if(stripKnownSwarmPrefix(archAgent)===ORCHESTRATOR_NAME){try{injectAdvisory(archSessionId,`[SCOPE GUARD] ${violationMessage}`)}catch{}break}}throw Error(violationMessage)}init_constants();init_schema();init_state2();init_normalize_tool_name();function createSelfReviewHook(config3,injectAdvisory){let enabled=config3.enabled??!0,skipInTurbo=config3.skip_in_turbo??!0;return{toolAfter:async(input,output)=>{if(!enabled)return;if(normalizeToolName(input.tool)!=="update_task_status")return;let args2=output.args;if(args2?.status!=="in_progress")return;let taskId=typeof args2?.task_id==="string"?args2.task_id:"unknown",sessionId=input.sessionID,agentName=swarmState.activeAgent.get(sessionId)??swarmState.agentSessions.get(sessionId)?.agentName??"";if(stripKnownSwarmPrefix(agentName)!==ORCHESTRATOR_NAME)return;if(skipInTurbo){let session=swarmState.agentSessions.get(sessionId);if(session&&session.turboMode===!0)return}let advisory=[`[SELF-REVIEW] Task ${taskId} is now delegated to coder.`,"After coder completes, review for:"," • Broken conditionals (inverted if/else, wrong comparisons)"," • Off-by-one errors (array bounds, loop indices)"," • Assumptions contradicting existing codebase patterns"," • Missing error handling (uncaught exceptions, unhandled promises)"," • Scope creep (changes outside the declared task spec)","Delegate to critic with self-review focus before marking complete."].join(`
6051
+ `).slice(1)){if(!line)continue;try{let parsed=JSON.parse(line);if(typeof parsed.path==="string")records.set(parsed.path,parsed)}catch{return!1}}if(records.size!==generation.modifiedFileFingerprints.length||scope.files.length!==generation.modifiedFiles.length)return!1;return generation.modifiedFileFingerprints.every((fingerprint)=>{let record3=records.get(fingerprint.file);if(!record3)return!1;return fingerprint.kind==="deleted"?record3.state==="deleted":record3.state==="file"&&record3.bytes===fingerprint.size&&record3.sha256===fingerprint.hash})}async function beginApprovedReviewerScopeLifecycle(input){if(!isTaskTool6(input.tool))return null;let taskId=await resolveReviewerScopeTaskId(input.directory,input.args);if(!taskId)return null;let target=lifecycleTarget(input.args);if(target==="coder"){let binding=getScopeBindingForParentDispatch({parentSessionId:input.parentSessionID,dispatchCallId:input.callID});if(binding?.taskId!==taskId)return null;let rawArgs=input.args&&typeof input.args==="object"?input.args:null;return startReviewerScopeGeneration({parentSessionID:input.parentSessionID,taskId,coderCallID:input.callID,background:rawArgs?.background===!0||rawArgs?.background==="true",declaredFiles:binding.files})?"coder_started":null}if(target==="reviewer"){let ready=peekReadyReviewerScopeGeneration({parentSessionID:input.parentSessionID,taskId});if(!ready||!generationFingerprintsAreCurrent(input.directory,ready)){if(ready)discardReviewerScopeGenerationForCoderCall({parentSessionID:input.parentSessionID,taskId,coderCallID:ready.coderCallID});throw Error("REVIEWER_SCOPE_STALE: coder post-write fingerprints are incomplete or changed before reviewer dispatch")}let snapshot=await buildReviewerTaskScope(input.directory,ready.modifiedFiles,input.maxBytes,{taskId:ready.taskId,coderCallID:ready.coderCallID,generation:ready.generation,sessionIncarnation:ready.sessionIncarnation}),current=peekReadyReviewerScopeGeneration({parentSessionID:input.parentSessionID,taskId}),exactGenerationStillCurrent=current!==null&&current.coderCallID===ready.coderCallID&&current.generation===ready.generation&&current.sessionIncarnation===ready.sessionIncarnation&&isReviewerScopeGenerationCurrent({parentSessionID:input.parentSessionID,taskId,coderCallID:ready.coderCallID,generation:ready.generation,sessionIncarnation:ready.sessionIncarnation});if(!snapshot||!current||!exactGenerationStillCurrent||!generationFingerprintsAreCurrent(input.directory,current)||!scopeMatchesGenerationFingerprints(snapshot,current))throw discardReviewerScopeGenerationForCoderCall({parentSessionID:input.parentSessionID,taskId,coderCallID:ready.coderCallID}),Error("REVIEWER_SCOPE_STALE: exact reviewer dispatch scope changed during capture");let claimed=claimReviewerScopeGeneration({parentSessionID:input.parentSessionID,taskId,reviewerCallID:input.callID});if(!claimed||claimed.coderCallID!==ready.coderCallID||claimed.generation!==ready.generation||claimed.sessionIncarnation!==ready.sessionIncarnation||!attachReviewerScopeGenerationDispatchSnapshot({parentSessionID:input.parentSessionID,taskId,reviewerCallID:input.callID,snapshot:{hash:computeScopeFingerprint(snapshot.content,snapshot.description).hash,description:snapshot.description,files:[...snapshot.files],headSha:snapshot.headSha,taskId:claimed.taskId,coderCallID:claimed.coderCallID,generation:claimed.generation,sessionIncarnation:claimed.sessionIncarnation}}))throw discardReviewerScopeGenerationClaim({parentSessionID:input.parentSessionID,taskId,reviewerCallID:input.callID}),Error("REVIEWER_SCOPE_STALE: exact reviewer dispatch scope could not be captured");return"reviewer_claimed"}return null}async function completeReviewerScopeLifecycle(input){if(!isTaskTool6(input.tool))return null;if(lifecycleTarget(input.args)!=="coder")return null;let result=classifyTaskResult(input.output);if(result==="running")return null;let taskId=await resolveReviewerScopeTaskId(input.directory,input.args);if(!taskId)return discardReviewerScopeGenerationForCoderCall({parentSessionID:input.parentSessionID,coderCallID:input.callID}),null;if(result==="non_success")return discardReviewerScopeGenerationForCoderCall({parentSessionID:input.parentSessionID,taskId,coderCallID:input.callID}),null;return markReviewerScopeGenerationReady({parentSessionID:input.parentSessionID,taskId,coderCallID:input.callID})?"coder_ready":null}init_schema();init_bun_compat();init_logger();var import_picomatch2=__toESM(require_picomatch2(),1);import{existsSync as existsSync106,readdirSync as readdirSync33,readFileSync as readFileSync81,statSync as statSync45}from"node:fs";import*as path217 from"node:path";var PREDICATE_TIMEOUT_MS=15000,GREP_MAX_FILES=1e4,GREP_MAX_BYTES_PER_FILE=1e6,GREP_SKIP_DIRECTORIES=new Set([".git",".swarm","node_modules","dist","coverage"]),TOOL_BINARY_ALLOWLIST=new Set(["rg","grep","git","biome","eslint","tsc","ruff"]);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=path217.resolve(directory),resolved=path217.resolve(baseDir,concrete),rel=path217.relative(baseDir,resolved);if(rel.startsWith("..")||path217.isAbsolute(rel))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(path217.delimiter)){if(!dir)continue;for(let name of candidates){let candidate=path217.join(dir,name);if(existsSync106(candidate))return candidate}}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((resolve81)=>setTimeout(()=>resolve81("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 entries;try{entries=readdirSync33(dir,{withFileTypes:!0})}catch{return}for(let entry of entries){if(visited>=GREP_MAX_FILES)return;let fullPath=path217.join(dir,entry.name),relPath=path217.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(statSync45(fullPath).size>GREP_MAX_BYTES_PER_FILE)continue;let found=readFileSync81(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(path217.normalize(p))}return out}async function runFileModifiedPredicate(rest,directory,expectModified){let label=expectModified?"file_modified":"file_not_modified",safe=validateRepoRelativeGlob(directory,rest);if(safe===null)return{result:"error",detail:`${label}: unsafe or empty path "${rest}"`};let changed=await changedPaths(directory);if(changed===null)return{result:"error",detail:`${label}: git unavailable or failed`};let target=path217.normalize(safe),isChanged=changed.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)"}}}init_knowledge_escalator();init_knowledge_events();init_skill_propagation_gate();var VERDICT_PATTERN=/\b(VERIFIED|VIOLATED|N\/A)\s*:\s*([A-Za-z0-9._-]{1,80})(?:\s+(?:evidence|reason)\s*=\s*([^\n\r]+?))?(?=$|[\n\r]|\s+(?:VERIFIED|VIOLATED|N\/A)\b)/gi;function parseReviewerDirectiveCompliance(text){if(!text||typeof text!=="string")return[];let out=[];for(let m of text.matchAll(VERDICT_PATTERN)){let verb=m[1].toUpperCase(),id=m[2],evidence2=m[3]?.trim().slice(0,280),verdict=verb==="VERIFIED"?"verified":verb==="VIOLATED"?"violated":"n_a";out.push({id,verdict,evidence:evidence2})}return out}function verdictToEventType(v){return v==="verified"?"applied":v==="violated"?"violated":"n_a"}async function reconcileReviewerVerdicts(params){let result={emitted:[],omittedCriticals:[]};try{let verifyById=new Map(params.directivesToVerify.map((d)=>[d.id,d]));if(verifyById.size===0)return result;let verdicts=parseReviewerDirectiveCompliance(params.transcript),addressed=new Set,violatedIds=new Set,traceId=newTraceId(),sessionId=params.sessionId??"unknown",agent=params.agent??"reviewer";for(let v of verdicts){let directive=verifyById.get(v.id);if(!directive)continue;addressed.add(v.id);let type=verdictToEventType(v.verdict),predicateCheck;if(v.verdict==="violated"&&directive.verification_predicate){let outcome=await runDirectivePredicate(directive.verification_predicate,params.directory);predicateCheck={predicate:directive.verification_predicate,result:outcome.result,detail:outcome.detail}}if(await recordKnowledgeEvent(params.directory,{type,trace_id:traceId,knowledge_id:v.id,session_id:sessionId,task_id:params.taskId,phase:params.phase,agent,source:"reviewer",reason:v.evidence,predicate_check:predicateCheck}),type==="violated")violatedIds.add(v.id);result.emitted.push({id:v.id,type,source:"reviewer"})}for(let d of params.directivesToVerify){if(d.priority!=="critical")continue;if(addressed.has(d.id))continue;result.omittedCriticals.push(d.id),await recordKnowledgeEvent(params.directory,{type:"violated",trace_id:traceId,knowledge_id:d.id,session_id:sessionId,task_id:params.taskId,phase:params.phase,agent,source:"reviewer",reason:"reviewer_omitted"}),violatedIds.add(d.id),result.emitted.push({id:d.id,type:"violated",source:"reviewer"})}if(violatedIds.size>0)await escalateViolatedEntries(params.directory,[...violatedIds])}catch{}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"})}init_constants();init_schema();init_scope_binding();init_scope_persistence();init_state2();init_normalize_tool_name();init_pr_workflow_gate();init_write_target_resolver();import*as path218 from"node:path";var WRITE_TOOLS2=new Set(WRITE_TOOL_NAMES);function createScopeGuardHook(config3,fallbackDirectory,injectAdvisory){let enabled=config3.enabled??!0,_skipInTurbo=config3.skip_in_turbo??!1;return{toolBefore:async(input,output)=>{if(!enabled)return;let toolName=normalizeToolName(input.tool);if(!WRITE_TOOLS2.has(toolName))return;let sessionId=input.sessionID,activeAgent=swarmState.activeAgent.get(sessionId),session=swarmState.agentSessions.get(sessionId),agentName=activeAgent??session?.agentName??"unknown",agentRole=stripKnownSwarmPrefix(agentName);if(agentRole===ORCHESTRATOR_NAME)return;if(agentRole!=="coder")return;let directory=_internals147.resolveSessionWorkspaceDirectory(sessionId,fallbackDirectory),targets=_internals147.resolveWriteTargets(toolName,output.args,{directory});if(targets.status==="unverifiable")throw Error(`WRITE TARGET UNVERIFIABLE: ${agentName} invoked ${toolName}: ${targets.reason}`);if(targets.paths.length===0)return;let taskId=_internals147.resolveTaskId(session),binding=taskId?_internals147.resolveAuthorizedScopeBinding({directory,taskId,activeSessionId:sessionId}):_internals147.resolveAuthorizedScopeBindingForSession({directory,activeSessionId:sessionId});if(!binding){if(binding=_internals147.getAuthorizedPrFeedbackScopeBinding({directory,activeSessionId:sessionId,taskId:taskId??void 0})??_internals147.resolveAuthorizedPrFeedbackScopeBindingFromDisk({directory,activeSessionId:sessionId,taskId:taskId??void 0}),binding&&!await _internals147.validatePrFeedbackScopeBinding(directory,binding))binding=null}if(!taskId&&binding&&session)taskId=binding.taskId,session.currentTaskId=binding.taskId,session.declaredCoderScope=[...binding.files];let declaredScope=binding?.files??null;if(!declaredScope||declaredScope.length===0){let mismatch=_internals147.describeScopeWorkspaceMismatch({directory,activeSessionId:sessionId,taskId});if(mismatch)throw Error(`${mismatch} ${agentName} cannot invoke ${toolName} for task ${taskId??"unknown"}.`);throw Error(`SCOPE_NOT_DECLARED: ${agentName} cannot invoke ${toolName} without a validated scope for task ${taskId??"unknown"}.`)}for(let rawPath of targets.paths){let filePath=sanitizePath(rawPath);if(!isFileInScope(filePath,declaredScope,directory))reportScopeViolation(agentName,filePath,taskId,session,injectAdvisory,swarmState,declaredScope)}}}}function isFileInScope(filePath,scopeEntries,directory){let dir=directory??process.cwd(),resolvedFile=path218.resolve(dir,filePath);return scopeEntries.filter((scope)=>scope.length>0).some((scope)=>{let resolvedScope=path218.resolve(dir,scope);if(resolvedFile===resolvedScope)return!0;let rel=path218.relative(resolvedScope,resolvedFile);return rel.length>0&&!rel.startsWith("..")&&!path218.isAbsolute(rel)})}function sanitizePath(raw){let result="";for(let i=0;i<raw.length;i++){let c=raw.charCodeAt(i);if(c<=31||c===127||c>=128&&c<=159){result+="_";continue}result+=raw[i]}return result.replace(/\[[\d;]*m/g,"")}var _internals147={sanitizePath,resolveWriteTargets:resolveWriteTargets2,resolveAuthorizedScopeBinding,resolveAuthorizedScopeBindingForSession,getAuthorizedPrFeedbackScopeBinding,resolveAuthorizedPrFeedbackScopeBindingFromDisk,validatePrFeedbackScopeBinding,resolveSessionWorkspaceDirectory,describeScopeWorkspaceMismatch,resolveTaskId:(session)=>session?.currentTaskId??null};function reportScopeViolation(agentName,filePath,taskId,session,injectAdvisory,state,scopeEntries){let violationMessage=`SCOPE VIOLATION: ${agentName} attempted to modify '${filePath}' which is not in declared scope for task ${taskId??"unknown"}. Declared scope: [${scopeEntries.slice(0,3).join(", ")}${scopeEntries.length>3?"...":""}]`;if(session)session.lastScopeViolation=violationMessage,session.scopeViolationDetected=!0;if(injectAdvisory)for(let[archSessionId,archSession]of state.agentSessions){let archAgent=state.activeAgent.get(archSessionId)??archSession.agentName;if(stripKnownSwarmPrefix(archAgent)===ORCHESTRATOR_NAME){try{injectAdvisory(archSessionId,`[SCOPE GUARD] ${violationMessage}`)}catch{}break}}throw Error(violationMessage)}init_constants();init_schema();init_state2();init_normalize_tool_name();function createSelfReviewHook(config3,injectAdvisory){let enabled=config3.enabled??!0,skipInTurbo=config3.skip_in_turbo??!0;return{toolAfter:async(input,output)=>{if(!enabled)return;if(normalizeToolName(input.tool)!=="update_task_status")return;let args2=output.args;if(args2?.status!=="in_progress")return;let taskId=typeof args2?.task_id==="string"?args2.task_id:"unknown",sessionId=input.sessionID,agentName=swarmState.activeAgent.get(sessionId)??swarmState.agentSessions.get(sessionId)?.agentName??"";if(stripKnownSwarmPrefix(agentName)!==ORCHESTRATOR_NAME)return;if(skipInTurbo){let session=swarmState.agentSessions.get(sessionId);if(session&&session.turboMode===!0)return}let advisory=[`[SELF-REVIEW] Task ${taskId} is now delegated to coder.`,"After coder completes, review for:"," • Broken conditionals (inverted if/else, wrong comparisons)"," • Off-by-one errors (array bounds, loop indices)"," • Assumptions contradicting existing codebase patterns"," • Missing error handling (uncaught exceptions, unhandled promises)"," • Scope creep (changes outside the declared task spec)","Delegate to critic with self-review focus before marking complete."].join(`
6052
6052
  `);try{injectAdvisory(sessionId,advisory)}catch{}}}}init_skill_propagation_gate();init_skill_scoring();init_skill_usage_log();import*as path219 from"node:path";var SKILL_INJECTION_THRESHOLD=0.5,SKILL_INJECTION_TOP_N=5;function injectSkillsIntoDelegation(directory,args2,recommendedSkills,targetAgent,sessionID,options={}){if(!recommendedSkills||recommendedSkills.length===0)return{injected:!1,injectedSkills:[]};let promptRaw=args2.prompt;if(typeof promptRaw!=="string")return{injected:!1,injectedSkills:[]};let parsedDelegation=parseDelegationArgs(args2);if(!parsedDelegation)return{injected:!1,injectedSkills:[]};if(parsedDelegation.skillsField.trim())return{injected:!1,injectedSkills:[]};let qualified=recommendedSkills.filter((s)=>s.score>=SKILL_INJECTION_THRESHOLD);if(qualified.length===0){if(args2.prompt=`SKILLS: none
6053
6053
 
6054
6054
  ${promptRaw}`,!options.quiet)console.warn("[skill-propagation-gate] No skills above threshold 0.5 — injected SKILLS: none");try{writeWarnEvent(directory,{type:"skill_injection_decision",timestamp:new Date().toISOString(),decision:"none",target_agent:targetAgent,sessionID,reason:"no_skill_above_threshold",threshold:SKILL_INJECTION_THRESHOLD,considered:recommendedSkills.map((s)=>({skillPath:s.skillPath,score:s.score}))})}catch{}return{injected:!0,injectedSkills:[]}}let topSkills=qualified.slice(0,SKILL_INJECTION_TOP_N),newPrompt=`${`SKILLS: ${topSkills.map((s)=>{let desc=readSkillMetadata(s.skillPath,directory).description||"";if(!desc||desc==="No description provided")desc=path219.basename(path219.dirname(s.skillPath));return desc=desc.replace(/,/g,";"),`file:${s.skillPath} (-- ${desc})`}).join(", ")}`}
@@ -6086,7 +6086,7 @@ REASON: [what must be fixed]
6086
6086
  OR
6087
6087
 
6088
6088
  VERDICT: REJECTED
6089
- REASON: [critical blocking issues]`,result=await activeDispatcher.dispatch({directory,parentSessionId,agentName,model,system,prompt,title:parentSessionId?"lean_turbo_reviewer background":void 0,timeoutMs});if(result.status==="completed")return result.text;if(result.status==="timeout"){let timeoutDescription=timeoutMs>0?`${timeoutMs}ms`:"the bounded default";throw Error(`Reviewer dispatch timed out after ${timeoutDescription}`)}throw Error(result.error??`Reviewer dispatch ${result.status==="cancelled"?"cancelled":"failed"}`)}var _internals148={compileReviewPackage,parseReviewerVerdict:parseReviewerVerdict2,writeReviewerEvidence,dispatchReviewerAgent:defaultDispatchReviewerAgent,resolveDefaultReviewerAgent,listLaneEvidence,readPhaseEvidence,readPersisted:readPersisted3};async function dispatchPhaseReviewer(directory,phase,sessionID,config3){let mergedConfig={...DEFAULT_CONFIG2,...config3},generatedAgentNames=config3?.generatedAgentNames??swarmState.generatedAgentNames,agentName=mergedConfig.reviewerAgent||resolveDefaultReviewerAgent(generatedAgentNames,config3?.activeAgentName),pkg=await _internals148.compileReviewPackage(directory,phase,sessionID,mergedConfig.requireDiffSummary),fallbackModels=reviewFallbackModelStrings(agentName,config3?.agentModelRegistry),legacyModelConfig=resolveLegacyReviewerModelConfig(agentName,config3),responseText;try{responseText=(await dispatchWithModelFallback({dispatch:(model)=>_internals148.dispatchReviewerAgent(directory,pkg,agentName,mergedConfig.timeoutMs,sessionID,model,config3?.dispatcher),resolveFallback:(index)=>config3?.agentModelRegistry?fallbackModels[index-1]??null:legacyModelConfig?resolveFallbackModel(legacyModelConfig.agentBaseName,index,legacyModelConfig.swarmAgents):null,maxTransientRetriesPerModel:0,classify:(err)=>{let msg=err instanceof Error?err.message:String(err);if(/Reviewer dispatch timed out/i.test(msg))return"permanent";return isTransientProviderError(msg)?"transient":"permanent"},onFallback:({toModel,fallbackIndex})=>{telemetry.modelFallback(sessionID,agentName,reviewPrimaryModel(agentName,config3?.agentModelRegistry)??legacyModelConfig?.swarmAgents?.[legacyModelConfig.agentBaseName]?.model??"default",toModel,"transient_model_error");let session=getAgentSession(sessionID);if(session)pushAdvisory(session,`MODEL FALLBACK: reviewer failed over to "${toModel}" (fallback ${fallbackIndex}) after a transient/quota dispatch error.`)}})).result}catch(error93){let isQuota=isQuotaError(error93 instanceof Error?error93.message:String(error93)),evidencePath2=await _internals148.writeReviewerEvidence(directory,phase,"REJECTED",error93 instanceof Error?error93.message:String(error93));return{verdict:"REJECTED",reason:`Reviewer dispatch failed${isQuota?" (model quota/usage limit exhausted across all configured fallbacks)":""}: ${error93 instanceof Error?error93.message:String(error93)}`,evidencePath:evidencePath2}}let parsed=_internals148.parseReviewerVerdict(responseText);if(!parsed)return{verdict:"REJECTED",reason:"Reviewer response could not be parsed",evidencePath:await _internals148.writeReviewerEvidence(directory,phase,"REJECTED","Reviewer response could not be parsed")};let evidencePath=await _internals148.writeReviewerEvidence(directory,phase,parsed.verdict,parsed.reason);return{verdict:parsed.verdict,reason:parsed.reason,evidencePath}}init_create_tool();async function executeLeanTurboReview(args2,dispatcher,generatedAgentNames,agentModelRegistry,activeAgentName){let{directory,phase,sessionID}=args2,requireDiffSummary=!0;try{let{config:config3}=loadPluginConfigWithMeta(directory);if(config3?.turbo?.lean?.integrated_diff_required!==void 0)requireDiffSummary=config3.turbo.lean.integrated_diff_required}catch{}try{let result=await dispatchPhaseReviewer(directory,phase,sessionID,{requireDiffSummary,dispatcher,generatedAgentNames,agentModelRegistry,activeAgentName});return{success:!0,verdict:result.verdict,reason:result.reason,evidencePath:result.evidencePath}}catch(error93){return{success:!1,errors:[error93 instanceof Error?error93.message:String(error93)]}}}function createLeanTurboReviewTool(dispatcher,generatedAgentNames,agentModelRegistry,getActiveAgentName){return createSwarmTool({description:"Dispatch a read-only reviewer agent to evaluate a completed Lean Turbo phase. Wraps dispatchPhaseReviewer from src/turbo/lean/reviewer. Returns verdict (APPROVED/NEEDS_REVISION/REJECTED), reason, and evidence path.",args:{directory:exports_external.string().describe("Project root directory"),phase:exports_external.number().int().positive().describe("Phase number being reviewed"),sessionID:exports_external.string().describe("Lean Turbo session ID")},execute:async(args2,_directory,ctx)=>{let parsed=args2;return JSON.stringify(await executeLeanTurboReview({...parsed,directory:_directory},dispatcher,generatedAgentNames,agentModelRegistry,ctx?.agent!==void 0?String(ctx.agent):getActiveAgentName?.(ctx?.sessionID??parsed.sessionID)),null,2)}})}var lean_turbo_review=createLeanTurboReviewTool();init_zod();init_config();init_state2();init_agents2();init_constants();init_schema();init_state3();init_file_locks();init_manager();init_utils3();init_state2();init_telemetry();init_logger();init_provider_error_classification();init_merge();function getMergeStrategy2(config3){return getMergeStrategy({merge_strategy:config3.merge_strategy})}init_conflicts();init_logger();init_conflicts();import*as path223 from"node:path";init_conflicts();function assessTaskRisk(files,hasDeclaredScope,hasInvalidScope,config3){let globalFiles=files.filter(isGlobalFile);if(globalFiles.length>0)return{category:"global",reason:"global file conflict",files:globalFiles};let protectedFiles=files.filter(isProtectedPath);if(protectedFiles.length>0)return{category:"protected",reason:"protected path",files:protectedFiles};if(hasInvalidScope)return{category:"invalid-scope",reason:"invalid scope entries",files};if(!hasDeclaredScope&&config3.require_declared_scope)return{category:"no-scope",reason:"undeclared scope",files};return{category:"normal",files:[]}}function getValidatedFiles(files,directory){let validFiles=[],invalidCount=0;for(let file3 of files){let pathToCheck;if(file3.startsWith("/")||file3.match(/^[a-zA-Z]:/))pathToCheck=file3;else pathToCheck=`${directory}/${file3}`;if(!isPathSafe(pathToCheck)){invalidCount++;continue}let relativePath2=path223.relative(path223.resolve(directory),path223.resolve(pathToCheck));if(!relativePath2||!isPathSafe(relativePath2)||path223.isAbsolute(relativePath2)){invalidCount++;continue}validFiles.push(normalizePath(relativePath2))}return[validFiles,invalidCount]}function runPartitionPreflight(directory,pendingTasks,config3,scopes){let tasksWithScopes=[];for(let task of pendingTasks){let files=[],hasDeclaredScope=!1;if(scopes&&task.id in scopes)files=scopes[task.id],hasDeclaredScope=!0;else{let scopeFiles=readTaskScopes(directory,task.id);if(scopeFiles!==null)files=scopeFiles,hasDeclaredScope=!0}if(hasDeclaredScope&&files.length===0)hasDeclaredScope=!1;if(!hasDeclaredScope&&!config3.require_declared_scope)files=task.files_touched??[],hasDeclaredScope=!1;if(files.length===0&&!hasDeclaredScope){tasksWithScopes.push({task,files:[],hasDeclaredScope:!1,hasInvalidScope:!0});continue}let[validFiles,invalidCount]=getValidatedFiles(files,directory),hasInvalidScope=invalidCount>0;tasksWithScopes.push({task,files:validFiles,hasDeclaredScope,hasInvalidScope})}let classifiedTasks=[];for(let tws of tasksWithScopes){let assessment=assessTaskRisk(tws.files,tws.hasDeclaredScope,tws.hasInvalidScope,config3);classifiedTasks.push({task:tws.task,files:tws.files,hasDeclaredScope:tws.hasDeclaredScope,category:assessment.category,conflictReason:assessment.reason})}let taskMap=new Map,duplicateIds=[];for(let ct of classifiedTasks){if(taskMap.has(ct.task.id)){duplicateIds.push(ct.task.id);continue}taskMap.set(ct.task.id,ct)}if(duplicateIds.length>0)criticalWarn(`[partition-common] plan.json has duplicate task id(s): ${Array.from(new Set(duplicateIds)).join(", ")}. The first occurrence wins; later duplicates are dropped from planning. Fix the plan file to avoid silent task loss.`);let inDegree=new Map,adjacency=new Map;for(let ct of taskMap.values())inDegree.set(ct.task.id,0),adjacency.set(ct.task.id,[]);for(let ct of taskMap.values()){let deps=ct.task.depends??[];for(let dep of deps)if(taskMap.has(dep))adjacency.get(dep).push(ct.task.id),inDegree.set(ct.task.id,(inDegree.get(ct.task.id)??0)+1)}let sortedTasks=[],tasksInCycle=new Set,queue=[];for(let[taskId,degree]of inDegree)if(degree===0)queue.push(taskId);queue.sort((a,b)=>a.localeCompare(b));while(queue.length>0){let current=queue.shift(),task=taskMap.get(current);sortedTasks.push(task);for(let neighbor of adjacency.get(current)??[]){let newDegree=(inDegree.get(neighbor)??0)-1;if(inDegree.set(neighbor,newDegree),newDegree===0){let insertIdx=queue.findIndex((id)=>id.localeCompare(neighbor)>0);if(insertIdx===-1)queue.push(neighbor);else queue.splice(insertIdx,0,neighbor)}}}for(let[taskId,degree]of inDegree)if(degree>0)tasksInCycle.add(taskId);return{sortedTasks,taskMap,tasksInCycle}}function makeDependencySatisfactionChecker(taskMap,assignedTasks,isUpstreamCommitted){return(task)=>{let deps=task.task.depends??[];for(let dep of deps)if(taskMap.has(dep)){if(!assignedTasks.has(dep))return!1}else if(isUpstreamCommitted&&!isUpstreamCommitted(dep))return!1;return!0}}function getReadyTasks(sortedTasks,assignedTasks,isSatisfied){let ready=[];for(let classified of sortedTasks)if(!assignedTasks.has(classified.task.id)&&isSatisfied(classified))ready.push(classified);return ready.sort((a,b)=>a.task.id.localeCompare(b.task.id)),ready}init_conflicts();function planLeanTurboLanes(directory,phaseNumber,plan,config3,scopes,isUpstreamCommitted){let phase=plan.phases.find((p)=>p.id===phaseNumber);if(!phase)return createEmptyPlan(phaseNumber,"");let pendingTasks=phase.tasks.filter((t)=>t.status!=="completed");if(pendingTasks.length===0)return createEmptyPlan(phaseNumber,"");let{sortedTasks,taskMap,tasksInCycle}=runPartitionPreflight(directory,pendingTasks,config3,scopes),lanes=[],serializedTasks=[],degradedTasks=[],maxLanes=config3.max_parallel_coders,claimedFiles=new Set,assignedTasks=new Set,taskToLane=new Map,crossLaneDependencies={};for(let taskId of tasksInCycle)serializedTasks.push(taskId),assignedTasks.add(taskId),taskToLane.set(taskId,-1);let isSatisfied=makeDependencySatisfactionChecker(taskMap,assignedTasks,isUpstreamCommitted);while(!0){let readyTasks=getReadyTasks(sortedTasks,assignedTasks,isSatisfied);if(readyTasks.length===0)break;for(let classified of readyTasks){if(assignedTasks.has(classified.task.id))continue;if(classified.category==="global"){degradedTasks.push({taskId:classified.task.id,reason:"global file conflict",files:classified.files,requiredMode:"balanced"}),assignedTasks.add(classified.task.id);continue}if(classified.category==="protected"){if(config3.degrade_on_risk)degradedTasks.push({taskId:classified.task.id,reason:"protected path",files:classified.files,requiredMode:"balanced"});else serializedTasks.push(classified.task.id),taskToLane.set(classified.task.id,-1);assignedTasks.add(classified.task.id);continue}if(classified.category==="no-scope"||classified.category==="invalid-scope"){serializedTasks.push(classified.task.id),taskToLane.set(classified.task.id,-1),assignedTasks.add(classified.task.id);continue}if(classified.files.some((file3)=>claimedFiles.has(file3))){if(config3.conflict_policy==="degrade")degradedTasks.push({taskId:classified.task.id,reason:"file conflict with parallel task",files:classified.files,requiredMode:"balanced"});else serializedTasks.push(classified.task.id),taskToLane.set(classified.task.id,-1);assignedTasks.add(classified.task.id);continue}let hasParentChildConflict=!1;for(let file3 of classified.files){for(let claimed of Array.from(claimedFiles))if(pathsConflict(file3,claimed)){hasParentChildConflict=!0;break}if(hasParentChildConflict)break}if(hasParentChildConflict){if(config3.conflict_policy==="degrade")degradedTasks.push({taskId:classified.task.id,reason:"file conflict with parallel task",files:classified.files,requiredMode:"balanced"});else serializedTasks.push(classified.task.id),taskToLane.set(classified.task.id,-1);assignedTasks.add(classified.task.id);continue}let candidateLaneIndex=-1;for(let i=0;i<lanes.length;i++)if(!lanes[i].files.some((laneFile)=>classified.files.some((taskFile)=>pathsConflict(laneFile,taskFile)))){candidateLaneIndex=i;break}if(candidateLaneIndex===-1&&lanes.length<maxLanes)candidateLaneIndex=lanes.length;if(candidateLaneIndex!==-1){let depsInOtherLanes=[],deps=classified.task.depends??[];for(let dep of deps){if(!taskMap.has(dep))continue;let depLane=taskToLane.get(dep);if(depLane!==void 0&&depLane!==-1&&depLane!==candidateLaneIndex)depsInOtherLanes.push(dep)}if(depsInOtherLanes.length>0){serializedTasks.push(classified.task.id),assignedTasks.add(classified.task.id),taskToLane.set(classified.task.id,-1),crossLaneDependencies[classified.task.id]=depsInOtherLanes;continue}if(candidateLaneIndex<lanes.length){let lane=lanes[candidateLaneIndex];lane.taskIds.push(classified.task.id),lane.files.push(...classified.files),assignedTasks.add(classified.task.id),taskToLane.set(classified.task.id,candidateLaneIndex)}else lanes.push({laneId:`lane-${lanes.length+1}`,taskIds:[classified.task.id],files:[...classified.files],status:"pending"}),assignedTasks.add(classified.task.id),taskToLane.set(classified.task.id,lanes.length-1);for(let file3 of classified.files)claimedFiles.add(file3)}else serializedTasks.push(classified.task.id),assignedTasks.add(classified.task.id),taskToLane.set(classified.task.id,-1)}}if(isUpstreamCommitted)for(let classified of sortedTasks){if(assignedTasks.has(classified.task.id))continue;let deps=classified.task.depends??[],uncommittedCrossBatch=[],unassignedInBatch=[];for(let dep of deps)if(taskMap.has(dep)){if(!assignedTasks.has(dep))unassignedInBatch.push(dep)}else if(!isUpstreamCommitted(dep))uncommittedCrossBatch.push(dep);let reason;if(uncommittedCrossBatch.length>0){let sample=uncommittedCrossBatch.slice(0,3).join(", "),more=uncommittedCrossBatch.length>3?`, +${uncommittedCrossBatch.length-3} more`:"";reason=`cross-batch upstream not committed (greenfield-smart Rule 3): ${sample}${more}`}else if(unassignedInBatch.length>0){let sample=unassignedInBatch.slice(0,3).join(", "),more=unassignedInBatch.length>3?`, +${unassignedInBatch.length-3} more`:"";reason=`unresolved in-batch dependency: ${sample}${more}`}else reason="planning leftover (no identifiable blocker)";degradedTasks.push({taskId:classified.task.id,reason,files:classified.files,requiredMode:"balanced"}),assignedTasks.add(classified.task.id),taskToLane.set(classified.task.id,-1)}let degradationSummary;if(degradedTasks.length>0&&degradedTasks.length+serializedTasks.length===pendingTasks.length){let reasons=Array.from(new Set(degradedTasks.map((t)=>t.reason))),rule3Count=degradedTasks.filter((t)=>t.reason.includes("greenfield-smart Rule 3")).length;if(rule3Count>0&&rule3Count>=degradedTasks.length/2)degradationSummary=`All ${pendingTasks.length} tasks degraded. ${rule3Count} blocked by greenfield-smart Rule 3 — cross-batch upstream(s) not in git history. Remediation: verify Epic Mode commit-on-completion is succeeding for upstream phases, or commit those tasks manually before re-running.`;else degradationSummary=`All ${pendingTasks.length} tasks degraded. Reasons: ${reasons.join(", ")}. Consider running in standard (serial) mode.`}let counters={lanesPlanned:lanes.length,lanesStarted:0,lanesCompleted:0,lanesFailed:0,tasksSerialized:serializedTasks.length,tasksDegraded:degradedTasks.length},planId=`plan-${phaseNumber}-${Date.now()}`;return{phase:phaseNumber,planId,lanes,degradedTasks,serializedTasks,degradationSummary,counters,crossLaneDependencies}}function createEmptyPlan(phaseNumber,planId){return{phase:phaseNumber,planId,lanes:[],degradedTasks:[],serializedTasks:[],counters:{lanesPlanned:0,lanesStarted:0,lanesCompleted:0,lanesFailed:0,tasksSerialized:0,tasksDegraded:0},crossLaneDependencies:{}}}init_recovery();init_state4();init_file_locks();init_logger();var _internals149={tryAcquireLock};class TurboStateLockTimeoutError extends Error{directory;sessionID;constructor(directory,sessionID,timeoutMs){super(`Turbo state lock timeout after ${timeoutMs}ms for session ${sessionID}`);this.name="TurboStateLockTimeoutError",this.directory=directory,this.sessionID=sessionID}}var BACKOFF_START_MS2=50,BACKOFF_MAX_MS2=2000,BACKOFF_JITTER_RATIO2=0.25;function backoffMs2(attempt){let base=Math.min(BACKOFF_START_MS2*2**attempt,BACKOFF_MAX_MS2),jitter=base*BACKOFF_JITTER_RATIO2*(Math.random()*2-1);return Math.max(1,Math.round(base+jitter))}async function withTurboStateLock(directory,sessionID,fn2,timeoutMs=30000){let deadline=Date.now()+timeoutMs,attempt=0;while(!0){let result;try{result=await _internals149.tryAcquireLock(directory,".swarm/turbo-state.json","lean-turbo-runner",sessionID)}catch(acquireErr){log(`[lean-turbo] state lock acquisition error for ${sessionID} (.swarm/turbo-state.json), will retry: ${acquireErr instanceof Error?acquireErr.message:String(acquireErr)}`)}if(result?.acquired){let lock=result.lock;try{return await fn2()}finally{if(lock._release)try{await lock._release()}catch(releaseErr){log(`[lean-turbo] state lock release failed for ${sessionID} (.swarm/turbo-state.json): ${releaseErr instanceof Error?releaseErr.message:String(releaseErr)}`)}}}if(Date.now()>=deadline)throw new TurboStateLockTimeoutError(directory,sessionID,timeoutMs);let delay3=Math.min(backoffMs2(attempt),deadline-Date.now());if(delay3>0)await new Promise((resolve85)=>setTimeout(resolve85,delay3));attempt++}}init_worktree_isolation();init_core3();import*as path224 from"node:path";function computeLaneRuntimeProfile2(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))envOverrides[envName]=path224.join(basePath,`lane-${laneIndex}`);return{laneIndex,worktreePath,envOverrides}}async function provisionWorktree2(directory,laneId,sessionId,config3,scope){let laneIndex=parseLeanLaneIndex(laneId),result=await provisionWorktree(directory,laneId,sessionId,{purpose:"lane",branchStyle:"legacy-lane",worktreeDir:config3.worktree_dir,mergeStrategy:config3.merge_strategy,depsStrategy:config3.deps_strategy,scope});if("error"in result)return result;let laneProfile=computeLaneRuntimeProfile2(config3.runtime_isolation,laneIndex,result.worktreePath);if(laneProfile)try{let{writeLaneProfileToDiskReal:writeLaneProfileToDiskReal2}=await Promise.resolve().then(() => (init_core3(),exports_core3));await writeLaneProfileToDiskReal2(result.worktreePath,laneProfile.laneIndex,laneProfile.envOverrides)}catch{}return{worktreePath:result.worktreePath,branchName:result.branchName}}function isTransientProvisionError(errorMsg){let lower=errorMsg.toLowerCase();if(lower.includes("already exists")||lower.includes("not a git repository"))return!1;let transientCodes=["enoent","econnrefused","etimedout","ebusy","eperm","enomem"];for(let code of transientCodes)if(lower.includes(code))return!0;let transientMessages=["disk full","no space left","resource temporarily unavailable"];for(let msg of transientMessages)if(lower.includes(msg))return!0;if(lower.includes("fatal:"))return!0;return!1}function pushDirtyTreeDowngradeAdvisory(sessionID,reason,lanesAffected=[]){let session=ensureAgentSession(sessionID),affected=lanesAffected.length>0?`; affected lanes: ${lanesAffected.join(", ")}`:"";pushAdvisory(session,`LEAN_TURBO_DIRTY_TREE_DOWNGRADE: ${reason}${affected}. Worktree isolation is OFF for this phase; lanes run in the shared working tree.`)}class LeanTurboRunner{static _internals={loadPlanJsonOnly,planLeanTurboLanes,acquireLaneLocks,releaseLaneLocks,loadLeanTurboRunState,saveLeanTurboRunState,hasActiveFullAuto,loadFullAutoRunState,writeLaneEvidence,writePhaseEvidence,laneDispatchTimeoutMs:void 0,provisionWorktree:provisionWorktree2,removeWorktree,removeLaneProfileFromDisk:removeLaneProfileFromDiskReal,mergeLaneBranch,postMergeCleanup,attemptMergeBackFromDirty,startupOrphanRecovery,getMergeStrategy:getMergeStrategy2,assertCleanWorkingTree,ensureAgentSession};_sessionOps=null;_directory;_sessionID;_client;_availableAgents;_laneLockMap={};_laneStatuses=new Map;_agentIndex=0;_timedOutLanes=new Map;_stateLock=Promise.resolve();_leanConfig;_pendingDowngrade=null;constructor(options){if(this._directory=options.directory,this._sessionID=options.sessionID,this._leanConfig=options.leanConfig,"opencodeClient"in options){if(this._client=options.opencodeClient??null,this._client)this._sessionOps=this._client.session}let names=options.generatedAgentNames??swarmState.generatedAgentNames;this._availableAgents=this._resolveCoderAgents(names)}async runPhase(phaseNumber){if(this._client===null)return{ok:!1,reason:"NO_CLIENT",lanes:[],degradedTasks:[],serializedTasks:[]};let plan=await LeanTurboRunner._internals.loadPlanJsonOnly(this._directory);if(!plan)return{ok:!1,reason:"NO_PLAN",lanes:[],degradedTasks:[],serializedTasks:[]};if(LeanTurboRunner._internals.hasActiveFullAuto(this._sessionID)){let fullAutoState=LeanTurboRunner._internals.loadFullAutoRunState(this._directory,this._sessionID);if(fullAutoState&&(fullAutoState.status==="paused"||fullAutoState.status==="terminated"))return{ok:!1,reason:"FULL_AUTO_BLOCKED",lanes:[],degradedTasks:[],serializedTasks:[]}}let leanConfig=this._getLeanConfig(this._leanConfig),phaseStartedAt=new Date().toISOString();if(leanConfig.worktree_isolation){await LeanTurboRunner._internals.startupOrphanRecovery(this._directory,[this._sessionID]);try{let cleanResult=await LeanTurboRunner._internals.assertCleanWorkingTree(this._directory);if(!cleanResult.clean)this._pendingDowngrade={reason:cleanResult.error??"uncommitted changes"},log(`[lean-turbo] worktree isolation requires clean working tree: ${cleanResult.error}`),leanConfig.worktree_isolation=!1}catch(assertErr){let assertMsg=assertErr instanceof Error?assertErr.message:String(assertErr);this._pendingDowngrade={reason:`cleanliness check failed: ${assertMsg}`},log(`[lean-turbo] unable to verify working tree cleanliness: ${assertMsg} — degrading to shared directory`),leanConfig.worktree_isolation=!1}}let lanePlan=LeanTurboRunner._internals.planLeanTurboLanes(this._directory,phaseNumber,{phases:plan.phases},leanConfig);if(this._pendingDowngrade){let lanesAffected=lanePlan.lanes.map((l)=>l.laneId);pushDirtyTreeDowngradeAdvisory(this._sessionID,this._pendingDowngrade.reason,lanesAffected),this._pendingDowngrade=null}let degradedTasks=lanePlan.degradedTasks.map((d)=>d.taskId),degradedDetails=lanePlan.degradedTasks;if(lanePlan.lanes.length===0&&degradedTasks.length===0&&lanePlan.serializedTasks.length===0)return{ok:!1,reason:"NO_LANES",lanes:[],degradedTasks,degradedDetails,serializedTasks:lanePlan.serializedTasks};if(lanePlan.lanes.length===0)return await this._withStateLock(()=>this._updateDurableState(lanePlan)),await this._writePhaseEvidenceSafely({phaseNumber,plan,lanePlan,laneResults:[],leanConfig,status:"completed",startedAt:phaseStartedAt}),{ok:!0,lanes:[],degradedTasks,degradedDetails,serializedTasks:lanePlan.serializedTasks};await this._withStateLock(()=>this._updateDurableState(lanePlan)),this._laneStatuses=new Map(lanePlan.lanes.map((lane)=>[lane.laneId,{...lane}]));let laneResults=[],results=await Promise.all(lanePlan.lanes.map((lane)=>this._processLane(lane,leanConfig)));laneResults.push(...results);let mergeBackFailures=await this._sequentialWorktreeCleanup(laneResults,leanConfig),phaseResult={ok:mergeBackFailures.length===0,reason:mergeBackFailures.length>0?`Lean Turbo merge-back failed for ${mergeBackFailures.length} lane(s); preserved affected worktrees for manual recovery.`:void 0,lanes:laneResults,degradedTasks,degradedDetails,serializedTasks:lanePlan.serializedTasks,mergeBackFailures:mergeBackFailures.length>0?mergeBackFailures:void 0};return await this._writePhaseEvidenceSafely({phaseNumber,plan,lanePlan,laneResults,leanConfig,status:phaseResult.ok?"completed":"failed",startedAt:phaseStartedAt,mergeBackFailures}),phaseResult}async dispatchLane(lane,agentName,worktreeDirectory,model){let session=this._sessionOps??this._client?.session;if(!session)return{ok:!1,error:"NO_CLIENT"};let promptController=new AbortController,dispatchPromise=this._doDispatch(session,lane,agentName,worktreeDirectory,promptController,model),timeoutMs=LeanTurboRunner._internals.laneDispatchTimeoutMs;if(timeoutMs!==void 0&&timeoutMs>0){let timeoutHandle,timeoutPromise=new Promise((_,reject2)=>{timeoutHandle=setTimeout(()=>{promptController.abort(),reject2(Error(`Lane dispatch timed out after ${timeoutMs}ms`))},timeoutMs)});try{return await Promise.race([dispatchPromise,timeoutPromise])}catch(err){if(err instanceof Error&&err.message.includes("timed out"))return this._timedOutLanes.set(lane.laneId,"__pending__"),dispatchPromise.then((result)=>{if(result.ok&&result.sessionId)if(this._timedOutLanes.get(lane.laneId)!==void 0)this._timedOutLanes.delete(lane.laneId),session.delete({path:{id:result.sessionId}}).catch(()=>{});else this._timedOutLanes.delete(lane.laneId);else this._timedOutLanes.delete(lane.laneId)}).catch(()=>{this._timedOutLanes.delete(lane.laneId)}),{ok:!1,error:err.message};throw err}finally{if(timeoutHandle!==void 0)clearTimeout(timeoutHandle)}}return dispatchPromise}async _doDispatch(session,lane,agentName,worktreeDirectory,abortController,model){let sessionId;try{let effectiveDirectory=worktreeDirectory??this._directory,createResult=await session.create({...this._sessionID?{body:{parentID:this._sessionID,title:`lean_turbo_lane_${lane.laneId} background`}}:{},query:{directory:effectiveDirectory}});if(!createResult.data)return{ok:!1,error:`session.create failed: ${typeof createResult.error==="string"?createResult.error:JSON.stringify(createResult.error)}`};sessionId=createResult.data.id;let promptText=this._buildLanePrompt(lane),promptResult=await session.prompt({path:{id:sessionId},body:{agent:agentName,...model?{model}:{},tools:{write:!0,edit:!0,patch:!0},parts:[{type:"text",text:promptText}]},signal:abortController?.signal});if(!promptResult.data)return abortController?.abort(),session.delete({path:{id:sessionId}}).catch(()=>{}),{ok:!1,error:`session.prompt failed: ${typeof promptResult.error==="string"?promptResult.error:JSON.stringify(promptResult.error)}`};return{ok:!0,sessionId}}catch(err){if(sessionId)abortController?.abort(),session.delete({path:{id:sessionId}}).catch(()=>{});return{ok:!1,error:err instanceof Error?err.message:String(err)}}}async waitForLanes(){let statuses=[];for(let[laneId,lane]of this._laneStatuses)statuses.push({laneId,status:lane.status,taskIds:lane.taskIds,agent:lane.agent,sessionId:lane.sessionId,error:lane.error});return statuses}async cleanup(){for(let[laneId]of Object.entries(this._laneLockMap))try{await LeanTurboRunner._internals.releaseLaneLocks(this._directory,laneId)}catch{}this._laneLockMap={};for(let[_laneId,lane]of this._laneStatuses)if(lane.worktreePath)try{await LeanTurboRunner._internals.removeWorktree(lane.worktreePath,this._directory,{force:!0,worktreeDir:this._leanConfig?.worktree_dir})}catch{}await this._withStateLock(async()=>{let runState=LeanTurboRunner._internals.loadLeanTurboRunState(this._directory,this._sessionID);if(runState)runState.lanes=runState.lanes.map((lane)=>lane.status==="running"||lane.status==="pending"?{...lane,status:"blocked"}:lane),LeanTurboRunner._internals.saveLeanTurboRunState(this._directory,runState)})}async cleanupAfterSuccess(){for(let[laneId]of Object.entries(this._laneLockMap)){let laneStatus=this._laneStatuses.get(laneId);if(laneStatus&&(laneStatus.status==="completed"||laneStatus.status==="failed"||laneStatus.status==="blocked")){try{await LeanTurboRunner._internals.releaseLaneLocks(this._directory,laneId)}catch{}delete this._laneLockMap[laneId]}}}async cleanupAfterFailure(){return this.cleanup()}_resolveCoderAgents(names){let coders=names.filter((n)=>n.toLowerCase().includes("coder"));if(coders.length===0)return["coder"];let prefixed=coders.filter((n)=>/[_-]coder$/i.test(n)||/^[a-z]+_[a-z]+_coder$/i.test(n)),bare=coders.filter((n)=>!n.includes("_")&&!n.includes("-")&&n==="coder"),sorted=[...prefixed.sort((a,b)=>b.length-a.length),...bare],seen=new Set,deduped=[];for(let name of sorted)if(!seen.has(name.toLowerCase()))seen.add(name.toLowerCase()),deduped.push(name);return deduped.length>0?deduped:["coder"]}_getLeanConfig(config3){if(config3)return structuredClone({...DEFAULT_LEAN_TURBO_CONFIG,...config3});return{...DEFAULT_LEAN_TURBO_CONFIG}}async _processLane(lane,leanConfig){let laneInState=this._laneStatuses.get(lane.laneId);if(laneInState)laneInState.status="running",laneInState.startedAt=new Date().toISOString();let taskId=lane.taskIds[0]??lane.laneId,agent=this._selectNextAgent();if(!(await LeanTurboRunner._internals.acquireLaneLocks(this._directory,lane.laneId,lane.files,agent,taskId,this._sessionID)).acquired){if(await this._withStateLock(async()=>{try{let runState=LeanTurboRunner._internals.loadLeanTurboRunState(this._directory,this._sessionID);if(runState){let existingSerialized=new Set(runState.serializedTasks??[]);for(let tid of lane.taskIds)existingSerialized.add(tid);runState.serializedTasks=Array.from(existingSerialized),runState.counters.tasksSerialized+=lane.taskIds.length,LeanTurboRunner._internals.saveLeanTurboRunState(this._directory,runState)}}catch{}}),laneInState)laneInState.status="failed",laneInState.error="lock conflict - tasks routed to serial fallback";return await this._updateDurableStateLaneStatus(lane.laneId,"failed"),{laneId:lane.laneId,status:"failed",taskIds:lane.taskIds,error:"lock conflict - tasks routed to serial fallback"}}this._laneLockMap[lane.laneId]=[...lane.files];let worktreeDirectory;if(leanConfig.worktree_isolation){let provisionError;try{let provisionResult=await LeanTurboRunner._internals.provisionWorktree(this._directory,lane.laneId,this._sessionID,leanConfig);if("worktreePath"in provisionResult){if(worktreeDirectory=provisionResult.worktreePath,laneInState)laneInState.worktreePath=provisionResult.worktreePath,laneInState.branchName=provisionResult.branchName;await this._persistLaneWorktreeFields(lane.laneId,provisionResult.worktreePath,provisionResult.branchName)}else provisionError=provisionResult.error}catch(provisionErr){provisionError=provisionErr instanceof Error?provisionErr.message:String(provisionErr)}if(provisionError)if(isTransientProvisionError(provisionError)){log(`[lean-turbo] worktree provision failed for lane ${lane.laneId}: ${provisionError} — retrying once...`),await new Promise((r)=>setTimeout(r,100));try{let retryResult=await LeanTurboRunner._internals.provisionWorktree(this._directory,lane.laneId,this._sessionID,leanConfig);if("worktreePath"in retryResult){if(worktreeDirectory=retryResult.worktreePath,laneInState)laneInState.worktreePath=retryResult.worktreePath,laneInState.branchName=retryResult.branchName;await this._persistLaneWorktreeFields(lane.laneId,retryResult.worktreePath,retryResult.branchName),log(`[lean-turbo] worktree provision retry succeeded for lane ${lane.laneId}`),provisionError=void 0}else provisionError=retryResult.error,log(`[lean-turbo] worktree provision retry failed for lane ${lane.laneId}: ${retryResult.error}`)}catch(retryErr){let retryMsg=retryErr instanceof Error?retryErr.message:String(retryErr);log(`[lean-turbo] worktree provision retry threw for lane ${lane.laneId}: ${retryMsg}`)}}else log(`[lean-turbo] worktree provision failed for lane ${lane.laneId}: ${provisionError}`);if(!worktreeDirectory){let failMsg=`worktree provision failed: ${provisionError??"unknown error"}`;try{await LeanTurboRunner._internals.releaseLaneLocks(this._directory,lane.laneId)}catch{}if(delete this._laneLockMap[lane.laneId],laneInState)laneInState.status="failed",laneInState.error=failMsg;return await this._updateDurableStateLaneStatus(lane.laneId,"failed"),await this._writeLaneEvidenceSafely(lane,"failed",{status:"failed",error:failMsg,agent}),{laneId:lane.laneId,status:"failed",taskIds:lane.taskIds,agent,error:failMsg}}}let coderBase=stripKnownSwarmPrefix(agent),coderSwarmId=coderBase!==agent?agent.slice(0,agent.length-coderBase.length-1):void 0,coderSwarmAgents=getSwarmAgents(coderSwarmId),dispatchResult;try{dispatchResult=(await dispatchWithModelFallback({dispatch:async(model)=>{let r=await this.dispatchLane(lane,agent,worktreeDirectory,model);if(!r.ok)throw Error(r.error??"lane dispatch failed");return r},resolveFallback:(index)=>resolveFallbackModel(coderBase,index,coderSwarmAgents),maxTransientRetriesPerModel:0,classify:(err)=>{let msg=err instanceof Error?err.message:String(err);if(/Lane dispatch timed out/i.test(msg))return"permanent";return isTransientProviderError(msg)?"transient":"permanent"},onFallback:({toModel,fallbackIndex})=>{telemetry.modelFallback(this._sessionID??"",agent,coderSwarmAgents?.[coderBase]?.model??"default",toModel,"transient_model_error");let session=this._sessionID?getAgentSession(this._sessionID):void 0;if(session)pushAdvisory(session,`MODEL FALLBACK: coder lane ${lane.laneId} failed over to "${toModel}" (fallback ${fallbackIndex}) after a transient/quota dispatch error.`)}})).result}catch(err){let msg=err instanceof Error?err.message:String(err);dispatchResult={ok:!1,error:isQuotaError(msg)?`${msg} (model quota/usage limit exhausted across all configured fallbacks)`:msg}}if(!dispatchResult.ok){try{await LeanTurboRunner._internals.releaseLaneLocks(this._directory,lane.laneId)}catch{}if(delete this._laneLockMap[lane.laneId],worktreeDirectory&&laneInState)laneInState._failureCleanupPending=!0;if(laneInState)laneInState.status="failed",laneInState.error=dispatchResult.error;return await this._updateDurableStateLaneStatus(lane.laneId,"failed"),await this._writeLaneEvidenceSafely(lane,"failed",{status:"failed",error:dispatchResult.error,agent}),{laneId:lane.laneId,status:"failed",taskIds:lane.taskIds,agent,error:dispatchResult.error}}let completedAt=new Date().toISOString();if(laneInState)laneInState.status="completed",laneInState.agent=agent,laneInState.sessionId=dispatchResult.sessionId,laneInState.completedAt=completedAt;await this._updateDurableStateLaneStatus(lane.laneId,"completed");try{await LeanTurboRunner._internals.releaseLaneLocks(this._directory,lane.laneId)}catch{}return delete this._laneLockMap[lane.laneId],await this._writeLaneEvidenceSafely(lane,"completed",{status:"completed",agent,sessionId:dispatchResult.sessionId,completedAt}),{laneId:lane.laneId,status:"completed",taskIds:lane.taskIds,agent,sessionId:dispatchResult.sessionId}}_persistRecovery(info){writeRecoveryRecord(this._directory,{laneId:info.laneId,sessionId:this._sessionID,branchName:info.branchName,worktreePath:info.worktreePath,status:info.status,reason:info.reason,conflictFiles:info.conflictFiles,replayHint:"Open the directory in worktreePath and run git status with that directory as the working directory."})}async _sequentialWorktreeCleanup(laneResults,leanConfig){let mergeBackFailures=[];for(let lr of laneResults){let laneInState=this._laneStatuses.get(lr.laneId);if(!laneInState?.worktreePath)continue;let needsPostMergeCleanup=!1;if(lr.status==="completed"){if(!laneInState.branchName)continue;try{let strategy=LeanTurboRunner._internals.getMergeStrategy(leanConfig),mergeResult=await LeanTurboRunner._internals.attemptMergeBackFromDirty(laneInState.worktreePath,laneInState.branchName,this._directory,strategy);if("merged"in mergeResult&&mergeResult.merged){needsPostMergeCleanup=!0,clearRecoveryRecord(this._directory,lr.laneId,this._sessionID);let leanLaneIndex=parseLeanLaneIndex(lr.laneId);try{await LeanTurboRunner._internals.removeLaneProfileFromDisk(laneInState.worktreePath,leanLaneIndex)}catch{}}else if("conflict"in mergeResult&&mergeResult.conflict||"partial"in mergeResult&&mergeResult.partial){let conflictFiles="conflictFiles"in mergeResult&&Array.isArray(mergeResult.conflictFiles)?mergeResult.conflictFiles:[],isConflict="conflict"in mergeResult&&mergeResult.conflict===!0||conflictFiles.length>0,reason="message"in mergeResult&&typeof mergeResult.message==="string"&&(mergeResult.message||"")||"merge-back partially failed",failureInfo={laneId:lr.laneId,branchName:laneInState.branchName,worktreePath:laneInState.worktreePath,status:isConflict?"conflict":"partial",reason,conflictFiles};mergeBackFailures.push(failureInfo),lr.status="failed",lr.error=failureInfo.reason,lr.mergeBackFailure=failureInfo,laneInState.status="failed",laneInState.error=failureInfo.reason,await this._updateDurableStateLaneStatus(lr.laneId,"failed"),await this._writeLaneEvidenceSafely({laneId:lr.laneId,taskIds:lr.taskIds,files:[],status:"failed"},"failed",{status:"failed",error:failureInfo.reason,mergeBackFailure:failureInfo}),this._persistRecovery(failureInfo),log(`[lean-turbo] merge-back PARTIAL for lane ${lr.laneId}: ${failureInfo.reason} — worktree preserved at ${laneInState.worktreePath} for manual recovery`);continue}else if("failed"in mergeResult&&mergeResult.failed){let failureInfo={laneId:lr.laneId,branchName:laneInState.branchName,worktreePath:laneInState.worktreePath,status:"failed",reason:mergeResult.message};mergeBackFailures.push(failureInfo),lr.status="failed",lr.error=failureInfo.reason,lr.mergeBackFailure=failureInfo,laneInState.status="failed",laneInState.error=failureInfo.reason,await this._updateDurableStateLaneStatus(lr.laneId,"failed"),await this._writeLaneEvidenceSafely({laneId:lr.laneId,taskIds:lr.taskIds,files:[],status:"failed"},"failed",{status:"failed",error:failureInfo.reason,mergeBackFailure:failureInfo}),log(`[lean-turbo] merge-back ERROR for lane ${lr.laneId}: ${failureInfo.reason} — worktree preserved at ${laneInState.worktreePath} for manual recovery`),this._persistRecovery(failureInfo);continue}}catch(err){let errMsg=err instanceof Error?err.message:String(err),failureInfo={laneId:lr.laneId,branchName:laneInState.branchName,worktreePath:laneInState.worktreePath,status:"failed",reason:errMsg};mergeBackFailures.push(failureInfo),lr.status="failed",lr.error=failureInfo.reason,lr.mergeBackFailure=failureInfo,laneInState.status="failed",laneInState.error=failureInfo.reason,await this._updateDurableStateLaneStatus(lr.laneId,"failed"),await this._writeLaneEvidenceSafely({laneId:lr.laneId,taskIds:lr.taskIds,files:[],status:"failed"},"failed",{status:"failed",error:failureInfo.reason,mergeBackFailure:failureInfo}),log(`[lean-turbo] merge-back EXCEPTION for lane ${lr.laneId}: ${errMsg} — worktree preserved at ${laneInState.worktreePath} for manual recovery`),this._persistRecovery(failureInfo);continue}}else if(lr.status==="failed"&&laneInState._failureCleanupPending){let failureInfo={laneId:lr.laneId,branchName:laneInState.branchName,worktreePath:laneInState.worktreePath,status:"failed",reason:lr.error||"Lane failed before completion; worktree preserved without merge-back"};mergeBackFailures.push(failureInfo),lr.mergeBackFailure=failureInfo,log(`[lean-turbo] failed lane ${lr.laneId}: ${failureInfo.reason} — worktree preserved at ${laneInState.worktreePath}; not merging partial work`),this._persistRecovery(failureInfo);continue}try{await LeanTurboRunner._internals.removeWorktree(laneInState.worktreePath,this._directory,{force:!0,worktreeDir:leanConfig.worktree_dir})}catch{}if(needsPostMergeCleanup&&laneInState.branchName)try{await LeanTurboRunner._internals.postMergeCleanup(this._directory,laneInState.branchName)}catch{}}return mergeBackFailures}_buildIntegratedDiffSummary(lanePlan,laneResults,mergeBackFailures=[]){let resultByLane=new Map(laneResults.map((lane)=>[lane.laneId,lane])),files=new Set;for(let lane of lanePlan.lanes)for(let file3 of lane.files)files.add(file3);let completed=laneResults.filter((lane)=>lane.status==="completed").length,failed=laneResults.filter((lane)=>lane.status==="failed").length,blocked=laneResults.filter((lane)=>lane.status==="blocked").length,fileList=[...files].sort(),displayedFiles=fileList.slice(0,50),hiddenFileCount=Math.max(0,fileList.length-displayedFiles.length),lines=[`Lean Turbo phase ${lanePlan.phase}: ${completed}/${lanePlan.lanes.length} lanes completed, ${failed} failed, ${blocked} blocked.`,`Files declared changed (${fileList.length}): ${displayedFiles.length>0?displayedFiles.join(", "):"none"}${hiddenFileCount>0?`, ... +${hiddenFileCount} more`:""}.`];if(lanePlan.serializedTasks.length>0)lines.push(`Serialized tasks pending standard execution: ${lanePlan.serializedTasks.join(", ")}.`);if(lanePlan.degradedTasks.length>0)lines.push(`Degraded tasks: ${lanePlan.degradedTasks.map((task)=>`${task.taskId} (${task.reason})`).join(", ")}.`);if(mergeBackFailures.length>0)lines.push(`Merge-back failures: ${mergeBackFailures.map((failure)=>`${failure.laneId}: ${failure.reason}`).join("; ")}.`);for(let lane of lanePlan.lanes){let result=resultByLane.get(lane.laneId);if(result?.error)lines.push(`${lane.laneId} error: ${result.error}.`)}return lines.join(`
6089
+ REASON: [critical blocking issues]`,result=await activeDispatcher.dispatch({directory,parentSessionId,agentName,model,system,prompt,title:parentSessionId?"lean_turbo_reviewer background":void 0,timeoutMs});if(result.status==="completed")return result.text;if(result.status==="timeout"){let timeoutDescription=timeoutMs>0?`${timeoutMs}ms`:"the bounded default";throw Error(`Reviewer dispatch timed out after ${timeoutDescription}`)}throw Error(result.error??`Reviewer dispatch ${result.status==="cancelled"?"cancelled":"failed"}`)}var _internals148={compileReviewPackage,parseReviewerVerdict:parseReviewerVerdict2,writeReviewerEvidence,dispatchReviewerAgent:defaultDispatchReviewerAgent,resolveDefaultReviewerAgent,listLaneEvidence,readPhaseEvidence,readPersisted:readPersisted3};async function dispatchPhaseReviewer(directory,phase,sessionID,config3){let mergedConfig={...DEFAULT_CONFIG2,...config3},generatedAgentNames=config3?.generatedAgentNames??swarmState.generatedAgentNames,agentName=mergedConfig.reviewerAgent||resolveDefaultReviewerAgent(generatedAgentNames,config3?.activeAgentName),pkg=await _internals148.compileReviewPackage(directory,phase,sessionID,mergedConfig.requireDiffSummary),fallbackModels=reviewFallbackModelStrings(agentName,config3?.agentModelRegistry),legacyModelConfig=resolveLegacyReviewerModelConfig(agentName,config3),responseText;try{responseText=(await dispatchWithModelFallback({dispatch:(model)=>_internals148.dispatchReviewerAgent(directory,pkg,agentName,mergedConfig.timeoutMs,sessionID,model,config3?.dispatcher),resolveFallback:(index)=>config3?.agentModelRegistry?fallbackModels[index-1]??null:legacyModelConfig?resolveFallbackModel(legacyModelConfig.agentBaseName,index,legacyModelConfig.swarmAgents):null,maxTransientRetriesPerModel:0,classify:(err)=>{let msg=err instanceof Error?err.message:String(err);if(/Reviewer dispatch timed out/i.test(msg))return"permanent";return isTransientProviderError(msg)?"transient":"permanent"},onFallback:({toModel,fallbackIndex})=>{telemetry.modelFallback(sessionID,agentName,reviewPrimaryModel(agentName,config3?.agentModelRegistry)??legacyModelConfig?.swarmAgents?.[legacyModelConfig.agentBaseName]?.model??"default",toModel,"transient_model_error");let session=getAgentSession(sessionID);if(session)pushAdvisory(session,`MODEL FALLBACK: reviewer failed over to "${toModel}" (fallback ${fallbackIndex}) after a transient/quota dispatch error.`)}})).result}catch(error93){let isQuota=isQuotaError(error93 instanceof Error?error93.message:String(error93)),evidencePath2=await _internals148.writeReviewerEvidence(directory,phase,"REJECTED",error93 instanceof Error?error93.message:String(error93));return{verdict:"REJECTED",reason:`Reviewer dispatch failed${isQuota?" (model quota/usage limit exhausted across all configured fallbacks)":""}: ${error93 instanceof Error?error93.message:String(error93)}`,evidencePath:evidencePath2}}let parsed=_internals148.parseReviewerVerdict(responseText);if(!parsed)return{verdict:"REJECTED",reason:"Reviewer response could not be parsed",evidencePath:await _internals148.writeReviewerEvidence(directory,phase,"REJECTED","Reviewer response could not be parsed")};let evidencePath=await _internals148.writeReviewerEvidence(directory,phase,parsed.verdict,parsed.reason);return{verdict:parsed.verdict,reason:parsed.reason,evidencePath}}init_create_tool();async function executeLeanTurboReview(args2,dispatcher,generatedAgentNames,agentModelRegistry,activeAgentName){let{directory,phase,sessionID}=args2,requireDiffSummary=!0;try{let{config:config3}=loadPluginConfigWithMeta(directory);if(config3?.turbo?.lean?.integrated_diff_required!==void 0)requireDiffSummary=config3.turbo.lean.integrated_diff_required}catch{}try{let result=await dispatchPhaseReviewer(directory,phase,sessionID,{requireDiffSummary,dispatcher,generatedAgentNames,agentModelRegistry,activeAgentName});return{success:!0,verdict:result.verdict,reason:result.reason,evidencePath:result.evidencePath}}catch(error93){return{success:!1,errors:[error93 instanceof Error?error93.message:String(error93)]}}}function createLeanTurboReviewTool(dispatcher,generatedAgentNames,agentModelRegistry,getActiveAgentName){return createSwarmTool({description:"Dispatch a read-only reviewer agent to evaluate a completed Lean Turbo phase. Wraps dispatchPhaseReviewer from src/turbo/lean/reviewer. Returns verdict (APPROVED/NEEDS_REVISION/REJECTED), reason, and evidence path.",args:{directory:exports_external.string().describe("Project root directory"),phase:exports_external.number().int().positive().describe("Phase number being reviewed"),sessionID:exports_external.string().describe("Lean Turbo session ID")},execute:async(args2,_directory,ctx)=>{let parsed=args2;return JSON.stringify(await executeLeanTurboReview({...parsed,directory:_directory},dispatcher,generatedAgentNames,agentModelRegistry,ctx?.agent!==void 0?String(ctx.agent):getActiveAgentName?.(ctx?.sessionID??parsed.sessionID)),null,2)}})}var lean_turbo_review=createLeanTurboReviewTool();init_zod();init_config();init_state2();init_agents2();init_constants();init_schema();init_state3();init_file_locks();init_manager();init_utils3();init_state2();init_telemetry();init_logger();init_provider_error_classification();init_manager();init_scope_binding();init_scope_persistence();init_state2();var LEAN_TURBO_LANE_DISPATCH_PREFIX="lean-turbo-lane";function deriveLeanTurboLaneDispatchCallId(input){return`${LEAN_TURBO_LANE_DISPATCH_PREFIX}:${input.parentSessionId}:${input.laneId}:${input.childSessionId}`}function normalizeOne(file3){let normalized=normalizeScopeFiles([file3]);return normalized?normalized[0]??null:null}function resolveLeanTurboLaneAuthorityFiles(plan,lane){let laneTaskIds=new Set(lane.taskIds);if(laneTaskIds.size===0)return null;let planAuthority=[];for(let phase of plan.phases)for(let task of phase.tasks){if(!laneTaskIds.has(task.id))continue;for(let file3 of task.files_touched??[]){let normalized=normalizeOne(file3);if(normalized)planAuthority.push(normalized)}}if(planAuthority.length===0)return null;let authorized=new Set;for(let file3 of lane.files){let normalized=normalizeOne(file3);if(!normalized)continue;if(scopeContains(planAuthority,normalized))authorized.add(normalized)}if(authorized.size===0)return null;return normalizeScopeFiles([...authorized])}async function publishLeanTurboLaneScopeBinding(input){let parentSessionId=input.parentSessionId.trim(),childSessionId=input.childSessionId.trim();if(!parentSessionId||!childSessionId||parentSessionId===childSessionId)return null;let taskId=input.lane.taskIds[0];if(!taskId)return null;let files=resolveLeanTurboLaneAuthorityFiles(input.plan,input.lane);if(!files)return null;let dispatchCallId=deriveLeanTurboLaneDispatchCallId({parentSessionId,laneId:input.lane.laneId,childSessionId}),parentBinding=createScopeBinding({directory:input.primaryDirectory,plan:input.plan,taskId,files,ownerSessionId:parentSessionId,ownerMessageId:dispatchCallId,source:"plan",dispatchCallId,activation:"pending_child"});if(!parentBinding)return null;if(input.isolated)await savePlan(input.laneRoot,input.plan,{preserveCompletedStatuses:!1});let childBinding=deriveChildScopeBinding(parentBinding,{childDirectory:input.laneRoot,childSessionId,parentCallId:dispatchCallId});registerScopeBinding(childBinding),await writeScopeBindingToDisk(input.laneRoot,childBinding);let childSession=ensureAgentSession(childSessionId,"coder",input.laneRoot);if(childSession.currentTaskId=childBinding.taskId,childSession.declaredCoderScope=[...childBinding.files],input.isolated)recordSessionWorkspaceRoot(childSessionId,input.laneRoot);return childBinding}init_merge();function getMergeStrategy2(config3){return getMergeStrategy({merge_strategy:config3.merge_strategy})}init_conflicts();init_logger();init_conflicts();import*as path223 from"node:path";init_conflicts();function assessTaskRisk(files,hasDeclaredScope,hasInvalidScope,config3){let globalFiles=files.filter(isGlobalFile);if(globalFiles.length>0)return{category:"global",reason:"global file conflict",files:globalFiles};let protectedFiles=files.filter(isProtectedPath);if(protectedFiles.length>0)return{category:"protected",reason:"protected path",files:protectedFiles};if(hasInvalidScope)return{category:"invalid-scope",reason:"invalid scope entries",files};if(!hasDeclaredScope&&config3.require_declared_scope)return{category:"no-scope",reason:"undeclared scope",files};return{category:"normal",files:[]}}function getValidatedFiles(files,directory){let validFiles=[],invalidCount=0;for(let file3 of files){let pathToCheck;if(file3.startsWith("/")||file3.match(/^[a-zA-Z]:/))pathToCheck=file3;else pathToCheck=`${directory}/${file3}`;if(!isPathSafe(pathToCheck)){invalidCount++;continue}let relativePath2=path223.relative(path223.resolve(directory),path223.resolve(pathToCheck));if(!relativePath2||!isPathSafe(relativePath2)||path223.isAbsolute(relativePath2)){invalidCount++;continue}validFiles.push(normalizePath(relativePath2))}return[validFiles,invalidCount]}function runPartitionPreflight(directory,pendingTasks,config3,scopes){let tasksWithScopes=[];for(let task of pendingTasks){let files=[],hasDeclaredScope=!1;if(scopes&&task.id in scopes)files=scopes[task.id],hasDeclaredScope=!0;else{let scopeFiles=readTaskScopes(directory,task.id);if(scopeFiles!==null)files=scopeFiles,hasDeclaredScope=!0}if(hasDeclaredScope&&files.length===0)hasDeclaredScope=!1;if(!hasDeclaredScope&&!config3.require_declared_scope)files=task.files_touched??[],hasDeclaredScope=!1;if(files.length===0&&!hasDeclaredScope){tasksWithScopes.push({task,files:[],hasDeclaredScope:!1,hasInvalidScope:!0});continue}let[validFiles,invalidCount]=getValidatedFiles(files,directory),hasInvalidScope=invalidCount>0;tasksWithScopes.push({task,files:validFiles,hasDeclaredScope,hasInvalidScope})}let classifiedTasks=[];for(let tws of tasksWithScopes){let assessment=assessTaskRisk(tws.files,tws.hasDeclaredScope,tws.hasInvalidScope,config3);classifiedTasks.push({task:tws.task,files:tws.files,hasDeclaredScope:tws.hasDeclaredScope,category:assessment.category,conflictReason:assessment.reason})}let taskMap=new Map,duplicateIds=[];for(let ct of classifiedTasks){if(taskMap.has(ct.task.id)){duplicateIds.push(ct.task.id);continue}taskMap.set(ct.task.id,ct)}if(duplicateIds.length>0)criticalWarn(`[partition-common] plan.json has duplicate task id(s): ${Array.from(new Set(duplicateIds)).join(", ")}. The first occurrence wins; later duplicates are dropped from planning. Fix the plan file to avoid silent task loss.`);let inDegree=new Map,adjacency=new Map;for(let ct of taskMap.values())inDegree.set(ct.task.id,0),adjacency.set(ct.task.id,[]);for(let ct of taskMap.values()){let deps=ct.task.depends??[];for(let dep of deps)if(taskMap.has(dep))adjacency.get(dep).push(ct.task.id),inDegree.set(ct.task.id,(inDegree.get(ct.task.id)??0)+1)}let sortedTasks=[],tasksInCycle=new Set,queue=[];for(let[taskId,degree]of inDegree)if(degree===0)queue.push(taskId);queue.sort((a,b)=>a.localeCompare(b));while(queue.length>0){let current=queue.shift(),task=taskMap.get(current);sortedTasks.push(task);for(let neighbor of adjacency.get(current)??[]){let newDegree=(inDegree.get(neighbor)??0)-1;if(inDegree.set(neighbor,newDegree),newDegree===0){let insertIdx=queue.findIndex((id)=>id.localeCompare(neighbor)>0);if(insertIdx===-1)queue.push(neighbor);else queue.splice(insertIdx,0,neighbor)}}}for(let[taskId,degree]of inDegree)if(degree>0)tasksInCycle.add(taskId);return{sortedTasks,taskMap,tasksInCycle}}function makeDependencySatisfactionChecker(taskMap,assignedTasks,isUpstreamCommitted){return(task)=>{let deps=task.task.depends??[];for(let dep of deps)if(taskMap.has(dep)){if(!assignedTasks.has(dep))return!1}else if(isUpstreamCommitted&&!isUpstreamCommitted(dep))return!1;return!0}}function getReadyTasks(sortedTasks,assignedTasks,isSatisfied){let ready=[];for(let classified of sortedTasks)if(!assignedTasks.has(classified.task.id)&&isSatisfied(classified))ready.push(classified);return ready.sort((a,b)=>a.task.id.localeCompare(b.task.id)),ready}init_conflicts();function planLeanTurboLanes(directory,phaseNumber,plan,config3,scopes,isUpstreamCommitted){let phase=plan.phases.find((p)=>p.id===phaseNumber);if(!phase)return createEmptyPlan(phaseNumber,"");let pendingTasks=phase.tasks.filter((t)=>t.status!=="completed");if(pendingTasks.length===0)return createEmptyPlan(phaseNumber,"");let{sortedTasks,taskMap,tasksInCycle}=runPartitionPreflight(directory,pendingTasks,config3,scopes),lanes=[],serializedTasks=[],degradedTasks=[],maxLanes=config3.max_parallel_coders,claimedFiles=new Set,assignedTasks=new Set,taskToLane=new Map,crossLaneDependencies={};for(let taskId of tasksInCycle)serializedTasks.push(taskId),assignedTasks.add(taskId),taskToLane.set(taskId,-1);let isSatisfied=makeDependencySatisfactionChecker(taskMap,assignedTasks,isUpstreamCommitted);while(!0){let readyTasks=getReadyTasks(sortedTasks,assignedTasks,isSatisfied);if(readyTasks.length===0)break;for(let classified of readyTasks){if(assignedTasks.has(classified.task.id))continue;if(classified.category==="global"){degradedTasks.push({taskId:classified.task.id,reason:"global file conflict",files:classified.files,requiredMode:"balanced"}),assignedTasks.add(classified.task.id);continue}if(classified.category==="protected"){if(config3.degrade_on_risk)degradedTasks.push({taskId:classified.task.id,reason:"protected path",files:classified.files,requiredMode:"balanced"});else serializedTasks.push(classified.task.id),taskToLane.set(classified.task.id,-1);assignedTasks.add(classified.task.id);continue}if(classified.category==="no-scope"||classified.category==="invalid-scope"){serializedTasks.push(classified.task.id),taskToLane.set(classified.task.id,-1),assignedTasks.add(classified.task.id);continue}if(classified.files.some((file3)=>claimedFiles.has(file3))){if(config3.conflict_policy==="degrade")degradedTasks.push({taskId:classified.task.id,reason:"file conflict with parallel task",files:classified.files,requiredMode:"balanced"});else serializedTasks.push(classified.task.id),taskToLane.set(classified.task.id,-1);assignedTasks.add(classified.task.id);continue}let hasParentChildConflict=!1;for(let file3 of classified.files){for(let claimed of Array.from(claimedFiles))if(pathsConflict(file3,claimed)){hasParentChildConflict=!0;break}if(hasParentChildConflict)break}if(hasParentChildConflict){if(config3.conflict_policy==="degrade")degradedTasks.push({taskId:classified.task.id,reason:"file conflict with parallel task",files:classified.files,requiredMode:"balanced"});else serializedTasks.push(classified.task.id),taskToLane.set(classified.task.id,-1);assignedTasks.add(classified.task.id);continue}let candidateLaneIndex=-1;for(let i=0;i<lanes.length;i++)if(!lanes[i].files.some((laneFile)=>classified.files.some((taskFile)=>pathsConflict(laneFile,taskFile)))){candidateLaneIndex=i;break}if(candidateLaneIndex===-1&&lanes.length<maxLanes)candidateLaneIndex=lanes.length;if(candidateLaneIndex!==-1){let depsInOtherLanes=[],deps=classified.task.depends??[];for(let dep of deps){if(!taskMap.has(dep))continue;let depLane=taskToLane.get(dep);if(depLane!==void 0&&depLane!==-1&&depLane!==candidateLaneIndex)depsInOtherLanes.push(dep)}if(depsInOtherLanes.length>0){serializedTasks.push(classified.task.id),assignedTasks.add(classified.task.id),taskToLane.set(classified.task.id,-1),crossLaneDependencies[classified.task.id]=depsInOtherLanes;continue}if(candidateLaneIndex<lanes.length){let lane=lanes[candidateLaneIndex];lane.taskIds.push(classified.task.id),lane.files.push(...classified.files),assignedTasks.add(classified.task.id),taskToLane.set(classified.task.id,candidateLaneIndex)}else lanes.push({laneId:`lane-${lanes.length+1}`,taskIds:[classified.task.id],files:[...classified.files],status:"pending"}),assignedTasks.add(classified.task.id),taskToLane.set(classified.task.id,lanes.length-1);for(let file3 of classified.files)claimedFiles.add(file3)}else serializedTasks.push(classified.task.id),assignedTasks.add(classified.task.id),taskToLane.set(classified.task.id,-1)}}if(isUpstreamCommitted)for(let classified of sortedTasks){if(assignedTasks.has(classified.task.id))continue;let deps=classified.task.depends??[],uncommittedCrossBatch=[],unassignedInBatch=[];for(let dep of deps)if(taskMap.has(dep)){if(!assignedTasks.has(dep))unassignedInBatch.push(dep)}else if(!isUpstreamCommitted(dep))uncommittedCrossBatch.push(dep);let reason;if(uncommittedCrossBatch.length>0){let sample=uncommittedCrossBatch.slice(0,3).join(", "),more=uncommittedCrossBatch.length>3?`, +${uncommittedCrossBatch.length-3} more`:"";reason=`cross-batch upstream not committed (greenfield-smart Rule 3): ${sample}${more}`}else if(unassignedInBatch.length>0){let sample=unassignedInBatch.slice(0,3).join(", "),more=unassignedInBatch.length>3?`, +${unassignedInBatch.length-3} more`:"";reason=`unresolved in-batch dependency: ${sample}${more}`}else reason="planning leftover (no identifiable blocker)";degradedTasks.push({taskId:classified.task.id,reason,files:classified.files,requiredMode:"balanced"}),assignedTasks.add(classified.task.id),taskToLane.set(classified.task.id,-1)}let degradationSummary;if(degradedTasks.length>0&&degradedTasks.length+serializedTasks.length===pendingTasks.length){let reasons=Array.from(new Set(degradedTasks.map((t)=>t.reason))),rule3Count=degradedTasks.filter((t)=>t.reason.includes("greenfield-smart Rule 3")).length;if(rule3Count>0&&rule3Count>=degradedTasks.length/2)degradationSummary=`All ${pendingTasks.length} tasks degraded. ${rule3Count} blocked by greenfield-smart Rule 3 — cross-batch upstream(s) not in git history. Remediation: verify Epic Mode commit-on-completion is succeeding for upstream phases, or commit those tasks manually before re-running.`;else degradationSummary=`All ${pendingTasks.length} tasks degraded. Reasons: ${reasons.join(", ")}. Consider running in standard (serial) mode.`}let counters={lanesPlanned:lanes.length,lanesStarted:0,lanesCompleted:0,lanesFailed:0,tasksSerialized:serializedTasks.length,tasksDegraded:degradedTasks.length},planId=`plan-${phaseNumber}-${Date.now()}`;return{phase:phaseNumber,planId,lanes,degradedTasks,serializedTasks,degradationSummary,counters,crossLaneDependencies}}function createEmptyPlan(phaseNumber,planId){return{phase:phaseNumber,planId,lanes:[],degradedTasks:[],serializedTasks:[],counters:{lanesPlanned:0,lanesStarted:0,lanesCompleted:0,lanesFailed:0,tasksSerialized:0,tasksDegraded:0},crossLaneDependencies:{}}}init_recovery();init_state4();init_file_locks();init_logger();var _internals149={tryAcquireLock};class TurboStateLockTimeoutError extends Error{directory;sessionID;constructor(directory,sessionID,timeoutMs){super(`Turbo state lock timeout after ${timeoutMs}ms for session ${sessionID}`);this.name="TurboStateLockTimeoutError",this.directory=directory,this.sessionID=sessionID}}var BACKOFF_START_MS2=50,BACKOFF_MAX_MS2=2000,BACKOFF_JITTER_RATIO2=0.25;function backoffMs2(attempt){let base=Math.min(BACKOFF_START_MS2*2**attempt,BACKOFF_MAX_MS2),jitter=base*BACKOFF_JITTER_RATIO2*(Math.random()*2-1);return Math.max(1,Math.round(base+jitter))}async function withTurboStateLock(directory,sessionID,fn2,timeoutMs=30000){let deadline=Date.now()+timeoutMs,attempt=0;while(!0){let result;try{result=await _internals149.tryAcquireLock(directory,".swarm/turbo-state.json","lean-turbo-runner",sessionID)}catch(acquireErr){log(`[lean-turbo] state lock acquisition error for ${sessionID} (.swarm/turbo-state.json), will retry: ${acquireErr instanceof Error?acquireErr.message:String(acquireErr)}`)}if(result?.acquired){let lock=result.lock;try{return await fn2()}finally{if(lock._release)try{await lock._release()}catch(releaseErr){log(`[lean-turbo] state lock release failed for ${sessionID} (.swarm/turbo-state.json): ${releaseErr instanceof Error?releaseErr.message:String(releaseErr)}`)}}}if(Date.now()>=deadline)throw new TurboStateLockTimeoutError(directory,sessionID,timeoutMs);let delay3=Math.min(backoffMs2(attempt),deadline-Date.now());if(delay3>0)await new Promise((resolve85)=>setTimeout(resolve85,delay3));attempt++}}init_worktree_isolation();init_core3();import*as path224 from"node:path";function computeLaneRuntimeProfile2(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))envOverrides[envName]=path224.join(basePath,`lane-${laneIndex}`);return{laneIndex,worktreePath,envOverrides}}async function provisionWorktree2(directory,laneId,sessionId,config3,scope){let laneIndex=parseLeanLaneIndex(laneId),result=await provisionWorktree(directory,laneId,sessionId,{purpose:"lane",branchStyle:"legacy-lane",worktreeDir:config3.worktree_dir,mergeStrategy:config3.merge_strategy,depsStrategy:config3.deps_strategy,scope});if("error"in result)return result;let laneProfile=computeLaneRuntimeProfile2(config3.runtime_isolation,laneIndex,result.worktreePath);if(laneProfile)try{let{writeLaneProfileToDiskReal:writeLaneProfileToDiskReal2}=await Promise.resolve().then(() => (init_core3(),exports_core3));await writeLaneProfileToDiskReal2(result.worktreePath,laneProfile.laneIndex,laneProfile.envOverrides)}catch{}return{worktreePath:result.worktreePath,branchName:result.branchName}}function isTransientProvisionError(errorMsg){let lower=errorMsg.toLowerCase();if(lower.includes("already exists")||lower.includes("not a git repository"))return!1;let transientCodes=["enoent","econnrefused","etimedout","ebusy","eperm","enomem"];for(let code of transientCodes)if(lower.includes(code))return!0;let transientMessages=["disk full","no space left","resource temporarily unavailable"];for(let msg of transientMessages)if(lower.includes(msg))return!0;if(lower.includes("fatal:"))return!0;return!1}var LANE_SCOPE_DENIED_CODE="LEAN_TURBO_LANE_SCOPE_DENIED";function pushDirtyTreeDowngradeAdvisory(sessionID,reason,lanesAffected=[]){let affected=lanesAffected.length>0?`; affected lanes: ${lanesAffected.join(", ")}`:"",advisory=`LEAN_TURBO_DIRTY_TREE_DOWNGRADE: ${reason}${affected}. Worktree isolation is OFF for this phase; lanes run in the shared working tree.`,session=getAgentSession(sessionID);if(!session){criticalWarn(`[lean-turbo] ${advisory} (advisory not delivered: session ${sessionID} is not registered)`);return}pushAdvisory(session,advisory)}class LeanTurboRunner{static _internals={loadPlanJsonOnly,planLeanTurboLanes,acquireLaneLocks,releaseLaneLocks,loadLeanTurboRunState,saveLeanTurboRunState,hasActiveFullAuto,loadFullAutoRunState,writeLaneEvidence,writePhaseEvidence,laneDispatchTimeoutMs:void 0,provisionWorktree:provisionWorktree2,removeWorktree,removeLaneProfileFromDisk:removeLaneProfileFromDiskReal,mergeLaneBranch,postMergeCleanup,attemptMergeBackFromDirty,startupOrphanRecovery,getMergeStrategy:getMergeStrategy2,assertCleanWorkingTree,publishLeanTurboLaneScopeBinding};_sessionOps=null;_directory;_sessionID;_client;_availableAgents;_laneLockMap={};_laneStatuses=new Map;_agentIndex=0;_timedOutLanes=new Map;_stateLock=Promise.resolve();_leanConfig;_pendingDowngrade=null;constructor(options){if(this._directory=options.directory,this._sessionID=options.sessionID,this._leanConfig=options.leanConfig,"opencodeClient"in options){if(this._client=options.opencodeClient??null,this._client)this._sessionOps=this._client.session}let names=options.generatedAgentNames??swarmState.generatedAgentNames;this._availableAgents=this._resolveCoderAgents(names)}async runPhase(phaseNumber){if(this._client===null)return{ok:!1,reason:"NO_CLIENT",lanes:[],degradedTasks:[],serializedTasks:[]};let plan=await LeanTurboRunner._internals.loadPlanJsonOnly(this._directory);if(!plan)return{ok:!1,reason:"NO_PLAN",lanes:[],degradedTasks:[],serializedTasks:[]};if(LeanTurboRunner._internals.hasActiveFullAuto(this._sessionID)){let fullAutoState=LeanTurboRunner._internals.loadFullAutoRunState(this._directory,this._sessionID);if(fullAutoState&&(fullAutoState.status==="paused"||fullAutoState.status==="terminated"))return{ok:!1,reason:"FULL_AUTO_BLOCKED",lanes:[],degradedTasks:[],serializedTasks:[]}}let leanConfig=this._getLeanConfig(this._leanConfig),phaseStartedAt=new Date().toISOString();if(leanConfig.worktree_isolation){await LeanTurboRunner._internals.startupOrphanRecovery(this._directory,[this._sessionID]);try{let cleanResult=await LeanTurboRunner._internals.assertCleanWorkingTree(this._directory);if(!cleanResult.clean)this._pendingDowngrade={reason:cleanResult.error??"uncommitted changes"},log(`[lean-turbo] worktree isolation requires clean working tree: ${cleanResult.error}`),leanConfig.worktree_isolation=!1}catch(assertErr){let assertMsg=assertErr instanceof Error?assertErr.message:String(assertErr);this._pendingDowngrade={reason:`cleanliness check failed: ${assertMsg}`},log(`[lean-turbo] unable to verify working tree cleanliness: ${assertMsg} — degrading to shared directory`),leanConfig.worktree_isolation=!1}}let lanePlan=LeanTurboRunner._internals.planLeanTurboLanes(this._directory,phaseNumber,{phases:plan.phases},leanConfig);if(this._pendingDowngrade){let lanesAffected=lanePlan.lanes.map((l)=>l.laneId);pushDirtyTreeDowngradeAdvisory(this._sessionID,this._pendingDowngrade.reason,lanesAffected),this._pendingDowngrade=null}let degradedTasks=lanePlan.degradedTasks.map((d)=>d.taskId),degradedDetails=lanePlan.degradedTasks;if(lanePlan.lanes.length===0&&degradedTasks.length===0&&lanePlan.serializedTasks.length===0)return{ok:!1,reason:"NO_LANES",lanes:[],degradedTasks,degradedDetails,serializedTasks:lanePlan.serializedTasks};if(lanePlan.lanes.length===0)return await this._withStateLock(()=>this._updateDurableState(lanePlan)),await this._writePhaseEvidenceSafely({phaseNumber,plan,lanePlan,laneResults:[],leanConfig,status:"completed",startedAt:phaseStartedAt}),{ok:!0,lanes:[],degradedTasks,degradedDetails,serializedTasks:lanePlan.serializedTasks};await this._withStateLock(()=>this._updateDurableState(lanePlan)),this._laneStatuses=new Map(lanePlan.lanes.map((lane)=>[lane.laneId,{...lane}]));let laneResults=[],results=await Promise.all(lanePlan.lanes.map((lane)=>this._processLane(lane,leanConfig,plan)));laneResults.push(...results);let mergeBackFailures=await this._sequentialWorktreeCleanup(laneResults,leanConfig),phaseResult={ok:mergeBackFailures.length===0,reason:mergeBackFailures.length>0?`Lean Turbo merge-back failed for ${mergeBackFailures.length} lane(s); preserved affected worktrees for manual recovery.`:void 0,lanes:laneResults,degradedTasks,degradedDetails,serializedTasks:lanePlan.serializedTasks,mergeBackFailures:mergeBackFailures.length>0?mergeBackFailures:void 0};return await this._writePhaseEvidenceSafely({phaseNumber,plan,lanePlan,laneResults,leanConfig,status:phaseResult.ok?"completed":"failed",startedAt:phaseStartedAt,mergeBackFailures}),phaseResult}async dispatchLane(lane,agentName,worktreeDirectory,model,plan){let session=this._sessionOps??this._client?.session;if(!session)return{ok:!1,error:"NO_CLIENT"};let promptController=new AbortController,dispatchPromise=this._doDispatch(session,lane,agentName,worktreeDirectory,promptController,model,plan),timeoutMs=LeanTurboRunner._internals.laneDispatchTimeoutMs;if(timeoutMs!==void 0&&timeoutMs>0){let timeoutHandle,timeoutPromise=new Promise((_,reject2)=>{timeoutHandle=setTimeout(()=>{promptController.abort(),reject2(Error(`Lane dispatch timed out after ${timeoutMs}ms`))},timeoutMs)});try{return await Promise.race([dispatchPromise,timeoutPromise])}catch(err){if(err instanceof Error&&err.message.includes("timed out"))return this._timedOutLanes.set(lane.laneId,"__pending__"),dispatchPromise.then((result)=>{if(result.ok&&result.sessionId)if(this._timedOutLanes.get(lane.laneId)!==void 0)this._timedOutLanes.delete(lane.laneId),session.delete({path:{id:result.sessionId}}).catch(()=>{}),endAgentSession(result.sessionId);else this._timedOutLanes.delete(lane.laneId);else this._timedOutLanes.delete(lane.laneId)}).catch(()=>{this._timedOutLanes.delete(lane.laneId)}),{ok:!1,error:err.message};throw err}finally{if(timeoutHandle!==void 0)clearTimeout(timeoutHandle)}}return dispatchPromise}async _doDispatch(session,lane,agentName,worktreeDirectory,abortController,model,plan){let sessionId;try{let effectiveDirectory=worktreeDirectory??this._directory,createResult=await session.create({...this._sessionID?{body:{parentID:this._sessionID,title:`lean_turbo_lane_${lane.laneId} background`}}:{},query:{directory:effectiveDirectory}});if(!createResult.data)return{ok:!1,error:`session.create failed: ${typeof createResult.error==="string"?createResult.error:JSON.stringify(createResult.error)}`};if(sessionId=createResult.data.id,plan){let laneScopeError=await this._publishLaneScope(session,lane,plan,sessionId,worktreeDirectory,effectiveDirectory,abortController);if(laneScopeError)return laneScopeError}let promptText=this._buildLanePrompt(lane),promptResult=await session.prompt({path:{id:sessionId},body:{agent:agentName,...model?{model}:{},tools:plan?{write:!0,edit:!0,patch:!0}:{write:!1,edit:!1,patch:!1},parts:[{type:"text",text:promptText}]},signal:abortController?.signal});if(!promptResult.data)return abortController?.abort(),session.delete({path:{id:sessionId}}).catch(()=>{}),endAgentSession(sessionId),{ok:!1,error:`session.prompt failed: ${typeof promptResult.error==="string"?promptResult.error:JSON.stringify(promptResult.error)}`};return{ok:!0,sessionId}}catch(err){if(sessionId)abortController?.abort(),session.delete({path:{id:sessionId}}).catch(()=>{}),endAgentSession(sessionId);return{ok:!1,error:err instanceof Error?err.message:String(err)}}}async _publishLaneScope(session,lane,plan,childSessionId,worktreeDirectory,effectiveDirectory,abortController){let published;try{published=await LeanTurboRunner._internals.publishLeanTurboLaneScopeBinding({primaryDirectory:this._directory,laneRoot:effectiveDirectory,isolated:worktreeDirectory!==void 0,plan,lane,parentSessionId:this._sessionID,childSessionId})}catch(scopeErr){let reason=scopeErr instanceof Error?scopeErr.message:String(scopeErr);return abortController?.abort(),session.delete({path:{id:childSessionId}}).catch(()=>{}),endAgentSession(childSessionId),log(`[lean-turbo] lane ${lane.laneId} write authority could not be published: ${reason}`),{ok:!1,error:`${LANE_SCOPE_DENIED_CODE}: ${reason}`}}if(!published){if(log(`[lean-turbo] lane ${lane.laneId} has no plan-backed scope authority (tasks: ${lane.taskIds.join(", ")}) — the lane coder will be blocked on every write`),this._sessionID)try{let unscopedAdvisory=`LEAN_TURBO_LANE_UNSCOPED: lane ${lane.laneId} (tasks: ${lane.taskIds.join(", ")}) could not be given a validated write scope, so its coder is blocked from writing. Declare a scope for the lane's tasks or give them files_touched in the plan.`,architectSession=getAgentSession(this._sessionID);if(architectSession)pushAdvisory(architectSession,unscopedAdvisory);else criticalWarn(`[lean-turbo] ${unscopedAdvisory} (advisory not delivered: session ${this._sessionID} is not registered)`)}catch{}}return null}async waitForLanes(){let statuses=[];for(let[laneId,lane]of this._laneStatuses)statuses.push({laneId,status:lane.status,taskIds:lane.taskIds,agent:lane.agent,sessionId:lane.sessionId,error:lane.error});return statuses}async cleanup(){for(let[laneId]of Object.entries(this._laneLockMap))try{await LeanTurboRunner._internals.releaseLaneLocks(this._directory,laneId)}catch{}this._laneLockMap={};for(let[_laneId,lane]of this._laneStatuses)if(lane.worktreePath)try{await LeanTurboRunner._internals.removeWorktree(lane.worktreePath,this._directory,{force:!0,worktreeDir:this._leanConfig?.worktree_dir})}catch{}await this._withStateLock(async()=>{let runState=LeanTurboRunner._internals.loadLeanTurboRunState(this._directory,this._sessionID);if(runState)runState.lanes=runState.lanes.map((lane)=>lane.status==="running"||lane.status==="pending"?{...lane,status:"blocked"}:lane),LeanTurboRunner._internals.saveLeanTurboRunState(this._directory,runState)})}async cleanupAfterSuccess(){for(let[laneId]of Object.entries(this._laneLockMap)){let laneStatus=this._laneStatuses.get(laneId);if(laneStatus&&(laneStatus.status==="completed"||laneStatus.status==="failed"||laneStatus.status==="blocked")){try{await LeanTurboRunner._internals.releaseLaneLocks(this._directory,laneId)}catch{}delete this._laneLockMap[laneId]}}}async cleanupAfterFailure(){return this.cleanup()}_resolveCoderAgents(names){let coders=names.filter((n)=>n.toLowerCase().includes("coder"));if(coders.length===0)return["coder"];let prefixed=coders.filter((n)=>/[_-]coder$/i.test(n)||/^[a-z]+_[a-z]+_coder$/i.test(n)),bare=coders.filter((n)=>!n.includes("_")&&!n.includes("-")&&n==="coder"),sorted=[...prefixed.sort((a,b)=>b.length-a.length),...bare],seen=new Set,deduped=[];for(let name of sorted)if(!seen.has(name.toLowerCase()))seen.add(name.toLowerCase()),deduped.push(name);return deduped.length>0?deduped:["coder"]}_getLeanConfig(config3){if(config3)return structuredClone({...DEFAULT_LEAN_TURBO_CONFIG,...config3});return{...DEFAULT_LEAN_TURBO_CONFIG}}async _processLane(lane,leanConfig,plan){let laneInState=this._laneStatuses.get(lane.laneId);if(laneInState)laneInState.status="running",laneInState.startedAt=new Date().toISOString();let taskId=lane.taskIds[0]??lane.laneId,agent=this._selectNextAgent();if(!(await LeanTurboRunner._internals.acquireLaneLocks(this._directory,lane.laneId,lane.files,agent,taskId,this._sessionID)).acquired){if(await this._withStateLock(async()=>{try{let runState=LeanTurboRunner._internals.loadLeanTurboRunState(this._directory,this._sessionID);if(runState){let existingSerialized=new Set(runState.serializedTasks??[]);for(let tid of lane.taskIds)existingSerialized.add(tid);runState.serializedTasks=Array.from(existingSerialized),runState.counters.tasksSerialized+=lane.taskIds.length,LeanTurboRunner._internals.saveLeanTurboRunState(this._directory,runState)}}catch{}}),laneInState)laneInState.status="failed",laneInState.error="lock conflict - tasks routed to serial fallback";return await this._updateDurableStateLaneStatus(lane.laneId,"failed"),{laneId:lane.laneId,status:"failed",taskIds:lane.taskIds,error:"lock conflict - tasks routed to serial fallback"}}this._laneLockMap[lane.laneId]=[...lane.files];let worktreeDirectory;if(leanConfig.worktree_isolation){let provisionError;try{let provisionResult=await LeanTurboRunner._internals.provisionWorktree(this._directory,lane.laneId,this._sessionID,leanConfig);if("worktreePath"in provisionResult){if(worktreeDirectory=provisionResult.worktreePath,laneInState)laneInState.worktreePath=provisionResult.worktreePath,laneInState.branchName=provisionResult.branchName;await this._persistLaneWorktreeFields(lane.laneId,provisionResult.worktreePath,provisionResult.branchName)}else provisionError=provisionResult.error}catch(provisionErr){provisionError=provisionErr instanceof Error?provisionErr.message:String(provisionErr)}if(provisionError)if(isTransientProvisionError(provisionError)){log(`[lean-turbo] worktree provision failed for lane ${lane.laneId}: ${provisionError} — retrying once...`),await new Promise((r)=>setTimeout(r,100));try{let retryResult=await LeanTurboRunner._internals.provisionWorktree(this._directory,lane.laneId,this._sessionID,leanConfig);if("worktreePath"in retryResult){if(worktreeDirectory=retryResult.worktreePath,laneInState)laneInState.worktreePath=retryResult.worktreePath,laneInState.branchName=retryResult.branchName;await this._persistLaneWorktreeFields(lane.laneId,retryResult.worktreePath,retryResult.branchName),log(`[lean-turbo] worktree provision retry succeeded for lane ${lane.laneId}`),provisionError=void 0}else provisionError=retryResult.error,log(`[lean-turbo] worktree provision retry failed for lane ${lane.laneId}: ${retryResult.error}`)}catch(retryErr){let retryMsg=retryErr instanceof Error?retryErr.message:String(retryErr);log(`[lean-turbo] worktree provision retry threw for lane ${lane.laneId}: ${retryMsg}`)}}else log(`[lean-turbo] worktree provision failed for lane ${lane.laneId}: ${provisionError}`);if(!worktreeDirectory){let failMsg=`worktree provision failed: ${provisionError??"unknown error"}`;try{await LeanTurboRunner._internals.releaseLaneLocks(this._directory,lane.laneId)}catch{}if(delete this._laneLockMap[lane.laneId],laneInState)laneInState.status="failed",laneInState.error=failMsg;return await this._updateDurableStateLaneStatus(lane.laneId,"failed"),await this._writeLaneEvidenceSafely(lane,"failed",{status:"failed",error:failMsg,agent}),{laneId:lane.laneId,status:"failed",taskIds:lane.taskIds,agent,error:failMsg}}}let coderBase=stripKnownSwarmPrefix(agent),coderSwarmId=coderBase!==agent?agent.slice(0,agent.length-coderBase.length-1):void 0,coderSwarmAgents=getSwarmAgents(coderSwarmId),dispatchResult;try{dispatchResult=(await dispatchWithModelFallback({dispatch:async(model)=>{let r=await this.dispatchLane(lane,agent,worktreeDirectory,model,plan);if(!r.ok)throw Error(r.error??"lane dispatch failed");return r},resolveFallback:(index)=>resolveFallbackModel(coderBase,index,coderSwarmAgents),maxTransientRetriesPerModel:0,classify:(err)=>{let msg=err instanceof Error?err.message:String(err);if(/Lane dispatch timed out/i.test(msg))return"permanent";if(msg.includes(LANE_SCOPE_DENIED_CODE))return"permanent";return isTransientProviderError(msg)?"transient":"permanent"},onFallback:({toModel,fallbackIndex})=>{telemetry.modelFallback(this._sessionID??"",agent,coderSwarmAgents?.[coderBase]?.model??"default",toModel,"transient_model_error");let session=this._sessionID?getAgentSession(this._sessionID):void 0;if(session)pushAdvisory(session,`MODEL FALLBACK: coder lane ${lane.laneId} failed over to "${toModel}" (fallback ${fallbackIndex}) after a transient/quota dispatch error.`)}})).result}catch(err){let msg=err instanceof Error?err.message:String(err);dispatchResult={ok:!1,error:isQuotaError(msg)?`${msg} (model quota/usage limit exhausted across all configured fallbacks)`:msg}}if(!dispatchResult.ok){try{await LeanTurboRunner._internals.releaseLaneLocks(this._directory,lane.laneId)}catch{}if(delete this._laneLockMap[lane.laneId],worktreeDirectory&&laneInState)laneInState._failureCleanupPending=!0;if(laneInState)laneInState.status="failed",laneInState.error=dispatchResult.error;return await this._updateDurableStateLaneStatus(lane.laneId,"failed"),await this._writeLaneEvidenceSafely(lane,"failed",{status:"failed",error:dispatchResult.error,agent}),{laneId:lane.laneId,status:"failed",taskIds:lane.taskIds,agent,error:dispatchResult.error}}let completedAt=new Date().toISOString();if(laneInState)laneInState.status="completed",laneInState.agent=agent,laneInState.sessionId=dispatchResult.sessionId,laneInState.completedAt=completedAt;await this._updateDurableStateLaneStatus(lane.laneId,"completed");try{await LeanTurboRunner._internals.releaseLaneLocks(this._directory,lane.laneId)}catch{}return delete this._laneLockMap[lane.laneId],await this._writeLaneEvidenceSafely(lane,"completed",{status:"completed",agent,sessionId:dispatchResult.sessionId,completedAt}),{laneId:lane.laneId,status:"completed",taskIds:lane.taskIds,agent,sessionId:dispatchResult.sessionId}}_persistRecovery(info){writeRecoveryRecord(this._directory,{laneId:info.laneId,sessionId:this._sessionID,branchName:info.branchName,worktreePath:info.worktreePath,status:info.status,reason:info.reason,conflictFiles:info.conflictFiles,replayHint:"Open the directory in worktreePath and run git status with that directory as the working directory."})}async _sequentialWorktreeCleanup(laneResults,leanConfig){let mergeBackFailures=[];for(let lr of laneResults){let laneInState=this._laneStatuses.get(lr.laneId);if(!laneInState?.worktreePath)continue;let needsPostMergeCleanup=!1;if(lr.status==="completed"){if(!laneInState.branchName)continue;try{let strategy=LeanTurboRunner._internals.getMergeStrategy(leanConfig),mergeResult=await LeanTurboRunner._internals.attemptMergeBackFromDirty(laneInState.worktreePath,laneInState.branchName,this._directory,strategy);if("merged"in mergeResult&&mergeResult.merged){needsPostMergeCleanup=!0,clearRecoveryRecord(this._directory,lr.laneId,this._sessionID);let leanLaneIndex=parseLeanLaneIndex(lr.laneId);try{await LeanTurboRunner._internals.removeLaneProfileFromDisk(laneInState.worktreePath,leanLaneIndex)}catch{}}else if("conflict"in mergeResult&&mergeResult.conflict||"partial"in mergeResult&&mergeResult.partial){let conflictFiles="conflictFiles"in mergeResult&&Array.isArray(mergeResult.conflictFiles)?mergeResult.conflictFiles:[],isConflict="conflict"in mergeResult&&mergeResult.conflict===!0||conflictFiles.length>0,reason="message"in mergeResult&&typeof mergeResult.message==="string"&&(mergeResult.message||"")||"merge-back partially failed",failureInfo={laneId:lr.laneId,branchName:laneInState.branchName,worktreePath:laneInState.worktreePath,status:isConflict?"conflict":"partial",reason,conflictFiles};mergeBackFailures.push(failureInfo),lr.status="failed",lr.error=failureInfo.reason,lr.mergeBackFailure=failureInfo,laneInState.status="failed",laneInState.error=failureInfo.reason,await this._updateDurableStateLaneStatus(lr.laneId,"failed"),await this._writeLaneEvidenceSafely({laneId:lr.laneId,taskIds:lr.taskIds,files:[],status:"failed"},"failed",{status:"failed",error:failureInfo.reason,mergeBackFailure:failureInfo}),this._persistRecovery(failureInfo),log(`[lean-turbo] merge-back PARTIAL for lane ${lr.laneId}: ${failureInfo.reason} — worktree preserved at ${laneInState.worktreePath} for manual recovery`);continue}else if("failed"in mergeResult&&mergeResult.failed){let failureInfo={laneId:lr.laneId,branchName:laneInState.branchName,worktreePath:laneInState.worktreePath,status:"failed",reason:mergeResult.message};mergeBackFailures.push(failureInfo),lr.status="failed",lr.error=failureInfo.reason,lr.mergeBackFailure=failureInfo,laneInState.status="failed",laneInState.error=failureInfo.reason,await this._updateDurableStateLaneStatus(lr.laneId,"failed"),await this._writeLaneEvidenceSafely({laneId:lr.laneId,taskIds:lr.taskIds,files:[],status:"failed"},"failed",{status:"failed",error:failureInfo.reason,mergeBackFailure:failureInfo}),log(`[lean-turbo] merge-back ERROR for lane ${lr.laneId}: ${failureInfo.reason} — worktree preserved at ${laneInState.worktreePath} for manual recovery`),this._persistRecovery(failureInfo);continue}}catch(err){let errMsg=err instanceof Error?err.message:String(err),failureInfo={laneId:lr.laneId,branchName:laneInState.branchName,worktreePath:laneInState.worktreePath,status:"failed",reason:errMsg};mergeBackFailures.push(failureInfo),lr.status="failed",lr.error=failureInfo.reason,lr.mergeBackFailure=failureInfo,laneInState.status="failed",laneInState.error=failureInfo.reason,await this._updateDurableStateLaneStatus(lr.laneId,"failed"),await this._writeLaneEvidenceSafely({laneId:lr.laneId,taskIds:lr.taskIds,files:[],status:"failed"},"failed",{status:"failed",error:failureInfo.reason,mergeBackFailure:failureInfo}),log(`[lean-turbo] merge-back EXCEPTION for lane ${lr.laneId}: ${errMsg} — worktree preserved at ${laneInState.worktreePath} for manual recovery`),this._persistRecovery(failureInfo);continue}}else if(lr.status==="failed"&&laneInState._failureCleanupPending){let failureInfo={laneId:lr.laneId,branchName:laneInState.branchName,worktreePath:laneInState.worktreePath,status:"failed",reason:lr.error||"Lane failed before completion; worktree preserved without merge-back"};mergeBackFailures.push(failureInfo),lr.mergeBackFailure=failureInfo,log(`[lean-turbo] failed lane ${lr.laneId}: ${failureInfo.reason} — worktree preserved at ${laneInState.worktreePath}; not merging partial work`),this._persistRecovery(failureInfo);continue}try{await LeanTurboRunner._internals.removeWorktree(laneInState.worktreePath,this._directory,{force:!0,worktreeDir:leanConfig.worktree_dir})}catch{}if(needsPostMergeCleanup&&laneInState.branchName)try{await LeanTurboRunner._internals.postMergeCleanup(this._directory,laneInState.branchName)}catch{}}return mergeBackFailures}_buildIntegratedDiffSummary(lanePlan,laneResults,mergeBackFailures=[]){let resultByLane=new Map(laneResults.map((lane)=>[lane.laneId,lane])),files=new Set;for(let lane of lanePlan.lanes)for(let file3 of lane.files)files.add(file3);let completed=laneResults.filter((lane)=>lane.status==="completed").length,failed=laneResults.filter((lane)=>lane.status==="failed").length,blocked=laneResults.filter((lane)=>lane.status==="blocked").length,fileList=[...files].sort(),displayedFiles=fileList.slice(0,50),hiddenFileCount=Math.max(0,fileList.length-displayedFiles.length),lines=[`Lean Turbo phase ${lanePlan.phase}: ${completed}/${lanePlan.lanes.length} lanes completed, ${failed} failed, ${blocked} blocked.`,`Files declared changed (${fileList.length}): ${displayedFiles.length>0?displayedFiles.join(", "):"none"}${hiddenFileCount>0?`, ... +${hiddenFileCount} more`:""}.`];if(lanePlan.serializedTasks.length>0)lines.push(`Serialized tasks pending standard execution: ${lanePlan.serializedTasks.join(", ")}.`);if(lanePlan.degradedTasks.length>0)lines.push(`Degraded tasks: ${lanePlan.degradedTasks.map((task)=>`${task.taskId} (${task.reason})`).join(", ")}.`);if(mergeBackFailures.length>0)lines.push(`Merge-back failures: ${mergeBackFailures.map((failure)=>`${failure.laneId}: ${failure.reason}`).join("; ")}.`);for(let lane of lanePlan.lanes){let result=resultByLane.get(lane.laneId);if(result?.error)lines.push(`${lane.laneId} error: ${result.error}.`)}return lines.join(`
6090
6090
  `)}async _writePhaseEvidenceSafely(args2){let completedAt=new Date().toISOString(),resultByLane=new Map(args2.laneResults.map((lane)=>[lane.laneId,lane])),lanes=args2.lanePlan.lanes.map((lane)=>{let result=resultByLane.get(lane.laneId),evidenceLane={laneId:lane.laneId,taskIds:lane.taskIds,files:lane.files,status:result?.status??lane.status,startedAt:lane.startedAt,completedAt:result?.status==="completed"||result?.status==="failed"?lane.completedAt??completedAt:lane.completedAt,error:result?.error??lane.error,agent:result?.agent??lane.agent,sessionId:result?.sessionId??lane.sessionId};if(result?.mergeBackFailure)evidenceLane.mergeBackFailure=result.mergeBackFailure;return evidenceLane}),planId=args2.lanePlan.planId||derivePlanId({swarm:args2.plan.swarm??"default",title:args2.plan.title??"Untitled Plan"}),evidence2={phase:args2.phaseNumber,planId,lanes,degradedTasks:args2.lanePlan.degradedTasks.map((task)=>({taskId:task.taskId,reason:task.reason})),startedAt:args2.startedAt,completedAt,status:args2.status,evidencePaths:lanes.map((lane)=>`.swarm/evidence/${args2.phaseNumber}/lean-turbo/${lane.laneId}.json`),integratedDiffSummary:this._buildIntegratedDiffSummary(args2.lanePlan,args2.laneResults,args2.mergeBackFailures??[]),configSnapshot:args2.leanConfig,timestamp:completedAt};try{await LeanTurboRunner._internals.writePhaseEvidence(this._directory,evidence2)}catch(error93){let msg=error93 instanceof Error?error93.message:String(error93);log(`[lean-turbo] phase evidence write failed: ${msg}`)}}_selectNextAgent(){if(this._availableAgents.length===0)return"coder";let agent=this._availableAgents[this._agentIndex%this._availableAgents.length];return this._agentIndex++,agent}async _writeLaneEvidenceSafely(lane,status,extras){for(let attempt=0;attempt<3;attempt++)try{let evidence2={laneId:lane.laneId,taskIds:lane.taskIds,files:lane.files,status,startedAt:lane.startedAt,...extras},phase=LeanTurboRunner._internals.loadLeanTurboRunState(this._directory,this._sessionID)?.phase;if(phase===void 0){log(`[lean-turbo] evidence write skipped for lane ${lane.laneId}: phase not set in run state`);return}await LeanTurboRunner._internals.writeLaneEvidence(this._directory,phase,evidence2);return}catch(error93){let errCode=error93 instanceof Error?error93.code??"":"",isTransient=errCode.length>0&&["ENOENT","EBUSY","EPERM","EIO","EAGAIN","ETIMEDOUT","ENOSPC"].includes(errCode);if(attempt<2&&isTransient){let delayMs=100*2**attempt;await new Promise((resolve85)=>setTimeout(resolve85,delayMs));continue}let msg=error93 instanceof Error?error93.message:String(error93);log(`[lean-turbo] evidence write failed for lane ${lane.laneId}: ${msg}`);return}}_buildLanePrompt(lane){let taskList=lane.taskIds.map((id)=>` - ${id}`).join(`
6091
6091
  `),fileList=lane.files.map((f)=>` - ${f}`).join(`
6092
6092
  `);return`You are assigned to implement the following task(s) in lane "${lane.laneId}".